Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7af7fe6146 | ||
|
|
340d7c731f | ||
|
|
e142acfdb7 | ||
|
|
e928660bc0 | ||
|
|
7a90e89348 | ||
|
|
1f1aea87a4 | ||
|
|
e9b7c4cdde | ||
|
|
1bf7f95bd8 | ||
|
|
2a065825fa | ||
|
|
492ed2bdc2 | ||
|
|
afe7d4991d | ||
|
|
0649add494 | ||
|
|
2dafde8db9 | ||
|
|
782d0b6209 | ||
|
|
8dcd360f93 | ||
|
|
ea1af474fd | ||
|
|
e3d0aece14 | ||
|
|
75dae5c714 | ||
|
|
f96bba7a63 | ||
|
|
3b3950369c | ||
|
|
a35df88805 | ||
|
|
40c70c439d | ||
|
|
2c4d3fa317 | ||
|
|
a4dbe98299 | ||
|
|
98602dabb0 | ||
|
|
6ae5f0cea5 | ||
|
|
0316802b84 | ||
|
|
25561946ed | ||
|
|
c29aa76d02 | ||
|
|
258af8bfed | ||
|
|
e2a374f0aa | ||
|
|
6a53aaf24a | ||
|
|
b2eccc7b54 | ||
|
|
c2fa23d525 | ||
|
|
e6fa02e0a1 | ||
|
|
e164aafbd8 | ||
|
|
a863194e74 | ||
|
|
f518397f7a | ||
|
|
fc91d866db | ||
|
|
8670561f78 | ||
|
|
d8474056d2 | ||
|
|
e48c5fb066 | ||
|
|
467a3be850 | ||
|
|
1b12d3f04f | ||
|
|
c77979ff13 | ||
|
|
0a1e7006b3 | ||
|
|
d5a8ec1c36 | ||
|
|
d497b75c1d | ||
|
|
07724f99ae | ||
|
|
8898862d36 | ||
|
|
2cc3507740 | ||
|
|
3565437728 | ||
|
|
15ba982810 | ||
|
|
488a895850 | ||
|
|
c7ded51502 | ||
|
|
c66cc3d4da | ||
|
|
c60967e935 | ||
|
|
343343e7e7 | ||
|
|
4f5de87cc4 | ||
|
|
f371cbd5d2 | ||
|
|
99ef6e3a20 | ||
|
|
599ace1db7 | ||
|
|
a06daff92e | ||
|
|
58e505f79a | ||
|
|
788dd0a81a | ||
|
|
82d76e55e5 | ||
|
|
38dfe0b9a7 | ||
|
|
b0f345ba21 | ||
|
|
95a4592346 | ||
|
|
3168c4067d | ||
|
|
115d23f929 | ||
|
|
975258ef39 | ||
|
|
b13d28203b | ||
|
|
4786b0c18d | ||
|
|
bc9512b750 | ||
|
|
abb31cb603 | ||
|
|
351d4767d7 | ||
|
|
f595120e72 | ||
|
|
3f2c3c1af9 | ||
|
|
69f2e8e74d | ||
|
|
72553c1f14 | ||
|
|
96abe3c691 | ||
|
|
2079a5bfa3 | ||
|
|
34bfb09c85 | ||
|
|
f652b677d0 | ||
|
|
c93ea33d05 | ||
|
|
26e0bbce17 | ||
|
|
a636611471 | ||
|
|
9313979db7 | ||
|
|
1c4f93a2ce | ||
|
|
a34f13aa2a | ||
|
|
ab2a721a14 | ||
|
|
16cc4d7cbd | ||
|
|
730352a48d | ||
|
|
5b41d72e8d | ||
|
|
33b8952c0b | ||
|
|
12483350a1 | ||
|
|
bbc3ab3f99 | ||
|
|
a9e53ec088 | ||
|
|
704808a6cb | ||
|
|
5b2f439500 | ||
|
|
688bc063e5 | ||
|
|
1eb3d25b40 | ||
|
|
7206e2528f | ||
|
|
e1029816df | ||
|
|
639c95bade | ||
|
|
0907936d2b | ||
|
|
cdc988c7b1 | ||
|
|
274a997e62 | ||
|
|
537a48bede | ||
|
|
82f0924914 | ||
|
|
7214be488b | ||
|
|
36b5965dd0 | ||
|
|
3a00a59ffb | ||
|
|
6b855ac045 | ||
|
|
9bba0ea283 | ||
|
|
de7509dc60 | ||
|
|
9fd14f7ecb | ||
|
|
3cf09efb13 | ||
|
|
22083787f9 | ||
|
|
1728298659 | ||
|
|
865c8305cb | ||
|
|
31dbdc835d | ||
|
|
56efb5c410 | ||
|
|
ebdb3a0cc3 | ||
|
|
473af2f5e2 | ||
|
|
1d2ab299b0 | ||
|
|
f2eda9d7ed | ||
|
|
52129ed714 | ||
|
|
e868f9dcee | ||
|
|
3f059ec1e0 | ||
|
|
8cb3974eff | ||
|
|
7d62d0920c | ||
|
|
b787854289 | ||
|
|
d84ea7d16f | ||
|
|
7318e42080 | ||
|
|
9f11ea0cc6 | ||
|
|
2ec15602d2 | ||
|
|
6a89605477 | ||
|
|
dff261efee | ||
|
|
931f0d508a | ||
|
|
ea823ab68f | ||
|
|
b56ddf9df9 | ||
|
|
9a468dfce5 | ||
|
|
db3476c8ec | ||
|
|
7a5401d5f0 | ||
|
|
d3ca816762 | ||
|
|
b7492e4a11 | ||
|
|
32ce2b51d8 | ||
|
|
e033959278 | ||
|
|
3e8f9ef1a5 | ||
|
|
92efb8bec4 | ||
|
|
9e1aaf163f | ||
|
|
3f19091a91 | ||
|
|
ae6eb706c7 | ||
|
|
806df30ba3 | ||
|
|
6a88c2f289 | ||
|
|
acc6bc0758 | ||
|
|
f3bc92904c | ||
|
|
3308d90a3a | ||
|
|
5bb99ba096 | ||
|
|
6ac7523d9d | ||
|
|
758bbab441 | ||
|
|
b26504f414 | ||
|
|
e195c731de | ||
|
|
00d581245c | ||
|
|
7faff44825 | ||
|
|
6fc9dd1323 | ||
|
|
7d6d3af54a | ||
|
|
064c4d7ca7 | ||
|
|
0fb15888bc | ||
|
|
32f50e1658 | ||
|
|
d2d4840758 | ||
|
|
bc2a20f04e | ||
|
|
2737d6b23f | ||
|
|
f53c624b0f | ||
|
|
77f8b76d4e | ||
|
|
13a2bd6380 |
No files matched your search
@@ -6,7 +6,7 @@ ENV DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
ENV \
|
||||
DEBUG=false \
|
||||
NODE_VERSION=8.16.1 \
|
||||
NODE_VERSION=8.17.0 \
|
||||
METEOR_RELEASE=1.8.1 \
|
||||
USE_EDGE=false \
|
||||
METEOR_EDGE=1.5-beta.17 \
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
name: Docker Image CI
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
|
||||
jobs:
|
||||
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- name: Build the Docker image
|
||||
run: docker build . --file Dockerfile --tag wekan:$(date +%s)
|
||||
@@ -17,3 +17,4 @@ notices-for-facebook-graph-api-2
|
||||
1.4.3-split-account-service-packages
|
||||
1.5-add-dynamic-import-package
|
||||
1.7-split-underscore-from-meteor-base
|
||||
1.8.3-split-jquery-from-blaze
|
||||
+6
-5
@@ -6,9 +6,9 @@
|
||||
meteor-base@1.4.0
|
||||
|
||||
# Build system
|
||||
ecmascript@0.12.4
|
||||
standard-minifier-css@1.5.3
|
||||
standard-minifier-js@2.4.1
|
||||
ecmascript@0.13.2
|
||||
standard-minifier-css@1.5.4
|
||||
standard-minifier-js@2.5.2
|
||||
mquandalle:jade
|
||||
|
||||
# Polyfills
|
||||
@@ -22,7 +22,7 @@ dburles:collection-helpers
|
||||
idmontie:migrations
|
||||
matb33:collection-hooks
|
||||
matteodem:easy-search
|
||||
mongo@1.6.2
|
||||
mongo@1.7.0
|
||||
mquandalle:collection-mutations
|
||||
|
||||
# Account system
|
||||
@@ -75,7 +75,7 @@ horka:swipebox
|
||||
dynamic-import@0.5.1
|
||||
staringatlights:fast-render
|
||||
|
||||
accounts-password@1.5.1
|
||||
accounts-password@1.5.2
|
||||
cfs:gridfs
|
||||
rzymek:fullcalendar
|
||||
momentjs:moment@2.22.2
|
||||
@@ -96,3 +96,4 @@ konecty:mongo-counter
|
||||
percolate:synced-cron
|
||||
easylogic:summernote
|
||||
cfs:filesystem
|
||||
ostrio:cookies
|
||||
+1
-1
@@ -1 +1 @@
|
||||
METEOR@1.8.1
|
||||
METEOR@1.8.3
|
||||
+26
-25
@@ -1,7 +1,7 @@
|
||||
3stack:presence@1.1.2
|
||||
accounts-base@1.4.4
|
||||
accounts-base@1.4.5
|
||||
accounts-oauth@1.1.16
|
||||
accounts-password@1.5.1
|
||||
accounts-password@1.5.2
|
||||
aldeed:collection2@2.10.0
|
||||
aldeed:collection2-core@1.2.0
|
||||
aldeed:schema-deny@1.1.0
|
||||
@@ -12,18 +12,18 @@ allow-deny@1.1.0
|
||||
arillo:flow-router-helpers@0.5.2
|
||||
audit-argument-checks@1.0.7
|
||||
autoupdate@1.6.0
|
||||
babel-compiler@7.3.4
|
||||
babel-runtime@1.3.0
|
||||
babel-compiler@7.4.2
|
||||
babel-runtime@1.4.0
|
||||
base64@1.0.12
|
||||
binary-heap@1.0.11
|
||||
blaze@2.3.3
|
||||
blaze@2.3.4
|
||||
blaze-tools@1.0.10
|
||||
boilerplate-generator@1.6.0
|
||||
browser-policy-common@1.0.11
|
||||
browser-policy-framing@1.1.0
|
||||
caching-compiler@1.2.1
|
||||
caching-html-compiler@1.1.3
|
||||
callback-hook@1.1.0
|
||||
callback-hook@1.2.0
|
||||
cfs:access-point@0.1.49
|
||||
cfs:base-package@0.0.30
|
||||
cfs:collection@0.5.5
|
||||
@@ -57,11 +57,11 @@ deps@1.0.12
|
||||
diff-sequence@1.1.1
|
||||
dynamic-import@0.5.1
|
||||
easylogic:summernote@0.8.8
|
||||
ecmascript@0.12.7
|
||||
ecmascript@0.13.2
|
||||
ecmascript-runtime@0.7.0
|
||||
ecmascript-runtime-client@0.8.0
|
||||
ecmascript-runtime-server@0.7.1
|
||||
ejson@1.1.0
|
||||
ecmascript-runtime-client@0.9.0
|
||||
ecmascript-runtime-server@0.8.0
|
||||
ejson@1.1.1
|
||||
email@1.2.3
|
||||
es5-shim@4.8.0
|
||||
fastclick@1.0.13
|
||||
@@ -82,16 +82,16 @@ kadira:dochead@1.5.0
|
||||
kadira:flow-router@2.12.1
|
||||
kenton:accounts-sandstorm@0.7.0
|
||||
konecty:mongo-counter@0.0.5_3
|
||||
lamhieu:meteorx@2.0.1
|
||||
lamhieu:meteorx@2.1.1
|
||||
lamhieu:unblock@1.0.0
|
||||
launch-screen@1.1.1
|
||||
livedata@1.0.18
|
||||
localstorage@1.2.0
|
||||
logging@1.1.20
|
||||
lucasantoniassi:accounts-lockout@1.0.0
|
||||
matb33:collection-hooks@0.8.4
|
||||
matb33:collection-hooks@0.9.1
|
||||
matteodem:easy-search@1.6.4
|
||||
mdg:meteor-apm-agent@3.2.3
|
||||
mdg:meteor-apm-agent@3.2.5
|
||||
mdg:validation-error@0.5.1
|
||||
meteor@1.9.3
|
||||
meteor-base@1.4.0
|
||||
@@ -101,16 +101,16 @@ meteorhacks:collection-utils@1.2.0
|
||||
meteorhacks:picker@1.0.3
|
||||
meteorhacks:subs-manager@1.6.4
|
||||
meteorspark:util@0.2.0
|
||||
minifier-css@1.4.2
|
||||
minifier-js@2.4.1
|
||||
minifier-css@1.4.3
|
||||
minifier-js@2.5.1
|
||||
minifiers@1.1.8-faster-rebuild.0
|
||||
minimongo@1.4.5
|
||||
mobile-status-bar@1.0.14
|
||||
modern-browsers@0.1.4
|
||||
modules@0.13.0
|
||||
modules-runtime@0.10.3
|
||||
modules@0.14.0
|
||||
modules-runtime@0.11.0
|
||||
momentjs:moment@2.24.0
|
||||
mongo@1.6.3
|
||||
mongo@1.7.0
|
||||
mongo-decimal@0.1.1
|
||||
mongo-dev-server@1.1.0
|
||||
mongo-id@1.0.7
|
||||
@@ -127,17 +127,18 @@ mquandalle:mousetrap-bindglobal@0.0.1
|
||||
mquandalle:perfect-scrollbar@0.6.5_2
|
||||
msavin:usercache@1.8.0
|
||||
npm-bcrypt@0.9.3
|
||||
npm-mongo@3.1.2
|
||||
npm-mongo@3.2.0
|
||||
oauth@1.2.8
|
||||
oauth2@1.2.1
|
||||
observe-sequence@1.0.16
|
||||
ongoworks:speakingurl@1.1.0
|
||||
ordered-dict@1.1.0
|
||||
peerlibrary:assert@0.2.5
|
||||
ostrio:cookies@2.5.0
|
||||
peerlibrary:assert@0.3.0
|
||||
peerlibrary:base-component@0.16.0
|
||||
peerlibrary:blaze-components@0.15.1
|
||||
peerlibrary:computed-field@0.9.0
|
||||
peerlibrary:reactive-field@0.5.0
|
||||
peerlibrary:computed-field@0.10.0
|
||||
peerlibrary:reactive-field@0.6.0
|
||||
percolate:synced-cron@1.3.2
|
||||
promise@0.11.2
|
||||
raix:eventemitter@0.1.3
|
||||
@@ -166,8 +167,8 @@ softwarerero:accounts-t9n@1.3.11
|
||||
spacebars@1.0.15
|
||||
spacebars-compiler@1.1.3
|
||||
srp@1.0.12
|
||||
standard-minifier-css@1.5.3
|
||||
standard-minifier-js@2.4.1
|
||||
standard-minifier-css@1.5.4
|
||||
standard-minifier-js@2.5.2
|
||||
staringatlights:fast-render@3.2.0
|
||||
staringatlights:inject-data@2.3.0
|
||||
tap:i18n@1.8.2
|
||||
@@ -185,7 +186,7 @@ useraccounts:core@1.14.2
|
||||
useraccounts:flow-routing@1.14.2
|
||||
useraccounts:unstyled@1.14.2
|
||||
verron:autosize@3.0.8
|
||||
webapp@1.7.4
|
||||
webapp@1.7.5
|
||||
webapp-hashing@1.0.9
|
||||
wekan-accounts-cas@0.1.0
|
||||
wekan-accounts-oidc@1.0.10
|
||||
|
||||
+2
-2
@@ -3,8 +3,8 @@ sudo: required
|
||||
|
||||
env:
|
||||
TRAVIS_DOCKER_COMPOSE_VERSION: 1.24.0
|
||||
TRAVIS_NODE_VERSION: 8.16.1
|
||||
TRAVIS_NPM_VERSION: 6.4.1
|
||||
TRAVIS_NODE_VERSION: 8.17.0
|
||||
TRAVIS_NPM_VERSION: latest
|
||||
|
||||
before_install:
|
||||
- sudo apt-get update -y
|
||||
|
||||
+207
-3
@@ -1,3 +1,207 @@
|
||||
# v3.57 2019-12-22 Wekan release
|
||||
|
||||
This release adds the following features:
|
||||
|
||||
- [Allow card and checklist API creation for authorized board members](https://github.com/wekan/wekan/pull/2854).
|
||||
Thanks to Robert-Lebedeu.
|
||||
- [Visual difference for inactive user in Administration: strikethrough](https://github.com/wekan/wekan/commit/1f1aea87a421ca5e7931d220d10c838574208e2c).
|
||||
Thanks to hever and xet7.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Upgrade to Meteor 1.8.3 and Node 8.17.0. Update release scripts. Fix ldap background sync documentation part 2](https://github.com/wekan/wekan/commit/782d0b620988628f40f50f9cd824f6652cfb0dd9).
|
||||
Thanks to xet7.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fix: Don't add a blank space for empty custom fields on minicards](https://github.com/wekan/wekan/commit/e2a374f0aad8489a84d6de9966c281a812b5eca3).
|
||||
Thanks to roobre and xet7.
|
||||
- [Fix: Allow to set empty card title, AssignedBy and RequestedBy](https://github.com/wekan/wekan/commit/25561946edf37351f67cf7500902dde7d9114d2f).
|
||||
Thanks to justinr1234 and xet7.
|
||||
- [Fix comment text disappearing when clicking outside of comment text area.
|
||||
Fix lint error](https://github.com/wekan/wekan/commit/3b3950369ce07aa9e6fc4ab1bef9fb8a4993e398).
|
||||
Thanks to xet7.
|
||||
- [Fix ldap background sync documentation](https://github.com/wekan/wekan/pull/2855).
|
||||
Thanks to koelle25.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v3.56 2019-11-21 Wekan release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Update to Meteor 1.8.2. Update dependencies](https://github.com/wekan/wekan/commit/38dfe0b9a71a083adc2de1a81170fea0e4a8e53f).
|
||||
Thanks to xet7.
|
||||
- [Fix lint errors and update travis NPM version](https://github.com/wekan/wekan/commit/b0f345ba21830b033c9edcc8ee5252b280111ae7).
|
||||
Thanks to xet7.
|
||||
- [Change base image to rolling, that is currently Ubuntu eoan
|
||||
version](https://github.com/wekan/wekan/commit/c66cc3d4dadb15b669256530cfda89359cdb9340).
|
||||
Thanks to xet7.
|
||||
- [It seems Ubuntu eoan package bsdtar has been renamed to
|
||||
libarchive-tools](https://github.com/wekan/wekan/commit/c60967e935bdc0e7e9aea0a1c23178aee8a73c29).
|
||||
Thanks to xet7.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fix slow scroll on card detail by setting scrollInertia to 0](https://github.com/wekan/wekan/commit/599ace1db7918df41d9708d14b0351acb0f8688e).
|
||||
Thanks to cafeoh.
|
||||
- [Fix lint errors](https://github.com/wekan/wekan/commit/788dd0a81a06efee165007a92780f9e8c2c754ac).
|
||||
Thanks to xet7.
|
||||
- [Remove eslint option that does not work](https://github.com/wekan/wekan/commit/a06daff92e5f7cca55d1698252e3aa6526877c8b).
|
||||
Thanks to xet7.
|
||||
- [Try to fix lint errors](https://github.com/wekan/wekan/commit/58e505f79a0617011576bdded9427b0d448d6107).
|
||||
Thanks to xet7.
|
||||
- [Add to Snap MongoDB logging option --quiet](https://github.com/wekan/wekan/commit/c7ded515022fff2c1167ce8938405a846185a710).
|
||||
Thanks to fmeehan and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v3.55 2019-11-19 Wekan release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- [When logged in, use database for setting, so that changes are immediate. Only on public board use cookies.
|
||||
Comment out Collapse CSS that is not in use](https://github.com/wekan/wekan/commit/351d4767d7e93c90ac798769d6071da8730d834f).
|
||||
Thanks to xet7.
|
||||
- [Use database when logged in. Part 2](https://github.com/wekan/wekan/commit/4786b0c18ddeb8f48525216eabebdced7159467d).
|
||||
Thanks to xet7.
|
||||
- [Use database when logged in. Part 3](https://github.com/wekan/wekan/commit/115d23f9293cad8a93f18f75a47a8a65756f71ce).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v3.54 2019-11-18 Wekan release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [New feature: Now there is popup selection of Lists/Swimlanes/Calendar/Roles](https://github.com/wekan/wekan/commit/96abe3c6914ce37d9fb44da8fda375e40ad65c9e).
|
||||
Thanks to xet7.
|
||||
- [New feature, not set visible yet, because switching to it does not
|
||||
work properly yet: Collapsible Swimlanes](https://github.com/wekan/wekan/issues/2804).
|
||||
Thanks to xet7.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fix: Public board now loads correctly. When you select one of Lists/Swimlanes/Calendar view and
|
||||
reload webbrowser page, it can change view](https://github.com/wekan/wekan/issues/2311).
|
||||
Thanks to xet7.
|
||||
- [Fix: List sorting commented out](https://github.com/wekan/wekan/issues/2800).
|
||||
Thanks to xet7.
|
||||
- [Fix: Errors hasHiddenMinicardText, hasShowDragHandles, showSort, hasSortBy, profile,
|
||||
FirefoxAndroid/IE11/Vivaldi/Chromium browsers not working by using cookies instead of
|
||||
database](https://github.com/wekan/wekan/issues/2643#issuecomment-554907955).
|
||||
Note: Cookie changes are not always immediate, if there is no effect, you may need to
|
||||
reload webbrowser page. This could be improved later.
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v3.53 2019-11-14 Wekan release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- [Revert list sorting change of Wekan v3.51 because it reversed alphabetical sorting of
|
||||
lists](https://github.com/wekan/wekan/commit/ab2a721a1443b903cdbbbe275f41ffd3269012c6).
|
||||
Thanks to Dalisay and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v3.52 2019-11-14 Wekan release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- [Add database migration for assignee](https://github.com/wekan/wekan/commit/5b41d72e8de93833e1788962427422cff62c09a2).
|
||||
Thanks to ocdtrekkie and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v3.51 2019-11-14 Wekan release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- [Change sorting lists to work on desktop drag handle page instead,
|
||||
where it seems to work better](https://github.com/wekan/wekan/commit/bbc3ab3f994c5a61a4414bc64b05f5a03d259e46).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v3.50 2019-11-13 Wekan release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Allowing lists to be sorted by modifiedAt when not in draggable
|
||||
mode](https://github.com/wekan/wekan/commits/77f8b76d4e13c35ea3451622176bbb69a4d39a32).
|
||||
Thanks to whowillcare.
|
||||
- Allow user to sort Lists in Board by his own preference boardadmin can star
|
||||
list [1](https://github.com/wekan/wekan/commit/bc2a20f04e32607f8488a9cecd815647fb43e40e),
|
||||
[2](https://github.com/wekan/wekan/commit/bc2a20f04e32607f8488a9cecd815647fb43e40e).
|
||||
Thanks to whowillcare.
|
||||
- [Allowing user to filter list in Filter function not just cards
|
||||
commit](https://github.com/wekan/wekan/commit/d2d4840758b0f5aed7feb4f6a459bb2b2d1a3f0b).
|
||||
Thanks to whowillcare.
|
||||
- [Allow user to search Lists in Board](https://github.com/wekan/wekan/commit/32f50e16586696ec7d100ce0438d1030ae1f606e).
|
||||
Thanks to whowillcare.
|
||||
- Enhancement: [Set card times more sensible using the 'Today' button in
|
||||
datepicker](https://github.com/wekan/wekan/pull/2747).
|
||||
Thanks to liske.
|
||||
- [At card, added Assignee field like Jira, and REST API for it](https://github.com/wekan/wekan/issues/2452).
|
||||
Parts:
|
||||
[Add assignee](https://github.com/wekan/wekan/commit/9e1aaf163f3bd0b3c2d2aee8225d111f83b3d421),
|
||||
[Remove Assignee. Avatar icon is at card and assignee details](https://github.com/wekan/wekan/commit/3e8f9ef1a5275a5e9b691c7e74dc73b97a43689a),
|
||||
[When selecting new assignee (+) icon, list shows names who to add](https://github.com/wekan/wekan/commit/32ce2b51d8bff5e8851732394a8bae3c56f8b0b6),
|
||||
[More progress](https://github.com/wekan/wekan/commit/ea823ab68fd5243c8485177e44a074be836836b8),
|
||||
[In add assignee popup, avatars are now visible](https://github.com/wekan/wekan/commit/56efb5c41075151eeb259d99990a7e86695b2b69),
|
||||
[Add assignee popup title](https://github.com/wekan/wekan/commit/31dbdc835d5a092b8360a4dbe93e9fbcce068855),
|
||||
[Prevent more than one assignee](https://github.com/wekan/wekan/commit/1728298659521ee8e6fc94fedad3160030b9a2c3),
|
||||
[When there is one selected assignee on card, don't show + button for adding more assignees, because there can only be one
|
||||
assignee](https://github.com/wekan/wekan/commit/3cf09efb13438d66db6cf739591c679ea538d812),
|
||||
[Now assignee is visible also at minicard](https://github.com/wekan/wekan/commit/9fd14f7ecb593d3debf5adff8f6c61adb0c3feca),
|
||||
[Update REST API docs, there can only be one assignee in array](https://github.com/wekan/wekan/commit/de7509dc60257667192054e320b381f9dd0f0a31).
|
||||
Thanks to xet7.
|
||||
- [More mobile drag handles, and optional desktop drag handles](https://github.com/wekan/wekan/issues/2081): In Progress.
|
||||
Parts:
|
||||
[Some drag handle fixes](https://github.com/wekan/wekan/commit/6a8960547729148bd3085cb469f9e93d510ed66c),
|
||||
[Fix desktop swimlane drag handle position](https://github.com/wekan/wekan/commit/2ec15602d284122fce1a45bed352d0d4050162e2),
|
||||
[Fix card, list and swimlane move. Allow moving cards in multiselect mode](https://github.com/wekan/wekan/commit/537a48bede250155b30ec264904ba320625bab73).
|
||||
Thanks to xet7.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Update Node.js to v8.16.2](https://github.com/wekan/wekan/commit/1eb3d25b40797fdab41d7dd59405cfcea81dcc61).
|
||||
Thanks to xet7.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- Bug Fix [#2093](https://github.com/wekan/wekan/issues/2093), need to [clean up the
|
||||
temporary file](https://github.com/wekan/wekan/commit/2737d6b23f3a0fd2314236a85fbdee536df745a2).
|
||||
Thanks to whowillcare.
|
||||
- Bug Fix [#2093](https://github.com/wekan/wekan/issues/2093): the broken [should be prior to file attachment feature introduced](https://github.com/wekan/wekan/commit/f53c624b0f6c6ebcc20c378a153e5cda8d73463c).
|
||||
Thanks to whowillcare.
|
||||
- [Fix typo on exporting subtasks](https://github.com/wekan/wekan/commit/00d581245c1fe6a01ef372ca87d8a25bc7b937e4).
|
||||
Thanks to xiorcala.
|
||||
- [Change the radom to random typo in export.js](https://github.com/wekan/wekan/commit/e195c731de88aba4026c239f4552ae821d522ec7).
|
||||
Thanks to whowillcare.
|
||||
- Fix: [List last modify time will be affected by cards dueAt, endAt](https://github.com/wekan/wekan/commit/3308d90a3a6a1ddeed33966767937cd2c2c90cb5).
|
||||
Thanks to whowillcare.
|
||||
- Revert creating new list to left, now creates again to right. Thanks to whowillcare.
|
||||
Revert New List item moved from right to left. Thanks to derbolle and xet7.
|
||||
[1](https://github.com/wekan/wekan/commit/806df30ba3499cef193eaf1b437cdef65282510f).
|
||||
- REST API: [Fix deletion of a single board card](https://github.com/wekan/wekan/pull/2778).
|
||||
Thanks to liske.
|
||||
- [cardDate: endDate coloring change](https://github.com/wekan/wekan/pull/2779).
|
||||
If no due-date timestamp is set => Gray.
|
||||
If end-date timestamp is younger than due-date timestamp => Green.
|
||||
If end-date timestamp is older than due-date timestamp => Red.
|
||||
Thanks to bandresen.
|
||||
- [Fixed Card Open Webhook Error](https://github.com/wekan/wekan/issues/2780).
|
||||
Thanks to jymcheong.
|
||||
- [Fixed OpenAPI docs generation](https://github.com/wekan/wekan/pull/2783).
|
||||
Thanks to bentiss.
|
||||
- [Fixed close card button not visible on mobile web](https://github.com/wekan/wekan/36b5965dd07e3f0fd90069353310739c394c220f).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v3.49 2019-10-09 Wekan release
|
||||
|
||||
This release fixes the following bugs:
|
||||
@@ -46,7 +250,7 @@ This release adds the following new features:
|
||||
NOTIFY_DUE_DAYS_BEFORE_AND_AFTER = 2,0 it means notification will be sent on both due day and two days before.
|
||||
Thanks to whowillcare.
|
||||
- [Added modifications the help files, related to NOTIFY_DUE_DAYS_BEFORE_AND_AFTER](https://github.com/wekan/wekan/pull/2740).
|
||||
Thanks to whowillcare.
|
||||
Thanks to whowillcare.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
@@ -97,7 +301,7 @@ This release adds the following new features:
|
||||
|
||||
- [More Mobile and Desktop drag handles for Swimlanes/Lists/Cards. Part 1](https://github.com/wekan/wekan/commit/ff550e91103115e7b731dd80c4588b93b2d4c64f).
|
||||
Thanks to xet7.
|
||||
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v3.40 2019-09-11 Wekan release
|
||||
@@ -506,7 +710,7 @@ This release fixes the following bugs:
|
||||
|
||||
- [Add missing dependencies back and revert deleting phantomjs](https://github.com/wekan/wekan/commit/32e9aa0ddaf1b015825b8c62ad17ed74b449e4b1).
|
||||
Thanks to whowillcare and xet7.
|
||||
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v3.09 2019-08-07 Wekan release
|
||||
|
||||
+3
-3
@@ -1,12 +1,12 @@
|
||||
FROM ubuntu:disco
|
||||
FROM ubuntu:rolling
|
||||
LABEL maintainer="wekan"
|
||||
|
||||
# Set the environment variables (defaults where required)
|
||||
# DOES NOT WORK: paxctl fix for alpine linux: https://github.com/wekan/wekan/issues/1303
|
||||
# ENV BUILD_DEPS="paxctl"
|
||||
ENV BUILD_DEPS="apt-utils bsdtar gnupg gosu wget curl bzip2 g++ build-essential git ca-certificates" \
|
||||
ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build-essential git ca-certificates python3" \
|
||||
DEBUG=false \
|
||||
NODE_VERSION=v8.16.1 \
|
||||
NODE_VERSION=v8.17.0 \
|
||||
METEOR_RELEASE=1.8.1 \
|
||||
USE_EDGE=false \
|
||||
METEOR_EDGE=1.5-beta.17 \
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
|
||||
appVersion: "v3.49.0"
|
||||
appVersion: "v3.57.0"
|
||||
files:
|
||||
userUploads:
|
||||
- README.md
|
||||
|
||||
@@ -16,9 +16,6 @@ BlazeComponent.extendComponent({
|
||||
events() {
|
||||
return [
|
||||
{
|
||||
'click .js-new-comment:not(.focus)'() {
|
||||
commentFormIsOpen.set(true);
|
||||
},
|
||||
'submit .js-new-comment-form'(evt) {
|
||||
const input = this.getInput();
|
||||
const text = input.val().trim();
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import { Cookies } from 'meteor/ostrio:cookies';
|
||||
const cookies = new Cookies();
|
||||
const subManager = new SubsManager();
|
||||
const { calculateIndex, enableClickOnTouch } = Utils;
|
||||
const swimlaneWhileSortingHeight = 150;
|
||||
@@ -89,7 +91,6 @@ BlazeComponent.extendComponent({
|
||||
helper.append(list.clone());
|
||||
return helper;
|
||||
},
|
||||
handle: '.js-swimlane-header',
|
||||
items: '.swimlane:not(.placeholder)',
|
||||
placeholder: 'swimlane placeholder',
|
||||
distance: 7,
|
||||
@@ -193,6 +194,34 @@ BlazeComponent.extendComponent({
|
||||
// ugly touch event hotfix
|
||||
enableClickOnTouch('.js-swimlane:not(.placeholder)');
|
||||
|
||||
this.autorun(() => {
|
||||
let showDesktopDragHandles = false;
|
||||
currentUser = Meteor.user();
|
||||
if (currentUser) {
|
||||
showDesktopDragHandles = (currentUser.profile || {})
|
||||
.showDesktopDragHandles;
|
||||
} else if (cookies.has('showDesktopDragHandles')) {
|
||||
showDesktopDragHandles = true;
|
||||
} else {
|
||||
showDesktopDragHandles = false;
|
||||
}
|
||||
if (
|
||||
Utils.isMiniScreen() ||
|
||||
(!Utils.isMiniScreen() && showDesktopDragHandles)
|
||||
) {
|
||||
$swimlanesDom.sortable({
|
||||
handle: '.js-swimlane-header-handle',
|
||||
});
|
||||
} else {
|
||||
$swimlanesDom.sortable({
|
||||
handle: '.swimlane-header',
|
||||
});
|
||||
}
|
||||
|
||||
// Disable drag-dropping if the current user is not a board member or is comment only
|
||||
$swimlanesDom.sortable('option', 'disabled', !userIsMember());
|
||||
});
|
||||
|
||||
function userIsMember() {
|
||||
return (
|
||||
Meteor.user() &&
|
||||
@@ -210,21 +239,30 @@ BlazeComponent.extendComponent({
|
||||
},
|
||||
|
||||
isViewSwimlanes() {
|
||||
const currentUser = Meteor.user();
|
||||
if (!currentUser) return false;
|
||||
return (currentUser.profile || {}).boardView === 'board-view-swimlanes';
|
||||
currentUser = Meteor.user();
|
||||
if (currentUser) {
|
||||
return (currentUser.profile || {}).boardView === 'board-view-swimlanes';
|
||||
} else {
|
||||
return cookies.get('boardView') === 'board-view-swimlanes';
|
||||
}
|
||||
},
|
||||
|
||||
isViewLists() {
|
||||
const currentUser = Meteor.user();
|
||||
if (!currentUser) return true;
|
||||
return (currentUser.profile || {}).boardView === 'board-view-lists';
|
||||
currentUser = Meteor.user();
|
||||
if (currentUser) {
|
||||
return (currentUser.profile || {}).boardView === 'board-view-lists';
|
||||
} else {
|
||||
return cookies.get('boardView') === 'board-view-lists';
|
||||
}
|
||||
},
|
||||
|
||||
isViewCalendar() {
|
||||
const currentUser = Meteor.user();
|
||||
if (!currentUser) return false;
|
||||
return (currentUser.profile || {}).boardView === 'board-view-cal';
|
||||
currentUser = Meteor.user();
|
||||
if (currentUser) {
|
||||
return (currentUser.profile || {}).boardView === 'board-view-cal';
|
||||
} else {
|
||||
return cookies.get('boardView') === 'board-view-cal';
|
||||
}
|
||||
},
|
||||
|
||||
openNewListForm() {
|
||||
@@ -381,8 +419,11 @@ BlazeComponent.extendComponent({
|
||||
};
|
||||
},
|
||||
isViewCalendar() {
|
||||
const currentUser = Meteor.user();
|
||||
if (!currentUser) return false;
|
||||
return (currentUser.profile || {}).boardView === 'board-view-cal';
|
||||
currentUser = Meteor.user();
|
||||
if (currentUser) {
|
||||
return (currentUser.profile || {}).boardView === 'board-view-cal';
|
||||
} else {
|
||||
return cookies.get('boardView') === 'board-view-cal';
|
||||
}
|
||||
},
|
||||
}).register('calendarView');
|
||||
@@ -77,6 +77,11 @@ template(name="boardHeaderBar")
|
||||
i.fa.fa-archive
|
||||
span {{_ 'archives'}}
|
||||
|
||||
//if showSort
|
||||
// a.board-header-btn.js-open-sort-view(title="{{_ 'sort-desc'}}")
|
||||
// i.fa(class="{{directionClass}}")
|
||||
// span {{_ 'sort'}}{{_ listSortShortDesc}}
|
||||
|
||||
a.board-header-btn.js-open-filter-view(
|
||||
title="{{#if Filter.isActive}}{{_ 'filter-on-desc'}}{{else}}{{_ 'filter'}}{{/if}}"
|
||||
class="{{#if Filter.isActive}}emphasis{{/if}}")
|
||||
@@ -85,15 +90,6 @@ template(name="boardHeaderBar")
|
||||
if Filter.isActive
|
||||
a.board-header-btn-close.js-filter-reset(title="{{_ 'filter-clear'}}")
|
||||
i.fa.fa-times-thin
|
||||
|
||||
if currentUser.isAdmin
|
||||
a.board-header-btn.js-open-rules-view(title="{{_ 'rules'}}")
|
||||
i.fa.fa-magic
|
||||
span {{_ 'rules'}}
|
||||
else if currentUser.isBoardAdmin
|
||||
a.board-header-btn.js-open-rules-view(title="{{_ 'rules'}}")
|
||||
i.fa.fa-magic
|
||||
span {{_ 'rules'}}
|
||||
|
||||
a.board-header-btn.js-open-search-view(title="{{_ 'search'}}")
|
||||
i.fa.fa-search
|
||||
@@ -102,8 +98,14 @@ template(name="boardHeaderBar")
|
||||
unless currentBoard.isTemplatesBoard
|
||||
a.board-header-btn.js-toggle-board-view(
|
||||
title="{{_ 'board-view'}}")
|
||||
i.fa.fa-th-large
|
||||
span {{#if currentUser.profile.boardView}}{{_ currentUser.profile.boardView}}{{else}}{{_ 'board-view-lists'}}{{/if}}
|
||||
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-cal'
|
||||
i.fa.fa-calendar
|
||||
span {{#if boardView}}{{_ boardView}}{{else}}{{_ 'board-view-lists'}}{{/if}}
|
||||
|
||||
if canModifyBoard
|
||||
a.board-header-btn.js-multiselection-activate(
|
||||
@@ -168,6 +170,44 @@ template(name="boardChangeWatchPopup")
|
||||
i.fa.fa-check
|
||||
span.sub-name {{_ 'muted-info'}}
|
||||
|
||||
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
|
||||
i.fa.fa-th-large.colorful
|
||||
| {{_ 'board-view-swimlanes'}}
|
||||
if $eq Utils.boardView "board-view-swimlanes"
|
||||
i.fa.fa-check
|
||||
li
|
||||
with "board-view-cal"
|
||||
a.js-open-cal-view
|
||||
i.fa.fa-calendar.colorful
|
||||
| {{_ 'board-view-cal'}}
|
||||
if $eq Utils.boardView "board-view-cal"
|
||||
i.fa.fa-check
|
||||
if currentUser.isAdmin
|
||||
hr
|
||||
li
|
||||
with "board-view-rules"
|
||||
a.js-open-rules-view(title="{{_ 'rules'}}")
|
||||
i.fa.fa-magic
|
||||
| {{_ 'rules'}}
|
||||
else if currentUser.isBoardAdmin
|
||||
hr
|
||||
li
|
||||
with "board-view-rules"
|
||||
a.js-open-rules-view(title="{{_ 'rules'}}")
|
||||
i.fa.fa-magic
|
||||
| {{_ 'rules'}}
|
||||
|
||||
template(name="createBoard")
|
||||
form
|
||||
label
|
||||
@@ -194,6 +234,20 @@ template(name="createBoard")
|
||||
| /
|
||||
a.js-board-template {{_ 'template'}}
|
||||
|
||||
//template(name="listsortPopup")
|
||||
// h2
|
||||
// | {{_ 'list-sort-by'}}
|
||||
// hr
|
||||
// ul.pop-over-list
|
||||
// each value in allowedSortValues
|
||||
// li
|
||||
// a.js-sort-by(name="{{value.name}}")
|
||||
// if $eq sortby value.name
|
||||
// i(class="fa {{Direction}}")
|
||||
// | {{_ value.label }}{{_ value.shortLabel}}
|
||||
// if $eq sortby value.name
|
||||
// i(class="fa fa-check")
|
||||
|
||||
template(name="boardChangeTitlePopup")
|
||||
form
|
||||
label
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
/*
|
||||
const DOWNCLS = 'fa-sort-down';
|
||||
const UPCLS = 'fa-sort-up';
|
||||
*/
|
||||
Template.boardMenuPopup.events({
|
||||
'click .js-rename-board': Popup.open('boardChangeTitle'),
|
||||
'click .js-custom-fields'() {
|
||||
@@ -80,7 +84,27 @@ BlazeComponent.extendComponent({
|
||||
const currentBoard = Boards.findOne(Session.get('currentBoard'));
|
||||
return currentBoard && currentBoard.stars >= 2;
|
||||
},
|
||||
|
||||
/*
|
||||
showSort() {
|
||||
return Meteor.user().hasSortBy();
|
||||
},
|
||||
directionClass() {
|
||||
return this.currentDirection() === -1 ? DOWNCLS : UPCLS;
|
||||
},
|
||||
changeDirection() {
|
||||
const direction = 0 - this.currentDirection() === -1 ? '-' : '';
|
||||
Meteor.call('setListSortBy', direction + this.currentListSortBy());
|
||||
},
|
||||
currentDirection() {
|
||||
return Meteor.user().getListSortByDirection();
|
||||
},
|
||||
currentListSortBy() {
|
||||
return Meteor.user().getListSortBy();
|
||||
},
|
||||
listSortShortDesc() {
|
||||
return `list-label-short-${this.currentListSortBy()}`;
|
||||
},
|
||||
*/
|
||||
events() {
|
||||
return [
|
||||
{
|
||||
@@ -94,30 +118,25 @@ BlazeComponent.extendComponent({
|
||||
'click .js-open-archived-board'() {
|
||||
Modal.open('archivedBoards');
|
||||
},
|
||||
'click .js-toggle-board-view'() {
|
||||
const currentUser = Meteor.user();
|
||||
if (
|
||||
(currentUser.profile || {}).boardView === 'board-view-swimlanes'
|
||||
) {
|
||||
currentUser.setBoardView('board-view-cal');
|
||||
} else if (
|
||||
(currentUser.profile || {}).boardView === 'board-view-lists'
|
||||
) {
|
||||
currentUser.setBoardView('board-view-swimlanes');
|
||||
} else if (
|
||||
(currentUser.profile || {}).boardView === 'board-view-cal'
|
||||
) {
|
||||
currentUser.setBoardView('board-view-lists');
|
||||
} else {
|
||||
currentUser.setBoardView('board-view-swimlanes');
|
||||
}
|
||||
},
|
||||
'click .js-toggle-board-view': Popup.open('boardChangeView'),
|
||||
'click .js-toggle-sidebar'() {
|
||||
Sidebar.toggle();
|
||||
},
|
||||
'click .js-open-filter-view'() {
|
||||
Sidebar.setView('filter');
|
||||
},
|
||||
/*
|
||||
'click .js-open-sort-view'(evt) {
|
||||
const target = evt.target;
|
||||
if (target.tagName === 'I') {
|
||||
// click on the text, popup choices
|
||||
this.changeDirection();
|
||||
} else {
|
||||
// change the sort order
|
||||
Popup.open('listsort')(evt);
|
||||
}
|
||||
},
|
||||
*/
|
||||
'click .js-filter-reset'(event) {
|
||||
event.stopPropagation();
|
||||
Sidebar.setView();
|
||||
@@ -126,9 +145,6 @@ BlazeComponent.extendComponent({
|
||||
'click .js-open-search-view'() {
|
||||
Sidebar.setView('search');
|
||||
},
|
||||
'click .js-open-rules-view'() {
|
||||
Modal.openWide('rulesMain');
|
||||
},
|
||||
'click .js-multiselection-activate'() {
|
||||
const currentCard = Session.get('currentCard');
|
||||
MultiSelection.activate();
|
||||
@@ -156,6 +172,28 @@ Template.boardHeaderBar.helpers({
|
||||
!Meteor.user().isCommentOnly()
|
||||
);
|
||||
},
|
||||
boardView() {
|
||||
return Utils.boardView();
|
||||
},
|
||||
});
|
||||
|
||||
Template.boardChangeViewPopup.events({
|
||||
'click .js-open-lists-view'() {
|
||||
Utils.setBoardView('board-view-lists');
|
||||
Popup.close();
|
||||
},
|
||||
'click .js-open-swimlanes-view'() {
|
||||
Utils.setBoardView('board-view-swimlanes');
|
||||
Popup.close();
|
||||
},
|
||||
'click .js-open-cal-view'() {
|
||||
Utils.setBoardView('board-view-cal');
|
||||
Popup.close();
|
||||
},
|
||||
'click .js-open-rules-view'() {
|
||||
Modal.openWide('rulesMain');
|
||||
Popup.close();
|
||||
},
|
||||
});
|
||||
|
||||
const CreateBoard = BlazeComponent.extendComponent({
|
||||
@@ -277,3 +315,75 @@ BlazeComponent.extendComponent({
|
||||
];
|
||||
},
|
||||
}).register('boardChangeWatchPopup');
|
||||
|
||||
/*
|
||||
BlazeComponent.extendComponent({
|
||||
onCreated() {
|
||||
//this.sortBy = new ReactiveVar();
|
||||
////this.sortDirection = new ReactiveVar();
|
||||
//this.setSortBy();
|
||||
this.downClass = DOWNCLS;
|
||||
this.upClass = UPCLS;
|
||||
},
|
||||
allowedSortValues() {
|
||||
const types = [];
|
||||
const pushed = {};
|
||||
Meteor.user()
|
||||
.getListSortTypes()
|
||||
.forEach(type => {
|
||||
const key = type.replace(/^-/, '');
|
||||
if (pushed[key] === undefined) {
|
||||
types.push({
|
||||
name: key,
|
||||
label: `list-label-${key}`,
|
||||
shortLabel: `list-label-short-${key}`,
|
||||
});
|
||||
pushed[key] = 1;
|
||||
}
|
||||
});
|
||||
return types;
|
||||
},
|
||||
Direction() {
|
||||
return Meteor.user().getListSortByDirection() === -1
|
||||
? this.downClass
|
||||
: this.upClass;
|
||||
},
|
||||
sortby() {
|
||||
return Meteor.user().getListSortBy();
|
||||
},
|
||||
|
||||
setSortBy(type = null) {
|
||||
const user = Meteor.user();
|
||||
if (type === null) {
|
||||
type = user._getListSortBy();
|
||||
} else {
|
||||
let value = '';
|
||||
if (type.map) {
|
||||
// is an array
|
||||
value = (type[1] === -1 ? '-' : '') + type[0];
|
||||
}
|
||||
Meteor.call('setListSortBy', value);
|
||||
}
|
||||
//this.sortBy.set(type[0]);
|
||||
//this.sortDirection.set(type[1]);
|
||||
},
|
||||
|
||||
events() {
|
||||
return [
|
||||
{
|
||||
'click .js-sort-by'(evt) {
|
||||
evt.preventDefault();
|
||||
const target = evt.target;
|
||||
const sortby = target.getAttribute('name');
|
||||
const down = !!target.querySelector(`.${this.upClass}`);
|
||||
const direction = down ? -1 : 1;
|
||||
this.setSortBy([sortby, direction]);
|
||||
if (Utils.isMiniScreen) {
|
||||
Popup.close();
|
||||
}
|
||||
},
|
||||
},
|
||||
];
|
||||
},
|
||||
}).register('listsortPopup');
|
||||
*/
|
||||
@@ -105,7 +105,7 @@ Template.dateBadge.helpers({
|
||||
// editCardReceivedDatePopup
|
||||
(class extends DatePicker {
|
||||
onCreated() {
|
||||
super.onCreated();
|
||||
super.onCreated(moment().format('YYYY-MM-DD HH:mm'));
|
||||
this.data().getReceived() &&
|
||||
this.date.set(moment(this.data().getReceived()));
|
||||
}
|
||||
@@ -122,7 +122,7 @@ Template.dateBadge.helpers({
|
||||
// editCardStartDatePopup
|
||||
(class extends DatePicker {
|
||||
onCreated() {
|
||||
super.onCreated();
|
||||
super.onCreated(moment().format('YYYY-MM-DD HH:mm'));
|
||||
this.data().getStart() && this.date.set(moment(this.data().getStart()));
|
||||
}
|
||||
|
||||
@@ -148,7 +148,7 @@ Template.dateBadge.helpers({
|
||||
// editCardDueDatePopup
|
||||
(class extends DatePicker {
|
||||
onCreated() {
|
||||
super.onCreated();
|
||||
super.onCreated('1970-01-01 17:00:00');
|
||||
this.data().getDue() && this.date.set(moment(this.data().getDue()));
|
||||
}
|
||||
|
||||
@@ -171,7 +171,7 @@ Template.dateBadge.helpers({
|
||||
// editCardEndDatePopup
|
||||
(class extends DatePicker {
|
||||
onCreated() {
|
||||
super.onCreated();
|
||||
super.onCreated(moment().format('YYYY-MM-DD HH:mm'));
|
||||
this.data().getEnd() && this.date.set(moment(this.data().getEnd()));
|
||||
}
|
||||
|
||||
@@ -237,7 +237,7 @@ class CardReceivedDate extends CardDate {
|
||||
const theDate = this.date.get();
|
||||
// if dueAt, endAt and startAt exist & are > receivedAt, receivedAt doesn't need to be flagged
|
||||
if (
|
||||
(startAt && theDate.isAfter(dueAt)) ||
|
||||
(startAt && theDate.isAfter(startAt)) ||
|
||||
(endAt && theDate.isAfter(endAt)) ||
|
||||
(dueAt && theDate.isAfter(dueAt))
|
||||
)
|
||||
@@ -344,9 +344,9 @@ class CardEndDate extends CardDate {
|
||||
let classes = 'end-date' + ' ';
|
||||
const dueAt = this.data().getDue();
|
||||
const theDate = this.date.get();
|
||||
if (theDate.diff(dueAt, 'days') >= 2) classes += 'long-overdue';
|
||||
else if (theDate.diff(dueAt, 'days') >= 0) classes += 'due';
|
||||
else if (theDate.diff(dueAt, 'days') >= -2) classes += 'almost-due';
|
||||
if (!dueAt) classes += '';
|
||||
else if (theDate.isBefore(dueAt)) classes += 'current';
|
||||
else if (theDate.isAfter(dueAt)) classes += 'due';
|
||||
return classes;
|
||||
}
|
||||
|
||||
|
||||
@@ -4,9 +4,14 @@ template(name="cardDetails")
|
||||
+inlinedForm(classNames="js-card-details-title")
|
||||
+editCardTitleForm
|
||||
else
|
||||
a.fa.fa-times-thin.close-card-details.js-close-card-details
|
||||
if currentUser.isBoardMember
|
||||
a.fa.fa-navicon.card-details-menu.js-open-card-details-menu
|
||||
unless isMiniScreen
|
||||
a.fa.fa-times-thin.close-card-details.js-close-card-details
|
||||
if currentUser.isBoardMember
|
||||
a.fa.fa-navicon.card-details-menu.js-open-card-details-menu
|
||||
if isMiniScreen
|
||||
a.fa.fa-times-thin.close-card-details-mobile-web.js-close-card-details
|
||||
if currentUser.isBoardMember
|
||||
a.fa.fa-navicon.card-details-menu-mobile-web.js-open-card-details-menu
|
||||
h2.card-details-title.js-card-title(
|
||||
class="{{#if canModifyCard}}js-open-inlined-form is-editable{{/if}}")
|
||||
+viewer
|
||||
@@ -73,6 +78,16 @@ template(name="cardDetails")
|
||||
a.member.add-member.card-details-item-add-button.js-add-members(title="{{_ 'card-members-title'}}")
|
||||
i.fa.fa-plus
|
||||
|
||||
.card-details-item.card-details-item-assignees
|
||||
h3.card-details-item-title {{_ 'assignee'}}
|
||||
each getAssignees
|
||||
+userAvatarAssignee(userId=this cardId=../_id)
|
||||
| {{! XXX Hack to hide syntaxic coloration /// }}
|
||||
if canModifyCard
|
||||
unless assigneeSelected
|
||||
a.assignee.add-assignee.card-details-item-add-button.js-add-assignees(title="{{_ 'assignee'}}")
|
||||
i.fa.fa-plus
|
||||
|
||||
.card-details-item.card-details-item-labels
|
||||
h3.card-details-item-title {{_ 'labels'}}
|
||||
a(class="{{#if canModifyCard}}js-add-labels{{else}}is-disabled{{/if}}" title="{{_ 'card-labels-title'}}")
|
||||
@@ -296,6 +311,54 @@ template(name="cardMembersPopup")
|
||||
if isCardMember
|
||||
i.fa.fa-check
|
||||
|
||||
template(name="cardAssigneesPopup")
|
||||
ul.pop-over-list.js-card-assignee-list
|
||||
each board.activeMembers
|
||||
li.item(class="{{#if isCardAssignee}}active{{/if}}")
|
||||
a.name.js-select-assignee(href="#")
|
||||
+userAvatar(userId=user._id)
|
||||
span.full-name
|
||||
= user.profile.fullname
|
||||
| (<span class="username">{{ user.username }}</span>)
|
||||
if isCardAssignee
|
||||
i.fa.fa-check
|
||||
|
||||
template(name="userAvatarAssignee")
|
||||
a.assignee.js-assignee(title="{{userData.profile.fullname}} ({{userData.username}})")
|
||||
if userData.profile.avatarUrl
|
||||
img.avatar.avatar-image(src="{{userData.profile.avatarUrl}}")
|
||||
else
|
||||
+userAvatarAssigneeInitials(userId=userData._id)
|
||||
|
||||
if showStatus
|
||||
span.assignee-presence-status(class=presenceStatusClassName)
|
||||
span.member-type(class=memberType)
|
||||
|
||||
unless isSandstorm
|
||||
if showEdit
|
||||
if $eq currentUser._id userData._id
|
||||
a.edit-avatar.js-change-avatar
|
||||
i.fa.fa-pencil
|
||||
|
||||
template(name="cardAssigneePopup")
|
||||
.board-assignee-menu
|
||||
.mini-profile-info
|
||||
+userAvatar(userId=user._id showEdit=true)
|
||||
.info
|
||||
h3= user.profile.fullname
|
||||
p.quiet @{{ user.username }}
|
||||
ul.pop-over-list
|
||||
if currentUser.isNotCommentOnly
|
||||
li: a.js-remove-assignee {{_ 'remove-member-from-card'}}
|
||||
|
||||
if $eq currentUser._id user._id
|
||||
with currentUser
|
||||
li: a.js-edit-profile {{_ 'edit-profile'}}
|
||||
|
||||
template(name="userAvatarAssigneeInitials")
|
||||
svg.avatar.avatar-assignee-initials(viewBox="0 0 {{viewPortWidth}} 15")
|
||||
text(x="50%" y="13" text-anchor="middle")= initials
|
||||
|
||||
template(name="cardMorePopup")
|
||||
p.quiet
|
||||
span.clearfix
|
||||
|
||||
@@ -121,11 +121,6 @@ BlazeComponent.extendComponent({
|
||||
// Send Webhook but not create Activities records ---
|
||||
const card = this.currentData();
|
||||
const userId = Meteor.userId();
|
||||
//console.log(`userId: ${userId}`);
|
||||
//console.log(`cardId: ${card._id}`);
|
||||
//console.log(`boardId: ${card.boardId}`);
|
||||
//console.log(`listId: ${card.listId}`);
|
||||
//console.log(`swimlaneId: ${card.swimlaneId}`);
|
||||
const params = {
|
||||
userId,
|
||||
cardId: card._id,
|
||||
@@ -134,16 +129,25 @@ BlazeComponent.extendComponent({
|
||||
user: Meteor.user().username,
|
||||
url: '',
|
||||
};
|
||||
//console.log('looking for integrations...');
|
||||
|
||||
const integrations = Integrations.find({
|
||||
boardId: card.boardId,
|
||||
type: 'outgoing-webhooks',
|
||||
boardId: { $in: [card.boardId, Integrations.Const.GLOBAL_WEBHOOK_ID] },
|
||||
enabled: true,
|
||||
activities: { $in: ['CardDetailsRendered', 'all'] },
|
||||
}).fetch();
|
||||
//console.log(`Investigation length: ${integrations.length}`);
|
||||
|
||||
if (integrations.length > 0) {
|
||||
Meteor.call('outgoingWebhooks', integrations, 'CardSelected', params);
|
||||
integrations.forEach(integration => {
|
||||
Meteor.call(
|
||||
'outgoingWebhooks',
|
||||
integration,
|
||||
'CardSelected',
|
||||
params,
|
||||
() => {
|
||||
return;
|
||||
},
|
||||
);
|
||||
});
|
||||
}
|
||||
//-------------
|
||||
}
|
||||
@@ -287,6 +291,8 @@ BlazeComponent.extendComponent({
|
||||
.trim();
|
||||
if (title) {
|
||||
this.data().setTitle(title);
|
||||
} else {
|
||||
this.data().setTitle('');
|
||||
}
|
||||
},
|
||||
'submit .js-card-details-assigner'(event) {
|
||||
@@ -296,6 +302,8 @@ BlazeComponent.extendComponent({
|
||||
.trim();
|
||||
if (assigner) {
|
||||
this.data().setAssignedBy(assigner);
|
||||
} else {
|
||||
this.data().setAssignedBy('');
|
||||
}
|
||||
},
|
||||
'submit .js-card-details-requester'(event) {
|
||||
@@ -305,10 +313,14 @@ BlazeComponent.extendComponent({
|
||||
.trim();
|
||||
if (requester) {
|
||||
this.data().setRequestedBy(requester);
|
||||
} else {
|
||||
this.data().setRequestedBy('');
|
||||
}
|
||||
},
|
||||
'click .js-member': Popup.open('cardMember'),
|
||||
'click .js-add-members': Popup.open('cardMembers'),
|
||||
'click .js-assignee': Popup.open('cardAssignee'),
|
||||
'click .js-add-assignees': Popup.open('cardAssignees'),
|
||||
'click .js-add-labels': Popup.open('cardLabels'),
|
||||
'click .js-received-date': Popup.open('editCardReceivedDate'),
|
||||
'click .js-start-date': Popup.open('editCardStartDate'),
|
||||
@@ -342,6 +354,58 @@ BlazeComponent.extendComponent({
|
||||
},
|
||||
}).register('cardDetails');
|
||||
|
||||
Template.cardDetails.helpers({
|
||||
userData() {
|
||||
// We need to handle a special case for the search results provided by the
|
||||
// `matteodem:easy-search` package. Since these results gets published in a
|
||||
// separate collection, and not in the standard Meteor.Users collection as
|
||||
// expected, we use a component parameter ("property") to distinguish the
|
||||
// two cases.
|
||||
const userCollection = this.esSearch ? ESSearchResults : Users;
|
||||
return userCollection.findOne(this.userId, {
|
||||
fields: {
|
||||
profile: 1,
|
||||
username: 1,
|
||||
},
|
||||
});
|
||||
},
|
||||
|
||||
assigneeSelected() {
|
||||
if (this.getAssignees().length === 0) {
|
||||
return false;
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
},
|
||||
|
||||
memberType() {
|
||||
const user = Users.findOne(this.userId);
|
||||
return user && user.isBoardAdmin() ? 'admin' : 'normal';
|
||||
},
|
||||
|
||||
presenceStatusClassName() {
|
||||
const user = Users.findOne(this.userId);
|
||||
const userPresence = presences.findOne({ userId: this.userId });
|
||||
if (user && user.isInvitedTo(Session.get('currentBoard'))) return 'pending';
|
||||
else if (!userPresence) return 'disconnected';
|
||||
else if (Session.equals('currentBoard', userPresence.state.currentBoardId))
|
||||
return 'active';
|
||||
else return 'idle';
|
||||
},
|
||||
});
|
||||
|
||||
Template.userAvatarAssigneeInitials.helpers({
|
||||
initials() {
|
||||
const user = Users.findOne(this.userId);
|
||||
return user && user.getInitials();
|
||||
},
|
||||
|
||||
viewPortWidth() {
|
||||
const user = Users.findOne(this.userId);
|
||||
return ((user && user.getInitials().length) || 1) * 12;
|
||||
},
|
||||
});
|
||||
|
||||
// We extends the normal InlinedForm component to support UnsavedEdits draft
|
||||
// feature.
|
||||
(class extends InlinedForm {
|
||||
@@ -399,6 +463,7 @@ Template.cardDetailsActionsPopup.helpers({
|
||||
|
||||
Template.cardDetailsActionsPopup.events({
|
||||
'click .js-members': Popup.open('cardMembers'),
|
||||
'click .js-assignees': Popup.open('cardAssignees'),
|
||||
'click .js-labels': Popup.open('cardLabels'),
|
||||
'click .js-attachments': Popup.open('cardAttachments'),
|
||||
'click .js-custom-fields': Popup.open('cardCustomFields'),
|
||||
@@ -806,3 +871,76 @@ EscapeActions.register(
|
||||
noClickEscapeOn: '.js-card-details,.board-sidebar,#header',
|
||||
},
|
||||
);
|
||||
|
||||
Template.cardAssigneesPopup.events({
|
||||
'click .js-select-assignee'(event) {
|
||||
const card = Cards.findOne(Session.get('currentCard'));
|
||||
const assigneeId = this.userId;
|
||||
card.toggleAssignee(assigneeId);
|
||||
event.preventDefault();
|
||||
},
|
||||
});
|
||||
|
||||
Template.cardAssigneesPopup.helpers({
|
||||
isCardAssignee() {
|
||||
const card = Template.parentData();
|
||||
const cardAssignees = card.getAssignees();
|
||||
|
||||
return _.contains(cardAssignees, this.userId);
|
||||
},
|
||||
|
||||
user() {
|
||||
return Users.findOne(this.userId);
|
||||
},
|
||||
});
|
||||
|
||||
Template.cardAssigneePopup.helpers({
|
||||
userData() {
|
||||
// We need to handle a special case for the search results provided by the
|
||||
// `matteodem:easy-search` package. Since these results gets published in a
|
||||
// separate collection, and not in the standard Meteor.Users collection as
|
||||
// expected, we use a component parameter ("property") to distinguish the
|
||||
// two cases.
|
||||
const userCollection = this.esSearch ? ESSearchResults : Users;
|
||||
return userCollection.findOne(this.userId, {
|
||||
fields: {
|
||||
profile: 1,
|
||||
username: 1,
|
||||
},
|
||||
});
|
||||
},
|
||||
|
||||
memberType() {
|
||||
const user = Users.findOne(this.userId);
|
||||
return user && user.isBoardAdmin() ? 'admin' : 'normal';
|
||||
},
|
||||
|
||||
presenceStatusClassName() {
|
||||
const user = Users.findOne(this.userId);
|
||||
const userPresence = presences.findOne({ userId: this.userId });
|
||||
if (user && user.isInvitedTo(Session.get('currentBoard'))) return 'pending';
|
||||
else if (!userPresence) return 'disconnected';
|
||||
else if (Session.equals('currentBoard', userPresence.state.currentBoardId))
|
||||
return 'active';
|
||||
else return 'idle';
|
||||
},
|
||||
|
||||
isCardAssignee() {
|
||||
const card = Template.parentData();
|
||||
const cardAssignees = card.getAssignees();
|
||||
|
||||
return _.contains(cardAssignees, this.userId);
|
||||
},
|
||||
|
||||
user() {
|
||||
return Users.findOne(this.userId);
|
||||
},
|
||||
});
|
||||
|
||||
Template.cardAssigneePopup.events({
|
||||
'click .js-remove-assignee'() {
|
||||
Cards.findOne(this.cardId).unassignAssignee(this.userId);
|
||||
Popup.close();
|
||||
},
|
||||
'click .js-edit-profile': Popup.open('editProfile'),
|
||||
});
|
||||
@@ -1,5 +1,80 @@
|
||||
@import 'nib'
|
||||
|
||||
// Assignee, code copied from wekan/client/users/userAvatar.styl
|
||||
|
||||
avatar-radius = 50%
|
||||
|
||||
.assignee
|
||||
border-radius: 3px
|
||||
display: block
|
||||
position: relative
|
||||
float: left
|
||||
height: 30px
|
||||
width: @height
|
||||
margin: 0 4px 4px 0
|
||||
cursor: pointer
|
||||
user-select: none
|
||||
z-index: 1
|
||||
text-decoration: none
|
||||
border-radius: avatar-radius
|
||||
|
||||
.avatar
|
||||
overflow: hidden
|
||||
border-radius: avatar-radius
|
||||
|
||||
&.avatar-assignee-initials
|
||||
height: 70%
|
||||
width: @height
|
||||
padding: 15%
|
||||
background-color: #dbdbdb
|
||||
color: #444444
|
||||
position: absolute
|
||||
|
||||
&.avatar-image
|
||||
height: 100%
|
||||
width: @height
|
||||
|
||||
.assignee-presence-status
|
||||
background-color: #b3b3b3
|
||||
border: 1px solid #fff
|
||||
border-radius: 50%
|
||||
height: 7px
|
||||
width: @height
|
||||
position: absolute
|
||||
right: -1px
|
||||
bottom: -1px
|
||||
border: 1px solid white
|
||||
z-index: 15
|
||||
|
||||
&.active
|
||||
background: #64c464
|
||||
border-color: #daf1da
|
||||
|
||||
&.idle
|
||||
background: #e4e467
|
||||
border-color: #f7f7d4
|
||||
|
||||
&.disconnected
|
||||
background: #bdbdbd
|
||||
border-color: #ededed
|
||||
|
||||
&.pending
|
||||
background: #e44242
|
||||
border-color: #f1dada
|
||||
|
||||
|
||||
|
||||
&.add-assignee
|
||||
display: flex
|
||||
align-items: center
|
||||
justify-content: center
|
||||
box-shadow: 0 0 0 2px darken(white, 25%) inset
|
||||
|
||||
&:hover, &.is-active
|
||||
box-shadow: 0 0 0 2px darken(white, 60%) inset
|
||||
|
||||
// Other card details
|
||||
|
||||
.card-details
|
||||
padding: 0
|
||||
flex-shrink: 0
|
||||
@@ -32,7 +107,9 @@
|
||||
border-bottom: 1px solid darken(white, 14%)
|
||||
|
||||
.close-card-details,
|
||||
.card-details-menu
|
||||
.card-details-menu,
|
||||
.close-card-details-mobile-web,
|
||||
.card-details-menu-mobile-web
|
||||
float: right
|
||||
|
||||
.close-card-details
|
||||
@@ -40,10 +117,20 @@
|
||||
padding: 5px
|
||||
margin-right: -8px
|
||||
|
||||
.close-card-details-mobile-web
|
||||
font-size: 24px
|
||||
padding: 5px
|
||||
margin-right: 40px
|
||||
|
||||
.card-details-menu
|
||||
font-size: 17px
|
||||
padding: 10px
|
||||
|
||||
.card-details-menu-mobile-web
|
||||
font-size: 17px
|
||||
padding: 10px
|
||||
margin-right: 30px
|
||||
|
||||
.card-details-watch
|
||||
font-size: 17px
|
||||
padding-left: 7px
|
||||
@@ -93,6 +180,7 @@
|
||||
margin-right: 0
|
||||
&.card-details-item-labels,
|
||||
&.card-details-item-members,
|
||||
&.card-details-item-assignees,
|
||||
&.card-details-item-received,
|
||||
&.card-details-item-start,
|
||||
&.card-details-item-due,
|
||||
|
||||
@@ -3,6 +3,13 @@ template(name="minicard")
|
||||
class="{{#if isLinkedCard}}linked-card{{/if}}"
|
||||
class="{{#if isLinkedBoard}}linked-board{{/if}}"
|
||||
class="minicard-{{colorClass}}")
|
||||
if isMiniScreen
|
||||
.handle
|
||||
.fa.fa-arrows
|
||||
unless isMiniScreen
|
||||
if showDesktopDragHandles
|
||||
.handle
|
||||
.fa.fa-arrows
|
||||
if cover
|
||||
.minicard-cover(style="background-image: url('{{cover.url}}');")
|
||||
if labels
|
||||
@@ -15,8 +22,6 @@ template(name="minicard")
|
||||
if hiddenMinicardLabelText
|
||||
.minicard-label(class="card-label-{{color}}" title="{{name}}")
|
||||
.minicard-title
|
||||
.handle
|
||||
.fa.fa-arrows
|
||||
if $eq 'prefix-with-full-path' currentBoard.presentParentTask
|
||||
.parent-prefix
|
||||
| {{ parentString ' > ' }}
|
||||
@@ -53,6 +58,8 @@ template(name="minicard")
|
||||
if getDue
|
||||
.date
|
||||
+minicardDueDate
|
||||
if getEnd
|
||||
+minicardEndDate
|
||||
if getSpentTime
|
||||
.date
|
||||
+cardSpentTime
|
||||
@@ -60,14 +67,21 @@ template(name="minicard")
|
||||
.minicard-custom-fields
|
||||
each customFieldsWD
|
||||
if definition.showOnCard
|
||||
.minicard-custom-field
|
||||
if definition.showLabelOnMiniCard
|
||||
if trueValue
|
||||
.minicard-custom-field
|
||||
if definition.showLabelOnMiniCard
|
||||
.minicard-custom-field-item
|
||||
+viewer
|
||||
= definition.name
|
||||
.minicard-custom-field-item
|
||||
+viewer
|
||||
= definition.name
|
||||
.minicard-custom-field-item
|
||||
+viewer
|
||||
= trueValue
|
||||
= trueValue
|
||||
|
||||
if getAssignees
|
||||
.minicard-assignees.js-minicard-assignees
|
||||
each getAssignees
|
||||
+userAvatar(userId=this)
|
||||
hr
|
||||
|
||||
if getMembers
|
||||
.minicard-members.js-minicard-members
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import { Cookies } from 'meteor/ostrio:cookies';
|
||||
const cookies = new Cookies();
|
||||
// Template.cards.events({
|
||||
// 'click .member': Popup.open('cardMember')
|
||||
// });
|
||||
@@ -18,7 +20,11 @@ BlazeComponent.extendComponent({
|
||||
},
|
||||
{
|
||||
'click .js-toggle-minicard-label-text'() {
|
||||
Meteor.call('toggleMinicardLabelText');
|
||||
if (cookies.has('hiddenMinicardLabelText')) {
|
||||
cookies.remove('hiddenMinicardLabelText'); //true
|
||||
} else {
|
||||
cookies.set('hiddenMinicardLabelText', 'true'); //true
|
||||
}
|
||||
},
|
||||
},
|
||||
];
|
||||
@@ -26,7 +32,28 @@ BlazeComponent.extendComponent({
|
||||
}).register('minicard');
|
||||
|
||||
Template.minicard.helpers({
|
||||
showDesktopDragHandles() {
|
||||
currentUser = Meteor.user();
|
||||
if (currentUser) {
|
||||
return (currentUser.profile || {}).showDesktopDragHandles;
|
||||
} else {
|
||||
if (cookies.has('showDesktopDragHandles')) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
},
|
||||
hiddenMinicardLabelText() {
|
||||
return Meteor.user().hasHiddenMinicardLabelText();
|
||||
currentUser = Meteor.user();
|
||||
if (currentUser) {
|
||||
return (currentUser.profile || {}).hiddenMinicardLabelText;
|
||||
} else {
|
||||
if (cookies.has('hiddenMinicardLabelText')) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -105,8 +105,7 @@
|
||||
right: 5px;
|
||||
top: 5px;
|
||||
display:none;
|
||||
// @media only screen and (max-width: 1199px) {
|
||||
@media only screen and (max-width: 800px) {
|
||||
@media only screen {
|
||||
display:block;
|
||||
}
|
||||
.fa-arrows
|
||||
@@ -128,7 +127,7 @@
|
||||
.badges
|
||||
float: left
|
||||
margin-top: 7px
|
||||
color: darken(white, 80%)
|
||||
color: darken(white, 50%)
|
||||
|
||||
&:empty
|
||||
display: none
|
||||
@@ -161,9 +160,10 @@
|
||||
padding-left: 0px
|
||||
line-height: 12px
|
||||
|
||||
.minicard-members
|
||||
.minicard-members,
|
||||
.minicard-assignees
|
||||
float: right
|
||||
margin: 2px -8px -2px 0
|
||||
margin: 2px -8px 12px 0
|
||||
|
||||
.member
|
||||
float: right
|
||||
@@ -171,10 +171,17 @@
|
||||
height: 28px
|
||||
width: @height
|
||||
|
||||
.assignee
|
||||
float: right
|
||||
border-radius: 50%
|
||||
height: 28px
|
||||
width: @height
|
||||
|
||||
+ .badges
|
||||
margin-top: 10px
|
||||
|
||||
.minicard-members:empty
|
||||
.minicard-members:empty,
|
||||
.minicard-assignees:empty
|
||||
display: none
|
||||
|
||||
&.minicard-composer
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import { Cookies } from 'meteor/ostrio:cookies';
|
||||
const cookies = new Cookies();
|
||||
const { calculateIndex, enableClickOnTouch } = Utils;
|
||||
|
||||
BlazeComponent.extendComponent({
|
||||
@@ -31,12 +33,6 @@ BlazeComponent.extendComponent({
|
||||
const itemsSelector = '.js-minicard:not(.placeholder, .js-card-composer)';
|
||||
const $cards = this.$('.js-minicards');
|
||||
|
||||
if (Utils.isMiniScreen()) {
|
||||
$('.js-minicards').sortable({
|
||||
handle: '.handle',
|
||||
});
|
||||
}
|
||||
|
||||
$cards.sortable({
|
||||
connectWith: '.js-minicards:not(.js-list-full)',
|
||||
tolerance: 'pointer',
|
||||
@@ -79,16 +75,15 @@ BlazeComponent.extendComponent({
|
||||
const listId = Blaze.getData(ui.item.parents('.list').get(0))._id;
|
||||
const currentBoard = Boards.findOne(Session.get('currentBoard'));
|
||||
let swimlaneId = '';
|
||||
const boardView = (Meteor.user().profile || {}).boardView;
|
||||
if (
|
||||
boardView === 'board-view-swimlanes' ||
|
||||
Utils.boardView() === 'board-view-swimlanes' ||
|
||||
currentBoard.isTemplatesBoard()
|
||||
)
|
||||
swimlaneId = Blaze.getData(ui.item.parents('.swimlane').get(0))._id;
|
||||
else if (
|
||||
boardView === 'board-view-lists' ||
|
||||
boardView === 'board-view-cal' ||
|
||||
!boardView
|
||||
Utils.boardView() === 'board-view-lists' ||
|
||||
Utils.boardView() === 'board-view-cal' ||
|
||||
!Utils.boardView
|
||||
)
|
||||
swimlaneId = currentBoard.getDefaultSwimline()._id;
|
||||
|
||||
@@ -122,8 +117,29 @@ BlazeComponent.extendComponent({
|
||||
// ugly touch event hotfix
|
||||
enableClickOnTouch(itemsSelector);
|
||||
|
||||
// Disable drag-dropping if the current user is not a board member or is comment only
|
||||
this.autorun(() => {
|
||||
let showDesktopDragHandles = false;
|
||||
currentUser = Meteor.user();
|
||||
if (currentUser) {
|
||||
showDesktopDragHandles = (currentUser.profile || {})
|
||||
.showDesktopDragHandles;
|
||||
} else if (cookies.has('showDesktopDragHandles')) {
|
||||
showDesktopDragHandles = true;
|
||||
} else {
|
||||
showDesktopDragHandles = false;
|
||||
}
|
||||
|
||||
if (!Utils.isMiniScreen() && showDesktopDragHandles) {
|
||||
$cards.sortable({
|
||||
handle: '.handle',
|
||||
});
|
||||
} else {
|
||||
$cards.sortable({
|
||||
handle: '.minicard',
|
||||
});
|
||||
}
|
||||
|
||||
// Disable drag-dropping if the current user is not a board member or is comment only
|
||||
$cards.sortable('option', 'disabled', !userIsMember());
|
||||
});
|
||||
|
||||
@@ -155,6 +171,21 @@ BlazeComponent.extendComponent({
|
||||
},
|
||||
}).register('list');
|
||||
|
||||
Template.list.helpers({
|
||||
showDesktopDragHandles() {
|
||||
currentUser = Meteor.user();
|
||||
if (currentUser) {
|
||||
return (currentUser.profile || {}).showDesktopDragHandles;
|
||||
} else {
|
||||
if (cookies.has('showDesktopDragHandles')) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
Template.miniList.events({
|
||||
'click .js-select-list'() {
|
||||
const listId = this._id;
|
||||
|
||||
@@ -84,17 +84,16 @@
|
||||
padding-left: 10px
|
||||
color: #a6a6a6
|
||||
|
||||
|
||||
.list-header-menu
|
||||
position: absolute
|
||||
padding: 27px 19px
|
||||
margin-top: 1px
|
||||
top: -7px
|
||||
right: -7px
|
||||
right: 3px
|
||||
|
||||
.list-header-plus-icon
|
||||
color: #a6a6a6
|
||||
margin-right: 10px
|
||||
margin-right: 15px
|
||||
|
||||
.highlight
|
||||
color: #ce1414
|
||||
@@ -165,7 +164,16 @@
|
||||
|
||||
@media screen and (max-width: 800px)
|
||||
.list-header-menu
|
||||
margin-right: 30px
|
||||
position: absolute
|
||||
padding: 27px 19px
|
||||
margin-top: 1px
|
||||
top: -7px
|
||||
margin-right: 7px
|
||||
right: -3px
|
||||
|
||||
.list-header
|
||||
.list-header-name
|
||||
margin-left: 1.4rem
|
||||
|
||||
.mini-list
|
||||
flex: 0 0 60px
|
||||
@@ -221,9 +229,17 @@
|
||||
padding: 7px
|
||||
top: 50%
|
||||
transform: translateY(-50%)
|
||||
right: 17px
|
||||
right: 47px
|
||||
font-size: 20px
|
||||
|
||||
.list-header-handle
|
||||
position: absolute
|
||||
padding: 7px
|
||||
top: 50%
|
||||
transform: translateY(-50%)
|
||||
right: 10px
|
||||
font-size: 24px
|
||||
|
||||
.link-board-wrapper
|
||||
display: flex
|
||||
align-items: baseline
|
||||
|
||||
@@ -48,7 +48,6 @@ BlazeComponent.extendComponent({
|
||||
const board = this.data().board();
|
||||
let linkedId = '';
|
||||
let swimlaneId = '';
|
||||
const boardView = (Meteor.user().profile || {}).boardView;
|
||||
let cardType = 'cardType-card';
|
||||
if (title) {
|
||||
if (board.isTemplatesBoard()) {
|
||||
@@ -71,14 +70,14 @@ BlazeComponent.extendComponent({
|
||||
});
|
||||
cardType = 'cardType-linkedBoard';
|
||||
}
|
||||
} else if (boardView === 'board-view-swimlanes')
|
||||
} else if (Utils.boardView() === 'board-view-swimlanes')
|
||||
swimlaneId = this.parentComponent()
|
||||
.parentComponent()
|
||||
.data()._id;
|
||||
else if (
|
||||
boardView === 'board-view-lists' ||
|
||||
boardView === 'board-view-cal' ||
|
||||
!boardView
|
||||
Utils.boardView() === 'board-view-lists' ||
|
||||
Utils.boardView() === 'board-view-cal' ||
|
||||
!Utils.boardView
|
||||
)
|
||||
swimlaneId = board.getDefaultSwimline()._id;
|
||||
|
||||
@@ -157,9 +156,8 @@ BlazeComponent.extendComponent({
|
||||
},
|
||||
|
||||
idOrNull(swimlaneId) {
|
||||
const currentUser = Meteor.user();
|
||||
if (
|
||||
(currentUser.profile || {}).boardView === 'board-view-swimlanes' ||
|
||||
Utils.boardView() === 'board-view-swimlanes' ||
|
||||
this.data()
|
||||
.board()
|
||||
.isTemplatesBoard()
|
||||
@@ -397,10 +395,9 @@ BlazeComponent.extendComponent({
|
||||
'.js-swimlane',
|
||||
);
|
||||
this.swimlaneId = '';
|
||||
const boardView = (Meteor.user().profile || {}).boardView;
|
||||
if (boardView === 'board-view-swimlanes')
|
||||
if (Utils.boardView() === 'board-view-swimlanes')
|
||||
this.swimlaneId = Blaze.getData(swimlane[0])._id;
|
||||
else if (boardView === 'board-view-lists' || !boardView)
|
||||
else if (Utils.boardView() === 'board-view-lists' || !Utils.boardView)
|
||||
this.swimlaneId = Swimlanes.findOne({ boardId: this.boardId })._id;
|
||||
},
|
||||
|
||||
@@ -580,7 +577,7 @@ BlazeComponent.extendComponent({
|
||||
const swimlane = $(Popup._getTopStack().openerElement).parents(
|
||||
'.js-swimlane',
|
||||
);
|
||||
if ((Meteor.user().profile || {}).boardView === 'board-view-swimlanes')
|
||||
if (Utils.boardView() === 'board-view-swimlanes')
|
||||
this.swimlaneId = Blaze.getData(swimlane[0])._id;
|
||||
else this.swimlaneId = Swimlanes.findOne({ boardId: this.boardId })._id;
|
||||
// List where to insert card
|
||||
@@ -709,22 +706,18 @@ BlazeComponent.extendComponent({
|
||||
if (isSandstorm) {
|
||||
const user = Meteor.user();
|
||||
if (user) {
|
||||
const boardView = (Meteor.user().profile || {}).boardView;
|
||||
if (boardView === 'board-view-swimlanes') {
|
||||
if (Utils.boardView() === 'board-view-swimlanes') {
|
||||
this.swimlaneId = this.parentComponent()
|
||||
.parentComponent()
|
||||
.parentComponent()
|
||||
.data()._id;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
const boardView = (Meteor.user().profile || {}).boardView;
|
||||
if (boardView === 'board-view-swimlanes') {
|
||||
this.swimlaneId = this.parentComponent()
|
||||
.parentComponent()
|
||||
.parentComponent()
|
||||
.data()._id;
|
||||
}
|
||||
} else if (Utils.boardView() === 'board-view-swimlanes') {
|
||||
this.swimlaneId = this.parentComponent()
|
||||
.parentComponent()
|
||||
.parentComponent()
|
||||
.data()._id;
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ template(name="listHeader")
|
||||
if currentList
|
||||
a.list-header-left-icon.fa.fa-angle-left.js-unselect-list
|
||||
h2.list-header-name(
|
||||
title="{{ moment modifiedAt 'LLL' }}"
|
||||
class="{{#if currentUser.isBoardMember}}{{#unless currentUser.isCommentOnly}}js-open-inlined-form is-editable{{/unless}}{{/if}}")
|
||||
+viewer
|
||||
= title
|
||||
@@ -29,16 +30,22 @@ template(name="listHeader")
|
||||
if canSeeAddCard
|
||||
a.js-add-card.fa.fa-plus.list-header-plus-icon
|
||||
a.fa.fa-navicon.js-open-list-menu
|
||||
a.list-header-handle.handle.fa.fa-arrows.js-list-handle
|
||||
else
|
||||
a.list-header-menu-icon.fa.fa-angle-right.js-select-list
|
||||
a.list-header-handle.handle.fa.fa-arrows.js-list-handle
|
||||
else if currentUser.isBoardMember
|
||||
if isWatching
|
||||
i.list-header-watch-icon.fa.fa-eye
|
||||
div.list-header-menu
|
||||
unless currentUser.isCommentOnly
|
||||
//if isBoardAdmin
|
||||
// a.fa.js-list-star.list-header-plus-icon(class="fa-star{{#unless starred}}-o{{/unless}}")
|
||||
if canSeeAddCard
|
||||
a.js-add-card.fa.fa-plus.list-header-plus-icon
|
||||
a.fa.fa-navicon.js-open-list-menu
|
||||
if showDesktopDragHandles
|
||||
a.list-header-handle.handle.fa.fa-arrows.js-list-handle
|
||||
|
||||
template(name="editListTitleForm")
|
||||
.list-composer
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import { Cookies } from 'meteor/ostrio:cookies';
|
||||
const cookies = new Cookies();
|
||||
let listsColors;
|
||||
Meteor.startup(() => {
|
||||
listsColors = Lists.simpleSchema()._schema.color.allowedValues;
|
||||
@@ -13,6 +15,20 @@ BlazeComponent.extendComponent({
|
||||
);
|
||||
},
|
||||
|
||||
isBoardAdmin() {
|
||||
return Meteor.user().isBoardAdmin();
|
||||
},
|
||||
starred(check = undefined) {
|
||||
const list = Template.currentData();
|
||||
const status = list.isStarred();
|
||||
if (check === undefined) {
|
||||
// just check
|
||||
return status;
|
||||
} else {
|
||||
list.star(!status);
|
||||
return !status;
|
||||
}
|
||||
},
|
||||
editTitle(event) {
|
||||
event.preventDefault();
|
||||
const newTitle = this.childComponents('inlinedForm')[0]
|
||||
@@ -30,14 +46,18 @@ BlazeComponent.extendComponent({
|
||||
},
|
||||
|
||||
limitToShowCardsCount() {
|
||||
return Meteor.user().getLimitToShowCardsCount();
|
||||
const currentUser = Meteor.user();
|
||||
if (currentUser) {
|
||||
return Meteor.user().getLimitToShowCardsCount();
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
},
|
||||
|
||||
cardsCount() {
|
||||
const list = Template.currentData();
|
||||
let swimlaneId = '';
|
||||
const boardView = (Meteor.user().profile || {}).boardView;
|
||||
if (boardView === 'board-view-swimlanes')
|
||||
if (Utils.boardView() === 'board-view-swimlanes')
|
||||
swimlaneId = this.parentComponent()
|
||||
.parentComponent()
|
||||
.data()._id;
|
||||
@@ -61,6 +81,10 @@ BlazeComponent.extendComponent({
|
||||
events() {
|
||||
return [
|
||||
{
|
||||
'click .js-list-star'(event) {
|
||||
event.preventDefault();
|
||||
this.starred(!this.starred());
|
||||
},
|
||||
'click .js-open-list-menu': Popup.open('listAction'),
|
||||
'click .js-add-card'(event) {
|
||||
const listDom = $(event.target).parents(
|
||||
@@ -80,6 +104,21 @@ BlazeComponent.extendComponent({
|
||||
},
|
||||
}).register('listHeader');
|
||||
|
||||
Template.listHeader.helpers({
|
||||
showDesktopDragHandles() {
|
||||
currentUser = Meteor.user();
|
||||
if (currentUser) {
|
||||
return (currentUser.profile || {}).showDesktopDragHandles;
|
||||
} else {
|
||||
if (cookies.has('showDesktopDragHandles')) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
Template.listActionPopup.helpers({
|
||||
isWipLimitEnabled() {
|
||||
return Template.currentData().getWipLimit('enabled');
|
||||
|
||||
@@ -130,7 +130,8 @@ $popupWidth = 300px
|
||||
.popup-container-depth-{depth}
|
||||
transform: translateX(- depth * $popupWidth)
|
||||
|
||||
.select-members-list
|
||||
.select-members-list,
|
||||
.select-avatars-list
|
||||
margin-bottom: 8px
|
||||
|
||||
.pop-over-list
|
||||
@@ -230,7 +231,8 @@ $popupWidth = 300px
|
||||
min-height: 56px
|
||||
position: relative
|
||||
|
||||
.member
|
||||
.member,
|
||||
.avatar
|
||||
position: absolute
|
||||
top: 2px
|
||||
left: 2px
|
||||
|
||||
@@ -39,26 +39,55 @@ template(name="peopleGeneral")
|
||||
|
||||
template(name="peopleRow")
|
||||
tr
|
||||
td.username {{ userData.username }}
|
||||
td {{ userData.profile.fullname }}
|
||||
td
|
||||
if userData.isAdmin
|
||||
| {{_ 'yes'}}
|
||||
else
|
||||
| {{_ 'no'}}
|
||||
td {{ userData.emails.[0].address }}
|
||||
td
|
||||
if userData.emails.[0].verified
|
||||
| {{_ 'yes'}}
|
||||
else
|
||||
| {{_ 'no'}}
|
||||
td {{ moment userData.createdAt 'LLL' }}
|
||||
if userData.loginDisabled
|
||||
td.username <s>{{ userData.username }}</s>
|
||||
else
|
||||
td.username {{ userData.username }}
|
||||
if userData.loginDisabled
|
||||
td <s>{{ userData.profile.fullname }}</s>
|
||||
else
|
||||
td {{ userData.profile.fullname }}
|
||||
if userData.loginDisabled
|
||||
td
|
||||
if userData.isAdmin
|
||||
| <s>{{_ 'yes'}}</s>
|
||||
else
|
||||
| <s>{{_ 'no'}}</s>
|
||||
else
|
||||
td
|
||||
if userData.isAdmin
|
||||
| {{_ 'yes'}}
|
||||
else
|
||||
| {{_ 'no'}}
|
||||
if userData.loginDisabled
|
||||
td <s>{{ userData.emails.[0].address }}</s>
|
||||
else
|
||||
td {{ userData.emails.[0].address }}
|
||||
if userData.loginDisabled
|
||||
td
|
||||
if userData.emails.[0].verified
|
||||
| <s>{{_ 'yes'}}</s>
|
||||
else
|
||||
| <s>{{_ 'no'}}</s>
|
||||
else
|
||||
td
|
||||
if userData.emails.[0].verified
|
||||
| {{_ 'yes'}}
|
||||
else
|
||||
| {{_ 'no'}}
|
||||
if userData.loginDisabled
|
||||
td <s>{{ moment userData.createdAt 'LLL' }}</s>
|
||||
else
|
||||
td {{ moment userData.createdAt 'LLL' }}
|
||||
td
|
||||
if userData.loginDisabled
|
||||
| {{_ 'no'}}
|
||||
else
|
||||
| {{_ 'yes'}}
|
||||
td {{_ userData.authenticationMethod }}
|
||||
if userData.loginDisabled
|
||||
td <s>{{_ userData.authenticationMethod }}</s>
|
||||
else
|
||||
td {{_ userData.authenticationMethod }}
|
||||
td
|
||||
a.edit-user
|
||||
| {{_ 'edit'}}
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import { Cookies } from 'meteor/ostrio:cookies';
|
||||
const cookies = new Cookies();
|
||||
Sidebar = null;
|
||||
|
||||
const defaultView = 'home';
|
||||
@@ -107,7 +109,16 @@ BlazeComponent.extendComponent({
|
||||
'click .js-toggle-sidebar': this.toggle,
|
||||
'click .js-back-home': this.setView,
|
||||
'click .js-toggle-minicard-label-text'() {
|
||||
Meteor.call('toggleMinicardLabelText');
|
||||
currentUser = Meteor.user();
|
||||
if (currentUser) {
|
||||
Meteor.call('toggleMinicardLabelText');
|
||||
} else {
|
||||
if (cookies.has('hiddenMinicardLabelText')) {
|
||||
cookies.remove('hiddenMinicardLabelText');
|
||||
} else {
|
||||
cookies.set('hiddenMinicardLabelText', 'true');
|
||||
}
|
||||
}
|
||||
},
|
||||
'click .js-shortcuts'() {
|
||||
FlowRouter.go('shortcuts');
|
||||
@@ -121,7 +132,16 @@ Blaze.registerHelper('Sidebar', () => Sidebar);
|
||||
|
||||
Template.homeSidebar.helpers({
|
||||
hiddenMinicardLabelText() {
|
||||
return Meteor.user().hasHiddenMinicardLabelText();
|
||||
currentUser = Meteor.user();
|
||||
if (currentUser) {
|
||||
return (currentUser.profile || {}).hiddenMinicardLabelText;
|
||||
} else {
|
||||
if (cookies.has('hiddenMinicardLabelText')) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@@ -4,6 +4,10 @@
|
||||
and #each x in y constructors to fix this.
|
||||
|
||||
template(name="filterSidebar")
|
||||
ul.sidebar-list
|
||||
span {{_ 'list-filter-label'}}
|
||||
form.js-list-filter
|
||||
input(type="text")
|
||||
ul.sidebar-list
|
||||
li(class="{{#if Filter.labelIds.isSelected undefined}}active{{/if}}")
|
||||
a.name.js-toggle-label-filter
|
||||
|
||||
@@ -4,6 +4,10 @@ BlazeComponent.extendComponent({
|
||||
events() {
|
||||
return [
|
||||
{
|
||||
'submit .js-list-filter'(evt) {
|
||||
evt.preventDefault();
|
||||
Filter.lists.set(this.find('.js-list-filter input').value.trim());
|
||||
},
|
||||
'click .js-toggle-label-filter'(evt) {
|
||||
evt.preventDefault();
|
||||
Filter.labelIds.toggle(this.currentData()._id);
|
||||
|
||||
@@ -2,6 +2,10 @@ template(name="searchSidebar")
|
||||
form.js-search-term-form
|
||||
input(type="text" name="searchTerm" placeholder="{{_ 'search-example'}}" autofocus dir="auto")
|
||||
.list-body.js-perfect-scrollbar
|
||||
.minilists.clearfix.js-minilists
|
||||
each (lists)
|
||||
a.minilist-wrapper.js-minilist(href=absoluteUrl)
|
||||
+minilist(this)
|
||||
.minicards.clearfix.js-minicards
|
||||
each (results)
|
||||
a.minicard-wrapper.js-minicard(href=absoluteUrl)
|
||||
|
||||
@@ -8,6 +8,11 @@ BlazeComponent.extendComponent({
|
||||
return currentBoard.searchCards(this.term.get());
|
||||
},
|
||||
|
||||
lists() {
|
||||
const currentBoard = Boards.findOne(Session.get('currentBoard'));
|
||||
return currentBoard.searchLists(this.term.get());
|
||||
},
|
||||
|
||||
events() {
|
||||
return [
|
||||
{
|
||||
|
||||
@@ -16,6 +16,11 @@ template(name="swimlaneFixedHeader")
|
||||
unless currentUser.isCommentOnly
|
||||
a.fa.fa-plus.js-open-add-swimlane-menu.swimlane-header-plus-icon
|
||||
a.fa.fa-navicon.js-open-swimlane-menu
|
||||
unless isMiniScreen
|
||||
if showDesktopDragHandles
|
||||
a.swimlane-header-handle.handle.fa.fa-arrows.js-swimlane-header-handle
|
||||
if isMiniScreen
|
||||
a.swimlane-header-miniscreen-handle.handle.fa.fa-arrows.js-swimlane-header-handle
|
||||
|
||||
template(name="editSwimlaneTitleForm")
|
||||
.list-composer
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import { Cookies } from 'meteor/ostrio:cookies';
|
||||
const cookies = new Cookies();
|
||||
const { calculateIndexData } = Utils;
|
||||
|
||||
let swimlaneColors;
|
||||
@@ -28,6 +30,21 @@ BlazeComponent.extendComponent({
|
||||
},
|
||||
}).register('swimlaneHeader');
|
||||
|
||||
Template.swimlaneHeader.helpers({
|
||||
showDesktopDragHandles() {
|
||||
currentUser = Meteor.user();
|
||||
if (currentUser) {
|
||||
return (currentUser.profile || {}).showDesktopDragHandles;
|
||||
} else {
|
||||
if (cookies.has('showDesktopDragHandles')) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
Template.swimlaneActionPopup.events({
|
||||
'click .js-set-swimlane-color': Popup.open('setSwimlaneColor'),
|
||||
'click .js-close-swimlane'(event) {
|
||||
|
||||
@@ -1,24 +1,25 @@
|
||||
template(name="swimlane")
|
||||
.swimlane
|
||||
+swimlaneHeader
|
||||
.swimlane.js-lists.js-swimlane
|
||||
if isMiniScreen
|
||||
if currentListIsInThisSwimlane _id
|
||||
+list(currentList)
|
||||
unless currentList
|
||||
unless collapseSwimlane
|
||||
.swimlane.js-lists.js-swimlane
|
||||
if isMiniScreen
|
||||
if currentListIsInThisSwimlane _id
|
||||
+list(currentList)
|
||||
unless currentList
|
||||
each lists
|
||||
+miniList(this)
|
||||
if currentUser.isBoardMember
|
||||
unless currentUser.isCommentOnly
|
||||
+addListForm
|
||||
else
|
||||
each lists
|
||||
+miniList(this)
|
||||
+list(this)
|
||||
if currentCardIsInThisList _id ../_id
|
||||
+cardDetails(currentCard)
|
||||
if currentUser.isBoardMember
|
||||
unless currentUser.isCommentOnly
|
||||
+addListForm
|
||||
else
|
||||
each lists
|
||||
+list(this)
|
||||
if currentCardIsInThisList _id ../_id
|
||||
+cardDetails(currentCard)
|
||||
if currentUser.isBoardMember
|
||||
unless currentUser.isCommentOnly
|
||||
+addListForm
|
||||
|
||||
template(name="listsGroup")
|
||||
.swimlane.list-group.js-lists
|
||||
@@ -42,7 +43,7 @@ template(name="listsGroup")
|
||||
+addListForm
|
||||
|
||||
template(name="addListForm")
|
||||
.list.list-composer.js-list-composer
|
||||
.list.list-composer.js-list-composer(class="{{#if isMiniScreen}}mini-list{{/if}}")
|
||||
.list-header-add
|
||||
+inlinedForm(autoclose=false)
|
||||
input.list-name-input.full-line(type="text" placeholder="{{_ 'add-list'}}"
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
import { Cookies } from 'meteor/ostrio:cookies';
|
||||
const cookies = new Cookies();
|
||||
const { calculateIndex, enableClickOnTouch } = Utils;
|
||||
|
||||
function currentListIsInThisSwimlane(swimlaneId) {
|
||||
@@ -14,7 +16,7 @@ function currentCardIsInThisList(listId, swimlaneId) {
|
||||
if (
|
||||
currentUser &&
|
||||
currentUser.profile &&
|
||||
currentUser.profile.boardView === 'board-view-swimlanes'
|
||||
Utils.boardView() === 'board-view-swimlanes'
|
||||
)
|
||||
return (
|
||||
currentCard &&
|
||||
@@ -56,7 +58,6 @@ function initSortable(boardComponent, $listsDom) {
|
||||
$listsDom.sortable({
|
||||
tolerance: 'pointer',
|
||||
helper: 'clone',
|
||||
handle: '.js-list-header',
|
||||
items: '.js-list:not(.js-list-composer)',
|
||||
placeholder: 'list placeholder',
|
||||
distance: 7,
|
||||
@@ -97,15 +98,39 @@ function initSortable(boardComponent, $listsDom) {
|
||||
);
|
||||
}
|
||||
|
||||
// Disable drag-dropping while in multi-selection mode, or if the current user
|
||||
// is not a board member
|
||||
boardComponent.autorun(() => {
|
||||
let showDesktopDragHandles = false;
|
||||
currentUser = Meteor.user();
|
||||
if (currentUser) {
|
||||
showDesktopDragHandles = (currentUser.profile || {})
|
||||
.showDesktopDragHandles;
|
||||
} else {
|
||||
if (cookies.has('showDesktopDragHandles')) {
|
||||
showDesktopDragHandles = true;
|
||||
} else {
|
||||
showDesktopDragHandles = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!Utils.isMiniScreen() && showDesktopDragHandles) {
|
||||
$listsDom.sortable({
|
||||
handle: '.js-list-handle',
|
||||
});
|
||||
} else {
|
||||
$listsDom.sortable({
|
||||
handle: '.js-list-header',
|
||||
});
|
||||
}
|
||||
|
||||
const $listDom = $listsDom;
|
||||
if ($listDom.data('sortable')) {
|
||||
$listsDom.sortable(
|
||||
'option',
|
||||
'disabled',
|
||||
MultiSelection.isActive() || !userIsMember(),
|
||||
// Disable drag-dropping when user is not member
|
||||
!userIsMember(),
|
||||
// Not disable drag-dropping while in multi-selection mode
|
||||
// MultiSelection.isActive() || !userIsMember(),
|
||||
);
|
||||
}
|
||||
});
|
||||
@@ -151,13 +176,27 @@ BlazeComponent.extendComponent({
|
||||
// define a list of elements in which we disable the dragging because
|
||||
// the user will legitimately expect to be able to select some text with
|
||||
// his mouse.
|
||||
const noDragInside = [
|
||||
'a',
|
||||
'input',
|
||||
'textarea',
|
||||
'p',
|
||||
'.js-list-header',
|
||||
];
|
||||
|
||||
let showDesktopDragHandles = false;
|
||||
currentUser = Meteor.user();
|
||||
if (currentUser) {
|
||||
showDesktopDragHandles = (currentUser.profile || {})
|
||||
.showDesktopDragHandles;
|
||||
} else {
|
||||
if (cookies.has('showDesktopDragHandles')) {
|
||||
showDesktopDragHandles = true;
|
||||
} else {
|
||||
showDesktopDragHandles = false;
|
||||
}
|
||||
}
|
||||
|
||||
const noDragInside = ['a', 'input', 'textarea', 'p'].concat(
|
||||
Utils.isMiniScreen() ||
|
||||
(!Utils.isMiniScreen() && showDesktopDragHandles)
|
||||
? ['.js-list-handle', '.js-swimlane-header-handle']
|
||||
: ['.js-list-header'],
|
||||
);
|
||||
|
||||
if (
|
||||
$(evt.target).closest(noDragInside.join(',')).length === 0 &&
|
||||
this.$('.swimlane').prop('clientHeight') > evt.offsetY
|
||||
@@ -233,6 +272,18 @@ BlazeComponent.extendComponent({
|
||||
}).register('addListForm');
|
||||
|
||||
Template.swimlane.helpers({
|
||||
showDesktopDragHandles() {
|
||||
currentUser = Meteor.user();
|
||||
if (currentUser) {
|
||||
return (currentUser.profile || {}).showDesktopDragHandles;
|
||||
} else {
|
||||
if (cookies.has('showDesktopDragHandles')) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
},
|
||||
canSeeAddList() {
|
||||
return (
|
||||
Meteor.user() &&
|
||||
@@ -253,6 +304,11 @@ BlazeComponent.extendComponent({
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (Filter.lists._isActive()) {
|
||||
if (!list.title.match(Filter.lists.getRegexSelector())) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (Filter.hideEmpty.isSelected()) {
|
||||
const swimlaneId = this.parentComponent()
|
||||
.parentComponent()
|
||||
|
||||
@@ -1,5 +1,41 @@
|
||||
@import 'nib'
|
||||
|
||||
/*
|
||||
// Minimize swimlanes start https://www.w3schools.com/howto/howto_js_accordion.asp
|
||||
|
||||
.accordion
|
||||
cursor: pointer
|
||||
width: 30px
|
||||
height: 20px
|
||||
border: none
|
||||
outline: none
|
||||
font-size: 18px
|
||||
transition: 0.4s
|
||||
padding-top: 0px
|
||||
margin-top: 0px
|
||||
|
||||
.accordion:after
|
||||
// Unicode triagle right:
|
||||
content: '\25B6'
|
||||
color: #777
|
||||
font-weight: bold
|
||||
float: left
|
||||
|
||||
.active:after
|
||||
// Unicode triangle down:
|
||||
content: '\25BC'
|
||||
|
||||
.panel
|
||||
width: 100%
|
||||
max-height: 0
|
||||
overflow: hidden
|
||||
transition: max-height 0.2s ease-out
|
||||
margin: 0px
|
||||
padding: 0px
|
||||
|
||||
// Minimize swimlanes end https://www.w3schools.com/howto/howto_js_accordion.asp
|
||||
*/
|
||||
|
||||
.swimlane
|
||||
// Even if this background color is the same as the body we can't leave it
|
||||
// transparent, because that won't work during a swimlane drag.
|
||||
@@ -25,22 +61,22 @@
|
||||
cursor: grabbing
|
||||
|
||||
.swimlane-header-wrap
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex: 1 0 100%;
|
||||
background-color: #ccc;
|
||||
display: flex
|
||||
flex-direction: row
|
||||
flex: 1 0 100%
|
||||
background-color: #ccc
|
||||
|
||||
.swimlane-header
|
||||
font-size: 14px;
|
||||
font-size: 14px
|
||||
padding: 5px 5px
|
||||
font-weight: bold;
|
||||
min-height: 9px;
|
||||
width: 100%;
|
||||
overflow: hidden;
|
||||
-o-text-overflow: ellipsis;
|
||||
text-overflow: ellipsis;
|
||||
word-wrap: break-word;
|
||||
text-align: center;
|
||||
font-weight: bold
|
||||
min-height: 9px
|
||||
width: 100%
|
||||
overflow: hidden
|
||||
-o-text-overflow: ellipsis
|
||||
text-overflow: ellipsis
|
||||
word-wrap: break-word
|
||||
text-align: center
|
||||
|
||||
.swimlane-header-menu
|
||||
position: absolute
|
||||
@@ -50,6 +86,22 @@
|
||||
margin-left: 5px
|
||||
margin-right: 10px
|
||||
|
||||
.swimlane-header-handle
|
||||
position: absolute
|
||||
padding: 7px
|
||||
top: 50%
|
||||
transform: translateY(-50%)
|
||||
left: 230px
|
||||
font-size: 18px
|
||||
|
||||
.swimlane-header-miniscreen-handle
|
||||
position: absolute
|
||||
padding: 7px
|
||||
top: 50%
|
||||
transform: translateY(-50%)
|
||||
left: 87vw
|
||||
font-size: 24px
|
||||
|
||||
.list-group
|
||||
height: 100%
|
||||
|
||||
|
||||
@@ -78,6 +78,11 @@ template(name="changeSettingsPopup")
|
||||
| {{_ 'hide-system-messages'}}
|
||||
if hiddenSystemMessages
|
||||
i.fa.fa-check
|
||||
li
|
||||
a.js-toggle-desktop-drag-handles
|
||||
| {{_ 'show-desktop-drag-handles'}}
|
||||
if showDesktopDragHandles
|
||||
i.fa.fa-check
|
||||
li
|
||||
label.bold
|
||||
| {{_ 'show-cards-minimum-count'}}
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
import { Cookies } from 'meteor/ostrio:cookies';
|
||||
const cookies = new Cookies();
|
||||
|
||||
Template.headerUserBar.events({
|
||||
'click .js-open-header-member-menu': Popup.open('memberMenu'),
|
||||
'click .js-change-avatar': Popup.open('changeAvatar'),
|
||||
@@ -5,10 +8,22 @@ Template.headerUserBar.events({
|
||||
|
||||
Template.memberMenuPopup.helpers({
|
||||
templatesBoardId() {
|
||||
return Meteor.user().getTemplatesBoardId();
|
||||
currentUser = Meteor.user();
|
||||
if (currentUser) {
|
||||
return Meteor.user().getTemplatesBoardId();
|
||||
} else {
|
||||
// No need to getTemplatesBoardId on public board
|
||||
return false;
|
||||
}
|
||||
},
|
||||
templatesBoardSlug() {
|
||||
return Meteor.user().getTemplatesBoardSlug();
|
||||
currentUser = Meteor.user();
|
||||
if (currentUser) {
|
||||
return Meteor.user().getTemplatesBoardSlug();
|
||||
} else {
|
||||
// No need to getTemplatesBoardSlug() on public board
|
||||
return false;
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
@@ -161,17 +176,56 @@ Template.changeLanguagePopup.events({
|
||||
});
|
||||
|
||||
Template.changeSettingsPopup.helpers({
|
||||
showDesktopDragHandles() {
|
||||
currentUser = Meteor.user();
|
||||
if (currentUser) {
|
||||
return (currentUser.profile || {}).showDesktopDragHandles;
|
||||
} else if (cookies.has('showDesktopDragHandles')) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
},
|
||||
hiddenSystemMessages() {
|
||||
return Meteor.user().hasHiddenSystemMessages();
|
||||
currentUser = Meteor.user();
|
||||
if (currentUser) {
|
||||
return (currentUser.profile || {}).hasHiddenSystemMessages;
|
||||
} else if (cookies.has('hasHiddenSystemMessages')) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
},
|
||||
showCardsCountAt() {
|
||||
return Meteor.user().getLimitToShowCardsCount();
|
||||
currentUser = Meteor.user();
|
||||
if (currentUser) {
|
||||
return Meteor.user().getLimitToShowCardsCount();
|
||||
} else {
|
||||
return cookies.get('limitToShowCardsCount');
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
Template.changeSettingsPopup.events({
|
||||
'click .js-toggle-desktop-drag-handles'() {
|
||||
currentUser = Meteor.user();
|
||||
if (currentUser) {
|
||||
Meteor.call('toggleDesktopDragHandles');
|
||||
} else if (cookies.has('showDesktopDragHandles')) {
|
||||
cookies.remove('showDesktopDragHandles');
|
||||
} else {
|
||||
cookies.set('showDesktopDragHandles', 'true');
|
||||
}
|
||||
},
|
||||
'click .js-toggle-system-messages'() {
|
||||
Meteor.call('toggleSystemMessages');
|
||||
currentUser = Meteor.user();
|
||||
if (currentUser) {
|
||||
Meteor.call('toggleSystemMessages');
|
||||
} else if (cookies.has('hasHiddenSystemMessages')) {
|
||||
cookies.remove('hasHiddenSystemMessages');
|
||||
} else {
|
||||
cookies.set('hasHiddenSystemMessages', 'true');
|
||||
}
|
||||
},
|
||||
'click .js-apply-show-cards-at'(event, templateInstance) {
|
||||
event.preventDefault();
|
||||
@@ -180,7 +234,12 @@ Template.changeSettingsPopup.events({
|
||||
10,
|
||||
);
|
||||
if (!isNaN(minLimit)) {
|
||||
Meteor.call('changeLimitToShowCardsCount', minLimit);
|
||||
currentUser = Meteor.user();
|
||||
if (currentUser) {
|
||||
Meteor.call('changeLimitToShowCardsCount', minLimit);
|
||||
} else {
|
||||
cookies.set('limitToShowCardsCount', minLimit);
|
||||
}
|
||||
Popup.back();
|
||||
}
|
||||
},
|
||||
|
||||
@@ -3,10 +3,11 @@ DatePicker = BlazeComponent.extendComponent({
|
||||
return 'datepicker';
|
||||
},
|
||||
|
||||
onCreated() {
|
||||
onCreated(defaultTime = '1970-01-01 08:00:00') {
|
||||
this.error = new ReactiveVar('');
|
||||
this.card = this.data();
|
||||
this.date = new ReactiveVar(moment.invalid());
|
||||
this.defaultTime = defaultTime;
|
||||
},
|
||||
|
||||
onRendered() {
|
||||
@@ -26,7 +27,7 @@ DatePicker = BlazeComponent.extendComponent({
|
||||
if (!timeInput.value) {
|
||||
const currentHour = evt.date.getHours();
|
||||
const defaultMoment = moment(
|
||||
currentHour > 0 ? evt.date : '1970-01-01 08:00:00',
|
||||
currentHour > 0 ? evt.date : this.defaultTime,
|
||||
); // default to 8:00 am local time
|
||||
timeInput.value = defaultMoment.format('LT');
|
||||
}
|
||||
|
||||
+13
-1
@@ -439,6 +439,14 @@ class AdvancedFilter {
|
||||
const commands = this._filterToCommands();
|
||||
return this._arrayToSelector(commands);
|
||||
}
|
||||
getRegexSelector() {
|
||||
// generate a regex for filter list
|
||||
this._dep.depend();
|
||||
return new RegExp(
|
||||
`^.*${this._filter.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}.*$`,
|
||||
'i',
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// The global Filter object.
|
||||
@@ -455,6 +463,7 @@ Filter = {
|
||||
hideEmpty: new SetFilter(),
|
||||
customFields: new SetFilter('_id'),
|
||||
advanced: new AdvancedFilter(),
|
||||
lists: new AdvancedFilter(), // we need the ability to filter list by name as well
|
||||
|
||||
_fields: ['labelIds', 'members', 'archive', 'hideEmpty', 'customFields'],
|
||||
|
||||
@@ -468,7 +477,9 @@ Filter = {
|
||||
return (
|
||||
_.any(this._fields, fieldName => {
|
||||
return this[fieldName]._isActive();
|
||||
}) || this.advanced._isActive()
|
||||
}) ||
|
||||
this.advanced._isActive() ||
|
||||
this.lists._isActive()
|
||||
);
|
||||
},
|
||||
|
||||
@@ -533,6 +544,7 @@ Filter = {
|
||||
const filter = this[fieldName];
|
||||
filter.reset();
|
||||
});
|
||||
this.lists.reset();
|
||||
this.advanced.reset();
|
||||
this.resetExceptions();
|
||||
},
|
||||
|
||||
+51
-11
@@ -1,10 +1,50 @@
|
||||
import { Cookies } from 'meteor/ostrio:cookies';
|
||||
const cookies = new Cookies();
|
||||
|
||||
Utils = {
|
||||
setBoardView(view) {
|
||||
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
|
||||
} else if (view === 'board-view-cal') {
|
||||
cookies.set('boardView', 'board-view-cal'); //true
|
||||
}
|
||||
},
|
||||
|
||||
unsetBoardView() {
|
||||
cookies.remove('boardView');
|
||||
cookies.remove('collapseSwimlane');
|
||||
},
|
||||
|
||||
boardView() {
|
||||
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-cal') {
|
||||
return 'board-view-cal';
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
// XXX We should remove these two methods
|
||||
goBoardId(_id) {
|
||||
const board = Boards.findOne(_id);
|
||||
return (
|
||||
board &&
|
||||
FlowRouter.go('board', {
|
||||
board
|
||||
&& FlowRouter.go('board', {
|
||||
id: board._id,
|
||||
slug: board.slug,
|
||||
})
|
||||
@@ -15,8 +55,8 @@ Utils = {
|
||||
const card = Cards.findOne(_id);
|
||||
const board = Boards.findOne(card.boardId);
|
||||
return (
|
||||
board &&
|
||||
FlowRouter.go('card', {
|
||||
board
|
||||
&& FlowRouter.go('card', {
|
||||
cardId: card._id,
|
||||
boardId: board._id,
|
||||
slug: board.slug,
|
||||
@@ -187,8 +227,8 @@ Utils = {
|
||||
};
|
||||
|
||||
if (
|
||||
'ontouchstart' in window ||
|
||||
(window.DocumentTouch && document instanceof window.DocumentTouch)
|
||||
'ontouchstart' in window
|
||||
|| (window.DocumentTouch && document instanceof window.DocumentTouch)
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
@@ -209,8 +249,8 @@ Utils = {
|
||||
|
||||
calculateTouchDistance(touchA, touchB) {
|
||||
return Math.sqrt(
|
||||
Math.pow(touchA.screenX - touchB.screenX, 2) +
|
||||
Math.pow(touchA.screenY - touchB.screenY, 2),
|
||||
Math.pow(touchA.screenX - touchB.screenX, 2)
|
||||
+ Math.pow(touchA.screenY - touchB.screenY, 2),
|
||||
);
|
||||
},
|
||||
|
||||
@@ -227,9 +267,9 @@ Utils = {
|
||||
});
|
||||
$(document).on('touchend', selector, function(e) {
|
||||
if (
|
||||
touchStart &&
|
||||
lastTouch &&
|
||||
Utils.calculateTouchDistance(touchStart, lastTouch) <= 20
|
||||
touchStart
|
||||
&& lastTouch
|
||||
&& Utils.calculateTouchDistance(touchStart, lastTouch) <= 20
|
||||
) {
|
||||
e.preventDefault();
|
||||
const clickEvent = document.createEvent('MouseEvents');
|
||||
|
||||
+4
-5
@@ -440,10 +440,10 @@ services:
|
||||
# If the sync of the users should be done in the background
|
||||
#- LDAP_BACKGROUND_SYNC=false
|
||||
#
|
||||
# At which interval does the background task sync in milliseconds.
|
||||
# Leave this unset, so it uses default, and does not crash.
|
||||
# https://github.com/wekan/wekan/issues/2354#issuecomment-515305722
|
||||
- LDAP_BACKGROUND_SYNC_INTERVAL=''
|
||||
# At which interval does the background task sync.
|
||||
# The format must be as specified in:
|
||||
# https://bunkat.github.io/later/parsers.html#text
|
||||
#- LDAP_BACKGROUND_SYNC_INTERVAL='every 1 hour'
|
||||
#
|
||||
#- LDAP_BACKGROUND_SYNC_KEEP_EXISTANT_USERS_UPDATED=false
|
||||
#
|
||||
@@ -559,7 +559,6 @@ services:
|
||||
# example : LOGOUT_ON_MINUTES=55
|
||||
#- LOGOUT_ON_MINUTES=
|
||||
#-------------------------------------------------------------------
|
||||
|
||||
depends_on:
|
||||
- wekandb
|
||||
|
||||
|
||||
+756
-740
File diff suppressed because it is too large.
Load diff
+756
-740
File diff suppressed because it is too large.
Load diff
+756
-740
File diff suppressed because it is too large.
Load diff
+756
-740
File diff suppressed because it is too large.
Load diff
+756
-740
File diff suppressed because it is too large.
Load diff
+756
-740
File diff suppressed because it is too large.
Load diff
+756
-740
File diff suppressed because it is too large.
Load diff
+756
-740
File diff suppressed because it is too large.
Load diff
+756
-740
File diff suppressed because it is too large.
Load diff
+19
-3
@@ -132,10 +132,12 @@
|
||||
"boardChangeVisibilityPopup-title": "Change Visibility",
|
||||
"boardChangeWatchPopup-title": "Change Watch",
|
||||
"boardMenuPopup-title": "Board Settings",
|
||||
"boardChangeViewPopup-title": "Board View",
|
||||
"boards": "Boards",
|
||||
"board-view": "Board View",
|
||||
"board-view-cal": "Calendar",
|
||||
"board-view-swimlanes": "Swimlanes",
|
||||
"board-view-collapse": "Collapse",
|
||||
"board-view-lists": "Lists",
|
||||
"bucket-example": "Like “Bucket List” for example",
|
||||
"cancel": "Cancel",
|
||||
@@ -221,6 +223,8 @@
|
||||
"comment-only-desc": "Can comment on cards only.",
|
||||
"no-comments": "No comments",
|
||||
"no-comments-desc": "Can not see comments and activities.",
|
||||
"worker": "Worker",
|
||||
"worker-desc": "Can only move cards, assign itself to card and comment.",
|
||||
"computer": "Computer",
|
||||
"confirm-subtask-delete-dialog": "Are you sure you want to delete subtask?",
|
||||
"confirm-checklist-delete-dialog": "Are you sure you want to delete checklist?",
|
||||
@@ -300,8 +304,18 @@
|
||||
"error-username-taken": "This username is already taken",
|
||||
"error-email-taken": "Email has already been taken",
|
||||
"export-board": "Export board",
|
||||
"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)",
|
||||
"filter": "Filter",
|
||||
"filter-cards": "Filter Cards",
|
||||
"filter-cards": "Filter Cards or Lists",
|
||||
"list-filter-label": "Filter List by Title",
|
||||
"filter-clear": "Clear filter",
|
||||
"filter-no-label": "No label",
|
||||
"filter-no-member": "No member",
|
||||
@@ -426,7 +440,7 @@
|
||||
"save": "Save",
|
||||
"search": "Search",
|
||||
"rules": "Rules",
|
||||
"search-cards": "Search from card titles and descriptions on this board",
|
||||
"search-cards": "Search from card/list titles and descriptions 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",
|
||||
@@ -740,5 +754,7 @@
|
||||
"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"
|
||||
"show-desktop-drag-handles": "Show desktop drag handles",
|
||||
"assignee": "Assignee",
|
||||
"cardAssigneesPopup-title": "Assignee"
|
||||
}
|
||||
+756
-740
File diff suppressed because it is too large.
Load diff
+756
-740
File diff suppressed because it is too large.
Load diff
+756
-740
File diff suppressed because it is too large.
Load diff
+756
-740
File diff suppressed because it is too large.
Load diff
+756
-740
File diff suppressed because it is too large.
Load diff
+756
-740
File diff suppressed because it is too large.
Load diff
+19
-3
@@ -132,10 +132,12 @@
|
||||
"boardChangeVisibilityPopup-title": "Changer la visibilité",
|
||||
"boardChangeWatchPopup-title": "Modifier le suivi",
|
||||
"boardMenuPopup-title": "Paramètres du tableau",
|
||||
"boardChangeViewPopup-title": "Vue du tableau",
|
||||
"boards": "Tableaux",
|
||||
"board-view": "Vue du tableau",
|
||||
"board-view-cal": "Calendrier",
|
||||
"board-view-swimlanes": "Couloirs",
|
||||
"board-view-collapse": "Diminuer",
|
||||
"board-view-lists": "Listes",
|
||||
"bucket-example": "Comme « todo list » par exemple",
|
||||
"cancel": "Annuler",
|
||||
@@ -221,6 +223,8 @@
|
||||
"comment-only-desc": "Ne peut que commenter des cartes.",
|
||||
"no-comments": "Aucun commentaire",
|
||||
"no-comments-desc": "Ne peut pas voir les commentaires et les activités.",
|
||||
"worker": "Travailleur",
|
||||
"worker-desc": "Peut seulement déplacer des cartes, s'assigner à une carte et la commenter.",
|
||||
"computer": "Ordinateur",
|
||||
"confirm-subtask-delete-dialog": "Êtes-vous sûr de vouloir supprimer la sous-tâche ?",
|
||||
"confirm-checklist-delete-dialog": "Êtes-vous sûr de vouloir supprimer la checklist ?",
|
||||
@@ -300,8 +304,18 @@
|
||||
"error-username-taken": "Ce nom d'utilisateur est déjà utilisé",
|
||||
"error-email-taken": "Cette adresse mail est déjà utilisée",
|
||||
"export-board": "Exporter le tableau",
|
||||
"sort": "Tri",
|
||||
"sort-desc": "Cliquez pour trier la liste",
|
||||
"list-sort-by": "Trier la liste par:",
|
||||
"list-label-modifiedAt": "Dernier accès",
|
||||
"list-label-title": "Nom de liste",
|
||||
"list-label-sort": "Votre manuel",
|
||||
"list-label-short-modifiedAt": "(D)",
|
||||
"list-label-short-title": "(N)",
|
||||
"list-label-short-sort": "(M)",
|
||||
"filter": "Filtrer",
|
||||
"filter-cards": "Filtrer les cartes",
|
||||
"filter-cards": "Filtrer les cartes ou listes",
|
||||
"list-filter-label": "Filtrer la liste par titre",
|
||||
"filter-clear": "Supprimer les filtres",
|
||||
"filter-no-label": "Aucune étiquette",
|
||||
"filter-no-member": "Aucun participant",
|
||||
@@ -426,7 +440,7 @@
|
||||
"save": "Enregistrer",
|
||||
"search": "Chercher",
|
||||
"rules": "Règles",
|
||||
"search-cards": "Rechercher parmi les titres et descriptions des cartes de ce tableau",
|
||||
"search-cards": "Chercher selon les titres de carte/liste et descriptions de ce tableau",
|
||||
"search-example": "Texte à rechercher ?",
|
||||
"select-color": "Sélectionner une couleur",
|
||||
"set-wip-limit-value": "Définit une limite maximale au nombre de cartes de cette liste",
|
||||
@@ -737,5 +751,7 @@
|
||||
"delete-user-confirm-popup": "Êtes-vous sûr de vouloir supprimer ce compte ? Cette opération ne peut pas être annulée. ",
|
||||
"accounts-allowUserDelete": "Autoriser les utilisateurs à supprimer leur compte",
|
||||
"hide-minicard-label-text": "Cacher le label de la minicarte",
|
||||
"show-desktop-drag-handles": "Voir les poignées de déplacement du bureau"
|
||||
"show-desktop-drag-handles": "Voir les poignées de déplacement du bureau",
|
||||
"assignee": "Cessionnaire",
|
||||
"cardAssigneesPopup-title": "Cessionnaire"
|
||||
}
|
||||
+756
-740
File diff suppressed because it is too large.
Load diff
+756
-740
File diff suppressed because it is too large.
Load diff
+756
-740
File diff suppressed because it is too large.
Load diff
+756
-740
File diff suppressed because it is too large.
Load diff
+756
-740
File diff suppressed because it is too large.
Load diff
+756
-740
File diff suppressed because it is too large.
Load diff
+756
-740
File diff suppressed because it is too large.
Load diff
+756
-740
File diff suppressed because it is too large.
Load diff
+756
-740
File diff suppressed because it is too large.
Load diff
+756
-740
File diff suppressed because it is too large.
Load diff
+756
-740
File diff suppressed because it is too large.
Load diff
+756
-740
File diff suppressed because it is too large.
Load diff
+756
-740
File diff suppressed because it is too large.
Load diff
+756
-740
File diff suppressed because it is too large.
Load diff
+756
-740
File diff suppressed because it is too large.
Load diff
+756
-740
File diff suppressed because it is too large.
Load diff
+57
-41
@@ -1,45 +1,45 @@
|
||||
{
|
||||
"accept": "Accepteren",
|
||||
"act-activity-notify": "Activiteiten Notificatie",
|
||||
"act-addAttachment": "bijlage __attachment__ toegevoegd aan kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__",
|
||||
"act-deleteAttachment": "bijlage __attachment__ verwijderd op kaart __card__ van lijst __list__ uit swimlane __swimlane__ op bord __board__",
|
||||
"act-addSubtask": "subtaak __subtask__ toegevoegd aan kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__",
|
||||
"act-addLabel": "Label __label__ toegevoegd aan kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__",
|
||||
"act-addedLabel": "Label __label__ toegevoegd aan kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__",
|
||||
"act-removeLabel": "Label __label__ verwijderd van kaart __card__ van lijst __list__ uit swimlane __swimlane__ op bord __board__",
|
||||
"act-removedLabel": "Label __label__ verwijderd van kaart __card__ van lijst __list__ uit swimlane __swimlane__ op bord __board__",
|
||||
"act-addChecklist": "checklist __checklist__ toegevoegd aan kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__",
|
||||
"act-addChecklistItem": "checklist item __checklistItem__ toegevoegd aan checklist __checklist__ op kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__",
|
||||
"act-removeChecklist": "checklist __checklist__ verwijderd van kaart __card__ van lijst __list__ uit swimlane __swimlane__ op bord __board__",
|
||||
"act-removeChecklistItem": "checklist item __checklistItem__ verwijderd van checklist __checkList__ op kaart __card__ van lijst __list__ uit swimlane __swimlane__ op bord __board__",
|
||||
"act-checkedItem": "__checklistItem__ aangevinkt van checklist __checklist__ op kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__",
|
||||
"act-uncheckedItem": "__checklistItem__ uitgevinkt van checklist __checklist__ op kaart __card__ van lijst __list__ uit swimlane __swimlane__ op bord __board__",
|
||||
"act-completeChecklist": "checklist __checklist__ afgewerkt op kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__",
|
||||
"act-uncompleteChecklist": "checklist __checklist__ onafgewerkt op kaart __card__ van lijst __list__ uit swimlane __swimlane__ op bord __board__",
|
||||
"act-addComment": "aantekening toegevoegd aan kaart __card__: __comment__ van lijst __list__ in swimlane __swimlane__ op bord __board__",
|
||||
"act-editComment": "aantekening gewijzigd op kaart __card__: __comment__ van lijst __list__ in swimlane __swimlane__ op bord __board__",
|
||||
"act-deleteComment": "aantekening verwijderd van kaart __card__: __comment__ van lijst __list__ uit swimlane __swimlane__ op bord __board__",
|
||||
"act-addAttachment": "heeft bijlage __attachment__ toegevoegd aan kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__",
|
||||
"act-deleteAttachment": "heeft bijlage __attachment__ verwijderd op kaart __card__ van lijst __list__ uit swimlane __swimlane__ op bord __board__",
|
||||
"act-addSubtask": "heeft subtaak __subtask__ toegevoegd aan kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__",
|
||||
"act-addLabel": "heeft label __label__ toegevoegd aan kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__",
|
||||
"act-addedLabel": "heeft label __label__ toegevoegd aan kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__",
|
||||
"act-removeLabel": "heeft label __label__ verwijderd van kaart __card__ van lijst __list__ uit swimlane __swimlane__ op bord __board__",
|
||||
"act-removedLabel": "heeft label __label__ verwijderd van kaart __card__ van lijst __list__ uit swimlane __swimlane__ op bord __board__",
|
||||
"act-addChecklist": "heeft checklist __checklist__ toegevoegd aan kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__",
|
||||
"act-addChecklistItem": "heeft checklist item __checklistItem__ toegevoegd aan checklist __checklist__ op kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__",
|
||||
"act-removeChecklist": "heeft checklist __checklist__ verwijderd van kaart __card__ van lijst __list__ uit swimlane __swimlane__ op bord __board__",
|
||||
"act-removeChecklistItem": "heeft checklist item __checklistItem__ verwijderd van checklist __checkList__ op kaart __card__ van lijst __list__ uit swimlane __swimlane__ op bord __board__",
|
||||
"act-checkedItem": "heeft __checklistItem__ aangevinkt van checklist __checklist__ op kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__",
|
||||
"act-uncheckedItem": "heeft __checklistItem__ uitgevinkt van checklist __checklist__ op kaart __card__ van lijst __list__ uit swimlane __swimlane__ op bord __board__",
|
||||
"act-completeChecklist": "heeft checklist __checklist__ afgewerkt op kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__",
|
||||
"act-uncompleteChecklist": "heeft checklist __checklist__ onafgewerkt op kaart __card__ van lijst __list__ uit swimlane __swimlane__ op bord __board__",
|
||||
"act-addComment": "heeft aantekening toegevoegd aan kaart __card__: __comment__ van lijst __list__ in swimlane __swimlane__ op bord __board__",
|
||||
"act-editComment": "heeft aantekening gewijzigd op kaart __card__: __comment__ van lijst __list__ in swimlane __swimlane__ op bord __board__",
|
||||
"act-deleteComment": "heeft aantekening verwijderd van kaart __card__: __comment__ van lijst __list__ uit swimlane __swimlane__ op bord __board__",
|
||||
"act-createBoard": "bord __board__ aangemaakt",
|
||||
"act-createSwimlane": "swimlane __swimlane__ aangemaakt op bord __board__",
|
||||
"act-createCard": "kaart __card__ aangemaakt in lijst __list__ in swimlane __swimlane__ op bord __board__",
|
||||
"act-createCustomField": "maatwerkveld __customField__ aangemaakt op bord __board__",
|
||||
"act-deleteCustomField": "maatwerkveld __customField__ verwijderd van bord __board__",
|
||||
"act-setCustomField": "maatwerkveld gewijzigd __customField__: __customFieldValue__ op kaart __card__ in lijst __list__ uit swimlane __swimlane__ op bord __board__",
|
||||
"act-createCard": "heeft kaart __card__ aangemaakt in lijst __list__ in swimlane __swimlane__ op bord __board__",
|
||||
"act-createCustomField": "heeft maatwerkveld __customField__ aangemaakt op bord __board__",
|
||||
"act-deleteCustomField": "heeft maatwerkveld __customField__ verwijderd van bord __board__",
|
||||
"act-setCustomField": "heeft maatwerkveld gewijzigd __customField__: __customFieldValue__ op kaart __card__ in lijst __list__ uit swimlane __swimlane__ op bord __board__",
|
||||
"act-createList": "lijst __list__ toegevoegd aan bord __board__",
|
||||
"act-addBoardMember": "lid __member__ toegevoegd aan bord __board__",
|
||||
"act-addBoardMember": "heeft lid __member__ toegevoegd aan bord __board__",
|
||||
"act-archivedBoard": "Bord __board__ verplaatst naar Archief",
|
||||
"act-archivedCard": "Kaart __card__ van lijst __list__ uit swimlane __swimlane__ op bord __board__ verplaatst naar Archief",
|
||||
"act-archivedCard": "heeft kaart __card__ van lijst __list__ uit swimlane __swimlane__ op bord __board__ verplaatst naar Archief",
|
||||
"act-archivedList": "Lijst __list__ uit swimlane __swimlane__ op bord __board__ verplaatst naar Archief",
|
||||
"act-archivedSwimlane": "Swimlane __swimlane__ op bord __board__ verplaatst naar Archief",
|
||||
"act-importBoard": "bord __board__ geïmporteerd",
|
||||
"act-importCard": "kaart __card__ geïmporteerd in lijst __list__ in swimlane __swimlane__ op bord __board__",
|
||||
"act-importCard": "heeft kaart __card__ geïmporteerd in lijst __list__ in swimlane __swimlane__ op bord __board__",
|
||||
"act-importList": "lijst __list__ geïmporteerd in swimlane __swimlane__ op bord __board__",
|
||||
"act-joinMember": "lid __member__ toegevoegd aan kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__",
|
||||
"act-moveCard": "kaart __card__ verplaatst op bord __board__ van lijst __oldList__ uit swimlane __oldSwimlane__ naar lijst __list__ in swimlane __swimlane__",
|
||||
"act-moveCardToOtherBoard": "kaart __card__ verplaatst van lijst __oldList__ uit swimlane __oldSwimlane__ op bord __oldBoard__ naar lijst __list__ in swimlane __swimlane__ op bord __board__",
|
||||
"act-removeBoardMember": "lid __member__ verwijderd van bord __board__",
|
||||
"act-restoredCard": "kaart __card__ teruggehaald naar lijst __list__ in swimlane __swimlane__ op bord __board__",
|
||||
"act-unjoinMember": "lid __member__ verwijderd van kaart __card__ van lijst __list__ uit swimlane __swimlane__ op bord __board__",
|
||||
"act-joinMember": "heeft lid __member__ toegevoegd aan kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__",
|
||||
"act-moveCard": "heeft kaart __card__ verplaatst op bord __board__ van lijst __oldList__ uit swimlane __oldSwimlane__ naar lijst __list__ in swimlane __swimlane__",
|
||||
"act-moveCardToOtherBoard": "heeft kaart __card__ verplaatst van lijst __oldList__ uit swimlane __oldSwimlane__ op bord __oldBoard__ naar lijst __list__ in swimlane __swimlane__ op bord __board__",
|
||||
"act-removeBoardMember": "heeft lid __member__ verwijderd van bord __board__",
|
||||
"act-restoredCard": "heeft kaart __card__ teruggehaald naar lijst __list__ in swimlane __swimlane__ op bord __board__",
|
||||
"act-unjoinMember": "heeft lid __member__ verwijderd van kaart __card__ van lijst __list__ uit swimlane __swimlane__ op bord __board__",
|
||||
"act-withBoardTitle": "__board__",
|
||||
"act-withCardTitle": "[__board__] __card__",
|
||||
"actions": "Acties",
|
||||
@@ -64,14 +64,14 @@
|
||||
"activity-unchecked-item": "%s uitgevinkt in checklist %s van %s",
|
||||
"activity-checklist-added": "checklist toegevoegd aan %s",
|
||||
"activity-checklist-removed": "checklist verwijderd van %s",
|
||||
"activity-checklist-completed": "checklist __checklist__ afgewerkt op kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__",
|
||||
"activity-checklist-completed": "heeft checklist __checklist__ afgewerkt op kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__",
|
||||
"activity-checklist-uncompleted": "checklist %s onafgewerkt van %s",
|
||||
"activity-checklist-item-added": "checklist item toegevoegd aan '%s' in '%s'",
|
||||
"activity-checklist-item-removed": "checklist item verwijderd van '%s' in %s",
|
||||
"add": "Toevoegen",
|
||||
"activity-checked-item-card": "%s aangevinkt in checklist %s",
|
||||
"activity-unchecked-item-card": "%s uitgevinkt in checklist %s",
|
||||
"activity-checklist-completed-card": "checklist __checklist__ afgewerkt op kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__",
|
||||
"activity-checklist-completed-card": "heeft checklist __checklist__ afgewerkt op kaart __card__ van lijst __list__ in swimlane __swimlane__ op bord __board__",
|
||||
"activity-checklist-uncompleted-card": "checklist %s onafgewerkt",
|
||||
"activity-editComment": "aantekening gewijzigd %s",
|
||||
"activity-deleteComment": "aantekening verwijderd %s",
|
||||
@@ -132,10 +132,12 @@
|
||||
"boardChangeVisibilityPopup-title": "Verander zichtbaarheid",
|
||||
"boardChangeWatchPopup-title": "Verander naar 'Watch'",
|
||||
"boardMenuPopup-title": "Bord Instellingen",
|
||||
"boardChangeViewPopup-title": "Bord overzicht",
|
||||
"boards": "Borden",
|
||||
"board-view": "Bord overzicht",
|
||||
"board-view-cal": "Kalender",
|
||||
"board-view-swimlanes": "Swimlanes",
|
||||
"board-view-collapse": "Klap in",
|
||||
"board-view-lists": "Lijsten",
|
||||
"bucket-example": "Zoals bijvoorbeeld een \"Bucket List\"",
|
||||
"cancel": "Annuleren",
|
||||
@@ -152,7 +154,7 @@
|
||||
"card-edit-custom-fields": "Wijzig maatwerkvelden",
|
||||
"card-edit-labels": "Wijzig labels",
|
||||
"card-edit-members": "Wijzig leden",
|
||||
"card-labels-title": "Wijzig de labels vam de kaart.",
|
||||
"card-labels-title": "Wijzig de labels van de kaart.",
|
||||
"card-members-title": "Voeg of verwijder leden van het bord toe aan de kaart.",
|
||||
"card-start": "Begin",
|
||||
"card-start-on": "Begint op",
|
||||
@@ -221,6 +223,8 @@
|
||||
"comment-only-desc": "Kan alleen op kaarten aantekenen.",
|
||||
"no-comments": "Geen aantekeningen",
|
||||
"no-comments-desc": "Zie geen aantekeningen of activiteiten.",
|
||||
"worker": "Medewerker",
|
||||
"worker-desc": "Kan alleen kaarten verplaatsen, zichzelf aan kaarten koppelen en aantekeningen maken.",
|
||||
"computer": "Computer",
|
||||
"confirm-subtask-delete-dialog": "Weet je zeker dat je de subtaak wilt verwijderen?",
|
||||
"confirm-checklist-delete-dialog": "Weet je zeker dat je de checklist wilt verwijderen?",
|
||||
@@ -300,8 +304,18 @@
|
||||
"error-username-taken": "Deze gebruikersnaam is al in gebruik",
|
||||
"error-email-taken": "Dit e-mailadres is al in gebruik",
|
||||
"export-board": "Exporteer bord",
|
||||
"sort": "Sorteer",
|
||||
"sort-desc": "Klik om lijst te sorteren",
|
||||
"list-sort-by": "Sorteer lijst op",
|
||||
"list-label-modifiedAt": "Laatste toegangstijd",
|
||||
"list-label-title": "Naam van de lijst",
|
||||
"list-label-sort": "Je handmatige volgorde",
|
||||
"list-label-short-modifiedAt": "(L)",
|
||||
"list-label-short-title": "(N)",
|
||||
"list-label-short-sort": "(M)",
|
||||
"filter": "Filter",
|
||||
"filter-cards": "Filter Kaarten",
|
||||
"filter-cards": "Filter kaarten of lijsten",
|
||||
"list-filter-label": "Filter lijst op titel",
|
||||
"filter-clear": "Wis filter",
|
||||
"filter-no-label": "Geen label",
|
||||
"filter-no-member": "Geen lid",
|
||||
@@ -426,7 +440,7 @@
|
||||
"save": "Opslaan",
|
||||
"search": "Zoek",
|
||||
"rules": "Regels",
|
||||
"search-cards": "Zoeken in kaart titels en omschrijvingen op dit bord",
|
||||
"search-cards": "Zoek op kaarten/lijsten en omschrijvingen op dit bord",
|
||||
"search-example": "Tekst om naar te zoeken?",
|
||||
"select-color": "Selecteer kleur",
|
||||
"set-wip-limit-value": "Zet een limiet voor het maximaal aantal taken in deze lijst",
|
||||
@@ -717,10 +731,10 @@
|
||||
"delete-all": "Verwijder alles",
|
||||
"loading": "Laden, even geduld.",
|
||||
"previous_as": "laatste keer was",
|
||||
"act-a-dueAt": "vervaldatum gewijzigd naar \nOp: __timeValue__\nKaart: __card__\noude vervaldatum was __timeOldValue__",
|
||||
"act-a-endAt": "einddatum gewijzigd naar __timeValue__ van (__timeOldValue__)",
|
||||
"act-a-startAt": "begindatum gewijzigd naar __timeValue__ van (__timeOldValue__)",
|
||||
"act-a-receivedAt": "ontvangstdatum gewijzigd naar __timeValue__ van (__timeOldValue__)",
|
||||
"act-a-dueAt": "heeft vervaldatum gewijzigd naar \nOp: __timeValue__\nKaart: __card__\noude vervaldatum was __timeOldValue__",
|
||||
"act-a-endAt": "heeft einddatum gewijzigd naar __timeValue__ van (__timeOldValue__)",
|
||||
"act-a-startAt": "heeft begindatum gewijzigd naar __timeValue__ van (__timeOldValue__)",
|
||||
"act-a-receivedAt": "heeft ontvangstdatum gewijzigd naar __timeValue__ van (__timeOldValue__)",
|
||||
"a-dueAt": "vervaldatum gewijzigd naar",
|
||||
"a-endAt": "einddatum gewijzigd naar",
|
||||
"a-startAt": "begindatum gewijzigd naar",
|
||||
@@ -737,5 +751,7 @@
|
||||
"delete-user-confirm-popup": "Weet je zeker dat je dit account wilt verwijderen? Er is geen herstelmogelijkheid.",
|
||||
"accounts-allowUserDelete": "Sta gebruikers toe om hun eigen account te verwijderen",
|
||||
"hide-minicard-label-text": "Verberg minikaart labeltekst",
|
||||
"show-desktop-drag-handles": "Toon sleep gereedschap op werkblad"
|
||||
"show-desktop-drag-handles": "Toon sleep gereedschap op werkblad",
|
||||
"assignee": "Toegewezen aan",
|
||||
"cardAssigneesPopup-title": "Toegewezen aan"
|
||||
}
|
||||
+756
-740
File diff suppressed because it is too large.
Load diff
+756
-740
File diff suppressed because it is too large.
Load diff
+756
-740
File diff suppressed because it is too large.
Load diff
+756
-740
File diff suppressed because it is too large.
Load diff
+756
-740
File diff suppressed because it is too large.
Load diff
+756
-740
File diff suppressed because it is too large.
Load diff
+52
-36
@@ -89,7 +89,7 @@
|
||||
"added": "Dodano",
|
||||
"addMemberPopup-title": "Člani",
|
||||
"admin": "Administrator",
|
||||
"admin-desc": "Lahko gleda in ureja kartice, odstrani člane in spreminja nastavitve table.",
|
||||
"admin-desc": "Lahko gleda in ureja kartice, odstrani člane ter spreminja nastavitve table.",
|
||||
"admin-announcement": "Najava",
|
||||
"admin-announcement-active": "Aktivna vse-sistemska najava",
|
||||
"admin-announcement-title": "Najava od administratorja",
|
||||
@@ -100,12 +100,12 @@
|
||||
"app-is-offline": "Nalaganje, prosimo počakajte. Osveževanje strani bo povzročilo izgubo podatkov. Če nalaganje ne deluje, preverite, ali se strežnik ni ustavil.",
|
||||
"archive": "Premakni v arhiv",
|
||||
"archive-all": "Premakni vse v arhiv",
|
||||
"archive-board": "Premakni tablo v arhiv",
|
||||
"archive-card": "Premakni kartico v arhiv",
|
||||
"archive-list": "Premakni seznam v arhiv",
|
||||
"archive-swimlane": "Premakni plavalno stezo v arhiv",
|
||||
"archive-selection": "Premakni označeno v arhiv",
|
||||
"archiveBoardPopup-title": "Premakni tablo v arhiv?",
|
||||
"archive-board": "Arhiviraj tablo",
|
||||
"archive-card": "Arhiviraj kartico",
|
||||
"archive-list": "Arhiviraj seznam",
|
||||
"archive-swimlane": "Arhiviraj plavalno stezo",
|
||||
"archive-selection": "Arhiviraj označeno",
|
||||
"archiveBoardPopup-title": "Arhiviraj tablo?",
|
||||
"archived-items": "Arhiv",
|
||||
"archived-boards": "Table v arhivu",
|
||||
"restore-board": "Obnovi tablo",
|
||||
@@ -132,18 +132,20 @@
|
||||
"boardChangeVisibilityPopup-title": "Spremeni vidnost",
|
||||
"boardChangeWatchPopup-title": "Spremeni opazovanje",
|
||||
"boardMenuPopup-title": "Nastavitve table",
|
||||
"boardChangeViewPopup-title": "Pogled table",
|
||||
"boards": "Table",
|
||||
"board-view": "Pogled table",
|
||||
"board-view-cal": "Koledar",
|
||||
"board-view-swimlanes": "Plavalne steze",
|
||||
"board-view-collapse": "Skrči",
|
||||
"board-view-lists": "Seznami",
|
||||
"bucket-example": "Kot na primer \"Življenjski seznam\"",
|
||||
"cancel": "Prekliči",
|
||||
"card-archived": "Kartica je premaknjena v arhiv.",
|
||||
"board-archived": "Tabla je premaknjena v arhiv.",
|
||||
"card-comments-title": "Ta kartica ima %s komentar.",
|
||||
"card-delete-notice": "Brisanje je trajno. Izgubili boste vsa dejanja povezana s to kartico.",
|
||||
"card-delete-pop": "Vsa dejanja bodo odstranjena iz vira dejavnosti in kartice ne boste mogli znova odpreti. Razveljavitve ni.",
|
||||
"card-delete-notice": "Brisanje je trajno. Izgubili boste vsa dejanja, povezana s kartico.",
|
||||
"card-delete-pop": "Vsa dejanja bodo odstranjena iz zgodovine dejavnosti. Kartice ne boste mogli znova odpreti. Razveljavitve ni.",
|
||||
"card-delete-suggest-archive": "Kartico lahko premaknete v arhiv, da jo odstranite s table in ohranite dejavnost.",
|
||||
"card-due": "Rok",
|
||||
"card-due-on": "Rok",
|
||||
@@ -188,7 +190,7 @@
|
||||
"clipboard": "Odložišče ali povleci & spusti",
|
||||
"close": "Zapri",
|
||||
"close-board": "Zapri tablo",
|
||||
"close-board-pop": "Tablo boste lahko obnovili s klikom na gumb »Arhiviraj« na začetni glavi.",
|
||||
"close-board-pop": "Tablo boste lahko obnovili s klikom na gumb »Arhiviraj« na vstopni strani.",
|
||||
"color-black": "črna",
|
||||
"color-blue": "modra",
|
||||
"color-crimson": "temno rdeča",
|
||||
@@ -221,6 +223,8 @@
|
||||
"comment-only-desc": "Lahko komentirate samo na karticah.",
|
||||
"no-comments": "Ni komentarjev",
|
||||
"no-comments-desc": "Ne morete videti komentarjev in dejavnosti.",
|
||||
"worker": "Delavec",
|
||||
"worker-desc": "Lahko samo premikam kartice, se dodelim na kartico in komentiram.",
|
||||
"computer": "Računalnik",
|
||||
"confirm-subtask-delete-dialog": "Ste prepričani, da želite izbrisati podopravilo?",
|
||||
"confirm-checklist-delete-dialog": "Ste prepričani, da želite izbrisati kontrolni seznam?",
|
||||
@@ -229,7 +233,7 @@
|
||||
"searchElementPopup-title": "Išči",
|
||||
"copyCardPopup-title": "Kopiraj kartico",
|
||||
"copyChecklistToManyCardsPopup-title": "Kopiraj predlogo kontrolnega seznama na več kartic",
|
||||
"copyChecklistToManyCardsPopup-instructions": "Naslovi ciljnih kartic in opisi v tem JSON formatu",
|
||||
"copyChecklistToManyCardsPopup-instructions": "Naslovi ciljnih kartic in opisi v JSON formatu",
|
||||
"copyChecklistToManyCardsPopup-format": "[ {\"naslov\": \"Naslov prve kartice\", \"opis\":\"Opis prve kartice\"}, {\"naslov\":\"Opis druge kartice\",\"opis\":\"Opis druge kartice\"},{\"naslov\":\"Naslov zadnje kartice\",\"opis\":\"Opis zadnje kartice\"} ]",
|
||||
"create": "Ustvari",
|
||||
"createBoardPopup-title": "Ustvari tablo",
|
||||
@@ -289,8 +293,8 @@
|
||||
"email-verifyEmail-text": "Pozdravljeni __user__,\n\nDa preverite e-poštni naslov za vaš uporabniški račun, kliknite na spodnjo povezavo.\n\n__url__\n\nHvala.",
|
||||
"enable-wip-limit": "Vklopi omejitev št. kartic",
|
||||
"error-board-doesNotExist": "Ta tabla ne obstaja",
|
||||
"error-board-notAdmin": "Če želite to narediti, morate biti skrbnik te table",
|
||||
"error-board-notAMember": "Če želite to narediti, morate biti član te table",
|
||||
"error-board-notAdmin": "Nimate administrativnih pravic za tablo.",
|
||||
"error-board-notAMember": "Niste član table.",
|
||||
"error-json-malformed": "Vaše besedilo ni veljaven JSON",
|
||||
"error-json-schema": "Vaši JSON podatki ne vsebujejo pravilnih informacij v ustreznem formatu",
|
||||
"error-list-doesNotExist": "Seznam ne obstaja",
|
||||
@@ -300,8 +304,18 @@
|
||||
"error-username-taken": "To up. ime že obstaja",
|
||||
"error-email-taken": "E-poštni naslov je že zaseden",
|
||||
"export-board": "Izvozi tablo",
|
||||
"sort": "Sortiraj",
|
||||
"sort-desc": "Klikni za sortiranje seznama",
|
||||
"list-sort-by": "Sortiraj po:",
|
||||
"list-label-modifiedAt": "Nazadnje dostopano",
|
||||
"list-label-title": "Ime seznama",
|
||||
"list-label-sort": "Ročno nastavljen vrstni red",
|
||||
"list-label-short-modifiedAt": "(N)",
|
||||
"list-label-short-title": "(I)",
|
||||
"list-label-short-sort": "(R)",
|
||||
"filter": "Filtriraj",
|
||||
"filter-cards": "Filtriraj kartice",
|
||||
"filter-cards": "Filtriraj kartice ali sezname",
|
||||
"list-filter-label": "Filtriraj seznam po imenu",
|
||||
"filter-clear": "Počisti filter",
|
||||
"filter-no-label": "Brez oznake",
|
||||
"filter-no-member": "Brez člana",
|
||||
@@ -344,19 +358,19 @@
|
||||
"invalid-user": "Neveljaven uporabnik",
|
||||
"joined": "se je pridružil",
|
||||
"just-invited": "Povabljeni ste k tej tabli",
|
||||
"keyboard-shortcuts": "Bližnjične tipke",
|
||||
"keyboard-shortcuts": "Bližnjice",
|
||||
"label-create": "Ustvari Oznako",
|
||||
"label-default": "%s oznaka (privzeto)",
|
||||
"label-delete-pop": "Razveljavitve ni. To bo odstranilo to oznako iz vseh kartic in izbrisalo njeno zgodovino.",
|
||||
"label-delete-pop": "Razveljavitve ni. To bo odstranilo oznako iz vseh kartic in izbrisalo njeno zgodovino.",
|
||||
"labels": "Oznake",
|
||||
"language": "Jezik",
|
||||
"last-admin-desc": "Ne morete zamenjati vlog, ker mora obstajati vsaj en admin.",
|
||||
"leave-board": "Zapusti tablo",
|
||||
"leave-board-pop": "Ste prepričani, da želite zapustiti tablo __boardTitle__? Odstranjeni boste iz vseh kartic na tej tabli.",
|
||||
"leaveBoardPopup-title": "Zapusti tablo ?",
|
||||
"link-card": "Poveži s to kartico",
|
||||
"list-archive-cards": "Premakni vse kartice v tem seznamu v arhiv",
|
||||
"list-archive-cards-pop": "To bo odstranilo vse kartice tega seznama iz table. Da si ogledate kartice v arhivu in jih vrnete na tablo, kliknite \"Meni\" > \"arhiv\".",
|
||||
"link-card": "Poveži s kartico",
|
||||
"list-archive-cards": "Arhiviraj vse kartice v seznamu",
|
||||
"list-archive-cards-pop": "To bo odstranilo vse kartice tega seznama. Za ogled in vrnitev kartic iz arhiva na tablo, kliknite \"Meni\" > \"arhiv\".",
|
||||
"list-move-cards": "Premakni vse kartice na seznamu",
|
||||
"list-select-cards": "Izberi vse kartice na seznamu",
|
||||
"set-color-list": "Nastavi barvo",
|
||||
@@ -365,7 +379,7 @@
|
||||
"swimlaneAddPopup-title": "Dodaj plavalno stezo spodaj",
|
||||
"listImportCardPopup-title": "Uvozi Trello kartico",
|
||||
"listMorePopup-title": "Več",
|
||||
"link-list": "Poveži s tem seznamom",
|
||||
"link-list": "Poveži s seznamom",
|
||||
"list-delete-pop": "Vsa dejanja bodo odstranjena iz vira dejavnosti in seznama ne boste mogli obnoviti. Razveljavitve ni.",
|
||||
"list-delete-suggest-archive": "Lahko premaknete seznam v arhiv, da ga odstranite iz table in ohranite dejavnosti.",
|
||||
"lists": "Seznami",
|
||||
@@ -384,7 +398,7 @@
|
||||
"multi-selection": "Multi-Izbira",
|
||||
"multi-selection-on": "Multi-Izbira je omogočena",
|
||||
"muted": "Utišano",
|
||||
"muted-info": "O spremembah na tej tabli nikoli ne boste obveščeni",
|
||||
"muted-info": "O spremembah na tej tabli ne boste prejemali obvestil.",
|
||||
"my-boards": "Moje Table",
|
||||
"name": "Ime",
|
||||
"no-archived-cards": "Ni kartic v arhivu",
|
||||
@@ -398,7 +412,7 @@
|
||||
"notify-watch": "Prejemajte posodobitve opazovanih tabel, seznamov ali kartic",
|
||||
"optional": "opcijsko",
|
||||
"or": "ali",
|
||||
"page-maybe-private": "Ta stran je mogoče privatna. Verjetno si jo lahko ogledate po<a href='%s'>prijavi</a>.",
|
||||
"page-maybe-private": "Ta stran je morda privatna. Verjetno si jo lahko ogledate po<a href='%s'>prijavi</a>.",
|
||||
"page-not-found": "Stran ne obstaja.",
|
||||
"password": "Geslo",
|
||||
"paste-or-dragdrop": "prilepi ali povleci & spusti datoteko slike (samo slika)",
|
||||
@@ -407,10 +421,10 @@
|
||||
"previewAttachedImagePopup-title": "Predogled",
|
||||
"previewClipboardImagePopup-title": "Predogled",
|
||||
"private": "Zasebno",
|
||||
"private-desc": "Ta tabla je zasebna. Samo dodani uporabniki lahko vidijo ali urejajo vsebino.",
|
||||
"private-desc": "Ta tabla je zasebna. Vsebino lahko vidijo ali urejajo samo dodani uporabniki.",
|
||||
"profile": "Profil",
|
||||
"public": "Javno",
|
||||
"public-desc": "Ta tabla je javna. Vidna je vsakomur s povezavo do table in bo prikazana v zadetkih iskalnikov kot Google. Samo uporabniki table jo lahko urejajo.",
|
||||
"public-desc": "Ta tabla je javna. Vidna je vsakomur s povezavo do table in bo prikazana v zadetkih iskalnikov kot Google. Urejajo jo lahko samo člani table.",
|
||||
"quick-access-description": "Če tablo označite z zvezdico, bo tukaj dodana bližnjica.",
|
||||
"remove-cover": "Odstrani ovitek",
|
||||
"remove-from-board": "Odstrani iz table",
|
||||
@@ -426,30 +440,30 @@
|
||||
"save": "Shrani",
|
||||
"search": "Išči",
|
||||
"rules": "Pravila",
|
||||
"search-cards": "Išči po imenih kartic in opisih na tej tabli",
|
||||
"search-cards": "Išči po imenih seznamov/kartic in opisov v tej tabli",
|
||||
"search-example": "Besedilo za iskanje?",
|
||||
"select-color": "Izberi barvo",
|
||||
"set-wip-limit-value": "Nastavi omejitev maksimalnega števila opravil v tem seznamu",
|
||||
"setWipLimitPopup-title": "Nastavi omejitev št. kartic",
|
||||
"set-wip-limit-value": "Omeji maksimalno število opravil v seznamu",
|
||||
"setWipLimitPopup-title": "Omeji število kartic",
|
||||
"shortcut-assign-self": "Dodeli sebe k trenutni kartici",
|
||||
"shortcut-autocomplete-emoji": "Samodokončaj emoji",
|
||||
"shortcut-autocomplete-members": "Samodokončaj člane",
|
||||
"shortcut-clear-filters": "Počisti vse filtre",
|
||||
"shortcut-close-dialog": "Zapri dialog",
|
||||
"shortcut-filter-my-cards": "Filtriraj moje kartice",
|
||||
"shortcut-show-shortcuts": "Prikaži ta seznam bližnjic",
|
||||
"shortcut-show-shortcuts": "Prikaži seznam bližnjic",
|
||||
"shortcut-toggle-filterbar": "Preklopi stransko vrstico za filter",
|
||||
"shortcut-toggle-sidebar": "Preklopi stransko vrstico table",
|
||||
"show-cards-minimum-count": "Prikaži število kartic, če seznam vsebuje več kot",
|
||||
"sidebar-open": "Odpri stransko vrstico",
|
||||
"sidebar-close": "Zapri stransko vrstico",
|
||||
"signupPopup-title": "Ustvari up. račun",
|
||||
"star-board-title": "Kliknite, da označite to tablo z zvezdico. Prikazana bo na vrhu vašega seznama tabel.",
|
||||
"star-board-title": "Označite tablo z zvezdico, da bo prikazana na vrhu v seznamu tabel.",
|
||||
"starred-boards": "Table z zvezdico",
|
||||
"starred-boards-description": "Table z zvezdico se prikažejo na vrhu vašega seznama tabel.",
|
||||
"subscribe": "Naročite se",
|
||||
"team": "Skupina",
|
||||
"this-board": "to tablo",
|
||||
"this-board": "tablo",
|
||||
"this-card": "kartico",
|
||||
"spent-time-hours": "Porabljen čas (ure)",
|
||||
"overtime-hours": "Presežen čas (ure)",
|
||||
@@ -459,7 +473,7 @@
|
||||
"time": "Čas",
|
||||
"title": "Naslov",
|
||||
"tracking": "Sledenje",
|
||||
"tracking-info": "Obveščeni boste o vseh spremembah kartic, kjer sodelujete kot lastnik ali član.",
|
||||
"tracking-info": "Obveščeni boste o vseh spremembah nad karticami, kjer ste lastnik ali član.",
|
||||
"type": "Tip",
|
||||
"unassign-member": "Odjavi člana",
|
||||
"unsaved-description": "Imate neshranjen opis.",
|
||||
@@ -468,7 +482,7 @@
|
||||
"upload-avatar": "Naloži avatar",
|
||||
"uploaded-avatar": "Naložil avatar",
|
||||
"username": "Up. ime",
|
||||
"view-it": "Oglej",
|
||||
"view-it": "Poglej",
|
||||
"warn-list-archived": "opozorilo: ta kartica je v seznamu v arhivu",
|
||||
"watch": "Opazuj",
|
||||
"watching": "Opazuje",
|
||||
@@ -482,7 +496,7 @@
|
||||
"board-templates-swimlane": "Predloge table",
|
||||
"what-to-do": "Kaj želite storiti?",
|
||||
"wipLimitErrorPopup-title": "Neveljaven limit št. kartic",
|
||||
"wipLimitErrorPopup-dialog-pt1": "Število opravil v tem seznamu je višje od definiranega limita št. kartic.",
|
||||
"wipLimitErrorPopup-dialog-pt1": "Število opravil v seznamu je višje od limita št. kartic.",
|
||||
"wipLimitErrorPopup-dialog-pt2": "Prosimo premaknite nekaj opravil iz tega seznama ali nastavite višji limit št. kartic.",
|
||||
"admin-panel": "Skrbniška plošča",
|
||||
"settings": "Nastavitve",
|
||||
@@ -570,8 +584,8 @@
|
||||
"queue": "Čakalna vrsta",
|
||||
"subtask-settings": "Nastavitve podopravil",
|
||||
"boardSubtaskSettingsPopup-title": "Nastavitve podopravil table",
|
||||
"show-subtasks-field": "Dovoli pod-poravila na karticah",
|
||||
"deposit-subtasks-board": "Deponiraj podopravila na tole tablo:",
|
||||
"show-subtasks-field": "Dovoli podopravila na karticah",
|
||||
"deposit-subtasks-board": "Deponiraj podopravila na tablo:",
|
||||
"deposit-subtasks-list": "Ciljni seznam za deponirana podopravila:",
|
||||
"show-parent-in-minicard": "Pokaži starša na mini-kartici:",
|
||||
"prefix-with-full-path": "Predpona s celotno potjo",
|
||||
@@ -737,5 +751,7 @@
|
||||
"delete-user-confirm-popup": "Ali ste prepričani, da želite izbrisati ta račun? Razveljavitve ni.",
|
||||
"accounts-allowUserDelete": "Dovoli uporabnikom, da sami izbrišejo svoj račun",
|
||||
"hide-minicard-label-text": "Skrij besedilo oznak na karticah",
|
||||
"show-desktop-drag-handles": "Pokaži ročke za povleko na namizju"
|
||||
"show-desktop-drag-handles": "Pokaži ročke za povleko na namizju",
|
||||
"assignee": "Dodeljen član",
|
||||
"cardAssigneesPopup-title": "Dodeljen član"
|
||||
}
|
||||
+756
-740
File diff suppressed because it is too large.
Load diff
+756
-740
File diff suppressed because it is too large.
Load diff
+756
-740
File diff suppressed because it is too large.
Load diff
+756
-740
File diff suppressed because it is too large.
Load diff
+756
-740
File diff suppressed because it is too large.
Load diff
+22
-6
@@ -73,7 +73,7 @@
|
||||
"activity-unchecked-item-card": "unchecked %s in checklist %s",
|
||||
"activity-checklist-completed-card": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"activity-checklist-uncompleted-card": "uncompleted the checklist %s",
|
||||
"activity-editComment": "edited comment %s",
|
||||
"activity-editComment": "%s yorum düzenlendi",
|
||||
"activity-deleteComment": "deleted comment %s",
|
||||
"add-attachment": "Ek Ekle",
|
||||
"add-board": "Pano Ekle",
|
||||
@@ -132,10 +132,12 @@
|
||||
"boardChangeVisibilityPopup-title": "Görünebilirliği Değiştir",
|
||||
"boardChangeWatchPopup-title": "İzleme Durumunu Değiştir",
|
||||
"boardMenuPopup-title": "Pano Ayarları",
|
||||
"boardChangeViewPopup-title": "Pano Görünümü",
|
||||
"boards": "Panolar",
|
||||
"board-view": "Pano Görünümü",
|
||||
"board-view-cal": "Takvim",
|
||||
"board-view-swimlanes": "Kulvarlar",
|
||||
"board-view-collapse": "Collapse",
|
||||
"board-view-lists": "Listeler",
|
||||
"bucket-example": "Örn: \"Marketten Alacaklarım\"",
|
||||
"cancel": "İptal",
|
||||
@@ -164,7 +166,7 @@
|
||||
"cardLabelsPopup-title": "Etiketler",
|
||||
"cardMembersPopup-title": "Üyeler",
|
||||
"cardMorePopup-title": "Daha",
|
||||
"cardTemplatePopup-title": "Create template",
|
||||
"cardTemplatePopup-title": "Şablon oluştur",
|
||||
"cards": "Kartlar",
|
||||
"cards-count": "Kartlar",
|
||||
"casSignIn": "CAS ile giriş yapın",
|
||||
@@ -196,7 +198,7 @@
|
||||
"color-gold": "altın rengi",
|
||||
"color-gray": "gri",
|
||||
"color-green": "yeşil",
|
||||
"color-indigo": "indigo",
|
||||
"color-indigo": "çivit",
|
||||
"color-lime": "misket limonu",
|
||||
"color-magenta": "magenta",
|
||||
"color-mistyrose": "mistyrose",
|
||||
@@ -221,6 +223,8 @@
|
||||
"comment-only-desc": "Sadece kartlara yorum yazabilir.",
|
||||
"no-comments": "Yorum Yok",
|
||||
"no-comments-desc": "Yorumlar ve aktiviteleri göremiyorum.",
|
||||
"worker": "Worker",
|
||||
"worker-desc": "Can only move cards, assign itself to card and comment.",
|
||||
"computer": "Bilgisayar",
|
||||
"confirm-subtask-delete-dialog": "Alt görevi silmek istediğinizden emin misiniz?",
|
||||
"confirm-checklist-delete-dialog": "Kontrol listesini silmek istediğinden emin misin?",
|
||||
@@ -300,8 +304,18 @@
|
||||
"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",
|
||||
"sort": "Sort",
|
||||
"sort-desc": "Click to Sort List",
|
||||
"list-sort-by": "Sort the List By:",
|
||||
"list-label-modifiedAt": "Son Erişim Zamanı...",
|
||||
"list-label-title": "Listenin Adı...",
|
||||
"list-label-sort": "Your Manual Order",
|
||||
"list-label-short-modifiedAt": "(L)",
|
||||
"list-label-short-title": "(N)",
|
||||
"list-label-short-sort": "(M)",
|
||||
"filter": "Filtre",
|
||||
"filter-cards": "Kartları Filtrele",
|
||||
"filter-cards": "Filter Cards or Lists",
|
||||
"list-filter-label": "Filter List by Title",
|
||||
"filter-clear": "Filtreyi temizle",
|
||||
"filter-no-label": "Etiket yok",
|
||||
"filter-no-member": "Üye yok",
|
||||
@@ -426,7 +440,7 @@
|
||||
"save": "Kaydet",
|
||||
"search": "Arama",
|
||||
"rules": "Kurallar",
|
||||
"search-cards": "Bu panoda kart başlıkları ve açıklamalarında arama yap",
|
||||
"search-cards": "Search from card/list titles and descriptions on this board",
|
||||
"search-example": "Aranılacak metin?",
|
||||
"select-color": "Renk Seç",
|
||||
"set-wip-limit-value": "Bu listedeki en fazla öğe sayısı için bir sınır belirleyin",
|
||||
@@ -737,5 +751,7 @@
|
||||
"delete-user-confirm-popup": "Bu kullanıcı hesabını silmek istediğinize emin misiniz? Bu işlemi geri alamazsınız.",
|
||||
"accounts-allowUserDelete": "Kullanıcılara hesaplarını silmek için izin ver.",
|
||||
"hide-minicard-label-text": "Mini kart etiklerini gizle",
|
||||
"show-desktop-drag-handles": "Show desktop drag handles"
|
||||
"show-desktop-drag-handles": "Show desktop drag handles",
|
||||
"assignee": "Assignee",
|
||||
"cardAssigneesPopup-title": "Assignee"
|
||||
}
|
||||
+756
-740
File diff suppressed because it is too large.
Load diff
+756
-740
File diff suppressed because it is too large.
Load diff
+23
-7
@@ -113,7 +113,7 @@
|
||||
"archives": "归档",
|
||||
"template": "模板",
|
||||
"templates": "模板",
|
||||
"assign-member": "分配成员",
|
||||
"assign-member": "指派成员",
|
||||
"attached": "附加",
|
||||
"attachment": "附件",
|
||||
"attachment-delete-pop": "删除附件的操作不可逆。",
|
||||
@@ -132,10 +132,12 @@
|
||||
"boardChangeVisibilityPopup-title": "更改可视级别",
|
||||
"boardChangeWatchPopup-title": "更改关注状态",
|
||||
"boardMenuPopup-title": "看板设置",
|
||||
"boardChangeViewPopup-title": "看板视图",
|
||||
"boards": "看板",
|
||||
"board-view": "看板视图",
|
||||
"board-view-cal": "日历",
|
||||
"board-view-swimlanes": "泳道图",
|
||||
"board-view-collapse": "Collapse",
|
||||
"board-view-lists": "列表",
|
||||
"bucket-example": "例如 “目标清单”",
|
||||
"cancel": "取消",
|
||||
@@ -221,6 +223,8 @@
|
||||
"comment-only-desc": "只能在卡片上评论。",
|
||||
"no-comments": "暂无评论",
|
||||
"no-comments-desc": "无法查看评论和活动。",
|
||||
"worker": "Worker",
|
||||
"worker-desc": "Can only move cards, assign itself to card and comment.",
|
||||
"computer": "从本机上传",
|
||||
"confirm-subtask-delete-dialog": "确定要删除子任务吗?",
|
||||
"confirm-checklist-delete-dialog": "确定要删除清单吗?",
|
||||
@@ -300,8 +304,18 @@
|
||||
"error-username-taken": "此用户名已存在",
|
||||
"error-email-taken": "此EMail已存在",
|
||||
"export-board": "导出看板",
|
||||
"sort": "排序",
|
||||
"sort-desc": "点此来将列表排序",
|
||||
"list-sort-by": "按此来将列表排序:",
|
||||
"list-label-modifiedAt": "上次访问时间",
|
||||
"list-label-title": "列表名称",
|
||||
"list-label-sort": "您手动指定的顺序",
|
||||
"list-label-short-modifiedAt": "(L)",
|
||||
"list-label-short-title": "(N)",
|
||||
"list-label-short-sort": "(M)",
|
||||
"filter": "过滤",
|
||||
"filter-cards": "过滤卡片",
|
||||
"filter-cards": "过滤卡片或列表",
|
||||
"list-filter-label": "以标题过滤列表",
|
||||
"filter-clear": "清空过滤器",
|
||||
"filter-no-label": "无标签",
|
||||
"filter-no-member": "无成员",
|
||||
@@ -426,12 +440,12 @@
|
||||
"save": "保存",
|
||||
"search": "搜索",
|
||||
"rules": "规则",
|
||||
"search-cards": "搜索当前看板上的卡片标题和描述",
|
||||
"search-cards": "搜索当前看板上的卡片/列表标题和描述",
|
||||
"search-example": "搜索",
|
||||
"select-color": "选择颜色",
|
||||
"set-wip-limit-value": "设置此列表中的最大任务数",
|
||||
"setWipLimitPopup-title": "设置最大任务数",
|
||||
"shortcut-assign-self": "分配当前卡片给自己",
|
||||
"shortcut-assign-self": "指派当前卡片给自己",
|
||||
"shortcut-autocomplete-emoji": "表情符号自动补全",
|
||||
"shortcut-autocomplete-members": "自动补全成员",
|
||||
"shortcut-clear-filters": "清空全部过滤器",
|
||||
@@ -461,7 +475,7 @@
|
||||
"tracking": "跟踪",
|
||||
"tracking-info": "当任何包含您(作为创建者或成员)的卡片发生变更时,您将得到通知。",
|
||||
"type": "类型",
|
||||
"unassign-member": "取消分配成员",
|
||||
"unassign-member": "取消指派成员",
|
||||
"unsaved-description": "存在未保存的描述",
|
||||
"unwatch": "取消关注",
|
||||
"upload": "上传",
|
||||
@@ -559,7 +573,7 @@
|
||||
"setCardActionsColorPopup-title": "选择一种颜色",
|
||||
"setSwimlaneColorPopup-title": "选择一种颜色",
|
||||
"setListColorPopup-title": "选择一种颜色",
|
||||
"assigned-by": "分配人",
|
||||
"assigned-by": "指派人",
|
||||
"requested-by": "需求人",
|
||||
"board-delete-notice": "删除时永久操作,将会丢失此看板上的所有列表、卡片和动作。",
|
||||
"delete-board-confirm-popup": "所有列表、卡片、标签和活动都回被删除,将无法恢复看板内容。不支持撤销。",
|
||||
@@ -737,5 +751,7 @@
|
||||
"delete-user-confirm-popup": "确实要删除此帐户吗?此操作无法撤销。",
|
||||
"accounts-allowUserDelete": "允许用户自行删除其帐户",
|
||||
"hide-minicard-label-text": "隐藏迷你卡片标签文本",
|
||||
"show-desktop-drag-handles": "显示桌面拖放手柄"
|
||||
"show-desktop-drag-handles": "显示桌面拖放手柄",
|
||||
"assignee": "被指派人",
|
||||
"cardAssigneesPopup-title": "被指派人"
|
||||
}
|
||||
+756
-740
File diff suppressed because it is too large.
Load diff
+756
-740
File diff suppressed because it is too large.
Load diff
@@ -409,6 +409,27 @@ Boards.helpers({
|
||||
},
|
||||
|
||||
lists() {
|
||||
//currentUser = Meteor.user();
|
||||
//if (currentUser) {
|
||||
// enabled = Meteor.user().hasSortBy();
|
||||
//}
|
||||
//return enabled ? this.newestLists() : this.draggableLists();
|
||||
return this.draggableLists();
|
||||
},
|
||||
|
||||
newestLists() {
|
||||
// sorted lists from newest to the oldest, by its creation date or its cards' last modification date
|
||||
const value = Meteor.user()._getListSortBy();
|
||||
const sortKey = { starred: -1, [value[0]]: value[1] }; // [["starred",-1],value];
|
||||
return Lists.find(
|
||||
{
|
||||
boardId: this._id,
|
||||
archived: false,
|
||||
},
|
||||
{ sort: sortKey },
|
||||
);
|
||||
},
|
||||
draggableLists() {
|
||||
return Lists.find({ boardId: this._id }, { sort: { sort: 1 } });
|
||||
},
|
||||
|
||||
|
||||
+199
-12
@@ -203,6 +203,15 @@ Cards.attachSchema(
|
||||
optional: true,
|
||||
defaultValue: [],
|
||||
},
|
||||
assignees: {
|
||||
/**
|
||||
* who is assignee of the card (user ID),
|
||||
* maximum one ID of assignee in array.
|
||||
*/
|
||||
type: [String],
|
||||
optional: true,
|
||||
defaultValue: [],
|
||||
},
|
||||
receivedAt: {
|
||||
/**
|
||||
* Date the card was received
|
||||
@@ -411,6 +420,10 @@ Cards.helpers({
|
||||
return _.contains(this.getMembers(), memberId);
|
||||
},
|
||||
|
||||
isAssignee(assigneeId) {
|
||||
return _.contains(this.getAssignees(), assigneeId);
|
||||
},
|
||||
|
||||
activities() {
|
||||
if (this.isLinkedCard()) {
|
||||
return Activities.find(
|
||||
@@ -745,6 +758,20 @@ Cards.helpers({
|
||||
}
|
||||
},
|
||||
|
||||
getAssignees() {
|
||||
if (this.isLinkedCard()) {
|
||||
const card = Cards.findOne({ _id: this.linkedId });
|
||||
return card.assignees;
|
||||
} else if (this.isLinkedBoard()) {
|
||||
const board = Boards.findOne({ _id: this.linkedId });
|
||||
return board.activeMembers().map(assignee => {
|
||||
return assignee.userId;
|
||||
});
|
||||
} else {
|
||||
return this.assignees;
|
||||
}
|
||||
},
|
||||
|
||||
assignMember(memberId) {
|
||||
if (this.isLinkedCard()) {
|
||||
return Cards.update(
|
||||
@@ -762,6 +789,23 @@ Cards.helpers({
|
||||
}
|
||||
},
|
||||
|
||||
assignAssignee(assigneeId) {
|
||||
if (this.isLinkedCard()) {
|
||||
return Cards.update(
|
||||
{ _id: this.linkedId },
|
||||
{ $addToSet: { assignees: assigneeId } },
|
||||
);
|
||||
} else if (this.isLinkedBoard()) {
|
||||
const board = Boards.findOne({ _id: this.linkedId });
|
||||
return board.addAssignee(assigneeId);
|
||||
} else {
|
||||
return Cards.update(
|
||||
{ _id: this._id },
|
||||
{ $addToSet: { assignees: assigneeId } },
|
||||
);
|
||||
}
|
||||
},
|
||||
|
||||
unassignMember(memberId) {
|
||||
if (this.isLinkedCard()) {
|
||||
return Cards.update(
|
||||
@@ -776,6 +820,23 @@ Cards.helpers({
|
||||
}
|
||||
},
|
||||
|
||||
unassignAssignee(assigneeId) {
|
||||
if (this.isLinkedCard()) {
|
||||
return Cards.update(
|
||||
{ _id: this.linkedId },
|
||||
{ $pull: { assignees: assigneeId } },
|
||||
);
|
||||
} else if (this.isLinkedBoard()) {
|
||||
const board = Boards.findOne({ _id: this.linkedId });
|
||||
return board.removeAssignee(assigneeId);
|
||||
} else {
|
||||
return Cards.update(
|
||||
{ _id: this._id },
|
||||
{ $pull: { assignees: assigneeId } },
|
||||
);
|
||||
}
|
||||
},
|
||||
|
||||
toggleMember(memberId) {
|
||||
if (this.getMembers() && this.getMembers().indexOf(memberId) > -1) {
|
||||
return this.unassignMember(memberId);
|
||||
@@ -784,6 +845,14 @@ Cards.helpers({
|
||||
}
|
||||
},
|
||||
|
||||
toggleAssignee(assigneeId) {
|
||||
if (this.getAssignees() && this.getAssignees().indexOf(assigneeId) > -1) {
|
||||
return this.unassignAssignee(assigneeId);
|
||||
} else {
|
||||
return this.assignAssignee(assigneeId);
|
||||
}
|
||||
},
|
||||
|
||||
getReceived() {
|
||||
if (this.isLinkedCard()) {
|
||||
const card = Cards.findOne({ _id: this.linkedId });
|
||||
@@ -1126,6 +1195,19 @@ Cards.mutations({
|
||||
};
|
||||
},
|
||||
|
||||
assignAssignee(assigneeId) {
|
||||
// If there is not any assignee, allow one assignee, not more.
|
||||
if (this.getAssignees().length === 0) {
|
||||
return {
|
||||
$addToSet: {
|
||||
assignees: assigneeId,
|
||||
},
|
||||
};
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
},
|
||||
|
||||
unassignMember(memberId) {
|
||||
return {
|
||||
$pull: {
|
||||
@@ -1134,6 +1216,14 @@ Cards.mutations({
|
||||
};
|
||||
},
|
||||
|
||||
unassignAssignee(assigneeId) {
|
||||
return {
|
||||
$pull: {
|
||||
assignees: assigneeId,
|
||||
},
|
||||
};
|
||||
},
|
||||
|
||||
toggleMember(memberId) {
|
||||
if (this.members && this.members.indexOf(memberId) > -1) {
|
||||
return this.unassignMember(memberId);
|
||||
@@ -1142,6 +1232,14 @@ Cards.mutations({
|
||||
}
|
||||
},
|
||||
|
||||
toggleAssignee(assigneeId) {
|
||||
if (this.assignees && this.assignees.indexOf(assigneeId) > -1) {
|
||||
return this.unassignAssignee(assigneeId);
|
||||
} else {
|
||||
return this.assignAssignee(assigneeId);
|
||||
}
|
||||
},
|
||||
|
||||
assignCustomField(customFieldId) {
|
||||
return {
|
||||
$addToSet: {
|
||||
@@ -1436,6 +1534,46 @@ function cardMembers(userId, doc, fieldNames, modifier) {
|
||||
}
|
||||
}
|
||||
|
||||
function cardAssignees(userId, doc, fieldNames, modifier) {
|
||||
if (!_.contains(fieldNames, 'assignees')) return;
|
||||
let assigneeId;
|
||||
// Say hello to the new assignee
|
||||
if (modifier.$addToSet && modifier.$addToSet.assignees) {
|
||||
assigneeId = modifier.$addToSet.assignees;
|
||||
const username = Users.findOne(assigneeId).username;
|
||||
if (!_.contains(doc.assignees, assigneeId)) {
|
||||
Activities.insert({
|
||||
userId,
|
||||
username,
|
||||
activityType: 'joinAssignee',
|
||||
boardId: doc.boardId,
|
||||
cardId: doc._id,
|
||||
assigneeId,
|
||||
listId: doc.listId,
|
||||
swimlaneId: doc.swimlaneId,
|
||||
});
|
||||
}
|
||||
}
|
||||
// Say goodbye to the former assignee
|
||||
if (modifier.$pull && modifier.$pull.assignees) {
|
||||
assigneeId = modifier.$pull.assignees;
|
||||
const username = Users.findOne(assigneeId).username;
|
||||
// Check that the former assignee is assignee of the card
|
||||
if (_.contains(doc.assignees, assigneeId)) {
|
||||
Activities.insert({
|
||||
userId,
|
||||
username,
|
||||
activityType: 'unjoinAssignee',
|
||||
boardId: doc.boardId,
|
||||
cardId: doc._id,
|
||||
assigneeId,
|
||||
listId: doc.listId,
|
||||
swimlaneId: doc.swimlaneId,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function cardLabels(userId, doc, fieldNames, modifier) {
|
||||
if (!_.contains(fieldNames, 'labelIds')) return;
|
||||
let labelId;
|
||||
@@ -1673,6 +1811,12 @@ if (Meteor.isServer) {
|
||||
updateActivities(doc, fieldNames, modifier);
|
||||
});
|
||||
|
||||
// Add a new activity if we add or remove a assignee to the card
|
||||
Cards.before.update((userId, doc, fieldNames, modifier) => {
|
||||
cardAssignees(userId, doc, fieldNames, modifier);
|
||||
updateActivities(doc, fieldNames, modifier);
|
||||
});
|
||||
|
||||
// Add a new activity if we add or remove a label to the card
|
||||
Cards.before.update((userId, doc, fieldNames, modifier) => {
|
||||
cardLabels(userId, doc, fieldNames, modifier);
|
||||
@@ -1695,6 +1839,26 @@ if (Meteor.isServer) {
|
||||
const oldvalue = doc[action] || '';
|
||||
const activityType = `a-${action}`;
|
||||
const card = Cards.findOne(doc._id);
|
||||
const list = card.list();
|
||||
if (list) {
|
||||
// change list modifiedAt, when user modified the key values in timingaction array, if it's endAt, put the modifiedAt of list back to one year ago for sorting purpose
|
||||
const modifiedAt = new Date(
|
||||
new Date(value).getTime() -
|
||||
(action === 'endAt' ? 365 * 24 * 3600 * 1e3 : 0),
|
||||
); // set it as 1 year before
|
||||
const boardId = list.boardId;
|
||||
Lists.direct.update(
|
||||
{
|
||||
_id: list._id,
|
||||
},
|
||||
{
|
||||
$set: {
|
||||
modifiedAt,
|
||||
boardId,
|
||||
},
|
||||
},
|
||||
);
|
||||
}
|
||||
const username = Users.findOne(userId).username;
|
||||
const activity = {
|
||||
userId,
|
||||
@@ -1832,14 +1996,22 @@ if (Meteor.isServer) {
|
||||
* @param {string} description the description of the new card
|
||||
* @param {string} swimlaneId the swimlane ID of the new card
|
||||
* @param {string} [members] the member IDs list of the new card
|
||||
* @param {string} [assignees] the array of maximum one ID of assignee of the new card
|
||||
* @return_type {_id: string}
|
||||
*/
|
||||
JsonRoutes.add('POST', '/api/boards/:boardId/lists/:listId/cards', function(
|
||||
req,
|
||||
res,
|
||||
) {
|
||||
Authentication.checkUserId(req.userId);
|
||||
// Check user is logged in
|
||||
Authentication.checkLoggedIn(req.userId);
|
||||
const paramBoardId = req.params.boardId;
|
||||
// Check user has permission to add card to the board
|
||||
const board = Boards.findOne({
|
||||
_id: paramBoardId
|
||||
});
|
||||
const addPermission = allowIsBoardMemberCommentOnly(req.userId, board);
|
||||
Authentication.checkAdminOrCondition(req.userId, addPermission);
|
||||
const paramListId = req.params.listId;
|
||||
const paramParentId = req.params.parentId;
|
||||
const currentCards = Cards.find(
|
||||
@@ -1852,15 +2024,9 @@ if (Meteor.isServer) {
|
||||
const check = Users.findOne({
|
||||
_id: req.body.authorId,
|
||||
});
|
||||
const members = req.body.members || [req.body.authorId];
|
||||
const assignees = req.body.assignees;
|
||||
if (typeof check !== 'undefined') {
|
||||
let members = req.body.members || [];
|
||||
if (_.isString(members)) {
|
||||
if (members === '') {
|
||||
members = [];
|
||||
} else {
|
||||
members = [members];
|
||||
}
|
||||
}
|
||||
const id = Cards.direct.insert({
|
||||
title: req.body.title,
|
||||
boardId: paramBoardId,
|
||||
@@ -1871,6 +2037,7 @@ if (Meteor.isServer) {
|
||||
swimlaneId: req.body.swimlaneId,
|
||||
sort: currentCards.count(),
|
||||
members,
|
||||
assignees,
|
||||
});
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
@@ -1922,6 +2089,7 @@ if (Meteor.isServer) {
|
||||
* @param {string} [labelIds] the new list of label IDs attached to the card
|
||||
* @param {string} [swimlaneId] the new swimlane ID of the card
|
||||
* @param {string} [members] the new list of member IDs attached to the card
|
||||
* @param {string} [assignees] the array of maximum one ID of assignee attached to the card
|
||||
* @param {string} [requestedBy] the new requestedBy field of the card
|
||||
* @param {string} [assignedBy] the new assignedBy field of the card
|
||||
* @param {string} [receivedAt] the new receivedAt field of the card
|
||||
@@ -2182,6 +2350,25 @@ if (Meteor.isServer) {
|
||||
{ $set: { members: newmembers } },
|
||||
);
|
||||
}
|
||||
if (req.body.hasOwnProperty('assignees')) {
|
||||
let newassignees = req.body.assignees;
|
||||
if (_.isString(newassignees)) {
|
||||
if (newassignees === '') {
|
||||
newassignees = null;
|
||||
} else {
|
||||
newassignees = [newassignees];
|
||||
}
|
||||
}
|
||||
Cards.direct.update(
|
||||
{
|
||||
_id: paramCardId,
|
||||
listId: paramListId,
|
||||
boardId: paramBoardId,
|
||||
archived: false,
|
||||
},
|
||||
{ $set: { assignees: newassignees } },
|
||||
);
|
||||
}
|
||||
if (req.body.hasOwnProperty('swimlaneId')) {
|
||||
const newParamSwimlaneId = req.body.swimlaneId;
|
||||
Cards.direct.update(
|
||||
@@ -2224,14 +2411,14 @@ if (Meteor.isServer) {
|
||||
const paramListId = req.params.listId;
|
||||
const paramCardId = req.params.cardId;
|
||||
|
||||
const card = Cards.findOne({
|
||||
_id: paramCardId,
|
||||
});
|
||||
Cards.direct.remove({
|
||||
_id: paramCardId,
|
||||
listId: paramListId,
|
||||
boardId: paramBoardId,
|
||||
});
|
||||
const card = Cards.find({
|
||||
_id: paramCardId,
|
||||
});
|
||||
cardRemover(req.body.authorId, card);
|
||||
JsonRoutes.sendResult(res, {
|
||||
code: 200,
|
||||
|
||||
@@ -283,8 +283,15 @@ if (Meteor.isServer) {
|
||||
'POST',
|
||||
'/api/boards/:boardId/cards/:cardId/checklists',
|
||||
function(req, res) {
|
||||
Authentication.checkUserId(req.userId);
|
||||
|
||||
// Check user is logged in
|
||||
Authentication.checkLoggedIn(req.userId);
|
||||
const paramBoardId = req.params.boardId;
|
||||
// Check user has permission to add checklist to the card
|
||||
const board = Boards.findOne({
|
||||
_id: paramBoardId
|
||||
});
|
||||
const addPermission = allowIsBoardMemberCommentOnly(req.userId, board);
|
||||
Authentication.checkAdminOrCondition(req.userId, addPermission);
|
||||
const paramCardId = req.params.cardId;
|
||||
const id = Checklists.insert({
|
||||
title: req.body.title,
|
||||
|
||||
+16
-1
@@ -50,12 +50,18 @@ if (Meteor.isServer) {
|
||||
});
|
||||
}
|
||||
|
||||
// exporter maybe is broken since Gridfs introduced, add fs and path
|
||||
|
||||
export class Exporter {
|
||||
constructor(boardId) {
|
||||
this._boardId = boardId;
|
||||
}
|
||||
|
||||
build() {
|
||||
const fs = Npm.require('fs');
|
||||
const os = Npm.require('os');
|
||||
const path = Npm.require('path');
|
||||
|
||||
const byBoard = { boardId: this._boardId };
|
||||
const byBoardNoLinked = {
|
||||
boardId: this._boardId,
|
||||
@@ -106,7 +112,7 @@ export class Exporter {
|
||||
);
|
||||
result.subtaskItems.push(
|
||||
...Cards.find({
|
||||
parentid: card._id,
|
||||
parentId: card._id,
|
||||
}).fetch(),
|
||||
);
|
||||
});
|
||||
@@ -134,6 +140,11 @@ export class Exporter {
|
||||
const getBase64Data = function(doc, callback) {
|
||||
let buffer = new Buffer(0);
|
||||
// callback has the form function (err, res) {}
|
||||
const tmpFile = path.join(
|
||||
os.tmpdir(),
|
||||
`tmpexport${process.pid}${Math.random()}`,
|
||||
);
|
||||
const tmpWriteable = fs.createWriteStream(tmpFile);
|
||||
const readStream = doc.createReadStream();
|
||||
readStream.on('data', function(chunk) {
|
||||
buffer = Buffer.concat([buffer, chunk]);
|
||||
@@ -143,8 +154,12 @@ export class Exporter {
|
||||
});
|
||||
readStream.on('end', function() {
|
||||
// done
|
||||
fs.unlink(tmpFile, () => {
|
||||
//ignored
|
||||
});
|
||||
callback(null, buffer.toString('base64'));
|
||||
});
|
||||
readStream.pipe(tmpWriteable);
|
||||
};
|
||||
const getBase64DataSync = Meteor.wrapAsync(getBase64Data);
|
||||
result.attachments = Attachments.find(byBoard)
|
||||
|
||||
Loaded 100 of 129 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user