Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 |
No files matched your search
@@ -6,7 +6,7 @@ ENV DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
ENV \
|
||||
DEBUG=false \
|
||||
NODE_VERSION=12.16.3 \
|
||||
NODE_VERSION=12.18.2 \
|
||||
METEOR_RELEASE=1.10.2 \
|
||||
USE_EDGE=false \
|
||||
METEOR_EDGE=1.5-beta.17 \
|
||||
|
||||
@@ -81,7 +81,7 @@ parts:
|
||||
wekan:
|
||||
source: .
|
||||
plugin: nodejs
|
||||
node-engine: 12.16.3
|
||||
node-engine: 12.18.2
|
||||
node-packages:
|
||||
- node-gyp
|
||||
- node-pre-gyp
|
||||
|
||||
@@ -83,7 +83,7 @@ parts:
|
||||
wekan:
|
||||
source: .
|
||||
plugin: nodejs
|
||||
node-engine: 12.14.3
|
||||
node-engine: 12.18.2
|
||||
node-packages:
|
||||
- node-gyp
|
||||
- node-pre-gyp
|
||||
|
||||
@@ -98,3 +98,4 @@ percolate:synced-cron
|
||||
easylogic:summernote
|
||||
cfs:filesystem
|
||||
ostrio:cookies
|
||||
tmeasday:check-npm-versions
|
||||
+10
-9
@@ -1,7 +1,7 @@
|
||||
3stack:presence@1.1.2
|
||||
accounts-base@1.6.0
|
||||
accounts-oauth@1.2.0
|
||||
accounts-password@1.6.0
|
||||
accounts-password@1.6.1
|
||||
aldeed:collection2@2.10.0
|
||||
aldeed:collection2-core@1.2.0
|
||||
aldeed:schema-deny@1.1.0
|
||||
@@ -52,7 +52,7 @@ 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-server@2.3.2
|
||||
deps@1.0.12
|
||||
diff-sequence@1.1.1
|
||||
dynamic-import@0.5.2
|
||||
@@ -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.2.6
|
||||
mdg:validation-error@0.5.1
|
||||
meteor@1.9.3
|
||||
meteor-base@1.4.0
|
||||
@@ -101,7 +101,7 @@ 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.6.0
|
||||
@@ -109,7 +109,7 @@ mobile-status-bar@1.1.0
|
||||
modern-browsers@0.1.5
|
||||
modules@0.15.0
|
||||
modules-runtime@0.12.0
|
||||
momentjs:moment@2.26.0
|
||||
momentjs:moment@2.27.0
|
||||
mongo@1.10.0
|
||||
mongo-decimal@0.1.1
|
||||
mongo-dev-server@1.1.0
|
||||
@@ -162,14 +162,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.3.0
|
||||
socket-stream-client@0.3.1
|
||||
softwarerero:accounts-t9n@1.3.11
|
||||
spacebars@1.0.15
|
||||
spacebars-compiler@1.1.3
|
||||
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 +177,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.3.0
|
||||
url@1.3.1
|
||||
useraccounts:core@1.14.2
|
||||
useraccounts:flow-routing@1.14.2
|
||||
useraccounts:unstyled@1.14.2
|
||||
@@ -191,7 +192,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
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@ sudo: required
|
||||
|
||||
env:
|
||||
TRAVIS_DOCKER_COMPOSE_VERSION: 1.24.0
|
||||
TRAVIS_NODE_VERSION: 12.16.3
|
||||
TRAVIS_NODE_VERSION: 12.18.2
|
||||
TRAVIS_NPM_VERSION: latest
|
||||
|
||||
before_install:
|
||||
|
||||
+247
@@ -1,3 +1,250 @@
|
||||
# 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:
|
||||
|
||||
+1
-1
@@ -8,7 +8,7 @@ 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.3 \
|
||||
NODE_VERSION=v12.18.2 \
|
||||
METEOR_RELEASE=1.10.2 \
|
||||
USE_EDGE=false \
|
||||
METEOR_EDGE=1.5-beta.17 \
|
||||
|
||||
+2
-2
@@ -4,7 +4,7 @@ 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.3 \
|
||||
NODE_VERSION=v12.18.2 \
|
||||
WEKAN_VERSION=3.96 \
|
||||
WEKAN_ARCHITECTURE=arm64
|
||||
|
||||
@@ -40,7 +40,7 @@ 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.2 \
|
||||
NODE_ENV=production \
|
||||
NPM_VERSION=latest \
|
||||
WITH_API=true \
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
|
||||
appVersion: "v4.09.0"
|
||||
appVersion: "v4.20.0"
|
||||
files:
|
||||
userUploads:
|
||||
- README.md
|
||||
|
||||
@@ -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),
|
||||
),
|
||||
)
|
||||
);
|
||||
|
||||
@@ -323,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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -25,10 +25,6 @@ BlazeComponent.extendComponent({
|
||||
},
|
||||
|
||||
onRendered() {
|
||||
function userIsAllowedToMove() {
|
||||
return Meteor.user();
|
||||
}
|
||||
|
||||
const itemsSelector = '.js-board:not(.placeholder)';
|
||||
|
||||
const $boards = this.$('.js-boards');
|
||||
@@ -77,8 +73,6 @@ BlazeComponent.extendComponent({
|
||||
handle: '.board-handle',
|
||||
});
|
||||
}
|
||||
|
||||
$boards.sortable('option', 'disabled', !userIsAllowedToMove());
|
||||
});
|
||||
},
|
||||
|
||||
|
||||
@@ -220,8 +220,14 @@ template(name="cardDetails")
|
||||
+viewer
|
||||
= getVoteQuestion
|
||||
if showVotingButtons
|
||||
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'}}
|
||||
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
|
||||
|
||||
@@ -38,22 +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;
|
||||
},
|
||||
isWatching() {
|
||||
const card = this.currentData();
|
||||
return card.findWatcher(Meteor.userId());
|
||||
@@ -412,9 +396,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;
|
||||
}
|
||||
|
||||
@@ -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}}")
|
||||
|
||||
@@ -193,6 +193,9 @@ BlazeComponent.extendComponent({
|
||||
}
|
||||
this.toggleDeleteDialog.set(!this.toggleDeleteDialog.get());
|
||||
},
|
||||
'click #toggleHideCheckedItemsButton'() {
|
||||
Meteor.call('toggleHideCheckedItems');
|
||||
},
|
||||
};
|
||||
|
||||
return [
|
||||
@@ -211,6 +214,14 @@ BlazeComponent.extendComponent({
|
||||
},
|
||||
}).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 = {
|
||||
@@ -246,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
|
||||
|
||||
@@ -106,9 +106,9 @@ 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-up(class="{{#if voteState}}text-green{{/if}}")
|
||||
span.badge-text {{ voteCountPositive }}
|
||||
span.badge-icon.fa.fa-thumbs-down
|
||||
span.badge-icon.fa.fa-thumbs-down(class="{{#if $eq voteState false}}text-red{{/if}}")
|
||||
span.badge-text {{ voteCountNegative }}
|
||||
if attachments.count
|
||||
.badge
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -2,7 +2,7 @@ const JSZip = require('jszip');
|
||||
|
||||
window.ExportHtml = Popup => {
|
||||
const saveAs = function(blob, filename) {
|
||||
let dl = document.createElement('a');
|
||||
const dl = document.createElement('a');
|
||||
dl.href = window.URL.createObjectURL(blob);
|
||||
dl.onclick = event => document.body.removeChild(event.target);
|
||||
dl.style.display = 'none';
|
||||
|
||||
+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';
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
+3
-3
@@ -115,11 +115,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 +180,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
|
||||
|
||||
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'
|
||||
+2
-1
@@ -808,5 +808,6 @@
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
+2
-1
@@ -808,5 +808,6 @@
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
+2
-1
@@ -808,5 +808,6 @@
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
+2
-1
@@ -808,5 +808,6 @@
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
+2
-1
@@ -808,5 +808,6 @@
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
+2
-1
@@ -808,5 +808,6 @@
|
||||
"voting": "Afstemning",
|
||||
"archived": "Arkiveret",
|
||||
"delete-linked-card-before-this-card": "Du kan ikke slette dette kort før der slettes sammenkædede kort som har",
|
||||
"delete-linked-cards-before-this-list": "Du kan ikke slette denne liste før der slettes sammenkædede kort, der peger til kort i denne liste"
|
||||
"delete-linked-cards-before-this-list": "Du kan ikke slette denne liste før der slettes sammenkædede kort, der peger til kort i denne liste",
|
||||
"hide-checked-items": "Hide checked items"
|
||||
}
|
||||
+3
-2
@@ -807,6 +807,7 @@
|
||||
"last-activity": "Letzte Aktivität",
|
||||
"voting": "Abstimunng",
|
||||
"archived": "Archiviert",
|
||||
"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"
|
||||
"delete-linked-card-before-this-card": "Sie können diese Karte erst löschen, wenn Sie alle verbundenen Karten gelöscht haben.",
|
||||
"delete-linked-cards-before-this-list": "Sie können diese Liste erst löschen, wenn Sie alle Karten gelöscht haben, die auf Karten in dieser Liste verweisen.",
|
||||
"hide-checked-items": "Erledigte ausblenden"
|
||||
}
|
||||
+2
-1
@@ -808,5 +808,6 @@
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
@@ -808,5 +808,6 @@
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
+2
-1
@@ -808,5 +808,6 @@
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
+2
-1
@@ -808,5 +808,6 @@
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
@@ -808,5 +808,6 @@
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
@@ -808,5 +808,6 @@
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
+2
-1
@@ -808,5 +808,6 @@
|
||||
"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"
|
||||
"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": "Hide checked items"
|
||||
}
|
||||
+2
-1
@@ -808,5 +808,6 @@
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
+10
-9
@@ -164,15 +164,15 @@
|
||||
"cardStartVotingPopup-title": "شروع به رای",
|
||||
"positiveVoteMembersPopup-title": "طرفداران",
|
||||
"negativeVoteMembersPopup-title": "مخالفان",
|
||||
"card-edit-voting": "Edit voting",
|
||||
"editVoteEndDatePopup-title": "Change vote end date",
|
||||
"allowNonBoardMembers": "Allow all logged in users",
|
||||
"card-edit-voting": "ویرایش رای",
|
||||
"editVoteEndDatePopup-title": "تغییر تاریخ پایان رای گیری",
|
||||
"allowNonBoardMembers": "اجازه دادن به همه کاربران وارد شده",
|
||||
"vote-question": "سوال رای گیری",
|
||||
"vote-public": "نمایش چه کسی به چه رای داده است",
|
||||
"vote-for-it": "for it",
|
||||
"vote-for-it": "برای این",
|
||||
"vote-against": "بر خلاف",
|
||||
"deleteVotePopup-title": "Delete vote?",
|
||||
"vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.",
|
||||
"deleteVotePopup-title": "رای حذف شود ؟",
|
||||
"vote-delete-pop": "حذف کردن به صورت دائمی هست و قابل برگشت نیست.",
|
||||
"cardDeletePopup-title": "آیا می خواهید کارت را حذف کنید؟",
|
||||
"cardDetailsActionsPopup-title": "اعمال کارت",
|
||||
"cardLabelsPopup-title": "برچسب ها",
|
||||
@@ -256,8 +256,8 @@
|
||||
"current": "جاری",
|
||||
"custom-field-delete-pop": "این اقدام فیلدشخصی را بهمراه تمامی تاریخچه آن از کارت ها پاک می کند و برگشت پذیر نمی باشد",
|
||||
"custom-field-checkbox": "جعبه انتخابی",
|
||||
"custom-field-currency": "Currency",
|
||||
"custom-field-currency-option": "Currency Code",
|
||||
"custom-field-currency": "واحد پولی",
|
||||
"custom-field-currency-option": "کد واحد پولی",
|
||||
"custom-field-date": "تاریخ",
|
||||
"custom-field-dropdown": "لیست افتادنی",
|
||||
"custom-field-dropdown-none": "(هیچ)",
|
||||
@@ -808,5 +808,6 @@
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
+2
-1
@@ -808,5 +808,6 @@
|
||||
"voting": "Äänestys",
|
||||
"archived": "Arkistoitu",
|
||||
"delete-linked-card-before-this-card": "Et voi poistaa tätä korttia ennenkuin ensin poistat linkitetyn kortin jolla on",
|
||||
"delete-linked-cards-before-this-list": "Et voi poistaa tätä listaa ennenkuin poistat linkitetyt kortit jotka osoittavat kortteihin tässä listassa"
|
||||
"delete-linked-cards-before-this-list": "Et voi poistaa tätä listaa ennenkuin poistat linkitetyt kortit jotka osoittavat kortteihin tässä listassa",
|
||||
"hide-checked-items": "Piilota ruksatut kohdat"
|
||||
}
|
||||
+4
-3
@@ -256,8 +256,8 @@
|
||||
"current": "actuel",
|
||||
"custom-field-delete-pop": "Cette action n'est pas réversible. Elle supprimera ce champ personnalisé de toutes les cartes et détruira son historique.",
|
||||
"custom-field-checkbox": "Case à cocher",
|
||||
"custom-field-currency": "Currency",
|
||||
"custom-field-currency-option": "Currency Code",
|
||||
"custom-field-currency": "Devise",
|
||||
"custom-field-currency-option": "Code devise",
|
||||
"custom-field-date": "Date",
|
||||
"custom-field-dropdown": "Liste de choix",
|
||||
"custom-field-dropdown-none": "(aucun)",
|
||||
@@ -808,5 +808,6 @@
|
||||
"voting": "Vote",
|
||||
"archived": "Archivé",
|
||||
"delete-linked-card-before-this-card": "Vous ne pouvez pas supprimer cette carte avant d'avoir d'abord supprimé la carte liée qui a",
|
||||
"delete-linked-cards-before-this-list": "Vous ne pouvez pas supprimer cette liste avant d'avoir d'abord supprimé les cartes liées qui pointent vers des cartes de cette liste"
|
||||
"delete-linked-cards-before-this-list": "Vous ne pouvez pas supprimer cette liste avant d'avoir d'abord supprimé les cartes liées qui pointent vers des cartes de cette liste",
|
||||
"hide-checked-items": "Cacher les éléments cochés"
|
||||
}
|
||||
+2
-1
@@ -808,5 +808,6 @@
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
+2
-1
@@ -808,5 +808,6 @@
|
||||
"voting": "הצבעה",
|
||||
"archived": "בארכיון",
|
||||
"delete-linked-card-before-this-card": "לא ניתן למחוק את הכרטיס הזה לפני שמוחקים את הכרטיס המקושר שיש לו",
|
||||
"delete-linked-cards-before-this-list": "לא ניתן למחוק את הרשימה הזו לפני שמוחקים את הכרטיסים שמצביעים לכרטיסים ברשימה הזו"
|
||||
"delete-linked-cards-before-this-list": "לא ניתן למחוק את הרשימה הזו לפני שמוחקים את הכרטיסים שמצביעים לכרטיסים ברשימה הזו",
|
||||
"hide-checked-items": "הסתרת הפריטים שסומנו"
|
||||
}
|
||||
+46
-45
@@ -137,7 +137,7 @@
|
||||
"board-view": "बोर्ड दृष्टिकोण",
|
||||
"board-view-cal": "तिथि-पत्र",
|
||||
"board-view-swimlanes": "तैरना",
|
||||
"board-view-collapse": "Collapse",
|
||||
"board-view-collapse": "संक्षिप्त करें",
|
||||
"board-view-lists": "सूचियाँ",
|
||||
"bucket-example": "उदाहरण के लिए “बाल्टी सूची” की तरह",
|
||||
"cancel": "रद्द करें",
|
||||
@@ -161,18 +161,18 @@
|
||||
"cardAttachmentsPopup-title": "से अनुलग्न करें",
|
||||
"cardCustomField-datePopup-title": "तारीख बदलें",
|
||||
"cardCustomFieldsPopup-title": "संपादित करें प्रचलन क्षेत्र",
|
||||
"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": "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.",
|
||||
"cardStartVotingPopup-title": "वोट शुरू करें",
|
||||
"positiveVoteMembersPopup-title": "समर्थकों का",
|
||||
"negativeVoteMembersPopup-title": "प्रतिद्वंद्वी",
|
||||
"card-edit-voting": "मतदान संपादित करें",
|
||||
"editVoteEndDatePopup-title": "मतदान समाप्ति की तारीख बदलें",
|
||||
"allowNonBoardMembers": "सभी लॉग इन उपयोगकर्ताओं को अनुमति दें",
|
||||
"vote-question": "मतदान का सवाल",
|
||||
"vote-public": "दिखाएँ कि किसने क्या मतदान किया",
|
||||
"vote-for-it": "इसके लिए",
|
||||
"vote-against": "के प्रतिकूल",
|
||||
"deleteVotePopup-title": "मतदान हटाएं?",
|
||||
"vote-delete-pop": "हटाना स्थायी है। आप इस मतदान से जुड़े सभी कार्यों को खो देंगे।",
|
||||
"cardDeletePopup-title": "मिटाएँ कार्ड?",
|
||||
"cardDetailsActionsPopup-title": "कार्ड क्रियाएँ",
|
||||
"cardLabelsPopup-title": "नामपत्र",
|
||||
@@ -235,8 +235,8 @@
|
||||
"comment-only-desc": "केवल कार्ड पर टिप्पणी कर सकते हैं।",
|
||||
"no-comments": "कोई टिप्पणी नहीं",
|
||||
"no-comments-desc": "टिप्पणियां और गतिविधियां नहीं देख पा रहे हैं।",
|
||||
"worker": "Worker",
|
||||
"worker-desc": "Can only move cards, assign itself to card and comment.",
|
||||
"worker": "कामगार",
|
||||
"worker-desc": "केवल कार्ड ले जा सकते हैं, खुद को कार्ड और टिप्पणी करने के लिए असाइन करें।",
|
||||
"computer": "संगणक",
|
||||
"confirm-subtask-delete-dialog": "क्या आप वाकई उपकार्य हटाना चाहते हैं?",
|
||||
"confirm-checklist-delete-dialog": "क्या आप वाकई जांचसूची हटाना चाहते हैं?",
|
||||
@@ -256,8 +256,8 @@
|
||||
"current": "वर्तमान",
|
||||
"custom-field-delete-pop": "कोई पूर्ववत् नहीं है । यह सभी कार्ड से इस कस्टम क्षेत्र को हटा दें और इसके इतिहास को नष्ट कर देगा ।",
|
||||
"custom-field-checkbox": "निशानबक्से",
|
||||
"custom-field-currency": "Currency",
|
||||
"custom-field-currency-option": "Currency Code",
|
||||
"custom-field-currency": "मुद्रा",
|
||||
"custom-field-currency-option": "मुद्रा संहिता",
|
||||
"custom-field-date": "दिनांक",
|
||||
"custom-field-dropdown": "ड्रॉपडाउन सूची",
|
||||
"custom-field-dropdown-none": "(कोई नहीं)",
|
||||
@@ -311,7 +311,7 @@
|
||||
"error-board-notAMember": "You need तक be एक सदस्य of यह बोर्ड तक do that",
|
||||
"error-json-malformed": "Your text is not valid JSON",
|
||||
"error-json-schema": "आपके JSON डेटा में सही प्रारूप में सही जानकारी शामिल नहीं है",
|
||||
"error-csv-schema": "Your CSV(Comma Separated Values)/TSV (Tab Separated Values) does not include the proper information in the correct format",
|
||||
"error-csv-schema": "आपके CSV (कोमा सेपरेटेड वैल्यूज़) / TSV (टैब सेपरेटेड वैल्यूज़) में सही फॉर्मेट में उचित जानकारी शामिल नहीं है",
|
||||
"error-list-doesNotExist": "यह सूची does not exist",
|
||||
"error-user-doesNotExist": "यह user does not exist",
|
||||
"error-user-notAllowSelf": "You can not invite yourself",
|
||||
@@ -319,30 +319,30 @@
|
||||
"error-username-taken": "यह username is already taken",
|
||||
"error-email-taken": "Email has already been taken",
|
||||
"export-board": "Export बोर्ड",
|
||||
"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",
|
||||
"export-board-json": "JSON को निर्यात बोर्ड",
|
||||
"export-board-csv": "निर्यात बोर्ड को सी.एस.वी.",
|
||||
"export-board-tsv": "टी.एस.वी. को निर्यात बोर्ड",
|
||||
"export-board-html": "HTML को निर्यात बोर्ड",
|
||||
"exportBoardPopup-title": "Export बोर्ड",
|
||||
"sort": "Sort",
|
||||
"sort-desc": "Click to Sort List",
|
||||
"list-sort-by": "Sort the List By:",
|
||||
"list-label-modifiedAt": "Last Access Time",
|
||||
"list-label-title": "Name of the List",
|
||||
"list-label-sort": "Your Manual Order",
|
||||
"list-label-short-modifiedAt": "(L)",
|
||||
"list-label-short-title": "(N)",
|
||||
"list-label-short-sort": "(M)",
|
||||
"sort": "भांति",
|
||||
"sort-desc": "क्रमबद्ध सूची पर क्लिक करें",
|
||||
"list-sort-by": "सूची क्रमबद्ध करें:",
|
||||
"list-label-modifiedAt": "अंतिम पहुंच समय",
|
||||
"list-label-title": "सूची का नाम",
|
||||
"list-label-sort": "आपका नियमावलीआदेश",
|
||||
"list-label-short-modifiedAt": "(बड़ा)",
|
||||
"list-label-short-title": "(साधारण)",
|
||||
"list-label-short-sort": "(मध्यम)",
|
||||
"filter": "Filter",
|
||||
"filter-cards": "Filter Cards or Lists",
|
||||
"list-filter-label": "Filter List by Title",
|
||||
"filter-cards": "निस्पंदन पत्ते या सूची",
|
||||
"list-filter-label": "शीर्षक द्वारा निस्पंदन सूची",
|
||||
"filter-clear": "Clear filter",
|
||||
"filter-no-label": "No label",
|
||||
"filter-no-member": "No सदस्य",
|
||||
"filter-no-assignee": "No assignee",
|
||||
"filter-no-assignee": "कोई अभिहस्तांकिती नहीं",
|
||||
"filter-no-custom-fields": "No प्रचलन क्षेत्र",
|
||||
"filter-show-archive": "Show archived lists",
|
||||
"filter-hide-empty": "Hide empty lists",
|
||||
"filter-show-archive": "संग्रहित सूची दिखाएं",
|
||||
"filter-hide-empty": "खाली सूची छिपाएं",
|
||||
"filter-on": "Filter is on",
|
||||
"filter-on-desc": "You are filtering कार्ड इस पर बोर्ड. Click here तक संपादित करें filter.",
|
||||
"filter-to-selection": "Filter तक selection",
|
||||
@@ -359,16 +359,16 @@
|
||||
"import-board-c": "Import बोर्ड",
|
||||
"import-board-title-trello": "Import बोर्ड से Trello",
|
||||
"import-board-title-wekan": "Import board from previous export",
|
||||
"import-board-title-csv": "Import board from CSV/TSV",
|
||||
"import-board-title-csv": "CSV / TSV से आयात बोर्ड",
|
||||
"from-trello": "From Trello",
|
||||
"from-wekan": "From previous export",
|
||||
"from-csv": "From CSV/TSV",
|
||||
"from-csv": "CSV / TSV से",
|
||||
"import-board-instruction-trello": "In your Trello बोर्ड, go तक 'Menu', then 'More', 'Print और Export', 'Export JSON', और copy the resulting text.",
|
||||
"import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .",
|
||||
"import-board-instruction-csv": "अपने कोमा सेपरेटेड वैल्यू (CSV) / टैब सेपरेटेड वैल्यू (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-csv-placeholder": "अपना वैध CSV / TSV सामग्री यहां पेस्ट करें",
|
||||
"import-map-members": "Map सदस्य",
|
||||
"import-members-map": "Your imported board has some members. Please map the members you want to import to your users",
|
||||
"import-show-user-mapping": "Re आलोकन सदस्य mapping",
|
||||
@@ -401,7 +401,7 @@
|
||||
"swimlaneActionPopup-title": "तैरन Actions",
|
||||
"swimlaneAddPopup-title": "Add a Swimlane below",
|
||||
"listImportCardPopup-title": "Import एक Trello कार्ड",
|
||||
"listImportCardsTsvPopup-title": "Import Excel CSV/TSV",
|
||||
"listImportCardsTsvPopup-title": "एक्सेल CSV / TSV आयात करें",
|
||||
"listMorePopup-title": "More",
|
||||
"link-list": "Link तक यह list",
|
||||
"list-delete-pop": "All actions हो जाएगा हटा दिया से the activity feed और you won't be able तक recover the list. There is no undo.",
|
||||
@@ -464,7 +464,7 @@
|
||||
"save": "Save",
|
||||
"search": "Search",
|
||||
"rules": "Rules",
|
||||
"search-cards": "Search from card/list titles, descriptions and custom fields on this board",
|
||||
"search-cards": "इस बोर्ड पर कार्ड / सूची शीर्षक, विवरण और आदत क्षेत्र से खोजें",
|
||||
"search-example": "Text तक search for?",
|
||||
"select-color": "Select Color",
|
||||
"set-wip-limit-value": "Set एक limit for the maximum number of tasks अंदर में यह list",
|
||||
@@ -548,8 +548,8 @@
|
||||
"email-smtp-test-text": "You have successfully प्रेषित an email",
|
||||
"error-invitation-code-not-exist": "Invitation code doesn't exist",
|
||||
"error-notAuthorized": "You are not authorized तक आलोकन यह page.",
|
||||
"webhook-title": "Webhook Name",
|
||||
"webhook-token": "Token (Optional for Authentication)",
|
||||
"webhook-title": "वेबहुक नाम",
|
||||
"webhook-token": "टोकन (प्रमाणीकरण के लिए वैकल्पिक)",
|
||||
"outgoing-webhooks": "Outgoing Webhooks",
|
||||
"bidirectional-webhooks": "Two-Way Webhooks",
|
||||
"outgoingWebhooksPopup-title": "Outgoing Webhooks",
|
||||
@@ -808,5 +808,6 @@
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
+2
-1
@@ -808,5 +808,6 @@
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
+2
-1
@@ -808,5 +808,6 @@
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
+177
-176
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"accept": "Terima",
|
||||
"act-activity-notify": "Activity Notification",
|
||||
"act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"act-activity-notify": "Pemeberitahuan Aktifitas",
|
||||
"act-addAttachment": "ditambahkan lampiran __attachment__ di kartu __card__ pada daftar __list__ pada swimline __swimline__ pada papan __board__",
|
||||
"act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
@@ -25,7 +25,7 @@
|
||||
"act-createCustomField": "created custom field __customField__ at board __board__",
|
||||
"act-deleteCustomField": "deleted custom field __customField__ at board __board__",
|
||||
"act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"act-createList": "added list __list__ to board __board__",
|
||||
"act-createList": "ditambahkan daftar __list__ pada papan __board__",
|
||||
"act-addBoardMember": "added member __member__ to board __board__",
|
||||
"act-archivedBoard": "Board __board__ moved to Archive",
|
||||
"act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive",
|
||||
@@ -98,7 +98,7 @@
|
||||
"and-n-other-card_plural": "Dan__menghitung__kartu lain",
|
||||
"apply": "Terapkan",
|
||||
"app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.",
|
||||
"archive": "Move to Archive",
|
||||
"archive": "Pindahlan ke Arsip",
|
||||
"archive-all": "Move All to Archive",
|
||||
"archive-board": "Move Board to Archive",
|
||||
"archive-card": "Move Card to Archive",
|
||||
@@ -108,11 +108,11 @@
|
||||
"archiveBoardPopup-title": "Move Board to Archive?",
|
||||
"archived-items": "Arsip",
|
||||
"archived-boards": "Boards in Archive",
|
||||
"restore-board": "Restore Board",
|
||||
"no-archived-boards": "No Boards in Archive.",
|
||||
"restore-board": "Pulihkan Papan",
|
||||
"no-archived-boards": "Tidak ada Papan pada Arsip",
|
||||
"archives": "Arsip",
|
||||
"template": "Template",
|
||||
"templates": "Templates",
|
||||
"template": "Klise",
|
||||
"templates": "Klise",
|
||||
"assign-member": "Tugaskan anggota",
|
||||
"attached": "terlampir",
|
||||
"attachment": "Lampiran",
|
||||
@@ -131,22 +131,22 @@
|
||||
"boardChangeTitlePopup-title": "Ganti Nama Panel",
|
||||
"boardChangeVisibilityPopup-title": "Ubah Penampakan",
|
||||
"boardChangeWatchPopup-title": "Ubah Pengamatan",
|
||||
"boardMenuPopup-title": "Board Settings",
|
||||
"boardChangeViewPopup-title": "Board View",
|
||||
"boardMenuPopup-title": "Pengaturan Papan",
|
||||
"boardChangeViewPopup-title": "Tampilan Papan",
|
||||
"boards": "Panel",
|
||||
"board-view": "Board View",
|
||||
"board-view-cal": "Calendar",
|
||||
"board-view": "Tampilan Papan",
|
||||
"board-view-cal": "Kalender",
|
||||
"board-view-swimlanes": "Swimlanes",
|
||||
"board-view-collapse": "Collapse",
|
||||
"board-view-collapse": "Ciutkan",
|
||||
"board-view-lists": "Daftar",
|
||||
"bucket-example": "Contohnya seperti “Bucket List” ",
|
||||
"cancel": "Batal",
|
||||
"card-archived": "This card is moved to Archive.",
|
||||
"board-archived": "This board is moved to Archive.",
|
||||
"card-archived": "Kartu ini telah dipindahkan ke Arsip",
|
||||
"board-archived": "Kartu ini telah dipindahkan ke Arsip",
|
||||
"card-comments-title": "Kartu ini punya %s komentar",
|
||||
"card-delete-notice": "Menghapus sama dengan permanen. Anda akan kehilangan semua aksi yang terhubung ke kartu ini",
|
||||
"card-delete-pop": "Semua aksi akan dihapus dari aktivitas dan anda tidak bisa lagi buka kartu ini",
|
||||
"card-delete-suggest-archive": "You can move a card to Archive to remove it from the board and preserve the activity.",
|
||||
"card-delete-suggest-archive": "Kamu bisa memindahkan Kartu ke Arsip untuk menghapusnya dari Papan dan mempertahankan Aktifitas",
|
||||
"card-due": "Jatuh Tempo",
|
||||
"card-due-on": "Jatuh Tempo pada",
|
||||
"card-spent": "Spent Time",
|
||||
@@ -425,8 +425,8 @@
|
||||
"muted-info": "Anda tidak akan pernah dinotifikasi semua perubahan di panel ini",
|
||||
"my-boards": "Panel saya",
|
||||
"name": "Nama",
|
||||
"no-archived-cards": "No cards in Archive.",
|
||||
"no-archived-lists": "No lists in Archive.",
|
||||
"no-archived-cards": "Tidak ada kartu di arsip.",
|
||||
"no-archived-lists": "Tidak ada daftar di arsip.",
|
||||
"no-archived-swimlanes": "No swimlanes in Archive.",
|
||||
"no-results": "Tidak ada hasil",
|
||||
"normal": "Normal",
|
||||
@@ -452,8 +452,8 @@
|
||||
"quick-access-description": "Beri bintang panel untuk menambah shortcut di papan ini",
|
||||
"remove-cover": "Hapus Sampul",
|
||||
"remove-from-board": "Hapus dari panel",
|
||||
"remove-label": "Remove Label",
|
||||
"listDeletePopup-title": "Delete List ?",
|
||||
"remove-label": "Hapus Label",
|
||||
"listDeletePopup-title": "Hapus Daftar ?",
|
||||
"remove-member": "Hapus Anggota",
|
||||
"remove-member-from-card": "Hapus dari Kartu",
|
||||
"remove-member-pop": "Hapus__nama__(__username__) dari __boardTitle__? Partisipan akan dihapus dari semua kartu di panel ini. Mereka akan diberi tahu",
|
||||
@@ -463,21 +463,21 @@
|
||||
"restore": "Pulihkan",
|
||||
"save": "Simpan",
|
||||
"search": "Cari",
|
||||
"rules": "Rules",
|
||||
"search-cards": "Search from card/list titles, descriptions and custom fields on this board",
|
||||
"search-example": "Text to search for?",
|
||||
"select-color": "Select Color",
|
||||
"set-wip-limit-value": "Set a limit for the maximum number of tasks in this list",
|
||||
"setWipLimitPopup-title": "Set WIP Limit",
|
||||
"rules": "Peraturan",
|
||||
"search-cards": "Cari dari judul kartu/daftar, deskripsi dan bidang khusus di papan ini",
|
||||
"search-example": "Teks untuk dicari ?",
|
||||
"select-color": "Pilih Warna",
|
||||
"set-wip-limit-value": "Tetapkan batas untuk jumlah tugas maksimum dalam daftar ini",
|
||||
"setWipLimitPopup-title": "Tetapkan Batas WIP ",
|
||||
"shortcut-assign-self": "Masukkan diri anda sendiri ke kartu ini",
|
||||
"shortcut-autocomplete-emoji": "Autocomplete emoji",
|
||||
"shortcut-autocomplete-emoji": "Pelengkap Otomatis emoji",
|
||||
"shortcut-autocomplete-members": "Autocomplete partisipan",
|
||||
"shortcut-clear-filters": "Bersihkan semua saringan",
|
||||
"shortcut-close-dialog": "Tutup Dialog",
|
||||
"shortcut-filter-my-cards": "Filter kartu saya",
|
||||
"shortcut-show-shortcuts": "Angkat naik shortcut daftar ini",
|
||||
"shortcut-toggle-filterbar": "Toggle Filter Sidebar",
|
||||
"shortcut-toggle-sidebar": "Toggle Board Sidebar",
|
||||
"shortcut-toggle-filterbar": "Toggle Filter Bilah Samping",
|
||||
"shortcut-toggle-sidebar": "Toggle Papan Bilah Samping",
|
||||
"show-cards-minimum-count": "Tampilkan jumlah kartu jika daftar punya lebih dari ",
|
||||
"sidebar-open": "Buka Sidebar",
|
||||
"sidebar-close": "Tutup Sidebar",
|
||||
@@ -489,16 +489,16 @@
|
||||
"team": "Tim",
|
||||
"this-board": "Panel ini",
|
||||
"this-card": "Kartu ini",
|
||||
"spent-time-hours": "Spent time (hours)",
|
||||
"overtime-hours": "Overtime (hours)",
|
||||
"overtime": "Overtime",
|
||||
"has-overtime-cards": "Has overtime cards",
|
||||
"spent-time-hours": "Waktu yang dihabiskan (jam)",
|
||||
"overtime-hours": "Lembur (jam)",
|
||||
"overtime": "Lembur",
|
||||
"has-overtime-cards": "Punya kartu lembur",
|
||||
"has-spenttime-cards": "Has spent time cards",
|
||||
"time": "Waktu",
|
||||
"title": "Judul",
|
||||
"tracking": "Pelacakan",
|
||||
"tracking-info": "Anda akan dinotifikasi semua perubahan di kartu tersebut diaman anda terlibat sebagai creator atau partisipan",
|
||||
"type": "Type",
|
||||
"type": "tipe",
|
||||
"unassign-member": "Tidak sertakan partisipan",
|
||||
"unsaved-description": "Anda memiliki deskripsi yang belum disimpan.",
|
||||
"unwatch": "Tidak mengamati",
|
||||
@@ -515,11 +515,11 @@
|
||||
"welcome-swimlane": "Milestone 1",
|
||||
"welcome-list1": "Tingkat dasar",
|
||||
"welcome-list2": "Tingkat lanjut",
|
||||
"card-templates-swimlane": "Card Templates",
|
||||
"list-templates-swimlane": "List Templates",
|
||||
"board-templates-swimlane": "Board Templates",
|
||||
"card-templates-swimlane": "Klise Kartu",
|
||||
"list-templates-swimlane": "Klise Daftar",
|
||||
"board-templates-swimlane": "Klise Papan",
|
||||
"what-to-do": "Apa yang mau Anda lakukan?",
|
||||
"wipLimitErrorPopup-title": "Invalid WIP Limit",
|
||||
"wipLimitErrorPopup-title": "Batas WIP tidak valid",
|
||||
"wipLimitErrorPopup-dialog-pt1": "The number of tasks in this list is higher than the WIP limit you've defined.",
|
||||
"wipLimitErrorPopup-dialog-pt2": "Please move some tasks out of this list, or set a higher WIP limit.",
|
||||
"admin-panel": "Panel Admin",
|
||||
@@ -544,11 +544,11 @@
|
||||
"invitation-code": "Kode Undangan",
|
||||
"email-invite-register-subject": "__inviter__ mengirim undangan ke Anda",
|
||||
"email-invite-register-text": "Dear __user__,\n\n__inviter__ invites you to kanban board for collaborations.\n\nPlease follow the link below:\n__url__\n\nAnd your invitation code is: __icode__\n\nThanks.",
|
||||
"email-smtp-test-subject": "SMTP Test Email",
|
||||
"email-smtp-test-subject": "SMTP Tes Surel",
|
||||
"email-smtp-test-text": "You have successfully sent an email",
|
||||
"error-invitation-code-not-exist": "Kode undangan tidak ada",
|
||||
"error-notAuthorized": "You are not authorized to view this page.",
|
||||
"webhook-title": "Webhook Name",
|
||||
"webhook-title": "Nama Webhook",
|
||||
"webhook-token": "Token (Optional for Authentication)",
|
||||
"outgoing-webhooks": "Outgoing Webhooks",
|
||||
"bidirectional-webhooks": "Two-Way Webhooks",
|
||||
@@ -558,10 +558,10 @@
|
||||
"global-webhook": "Global Webhooks",
|
||||
"new-outgoing-webhook": "New Outgoing Webhook",
|
||||
"no-name": "(Unknown)",
|
||||
"Node_version": "Node version",
|
||||
"Meteor_version": "Meteor version",
|
||||
"MongoDB_version": "MongoDB version",
|
||||
"MongoDB_storage_engine": "MongoDB storage engine",
|
||||
"Node_version": "Versi Node",
|
||||
"Meteor_version": "Versi Meteor",
|
||||
"MongoDB_version": "Versi MongoDB",
|
||||
"MongoDB_storage_engine": "Mesin penyimpanan MongoDb",
|
||||
"MongoDB_Oplog_enabled": "MongoDB Oplog enabled",
|
||||
"OS_Arch": "OS Arch",
|
||||
"OS_Cpus": "OS CPU Count",
|
||||
@@ -572,44 +572,44 @@
|
||||
"OS_Totalmem": "OS Total Memory",
|
||||
"OS_Type": "OS Type",
|
||||
"OS_Uptime": "OS Uptime",
|
||||
"days": "days",
|
||||
"hours": "hours",
|
||||
"minutes": "minutes",
|
||||
"seconds": "seconds",
|
||||
"days": "hari",
|
||||
"hours": "m",
|
||||
"minutes": "menit",
|
||||
"seconds": "detik",
|
||||
"show-field-on-card": "Show this field on card",
|
||||
"automatically-field-on-card": "Auto create field to all cards",
|
||||
"showLabel-field-on-card": "Show field label on minicard",
|
||||
"yes": "Yes",
|
||||
"no": "No",
|
||||
"accounts": "Accounts",
|
||||
"yes": "Ya",
|
||||
"no": "Tidak",
|
||||
"accounts": "Akun",
|
||||
"accounts-allowEmailChange": "Allow Email Change",
|
||||
"accounts-allowUserNameChange": "Allow Username Change",
|
||||
"createdAt": "Created at",
|
||||
"verified": "Verified",
|
||||
"active": "Active",
|
||||
"card-received": "Received",
|
||||
"card-received-on": "Received on",
|
||||
"card-end": "End",
|
||||
"card-end-on": "Ends on",
|
||||
"editCardReceivedDatePopup-title": "Change received date",
|
||||
"editCardEndDatePopup-title": "Change end date",
|
||||
"setCardColorPopup-title": "Set color",
|
||||
"setCardActionsColorPopup-title": "Choose a color",
|
||||
"setSwimlaneColorPopup-title": "Choose a color",
|
||||
"setListColorPopup-title": "Choose a color",
|
||||
"assigned-by": "Assigned By",
|
||||
"requested-by": "Requested By",
|
||||
"createdAt": "Dibuat pada",
|
||||
"verified": "Terverifikasi",
|
||||
"active": "Aktif",
|
||||
"card-received": "Diterima",
|
||||
"card-received-on": "Diterima pada",
|
||||
"card-end": "Berakhir",
|
||||
"card-end-on": "Berakhir pada",
|
||||
"editCardReceivedDatePopup-title": "Ubah tanggal diterima",
|
||||
"editCardEndDatePopup-title": "Ubah tanggal berakhir",
|
||||
"setCardColorPopup-title": "Tetapkan warna",
|
||||
"setCardActionsColorPopup-title": "Pilih warna",
|
||||
"setSwimlaneColorPopup-title": "Pilih warna",
|
||||
"setListColorPopup-title": "Pilih warna",
|
||||
"assigned-by": "Ditandatangani Oleh",
|
||||
"requested-by": "Diminta Oleh",
|
||||
"board-delete-notice": "Deleting is permanent. You will lose all lists, cards and actions associated with this board.",
|
||||
"delete-board-confirm-popup": "All lists, cards, labels, and activities will be deleted and you won't be able to recover the board contents. There is no undo.",
|
||||
"boardDeletePopup-title": "Delete Board?",
|
||||
"delete-board": "Delete Board",
|
||||
"boardDeletePopup-title": "Hapus Papan?",
|
||||
"delete-board": "Hapus Papan",
|
||||
"default-subtasks-board": "Subtasks for __board__ board",
|
||||
"default": "Default",
|
||||
"queue": "Queue",
|
||||
"default": "Standar",
|
||||
"queue": "Antrian",
|
||||
"subtask-settings": "Subtasks Settings",
|
||||
"card-settings": "Card Settings",
|
||||
"card-settings": "Pengaturan Kartu",
|
||||
"boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
|
||||
"boardCardSettingsPopup-title": "Card Settings",
|
||||
"boardCardSettingsPopup-title": "Pengaturan Kartu",
|
||||
"deposit-subtasks-board": "Deposit subtasks to this board:",
|
||||
"deposit-subtasks-list": "Landing list for subtasks deposited here:",
|
||||
"show-parent-in-minicard": "Show parent in minicard:",
|
||||
@@ -629,34 +629,34 @@
|
||||
"activity-delete-attach-card": "deleted an attachment",
|
||||
"activity-set-customfield": "set custom field '%s' to '%s' in %s",
|
||||
"activity-unset-customfield": "unset custom field '%s' in %s",
|
||||
"r-rule": "Rule",
|
||||
"r-add-trigger": "Add trigger",
|
||||
"r-add-action": "Add action",
|
||||
"r-board-rules": "Board rules",
|
||||
"r-add-rule": "Add rule",
|
||||
"r-view-rule": "View rule",
|
||||
"r-rule": "Aturan",
|
||||
"r-add-trigger": "Tambahkan pelatuk",
|
||||
"r-add-action": "Tambahkan aksi",
|
||||
"r-board-rules": "Aturan papan",
|
||||
"r-add-rule": "Tambahkan aturan",
|
||||
"r-view-rule": "Lihat aturan",
|
||||
"r-delete-rule": "Delete rule",
|
||||
"r-new-rule-name": "New rule title",
|
||||
"r-no-rules": "No rules",
|
||||
"r-when-a-card": "When a card",
|
||||
"r-is": "is",
|
||||
"r-is-moved": "is moved",
|
||||
"r-added-to": "Added to",
|
||||
"r-removed-from": "Removed from",
|
||||
"r-the-board": "the board",
|
||||
"r-list": "list",
|
||||
"set-filter": "Set Filter",
|
||||
"r-moved-to": "Moved to",
|
||||
"r-moved-from": "Moved from",
|
||||
"r-archived": "Moved to Archive",
|
||||
"r-unarchived": "Restored from Archive",
|
||||
"r-a-card": "a card",
|
||||
"r-when-a-label-is": "When a label is",
|
||||
"r-when-the-label": "When the label",
|
||||
"r-list-name": "list name",
|
||||
"r-when-a-member": "When a member is",
|
||||
"r-when-the-member": "When the member",
|
||||
"r-name": "name",
|
||||
"r-when-a-card": "Ketika kartu",
|
||||
"r-is": "adalah",
|
||||
"r-is-moved": "dipindahkan",
|
||||
"r-added-to": "Ditambahkan ke",
|
||||
"r-removed-from": "Dihapus dari",
|
||||
"r-the-board": "papan",
|
||||
"r-list": "daftar",
|
||||
"set-filter": "Atur Saringan",
|
||||
"r-moved-to": "Dipindahkan ke",
|
||||
"r-moved-from": "Dipindahkan dari",
|
||||
"r-archived": "Dipindahkan ke Arsip",
|
||||
"r-unarchived": "Dipulihkan dari Arsip",
|
||||
"r-a-card": "Kartu",
|
||||
"r-when-a-label-is": "Ketika label adalah",
|
||||
"r-when-the-label": "Ketika label",
|
||||
"r-list-name": "nama daftar",
|
||||
"r-when-a-member": "Ketika anggota adalah",
|
||||
"r-when-the-member": "Ketika anggota",
|
||||
"r-name": "nama",
|
||||
"r-when-a-attach": "When an attachment",
|
||||
"r-when-a-checklist": "When a checklist is",
|
||||
"r-when-the-checklist": "When the checklist",
|
||||
@@ -669,70 +669,70 @@
|
||||
"r-move-card-to": "Move card to",
|
||||
"r-top-of": "Top of",
|
||||
"r-bottom-of": "Bottom of",
|
||||
"r-its-list": "its list",
|
||||
"r-archive": "Move to Archive",
|
||||
"r-unarchive": "Restore from Archive",
|
||||
"r-card": "card",
|
||||
"r-its-list": "daftar ini",
|
||||
"r-archive": "Pindahlan ke Arsip",
|
||||
"r-unarchive": "Pulihkan dari Arsip",
|
||||
"r-card": "Kartu",
|
||||
"r-add": "Tambah",
|
||||
"r-remove": "Remove",
|
||||
"r-remove": "hapus",
|
||||
"r-label": "label",
|
||||
"r-member": "member",
|
||||
"r-remove-all": "Remove all members from the card",
|
||||
"r-set-color": "Set color to",
|
||||
"r-member": "anggota",
|
||||
"r-remove-all": "Hapus semua anggota dari kartu",
|
||||
"r-set-color": "Tetapkan warna ke",
|
||||
"r-checklist": "checklist",
|
||||
"r-check-all": "Check all",
|
||||
"r-uncheck-all": "Uncheck all",
|
||||
"r-items-check": "items of checklist",
|
||||
"r-check": "Check",
|
||||
"r-uncheck": "Uncheck",
|
||||
"r-item": "item",
|
||||
"r-item": "Item",
|
||||
"r-of-checklist": "of checklist",
|
||||
"r-send-email": "Send an email",
|
||||
"r-to": "to",
|
||||
"r-of": "of",
|
||||
"r-subject": "subject",
|
||||
"r-to": "kepada",
|
||||
"r-of": "dari",
|
||||
"r-subject": "Subyek",
|
||||
"r-rule-details": "Rule details",
|
||||
"r-d-move-to-top-gen": "Move card to top of its list",
|
||||
"r-d-move-to-top-spec": "Move card to top of list",
|
||||
"r-d-move-to-bottom-gen": "Move card to bottom of its list",
|
||||
"r-d-move-to-bottom-spec": "Move card to bottom of list",
|
||||
"r-d-send-email": "Send email",
|
||||
"r-d-send-email-to": "to",
|
||||
"r-d-send-email-subject": "subject",
|
||||
"r-d-send-email-message": "message",
|
||||
"r-d-archive": "Move card to Archive",
|
||||
"r-d-unarchive": "Restore card from Archive",
|
||||
"r-d-send-email": "Kirim surel",
|
||||
"r-d-send-email-to": "kepada",
|
||||
"r-d-send-email-subject": "Subyek",
|
||||
"r-d-send-email-message": "pesan",
|
||||
"r-d-archive": "Pindahlan kartu ke Arsip",
|
||||
"r-d-unarchive": "Pulihkan kartu dari Arsip",
|
||||
"r-d-add-label": "Tambahkan label",
|
||||
"r-d-remove-label": "Remove label",
|
||||
"r-create-card": "Create new card",
|
||||
"r-in-list": "in list",
|
||||
"r-d-remove-label": "Hapus label",
|
||||
"r-create-card": "Buat kartu baru",
|
||||
"r-in-list": "pada daftar",
|
||||
"r-in-swimlane": "in swimlane",
|
||||
"r-d-add-member": "Add member",
|
||||
"r-d-remove-member": "Remove member",
|
||||
"r-d-remove-all-member": "Remove all member",
|
||||
"r-d-add-member": "Tambahkan anggota",
|
||||
"r-d-remove-member": "Hapus anggota",
|
||||
"r-d-remove-all-member": "Hapus semua anggota",
|
||||
"r-d-check-all": "Check all items of a list",
|
||||
"r-d-uncheck-all": "Uncheck all items of a list",
|
||||
"r-d-check-one": "Check item",
|
||||
"r-d-uncheck-one": "Uncheck item",
|
||||
"r-d-check-of-list": "of checklist",
|
||||
"r-d-add-checklist": "Add checklist",
|
||||
"r-d-remove-checklist": "Remove checklist",
|
||||
"r-by": "by",
|
||||
"r-add-checklist": "Add checklist",
|
||||
"r-with-items": "with items",
|
||||
"r-items-list": "item1,item2,item3",
|
||||
"r-d-add-checklist": "Tambahkan daftar periksa",
|
||||
"r-d-remove-checklist": "Hapus daftar periksa",
|
||||
"r-by": "oleh",
|
||||
"r-add-checklist": "Tambahkan daftar periksa",
|
||||
"r-with-items": "dengan item",
|
||||
"r-items-list": "item 1, item2, item 3",
|
||||
"r-add-swimlane": "Add swimlane",
|
||||
"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-when-a-card-is-moved": "When a card is moved to another list",
|
||||
"r-set": "Set",
|
||||
"r-update": "Update",
|
||||
"r-datefield": "date field",
|
||||
"r-df-start-at": "start",
|
||||
"r-df-due-at": "due",
|
||||
"r-df-end-at": "end",
|
||||
"r-df-received-at": "received",
|
||||
"r-set": "Tetapkan",
|
||||
"r-update": "Ubah",
|
||||
"r-datefield": "bidang tanggal",
|
||||
"r-df-start-at": "mulai",
|
||||
"r-df-due-at": "sampai",
|
||||
"r-df-end-at": "berakhir",
|
||||
"r-df-received-at": "diterima",
|
||||
"r-to-current-datetime": "to current date/time",
|
||||
"r-remove-value-from": "Remove value from",
|
||||
"ldap": "LDAP",
|
||||
@@ -741,22 +741,22 @@
|
||||
"authentication-method": "Metode Autentikasi",
|
||||
"authentication-type": "Tipe Autentikasi",
|
||||
"custom-product-name": "Custom Product Name",
|
||||
"layout": "Layout",
|
||||
"layout": "Tata letak",
|
||||
"hide-logo": "Sembunyikan Logo",
|
||||
"add-custom-html-after-body-start": "Add Custom HTML after <body> start",
|
||||
"add-custom-html-before-body-end": "Add Custom HTML before </body> end",
|
||||
"error-undefined": "Something went wrong",
|
||||
"error-ldap-login": "An error occurred while trying to login",
|
||||
"add-custom-html-after-body-start": "Tambahkan HTML khusus setelah <body> mulai",
|
||||
"add-custom-html-before-body-end": "Tambahkan HTML khusus sebelum </body> berakhir",
|
||||
"error-undefined": "Ada yang salah",
|
||||
"error-ldap-login": "Terjadi kesalahan saat mencoba masuk",
|
||||
"display-authentication-method": "Display Authentication Method",
|
||||
"default-authentication-method": "Default Authentication Method",
|
||||
"duplicate-board": "Duplicate Board",
|
||||
"people-number": "The number of people is:",
|
||||
"duplicate-board": "Duplikat Papan",
|
||||
"people-number": "Jumlah orang:",
|
||||
"swimlaneDeletePopup-title": "Delete Swimlane ?",
|
||||
"swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
|
||||
"restore-all": "Restore all",
|
||||
"delete-all": "Delete all",
|
||||
"loading": "Loading, please wait.",
|
||||
"previous_as": "last time was",
|
||||
"restore-all": "Pulihkan semua",
|
||||
"delete-all": "Hapus semua",
|
||||
"loading": "Sedang memuat, harap tunggu.",
|
||||
"previous_as": "terakhir kali adalah",
|
||||
"act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__",
|
||||
"act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)",
|
||||
"act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)",
|
||||
@@ -776,37 +776,38 @@
|
||||
"act-atUserComment": "You were mentioned in [__board__] __list__/__card__",
|
||||
"delete-user-confirm-popup": "Are you sure you want to delete this account? There is no undo.",
|
||||
"accounts-allowUserDelete": "Allow users to self delete their account",
|
||||
"hide-minicard-label-text": "Hide minicard label text",
|
||||
"show-desktop-drag-handles": "Show desktop drag handles",
|
||||
"assignee": "Assignee",
|
||||
"cardAssigneesPopup-title": "Assignee",
|
||||
"addmore-detail": "Add a more detailed description",
|
||||
"show-on-card": "Show on Card",
|
||||
"new": "New",
|
||||
"editUserPopup-title": "Edit User",
|
||||
"newUserPopup-title": "New User",
|
||||
"notifications": "Notifications",
|
||||
"view-all": "View All",
|
||||
"filter-by-unread": "Filter by Unread",
|
||||
"mark-all-as-read": "Mark all as read",
|
||||
"remove-all-read": "Remove all read",
|
||||
"allow-rename": "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",
|
||||
"hide-minicard-label-text": "Sembunyikan teks label kartu mini",
|
||||
"show-desktop-drag-handles": "Tampilkan gagang seret desktop",
|
||||
"assignee": "Penerima tugas",
|
||||
"cardAssigneesPopup-title": "Penerima tugas",
|
||||
"addmore-detail": "Tambahkan deskripsi yang lebih rinci",
|
||||
"show-on-card": "Tampilkan pada Kartu",
|
||||
"new": "Baru",
|
||||
"editUserPopup-title": "Ubah Pengguna",
|
||||
"newUserPopup-title": "Pengguna Baru",
|
||||
"notifications": "Pemberitahuan",
|
||||
"view-all": "Lihat Semua",
|
||||
"filter-by-unread": "Saring yang Belum Dibaca",
|
||||
"mark-all-as-read": "Tandai semua telah dibaca",
|
||||
"remove-all-read": "Hapus semua yang telah dibaca",
|
||||
"allow-rename": "Ijinkan Ganti Nama",
|
||||
"allowRenamePopup-title": "Ijinkan Ganti Nama",
|
||||
"start-day-of-week": "Tetapkan hari dimulai dalam minggu",
|
||||
"monday": "Senin",
|
||||
"tuesday": "Selasa",
|
||||
"wednesday": "Rabu",
|
||||
"thursday": "Kamis",
|
||||
"friday": "Jum'at",
|
||||
"saturday": "Sabtu",
|
||||
"sunday": "Minggu",
|
||||
"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"
|
||||
"owner": "Pemilik",
|
||||
"last-modified-at": "Terakhir diubah pada",
|
||||
"last-activity": "Aktifitas terakhir",
|
||||
"voting": "Pemungutan Suara",
|
||||
"archived": "Diarsipkan",
|
||||
"delete-linked-card-before-this-card": "Kamu tidak dapat menghapus kartu ini sebelum menghapus kartu tertaut yang telah",
|
||||
"delete-linked-cards-before-this-list": "Kamu tidak dapat menghapus daftar ini sebelum menghapus kartu tertaut yang mengarah ke kartu dalam daftar ini",
|
||||
"hide-checked-items": "Sembunyikan item yang dicentang"
|
||||
}
|
||||
+2
-1
@@ -808,5 +808,6 @@
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
+4
-3
@@ -256,8 +256,8 @@
|
||||
"current": "corrente",
|
||||
"custom-field-delete-pop": "Non potrai tornare indietro. Questa azione rimuoverà questo campo personalizzato da tutte le schede ed eliminerà ogni sua traccia.",
|
||||
"custom-field-checkbox": "Casella di scelta",
|
||||
"custom-field-currency": "Currency",
|
||||
"custom-field-currency-option": "Currency Code",
|
||||
"custom-field-currency": "Valuta",
|
||||
"custom-field-currency-option": "Codice Valuta",
|
||||
"custom-field-date": "Data",
|
||||
"custom-field-dropdown": "Lista a discesa",
|
||||
"custom-field-dropdown-none": "(niente)",
|
||||
@@ -808,5 +808,6 @@
|
||||
"voting": "Votazione",
|
||||
"archived": "Archiviato",
|
||||
"delete-linked-card-before-this-card": "Non puoi eliminare questa scheda prima di avere eliminato una scheda collegata che ha",
|
||||
"delete-linked-cards-before-this-list": "Non puoi eliminare questa lista prima di avere eliminato le schede collegate che puntano su schede in questa lista"
|
||||
"delete-linked-cards-before-this-list": "Non puoi eliminare questa lista prima di avere eliminato le schede collegate che puntano su schede in questa lista",
|
||||
"hide-checked-items": "Nascondi articoli controllati"
|
||||
}
|
||||
+12
-11
@@ -166,7 +166,7 @@
|
||||
"negativeVoteMembersPopup-title": "反対者",
|
||||
"card-edit-voting": "投票を編集",
|
||||
"editVoteEndDatePopup-title": "投票終了日の変更",
|
||||
"allowNonBoardMembers": "Allow all logged in users",
|
||||
"allowNonBoardMembers": "ログイン中のすべてのユーザーに許可",
|
||||
"vote-question": "投票の質問事項",
|
||||
"vote-public": "誰が何に投票したか表示",
|
||||
"vote-for-it": "賛成",
|
||||
@@ -256,8 +256,8 @@
|
||||
"current": "現在",
|
||||
"custom-field-delete-pop": "この操作は取り消しできません。このカスタムフィールドはすべてのカードから外され履歴からも見えなくなります。",
|
||||
"custom-field-checkbox": "チェックボックス",
|
||||
"custom-field-currency": "Currency",
|
||||
"custom-field-currency-option": "Currency Code",
|
||||
"custom-field-currency": "通貨",
|
||||
"custom-field-currency-option": "通貨コード",
|
||||
"custom-field-date": "日付",
|
||||
"custom-field-dropdown": "ドロップダウンリスト",
|
||||
"custom-field-dropdown-none": "(none)",
|
||||
@@ -362,9 +362,9 @@
|
||||
"import-board-title-csv": "ボードをCSV/TSVからインポート",
|
||||
"from-trello": "Trelloから",
|
||||
"from-wekan": "以前のエクスポートから",
|
||||
"from-csv": "From CSV/TSV",
|
||||
"from-csv": "CSV/TSV から",
|
||||
"import-board-instruction-trello": "Trelloボードの、 'Menu' → 'More' → 'Print and Export' → 'Export JSON'を選択し、テキストをコピーしてください。",
|
||||
"import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .",
|
||||
"import-board-instruction-csv": "カンマ区切り(CSV) / タブ区切り(TSV) ファイルに貼り付けてください。",
|
||||
"import-board-instruction-wekan": "ボードの、 'メニュー' → 'ボードのエクスポート'を選択し、ダウンロードされたファイルの中のテキストをコピーしてください。",
|
||||
"import-board-instruction-about-errors": "ボードのインポート中にエラーが発生した場合、インポートがまだ進行中のまま、全てのボードページに表示されている場合があります。",
|
||||
"import-json-placeholder": "JSONデータをここに貼り付けする",
|
||||
@@ -641,7 +641,7 @@
|
||||
"r-when-a-card": "カード:",
|
||||
"r-is": "が",
|
||||
"r-is-moved": "が移動された時",
|
||||
"r-added-to": "Added to",
|
||||
"r-added-to": "次に追加された時",
|
||||
"r-removed-from": "次から削除された時",
|
||||
"r-the-board": "ボード:",
|
||||
"r-list": "リスト:",
|
||||
@@ -800,13 +800,14 @@
|
||||
"friday": "金曜",
|
||||
"saturday": "土曜",
|
||||
"sunday": "日曜",
|
||||
"status": "Status",
|
||||
"status": "ステータス",
|
||||
"swimlane": "スイムレーン",
|
||||
"owner": "オーナー",
|
||||
"last-modified-at": "Last modified at",
|
||||
"last-activity": "Last activity",
|
||||
"last-modified-at": "最終更新",
|
||||
"last-activity": "最終アクティビティ",
|
||||
"voting": "投票",
|
||||
"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"
|
||||
"delete-linked-card-before-this-card": "カード内にある、リンクされているカードを削除しなければ、このカードは削除できません",
|
||||
"delete-linked-cards-before-this-list": "リスト内にある、他のカードを参照しているカードを削除しなければ、このリストは削除できません",
|
||||
"hide-checked-items": "チェックした項目を隠す"
|
||||
}
|
||||
+2
-1
@@ -808,5 +808,6 @@
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
+2
-1
@@ -808,5 +808,6 @@
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
+2
-1
@@ -808,5 +808,6 @@
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
+2
-1
@@ -808,5 +808,6 @@
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
+2
-1
@@ -808,5 +808,6 @@
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
+2
-1
@@ -808,5 +808,6 @@
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
+2
-1
@@ -808,5 +808,6 @@
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
+4
-3
@@ -256,8 +256,8 @@
|
||||
"current": "Huidige",
|
||||
"custom-field-delete-pop": "Er is geen herstelmogelijkheid. Deze actie zal dit maatwerkveld van alle kaarten verwijderen en de bijbehorende historie wissen.",
|
||||
"custom-field-checkbox": "Checkbox",
|
||||
"custom-field-currency": "Currency",
|
||||
"custom-field-currency-option": "Currency Code",
|
||||
"custom-field-currency": "Valuta",
|
||||
"custom-field-currency-option": "Valuta Teken",
|
||||
"custom-field-date": "Datum",
|
||||
"custom-field-dropdown": "Dropdown Lijst",
|
||||
"custom-field-dropdown-none": "(geen)",
|
||||
@@ -808,5 +808,6 @@
|
||||
"voting": "Stemmen",
|
||||
"archived": "Gearchiveerd",
|
||||
"delete-linked-card-before-this-card": "Je kunt deze kaart niet verwijderen voordat de gekoppelde kaart is verwijderd ",
|
||||
"delete-linked-cards-before-this-list": "Je kunt deze lijst niet verwijderen voordat de gekoppelde kaarten verwijderd zijn die verwijzen naar kaarten in deze lijst"
|
||||
"delete-linked-cards-before-this-list": "Je kunt deze lijst niet verwijderen voordat de gekoppelde kaarten verwijderd zijn die verwijzen naar kaarten in deze lijst",
|
||||
"hide-checked-items": "Verberg aangevinkte items"
|
||||
}
|
||||
+2
-1
@@ -808,5 +808,6 @@
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
+4
-3
@@ -256,8 +256,8 @@
|
||||
"current": "obecny",
|
||||
"custom-field-delete-pop": "Nie ma możliwości wycofania tej operacji. To usunie te niestandardowe pole ze wszystkich kart oraz usunie ich całą historię.",
|
||||
"custom-field-checkbox": "Pole wyboru",
|
||||
"custom-field-currency": "Currency",
|
||||
"custom-field-currency-option": "Currency Code",
|
||||
"custom-field-currency": "Waluta",
|
||||
"custom-field-currency-option": "Kod waluty",
|
||||
"custom-field-date": "Data",
|
||||
"custom-field-dropdown": "Lista rozwijana",
|
||||
"custom-field-dropdown-none": "(puste)",
|
||||
@@ -808,5 +808,6 @@
|
||||
"voting": "Głosowanie",
|
||||
"archived": "Zarchiwizowany",
|
||||
"delete-linked-card-before-this-card": "Nie możesz usunąć tej karty, dopóki nie usuniesz podpiętej karty, w której są",
|
||||
"delete-linked-cards-before-this-list": "Nie możesz usunąć tej karty, dopóki nie usuniesz podpiętych kart, które wskazują na karty w tej liście"
|
||||
"delete-linked-cards-before-this-list": "Nie możesz usunąć tej karty, dopóki nie usuniesz podpiętych kart, które wskazują na karty w tej liście",
|
||||
"hide-checked-items": "Hide checked items"
|
||||
}
|
||||
@@ -808,5 +808,6 @@
|
||||
"voting": "Votação",
|
||||
"archived": "Arquivado",
|
||||
"delete-linked-card-before-this-card": "Você não pode excluir este cartão antes de excluir primeiro o cartão vinculado que possui",
|
||||
"delete-linked-cards-before-this-list": "Você não pode excluir esta lista antes de excluir primeiro os cartões vinculados que estão apontando para os cartões nesta lista"
|
||||
"delete-linked-cards-before-this-list": "Você não pode excluir esta lista antes de excluir primeiro os cartões vinculados que estão apontando para os cartões nesta lista",
|
||||
"hide-checked-items": "Esconder itens marcados"
|
||||
}
|
||||
+39
-38
@@ -137,7 +137,7 @@
|
||||
"board-view": "Visão do Quadro",
|
||||
"board-view-cal": "Calendário",
|
||||
"board-view-swimlanes": "Pistas",
|
||||
"board-view-collapse": "Collapse",
|
||||
"board-view-collapse": "Colapsar ",
|
||||
"board-view-lists": "Listas",
|
||||
"bucket-example": "\"Lista de Desejos\", por exemplo",
|
||||
"cancel": "Cancelar",
|
||||
@@ -164,14 +164,14 @@
|
||||
"cardStartVotingPopup-title": "Start a vote",
|
||||
"positiveVoteMembersPopup-title": "Proponents",
|
||||
"negativeVoteMembersPopup-title": "Opponents",
|
||||
"card-edit-voting": "Edit voting",
|
||||
"card-edit-voting": "Alterar voto",
|
||||
"editVoteEndDatePopup-title": "Change vote end date",
|
||||
"allowNonBoardMembers": "Allow all logged in users",
|
||||
"vote-question": "Voting question",
|
||||
"vote-public": "Show who voted what",
|
||||
"vote-for-it": "for it",
|
||||
"vote-against": "against",
|
||||
"deleteVotePopup-title": "Delete vote?",
|
||||
"deleteVotePopup-title": "Apagar voto?",
|
||||
"vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.",
|
||||
"cardDeletePopup-title": "Apagar Cartão?",
|
||||
"cardDetailsActionsPopup-title": "Acções do Cartão",
|
||||
@@ -256,8 +256,8 @@
|
||||
"current": "actual",
|
||||
"custom-field-delete-pop": "Não existe desfazer. Isto irá remover este campo personalizado de todos os cartões e destruir o seu histórico",
|
||||
"custom-field-checkbox": "Caixa de selecção",
|
||||
"custom-field-currency": "Currency",
|
||||
"custom-field-currency-option": "Currency Code",
|
||||
"custom-field-currency": "Moeda",
|
||||
"custom-field-currency-option": "Código de Moeda",
|
||||
"custom-field-date": "Data",
|
||||
"custom-field-dropdown": "Lista Suspensa",
|
||||
"custom-field-dropdown-none": "(nada)",
|
||||
@@ -324,18 +324,18 @@
|
||||
"export-board-tsv": "Export board to TSV",
|
||||
"export-board-html": "Export board to HTML",
|
||||
"exportBoardPopup-title": "Exportar quadro",
|
||||
"sort": "Sort",
|
||||
"sort-desc": "Click to Sort List",
|
||||
"list-sort-by": "Sort the List By:",
|
||||
"sort": "Ordenar",
|
||||
"sort-desc": "Clique para ordenar a Lista",
|
||||
"list-sort-by": "Ordenar a Lista por:",
|
||||
"list-label-modifiedAt": "Last Access Time",
|
||||
"list-label-title": "Name of the List",
|
||||
"list-label-title": "Nome da Lista",
|
||||
"list-label-sort": "Your Manual Order",
|
||||
"list-label-short-modifiedAt": "(L)",
|
||||
"list-label-short-title": "(N)",
|
||||
"list-label-short-sort": "(M)",
|
||||
"filter": "Filtrar",
|
||||
"filter-cards": "Filter Cards or Lists",
|
||||
"list-filter-label": "Filter List by Title",
|
||||
"filter-cards": "Filtrar Cartões ou Listas",
|
||||
"list-filter-label": "Filtrar Lista por Título",
|
||||
"filter-clear": "Limpar filtro",
|
||||
"filter-no-label": "Sem etiquetas",
|
||||
"filter-no-member": "Sem membros",
|
||||
@@ -362,13 +362,13 @@
|
||||
"import-board-title-csv": "Import board from CSV/TSV",
|
||||
"from-trello": "Do Trello",
|
||||
"from-wekan": "A partir de exportação prévia",
|
||||
"from-csv": "From CSV/TSV",
|
||||
"from-csv": "De CSV/TSV",
|
||||
"import-board-instruction-trello": "No seu quadro do Trello, vá em 'Menu', depois em 'Mais', 'Imprimir e Exportar', 'Exportar JSON', e copie o texto resultante.",
|
||||
"import-board-instruction-csv": "Paste in your Comma Separated Values(CSV)/ Tab Separated Values (TSV) .",
|
||||
"import-board-instruction-wekan": "No seu quadro vá para 'Menu', depois 'Exportar quadro' e copie o texto no ficheiro descarregado.",
|
||||
"import-board-instruction-about-errors": "Se receber erros ao importar o quadro, às vezes a importação ainda funciona e o quadro está na página Todos os Quadros.",
|
||||
"import-json-placeholder": "Cole seus dados JSON válidos aqui",
|
||||
"import-csv-placeholder": "Paste your valid CSV/TSV data here",
|
||||
"import-csv-placeholder": "Copie aqui os seus dados CSV/TSV",
|
||||
"import-map-members": "Mapear membros",
|
||||
"import-members-map": "O seu quadro importado possui alguns membros. Por favor, mapeie os membros que deseja importar para seus utilizadores",
|
||||
"import-show-user-mapping": "Rever mapeamento dos membros",
|
||||
@@ -401,7 +401,7 @@
|
||||
"swimlaneActionPopup-title": "Acções de Pista",
|
||||
"swimlaneAddPopup-title": "Adicionar uma Pista abaixo",
|
||||
"listImportCardPopup-title": "Importe um cartão do Trello",
|
||||
"listImportCardsTsvPopup-title": "Import Excel CSV/TSV",
|
||||
"listImportCardsTsvPopup-title": "Importar Excel CSV/TSV",
|
||||
"listMorePopup-title": "Mais",
|
||||
"link-list": "Ligar a esta lista",
|
||||
"list-delete-pop": "Todas as acções serão removidas do feed de actividade e não poderá recuperar a lista. Não há como desfazer.",
|
||||
@@ -641,7 +641,7 @@
|
||||
"r-when-a-card": "Quando um cartão",
|
||||
"r-is": "é",
|
||||
"r-is-moved": "é movido",
|
||||
"r-added-to": "Added to",
|
||||
"r-added-to": "Adicionado a",
|
||||
"r-removed-from": "Removido de",
|
||||
"r-the-board": "o quadro",
|
||||
"r-list": "lista",
|
||||
@@ -689,7 +689,7 @@
|
||||
"r-of-checklist": "da lista de verificação",
|
||||
"r-send-email": "Enviar um e-mail",
|
||||
"r-to": "para",
|
||||
"r-of": "of",
|
||||
"r-of": "de",
|
||||
"r-subject": "assunto",
|
||||
"r-rule-details": "Detalhes da regra",
|
||||
"r-d-move-to-top-gen": "Mover cartão para o topo da sua lista",
|
||||
@@ -780,33 +780,34 @@
|
||||
"show-desktop-drag-handles": "Show desktop drag handles",
|
||||
"assignee": "Assignee",
|
||||
"cardAssigneesPopup-title": "Assignee",
|
||||
"addmore-detail": "Add a more detailed description",
|
||||
"addmore-detail": "Adicionar uma descrição mais detalhada",
|
||||
"show-on-card": "Show on Card",
|
||||
"new": "New",
|
||||
"editUserPopup-title": "Edit User",
|
||||
"newUserPopup-title": "New User",
|
||||
"notifications": "Notifications",
|
||||
"view-all": "View All",
|
||||
"filter-by-unread": "Filter by Unread",
|
||||
"mark-all-as-read": "Mark all as read",
|
||||
"remove-all-read": "Remove all read",
|
||||
"allow-rename": "Allow Rename",
|
||||
"allowRenamePopup-title": "Allow Rename",
|
||||
"new": "Novo",
|
||||
"editUserPopup-title": "Editar Utilizador",
|
||||
"newUserPopup-title": "Novo Utilizador",
|
||||
"notifications": "Notificações",
|
||||
"view-all": "Ver Todos",
|
||||
"filter-by-unread": "Filtrar por não lidos",
|
||||
"mark-all-as-read": "Marcar todos como lidos",
|
||||
"remove-all-read": "Apagar todos os lidos",
|
||||
"allow-rename": "Permitir Renomear",
|
||||
"allowRenamePopup-title": "Permitir Renomear",
|
||||
"start-day-of-week": "Set day of the week start",
|
||||
"monday": "Monday",
|
||||
"tuesday": "Tuesday",
|
||||
"wednesday": "Wednesday",
|
||||
"thursday": "Thursday",
|
||||
"friday": "Friday",
|
||||
"saturday": "Saturday",
|
||||
"sunday": "Sunday",
|
||||
"monday": "Segunda-feira",
|
||||
"tuesday": "Terça-feira",
|
||||
"wednesday": "Quarta-feira",
|
||||
"thursday": "Quinta-feira",
|
||||
"friday": "Sexta-feira",
|
||||
"saturday": "Sábado",
|
||||
"sunday": "Domingo",
|
||||
"status": "Status",
|
||||
"swimlane": "Swimlane",
|
||||
"owner": "Owner",
|
||||
"last-modified-at": "Last modified at",
|
||||
"last-activity": "Last activity",
|
||||
"last-modified-at": "Modificado pela última vez em",
|
||||
"last-activity": "Última actividade",
|
||||
"voting": "Voting",
|
||||
"archived": "Archived",
|
||||
"archived": "Arquivado",
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
+2
-1
@@ -808,5 +808,6 @@
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
+4
-3
@@ -256,8 +256,8 @@
|
||||
"current": "текущий",
|
||||
"custom-field-delete-pop": "Отменить нельзя. Это удалит настраиваемое поле со всех карт и уничтожит его историю.",
|
||||
"custom-field-checkbox": "Галочка",
|
||||
"custom-field-currency": "Currency",
|
||||
"custom-field-currency-option": "Currency Code",
|
||||
"custom-field-currency": "Валюта",
|
||||
"custom-field-currency-option": "Код валюты",
|
||||
"custom-field-date": "Дата",
|
||||
"custom-field-dropdown": "Выпадающий список",
|
||||
"custom-field-dropdown-none": "(нет)",
|
||||
@@ -808,5 +808,6 @@
|
||||
"voting": "Голосование",
|
||||
"archived": "Архивировано",
|
||||
"delete-linked-card-before-this-card": "Вы не можете удалить карточку, не удалив связанную c ней карточку, которая имеет ",
|
||||
"delete-linked-cards-before-this-list": "Вы не можете удалить этот список, не удалив карточки, которые указывают на карточки в этом списке"
|
||||
"delete-linked-cards-before-this-list": "Вы не можете удалить этот список, не удалив карточки, которые указывают на карточки в этом списке",
|
||||
"hide-checked-items": "Спрятать отмеченные"
|
||||
}
|
||||
+2
-1
@@ -808,5 +808,6 @@
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
+2
-1
@@ -808,5 +808,6 @@
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
+2
-1
@@ -808,5 +808,6 @@
|
||||
"voting": "Röstning",
|
||||
"archived": "Arkiverad",
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
+2
-1
@@ -808,5 +808,6 @@
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
+2
-1
@@ -808,5 +808,6 @@
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
+2
-1
@@ -808,5 +808,6 @@
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
+26
-25
@@ -256,8 +256,8 @@
|
||||
"current": "mevcut",
|
||||
"custom-field-delete-pop": "Bunun geri dönüşü yoktur. Bu özel alan tüm kartlardan kaldırılıp tarihçesi yokedilecektir.",
|
||||
"custom-field-checkbox": "İşaret kutusu",
|
||||
"custom-field-currency": "Currency",
|
||||
"custom-field-currency-option": "Currency Code",
|
||||
"custom-field-currency": "Para birimi",
|
||||
"custom-field-currency-option": "Para birimi kodu",
|
||||
"custom-field-date": "Tarih",
|
||||
"custom-field-dropdown": "Açılır liste",
|
||||
"custom-field-dropdown-none": "(hiçbiri)",
|
||||
@@ -319,12 +319,12 @@
|
||||
"error-username-taken": "Kullanıcı adı zaten alınmış",
|
||||
"error-email-taken": "Bu e-posta adresi daha önceden alınmış",
|
||||
"export-board": "Panoyu dışarı aktar",
|
||||
"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",
|
||||
"export-board-json": "Panoyu JSON olarak dışarı aktar",
|
||||
"export-board-csv": "Panoyu CSV olarak dışarı aktar",
|
||||
"export-board-tsv": "Panoyu TSV olarak dışarı aktar",
|
||||
"export-board-html": "Panoyu HTML olarak dışarı aktar",
|
||||
"exportBoardPopup-title": "Panoyu dışarı aktar",
|
||||
"sort": "Sort",
|
||||
"sort": "Sırala",
|
||||
"sort-desc": "Click to Sort List",
|
||||
"list-sort-by": "Sort the List By:",
|
||||
"list-label-modifiedAt": "Son Erişim Zamanı...",
|
||||
@@ -341,8 +341,8 @@
|
||||
"filter-no-member": "Üye yok",
|
||||
"filter-no-assignee": "No assignee",
|
||||
"filter-no-custom-fields": "Hiç özel alan yok",
|
||||
"filter-show-archive": "Show archived lists",
|
||||
"filter-hide-empty": "Hide empty lists",
|
||||
"filter-show-archive": "Arşivlenmiş listeleri göster",
|
||||
"filter-hide-empty": "Boş listeleri gizle",
|
||||
"filter-on": "Filtre aktif",
|
||||
"filter-on-desc": "Bu panodaki kartları filtreliyorsunuz. Fitreyi düzenlemek için tıklayın.",
|
||||
"filter-to-selection": "Seçime göre filtreleme yap",
|
||||
@@ -359,10 +359,10 @@
|
||||
"import-board-c": "Panoyu içe aktar",
|
||||
"import-board-title-trello": "Trello'dan panoyu içeri aktar",
|
||||
"import-board-title-wekan": "Import board from previous export",
|
||||
"import-board-title-csv": "Import board from CSV/TSV",
|
||||
"import-board-title-csv": "CSV/TSV formatındaki panoyu içeri aktar",
|
||||
"from-trello": "Trello'dan",
|
||||
"from-wekan": "From previous export",
|
||||
"from-csv": "From CSV/TSV",
|
||||
"from-csv": "CSV/TSV'den",
|
||||
"import-board-instruction-trello": "Trello panonuzda 'Menü'ye gidip 'Daha fazlası'na tıklayın, ardından 'Yazdır ve Çıktı Al'ı seçip 'JSON biçiminde çıktı al' diyerek çıkan metni buraya kopyalayın.",
|
||||
"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.",
|
||||
@@ -399,10 +399,10 @@
|
||||
"set-color-list": "Rengi Ayarla",
|
||||
"listActionPopup-title": "Liste İşlemleri",
|
||||
"swimlaneActionPopup-title": "Kulvar İşlemleri",
|
||||
"swimlaneAddPopup-title": "Add a Swimlane below",
|
||||
"swimlaneAddPopup-title": "Aşağı kulvar ekle",
|
||||
"listImportCardPopup-title": "Bir Trello kartını içeri aktar",
|
||||
"listImportCardsTsvPopup-title": "Import Excel CSV/TSV",
|
||||
"listMorePopup-title": "Daha",
|
||||
"listMorePopup-title": "Daha fazla",
|
||||
"link-list": "Listeye doğrudan bağlantı",
|
||||
"list-delete-pop": "Etkinlik akışınızdaki tüm eylemler geri kurtarılamaz şekilde kaldırılacak. Bu işlem geri alınamaz.",
|
||||
"list-delete-suggest-archive": "You can move a list to Archive to remove it from the board and preserve the activity.",
|
||||
@@ -437,7 +437,7 @@
|
||||
"optional": "isteğe bağlı",
|
||||
"or": "veya",
|
||||
"page-maybe-private": "Bu sayfa gizli olabilir. <a href='%s'>Oturum açarak</a> görmeyi deneyin.",
|
||||
"page-not-found": "Sayda bulunamadı.",
|
||||
"page-not-found": "Sayfa bulunamadı.",
|
||||
"password": "Parola",
|
||||
"paste-or-dragdrop": "Dosya eklemek için yapıştırabilir, veya (eğer resimse) sürükle bırak yapabilirsiniz",
|
||||
"participating": "Katılımcılar",
|
||||
@@ -448,8 +448,8 @@
|
||||
"private-desc": "Bu pano gizli. Sadece panoya ekli kişiler görüntüleyebilir ve düzenleyebilir.",
|
||||
"profile": "Kullanıcı Sayfası",
|
||||
"public": "Genel",
|
||||
"public-desc": "Bu pano genel. Bağlantı adresi ile herhangi bir kimseye görünür ve Google gibi arama motorlarında gösterilecektir. Panoyu, sadece eklenen kişiler düzenleyebilir.",
|
||||
"quick-access-description": "Bu bara kısayol olarak bir pano eklemek için panoyu yıldızlamalısınız",
|
||||
"public-desc": "Bu pano genel bir panodur. Bağlantıya sahip olan herkes panoyu görüntüleyebilir, ayrıca panonuz Google gibi arama motorlarında görünür. Panoyu, sadece panoya eklenen kişiler düzenleyebilir.",
|
||||
"quick-access-description": "Yıldızladığınız panolar burada gözükür",
|
||||
"remove-cover": "Kapak Resmini Kaldır",
|
||||
"remove-from-board": "Panodan Kaldır",
|
||||
"remove-label": "Etiketi Kaldır",
|
||||
@@ -515,9 +515,9 @@
|
||||
"welcome-swimlane": "Kilometre taşı",
|
||||
"welcome-list1": "Temel",
|
||||
"welcome-list2": "Gelişmiş",
|
||||
"card-templates-swimlane": "Card Templates",
|
||||
"list-templates-swimlane": "List Templates",
|
||||
"board-templates-swimlane": "Board Templates",
|
||||
"card-templates-swimlane": "Kart şablonları",
|
||||
"list-templates-swimlane": "Liste şablonları",
|
||||
"board-templates-swimlane": "Pano şablonları",
|
||||
"what-to-do": "Ne yapmak istiyorsunuz?",
|
||||
"wipLimitErrorPopup-title": "Geçersiz Devam Eden İş Sınırı",
|
||||
"wipLimitErrorPopup-dialog-pt1": "Bu listedeki iş sayısı belirlediğiniz sınırdan daha fazla.",
|
||||
@@ -559,8 +559,8 @@
|
||||
"new-outgoing-webhook": "Yeni Dışarı Giden Web Bağlantısı",
|
||||
"no-name": "(Bilinmeyen)",
|
||||
"Node_version": "Node sürümü",
|
||||
"Meteor_version": "Meteor version",
|
||||
"MongoDB_version": "MongoDB version",
|
||||
"Meteor_version": "Meteor sürümü",
|
||||
"MongoDB_version": "MongoDB sürümü",
|
||||
"MongoDB_storage_engine": "MongoDB storage engine",
|
||||
"MongoDB_Oplog_enabled": "MongoDB Oplog enabled",
|
||||
"OS_Arch": "İşletim Sistemi Mimarisi",
|
||||
@@ -603,13 +603,13 @@
|
||||
"delete-board-confirm-popup": "Tüm listeler, kartlar, etiketler ve etkinlikler silinecek ve pano içeriğini kurtaramayacaksınız. Geri dönüş yok.",
|
||||
"boardDeletePopup-title": "Panoyu Sil?",
|
||||
"delete-board": "Panoyu Sil",
|
||||
"default-subtasks-board": "Subtasks for __board__ board",
|
||||
"default-subtasks-board": "__board__ panosu için alt görevler",
|
||||
"default": "Varsayılan",
|
||||
"queue": "Sıra",
|
||||
"subtask-settings": "Alt Görev ayarları",
|
||||
"card-settings": "Card Settings",
|
||||
"card-settings": "Kart ayarları",
|
||||
"boardSubtaskSettingsPopup-title": "Pano alt görev ayarları",
|
||||
"boardCardSettingsPopup-title": "Card Settings",
|
||||
"boardCardSettingsPopup-title": "Kart ayarları",
|
||||
"deposit-subtasks-board": "Deposit subtasks to this board:",
|
||||
"deposit-subtasks-list": "Alt görevlerin açılacağı liste:",
|
||||
"show-parent-in-minicard": "Mini kart içinde üst kartı göster",
|
||||
@@ -808,5 +808,6 @@
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
+2
-1
@@ -808,5 +808,6 @@
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
+2
-1
@@ -808,5 +808,6 @@
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
@@ -256,8 +256,8 @@
|
||||
"current": "当前",
|
||||
"custom-field-delete-pop": "没有撤销,此动作将从所有卡片中移除自定义字段并销毁历史。",
|
||||
"custom-field-checkbox": "选择框",
|
||||
"custom-field-currency": "Currency",
|
||||
"custom-field-currency-option": "Currency Code",
|
||||
"custom-field-currency": "货币",
|
||||
"custom-field-currency-option": "货币代码",
|
||||
"custom-field-date": "日期",
|
||||
"custom-field-dropdown": "下拉列表",
|
||||
"custom-field-dropdown-none": "(无)",
|
||||
@@ -808,5 +808,6 @@
|
||||
"voting": "投票",
|
||||
"archived": "存档",
|
||||
"delete-linked-card-before-this-card": "在你首次删除卡片前你无法删除此选项卡片",
|
||||
"delete-linked-cards-before-this-list": "在首先删除指向此列表中的卡的链接卡之前,不能删除此列表"
|
||||
"delete-linked-cards-before-this-list": "在首先删除指向此列表中的卡的链接卡之前,不能删除此列表",
|
||||
"hide-checked-items": "隐藏选中项"
|
||||
}
|
||||
@@ -808,5 +808,6 @@
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
@@ -808,5 +808,6 @@
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
+12
-8
@@ -18,18 +18,14 @@ Boards.attachSchema(
|
||||
type: String,
|
||||
// eslint-disable-next-line consistent-return
|
||||
autoValue() {
|
||||
// XXX We need to improve slug management. Only the id should be necessary
|
||||
// to identify a board in the code.
|
||||
// XXX If the board title is updated, the slug should also be updated.
|
||||
// In some cases (Chinese and Japanese for instance) the `getSlug` function
|
||||
// return an empty string. This is causes bugs in our application so we set
|
||||
// a default slug in this case.
|
||||
if (this.isInsert && !this.isSet) {
|
||||
// Improvment would be to change client URL after slug is changed
|
||||
const title = this.field('title');
|
||||
if (title.isSet && !this.isSet) {
|
||||
let slug = 'board';
|
||||
const title = this.field('title');
|
||||
if (title.isSet) {
|
||||
slug = getSlug(title.value) || slug;
|
||||
}
|
||||
slug = getSlug(title.value) || slug;
|
||||
return slug;
|
||||
}
|
||||
},
|
||||
@@ -1219,6 +1215,14 @@ if (Meteor.isServer) {
|
||||
fetch: ['members'],
|
||||
});
|
||||
|
||||
// All logged in users are allowed to reorder boards by dragging at All Boards page and Public Boards page.
|
||||
Boards.allow({
|
||||
update(userId, board, fieldNames) {
|
||||
return _.contains(fieldNames, 'sort');
|
||||
},
|
||||
fetch: [],
|
||||
});
|
||||
|
||||
// The number of users that have starred this board is managed by trusted code
|
||||
// and the user is not allowed to update it
|
||||
Boards.deny({
|
||||
|
||||
+157
-56
@@ -368,30 +368,36 @@ Cards.allow({
|
||||
|
||||
Cards.helpers({
|
||||
copy(boardId, swimlaneId, listId) {
|
||||
const oldBoard = Boards.findOne(this.boardId);
|
||||
const oldBoardLabels = oldBoard.labels;
|
||||
// Get old label names
|
||||
const oldCardLabels = _.pluck(
|
||||
_.filter(oldBoardLabels, label => {
|
||||
return _.contains(this.labelIds, label._id);
|
||||
}),
|
||||
'name',
|
||||
);
|
||||
|
||||
const newBoard = Boards.findOne(boardId);
|
||||
const newBoardLabels = newBoard.labels;
|
||||
const newCardLabels = _.pluck(
|
||||
_.filter(newBoardLabels, label => {
|
||||
return _.contains(oldCardLabels, label.name);
|
||||
}),
|
||||
'_id',
|
||||
);
|
||||
|
||||
const oldId = this._id;
|
||||
const oldCard = Cards.findOne(oldId);
|
||||
|
||||
// Copy Custom Fields
|
||||
if (oldBoard._id !== boardId) {
|
||||
// we must only copy the labels and custom fields if the target board
|
||||
// differs from the source board
|
||||
if (this.boardId !== boardId) {
|
||||
const oldBoard = Boards.findOne(this.boardId);
|
||||
const oldBoardLabels = oldBoard.labels;
|
||||
|
||||
// Get old label names
|
||||
const oldCardLabels = _.pluck(
|
||||
_.filter(oldBoardLabels, label => {
|
||||
return _.contains(this.labelIds, label._id);
|
||||
}),
|
||||
'name',
|
||||
);
|
||||
|
||||
const newBoard = Boards.findOne(boardId);
|
||||
const newBoardLabels = newBoard.labels;
|
||||
const newCardLabels = _.pluck(
|
||||
_.filter(newBoardLabels, label => {
|
||||
return _.contains(oldCardLabels, label.name);
|
||||
}),
|
||||
'_id',
|
||||
);
|
||||
// now set the new label ids
|
||||
delete this.labelIds;
|
||||
this.labelIds = newCardLabels;
|
||||
|
||||
// Copy Custom Fields
|
||||
CustomFields.find({
|
||||
_id: {
|
||||
$in: oldCard.customFields.map(cf => {
|
||||
@@ -404,8 +410,6 @@ Cards.helpers({
|
||||
}
|
||||
|
||||
delete this._id;
|
||||
delete this.labelIds;
|
||||
this.labelIds = newCardLabels;
|
||||
this.boardId = boardId;
|
||||
this.swimlaneId = swimlaneId;
|
||||
this.listId = listId;
|
||||
@@ -1108,6 +1112,21 @@ Cards.helpers({
|
||||
return Users.find({ _id: { $in: this.vote.negative } });
|
||||
return [];
|
||||
},
|
||||
voteState() {
|
||||
const userId = Meteor.userId();
|
||||
let state;
|
||||
if (this.vote) {
|
||||
if (this.vote.positive) {
|
||||
state = _.contains(this.vote.positive, userId);
|
||||
if (state === true) return true;
|
||||
}
|
||||
if (this.vote.negative) {
|
||||
state = _.contains(this.vote.negative, userId);
|
||||
if (state === true) return false;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
},
|
||||
|
||||
getId() {
|
||||
if (this.isLinked()) {
|
||||
@@ -1276,9 +1295,9 @@ Cards.mutations({
|
||||
if (lastCardDom) sortIndex = Utils.calculateIndex(lastCardDom, null).base;
|
||||
|
||||
return this.moveOptionalArgs({
|
||||
boardId: boardId,
|
||||
swimlaneId: swimlaneId,
|
||||
listId: listId,
|
||||
boardId,
|
||||
swimlaneId,
|
||||
listId,
|
||||
sort: sortIndex,
|
||||
});
|
||||
},
|
||||
@@ -1293,14 +1312,45 @@ Cards.mutations({
|
||||
swimlaneId = board.getDefaultSwimline()._id;
|
||||
}
|
||||
listId = listId || this.listId;
|
||||
if (sort === undefined || sort === null)
|
||||
sort = this.sort;
|
||||
if (sort === undefined || sort === null) sort = this.sort;
|
||||
return this.move(boardId, swimlaneId, listId, sort);
|
||||
},
|
||||
|
||||
move(boardId, swimlaneId, listId, sort) {
|
||||
// Copy Custom Fields
|
||||
const mutatedFields = {
|
||||
boardId,
|
||||
swimlaneId,
|
||||
listId,
|
||||
sort,
|
||||
};
|
||||
|
||||
// we must only copy the labels and custom fields if the target board
|
||||
// differs from the source board
|
||||
if (this.boardId !== boardId) {
|
||||
// Get label names
|
||||
const oldBoard = Boards.findOne(this.boardId);
|
||||
const oldBoardLabels = oldBoard.labels;
|
||||
const oldCardLabels = _.pluck(
|
||||
_.filter(oldBoardLabels, label => {
|
||||
return _.contains(this.labelIds, label._id);
|
||||
}),
|
||||
'name',
|
||||
);
|
||||
|
||||
const newBoard = Boards.findOne(boardId);
|
||||
const newBoardLabels = newBoard.labels;
|
||||
const newCardLabelIds = _.pluck(
|
||||
_.filter(newBoardLabels, label => {
|
||||
return label.name && _.contains(oldCardLabels, label.name);
|
||||
}),
|
||||
'_id',
|
||||
);
|
||||
|
||||
Object.assign(mutatedFields, {
|
||||
labelIds: newCardLabelIds,
|
||||
});
|
||||
|
||||
// Copy custom fields
|
||||
CustomFields.find({
|
||||
_id: {
|
||||
$in: this.customFields.map(cf => {
|
||||
@@ -1312,33 +1362,6 @@ Cards.mutations({
|
||||
});
|
||||
}
|
||||
|
||||
// Get label names
|
||||
const oldBoard = Boards.findOne(this.boardId);
|
||||
const oldBoardLabels = oldBoard.labels;
|
||||
const oldCardLabels = _.pluck(
|
||||
_.filter(oldBoardLabels, label => {
|
||||
return _.contains(this.labelIds, label._id);
|
||||
}),
|
||||
'name',
|
||||
);
|
||||
|
||||
const newBoard = Boards.findOne(boardId);
|
||||
const newBoardLabels = newBoard.labels;
|
||||
const newCardLabelIds = _.pluck(
|
||||
_.filter(newBoardLabels, label => {
|
||||
return label.name && _.contains(oldCardLabels, label.name);
|
||||
}),
|
||||
'_id',
|
||||
);
|
||||
|
||||
const mutatedFields = {
|
||||
boardId,
|
||||
swimlaneId,
|
||||
listId,
|
||||
sort,
|
||||
labelIds: newCardLabelIds,
|
||||
};
|
||||
|
||||
Cards.update(this._id, {
|
||||
$set: mutatedFields,
|
||||
});
|
||||
@@ -2169,6 +2192,11 @@ if (Meteor.isServer) {
|
||||
title: doc.title,
|
||||
description: doc.description,
|
||||
listId: doc.listId,
|
||||
receivedAt: doc.receivedAt,
|
||||
startAt: doc.startAt,
|
||||
dueAt: doc.dueAt,
|
||||
endAt: doc.endAt,
|
||||
assignees: doc.assignees,
|
||||
};
|
||||
}),
|
||||
});
|
||||
@@ -2205,6 +2233,11 @@ if (Meteor.isServer) {
|
||||
_id: doc._id,
|
||||
title: doc.title,
|
||||
description: doc.description,
|
||||
receivedAt: doc.receivedAt,
|
||||
startAt: doc.startAt,
|
||||
dueAt: doc.dueAt,
|
||||
endAt: doc.endAt,
|
||||
assignees: doc.assignees,
|
||||
};
|
||||
}),
|
||||
});
|
||||
@@ -2356,6 +2389,10 @@ if (Meteor.isServer) {
|
||||
* @param {boolean} [isOverTime] the new isOverTime field of the card
|
||||
* @param {string} [customFields] the new customFields value of the card
|
||||
* @param {string} [color] the new color of the card
|
||||
* @param {Object} [vote] the vote object
|
||||
* @param {string} vote.question the vote question
|
||||
* @param {boolean} vote.public show who voted what
|
||||
* @param {boolean} vote.allowNonBoardMembers allow all logged in users to vote?
|
||||
* @return_type {_id: string}
|
||||
*/
|
||||
JsonRoutes.add(
|
||||
@@ -2455,6 +2492,24 @@ if (Meteor.isServer) {
|
||||
{ $set: { color: newColor } },
|
||||
);
|
||||
}
|
||||
if (req.body.hasOwnProperty('vote')) {
|
||||
const newVote = req.body.vote;
|
||||
newVote.positive = [];
|
||||
newVote.negative = [];
|
||||
if (!newVote.hasOwnProperty('public')) newVote.public = false;
|
||||
if (!newVote.hasOwnProperty('allowNonBoardMembers'))
|
||||
newVote.allowNonBoardMembers = false;
|
||||
|
||||
Cards.direct.update(
|
||||
{
|
||||
_id: paramCardId,
|
||||
listId: paramListId,
|
||||
boardId: paramBoardId,
|
||||
archived: false,
|
||||
},
|
||||
{ $set: { vote: newVote } },
|
||||
);
|
||||
}
|
||||
if (req.body.hasOwnProperty('labelIds')) {
|
||||
let newlabelIds = req.body.labelIds;
|
||||
if (_.isString(newlabelIds)) {
|
||||
@@ -2683,6 +2738,52 @@ if (Meteor.isServer) {
|
||||
});
|
||||
},
|
||||
);
|
||||
|
||||
/**
|
||||
* @operation get_cards_by_custom_field
|
||||
* @summary Get all Cards that matchs a value of a specific custom field
|
||||
*
|
||||
* @param {string} boardId the board ID
|
||||
* @param {string} customFieldId the list ID
|
||||
* @param {string} customFieldValue the value to look for
|
||||
* @return_type [{_id: string,
|
||||
* title: string,
|
||||
* description: string,
|
||||
* listId: string,
|
||||
* swinlaneId: string}]
|
||||
*/
|
||||
JsonRoutes.add(
|
||||
'GET',
|
||||
'/api/boards/:boardId/cardsByCustomField/:customFieldId/:customFieldValue',
|
||||
function(req, res) {
|
||||
const paramBoardId = req.params.boardId;
|
||||
const paramCustomFieldId = req.params.customFieldId;
|
||||
const paramCustomFieldValue = req.params.customFieldValue;
|
||||
|
||||
Authentication.checkBoardAccess(req.userId, paramBoardId);
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
data: Cards.find({
|
||||
boardId: paramBoardId,
|
||||
customFields: {
|
||||
$elemMatch: {
|
||||
_id: paramCustomFieldId,
|
||||
value: paramCustomFieldValue,
|
||||
},
|
||||
},
|
||||
archived: false,
|
||||
}).map(function(doc) {
|
||||
return {
|
||||
_id: doc._id,
|
||||
title: doc.title,
|
||||
description: doc.description,
|
||||
listId: doc.listId,
|
||||
swinlaneId: doc.swinlaneId,
|
||||
};
|
||||
}),
|
||||
});
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
export default Cards;
|
||||
@@ -302,10 +302,18 @@ if (Meteor.isServer) {
|
||||
|
||||
const paramItemId = req.params.itemId;
|
||||
|
||||
function isTrue(data) {
|
||||
try {
|
||||
return data.toLowerCase() === 'true';
|
||||
} catch (error) {
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
if (req.body.hasOwnProperty('isFinished')) {
|
||||
ChecklistItems.direct.update(
|
||||
{ _id: paramItemId },
|
||||
{ $set: { isFinished: req.body.isFinished } },
|
||||
{ $set: { isFinished: isTrue(req.body.isFinished) } },
|
||||
);
|
||||
}
|
||||
if (req.body.hasOwnProperty('title')) {
|
||||
|
||||
@@ -172,16 +172,14 @@ function customFieldDeletion(userId, doc) {
|
||||
function customFieldEdit(userId, doc) {
|
||||
const card = Cards.findOne(doc.cardId);
|
||||
const customFieldValue = Activities.findOne({ customFieldId: doc._id }).value;
|
||||
const boardId = card.boardId;
|
||||
//boardId: doc.boardIds[0], // We are creating a customField, it has only one boardId
|
||||
Activities.insert({
|
||||
userId,
|
||||
activityType: 'setCustomField',
|
||||
boardId,
|
||||
boardId: doc.boardIds[0], // We are creating a customField, it has only one boardId
|
||||
customFieldId: doc._id,
|
||||
customFieldValue,
|
||||
listId: card.listId,
|
||||
swimlaneId: card.swimlaneId,
|
||||
listId: doc.listId,
|
||||
swimlaneId: doc.swimlaneId,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -206,8 +204,8 @@ if (Meteor.isServer) {
|
||||
Activities.remove({
|
||||
customFieldId: doc._id,
|
||||
boardId: modifier.$pull.boardIds,
|
||||
listId: card.listId,
|
||||
swimlaneId: card.swimlaneId,
|
||||
listId: doc.listId,
|
||||
swimlaneId: doc.swimlaneId,
|
||||
});
|
||||
} else if (_.contains(fieldNames, 'boardIds') && modifier.$push) {
|
||||
Activities.insert({
|
||||
|
||||
+3
-1
@@ -85,7 +85,9 @@ if (Meteor.isServer) {
|
||||
? exporter.buildCsv(params.query.delimiter)
|
||||
: exporter.buildCsv();
|
||||
res.writeHead(200, {
|
||||
'Content-Length': body.length,
|
||||
// Checking length does not work https://github.com/wekan/wekan/issues/3173
|
||||
// so not using it here
|
||||
//'Content-Length': body.length,
|
||||
'Content-Type': params.query.delimiter ? 'text/csv' : 'text/tsv',
|
||||
});
|
||||
res.write(body);
|
||||
|
||||
+30
-24
@@ -1,7 +1,8 @@
|
||||
const stringify = require('csv-stringify');
|
||||
// const stringify = require('csv-stringify');
|
||||
|
||||
// exporter maybe is broken since Gridfs introduced, add fs and path
|
||||
export class Exporter {
|
||||
/*
|
||||
constructor(boardId) {
|
||||
this._boardId = boardId;
|
||||
}
|
||||
@@ -240,29 +241,29 @@ export class Exporter {
|
||||
}
|
||||
i++;
|
||||
});
|
||||
/* TODO: Try to get translations working.
|
||||
These currently only bring English translations.
|
||||
TAPi18n.__('title'),
|
||||
TAPi18n.__('description'),
|
||||
TAPi18n.__('status'),
|
||||
TAPi18n.__('swimlane'),
|
||||
TAPi18n.__('owner'),
|
||||
TAPi18n.__('requested-by'),
|
||||
TAPi18n.__('assigned-by'),
|
||||
TAPi18n.__('members'),
|
||||
TAPi18n.__('assignee'),
|
||||
TAPi18n.__('labels'),
|
||||
TAPi18n.__('card-start'),
|
||||
TAPi18n.__('card-due'),
|
||||
TAPi18n.__('card-end'),
|
||||
TAPi18n.__('overtime-hours'),
|
||||
TAPi18n.__('spent-time-hours'),
|
||||
TAPi18n.__('createdAt'),
|
||||
TAPi18n.__('last-modified-at'),
|
||||
TAPi18n.__('last-activity'),
|
||||
TAPi18n.__('voting'),
|
||||
TAPi18n.__('archived'),
|
||||
*/
|
||||
|
||||
// TODO: Try to get translations working.
|
||||
// These currently only bring English translations.
|
||||
// TAPi18n.__('title'),
|
||||
// TAPi18n.__('description'),
|
||||
// TAPi18n.__('status'),
|
||||
// TAPi18n.__('swimlane'),
|
||||
// TAPi18n.__('owner'),
|
||||
// TAPi18n.__('requested-by'),
|
||||
// TAPi18n.__('assigned-by'),
|
||||
// TAPi18n.__('members'),
|
||||
// TAPi18n.__('assignee'),
|
||||
// TAPi18n.__('labels'),
|
||||
// TAPi18n.__('card-start'),
|
||||
// TAPi18n.__('card-due'),
|
||||
// TAPi18n.__('card-end'),
|
||||
// TAPi18n.__('overtime-hours'),
|
||||
// TAPi18n.__('spent-time-hours'),
|
||||
// TAPi18n.__('createdAt'),
|
||||
// TAPi18n.__('last-modified-at'),
|
||||
// TAPi18n.__('last-activity'),
|
||||
// TAPi18n.__('voting'),
|
||||
// TAPi18n.__('archived'),
|
||||
|
||||
const stringifier = stringify({
|
||||
header: true,
|
||||
@@ -395,4 +396,9 @@ export class Exporter {
|
||||
const board = Boards.findOne(this._boardId);
|
||||
return board && board.isVisibleBy(user);
|
||||
}
|
||||
*/
|
||||
|
||||
canExport(user) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -259,7 +259,7 @@ if (Meteor.isServer) {
|
||||
throw new Meteor.Error('invalid-user');
|
||||
}
|
||||
const user = Meteor.user();
|
||||
if (!user.emails || !user.emails[0] || user.emails[0].address) {
|
||||
if (!user.emails || !user.emails[0] || !user.emails[0].address) {
|
||||
throw new Meteor.Error('email-invalid');
|
||||
}
|
||||
this.unblock();
|
||||
|
||||
+45
-5
@@ -95,7 +95,7 @@ Users.attachSchema(
|
||||
autoValue() {
|
||||
if (this.isInsert && !this.isSet) {
|
||||
return {
|
||||
boardView: 'board-view-lists',
|
||||
boardView: 'board-view-swimlanes',
|
||||
};
|
||||
}
|
||||
},
|
||||
@@ -128,6 +128,13 @@ Users.attachSchema(
|
||||
type: Boolean,
|
||||
optional: true,
|
||||
},
|
||||
'profile.hideCheckedItems': {
|
||||
/**
|
||||
* does the user want to hide checked checklist items?
|
||||
*/
|
||||
type: Boolean,
|
||||
optional: true,
|
||||
},
|
||||
'profile.hiddenSystemMessages': {
|
||||
/**
|
||||
* does the user want to hide system messages?
|
||||
@@ -218,8 +225,8 @@ Users.attachSchema(
|
||||
type: String,
|
||||
optional: true,
|
||||
allowedValues: [
|
||||
'board-view-lists',
|
||||
'board-view-swimlanes',
|
||||
'board-view-lists',
|
||||
'board-view-cal',
|
||||
],
|
||||
},
|
||||
@@ -483,6 +490,11 @@ Users.helpers({
|
||||
return profile.showDesktopDragHandles || false;
|
||||
},
|
||||
|
||||
hasHideCheckedItems() {
|
||||
const profile = this.profile || {};
|
||||
return profile.hideCheckedItems || false;
|
||||
},
|
||||
|
||||
hasHiddenSystemMessages() {
|
||||
const profile = this.profile || {};
|
||||
return profile.hiddenSystemMessages || false;
|
||||
@@ -612,6 +624,15 @@ Users.mutations({
|
||||
};
|
||||
},
|
||||
|
||||
toggleHideCheckedItems() {
|
||||
const value = this.hasHideCheckedItems();
|
||||
return {
|
||||
$set: {
|
||||
'profile.hideCheckedItems': !value,
|
||||
},
|
||||
};
|
||||
},
|
||||
|
||||
toggleSystem(value = false) {
|
||||
return {
|
||||
$set: {
|
||||
@@ -690,6 +711,10 @@ Meteor.methods({
|
||||
const user = Meteor.user();
|
||||
user.toggleDesktopHandles(user.hasShowDesktopDragHandles());
|
||||
},
|
||||
toggleHideCheckedItems() {
|
||||
const user = Meteor.user();
|
||||
user.toggleHideCheckedItems();
|
||||
},
|
||||
toggleSystemMessages() {
|
||||
const user = Meteor.user();
|
||||
user.toggleSystem(user.hasHiddenSystemMessages());
|
||||
@@ -903,7 +928,7 @@ if (Meteor.isServer) {
|
||||
user.profile = {
|
||||
initials,
|
||||
fullname: user.services.oidc.fullname,
|
||||
boardView: 'board-view-lists',
|
||||
boardView: 'board-view-swimlanes',
|
||||
};
|
||||
user.authenticationMethod = 'oauth2';
|
||||
|
||||
@@ -921,7 +946,8 @@ if (Meteor.isServer) {
|
||||
existingUser.profile = user.profile;
|
||||
existingUser.authenticationMethod = user.authenticationMethod;
|
||||
|
||||
Meteor.users.remove({ _id: existingUser._id }); // remove existing record
|
||||
Meteor.users.remove({ _id: user._id });
|
||||
Meteor.users.remove({ _id: existingUser._id }); // is going to be created again
|
||||
return existingUser;
|
||||
}
|
||||
|
||||
@@ -961,7 +987,7 @@ if (Meteor.isServer) {
|
||||
);
|
||||
} else {
|
||||
user.profile = { icode: options.profile.invitationcode };
|
||||
user.profile.boardView = 'board-view-lists';
|
||||
user.profile.boardView = 'board-view-swimlanes';
|
||||
|
||||
// Deletes the invitation code after the user was created successfully.
|
||||
setTimeout(
|
||||
@@ -1075,6 +1101,7 @@ if (Meteor.isServer) {
|
||||
incrementBoards(_.difference(newIds, oldIds), +1);
|
||||
});
|
||||
|
||||
// Override getUserId so that we can TODO get the current userId
|
||||
const fakeUserId = new Meteor.EnvironmentVariable();
|
||||
const getUserId = CollectionHooks.getUserId;
|
||||
CollectionHooks.getUserId = () => {
|
||||
@@ -1108,6 +1135,10 @@ if (Meteor.isServer) {
|
||||
});
|
||||
*/
|
||||
|
||||
const Future = require('fibers/future');
|
||||
let future1 = new Future();
|
||||
let future2 = new Future();
|
||||
let future3 = new Future();
|
||||
Boards.insert(
|
||||
{
|
||||
title: TAPi18n.__('templates'),
|
||||
@@ -1135,6 +1166,7 @@ if (Meteor.isServer) {
|
||||
Users.update(fakeUserId.get(), {
|
||||
$set: { 'profile.cardTemplatesSwimlaneId': swimlaneId },
|
||||
});
|
||||
future1.return();
|
||||
},
|
||||
);
|
||||
|
||||
@@ -1152,6 +1184,7 @@ if (Meteor.isServer) {
|
||||
Users.update(fakeUserId.get(), {
|
||||
$set: { 'profile.listTemplatesSwimlaneId': swimlaneId },
|
||||
});
|
||||
future2.return();
|
||||
},
|
||||
);
|
||||
|
||||
@@ -1169,15 +1202,22 @@ if (Meteor.isServer) {
|
||||
Users.update(fakeUserId.get(), {
|
||||
$set: { 'profile.boardTemplatesSwimlaneId': swimlaneId },
|
||||
});
|
||||
future3.return();
|
||||
},
|
||||
);
|
||||
},
|
||||
);
|
||||
// HACK
|
||||
future1.wait();
|
||||
future2.wait();
|
||||
future3.wait();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
Users.after.insert((userId, doc) => {
|
||||
// HACK
|
||||
doc = Users.findOne({ _id: doc._id });
|
||||
if (doc.createdThroughApi) {
|
||||
// The admin user should be able to create a user despite disabling registration because
|
||||
// it is two different things (registration and creation).
|
||||
|
||||
@@ -249,7 +249,10 @@ class EntryPoint(object):
|
||||
|
||||
if name.startswith('{'):
|
||||
param_type = name.strip('{}')
|
||||
if param_type not in ['string', 'number', 'boolean', 'integer', 'array', 'file']:
|
||||
if param_type == 'Object':
|
||||
# hope for the best
|
||||
param_type = 'object'
|
||||
elif param_type not in ['string', 'number', 'boolean', 'integer', 'array', 'file']:
|
||||
self.warn('unknown type {}\n allowed values: string, number, boolean, integer, array, file'.format(param_type))
|
||||
try:
|
||||
name, desc = desc.split(maxsplit=1)
|
||||
@@ -814,13 +817,21 @@ def parse_schemas(schemas_dir):
|
||||
for d in data]
|
||||
entry_points.extend(schema_entry_points)
|
||||
|
||||
end_of_previous_operation = -1
|
||||
|
||||
# try to match JSDoc to the operations
|
||||
for entry_point in schema_entry_points:
|
||||
operation = entry_point.method # POST/GET/PUT/DELETE
|
||||
|
||||
# find all jsdocs that end before the current operation,
|
||||
# the last item in the list is the one we need
|
||||
jsdoc = [j for j in jsdocs
|
||||
if j.loc.end.line + 1 == operation.loc.start.line]
|
||||
if j.loc.end.line + 1 <= operation.loc.start.line and
|
||||
j.loc.start.line > end_of_previous_operation]
|
||||
if bool(jsdoc):
|
||||
entry_point.doc = jsdoc[0]
|
||||
entry_point.doc = jsdoc[-1]
|
||||
|
||||
end_of_previous_operation = operation.loc.end.line
|
||||
except TypeError:
|
||||
logger.warning(context.txt_for(statement))
|
||||
logger.error('{}:{}-{} can not parse {}'.format(path,
|
||||
|
||||
+2
-16
@@ -64,8 +64,6 @@ objects:
|
||||
name: "${WEKAN_SERVICE_NAME}"
|
||||
sessionAffinity: None
|
||||
type: ClusterIP
|
||||
status:
|
||||
loadBalancer: {}
|
||||
- apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
@@ -86,8 +84,6 @@ objects:
|
||||
name: "${DATABASE_SERVICE_NAME}"
|
||||
sessionAffinity: None
|
||||
type: ClusterIP
|
||||
status:
|
||||
loadBalancer: {}
|
||||
- apiVersion: v1
|
||||
kind: PersistentVolumeClaim
|
||||
metadata:
|
||||
@@ -276,7 +272,6 @@ objects:
|
||||
lastTriggeredImage: ''
|
||||
type: ImageChange
|
||||
- type: ConfigChange
|
||||
status: {}
|
||||
- apiVersion: route.openshift.io/v1
|
||||
kind: Route
|
||||
metadata:
|
||||
@@ -297,15 +292,6 @@ objects:
|
||||
name: wekan
|
||||
weight: 100
|
||||
wildcardPolicy: None
|
||||
status:
|
||||
ingress:
|
||||
- conditions:
|
||||
- lastTransitionTime: '2018-08-28T14:45:21Z'
|
||||
status: 'True'
|
||||
type: Admitted
|
||||
host: ${FQDN}
|
||||
routerName: router
|
||||
wildcardPolicy: None
|
||||
parameters:
|
||||
- description: The Fully Qualified Hostname (FQDN) of the application
|
||||
displayName: FQDN
|
||||
@@ -323,7 +309,7 @@ parameters:
|
||||
displayName: Database Service Name
|
||||
name: DATABASE_SERVICE_NAME
|
||||
required: true
|
||||
value: mongodb
|
||||
value: wekan-mongodb
|
||||
- description: Username for MongoDB user that will be used for accessing the database.
|
||||
displayName: MongoDB Connection Username
|
||||
from: user[A-Z0-9]{3}
|
||||
@@ -356,7 +342,7 @@ parameters:
|
||||
displayName: Version of MongoDB Image
|
||||
name: MONGODB_VERSION
|
||||
required: true
|
||||
value: '4.0.10'
|
||||
value: '3.6'
|
||||
- name: WEKAN_SERVICE_NAME
|
||||
displayName: Wekan Service Name
|
||||
value: wekan
|
||||
|
||||
Generated
+794
-398
File diff suppressed because it is too large.
Load diff
+19
-19
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "wekan",
|
||||
"version": "v4.09.0",
|
||||
"version": "v4.20.0",
|
||||
"description": "Open-Source kanban",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
@@ -45,36 +45,36 @@
|
||||
"eslint-config-meteor": "0.0.9",
|
||||
"eslint-config-prettier": "^3.6.0",
|
||||
"eslint-import-resolver-meteor": "^0.4.0",
|
||||
"eslint-plugin-import": "^2.20.0",
|
||||
"eslint-plugin-import": "^2.22.0",
|
||||
"eslint-plugin-meteor": "^5.1.0",
|
||||
"eslint-plugin-prettier": "^3.1.2",
|
||||
"eslint-plugin-prettier": "^3.1.4",
|
||||
"lint-staged": "^7.3.0",
|
||||
"pre-commit": "^1.2.2",
|
||||
"prettier": "^1.19.1",
|
||||
"prettier-eslint": "^9.0.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/core": "^7.9.6",
|
||||
"@babel/runtime": "^7.9.6",
|
||||
"@babel/core": "^7.10.5",
|
||||
"@babel/runtime": "^7.10.5",
|
||||
"@root/request": "^1.6.1",
|
||||
"ajv": "^5.0.0",
|
||||
"ajv": "^6.12.3",
|
||||
"babel-runtime": "^6.26.0",
|
||||
"bcrypt": "^3.0.7",
|
||||
"bson": "^4.0.3",
|
||||
"bunyan": "^1.8.12",
|
||||
"csv-stringify": "^5.5.0",
|
||||
"es6-promise": "^4.2.4",
|
||||
"flatted": "^2.0.1",
|
||||
"gridfs-stream": "^0.5.3",
|
||||
"jszip": "^3.4.0",
|
||||
"ldapjs": "^1.0.2",
|
||||
"meteor-node-stubs": "^0.4.1",
|
||||
"mongodb": "^3.5.7",
|
||||
"bcrypt": "^5.0.0",
|
||||
"bson": "^4.0.4",
|
||||
"bunyan": "^2.0.4",
|
||||
"es6-promise": "^4.2.8",
|
||||
"fibers": "^5.0.0",
|
||||
"flatted": "^3.0.4",
|
||||
"gridfs-stream": "^1.1.1",
|
||||
"jszip": "^3.5.0",
|
||||
"ldapjs": "^2.0.0",
|
||||
"meteor-node-stubs": "^1.0.0",
|
||||
"mongodb": "^3.5.9",
|
||||
"os": "^0.1.1",
|
||||
"page": "^1.11.5",
|
||||
"page": "^1.11.6",
|
||||
"papaparse": "^5.2.0",
|
||||
"qs": "^6.9.4",
|
||||
"source-map-support": "^0.5.19",
|
||||
"xss": "^1.0.6"
|
||||
"xss": "^1.0.7"
|
||||
}
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
var mark = marked;
|
||||
|
||||
mark.setOptions({
|
||||
gfm: true,
|
||||
tables: true,
|
||||
breaks: true
|
||||
});
|
||||
|
||||
Markdown = mark;
|
||||
@@ -43,7 +43,7 @@ console.log(marked(markdownString));
|
||||
|Member |Type |Default |Since |Notes |
|
||||
|:-----------|:---------|:--------|:--------|:-------------|
|
||||
|baseUrl |`string` |`null` |0.3.9 |A prefix url for any relative link. |
|
||||
|breaks |`boolean` |`false` |v0.2.7 |If true, add `<br>` on a single line break (copies GitHub). Requires `gfm` be `true`.|
|
||||
|breaks |`boolean` |`false` |v0.2.7 |If true, add `<br>` on a single line break (copies GitHub behavior on comments, but not on rendered markdown files). Requires `gfm` be `true`.|
|
||||
|gfm |`boolean` |`true` |v0.2.1 |If true, use approved [GitHub Flavored Markdown (GFM) specification](https://github.github.com/gfm/).|
|
||||
|headerIds |`boolean` |`true` |v0.4.0 |If true, include an `id` attribute when emitting headings (h1, h2, h3, etc).|
|
||||
|headerPrefix|`string` |`''` |v0.3.0 |A string to prefix the `id` attribute when emitting headings (h1, h2, h3, etc).|
|
||||
@@ -57,6 +57,8 @@ console.log(marked(markdownString));
|
||||
|silent |`boolean` |`false` |v0.2.7 |If true, the parser does not throw any exception.|
|
||||
|smartLists |`boolean` |`false` |v0.2.8 |If true, use smarter list behavior than those found in `markdown.pl`.|
|
||||
|smartypants |`boolean` |`false` |v0.2.9 |If true, use "smart" typographic punctuation for things like quotes and dashes.|
|
||||
|tokenizer |`object` |`new Tokenizer()`|v1.0.0|An object containing functions to create tokens from markdown. See [extensibility](/#/USING_PRO.md) for more details.|
|
||||
|walkTokens |`function` |`null`|v1.1.0|A function which is called for every token. See [extensibility](/#/USING_PRO.md) for more details.|
|
||||
|xhtml |`boolean` |`false` |v0.3.2 |If true, emit self-closing HTML tags for void elements (<br/>, <img/>, etc.) with a "/" as required by XHTML.|
|
||||
|
||||
<h2 id="highlight">Asynchronous highlighting</h2>
|
||||
|
||||
@@ -2,9 +2,21 @@
|
||||
|
||||
To champion the single-responsibility and open/closed principles, we have tried to make it relatively painless to extend marked. If you are looking to add custom functionality, this is the place to start.
|
||||
|
||||
<h2 id="use">marked.use()</h2>
|
||||
|
||||
`marked.use(options)` is the recommended way to extend marked. The options object can contain any [option](#/USING_ADVANCED.md#options) available in marked.
|
||||
|
||||
The `renderer` and `tokenizer` options can be an object with functions that will be merged into the `renderer` and `tokenizer` respectively.
|
||||
|
||||
The `renderer` and `tokenizer` functions can return false to fallback to the previous function.
|
||||
|
||||
The `walkTokens` option can be a function that will be called with every token before rendering. When calling `use` multiple times with different `walkTokens` functions each function will be called in the **reverse** order in which they were assigned.
|
||||
|
||||
All other options will overwrite previously set options.
|
||||
|
||||
<h2 id="renderer">The renderer</h2>
|
||||
|
||||
The renderer is...
|
||||
The renderer defines the output of the parser.
|
||||
|
||||
**Example:** Overriding default heading token by adding an embedded anchor tag like on GitHub.
|
||||
|
||||
@@ -12,24 +24,25 @@ The renderer is...
|
||||
// Create reference instance
|
||||
const marked = require('marked');
|
||||
|
||||
// Get reference
|
||||
const renderer = new marked.Renderer();
|
||||
|
||||
// Override function
|
||||
renderer.heading = function (text, level) {
|
||||
const escapedText = text.toLowerCase().replace(/[^\w]+/g, '-');
|
||||
const renderer = {
|
||||
heading(text, level) {
|
||||
const escapedText = text.toLowerCase().replace(/[^\w]+/g, '-');
|
||||
|
||||
return `
|
||||
<h${level}>
|
||||
<a name="${escapedText}" class="anchor" href="#${escapedText}">
|
||||
<span class="header-link"></span>
|
||||
</a>
|
||||
${text}
|
||||
</h${level}>`;
|
||||
return `
|
||||
<h${level}>
|
||||
<a name="${escapedText}" class="anchor" href="#${escapedText}">
|
||||
<span class="header-link"></span>
|
||||
</a>
|
||||
${text}
|
||||
</h${level}>`;
|
||||
}
|
||||
};
|
||||
|
||||
marked.use({ renderer });
|
||||
|
||||
// Run marked
|
||||
console.log(marked('# heading+', { renderer: renderer }));
|
||||
console.log(marked('# heading+'));
|
||||
```
|
||||
|
||||
**Output:**
|
||||
@@ -58,7 +71,7 @@ console.log(marked('# heading+', { renderer: renderer }));
|
||||
- tablerow(*string* content)
|
||||
- tablecell(*string* content, *object* flags)
|
||||
|
||||
`slugger` has the `slug` method to create an unique id from value:
|
||||
`slugger` has the `slug` method to create a unique id from value:
|
||||
|
||||
```js
|
||||
slugger.slug('foo') // foo
|
||||
@@ -89,14 +102,130 @@ slugger.slug('foo-1') // foo-1-2
|
||||
- image(*string* href, *string* title, *string* text)
|
||||
- text(*string* text)
|
||||
|
||||
<h2 id="tokenizer">The tokenizer</h2>
|
||||
|
||||
The tokenizer defines how to turn markdown text into tokens.
|
||||
|
||||
**Example:** Overriding default `codespan` tokenizer to include LaTeX.
|
||||
|
||||
```js
|
||||
// Create reference instance
|
||||
const marked = require('marked');
|
||||
|
||||
// Override function
|
||||
const tokenizer = {
|
||||
codespan(src) {
|
||||
const match = src.match(/\$+([^\$\n]+?)\$+/);
|
||||
if (match) {
|
||||
return {
|
||||
type: 'codespan',
|
||||
raw: match[0],
|
||||
text: match[1].trim()
|
||||
};
|
||||
}
|
||||
|
||||
// return false to use original codespan tokenizer
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
marked.use({ tokenizer });
|
||||
|
||||
// Run marked
|
||||
console.log(marked('$ latex code $\n\n` other code `'));
|
||||
```
|
||||
|
||||
**Output:**
|
||||
|
||||
```html
|
||||
<p><code>latex code</code></p>
|
||||
<p><code>other code</code></p>
|
||||
```
|
||||
|
||||
### Block level tokenizer methods
|
||||
|
||||
- space(*string* src)
|
||||
- code(*string* src, *array* tokens)
|
||||
- fences(*string* src)
|
||||
- heading(*string* src)
|
||||
- nptable(*string* src)
|
||||
- hr(*string* src)
|
||||
- blockquote(*string* src)
|
||||
- list(*string* src)
|
||||
- html(*string* src)
|
||||
- def(*string* src)
|
||||
- table(*string* src)
|
||||
- lheading(*string* src)
|
||||
- paragraph(*string* src)
|
||||
- text(*string* src, *array* tokens)
|
||||
|
||||
### Inline level tokenizer methods
|
||||
|
||||
- escape(*string* src)
|
||||
- tag(*string* src, *bool* inLink, *bool* inRawBlock)
|
||||
- link(*string* src)
|
||||
- reflink(*string* src, *object* links)
|
||||
- strong(*string* src)
|
||||
- em(*string* src)
|
||||
- codespan(*string* src)
|
||||
- br(*string* src)
|
||||
- del(*string* src)
|
||||
- autolink(*string* src, *function* mangle)
|
||||
- url(*string* src, *function* mangle)
|
||||
- inlineText(*string* src, *bool* inRawBlock, *function* smartypants)
|
||||
|
||||
`mangle` is a method that changes text to HTML character references:
|
||||
|
||||
```js
|
||||
mangle('test@example.com')
|
||||
// "test@example.com"
|
||||
```
|
||||
|
||||
`smartypants` is a method that translates plain ASCII punctuation characters into “smart” typographic punctuation HTML entities:
|
||||
|
||||
https://daringfireball.net/projects/smartypants/
|
||||
|
||||
```js
|
||||
smartypants('"this ... string"')
|
||||
// "“this … string”"
|
||||
```
|
||||
|
||||
<h2 id="walk-tokens">Walk Tokens</h2>
|
||||
|
||||
The walkTokens function gets called with every token. Child tokens are called before moving on to sibling tokens. Each token is passed by reference so updates are persisted when passed to the parser. The return value of the function is ignored.
|
||||
|
||||
**Example:** Overriding heading tokens to start at h2.
|
||||
|
||||
```js
|
||||
const marked = require('marked');
|
||||
|
||||
// Override function
|
||||
const walkTokens = (token) => {
|
||||
if (token.type === 'heading') {
|
||||
token.depth += 1;
|
||||
}
|
||||
};
|
||||
|
||||
marked.use({ walkTokens });
|
||||
|
||||
// Run marked
|
||||
console.log(marked('# heading 2\n\n## heading 3'));
|
||||
```
|
||||
|
||||
**Output:**
|
||||
|
||||
```html
|
||||
<h2 id="heading-2">heading 2</h2>
|
||||
<h3 id="heading-3">heading 3</h3>
|
||||
```
|
||||
|
||||
<h2 id="lexer">The lexer</h2>
|
||||
|
||||
The lexer is...
|
||||
|
||||
The lexer takes a markdown string and calls the tokenizer functions.
|
||||
|
||||
<h2 id="parser">The parser</h2>
|
||||
|
||||
The parser is...
|
||||
The parser takes tokens as input and calls the renderer functions.
|
||||
|
||||
***
|
||||
|
||||
@@ -105,30 +234,48 @@ The parser is...
|
||||
You also have direct access to the lexer and parser if you so desire.
|
||||
|
||||
``` js
|
||||
const tokens = marked.lexer(text, options);
|
||||
const tokens = marked.lexer(markdown, options);
|
||||
console.log(marked.parser(tokens, options));
|
||||
```
|
||||
|
||||
``` js
|
||||
const lexer = new marked.Lexer(options);
|
||||
const tokens = lexer.lex(text);
|
||||
const tokens = lexer.lex(markdown);
|
||||
console.log(tokens);
|
||||
console.log(lexer.rules);
|
||||
console.log(lexer.tokenizer.rules.block); // block level rules used
|
||||
console.log(lexer.tokenizer.rules.inline); // inline level rules used
|
||||
console.log(marked.Lexer.rules.block); // all block level rules
|
||||
console.log(marked.Lexer.rules.inline); // all inline level rules
|
||||
```
|
||||
|
||||
``` bash
|
||||
$ node
|
||||
> require('marked').lexer('> i am using marked.')
|
||||
[ { type: 'blockquote_start' },
|
||||
{ type: 'paragraph',
|
||||
text: 'i am using marked.' },
|
||||
{ type: 'blockquote_end' },
|
||||
links: {} ]
|
||||
> require('marked').lexer('> I am using marked.')
|
||||
[
|
||||
{
|
||||
type: "blockquote",
|
||||
raw: "> I am using marked.",
|
||||
tokens: [
|
||||
{
|
||||
type: "paragraph",
|
||||
raw: "I am using marked.",
|
||||
text: "I am using marked.",
|
||||
tokens: [
|
||||
{
|
||||
type: "text",
|
||||
raw: "I am using marked.",
|
||||
text: "I am using marked."
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
links: {}
|
||||
]
|
||||
```
|
||||
|
||||
The Lexers build an array of tokens, which will be passed to their respective
|
||||
Parsers. The Parsers process each token in the token arrays,
|
||||
which are removed from the array of tokens:
|
||||
The Lexer builds an array of tokens, which will be passed to the Parser.
|
||||
The Parser processes each token in the token array:
|
||||
|
||||
``` js
|
||||
const marked = require('marked');
|
||||
@@ -146,18 +293,60 @@ console.log(tokens);
|
||||
|
||||
const html = marked.parser(tokens);
|
||||
console.log(html);
|
||||
|
||||
console.log(tokens);
|
||||
```
|
||||
|
||||
``` bash
|
||||
[ { type: 'heading', depth: 1, text: 'heading' },
|
||||
{ type: 'paragraph', text: ' [link][1]' },
|
||||
{ type: 'space' },
|
||||
links: { '1': { href: '#heading', title: 'heading' } } ]
|
||||
|
||||
[
|
||||
{
|
||||
type: "heading",
|
||||
raw: " # heading\n\n",
|
||||
depth: 1,
|
||||
text: "heading",
|
||||
tokens: [
|
||||
{
|
||||
type: "text",
|
||||
raw: "heading",
|
||||
text: "heading"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
type: "paragraph",
|
||||
raw: " [link][1]",
|
||||
text: " [link][1]",
|
||||
tokens: [
|
||||
{
|
||||
type: "text",
|
||||
raw: " ",
|
||||
text: " "
|
||||
},
|
||||
{
|
||||
type: "link",
|
||||
raw: "[link][1]",
|
||||
text: "link",
|
||||
href: "#heading",
|
||||
title: "heading",
|
||||
tokens: [
|
||||
{
|
||||
type: "text",
|
||||
raw: "link",
|
||||
text: "link"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
type: "space",
|
||||
raw: "\n\n"
|
||||
},
|
||||
links: {
|
||||
"1": {
|
||||
href: "#heading",
|
||||
title: "heading"
|
||||
}
|
||||
}
|
||||
]
|
||||
<h1 id="heading">heading</h1>
|
||||
<p> <a href="#heading" title="heading">link</a></p>
|
||||
|
||||
[ links: { '1': { href: '#heading', title: 'heading' } } ]
|
||||
```
|
||||
@@ -183,7 +183,7 @@ function handleIframeLoad() {
|
||||
|
||||
function handleInput() {
|
||||
inputDirty = true;
|
||||
};
|
||||
}
|
||||
|
||||
function handleVersionChange() {
|
||||
if ($markedVerElem.value === 'commit' || $markedVerElem.value === 'pr') {
|
||||
@@ -256,7 +256,7 @@ function handleChange(panes, visiblePane) {
|
||||
}
|
||||
}
|
||||
return active;
|
||||
};
|
||||
}
|
||||
|
||||
function addCommitVersion(value, text, commit) {
|
||||
if (markedVersions[value]) {
|
||||
@@ -331,13 +331,13 @@ function jsonString(input) {
|
||||
.replace(/[\\"']/g, '\\$&')
|
||||
.replace(/\u0000/g, '\\0');
|
||||
return '"' + output + '"';
|
||||
};
|
||||
}
|
||||
|
||||
function getScrollSize() {
|
||||
var e = $activeOutputElem;
|
||||
|
||||
return e.scrollHeight - e.clientHeight;
|
||||
};
|
||||
}
|
||||
|
||||
function getScrollPercent() {
|
||||
var size = getScrollSize();
|
||||
@@ -347,11 +347,11 @@ function getScrollPercent() {
|
||||
}
|
||||
|
||||
return $activeOutputElem.scrollTop / size;
|
||||
};
|
||||
}
|
||||
|
||||
function setScrollPercent(percent) {
|
||||
$activeOutputElem.scrollTop = percent * getScrollSize();
|
||||
};
|
||||
}
|
||||
|
||||
function updateLink() {
|
||||
var outputType = '';
|
||||
@@ -446,7 +446,7 @@ function checkForChanges() {
|
||||
}
|
||||
}
|
||||
checkChangeTimeout = window.setTimeout(checkForChanges, delayTime);
|
||||
};
|
||||
}
|
||||
|
||||
function setResponseTime(ms) {
|
||||
var amount = ms;
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
/* globals marked, unfetch, ES6Promise, Promise */ // eslint-disable-line no-redeclare
|
||||
|
||||
if (!self.Promise) {
|
||||
self.importScripts('https://cdn.jsdelivr.net/npm/es6-promise/dist/es6-promise.js');
|
||||
self.Promise = ES6Promise;
|
||||
@@ -48,38 +49,55 @@ function parse(e) {
|
||||
case 'parse':
|
||||
var startTime = new Date();
|
||||
var lexed = marked.lexer(e.data.markdown, e.data.options);
|
||||
var lexedList = [];
|
||||
for (var i = 0; i < lexed.length; i++) {
|
||||
var lexedLine = [];
|
||||
for (var j in lexed[i]) {
|
||||
lexedLine.push(j + ':' + jsonString(lexed[i][j]));
|
||||
}
|
||||
lexedList.push('{' + lexedLine.join(', ') + '}');
|
||||
}
|
||||
var lexedList = jsonString(lexed);
|
||||
var parsed = marked.parser(lexed, e.data.options);
|
||||
var endTime = new Date();
|
||||
// setTimeout(function () {
|
||||
postMessage({
|
||||
task: e.data.task,
|
||||
lexed: lexedList.join('\n'),
|
||||
lexed: lexedList,
|
||||
parsed: parsed,
|
||||
time: endTime - startTime
|
||||
});
|
||||
// }, 10000);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
function jsonString(input) {
|
||||
var output = (input + '')
|
||||
.replace(/\n/g, '\\n')
|
||||
.replace(/\r/g, '\\r')
|
||||
.replace(/\t/g, '\\t')
|
||||
.replace(/\f/g, '\\f')
|
||||
.replace(/[\\"']/g, '\\$&')
|
||||
.replace(/\u0000/g, '\\0');
|
||||
return '"' + output + '"';
|
||||
};
|
||||
function stringRepeat(char, times) {
|
||||
var s = '';
|
||||
for (var i = 0; i < times; i++) {
|
||||
s += char;
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
function jsonString(input, level) {
|
||||
level = level || 0;
|
||||
if (Array.isArray(input)) {
|
||||
if (input.length === 0) {
|
||||
return '[]';
|
||||
}
|
||||
var items = [],
|
||||
i;
|
||||
if (!Array.isArray(input[0]) && typeof input[0] === 'object' && input[0] !== null) {
|
||||
for (i = 0; i < input.length; i++) {
|
||||
items.push(stringRepeat(' ', 2 * level) + jsonString(input[i], level + 1));
|
||||
}
|
||||
return '[\n' + items.join('\n') + '\n]';
|
||||
}
|
||||
for (i = 0; i < input.length; i++) {
|
||||
items.push(jsonString(input[i], level));
|
||||
}
|
||||
return '[' + items.join(', ') + ']';
|
||||
} else if (typeof input === 'object' && input !== null) {
|
||||
var props = [];
|
||||
for (var prop in input) {
|
||||
props.push(prop + ':' + jsonString(input[prop], level));
|
||||
}
|
||||
return '{' + props.join(', ') + '}';
|
||||
} else {
|
||||
return JSON.stringify(input);
|
||||
}
|
||||
}
|
||||
|
||||
function loadVersion(ver) {
|
||||
var promise;
|
||||
|
||||
@@ -154,7 +154,10 @@
|
||||
<li>
|
||||
<a href="#/USING_PRO.md">Extensibility</a>
|
||||
<ul>
|
||||
<li><a href="#/USING_PRO.md#use">marked.use()</a></li>
|
||||
<li><a href="#/USING_PRO.md#renderer">Renderer</a></li>
|
||||
<li><a href="#/USING_PRO.md#tokenizer">Tokenizer</a></li>
|
||||
<li><a href="#/USING_PRO.md#walk-tokens">Walk Tokens</a></li>
|
||||
<li><a href="#/USING_PRO.md#lexer">Lexer</a></li>
|
||||
<li><a href="#/USING_PRO.md#parser">Parser</a></li>
|
||||
</ul>
|
||||
|
||||
Loaded 100 of 124 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user