mirror of
https://github.com/wekan/wekan.git
synced 2026-11-06 10:45:03 -05:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5a3fab4f65 | ||
|
|
0a3d2c2868 | ||
|
|
57166b891a | ||
|
|
a805eb09df | ||
|
|
6cb84673d4 | ||
|
|
aa2c3774a2 | ||
|
|
b485c7304f | ||
|
|
bbc6d0955c | ||
|
|
d610d03423 | ||
|
|
58e1084ba5 | ||
|
|
cf7c051242 | ||
|
|
a92eafce80 | ||
|
|
b62bce388c | ||
|
|
e309b53ded | ||
|
|
1813400ecf | ||
|
|
5d09fca481 | ||
|
|
c99a86cdb0 | ||
|
|
072d239a85 | ||
|
|
9e44ccaf5d | ||
|
|
86d86b30e9 | ||
|
|
b2edacbd12 | ||
|
|
a6ec394730 | ||
|
|
4ae0d49431 | ||
|
|
eaea1936a0 | ||
|
|
315597dcff | ||
|
|
51ed0acc4f | ||
|
|
a06e971a53 | ||
|
|
33f39d047f | ||
|
|
98de6ae0db | ||
|
|
6b4613d3ed | ||
|
|
eace04db8e | ||
|
|
3772ce3aca | ||
|
|
663e2823fa | ||
|
|
77927a1ca4 | ||
|
|
6bf1fcbbc7 | ||
|
|
0f6d84d69f | ||
|
|
9d6cb7fbdb | ||
|
|
29572de2e7 | ||
|
|
3a0269640b | ||
|
|
9a15750e7c | ||
|
|
ebfabba284 | ||
|
|
05c34cefde | ||
|
|
4097301e60 | ||
|
|
04827fd8f0 | ||
|
|
1e4fba3ec8 | ||
|
|
ba1d04b99f | ||
|
|
ed72ef0e5e | ||
|
|
2287758fdc | ||
|
|
c6fa37640a | ||
|
|
4907bf5030 | ||
|
|
85edae924e | ||
|
|
e6561462e9 | ||
|
|
0d3b7ca041 | ||
|
|
8fc23429a0 | ||
|
|
bfffe58672 | ||
|
|
ca35970f3f | ||
|
|
f26f86dd3f | ||
|
|
63d000fbbb | ||
|
|
17f97f6acc | ||
|
|
33657a9ed1 | ||
|
|
43a7096753 | ||
|
|
fbe1f5f948 | ||
|
|
a21883e3a1 | ||
|
|
af2da93423 | ||
|
|
14f832f955 | ||
|
|
6ec81ccbc1 | ||
|
|
d470a74a9f | ||
|
|
cee1dd94ee | ||
|
|
c587d34158 | ||
|
|
68e4e6f049 | ||
|
|
5c81cfbd7b | ||
|
|
edc610d019 | ||
|
|
5ca84d2930 | ||
|
|
6f864c5022 | ||
|
|
3c3adef26a | ||
|
|
f533aa8d8e | ||
|
|
c1d449d3bd | ||
|
|
2c2f906c8b | ||
|
|
9e0d7ee00f | ||
|
|
11e467618d | ||
|
|
f315721fef | ||
|
|
8eb4ffea89 | ||
|
|
f20ca31a3f | ||
|
|
f4e11ff7c5 | ||
|
|
f6fbd0a5c2 | ||
|
|
25443926d3 | ||
|
|
03a75c9c05 | ||
|
|
6a20f6dc70 | ||
|
|
3d2fbf1397 | ||
|
|
d0f1382055 | ||
|
|
0de353508a | ||
|
|
c291b9ebb8 | ||
|
|
24566ce853 | ||
|
|
c64a221453 | ||
|
|
469d81f8a5 | ||
|
|
503f6128bd | ||
|
|
e1398d04da | ||
|
|
79add98aa7 | ||
|
|
7a6098774d | ||
|
|
ce1f8b674d | ||
|
|
11e666f229 | ||
|
|
c131b983b3 | ||
|
|
a9334b3bf4 | ||
|
|
c437c0d3f1 | ||
|
|
97109df673 | ||
|
|
d4338dd5cc | ||
|
|
15ce816ec6 | ||
|
|
3e921da314 | ||
|
|
dc210dc53b | ||
|
|
43135ffc8d | ||
|
|
1516615934 | ||
|
|
e37bf2b51d | ||
|
|
0553e36bfb | ||
|
|
03deeb6729 | ||
|
|
a06d1806df | ||
|
|
0a4e472601 | ||
|
|
f320069ec8 | ||
|
|
20c2679dc8 | ||
|
|
464bc2f87b | ||
|
|
3aba91885f | ||
|
|
110a83a736 | ||
|
|
af120f2e0b | ||
|
|
ea937810f2 | ||
|
|
a6b4a698af | ||
|
|
778084e934 | ||
|
|
c23f5dc858 | ||
|
|
2cd8cfc9b9 | ||
|
|
2bb1feee51 | ||
|
|
0e6a1a171e | ||
|
|
f833d1288f | ||
|
|
cfccee897e | ||
|
|
ea5025595a | ||
|
|
344aeb4051 | ||
|
|
db8e707049 | ||
|
|
f6f5c7ccf0 | ||
|
|
43f380c17a | ||
|
|
e6b705be26 | ||
|
|
b5d311c00c | ||
|
|
91b1713bf7 | ||
|
|
9274501939 | ||
|
|
7c619859fc | ||
|
|
c091fa5993 | ||
|
|
f9934eeec9 | ||
|
|
98b7953d7f | ||
|
|
feb6fb72f4 | ||
|
|
c63c84e2ea | ||
|
|
b334a4ee00 | ||
|
|
8566f32bbd | ||
|
|
af4bcb47e7 | ||
|
|
8560b36a5a | ||
|
|
6fbd817e83 | ||
|
|
a86ea22303 | ||
|
|
54e6e32ab2 | ||
|
|
dbcc8539bc | ||
|
|
65dee38150 | ||
|
|
ee3c5cbb6a | ||
|
|
f480f945c5 | ||
|
|
9824b90e69 | ||
|
|
e6c3995713 | ||
|
|
d7bb0b4cc0 | ||
|
|
3762768ed3 | ||
|
|
61d2fd0308 | ||
|
|
458b372b1b | ||
|
|
6eb1495c3b | ||
|
|
e9a251d6a8 | ||
|
|
b712380661 | ||
|
|
abf76b92d4 | ||
|
|
43360c103b | ||
|
|
ec4564d994 | ||
|
|
49a023733a | ||
|
|
339e044a30 | ||
|
|
01c938d6b2 | ||
|
|
cb42fa37b1 | ||
|
|
37f9de8b9b | ||
|
|
08e18200c6 | ||
|
|
3ddb97c8c9 | ||
|
|
4941fd183c | ||
|
|
2be017cf4a | ||
|
|
1b30485e68 | ||
|
|
0c224a0a7f | ||
|
|
d7292690bd | ||
|
|
1467f3de31 | ||
|
|
063ad08e9e | ||
|
|
ed3223fedc | ||
|
|
a551f2bcc7 | ||
|
|
0efc9aca15 | ||
|
|
73ea39466b | ||
|
|
ec2b008552 | ||
|
|
86d6d2d19a | ||
|
|
26f8df2995 | ||
|
|
b0758449bc | ||
|
|
b433fbdda8 | ||
|
|
2e1ca73379 | ||
|
|
14e5d08a19 | ||
|
|
aeb29a4f95 | ||
|
|
27198c4064 | ||
|
|
bba1f9e133 | ||
|
|
fd6f2132af | ||
|
|
a24c47901f | ||
|
|
d37adbb046 | ||
|
|
0f0fab28b0 | ||
|
|
69c3bdf553 | ||
|
|
6594795f39 | ||
|
|
36ae118afc | ||
|
|
b062eb8af4 | ||
|
|
404fbacc41 | ||
|
|
986b8e0463 | ||
|
|
6289dcf4c2 | ||
|
|
5b883f4ea6 | ||
|
|
58da4e4004 | ||
|
|
c2dc80c452 | ||
|
|
1b95f9f167 | ||
|
|
72c44e703f | ||
|
|
8e17177331 | ||
|
|
e825480b57 | ||
|
|
b2a555f996 | ||
|
|
b2fd576f36 | ||
|
|
1c4b54d1ad | ||
|
|
b36920e657 | ||
|
|
b3056626f3 | ||
|
|
760dde2c10 | ||
|
|
e7a2e8302c | ||
|
|
e81900178e | ||
|
|
648adb414e | ||
|
|
e3149289db | ||
|
|
b680cf4938 | ||
|
|
69d454dd03 | ||
|
|
703c849482 | ||
|
|
284f440136 | ||
|
|
b00169d24f | ||
|
|
267becdb9a | ||
|
|
054d420dc9 | ||
|
|
0fbc6efbcf | ||
|
|
63f5c88a15 | ||
|
|
24598eaf00 | ||
|
|
aa067b777a | ||
|
|
2e9fca93ec | ||
|
|
c2f5355f9a | ||
|
|
9fdf739695 | ||
|
|
17f8f8f14f | ||
|
|
9a68c96585 | ||
|
|
ed2a725a2c | ||
|
|
8914d4404e | ||
|
|
c5dd0b729d | ||
|
|
f4f9c501d1 | ||
|
|
239dd1a341 | ||
|
|
ee254cb9c8 | ||
|
|
05a98fa88b | ||
|
|
5df5c7f5d7 | ||
|
|
ccea223ef7 | ||
|
|
25f9963645 | ||
|
|
b1c41518df | ||
|
|
ae09f0f008 | ||
|
|
490ad65b6e | ||
|
|
cb78501b04 | ||
|
|
65a031f29d | ||
|
|
6c94b57cfc | ||
|
|
7ae15cae27 | ||
|
|
0596595284 | ||
|
|
724d1386f6 | ||
|
|
920b32735f | ||
|
|
86aa7ff353 | ||
|
|
20d87f2299 | ||
|
|
88f05e8c4e | ||
|
|
c3bfcb78e9 | ||
|
|
83a78c792a | ||
|
|
99b2fdbf99 | ||
|
|
7ca9e8f4d3 | ||
|
|
dac85c0a03 | ||
|
|
04e04ead92 | ||
|
|
008fc806e8 | ||
|
|
af7874b700 | ||
|
|
94e1fa79b3 | ||
|
|
6694088ac7 | ||
|
|
b4c74b8d4c | ||
|
|
28612612bd | ||
|
|
f2f834e810 | ||
|
|
3e5f8f458c | ||
|
|
cffb5baa68 | ||
|
|
01d0dd3b1d | ||
|
|
c8bb3c7353 | ||
|
|
709b17805b | ||
|
|
e9982e34ed | ||
|
|
1c2c3d9dea | ||
|
|
bd26ed7f7a | ||
|
|
c48299c0dd | ||
|
|
753c54a741 | ||
|
|
48a9fe3440 | ||
|
|
be1893e66a | ||
|
|
0d67a86f2c | ||
|
|
6e979beb01 | ||
|
|
12615fef5d | ||
|
|
403e2f4cbd | ||
|
|
6b4ffa69c6 | ||
|
|
0f65e06338 | ||
|
|
84d51393e4 | ||
|
|
51fb490c22 | ||
|
|
f9e25e028e | ||
|
|
937797356c | ||
|
|
21ae1b59d6 | ||
|
|
e25050316f | ||
|
|
2e06d466b9 | ||
|
|
5739b5d93c | ||
|
|
6b6bdddce6 | ||
|
|
dcff70c983 | ||
|
|
ad5167de55 | ||
|
|
947692693c | ||
|
|
0c8e812991 | ||
|
|
fb1742b149 | ||
|
|
054915031e | ||
|
|
ada6b8ee9c | ||
|
|
63e0597c68 | ||
|
|
c71cedf9f4 | ||
|
|
f6ee321d0f | ||
|
|
2a24720fad | ||
|
|
a7fd512124 | ||
|
|
b7f62cf5f2 | ||
|
|
dfea3d0e73 | ||
|
|
e4e1a8f4e6 | ||
|
|
43b2d71404 | ||
|
|
c9f8e111c5 | ||
|
|
67596602d7 | ||
|
|
5af4f54f4c | ||
|
|
0d7d38b358 | ||
|
|
680770a7df | ||
|
|
14c3432896 | ||
|
|
34fc724d95 | ||
|
|
1ed2c3b45a | ||
|
|
81f74f4db6 | ||
|
|
b5bc07d2e7 | ||
|
|
85fcaff678 | ||
|
|
d5247daf8a | ||
|
|
9ff87d189f | ||
|
|
2d36116823 | ||
|
|
9f0b9b29a5 | ||
|
|
1d7e08390c | ||
|
|
bbffa2eb6b | ||
|
|
52ea940265 | ||
|
|
355b358fe2 | ||
|
|
d74662bfd7 | ||
|
|
e151da7163 | ||
|
|
1c71baec81 | ||
|
|
9382c2cd04 | ||
|
|
25e50e3908 | ||
|
|
c6331830d4 | ||
|
|
4226a0bc37 | ||
|
|
693a49f852 | ||
|
|
0b797ceb7e | ||
|
|
2587e2f00a | ||
|
|
6ad83bcaeb | ||
|
|
f2815a9039 | ||
|
|
6d7e69cc9f | ||
|
|
fac1ba5952 | ||
|
|
3db14ad03a | ||
|
|
9ca26d22d0 | ||
|
|
7640c7c04d | ||
|
|
ea66eca60d | ||
|
|
0ae8de4c04 | ||
|
|
e50d69cfb7 | ||
|
|
d95436df51 | ||
|
|
3b419848d1 | ||
|
|
8efc8605a1 | ||
|
|
4f44c5bf87 | ||
|
|
4b12245537 | ||
|
|
adcc33ed7f | ||
|
|
f1482cfa94 | ||
|
|
2e354f9b1e | ||
|
|
b97c51abde | ||
|
|
8c8560cfc2 |
No files matched your search
@@ -10,7 +10,7 @@ ENV DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
ENV \
|
||||
DEBUG=false \
|
||||
NODE_VERSION=v14.19.3 \
|
||||
NODE_VERSION=v14.20.0 \
|
||||
METEOR_RELEASE=1.10.2 \
|
||||
USE_EDGE=false \
|
||||
METEOR_EDGE=1.5-beta.17 \
|
||||
@@ -30,6 +30,12 @@ ENV \
|
||||
RICHER_CARD_COMMENT_EDITOR=false \
|
||||
CARD_OPENED_WEBHOOK_ENABLED=false \
|
||||
ATTACHMENTS_STORE_PATH="" \
|
||||
ATTACHMENTS_UPLOAD_EXTERNAL_PROGRAM="" \
|
||||
ATTACHMENTS_UPLOAD_MIME_TYPES="" \
|
||||
ATTACHMENTS_UPLOAD_MAX_SIZE=0 \
|
||||
AVATARS_UPLOAD_EXTERNAL_PROGRAM="" \
|
||||
AVATARS_UPLOAD_MIME_TYPES="" \
|
||||
AVATARS_UPLOAD_MAX_SIZE=0 \
|
||||
MAX_IMAGE_PIXEL="" \
|
||||
IMAGE_COMPRESS_RATIO="" \
|
||||
NOTIFICATION_TRAY_AFTER_READ_DAYS_BEFORE_REMOVE="" \
|
||||
|
||||
@@ -81,7 +81,7 @@ parts:
|
||||
wekan:
|
||||
source: .
|
||||
plugin: nodejs
|
||||
node-engine: 14.19.3
|
||||
node-engine: 14.20.0
|
||||
node-packages:
|
||||
- node-gyp
|
||||
- node-pre-gyp
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
@@ -9,8 +9,15 @@ on:
|
||||
schedule:
|
||||
- cron: '0 16 * * 3'
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
analyze:
|
||||
permissions:
|
||||
actions: read # for github/codeql-action/init to get workflow details
|
||||
contents: read # for actions/checkout to fetch code
|
||||
security-events: write # for github/codeql-action/autobuild to send a status report
|
||||
name: Analyze
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
@@ -25,7 +32,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
# We must fetch at least the immediate parents so that if this is
|
||||
# a pull request then we can checkout the head.
|
||||
@@ -38,14 +45,14 @@ jobs:
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v1
|
||||
uses: github/codeql-action/init@v2
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
|
||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||
# If this step fails, then you should remove it and run the build manually (see below)
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@v1
|
||||
uses: github/codeql-action/autobuild@v2
|
||||
|
||||
# ℹ️ Command-line programs to run using the OS shell.
|
||||
# 📚 https://git.io/JvXDl
|
||||
@@ -59,4 +66,4 @@ jobs:
|
||||
# make release
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v1
|
||||
uses: github/codeql-action/analyze@v2
|
||||
@@ -0,0 +1,14 @@
|
||||
name: 'Dependency Review'
|
||||
on: [pull_request]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
dependency-review:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: 'Checkout Repository'
|
||||
uses: actions/checkout@v3
|
||||
- name: 'Dependency Review'
|
||||
uses: actions/dependency-review-action@v2
|
||||
@@ -32,13 +32,13 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v3
|
||||
|
||||
# Login against a Docker registry except on PR
|
||||
# https://github.com/docker/login-action
|
||||
- name: Log into registry ${{ env.REGISTRY }}
|
||||
if: github.event_name != 'pull_request'
|
||||
uses: docker/login-action@28218f9b04b4f3f62068d7b6ce6ca5b26e35336c
|
||||
uses: docker/login-action@49ed152c8eca782a232dede0303416e8f356c37b
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
username: ${{ github.actor }}
|
||||
@@ -48,14 +48,14 @@ jobs:
|
||||
# https://github.com/docker/metadata-action
|
||||
- name: Extract Docker metadata
|
||||
id: meta
|
||||
uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
|
||||
uses: docker/metadata-action@69f6fc9d46f2f8bf0d5491e4aabe0bb8c6a4678a
|
||||
with:
|
||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||
|
||||
# Build and push Docker image with Buildx (don't push on PR)
|
||||
# https://github.com/docker/build-push-action
|
||||
- name: Build and push Docker image
|
||||
uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc
|
||||
uses: docker/build-push-action@c84f38281176d4c9cdb1626ffafcd6b3911b5d94
|
||||
with:
|
||||
context: .
|
||||
push: ${{ github.event_name != 'pull_request' }}
|
||||
|
||||
@@ -5,6 +5,9 @@ on:
|
||||
branches:
|
||||
- master
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
|
||||
build:
|
||||
@@ -12,6 +15,6 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- uses: actions/checkout@v3
|
||||
- name: Build the Docker image
|
||||
run: docker build . --file Dockerfile --tag wekan:$(date +%s)
|
||||
@@ -5,12 +5,17 @@ on:
|
||||
branches:
|
||||
- master
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
release:
|
||||
permissions:
|
||||
contents: write # for helm/chart-releaser-action to push chart release and create a release
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
@@ -20,6 +25,6 @@ jobs:
|
||||
git config user.email "$GITHUB_ACTOR@users.noreply.github.com"
|
||||
|
||||
- name: Run chart-releaser
|
||||
uses: helm/chart-releaser-action@v1.1.0
|
||||
uses: helm/chart-releaser-action@v1.4.0
|
||||
env:
|
||||
CR_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
|
||||
@@ -15,7 +15,7 @@ jobs:
|
||||
# runs-on: ubuntu-latest
|
||||
# steps:
|
||||
# - name: checkout
|
||||
# uses: actions/checkout@v2
|
||||
# uses: actions/checkout@v3
|
||||
#
|
||||
# - name: setup node
|
||||
# uses: actions/setup-node@v1
|
||||
@@ -39,7 +39,7 @@ jobs:
|
||||
# needs: [lintcode]
|
||||
# steps:
|
||||
# - name: checkout
|
||||
# uses: actions/checkout@v2
|
||||
# uses: actions/checkout@v3
|
||||
#
|
||||
# - name: setup node
|
||||
# uses: actions/setup-node@v1
|
||||
@@ -62,7 +62,7 @@ jobs:
|
||||
# needs: [lintcode,lintstyle]
|
||||
# steps:
|
||||
# - name: checkout
|
||||
# uses: actions/checkout@v2
|
||||
# uses: actions/checkout@v3
|
||||
#
|
||||
# - name: setup node
|
||||
# uses: actions/setup-node@v1
|
||||
@@ -87,12 +87,12 @@ jobs:
|
||||
|
||||
# CHECKOUTS
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v3
|
||||
|
||||
# CACHING
|
||||
- name: Install Meteor
|
||||
id: cache-meteor-install
|
||||
uses: actions/cache@v2
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: ~/.meteor
|
||||
key: v1-meteor-${{ hashFiles('.meteor/versions') }}
|
||||
@@ -101,7 +101,7 @@ jobs:
|
||||
|
||||
- name: Cache NPM dependencies
|
||||
id: cache-meteor-npm
|
||||
uses: actions/cache@v2
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: ~/.npm
|
||||
key: v1-npm-${{ hashFiles('package-lock.json') }}
|
||||
@@ -110,7 +110,7 @@ jobs:
|
||||
|
||||
- name: Cache Meteor build
|
||||
id: cache-meteor-build
|
||||
uses: actions/cache@v2
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: |
|
||||
.meteor/local/resolver-result-cache.json
|
||||
@@ -133,7 +133,7 @@ jobs:
|
||||
run: sh ./test-wekan.sh -cv
|
||||
|
||||
- name: Upload coverage
|
||||
uses: actions/upload-artifact@v2
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: coverage-folder
|
||||
path: .coverage/
|
||||
@@ -144,17 +144,17 @@ jobs:
|
||||
needs: [tests]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v3
|
||||
|
||||
- name: Download coverage
|
||||
uses: actions/download-artifact@v2
|
||||
uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: coverage-folder
|
||||
path: .coverage/
|
||||
|
||||
|
||||
- name: Coverage Report
|
||||
uses: VeryGoodOpenSource/very_good_coverage@v1.1.1
|
||||
uses: VeryGoodOpenSource/very_good_coverage@v1.2.1
|
||||
with:
|
||||
path: ".coverage/lcov.info"
|
||||
min_coverage: 1 # TODO add tests and increase to 95!
|
||||
+15
-19
@@ -7,7 +7,6 @@ meteor-base@1.5.1
|
||||
|
||||
# Build system
|
||||
ecmascript@0.16.2
|
||||
standard-minifier-css@1.8.1
|
||||
standard-minifier-js@2.8.0
|
||||
mquandalle:jade
|
||||
coffeescript@2.4.1!
|
||||
@@ -21,14 +20,22 @@ cfs:standard-packages
|
||||
cottz:publish-relations
|
||||
dburles:collection-helpers
|
||||
idmontie:migrations
|
||||
matteodem:easy-search
|
||||
easy:search
|
||||
mongo@1.15.0
|
||||
mquandalle:collection-mutations
|
||||
|
||||
# Account system
|
||||
#wekan-ldap
|
||||
#wekan-accounts-cas
|
||||
#wekan-accounts-oidc
|
||||
accounts-password@2.3.1
|
||||
useraccounts:core
|
||||
useraccounts:flow-routing
|
||||
useraccounts:unstyled
|
||||
simple:rest-accounts-password
|
||||
wekan-ldap
|
||||
wekan-accounts-cas
|
||||
wekan-accounts-sandstorm
|
||||
wekan-accounts-lockout
|
||||
wekan-oidc
|
||||
wekan-accounts-oidc
|
||||
|
||||
# Utilities
|
||||
check@1.3.1
|
||||
@@ -61,8 +68,8 @@ meteor-autosize
|
||||
rajit:bootstrap3-datepicker
|
||||
shell-server@0.5.0
|
||||
email@2.2.1
|
||||
horka:swipebox
|
||||
dynamic-import@0.7.2
|
||||
|
||||
cfs:gridfs
|
||||
rzymek:fullcalendar
|
||||
msavin:usercache
|
||||
@@ -74,7 +81,7 @@ konecty:mongo-counter
|
||||
percolate:synced-cron
|
||||
cfs:filesystem
|
||||
ostrio:cookies
|
||||
ostrio:files@2.0.1
|
||||
ostrio:files@2.3.0
|
||||
rajit:bootstrap3-datepicker-fi
|
||||
rajit:bootstrap3-datepicker-ar
|
||||
rajit:bootstrap3-datepicker-bg
|
||||
@@ -128,21 +135,10 @@ pascoual:pdfkit
|
||||
lmieulet:meteor-coverage
|
||||
meteortesting:mocha@2.0.3
|
||||
aldeed:simple-schema
|
||||
accounts-password@2.3.1
|
||||
matb33:collection-hooks
|
||||
simple:json-routes
|
||||
kadira:flow-router
|
||||
spacebars
|
||||
useraccounts:core
|
||||
useraccounts:flow-routing
|
||||
useraccounts:unstyled
|
||||
service-configuration@1.3.0
|
||||
communitypackages:picker
|
||||
simple:rest-accounts-password
|
||||
wekan-accounts-sandstorm
|
||||
wekan-accounts-lockout
|
||||
wekan-oidc
|
||||
wekan-accounts-oidc
|
||||
wekan-ldap
|
||||
wekan-accounts-cas
|
||||
czbaker:lightbox2
|
||||
minifier-css
|
||||
+1
-1
@@ -1 +1 @@
|
||||
METEOR@2.7.2
|
||||
METEOR@2.7.3
|
||||
+16
-19
@@ -1,4 +1,4 @@
|
||||
accounts-base@2.2.3
|
||||
accounts-base@2.2.4
|
||||
accounts-oauth@1.4.1
|
||||
accounts-password@2.3.1
|
||||
aldeed:collection2@2.10.0
|
||||
@@ -10,11 +10,11 @@ allow-deny@1.1.1
|
||||
arillo:flow-router-helpers@0.5.2
|
||||
audit-argument-checks@1.0.7
|
||||
autoupdate@1.8.0
|
||||
babel-compiler@7.9.0
|
||||
babel-runtime@1.5.0
|
||||
babel-compiler@7.9.2
|
||||
babel-runtime@1.5.1
|
||||
base64@1.0.12
|
||||
binary-heap@1.0.11
|
||||
blaze@2.6.0
|
||||
blaze@2.6.1
|
||||
blaze-tools@1.1.3
|
||||
boilerplate-generator@1.7.1
|
||||
caching-compiler@1.2.2
|
||||
@@ -43,7 +43,6 @@ coffeescript@2.4.1
|
||||
coffeescript-compiler@2.4.1
|
||||
communitypackages:picker@1.1.0
|
||||
cottz:publish-relations@2.0.8
|
||||
czbaker:lightbox2@2.7.1_1
|
||||
dburles:collection-helpers@1.1.0
|
||||
ddp@1.4.0
|
||||
ddp-client@2.5.0
|
||||
@@ -53,7 +52,10 @@ ddp-server@2.5.0
|
||||
deps@1.0.12
|
||||
diff-sequence@1.1.1
|
||||
dynamic-import@0.7.2
|
||||
easy:search@2.2.1
|
||||
easylogic:summernote@0.8.8
|
||||
easysearch:components@2.2.2
|
||||
easysearch:core@2.2.2
|
||||
ecmascript@0.16.2
|
||||
ecmascript-runtime@0.8.0
|
||||
ecmascript-runtime-client@0.12.1
|
||||
@@ -61,10 +63,10 @@ ecmascript-runtime-server@0.11.0
|
||||
ejson@1.1.2
|
||||
email@2.2.1
|
||||
es5-shim@4.8.0
|
||||
fastclick@1.0.13
|
||||
fetch@0.1.1
|
||||
fortawesome:fontawesome@4.7.0
|
||||
geojson-utils@1.0.10
|
||||
horka:swipebox@1.0.2
|
||||
hot-code-push@1.0.4
|
||||
html-tools@1.1.3
|
||||
htmljs@1.1.1
|
||||
@@ -77,18 +79,15 @@ kadira:blaze-layout@2.3.0
|
||||
kadira:dochead@1.5.0
|
||||
kadira:flow-router@2.12.1
|
||||
konecty:mongo-counter@0.0.5_3
|
||||
launch-screen@1.3.0
|
||||
livedata@1.0.18
|
||||
lmieulet:meteor-coverage@1.1.4
|
||||
localstorage@1.2.0
|
||||
logging@1.3.1
|
||||
matb33:collection-hooks@1.1.2
|
||||
matteodem:easy-search@1.6.4
|
||||
matb33:collection-hooks@1.1.4
|
||||
mdg:validation-error@0.5.1
|
||||
meteor@1.10.0
|
||||
meteor-autosize@5.0.1
|
||||
meteor-base@1.5.1
|
||||
meteor-platform@1.2.6
|
||||
meteorhacks:aggregate@1.3.0
|
||||
meteorhacks:collection-utils@1.2.0
|
||||
meteorhacks:picker@1.0.3
|
||||
@@ -96,11 +95,10 @@ meteorhacks:subs-manager@1.6.4
|
||||
meteortesting:browser-tests@1.3.5
|
||||
meteortesting:mocha@2.0.3
|
||||
meteortesting:mocha-core@8.0.1
|
||||
minifier-css@1.6.0
|
||||
minifier-js@2.7.4
|
||||
minifier-css@1.6.1
|
||||
minifier-js@2.7.5
|
||||
minifiers@1.1.8-faster-rebuild.0
|
||||
minimongo@1.8.0
|
||||
mobile-status-bar@1.1.0
|
||||
modern-browsers@0.1.8
|
||||
modules@0.18.0
|
||||
modules-runtime@0.13.0
|
||||
@@ -124,10 +122,10 @@ oauth2@1.3.1
|
||||
observe-sequence@1.0.20
|
||||
ongoworks:speakingurl@1.1.0
|
||||
ordered-dict@1.1.0
|
||||
ostrio:cookies@2.7.0
|
||||
ostrio:cstorage@2.2.2
|
||||
ostrio:files@2.0.1
|
||||
ostrio:i18n@3.1.0
|
||||
ostrio:cookies@2.7.2
|
||||
ostrio:cstorage@4.0.1
|
||||
ostrio:files@2.3.0
|
||||
ostrio:i18n@3.2.0
|
||||
pascoual:pdfkit@1.0.7
|
||||
peerlibrary:assert@0.3.0
|
||||
peerlibrary:base-component@0.17.1
|
||||
@@ -209,8 +207,7 @@ simple:rest-json-error-handler@1.1.1
|
||||
socket-stream-client@0.5.0
|
||||
spacebars@1.3.0
|
||||
spacebars-compiler@1.3.1
|
||||
standard-minifier-css@1.8.1
|
||||
standard-minifier-js@2.8.0
|
||||
standard-minifier-js@2.8.1
|
||||
templates:tabs@2.3.0
|
||||
templating@1.4.1
|
||||
templating-compiler@1.4.1
|
||||
|
||||
+1
-1
@@ -3,7 +3,7 @@ sudo: required
|
||||
|
||||
env:
|
||||
TRAVIS_DOCKER_COMPOSE_VERSION: 1.24.0
|
||||
TRAVIS_NODE_VERSION: 14.19.3
|
||||
TRAVIS_NODE_VERSION: 14.20.0
|
||||
TRAVIS_NPM_VERSION: latest
|
||||
|
||||
before_install:
|
||||
|
||||
+1
-1
@@ -39,7 +39,7 @@ host = https://www.transifex.com
|
||||
# tap:i18n requires us to use `-` separator in the language identifiers whereas
|
||||
# Transifex uses a `_` separator, without an option to customize it on one side
|
||||
# or the other, so we need to do a Manual mapping.
|
||||
lang_map = ar_EG:ar-EG, bg_BG:bg, cs_CZ:cs-CZ, cy_GB:cy-GB, de_AT:de-AT, de_CH:de-CH, en_BR:en-BR, en_DE:en-DE, en_IT:en-IT, en_GB:en-GB, et_EE:et-EE, es_AR:es-AR, en@ysv:en-YS, es_CL:es-CL, es_419:es-LA, es_PE:es-PE, es_MX:es-MX, es_TX:es-TX, es_PY:es-PY, el_GR:el-GR, fa_IR:fa-IR, fi_FI:fi, fr_FR:fr-FR, fr_CH:fr-CH, fy_NL:fy-NL, gl_ES:gl-ES, gu_IN:gu-IN, he_IL:he-IL, hi_IN:hi-IN, hu_HU:hu, id_ID:id, mn_MN:mn, ms_MY:ms-MY, nl_NL:nl-NL, ko_KR:ko-KR, lv_LV:lv, pl_PL:pl-PL, pt_BR:pt-BR, ro_RO:ro, ru_UA:ru-UA, sl_SI:sl, uk_UA:uk-UA, uz@Arab:uz-AR, uz@Latn:uz-LA, uz_UZ:uz-UZ, vec:ve-CC, vep:ve-PP, vls:vl-SS, war:wa-RR, vi_VN:vi-VN, zh_CN:zh-CN, zh_TW:zh-TW, zh_Hans:zh-Hans, zh_HK:zh-HK, zu_ZA:zu-ZA
|
||||
lang_map = ar_DZ:ar-DZ, ar_EG:ar-EG, az_AZ:az-AZ, az@latin:az-LA, bg_BG:bg, cs_CZ:cs-CZ, cy_GB:cy-GB, de_AT:de-AT, de_CH:de-CH, en_BR:en-BR, en_DE:en-DE, en_IT:en-IT, en_GB:en-GB, en_MY:en-MY, et_EE:et-EE, ast_ES:ast-ES, es_AR:es-AR, en@ysv:en-YS, es_CL:es-CL, es_419:es-LA, es_PE:es-PE, es_MX:es-MX, es_TX:es-TX, es_PY:es-PY, el_GR:el-GR, fa_IR:fa-IR, ja-Hira:ja-HI, ja_JP:ja, fi_FI:fi, fr_FR:fr-FR, fr_CH:fr-CH, fy_NL:fy-NL, gl_ES:gl-ES, gu_IN:gu-IN, he_IL:he-IL, hi_IN:hi-IN, hu_HU:hu, id_ID:id, mn_MN:mn, ms_MY:ms-MY, nl_NL:nl-NL, ko_KR:ko-KR, lv_LV:lv, pl_PL:pl-PL, pt_BR:pt-BR, ro_RO:ro, ru_UA:ru-UA, sl_SI:sl, uk_UA:uk-UA, uz@Arab:uz-AR, uz@Latn:uz-LA, uz_UZ:uz-UZ, vec:ve-CC, vep:ve-PP, vls:vl-SS, war:wa-RR, vi_VN:vi-VN, zh_CN:zh-CN, zh_TW:zh-TW, zh_Hans:zh-Hans, zh_HK:zh-HK, zu_ZA:zu-ZA
|
||||
|
||||
[wekan.application]
|
||||
file_filter = imports/i18n/data/<lang>.i18n.json
|
||||
|
||||
+417
-5
@@ -1,5 +1,417 @@
|
||||
[Mac ChangeLog](https://github.com/wekan/wekan/wiki/Mac)
|
||||
|
||||
Required versions of Node.js, MongoDB etc are listed at https://wekan.github.io
|
||||
Download section.
|
||||
|
||||
[How to upgrade WeKan](https://github.com/wekan/wekan/issues/4585)
|
||||
|
||||
# v6.45 2022-09-14 WeKan ® release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Add ARIA in checklist items](https://github.com/wekan/wekan/pull/4677).
|
||||
Thanks to helioguardabaxo.
|
||||
- [Heading hierarchy fixed on checklist title to simplify screen reader](https://github.com/wekan/wekan/pull/4680).
|
||||
Thanks to helioguardabaxo.
|
||||
- [Add info about RTL languages to Meteor WeKan. Not used in Meteor WeKan yet](https://github.com/wekan/wekan/commit/cf7c0512422178be23d287cce269a7b854a2bc21).
|
||||
Thanks to xet7.
|
||||
- [Added help button with custom URL](https://github.com/wekan/wekan/pull/4681).
|
||||
Thanks to helioguardabaxo.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Add starting wekan test to arm64/s390x/ppc64el release scripts](https://github.com/wekan/wekan/commit/51ed0acc4f84ebce497f52a3267e57f554b3cd30).
|
||||
Thanks to xet7.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Avoid non-terminating containers](https://github.com/wekan/wekan/pull/4675).
|
||||
Thanks to bronger.
|
||||
- [Fixed WeKan api.py . WeKan API now works in newest WeKan and n8n](https://github.com/wekan/wekan/commit/aa2c3774a233025a163e9d9c210ad2f1807c0acb).
|
||||
Thanks to DimDz and Joffcom.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v6.44 2022-09-05 WeKan ® release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Add tab view to sidebar members: people, orgs and teams](https://github.com/wekan/wekan/pull/4672).
|
||||
Thanks to helioguardabaxo.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Updated matb33:collection-hooks](https://github.com/wekan/wekan/commit/0f6d84d69f286c8191e8d3a6eee59bc3f6845ad1).
|
||||
Thanks to developers of dependencies.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Added missing currentUser](https://github.com/wekan/wekan/commit/3a0269640b7fad0d40dc3b65f559f5124f4256b6).
|
||||
Thanks to xet7.
|
||||
- [Removed old stuff from Dockerfile](https://github.com/wekan/wekan/commit/77927a1ca4fb9bf9c68fe823cf0dd9a95f310879).
|
||||
Thanks to xet7.
|
||||
- [Fix building Dockerfile on Mac M1 etc](https://github.com/wekan/wekan/commit/3772ce3acab5a7421144df3a538def33baf0eda4).
|
||||
Thanks to willman42 and xet7.
|
||||
- [Fix 2) Due date is not created nor changed, when cards are moved in the calendar view](https://github.com/wekan/wekan/commit/6b4613d3ed6020b4072fe6540da5fdb0b2e85ac7).
|
||||
Thanks to DimDz.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v6.43 2022-09-01 WeKan ® release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- [Revert Remove hard-coded port 8080 binding in Dockerfile](https://github.com/wekan/wekan/pull/4667).
|
||||
Thanks to willman42.
|
||||
- [Added back autologin, because reverting it broke Google OIDC login](https://github.com/wekan/wekan/commit/1e4fba3ec8366aac2e9fdd812aa047f5d53db749).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v6.42 2022-08-31 WeKan ® release
|
||||
|
||||
This release adds the following new translations:
|
||||
|
||||
- [Added translations: English (Malaysia) (en_MY), Japanese (Hiragana) (ja-Hira), Malay (ms)](https://github.com/wekan/wekan/commit/17f97f6acc1827e956039f4cae5e15e7fcb0e19e).
|
||||
Thanks to dimanLubis.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fix check for current user at card details](https://github.com/wekan/wekan/commit/68e4e6f04921a3618d71d72b617f49c9ee85c18f).
|
||||
Thanks to xet7.
|
||||
- [Comment out CentOS 7 specific settings](https://github.com/wekan/wekan/commit/d470a74a9fe2a2029c2063d940d4573b58adf6c0).
|
||||
Thanks to williamtrelawny and xet7.
|
||||
- [00checkStartup, userInfo was missing](https://github.com/wekan/wekan/pull/4662).
|
||||
Thanks to mfilser.
|
||||
- Try to fix EasySearch.
|
||||
[Part 2](https://github.com/wekan/wekan/commit/a21883e3a151644ffeac921b5978157d0674c414),
|
||||
[Part 3](https://github.com/wekan/wekan/commit/0d3b7ca04121abd2f170a5934672bc79112ac4ef).
|
||||
Thanks to danielkaiser and xet7.
|
||||
- [Revert autologin, because it broke OIDC login with Keycloak](https://github.com/wekan/wekan/commit/43a709675394f6aade42033c14c7fb5b78ac25c8).
|
||||
Thanks to wb9688 and xet7.
|
||||
- [Remove hard-coded port 8080 binding in Dockerfile](https://github.com/wekan/wekan/pull/4663).
|
||||
Thanks to willman42.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v6.41 2022-08-28 WeKan ® release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- [Try to fix EasySearch syntax](https://github.com/wekan/wekan/commit/5ca84d293080c682de9c23c6754f142e7f3cd383).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v6.40 2022-08-25 WeKan ® release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- [Move/Copy Card dialog didn't set the last selected board right](https://github.com/wekan/wekan/pull/4657).
|
||||
Thanks to mfilser.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v6.39 2022-08-21 WeKan ® release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Add support to validate avatar uploads by type, size and external program](https://github.com/wekan/wekan/pull/4648).
|
||||
Thanks to NotTheEvilOne.
|
||||
- [Attachment using new feature of Meteor Files 2.3.0](https://github.com/wekan/wekan/pull/4650).
|
||||
Thanks to mfilser.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Upgraded Snap candidate MongoDB versions](https://github.com/wekan/wekan/commit/d0f1382055278a2f78fd9d53b0dd5c3daaaf23fd).
|
||||
Thanks to MongoDB developers.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Set miniscreen to 250px to get Mobile Android Firefox working](https://github.com/wekan/wekan/pull/4649).
|
||||
Thanks to repmovs.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v6.38 2022-08-18 WeKan ® release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Add support to validate attachment uploads by an external program](https://github.com/wekan/wekan/pull/4637).
|
||||
Thanks to NotTheEvilOne.
|
||||
- [Attachment upload progress bar + multiple files upload](https://github.com/wekan/wekan/pull/4641).
|
||||
Thanks to mfilser.
|
||||
- [Move and copy card dialog remember last selected board](https://github.com/wekan/wekan/pull/4643).
|
||||
Thanks to mfilser.
|
||||
- [Copy card copies now attachments too](https://github.com/wekan/wekan/pull/4646).
|
||||
Thanks to mfilser.
|
||||
- [Copy / move card and checklists using same code](https://github.com/wekan/wekan/pull/4647).
|
||||
Thanks to mfilser.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Updated to ostrio:files 2.3.0 and standard-minifier-js 2.8.1](https://github.com/wekan/wekan/commit/ce1f8b674de9e9a7d03e198e88e7a200af576729).
|
||||
Thanks to developers of dependencies.
|
||||
- [Updated parse-ms](https://github.com/wekan/wekan/commit/79add98aa77658221a86830f4816f19a15a52460).
|
||||
Thanks to developers of dependencies.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Meteor files 2.2.1 fixes + attachment view](https://github.com/wekan/wekan/pull/4638).
|
||||
Thanks to mfilser.
|
||||
- [Fix Validate attachment error at PR Meteor files 2.2.1 fixes + attachment view](https://github.com/wekan/wekan/commit/c23f5dc8582e948a7c9af6fd1c6c7cca85a7e1f1).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v6.37 2022-08-15 WeKan ® release
|
||||
|
||||
This release fixes the following CRITICAL SECURITY ISSUES:
|
||||
|
||||
- [Updated dependencies like ostrio:files etc](https://github.com/wekan/wekan/commit/7c619859fcb6a609581adc8f09c7937b7c2efcc4).
|
||||
Thanks to developers of dependencies and xet7.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fix All Boards: The list of lists on each card with the summary counts is not sorted](https://github.com/wekan/wekan/pull/4635).
|
||||
Thanks to repmovs.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v6.36 2022-08-14 WeKan ® release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- [Revert Fix Open card links in current tab. So now links open in new tab](https://github.com/wekan/wekan/commit/8560b36a5aeb31d7032d82f75a53a18281c9f7f8).
|
||||
Thanks to dvsk, mfilser and xet7.
|
||||
- [Revert Fix URLs to favicons etc for sub-urls, because it broke favicons on subdomain URLs](https://github.com/wekan/wekan/commit/8566f32bbdd3ce42ab907602fcb61ad67ece41c9).
|
||||
Thanks to dsvk and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v6.35 2022-08-13 WeKan ® release
|
||||
|
||||
This release fixes the following CRITICAL SECURITY ISSUES:
|
||||
|
||||
- [Fix Users can delete Boards from global archive (w/o permission)](https://github.com/wekan/wekan/commit/54e6e32ab2ec0b3a6f4e18154f66d154cf4ee0de).
|
||||
Thanks to Meeques and xet7.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Updated dependencies](https://github.com/wekan/wekan/commit/3762768ed39f967aa26b76c0454e7d5900655cc4).
|
||||
Thanks to developers of dependencies.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fix Typo in CHANGELOG](https://github.com/wekan/wekan/pull/4624).
|
||||
Thanks to mfilser.
|
||||
- [Fix _getTopStack(), comment type error](https://github.com/wekan/wekan/pull/4625).
|
||||
Thanks to mfilser.
|
||||
- [Set drag handle on touch screen not miniscreen](https://github.com/wekan/wekan/pull/4633).
|
||||
Thanks to repmovs.
|
||||
- [Fix Open card links in current tab. Not in new tab anymore](https://github.com/wekan/wekan/commit/ee3c5cbb6a1ab87c1597d0ffcd6996f423f4d1b3).
|
||||
Thanks to bronger, ManZosh and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v6.34 2022-08-05 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Updated dependencies](https://github.com/wekan/wekan/commit/43360c103b462ee02945d629ce46e9010fccd5d6).
|
||||
Thanks to developers of dependencies.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fix and update easysearch](https://github.com/wekan/wekan/pull/4623).
|
||||
Thanks to danielkaiser.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v6.33 2022-08-05 WeKan ® release
|
||||
|
||||
This release fixes the following bugs:
|
||||
|
||||
- [Try 2 to fix missing variable in WeKan fails to get MongoDB server version](https://github.com/wekan/wekan/commit/37f9de8b9b11e8dd1b54452531aa708e16517c6d).
|
||||
Thanks to simon816 and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v6.32 2022-08-05 WeKan ® release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Add support to validate attachment uploads by type and size](https://github.com/wekan/wekan/pull/4618).
|
||||
Thanks to NotTheEvilOne.
|
||||
- [Added attachments file type and size snap settings and help text](https://github.com/wekan/wekan/commit/0c224a0a7f3f2f99839db65eed896bb2dd316e3c).
|
||||
Thanks to xet7.
|
||||
- [Added dependencies for attachments file size and type](https://github.com/wekan/wekan/commit/1b30485e68e5cd30784207801a1c8d659fb14018) (HEAD -> master)
|
||||
Thanks to xet7.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- Updated release build scripts to reinstall bcrypt, upload Windows version etc.
|
||||
[Part 1](https://github.com/wekan/wekan/commit/14e5d08a19d213ab901cce9088a3e368b508e7d0),
|
||||
[Part 2](https://github.com/wekan/wekan/commit/86d6d2d19aacaf0cadcbf36e223208a5a5e69ecd),
|
||||
[Part 3](https://github.com/wekan/wekan/commit/73ea39466bd08f8d82e21beb0f71e715ee5ac120).
|
||||
Thanks to xet7.
|
||||
- [Try to fix Snap Candidate](https://github.com/wekan/wekan/commit/b433fbdda81478558585cbaa7717d00247550325).
|
||||
Thanks to xet7.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fix In Lists view, Card Details pop-up does not appear in 6.31 release](https://github.com/wekan/wekan/commit/063ad08e9e81f5235d323cc3ed7af4cd5610dc93).
|
||||
Thanks to Sdub76, niels, m4teh, r4nc0r, mfilser, medjedovicm and xet7.
|
||||
- [Try to fix missing variable in WeKan fails to get MongoDB server version](https://github.com/wekan/wekan/commit/4941fd183c54f514119587380bf659115a1adc6e).
|
||||
Thanks to simon816 and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v6.31 2022-07-31 WeKan ® release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Added LaTex support to all input fields with markdown-it-mathjax3](https://github.com/wekan/wekan/commit/e81900178e62d36672952a8f0707c5297dcd7767).
|
||||
Examples: https://github.com/wekan/wekan/wiki/LaTeX .
|
||||
Thanks to DoktorScience.
|
||||
- [Rescue Save description on card exit](https://github.com/wekan/wekan/pull/4598).
|
||||
Thanks to Viehlieb.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Snap Candidate to MongoDB 5.0.10 etc](https://github.com/wekan/wekan/commit/27198c4064a41035bb800aa5e5797852e1dfdafb).
|
||||
Thanks to MongoDB developers and xet7.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fix URLs to favicons etc](https://github.com/wekan/wekan/commit/1b95f9f167a021ac0d0c9392ced6a9cd888ffe2d).
|
||||
Thanks to letmp, Meeques and xet7.
|
||||
- [Fix the bug that displayed a card popup to all swimlanes for public board (when a user is not logged)](https://github.com/wekan/wekan/pull/4610).
|
||||
Thanks to Emile840.
|
||||
- [Reverted incomplete fix about bug where opening card scrolls to wrong place](https://github.com/wekan/wekan/commit/6594795f39bd6d14a7105dc61642baa034995bad).
|
||||
Thanks to danceb, DimDz, mfilser, Emile840, derbolle, xplodwild and xet7.
|
||||
- [Fix Login Page Error, Lists can't move anymore, reverted incomplete Change Lists Width](https://github.com/wekan/wekan/commit/d37adbb0462c7fc9f645594b3bd20d2bec781b18).
|
||||
Thanks to johnnytolengo, gda140 and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v6.30 2022-07-11 WeKan ® release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
- [Automatic login with OIDC](https://github.com/wekan/wekan/pull/4588).
|
||||
Thanks to Viehlieb.
|
||||
- [OIDC/OAuth2 autologin settings for Docker/Snap/Source/Bundle platforms](https://github.com/wekan/wekan/commit/284f4401369aadcec72e67fa935dfc3a9fead721).
|
||||
Thanks to xet7.
|
||||
|
||||
and tries to fix the following bugs:
|
||||
|
||||
- [Try to fix Snap](https://github.com/wekan/wekan/commit/17f8f8f14ff205d0cbb316c63a2da36f61ba4a1d).
|
||||
Thanks to xet7.
|
||||
- [On CentOS 7 Docker there is seccomp issue with glibc 6, so setting it to unconfined to get WeKan working](https://github.com/wekan/wekan/commit/054d420dc97cadee6ed7896c608d95a6fe09dc9d).
|
||||
Thanks to m-brangeon.
|
||||
- [Fix uploading attachments](https://github.com/wekan/wekan/commit/69d454dd035a989266175eb4268ffc3d7891eb95).
|
||||
Thanks to BabyFnord and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v6.29 2022-07-11 WeKan ® release
|
||||
|
||||
This release adds the following features:
|
||||
|
||||
- [Resizeable size of list width and height. Size is not saved yet. In Progress](https://github.com/wekan/wekan/commit/01d0dd3b1dd0a3c9764e7c9d31eab739db2d3ad8).
|
||||
Thanks to NLBlackEagle and xet7.
|
||||
- [00checkStartup, on error give more details on current user which run's wekan](https://github.com/wekan/wekan/pull/4581).
|
||||
Thanks to mfilser.
|
||||
|
||||
and adds the following updates:
|
||||
|
||||
- [Updated to Node.js v14.20.0](https://github.com/wekan/wekan/commit/239dd1a3411a3d4f51b109e1a0505a5a23bc72ee).
|
||||
Thanks to Node.js developers.
|
||||
- [Docker base image to Ubuntu 22.04](https://github.com/wekan/wekan/commit/6b4ffa69c64f0186a8b1b3ac175b633ac7c24263).
|
||||
Thanks to Ubuntu developers.
|
||||
- Updated ostrio:files.
|
||||
[Part 1](https://github.com/wekan/wekan/commit/0d67a86f2c9c1c9696d8507c60e53d47a226a6ad),
|
||||
[Part 2](https://github.com/wekan/wekan/commit/c3bfcb78e9047a84d43041bebcec56718eaa140b).
|
||||
Thanks to developers of dependencies.
|
||||
- [Updated dependencies](https://github.com/wekan/wekan/commit/ae09f0f0083a96c2211fdc02e60b4ff6a2f413ca).
|
||||
Thanks to developers of dependencies.
|
||||
|
||||
and adds the following translations:
|
||||
|
||||
- [Added translation Asturia (Spain)](https://github.com/wekan/wekan/commit/12615fef5d44cf611b3f1d9fc0a7be3e98b8c042).
|
||||
Thanks to translators.
|
||||
- [Added translations: Arabic (Algeria) (ar_DZ), Azerbaijani (az), Azerbaijani (Azerbaijan) (az_AZ), Azerbaijani (Latin) (az@latin)](https://github.com/wekan/wekan/commit/99b2fdbf99f26ee9df2e1ff906db2d740210f902).
|
||||
Thanks to translators.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Do not show archived lists on All Boards](https://github.com/wekan/wekan/pull/4573).
|
||||
Thanks to helioguardabaxo.
|
||||
- [Fix div max-width on My Cards table view](https://github.com/wekan/wekan/pull/4574).
|
||||
Thanks to helioguardabaxo.
|
||||
- [Fixed one Typo in CSS Style Sheet](https://github.com/wekan/wekan/pull/4577).
|
||||
Thanks to JonasPfeiferb1.
|
||||
- [Comment out unused CSS](https://github.com/wekan/wekan/commit/724d1386f6943ad87b8e32f5544cc84ae211904c).
|
||||
Thanks to xet7.
|
||||
- [Move/Copy card closes now the popup if done](https://github.com/wekan/wekan/pull/4582).
|
||||
Thanks to mfilser.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v6.28 2022-06-08 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Upgraded to Meteor 2.7.3](https://github.com/wekan/wekan/commit/43b2d714043e053874e3c1101ae6e464d2e61b7e).
|
||||
Thanks to Meteor developers.
|
||||
|
||||
and adds the following translations:
|
||||
|
||||
- [Added translations: Moroccan Arabic (ary) and Standard Moroccan Tamazight (zgh)](https://github.com/wekan/wekan/commit/5af4f54f4c702f9cc4df60a27ac234421e41575d).
|
||||
Thanks to translators.
|
||||
- [Try to detect Japanese (Japan) better](https://github.com/wekan/wekan/commit/e25050316f6f018f68b03bef6fccbdaea7248461).
|
||||
Thanks to takenoko14 at Transifex and xet7.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Removed lightbox that caused bugs like Maximum stack size exceeded. TODO later: Add a new way to open attachment image bigger](https://github.com/wekan/wekan/commit/dfea3d0e735f1665a14f7e534e352e0e00871a02).
|
||||
Thanks to xet7.
|
||||
- [Move and copy card set sorting](https://github.com/wekan/wekan/pull/4557).
|
||||
Thanks to mfilser.
|
||||
- [Updated dependencies. Try to fix Binary release on releases.wekan.team lacks the CSS](https://github.com/wekan/wekan/commit/937797356ceeb99bf66eb826e13fc55f266c8739).
|
||||
Thanks to znerol, mrcancer91, BabyFnord and xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v6.27 2022-05-28 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
|
||||
- [Upgraded to Meteor 2.7.3-beta.0](https://github.com/wekan/wekan/commit/25e50e3908a52a7bac61f8b939ad7c78cbd79060).
|
||||
Thanks to Meteor developers.
|
||||
|
||||
and fixes the following bugs:
|
||||
|
||||
- [Fix opening card scrolls to wrong position when many swimlanes and card at bottom of board](https://github.com/wekan/wekan/commit/adcc33ed7fe686d46a85da6c11ea448d29e94ca7).
|
||||
Thanks to xet7.
|
||||
- [Removed wekan-accounts-sandstorm .test-app directory, that could not be git cloned on Windows](https://github.com/wekan/wekan/commit/4f44c5bf872e369cd89ea0e8791482cc925294d3).
|
||||
Thanks to xet7.
|
||||
- Try to fix Snap.
|
||||
[Part 1](https://github.com/wekan/wekan/commit/3b419848d1b7a7f421db3662d860dcea1ea6af1c),
|
||||
[Part 2](https://github.com/wekan/wekan/commit/e50d69cfb78e5f0150e96cc90337255ccbd59e76),
|
||||
[Part 3](https://github.com/wekan/wekan/commit/ea66eca60ddbf7127c9fbed9ab41df52542ad279),
|
||||
[Part 4](https://github.com/wekan/wekan/commit/9ca26d22d0c2c9bee792e50ff203a5c18c9d556b),
|
||||
[Part 5](https://github.com/wekan/wekan/commit/fac1ba5952f763d257b04a934e3407f9b1d1d37a),
|
||||
[Part 6](https://github.com/wekan/wekan/commit/f2815a90393418dea88aa49ee74c6af91fafe96d),
|
||||
[Part 7](https://github.com/wekan/wekan/commit/2587e2f00ae27742893e48e98845a3139e3f3a02),
|
||||
[Part 8](https://github.com/wekan/wekan/commit/693a49f85200adcf81f5cf0ea56c7dd795757988).
|
||||
Thanks to xet7.
|
||||
- [WeKan Gantt GPLv2: Try to fix Gantt, by adding translations, but is not visible yet](https://github.com/wekan/wekan-gantt-gpl/commit/a08c01c76eaaf2884890a39c97d1f72da222fba1).
|
||||
Thanks to xet7.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v6.26 2022-05-21 WeKan ® release
|
||||
|
||||
This release adds the following updates:
|
||||
@@ -829,7 +1241,7 @@ This release removes the following new features:
|
||||
|
||||
- [Revert change from WeKan v5.81: At Sandstorm, every WeKan user is now WeKan Admin and has Admin Panel](https://github.com/wekan/wekan/commit/ebc7741fcb9ad854234921ed0546255411adeec9).
|
||||
Thanks to ocdtrekkie and xet7.
|
||||
|
||||
|
||||
and adds the following new features:
|
||||
|
||||
- [List header contains now a button to add the card to the bottom of the list](https://github.com/wekan/wekan/pull/4195).
|
||||
@@ -1081,7 +1493,7 @@ and fixes the following bugs:
|
||||
Thanks to niklasdahlheimer.
|
||||
- [Popup fixes: Archive cards, upload attachements etc](https://github.com/wekan/wekan/pull/4101).
|
||||
Thanks to mfilser.
|
||||
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v5.68 2021-10-27 WeKan ® release
|
||||
@@ -2052,7 +2464,7 @@ This release adds the following new features:
|
||||
|
||||
- [Custom Field "String Template"](https://github.com/wekan/wekan/pull/3701).
|
||||
Thanks to tod31.
|
||||
- [1) Admin reports. An option added to the admin panel that has reports an admin can run.
|
||||
- [1) Admin reports. An option added to the admin panel that has reports an admin can run.
|
||||
Right now it has two reports for attachments and broken cards.
|
||||
2) Add the creator avatar to `cardDetails` and `minicard`. Avatar is only shown if it is selected in card settings.
|
||||
3) Added a new search operator `creator`.
|
||||
@@ -2785,7 +3197,7 @@ and fixes the following bugs:
|
||||
Thanks to xet7.
|
||||
- [Rules not copied during board copy](https://github.com/wekan/wekan/pull/3458).
|
||||
Thanks to jrsupplee.
|
||||
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
# v4.83 2021-01-20 Wekan release
|
||||
@@ -2806,7 +3218,7 @@ and fixes the following bugs:
|
||||
Thanks to jrsupplee.
|
||||
|
||||
Thanks to above GitHub users for their contributions and translators for their translations.
|
||||
|
||||
|
||||
# v4.82 2021-01-20 Wekan release
|
||||
|
||||
This release adds the following new features:
|
||||
|
||||
+21
-102
@@ -1,6 +1,11 @@
|
||||
FROM ubuntu:21.10
|
||||
FROM --platform=linux/amd64 ubuntu:22.04 as wekan
|
||||
LABEL maintainer="wekan"
|
||||
|
||||
# 2022-09-04:
|
||||
# - above "--platform=linux/amd64 ubuntu:22.04 as wekan" is needed to build Dockerfile
|
||||
# correctly on Mac M1 etc, to not get this error:
|
||||
# https://stackoverflow.com/questions/71040681/qemu-x86-64-could-not-open-lib64-ld-linux-x86-64-so-2-no-such-file-or-direc
|
||||
|
||||
# 2022-04-25:
|
||||
# - gyp does not yet work with Ubuntu 22.04 ubuntu:rolling,
|
||||
# so changing to 21.10. https://github.com/wekan/wekan/issues/4488
|
||||
@@ -16,8 +21,8 @@ ARG DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build-essential git ca-certificates python3" \
|
||||
DEBUG=false \
|
||||
NODE_VERSION=v14.19.3 \
|
||||
METEOR_RELEASE=1.10.2 \
|
||||
NODE_VERSION=v14.20.0 \
|
||||
METEOR_RELEASE=2.7.3 \
|
||||
USE_EDGE=false \
|
||||
METEOR_EDGE=1.5-beta.17 \
|
||||
NPM_VERSION=latest \
|
||||
@@ -33,6 +38,12 @@ ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build-
|
||||
ACCOUNTS_LOCKOUT_UNKNOWN_USERS_LOCKOUT_PERIOD=60 \
|
||||
ACCOUNTS_LOCKOUT_UNKNOWN_USERS_FAILURE_WINDOW=15 \
|
||||
ACCOUNTS_COMMON_LOGIN_EXPIRATION_IN_DAYS=90 \
|
||||
ATTACHMENTS_UPLOAD_EXTERNAL_PROGRAM="" \
|
||||
ATTACHMENTS_UPLOAD_MIME_TYPES="" \
|
||||
ATTACHMENTS_UPLOAD_MAX_SIZE=0 \
|
||||
AVATARS_UPLOAD_EXTERNAL_PROGRAM="" \
|
||||
AVATARS_UPLOAD_MIME_TYPES="" \
|
||||
AVATARS_UPLOAD_MAX_SIZE=0 \
|
||||
RICHER_CARD_COMMENT_EDITOR=false \
|
||||
CARD_OPENED_WEBHOOK_ENABLED=false \
|
||||
MAX_IMAGE_PIXEL="" \
|
||||
@@ -50,6 +61,7 @@ ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build-
|
||||
TRUSTED_URL="" \
|
||||
WEBHOOKS_ATTRIBUTES="" \
|
||||
OAUTH2_ENABLED=false \
|
||||
OIDC_REDIRECTION_ENABLED=false \
|
||||
OAUTH2_CA_CERT="" \
|
||||
OAUTH2_ADFS_ENABLED=false \
|
||||
OAUTH2_LOGIN_STYLE=redirect \
|
||||
@@ -147,12 +159,10 @@ ENV BUILD_DEPS="apt-utils libarchive-tools gnupg gosu wget curl bzip2 g++ build-
|
||||
NODE_OPTIONS="--max_old_space_size=4096" \
|
||||
WRITABLE_PATH=/data
|
||||
|
||||
#---------------------------------------------------------------------
|
||||
# https://github.com/wekan/wekan/issues/3585#issuecomment-1021522132
|
||||
# Add more Node heap:
|
||||
# NODE_OPTIONS="--max_old_space_size=4096"
|
||||
# Add more stack:
|
||||
# bash -c "ulimit -s 65500; exec node --stack-size=65500 main.js"
|
||||
#---------------------------------------------
|
||||
# == at docker-compose.yml: AUTOLOGIN WITH OIDC/OAUTH2 ====
|
||||
# https://github.com/wekan/wekan/wiki/autologin
|
||||
#- OIDC_REDIRECTION_ENABLED=true
|
||||
#---------------------------------------------------------------------
|
||||
|
||||
# Copy the app to the image
|
||||
@@ -165,7 +175,6 @@ RUN \
|
||||
\
|
||||
# OS dependencies
|
||||
apt-get update -y && apt-get install -y --no-install-recommends ${BUILD_DEPS} && \
|
||||
#pip3 install -U pip setuptools wheel && \
|
||||
\
|
||||
# Meteor installer doesn't work with the default tar binary, so using bsdtar while installing.
|
||||
# https://github.com/coreos/bugs/issues/1095#issuecomment-350574389
|
||||
@@ -176,43 +185,9 @@ RUN \
|
||||
wget https://nodejs.org/dist/${NODE_VERSION}/node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz && \
|
||||
wget https://nodejs.org/dist/${NODE_VERSION}/SHASUMS256.txt.asc && \
|
||||
#---------------------------------------------------------------------------------------------
|
||||
# Node Fibers 100% CPU usage issue:
|
||||
# https://github.com/wekan/wekan-mongodb/issues/2#issuecomment-381453161
|
||||
# https://github.com/meteor/meteor/issues/9796#issuecomment-381676326
|
||||
# https://github.com/sandstorm-io/sandstorm/blob/0f1fec013fe7208ed0fd97eb88b31b77e3c61f42/shell/server/00-startup.js#L99-L129
|
||||
# Also see beginning of wekan/server/authentication.js
|
||||
# import Fiber from "fibers";
|
||||
# Fiber.poolSize = 1e9;
|
||||
# OLD: Download node version 8.12.0 prerelease that has fix included, => Official 8.12.0 has been released
|
||||
# Description at https://releases.wekan.team/node.txt
|
||||
#wget https://releases.wekan.team/node-${NODE_VERSION}-${ARCHITECTURE}.tar.gz && \
|
||||
#echo "1ed54adb8497ad8967075a0b5d03dd5d0a502be43d4a4d84e5af489c613d7795 node-v8.12.0-linux-x64.tar.gz" >> SHASUMS256.txt.asc && \
|
||||
\
|
||||
# Verify nodejs authenticity
|
||||
grep ${NODE_VERSION}-${ARCHITECTURE}.tar.gz SHASUMS256.txt.asc | shasum -a 256 -c - && \
|
||||
#export GNUPGHOME="$(mktemp -d)" && \
|
||||
#\
|
||||
# Try other key servers if ha.pool.sks-keyservers.net is unreachable
|
||||
# Code from https://github.com/chorrell/docker-node/commit/2b673e17547c34f17f24553db02beefbac98d23c
|
||||
# gpg keys listed at https://github.com/nodejs/node#release-team
|
||||
# and keys listed here from previous version of this Dockerfile
|
||||
#for key in \
|
||||
#9554F04D7259F04124DE6B476D5A82AC7E37093B \
|
||||
#94AE36675C464D64BAFA68DD7434390BDBE9B9C5 \
|
||||
#FD3A5288F042B6850C66B31F09FE44734EB7990E \
|
||||
#71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 \
|
||||
#DD8F2338BAE7501E3DD5AC78C273792F7D83545D \
|
||||
#C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 \
|
||||
#B9AE9905FFD7803F25714661B63B535A4C206CA9 \
|
||||
#; do \
|
||||
#gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key" || \
|
||||
#gpg --keyserver pgp.mit.edu --recv-keys "$key" || \
|
||||
#gpg --keyserver keyserver.pgp.com --recv-keys "$key" ; \
|
||||
#done && \
|
||||
#gpg --verify SHASUMS256.txt.asc && \
|
||||
# Ignore socket files then delete files then delete directories
|
||||
#find "$GNUPGHOME" -type f | xargs rm -f && \
|
||||
#find "$GNUPGHOME" -type d | xargs rm -fR && \
|
||||
rm -f SHASUMS256.txt.asc && \
|
||||
\
|
||||
# Install Node
|
||||
@@ -229,90 +204,32 @@ RUN \
|
||||
\
|
||||
# Install Node dependencies. Python path for node-gyp.
|
||||
npm install -g npm@${NPM_VERSION} && \
|
||||
#npm config set python python2.7 && \
|
||||
#npm install -g node-gyp && \
|
||||
#npm install -g fibers@${FIBERS_VERSION} && \
|
||||
\
|
||||
# Change user to wekan and install meteor
|
||||
cd /home/wekan/ && \
|
||||
chown wekan --recursive /home/wekan && \
|
||||
#curl "https://install.meteor.com" -o /home/wekan/install_meteor.sh && \
|
||||
#curl "https://install.meteor.com/?release=${METEOR_RELEASE}" -o /home/wekan/install_meteor.sh && \
|
||||
# OLD: sed -i "s|RELEASE=.*|RELEASE=${METEOR_RELEASE}\"\"|g" ./install_meteor.sh && \
|
||||
# Install Meteor forcing its progress
|
||||
#sed -i 's/VERBOSITY="--silent"/VERBOSITY="--progress-bar"/' ./install_meteor.sh && \
|
||||
echo "Starting meteor ${METEOR_RELEASE} installation... \n" && \
|
||||
gosu wekan:wekan curl https://install.meteor.com/ | /bin/sh && \
|
||||
mv /root/.meteor /home/wekan/ && \
|
||||
chown wekan --recursive /home/wekan/.meteor && \
|
||||
\
|
||||
# Check if opting for a release candidate instead of major release
|
||||
#if [ "$USE_EDGE" = false ]; then \
|
||||
#gosu wekan:wekan sh /home/wekan/install_meteor.sh; \
|
||||
# gosu wekan:wekan curl https://install.meteor.com/ | sh; \
|
||||
#else \
|
||||
# gosu wekan:wekan git clone --recursive --depth 1 -b release/METEOR@${METEOR_EDGE} https://github.com/meteor/meteor.git /home/wekan/.meteor; \
|
||||
#fi; \
|
||||
#\
|
||||
# Get additional packages
|
||||
#mkdir -p /home/wekan/app/packages && \
|
||||
#chown wekan:wekan --recursive /home/wekan && \
|
||||
# REPOS BELOW ARE INCLUDED TO WEKAN REPO
|
||||
#cd /home/wekan/app/packages && \
|
||||
#gosu wekan:wekan git clone --depth 1 -b master https://github.com/wekan/flow-router.git kadira-flow-router && \
|
||||
#gosu wekan:wekan git clone --depth 1 -b master https://github.com/meteor-useraccounts/core.git meteor-useraccounts-core && \
|
||||
#gosu wekan:wekan git clone --depth 1 -b master https://github.com/wekan/meteor-accounts-cas.git && \
|
||||
#gosu wekan:wekan git clone --depth 1 -b master https://github.com/wekan/wekan-ldap.git && \
|
||||
#gosu wekan:wekan git clone --depth 1 -b master https://github.com/wekan/wekan-scrollbar.git && \
|
||||
#gosu wekan:wekan git clone --depth 1 -b master https://github.com/wekan/meteor-accounts-oidc.git && \
|
||||
#gosu wekan:wekan git clone --depth 1 -b master --recurse-submodules https://github.com/wekan/markdown.git && \
|
||||
#gosu wekan:wekan mv meteor-accounts-oidc/packages/switch_accounts-oidc wekan-accounts-oidc && \
|
||||
#gosu wekan:wekan mv meteor-accounts-oidc/packages/switch_oidc wekan-oidc && \
|
||||
#gosu wekan:wekan rm -rf meteor-accounts-oidc && \
|
||||
sed -i 's/api\.versionsFrom/\/\/api.versionsFrom/' /home/wekan/app/packages/meteor-useraccounts-core/package.js && \
|
||||
cd /home/wekan/.meteor && \
|
||||
gosu wekan:wekan /home/wekan/.meteor/meteor -- help; \
|
||||
\
|
||||
# extract the OpenAPI specification
|
||||
#npm install -g api2html@0.3.3 && \
|
||||
#mkdir -p /home/wekan/python && \
|
||||
#chown wekan --recursive /home/wekan/python && \
|
||||
#cd /home/wekan/python && \
|
||||
#gosu wekan:wekan git clone --depth 1 -b master https://github.com/Kronuz/esprima-python && \
|
||||
#cd /home/wekan/python/esprima-python && \
|
||||
#python3 setup.py install --record files.txt && \
|
||||
#cd /home/wekan/app && \
|
||||
#mkdir -p /home/wekan/app/public/api && \
|
||||
#chown wekan --recursive /home/wekan/app && \
|
||||
#gosu wekan:wekan python3 ./openapi/generate_openapi.py --release $(git describe --tags --abbrev=0) > ./public/api/wekan.yml && \
|
||||
#gosu wekan:wekan /opt/nodejs/bin/api2html -c ./public/logo-header.png -o ./public/api/wekan.html ./public/api/wekan.yml; \
|
||||
# Build app
|
||||
cd /home/wekan/app && \
|
||||
mkdir -p /home/wekan/.npm && \
|
||||
chown wekan --recursive /home/wekan/.npm /home/wekan/.config /home/wekan/.meteor && \
|
||||
#gosu wekan:wekan /home/wekan/.meteor/meteor add standard-minifier-js && \
|
||||
chmod u+w *.json && \
|
||||
gosu wekan:wekan npm install && \
|
||||
gosu wekan:wekan /home/wekan/.meteor/meteor build --directory /home/wekan/app_build && \
|
||||
#rm /home/wekan/app_build/bundle/programs/server/npm/node_modules/meteor/rajit_bootstrap3-datepicker/lib/bootstrap-datepicker/node_modules/phantomjs-prebuilt/lib/phantom/bin/phantomjs && \
|
||||
#Removed binary version of bcrypt because of security vulnerability that is not fixed yet.
|
||||
#https://github.com/wekan/wekan/commit/4b2010213907c61b0e0482ab55abb06f6a668eac
|
||||
#https://github.com/wekan/wekan/commit/7eeabf14be3c63fae2226e561ef8a0c1390c8d3c
|
||||
#cd /home/wekan/app_build/bundle/programs/server/npm/node_modules/meteor/npm-bcrypt && \
|
||||
#gosu wekan:wekan rm -rf node_modules/bcrypt && \
|
||||
#gosu wekan:wekan npm install bcrypt && \
|
||||
#
|
||||
# Delete phantomjs
|
||||
#cd /home/wekan/app_build/bundle && \
|
||||
#find . -name "*phantomjs*" | xargs rm -rf && \
|
||||
#
|
||||
cd /home/wekan/app_build/bundle/programs/server/ && \
|
||||
chmod u+w *.json && \
|
||||
gosu wekan:wekan npm install && \
|
||||
cd node_modules/fibers && \
|
||||
node build.js && \
|
||||
cd ../.. && \
|
||||
#gosu wekan:wekan npm install bcrypt && \
|
||||
# Remove legacy webbroser bundle, so that Wekan works also at Android Firefox, iOS Safari, etc.
|
||||
rm -rf /home/wekan/app_build/bundle/programs/web.browser.legacy && \
|
||||
mv /home/wekan/app_build/bundle /build && \
|
||||
@@ -339,6 +256,8 @@ ENV PORT=8080
|
||||
EXPOSE $PORT
|
||||
USER wekan
|
||||
|
||||
STOPSIGNAL SIGKILL
|
||||
|
||||
#---------------------------------------------------------------------
|
||||
# https://github.com/wekan/wekan/issues/3585#issuecomment-1021522132
|
||||
# Add more Node heap:
|
||||
|
||||
+2
-2
@@ -4,7 +4,7 @@ FROM amd64/alpine:3.7 AS builder
|
||||
ENV QEMU_VERSION=v4.2.0-6 \
|
||||
QEMU_ARCHITECTURE=aarch64 \
|
||||
NODE_ARCHITECTURE=linux-arm64 \
|
||||
NODE_VERSION=v14.19.3 \
|
||||
NODE_VERSION=v14.20.0 \
|
||||
WEKAN_VERSION=latest \
|
||||
WEKAN_ARCHITECTURE=arm64 \
|
||||
NODE_OPTIONS="--max_old_space_size=4096"
|
||||
@@ -49,7 +49,7 @@ LABEL maintainer="wekan"
|
||||
# Set the environment variables (defaults where required)
|
||||
ENV QEMU_ARCHITECTURE=aarch64 \
|
||||
NODE_ARCHITECTURE=linux-arm64 \
|
||||
NODE_VERSION=v14.19.3 \
|
||||
NODE_VERSION=v14.20.0 \
|
||||
NODE_ENV=production \
|
||||
NPM_VERSION=latest \
|
||||
WITH_API=true \
|
||||
|
||||
@@ -17,9 +17,9 @@
|
||||
## [Translate WeKan ® at Transifex](https://transifex.com/wekan/wekan)
|
||||
|
||||
Translations to non-English languages are accepted only at [Transifex](https://transifex.com/wekan/wekan) using webbrowser.
|
||||
New English strings of new features can be added as PRs to edge branch file wekan/i18n/en.i18n.json .
|
||||
New English strings of new features can be added as PRs to master branch file wekan/imports/i18n/data/en.i18n.json .
|
||||
|
||||
## [Wekan feature requests and bugs](https://github.com/wekan/wekan/issues)
|
||||
## [WeKan ® feature requests and bugs](https://github.com/wekan/wekan/issues)
|
||||
|
||||
Please add most of your questions as GitHub issue: [WeKan ® Feature Requests and Bugs](https://github.com/wekan/wekan/issues).
|
||||
It's better than at chat where details get lost when chat scrolls up.
|
||||
@@ -28,7 +28,7 @@ It's better than at chat where details get lost when chat scrolls up.
|
||||
|
||||
[Discussions][discussions] - WeKan Community GitHub Discussions, that are not [Feature Requests and Bugs](https://github.com/wekan/wekan/issues).
|
||||
|
||||
[Wekan IRC FAQ](https://github.com/wekan/wekan/wiki/IRC-FAQ)
|
||||
[WeKan IRC FAQ](https://github.com/wekan/wekan/wiki/IRC-FAQ)
|
||||
|
||||
## Docker: Please only use Docker release tags
|
||||
|
||||
@@ -56,8 +56,8 @@ install Wekan on your own computer or server. In fact we encourage you to do
|
||||
that by providing one-click installation on various platforms.
|
||||
|
||||
- WeKan ® is used in [most countries of the world](https://snapcraft.io/wekan).
|
||||
- Wekan largest user has 22k users using Wekan in their company.
|
||||
- Wekan has been [translated](https://transifex.com/wekan/wekan) to about 105 languages.
|
||||
- WeKan ® largest user has 22k users using WeKan ® in their company.
|
||||
- WeKan ® has been [translated](https://transifex.com/wekan/wekan) to about 105 languages.
|
||||
- [Features][features]: WeKan ® has real-time user interface.
|
||||
- [Platforms][platforms]: WeKan ® supports many platforms.
|
||||
WeKan ® is critical part of new platforms Wekan is currently being integrated to.
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
appId: wekan-public/apps/77b94f60-dec9-0136-304e-16ff53095928
|
||||
appVersion: "v6.26.0"
|
||||
appVersion: "v6.45.0"
|
||||
files:
|
||||
userUploads:
|
||||
- README.md
|
||||
|
||||
@@ -162,7 +162,7 @@ users = wekanurl + apiusers
|
||||
# ------- LOGIN TOKEN START -----------
|
||||
|
||||
data = {"username": username, "password": password}
|
||||
body = requests.post(wekanloginurl, data=data)
|
||||
body = requests.post(wekanloginurl, json=data)
|
||||
d = body.json()
|
||||
apikey = d['token']
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@ template(name="archivedBoards")
|
||||
i.fa.fa-undo
|
||||
| {{_ 'restore-board'}}
|
||||
= title
|
||||
span {{ moment archivedAt 'LLL' }}
|
||||
else
|
||||
li.no-items-message {{_ 'no-archived-boards'}}
|
||||
|
||||
|
||||
@@ -32,11 +32,10 @@
|
||||
animation: fadeIn 0.2s;
|
||||
z-index: 16;
|
||||
}
|
||||
.board-wrapper .board-canvas.is-dragging-active .open-minicard-composer,
|
||||
.board-wrapper .board-canvas.is-dragging-active .minicard-wrapper.is-checked {
|
||||
display: none;
|
||||
}
|
||||
@media screen and (max-width: 800px) {
|
||||
@media screen and (max-width: 250px) {
|
||||
.board-wrapper .board-canvas .swimlane {
|
||||
border-bottom: 1px solid #ccc;
|
||||
display: flex;
|
||||
|
||||
@@ -193,7 +193,7 @@ BlazeComponent.extendComponent({
|
||||
});
|
||||
|
||||
this.autorun(() => {
|
||||
if (Utils.isMiniScreenOrShowDesktopDragHandles()) {
|
||||
if (Utils.isTouchScreenOrShowDesktopDragHandles()) {
|
||||
$swimlanesDom.sortable({
|
||||
handle: '.js-swimlane-header-handle',
|
||||
});
|
||||
@@ -228,10 +228,10 @@ BlazeComponent.extendComponent({
|
||||
}
|
||||
},
|
||||
|
||||
notDisplayThisBoard(){
|
||||
notDisplayThisBoard() {
|
||||
let allowPrivateVisibilityOnly = TableVisibilityModeSettings.findOne('tableVisibilityMode-allowPrivateOnly');
|
||||
let currentBoard = Boards.findOne(Session.get('currentBoard'));
|
||||
if(allowPrivateVisibilityOnly !== undefined && allowPrivateVisibilityOnly.booleanValue && currentBoard.permission == 'public'){
|
||||
if (allowPrivateVisibilityOnly !== undefined && allowPrivateVisibilityOnly.booleanValue && currentBoard.permission == 'public') {
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -319,7 +319,7 @@ BlazeComponent.extendComponent({
|
||||
|
||||
BlazeComponent.extendComponent({
|
||||
onRendered() {
|
||||
this.autorun(function() {
|
||||
this.autorun(function () {
|
||||
$('#calendar-view').fullCalendar('refetchEvents');
|
||||
});
|
||||
},
|
||||
@@ -351,7 +351,7 @@ BlazeComponent.extendComponent({
|
||||
events(start, end, timezone, callback) {
|
||||
const currentBoard = Boards.findOne(Session.get('currentBoard'));
|
||||
const events = [];
|
||||
const pushEvent = function(card, title, start, end, extraCls) {
|
||||
const pushEvent = function (card, title, start, end, extraCls) {
|
||||
start = start || card.startAt;
|
||||
end = end || card.endAt;
|
||||
title = title || card.title;
|
||||
@@ -375,12 +375,12 @@ BlazeComponent.extendComponent({
|
||||
};
|
||||
currentBoard
|
||||
.cardsInInterval(start.toDate(), end.toDate())
|
||||
.forEach(function(card) {
|
||||
.forEach(function (card) {
|
||||
pushEvent(card);
|
||||
});
|
||||
currentBoard
|
||||
.cardsDueInBetween(start.toDate(), end.toDate())
|
||||
.forEach(function(card) {
|
||||
.forEach(function (card) {
|
||||
pushEvent(
|
||||
card,
|
||||
`${card.title} ${TAPi18n.__('card-due')}`,
|
||||
@@ -388,7 +388,7 @@ BlazeComponent.extendComponent({
|
||||
new Date(card.dueAt.getTime() + 36e5),
|
||||
);
|
||||
});
|
||||
events.sort(function(first, second) {
|
||||
events.sort(function (first, second) {
|
||||
return first.id > second.id ? 1 : -1;
|
||||
});
|
||||
callback(events);
|
||||
@@ -411,8 +411,10 @@ BlazeComponent.extendComponent({
|
||||
if (card) {
|
||||
// TODO: add a flag for allDay events
|
||||
if (!event.allDay) {
|
||||
card.setStart(event.start.toDate());
|
||||
card.setEnd(event.end.toDate());
|
||||
// https://github.com/wekan/wekan/issues/2917#issuecomment-1236753962
|
||||
//card.setStart(event.start.toDate());
|
||||
//card.setEnd(event.end.toDate());
|
||||
card.setDue(event.start.toDate());
|
||||
isOk = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1141,7 +1141,7 @@
|
||||
color: rgba(0,0,0,0.5);
|
||||
position: absolute;
|
||||
margin-top: -34px;
|
||||
margin-let: -11px;
|
||||
margin-left: -11px;
|
||||
}
|
||||
.board-color-clearblue a.fa,
|
||||
.board-color-clearblue a i.fa {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
@import url("css/reset.css") print, screen;
|
||||
@import url("/css/reset.css") print, screen;
|
||||
|
||||
.board-list {
|
||||
margin: 0 8px;
|
||||
|
||||
@@ -62,7 +62,7 @@ template(name="boardList")
|
||||
i.fa.js-has-spenttime-cards(
|
||||
class="fa-circle{{#if hasOvertimeCards}} has-overtime-card-active{{else}} no-overtime-card-active{{/if}}"
|
||||
title="{{#if hasOvertimeCards}}{{_ 'has-overtime-cards'}}{{else}}{{_ 'has-spenttime-cards'}}{{/if}}")
|
||||
if isMiniScreenOrShowDesktopDragHandles
|
||||
if isTouchScreenOrShowDesktopDragHandles
|
||||
i.fa.board-handle(
|
||||
class="fa-arrows"
|
||||
title="{{_ 'Drag board'}}")
|
||||
@@ -114,7 +114,7 @@ template(name="boardList")
|
||||
i.fa.js-has-spenttime-cards(
|
||||
class="fa-circle{{#if hasOvertimeCards}} has-overtime-card-active{{else}} no-overtime-card-active{{/if}}"
|
||||
title="{{#if hasOvertimeCards}}{{_ 'has-overtime-cards'}}{{else}}{{_ 'has-spenttime-cards'}}{{/if}}")
|
||||
if isMiniScreenOrShowDesktopDragHandles
|
||||
if isTouchScreenOrShowDesktopDragHandles
|
||||
i.fa.board-handle(
|
||||
class="fa-arrows"
|
||||
title="{{_ 'Drag board'}}")
|
||||
|
||||
@@ -30,7 +30,7 @@ BlazeComponent.extendComponent({
|
||||
Meteor.subscribe('tableVisibilityModeSettings');
|
||||
let currUser = Meteor.user();
|
||||
let userLanguage;
|
||||
if(currUser && currUser.profile){
|
||||
if (currUser && currUser.profile) {
|
||||
userLanguage = currUser.profile.language
|
||||
}
|
||||
if (userLanguage) {
|
||||
@@ -79,54 +79,54 @@ BlazeComponent.extendComponent({
|
||||
|
||||
// Disable drag-dropping if the current user is not a board member or is comment only
|
||||
this.autorun(() => {
|
||||
if (Utils.isMiniScreenOrShowDesktopDragHandles()) {
|
||||
if (Utils.isTouchScreenOrShowDesktopDragHandles()) {
|
||||
$boards.sortable({
|
||||
handle: '.board-handle',
|
||||
});
|
||||
}
|
||||
});
|
||||
},
|
||||
userHasTeams(){
|
||||
if(Meteor.user() != null && Meteor.user().teams && Meteor.user().teams.length > 0)
|
||||
userHasTeams() {
|
||||
if (Meteor.user() != null && Meteor.user().teams && Meteor.user().teams.length > 0)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
},
|
||||
teamsDatas() {
|
||||
if(Meteor.user().teams)
|
||||
if (Meteor.user().teams)
|
||||
return Meteor.user().teams.sort((a, b) => a.teamDisplayName.localeCompare(b.teamDisplayName));
|
||||
else
|
||||
return [];
|
||||
},
|
||||
userHasOrgs(){
|
||||
if(Meteor.user() != null && Meteor.user().orgs && Meteor.user().orgs.length > 0)
|
||||
userHasOrgs() {
|
||||
if (Meteor.user() != null && Meteor.user().orgs && Meteor.user().orgs.length > 0)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
},
|
||||
/*
|
||||
userHasTemplates(){
|
||||
if(Meteor.user() != null && Meteor.user().orgs && Meteor.user().orgs.length > 0)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
},
|
||||
*/
|
||||
/*
|
||||
userHasTemplates(){
|
||||
if(Meteor.user() != null && Meteor.user().orgs && Meteor.user().orgs.length > 0)
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
},
|
||||
*/
|
||||
orgsDatas() {
|
||||
if(Meteor.user().orgs)
|
||||
if (Meteor.user().orgs)
|
||||
return Meteor.user().orgs.sort((a, b) => a.orgDisplayName.localeCompare(b.orgDisplayName));
|
||||
else
|
||||
return [];
|
||||
},
|
||||
userHasOrgsOrTeams(){
|
||||
userHasOrgsOrTeams() {
|
||||
let boolUserHasOrgs;
|
||||
if(Meteor.user() != null && Meteor.user().orgs && Meteor.user().orgs.length > 0)
|
||||
if (Meteor.user() != null && Meteor.user().orgs && Meteor.user().orgs.length > 0)
|
||||
boolUserHasOrgs = true;
|
||||
else
|
||||
boolUserHasOrgs = false;
|
||||
|
||||
let boolUserHasTeams;
|
||||
if(Meteor.user() != null && Meteor.user().teams && Meteor.user().teams.length > 0)
|
||||
if (Meteor.user() != null && Meteor.user().teams && Meteor.user().teams.length > 0)
|
||||
boolUserHasTeams = true;
|
||||
else
|
||||
boolUserHasTeams = false;
|
||||
@@ -139,18 +139,18 @@ BlazeComponent.extendComponent({
|
||||
// { type: { $in: ['board','template-container'] } },
|
||||
$and: [
|
||||
{ archived: false },
|
||||
{ type: { $in: ['board','template-container'] } },
|
||||
{ $or:[] }
|
||||
{ type: { $in: ['board', 'template-container'] } },
|
||||
{ $or: [] }
|
||||
]
|
||||
};
|
||||
|
||||
let allowPrivateVisibilityOnly = TableVisibilityModeSettings.findOne('tableVisibilityMode-allowPrivateOnly');
|
||||
|
||||
if (FlowRouter.getRouteName() === 'home'){
|
||||
query.$and[2].$or.push({'members.userId': Meteor.userId()});
|
||||
if (FlowRouter.getRouteName() === 'home') {
|
||||
query.$and[2].$or.push({ 'members.userId': Meteor.userId() });
|
||||
|
||||
if(allowPrivateVisibilityOnly !== undefined && allowPrivateVisibilityOnly.booleanValue){
|
||||
query.$and.push({'permission': 'private'});
|
||||
if (allowPrivateVisibilityOnly !== undefined && allowPrivateVisibilityOnly.booleanValue) {
|
||||
query.$and.push({ 'permission': 'private' });
|
||||
}
|
||||
const currUser = Users.findOne(Meteor.userId());
|
||||
|
||||
@@ -162,27 +162,27 @@ BlazeComponent.extendComponent({
|
||||
// });
|
||||
|
||||
let orgIdsUserBelongs = currUser !== undefined && currUser.teams !== 'undefined' ? currUser.orgIdsUserBelongs() : '';
|
||||
if(orgIdsUserBelongs && orgIdsUserBelongs != ''){
|
||||
if (orgIdsUserBelongs && orgIdsUserBelongs != '') {
|
||||
let orgsIds = orgIdsUserBelongs.split(',');
|
||||
// for(let i = 0; i < orgsIds.length; i++){
|
||||
// query.$and[2].$or.push({'orgs.orgId': orgsIds[i]});
|
||||
// }
|
||||
|
||||
//query.$and[2].$or.push({'orgs': {$elemMatch : {orgId: orgsIds[0]}}});
|
||||
query.$and[2].$or.push({'orgs.orgId': {$in : orgsIds}});
|
||||
query.$and[2].$or.push({ 'orgs.orgId': { $in: orgsIds } });
|
||||
}
|
||||
|
||||
let teamIdsUserBelongs = currUser !== undefined && currUser.teams !== 'undefined' ? currUser.teamIdsUserBelongs() : '';
|
||||
if(teamIdsUserBelongs && teamIdsUserBelongs != ''){
|
||||
if (teamIdsUserBelongs && teamIdsUserBelongs != '') {
|
||||
let teamsIds = teamIdsUserBelongs.split(',');
|
||||
// for(let i = 0; i < teamsIds.length; i++){
|
||||
// query.$or[2].$or.push({'teams.teamId': teamsIds[i]});
|
||||
// }
|
||||
//query.$and[2].$or.push({'teams': { $elemMatch : {teamId: teamsIds[0]}}});
|
||||
query.$and[2].$or.push({'teams.teamId': {$in : teamsIds}});
|
||||
query.$and[2].$or.push({ 'teams.teamId': { $in: teamsIds } });
|
||||
}
|
||||
}
|
||||
else if(allowPrivateVisibilityOnly !== undefined && !allowPrivateVisibilityOnly.booleanValue){
|
||||
else if (allowPrivateVisibilityOnly !== undefined && !allowPrivateVisibilityOnly.booleanValue) {
|
||||
query = {
|
||||
archived: false,
|
||||
//type: { $in: ['board','template-container'] },
|
||||
@@ -197,9 +197,9 @@ BlazeComponent.extendComponent({
|
||||
},
|
||||
boardLists(boardId) {
|
||||
let boardLists = [];
|
||||
const lists = Lists.find({'boardId' : boardId})
|
||||
const lists = Lists.find({ 'boardId': boardId, 'archived': false },{sort: ['sort','asc']});
|
||||
lists.forEach(list => {
|
||||
let cardCount = Cards.find({'boardId':boardId, 'listId':list._id}).count()
|
||||
let cardCount = Cards.find({ 'boardId': boardId, 'listId': list._id }).count()
|
||||
boardLists.push(`${list.title}: ${cardCount}`);
|
||||
});
|
||||
return boardLists
|
||||
@@ -207,7 +207,7 @@ BlazeComponent.extendComponent({
|
||||
|
||||
boardMembers(boardId) {
|
||||
let boardMembers = [];
|
||||
const lists = Boards.findOne({'_id' : boardId})
|
||||
const lists = Boards.findOne({ '_id': boardId })
|
||||
let members = lists.members
|
||||
members.forEach(member => {
|
||||
boardMembers.push(member.userId);
|
||||
@@ -291,10 +291,10 @@ BlazeComponent.extendComponent({
|
||||
}
|
||||
});
|
||||
},
|
||||
'click #resetBtn'(event){
|
||||
'click #resetBtn'(event) {
|
||||
let allBoards = document.getElementsByClassName("js-board");
|
||||
let currBoard;
|
||||
for(let i=0; i < allBoards.length; i++){
|
||||
for (let i = 0; i < allBoards.length; i++) {
|
||||
currBoard = allBoards[i];
|
||||
currBoard.style.display = "block";
|
||||
}
|
||||
@@ -302,57 +302,55 @@ BlazeComponent.extendComponent({
|
||||
'click #filterBtn'(event) {
|
||||
event.preventDefault();
|
||||
let selectedTeams = document.querySelectorAll('#jsAllBoardTeams option:checked');
|
||||
let selectedTeamsValues = Array.from(selectedTeams).map(function(elt){return elt.value});
|
||||
let selectedTeamsValues = Array.from(selectedTeams).map(function (elt) { return elt.value });
|
||||
let index = selectedTeamsValues.indexOf("-1");
|
||||
if (index > -1) {
|
||||
selectedTeamsValues.splice(index, 1);
|
||||
}
|
||||
|
||||
let selectedOrgs = document.querySelectorAll('#jsAllBoardOrgs option:checked');
|
||||
let selectedOrgsValues = Array.from(selectedOrgs).map(function(elt){return elt.value});
|
||||
let selectedOrgsValues = Array.from(selectedOrgs).map(function (elt) { return elt.value });
|
||||
index = selectedOrgsValues.indexOf("-1");
|
||||
if (index > -1) {
|
||||
selectedOrgsValues.splice(index, 1);
|
||||
}
|
||||
|
||||
if(selectedTeamsValues.length > 0 || selectedOrgsValues.length > 0){
|
||||
if (selectedTeamsValues.length > 0 || selectedOrgsValues.length > 0) {
|
||||
const query = {
|
||||
$and: [
|
||||
{ archived: false },
|
||||
{ type: 'board' },
|
||||
{ $or:[] }
|
||||
{ $or: [] }
|
||||
]
|
||||
};
|
||||
if(selectedTeamsValues.length > 0)
|
||||
{
|
||||
query.$and[2].$or.push({'teams.teamId': {$in : selectedTeamsValues}});
|
||||
if (selectedTeamsValues.length > 0) {
|
||||
query.$and[2].$or.push({ 'teams.teamId': { $in: selectedTeamsValues } });
|
||||
}
|
||||
if(selectedOrgsValues.length > 0)
|
||||
{
|
||||
query.$and[2].$or.push({'orgs.orgId': {$in : selectedOrgsValues}});
|
||||
if (selectedOrgsValues.length > 0) {
|
||||
query.$and[2].$or.push({ 'orgs.orgId': { $in: selectedOrgsValues } });
|
||||
}
|
||||
|
||||
let filteredBoards = Boards.find(query, {}).fetch();
|
||||
let allBoards = document.getElementsByClassName("js-board");
|
||||
let currBoard;
|
||||
if(filteredBoards.length > 0){
|
||||
if (filteredBoards.length > 0) {
|
||||
let currBoardId;
|
||||
let found;
|
||||
for(let i=0; i < allBoards.length; i++){
|
||||
for (let i = 0; i < allBoards.length; i++) {
|
||||
currBoard = allBoards[i];
|
||||
currBoardId = currBoard.classList[0];
|
||||
found = filteredBoards.find(function(board){
|
||||
found = filteredBoards.find(function (board) {
|
||||
return board._id == currBoardId;
|
||||
});
|
||||
|
||||
if(found !== undefined)
|
||||
if (found !== undefined)
|
||||
currBoard.style.display = "block";
|
||||
else
|
||||
currBoard.style.display = "none";
|
||||
}
|
||||
}
|
||||
else{
|
||||
for(let i=0; i < allBoards.length; i++){
|
||||
else {
|
||||
for (let i = 0; i < allBoards.length; i++) {
|
||||
currBoard = allBoards[i];
|
||||
currBoard.style.display = "none";
|
||||
}
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
.attachment-upload {
|
||||
text-align: center;
|
||||
font-weight: bold;
|
||||
}
|
||||
.attachments-galery {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
|
||||
@@ -1,10 +1,25 @@
|
||||
template(name="cardAttachmentsPopup")
|
||||
ul.pop-over-list
|
||||
li
|
||||
input.js-attach-file.hide(type="file" name="file" multiple)
|
||||
a.js-computer-upload {{_ 'computer'}}
|
||||
li
|
||||
a.js-upload-clipboard-image {{_ 'clipboard'}}
|
||||
if $gt uploads.length 0
|
||||
.attachment-upload {{_ 'uploading'}}
|
||||
table
|
||||
tr
|
||||
th.upload-file-name-descr {{_ 'name'}}
|
||||
th.upload-progress-descr {{_ 'progress'}}
|
||||
th.upload-remaining-descr {{_ 'remaining_time'}}
|
||||
th.upload-speed-descr {{_ 'speed'}}
|
||||
each upload in uploads
|
||||
tr
|
||||
td.upload-file-name-value {{upload.file.name}}
|
||||
td.upload-progress-value {{upload.progress.get}}%
|
||||
td.upload-remaining-value {{getEstimateTime upload}}
|
||||
td.upload-speed-value {{getEstimateSpeed upload}}
|
||||
else
|
||||
ul.pop-over-list
|
||||
li
|
||||
input.js-attach-file.hide(type="file" name="file" multiple)
|
||||
a.js-computer-upload {{_ 'computer'}}
|
||||
li
|
||||
a.js-upload-clipboard-image {{_ 'clipboard'}}
|
||||
|
||||
template(name="previewClipboardImagePopup")
|
||||
p <kbd>Ctrl</kbd>+<kbd>V</kbd> {{_ "paste-or-dragdrop"}}
|
||||
@@ -19,7 +34,7 @@ template(name="attachmentsGalery")
|
||||
.attachments-galery
|
||||
each attachments
|
||||
.attachment-item
|
||||
a.attachment-thumbnail(href="{{link}}" title="{{name}}" data-lightbox="{{name}}")
|
||||
a.attachment-thumbnail.swipebox(href="{{link}}" title="{{name}}")
|
||||
if link
|
||||
if isImage
|
||||
img.attachment-thumbnail-img(src="{{link}}")
|
||||
@@ -37,11 +52,9 @@ template(name="attachmentsGalery")
|
||||
source(src="{{link}}" type="video/mp4")
|
||||
else
|
||||
span.attachment-thumbnail-ext= extension
|
||||
else
|
||||
+spinner
|
||||
p.attachment-details
|
||||
= name
|
||||
span.file-size ({{fileSize size}} KB)
|
||||
span.file-size ({{fileSize size}})
|
||||
span.attachment-details-actions
|
||||
a.js-download(href="{{link}}?download=true", download="{{name}}")
|
||||
i.fa.fa-download
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
const filesize = require('filesize');
|
||||
const prettyMilliseconds = require('pretty-ms');
|
||||
|
||||
Template.attachmentsGalery.events({
|
||||
'click .js-add-attachment': Popup.open('cardAttachments'),
|
||||
// If we let this event bubble, FlowRouter will handle it and empty the page
|
||||
@@ -13,37 +16,68 @@ Template.attachmentsGalery.helpers({
|
||||
return Meteor.user().isBoardAdmin();
|
||||
},
|
||||
fileSize(size) {
|
||||
return Math.round(size / 1024);
|
||||
const ret = filesize(size);
|
||||
return ret;
|
||||
},
|
||||
});
|
||||
|
||||
Template.cardAttachmentsPopup.onCreated(function() {
|
||||
this.uploads = new ReactiveVar([]);
|
||||
});
|
||||
|
||||
Template.cardAttachmentsPopup.helpers({
|
||||
getEstimateTime(upload) {
|
||||
const ret = prettyMilliseconds(upload.estimateTime.get());
|
||||
return ret;
|
||||
},
|
||||
getEstimateSpeed(upload) {
|
||||
const ret = filesize(upload.estimateSpeed.get(), {round: 0}) + "/s";
|
||||
return ret;
|
||||
},
|
||||
uploads() {
|
||||
return Template.instance().uploads.get();
|
||||
}
|
||||
});
|
||||
|
||||
Template.cardAttachmentsPopup.events({
|
||||
'change .js-attach-file'(event) {
|
||||
'change .js-attach-file'(event, templateInstance) {
|
||||
const card = this;
|
||||
if (event.currentTarget.files && event.currentTarget.files[0]) {
|
||||
const fileId = Random.id();
|
||||
const config = {
|
||||
file: event.currentTarget.files[0],
|
||||
fileId: fileId,
|
||||
meta: Utils.getCommonAttachmentMetaFrom(card),
|
||||
chunkSize: 'dynamic',
|
||||
};
|
||||
config.meta.fileId = fileId;
|
||||
const uploader = Attachments.insert(
|
||||
config,
|
||||
false,
|
||||
);
|
||||
uploader.on('uploaded', (error, fileRef) => {
|
||||
if (!error) {
|
||||
if (fileRef.isImage) {
|
||||
card.setCover(fileRef._id);
|
||||
const files = event.currentTarget.files;
|
||||
if (files) {
|
||||
let uploads = [];
|
||||
for (const file of files) {
|
||||
const fileId = Random.id();
|
||||
const config = {
|
||||
file: file,
|
||||
fileId: fileId,
|
||||
meta: Utils.getCommonAttachmentMetaFrom(card),
|
||||
chunkSize: 'dynamic',
|
||||
};
|
||||
config.meta.fileId = fileId;
|
||||
const uploader = Attachments.insert(
|
||||
config,
|
||||
false,
|
||||
);
|
||||
uploader.on('start', function() {
|
||||
uploads.push(this);
|
||||
templateInstance.uploads.set(uploads);
|
||||
});
|
||||
uploader.on('uploaded', (error, fileRef) => {
|
||||
if (!error) {
|
||||
if (fileRef.isImage) {
|
||||
card.setCover(fileRef._id);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
uploader.on('end', (error, fileRef) => {
|
||||
Popup.back();
|
||||
});
|
||||
uploader.start();
|
||||
});
|
||||
uploader.on('end', (error, fileRef) => {
|
||||
uploads = uploads.filter(_upload => _upload.config.fileId != fileRef._id);
|
||||
templateInstance.uploads.set(uploads);
|
||||
if (uploads.length == 0 ) {
|
||||
Popup.back();
|
||||
}
|
||||
});
|
||||
uploader.start();
|
||||
}
|
||||
}
|
||||
},
|
||||
'click .js-computer-upload'(event, templateInstance) {
|
||||
|
||||
@@ -682,13 +682,12 @@ template(name="cardDetailsActionsPopup")
|
||||
i.fa.fa-copy
|
||||
| {{_ 'copyCardPopup-title'}}
|
||||
unless currentUser.isWorker
|
||||
hr
|
||||
ul.pop-over-list
|
||||
li
|
||||
a.js-copy-checklist-cards
|
||||
i.fa.fa-list
|
||||
i.fa.fa-copy
|
||||
| {{_ 'copyChecklistToManyCardsPopup-title'}}
|
||||
i.fa.fa-copy
|
||||
| {{_ 'copyManyCardsPopup-title'}}
|
||||
unless archived
|
||||
hr
|
||||
ul.pop-over-list
|
||||
@@ -712,39 +711,42 @@ template(name="exportCardPopup")
|
||||
| {{_ 'export-card-pdf'}}
|
||||
|
||||
template(name="moveCardPopup")
|
||||
+boardsAndLists
|
||||
+copyAndMoveCard
|
||||
|
||||
template(name="copyCardPopup")
|
||||
label(for='copy-card-title') {{_ 'title'}}:
|
||||
textarea#copy-card-title.minicard-composer-textarea.js-card-title(autofocus)
|
||||
= getTitle
|
||||
+boardsAndLists
|
||||
+copyAndMoveCard
|
||||
|
||||
template(name="copyChecklistToManyCardsPopup")
|
||||
label(for='copy-checklist-cards-title') {{_ 'copyChecklistToManyCardsPopup-instructions'}}:
|
||||
template(name="copyManyCardsPopup")
|
||||
label(for='copy-checklist-cards-title') {{_ 'copyManyCardsPopup-instructions'}}:
|
||||
textarea#copy-card-title.minicard-composer-textarea.js-card-title(autofocus)
|
||||
| {{_ 'copyChecklistToManyCardsPopup-format'}}
|
||||
+boardsAndLists
|
||||
| {{_ 'copyManyCardsPopup-format'}}
|
||||
+copyAndMoveCard
|
||||
|
||||
template(name="boardsAndLists")
|
||||
template(name="convertChecklistItemToCardPopup")
|
||||
label(for='convert-checklist-item-to-card-title') {{_ 'title'}}:
|
||||
textarea#copy-card-title.minicard-composer-textarea.js-card-title(autofocus)
|
||||
= item.title
|
||||
+copyAndMoveCard
|
||||
|
||||
template(name="copyAndMoveCard")
|
||||
unless currentUser.isWorker
|
||||
label {{_ 'boards'}}:
|
||||
select.js-select-boards(autofocus)
|
||||
each boards
|
||||
if $eq _id currentBoard._id
|
||||
option(value="{{_id}}" selected) {{_ 'current'}}
|
||||
else
|
||||
option(value="{{_id}}" selected="{{#if isMoveAndCopyDialogOptionBoardId _id}}selected{{/if}}") {{title}}
|
||||
option(value="{{_id}}" selected="{{#if isDialogOptionBoardId _id}}selected{{/if}}") {{title}}
|
||||
|
||||
label {{_ 'swimlanes'}}:
|
||||
select.js-select-swimlanes
|
||||
each swimlanes
|
||||
option(value="{{_id}}" selected="{{#if isMoveAndCopyDialogOptionSwimlaneId _id}}selected{{/if}}") {{title}}
|
||||
option(value="{{_id}}" selected="{{#if isDialogOptionSwimlaneId _id}}selected{{/if}}") {{title}}
|
||||
|
||||
label {{_ 'lists'}}:
|
||||
select.js-select-lists
|
||||
each aBoardLists
|
||||
option(value="{{_id}}" selected="{{#if isMoveAndCopyDialogOptionListId _id}}selected{{/if}}") {{title}}
|
||||
each lists
|
||||
option(value="{{_id}}" selected="{{#if isDialogOptionListId _id}}selected{{/if}}") {{title}}
|
||||
|
||||
.edit-controls.clearfix
|
||||
button.primary.confirm.js-done {{_ 'done'}}
|
||||
|
||||
@@ -10,6 +10,7 @@ import Lists from '/models/lists';
|
||||
import CardComments from '/models/cardComments';
|
||||
import { ALLOWED_COLORS } from '/config/const';
|
||||
import { UserAvatar } from '../users/userAvatar';
|
||||
import { DialogWithBoardSwimlaneList } from '/client/lib/dialogWithBoardSwimlaneList';
|
||||
|
||||
const subManager = new SubsManager();
|
||||
const { calculateIndexData } = Utils;
|
||||
@@ -86,17 +87,29 @@ BlazeComponent.extendComponent({
|
||||
scrollParentContainer() {
|
||||
const cardPanelWidth = 600;
|
||||
const parentComponent = this.parentComponent();
|
||||
// TODO sometimes parentComponent is not available, maybe because it's not
|
||||
// yet created?!
|
||||
if (!parentComponent) return;
|
||||
const bodyBoardComponent = parentComponent.parentComponent();
|
||||
|
||||
/*
|
||||
// Incomplete fix about bug where opening card scrolls to wrong place
|
||||
// https://github.com/wekan/wekan/issues/4572#issuecomment-1184149395
|
||||
// TODO sometimes parentComponent is not available, maybe because it's not
|
||||
// yet created?!
|
||||
if (!parentComponent) return;
|
||||
const bodyBoardComponent = parentComponent.parentComponent();
|
||||
*/
|
||||
|
||||
//On Mobile View Parent is Board, Not Board Body. I cant see how this funciton should work then.
|
||||
if (bodyBoardComponent === null) return;
|
||||
const $cardView = this.$(this.firstNode());
|
||||
const $cardContainer = bodyBoardComponent.$('.js-swimlanes');
|
||||
// TODO sometimes cardContainer is not available, maybe because it's not yet
|
||||
// created?!
|
||||
if (!$cardContainer) return;
|
||||
|
||||
/*
|
||||
// Incomplete fix about bug where opening card scrolls to wrong place
|
||||
// https://github.com/wekan/wekan/issues/4572#issuecomment-1184149395
|
||||
// TODO sometimes cardContainer is not available, maybe because it's not yet
|
||||
// created?!
|
||||
if (!$cardContainer) return;
|
||||
*/
|
||||
|
||||
const cardContainerScroll = $cardContainer.scrollLeft();
|
||||
const cardContainerWidth = $cardContainer.width();
|
||||
|
||||
@@ -212,11 +225,6 @@ BlazeComponent.extendComponent({
|
||||
//-------------
|
||||
}
|
||||
|
||||
if (!Utils.isMiniScreen()) {
|
||||
Meteor.setTimeout(() => {
|
||||
this.scrollParentContainer();
|
||||
}, 500);
|
||||
}
|
||||
const $checklistsDom = this.$('.card-checklist-items');
|
||||
|
||||
$checklistsDom.sortable({
|
||||
@@ -299,7 +307,7 @@ BlazeComponent.extendComponent({
|
||||
$checklistsDom.data('sortable')
|
||||
) {
|
||||
$checklistsDom.sortable('option', 'disabled', disabled);
|
||||
if (Utils.isMiniScreenOrShowDesktopDragHandles()) {
|
||||
if (Utils.isTouchScreenOrShowDesktopDragHandles()) {
|
||||
$checklistsDom.sortable({ handle: '.checklist-handle' });
|
||||
}
|
||||
}
|
||||
@@ -393,7 +401,9 @@ BlazeComponent.extendComponent({
|
||||
let card = this.data();
|
||||
const listSelect = this.$('.js-select-card-details-lists')[0];
|
||||
const listId = listSelect.options[listSelect.selectedIndex].value;
|
||||
card.move(card.boardId, card.swimlaneId, listId, card.sort);
|
||||
|
||||
const minOrder = card.getMinSort(listId, card.swimlaneId);
|
||||
card.move(card.boardId, card.swimlaneId, listId, minOrder - 1);
|
||||
},
|
||||
'click .js-go-to-linked-card'() {
|
||||
Utils.goCardId(this.data().linkedId);
|
||||
@@ -440,10 +450,20 @@ BlazeComponent.extendComponent({
|
||||
'click .js-maximize-card-details'() {
|
||||
Meteor.call('toggleCardMaximized');
|
||||
autosize($('.card-details'));
|
||||
if (!Utils.isMiniScreen()) {
|
||||
Meteor.setTimeout(() => {
|
||||
this.scrollParentContainer();
|
||||
}, 500);
|
||||
}
|
||||
},
|
||||
'click .js-minimize-card-details'() {
|
||||
Meteor.call('toggleCardMaximized');
|
||||
autosize($('.card-details'));
|
||||
if (!Utils.isMiniScreen()) {
|
||||
Meteor.setTimeout(() => {
|
||||
this.scrollParentContainer();
|
||||
}, 500);
|
||||
}
|
||||
},
|
||||
'click .js-vote'(e) {
|
||||
const forIt = $(e.target).hasClass('js-vote-positive');
|
||||
@@ -668,25 +688,17 @@ Template.cardDetailsActionsPopup.events({
|
||||
'click .js-move-card': Popup.open('moveCard'),
|
||||
'click .js-copy-card': Popup.open('copyCard'),
|
||||
'click .js-convert-checklist-item-to-card': Popup.open('convertChecklistItemToCard'),
|
||||
'click .js-copy-checklist-cards': Popup.open('copyChecklistToManyCards'),
|
||||
'click .js-copy-checklist-cards': Popup.open('copyManyCards'),
|
||||
'click .js-set-card-color': Popup.open('setCardColor'),
|
||||
'click .js-move-card-to-top'(event) {
|
||||
event.preventDefault();
|
||||
const minOrder = _.min(
|
||||
this.list()
|
||||
.cardsUnfiltered(this.swimlaneId)
|
||||
.map((c) => c.sort),
|
||||
);
|
||||
const minOrder = this.getMinSort();
|
||||
this.move(this.boardId, this.swimlaneId, this.listId, minOrder - 1);
|
||||
Popup.back();
|
||||
},
|
||||
'click .js-move-card-to-bottom'(event) {
|
||||
event.preventDefault();
|
||||
const maxOrder = _.max(
|
||||
this.list()
|
||||
.cardsUnfiltered(this.swimlaneId)
|
||||
.map((c) => c.sort),
|
||||
);
|
||||
const maxOrder = this.getMaxSort();
|
||||
this.move(this.boardId, this.swimlaneId, this.listId, maxOrder + 1);
|
||||
Popup.back();
|
||||
},
|
||||
@@ -782,8 +794,8 @@ const filterMembers = (filterTerm) => {
|
||||
user: Users.findOne(member.userId)
|
||||
}))
|
||||
.filter(({ user }) =>
|
||||
(user.profile.fullname !== undefined && user.profile.fullname.toLowerCase().indexOf(filterTerm.toLowerCase()) !== -1)
|
||||
|| user.profile.fullname === undefined && user.profile.username !== undefined && user.profile.username.toLowerCase().indexOf(filterTerm.toLowerCase()) !== -1)
|
||||
(user.profile.fullname !== undefined && user.profile.fullname.toLowerCase().indexOf(filterTerm.toLowerCase()) !== -1)
|
||||
|| user.profile.fullname === undefined && user.profile.username !== undefined && user.profile.username.toLowerCase().indexOf(filterTerm.toLowerCase()) !== -1)
|
||||
.map(({ member }) => member);
|
||||
}
|
||||
return members;
|
||||
@@ -815,178 +827,58 @@ Template.editCardAssignerForm.events({
|
||||
},
|
||||
});
|
||||
|
||||
Template.moveCardPopup.events({
|
||||
'click .js-done'() {
|
||||
const card = Cards.findOne(this._id);
|
||||
const bSelect = $('.js-select-boards')[0];
|
||||
let boardId;
|
||||
// if we are a worker, we won't have a board select so we just use the
|
||||
// current boardId of the card.
|
||||
if (bSelect) {
|
||||
boardId = bSelect.options[bSelect.selectedIndex].value;
|
||||
} else {
|
||||
boardId = card.boardId;
|
||||
}
|
||||
const lSelect = $('.js-select-lists')[0];
|
||||
const listId = lSelect.options[lSelect.selectedIndex].value;
|
||||
const slSelect = $('.js-select-swimlanes')[0];
|
||||
const swimlaneId = slSelect.options[slSelect.selectedIndex].value;
|
||||
card.move(boardId, swimlaneId, listId, 0);
|
||||
|
||||
// set new id's to card object in case the card is moved to top by the comment "moveCard" after this command (.js-move-card)
|
||||
this.boardId = boardId;
|
||||
this.swimlaneId = swimlaneId;
|
||||
this.listId = listId;
|
||||
|
||||
Popup.back();
|
||||
},
|
||||
});
|
||||
BlazeComponent.extendComponent({
|
||||
onCreated() {
|
||||
this.currentBoardId = Utils.getCurrentBoardId();
|
||||
this.selectedBoardId = new ReactiveVar(this.currentBoardId);
|
||||
this.setMoveAndCopyDialogOption(this.currentBoardId);
|
||||
},
|
||||
|
||||
/** set the last confirmed dialog field values
|
||||
* @param boardId the current board id
|
||||
*/
|
||||
setMoveAndCopyDialogOption(boardId) {
|
||||
this.moveAndCopyDialogOption = {
|
||||
'boardId' : "",
|
||||
'swimlaneId' : "",
|
||||
'listId' : "",
|
||||
}
|
||||
|
||||
let currentOptions = Meteor.user().getMoveAndCopyDialogOptions();
|
||||
if (currentOptions && boardId && currentOptions[boardId]) {
|
||||
this.moveAndCopyDialogOption = currentOptions[boardId];
|
||||
if (this.moveAndCopyDialogOption.boardId) {
|
||||
this.selectedBoardId.set(this.moveAndCopyDialogOption.boardId)
|
||||
}
|
||||
}
|
||||
subManager.subscribe('board', this.selectedBoardId.get(), false);
|
||||
},
|
||||
|
||||
/** returns if the board id was the last confirmed one
|
||||
* @param boardId check this board id
|
||||
* @return if the board id was the last confirmed one
|
||||
*/
|
||||
isMoveAndCopyDialogOptionBoardId(boardId) {
|
||||
let ret = this.moveAndCopyDialogOption.boardId == boardId;
|
||||
/** Move Card Dialog */
|
||||
(class extends DialogWithBoardSwimlaneList {
|
||||
getDialogOptions() {
|
||||
const ret = Meteor.user().getMoveAndCopyDialogOptions();
|
||||
return ret;
|
||||
},
|
||||
}
|
||||
setDone(boardId, swimlaneId, listId, options) {
|
||||
Meteor.user().setMoveAndCopyDialogOption(this.currentBoardId, options);
|
||||
const card = this.data();
|
||||
const minOrder = card.getMinSort(listId, swimlaneId);
|
||||
card.move(boardId, swimlaneId, listId, minOrder - 1);
|
||||
}
|
||||
}).register('moveCardPopup');
|
||||
|
||||
/** returns if the swimlane id was the last confirmed one
|
||||
* @param swimlaneId check this swimlane id
|
||||
* @return if the swimlane id was the last confirmed one
|
||||
*/
|
||||
isMoveAndCopyDialogOptionSwimlaneId(swimlaneId) {
|
||||
let ret = this.moveAndCopyDialogOption.swimlaneId == swimlaneId;
|
||||
/** Copy Card Dialog */
|
||||
(class extends DialogWithBoardSwimlaneList {
|
||||
getDialogOptions() {
|
||||
const ret = Meteor.user().getMoveAndCopyDialogOptions();
|
||||
return ret;
|
||||
},
|
||||
}
|
||||
setDone(boardId, swimlaneId, listId, options) {
|
||||
Meteor.user().setMoveAndCopyDialogOption(this.currentBoardId, options);
|
||||
const card = this.data();
|
||||
|
||||
/** returns if the list id was the last confirmed one
|
||||
* @param listId check this list id
|
||||
* @return if the list id was the last confirmed one
|
||||
*/
|
||||
isMoveAndCopyDialogOptionListId(listId) {
|
||||
let ret = this.moveAndCopyDialogOption.listId == listId;
|
||||
return ret;
|
||||
},
|
||||
|
||||
boards() {
|
||||
return Boards.find(
|
||||
{
|
||||
archived: false,
|
||||
'members.userId': Meteor.userId(),
|
||||
_id: { $ne: Meteor.user().getTemplatesBoardId() },
|
||||
},
|
||||
{
|
||||
sort: { sort: 1 /* boards default sorting */ },
|
||||
},
|
||||
);
|
||||
},
|
||||
|
||||
swimlanes() {
|
||||
const board = Boards.findOne(this.selectedBoardId.get());
|
||||
return board.swimlanes();
|
||||
},
|
||||
|
||||
aBoardLists() {
|
||||
const board = Boards.findOne(this.selectedBoardId.get());
|
||||
return board.lists();
|
||||
},
|
||||
|
||||
events() {
|
||||
return [
|
||||
{
|
||||
'click .js-done'() {
|
||||
const boardSelect = this.$('.js-select-boards')[0];
|
||||
const boardId = boardSelect.options[boardSelect.selectedIndex].value;
|
||||
|
||||
const listSelect = this.$('.js-select-lists')[0];
|
||||
const listId = listSelect.options[listSelect.selectedIndex].value;
|
||||
|
||||
const swimlaneSelect = this.$('.js-select-swimlanes')[0];
|
||||
const swimlaneId = swimlaneSelect.options[swimlaneSelect.selectedIndex].value;
|
||||
|
||||
const options = {
|
||||
'boardId' : boardId,
|
||||
'swimlaneId' : swimlaneId,
|
||||
'listId' : listId,
|
||||
}
|
||||
Meteor.user().setMoveAndCopyDialogOption(this.currentBoardId, options);
|
||||
},
|
||||
'change .js-select-boards'(event) {
|
||||
const boardId = $(event.currentTarget).val();
|
||||
this.selectedBoardId.set(boardId);
|
||||
subManager.subscribe('board', boardId, false);
|
||||
},
|
||||
},
|
||||
];
|
||||
},
|
||||
}).register('boardsAndLists');
|
||||
|
||||
Template.copyCardPopup.events({
|
||||
'click .js-done'() {
|
||||
const card = Utils.getCurrentCard();
|
||||
const lSelect = $('.js-select-lists')[0];
|
||||
const listId = lSelect.options[lSelect.selectedIndex].value;
|
||||
const slSelect = $('.js-select-swimlanes')[0];
|
||||
const swimlaneId = slSelect.options[slSelect.selectedIndex].value;
|
||||
const bSelect = $('.js-select-boards')[0];
|
||||
const boardId = bSelect.options[bSelect.selectedIndex].value;
|
||||
const textarea = $('#copy-card-title');
|
||||
// const textarea = $('#copy-card-title');
|
||||
const textarea = this.$('#copy-card-title');
|
||||
const title = textarea.val().trim();
|
||||
// insert new card to the bottom of new list
|
||||
card.sort = Lists.findOne(card.listId).cards().count();
|
||||
|
||||
if (title) {
|
||||
card.title = title;
|
||||
card.coverId = '';
|
||||
const _id = card.copy(boardId, swimlaneId, listId);
|
||||
// insert new card to the top of new list
|
||||
const newCardId = Meteor.call('copyCard', card._id, boardId, swimlaneId, listId, true, {title: title});
|
||||
|
||||
// In case the filter is active we need to add the newly inserted card in
|
||||
// the list of exceptions -- cards that are not filtered. Otherwise the
|
||||
// card will disappear instantly.
|
||||
// See https://github.com/wekan/wekan/issues/80
|
||||
Filter.addException(_id);
|
||||
|
||||
Popup.back();
|
||||
Filter.addException(newCardId);
|
||||
}
|
||||
},
|
||||
});
|
||||
}
|
||||
}).register('copyCardPopup');
|
||||
|
||||
Template.convertChecklistItemToCardPopup.events({
|
||||
'click .js-done'() {
|
||||
const card = Utils.getCurrentCard();
|
||||
const lSelect = $('.js-select-lists')[0];
|
||||
const listId = lSelect.options[lSelect.selectedIndex].value;
|
||||
const slSelect = $('.js-select-swimlanes')[0];
|
||||
const swimlaneId = slSelect.options[slSelect.selectedIndex].value;
|
||||
const bSelect = $('.js-select-boards')[0];
|
||||
const boardId = bSelect.options[bSelect.selectedIndex].value;
|
||||
const textarea = $('#copy-card-title');
|
||||
/** Convert Checklist-Item to card dialog */
|
||||
(class extends DialogWithBoardSwimlaneList {
|
||||
getDialogOptions() {
|
||||
const ret = Meteor.user().getMoveAndCopyDialogOptions();
|
||||
return ret;
|
||||
}
|
||||
setDone(boardId, swimlaneId, listId, options) {
|
||||
Meteor.user().setMoveAndCopyDialogOption(this.currentBoardId, options);
|
||||
const card = this.data();
|
||||
|
||||
const textarea = this.$('#copy-card-title');
|
||||
const title = textarea.val().trim();
|
||||
|
||||
if (title) {
|
||||
@@ -997,68 +889,42 @@ Template.convertChecklistItemToCardPopup.events({
|
||||
swimlaneId: swimlaneId,
|
||||
sort: 0,
|
||||
});
|
||||
const card = Cards.findOne(_id);
|
||||
const minOrder = card.getMinSort();
|
||||
card.move(card.boardId, card.swimlaneId, card.listId, minOrder - 1);
|
||||
|
||||
Filter.addException(_id);
|
||||
|
||||
Popup.back();
|
||||
|
||||
}
|
||||
},
|
||||
});
|
||||
}
|
||||
}).register('convertChecklistItemToCardPopup');
|
||||
|
||||
Template.copyChecklistToManyCardsPopup.events({
|
||||
'click .js-done'() {
|
||||
const card = Utils.getCurrentCard();
|
||||
const oldId = card._id;
|
||||
card._id = null;
|
||||
const lSelect = $('.js-select-lists')[0];
|
||||
card.listId = lSelect.options[lSelect.selectedIndex].value;
|
||||
const slSelect = $('.js-select-swimlanes')[0];
|
||||
card.swimlaneId = slSelect.options[slSelect.selectedIndex].value;
|
||||
const bSelect = $('.js-select-boards')[0];
|
||||
card.boardId = bSelect.options[bSelect.selectedIndex].value;
|
||||
const textarea = $('#copy-card-title');
|
||||
const titleEntry = textarea.val().trim();
|
||||
// insert new card to the bottom of new list
|
||||
card.sort = Lists.findOne(card.listId).cards().count();
|
||||
/** Copy many cards dialog */
|
||||
(class extends DialogWithBoardSwimlaneList {
|
||||
getDialogOptions() {
|
||||
const ret = Meteor.user().getMoveAndCopyDialogOptions();
|
||||
return ret;
|
||||
}
|
||||
setDone(boardId, swimlaneId, listId, options) {
|
||||
Meteor.user().setMoveAndCopyDialogOption(this.currentBoardId, options);
|
||||
const card = this.data();
|
||||
|
||||
const textarea = this.$('#copy-card-title');
|
||||
const title = textarea.val().trim();
|
||||
|
||||
if (title) {
|
||||
const titleList = JSON.parse(title);
|
||||
for (const obj of titleList) {
|
||||
const newCardId = Meteor.call('copyCard', card._id, boardId, swimlaneId, listId, false, {title: obj.title, description: obj.description});
|
||||
|
||||
if (titleEntry) {
|
||||
const titleList = JSON.parse(titleEntry);
|
||||
for (let i = 0; i < titleList.length; i++) {
|
||||
const obj = titleList[i];
|
||||
card.title = obj.title;
|
||||
card.description = obj.description;
|
||||
card.coverId = '';
|
||||
const _id = Cards.insert(card);
|
||||
// In case the filter is active we need to add the newly inserted card in
|
||||
// the list of exceptions -- cards that are not filtered. Otherwise the
|
||||
// card will disappear instantly.
|
||||
// See https://github.com/wekan/wekan/issues/80
|
||||
Filter.addException(_id);
|
||||
|
||||
// copy checklists
|
||||
Checklists.find({ cardId: oldId }).forEach((ch) => {
|
||||
ch.copy(_id);
|
||||
});
|
||||
|
||||
// copy subtasks
|
||||
const cursor = Cards.find({ parentId: oldId });
|
||||
cursor.forEach(function () {
|
||||
'use strict';
|
||||
const subtask = arguments[0];
|
||||
subtask.parentId = _id;
|
||||
subtask._id = null;
|
||||
/* const newSubtaskId = */ Cards.insert(subtask);
|
||||
});
|
||||
|
||||
// copy card comments
|
||||
CardComments.find({ cardId: oldId }).forEach((cmt) => {
|
||||
cmt.copy(_id);
|
||||
});
|
||||
Filter.addException(newCardId);
|
||||
}
|
||||
Popup.back();
|
||||
}
|
||||
},
|
||||
});
|
||||
}
|
||||
}).register('copyManyCardsPopup');
|
||||
|
||||
BlazeComponent.extendComponent({
|
||||
onCreated() {
|
||||
@@ -1711,10 +1577,29 @@ BlazeComponent.extendComponent({
|
||||
EscapeActions.register(
|
||||
'detailsPane',
|
||||
() => {
|
||||
// if card description diverges from database due to editing
|
||||
// ask user whether changes should be applied
|
||||
if (Meteor.user()) {
|
||||
if (Meteor.user().profile.rescueCardDescription == true) {
|
||||
currentDescription = document.getElementsByClassName("editor js-new-description-input").item(0)
|
||||
if (currentDescription?.value && !(currentDescription.value === Utils.getCurrentCard().getDescription())) {
|
||||
if (confirm(TAPi18n.__('rescue-card-description-dialogue'))) {
|
||||
Utils.getCurrentCard().setDescription(document.getElementsByClassName("editor js-new-description-input").item(0).value);
|
||||
// Save it!
|
||||
console.log(document.getElementsByClassName("editor js-new-description-input").item(0).value);
|
||||
console.log("current description", Utils.getCurrentCard().getDescription());
|
||||
} else {
|
||||
// Do nothing!
|
||||
console.log('Description changes were not saved to the database.');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (Session.get('cardDetailsIsDragging')) {
|
||||
// Reset dragging status as the mouse landed outside the cardDetails template area and this will prevent a mousedown event from firing
|
||||
Session.set('cardDetailsIsDragging', false);
|
||||
Session.set('cardDetailsIsMouseDown', false);
|
||||
|
||||
} else {
|
||||
// Prevent close card when the user is selecting text and moves the mouse cursor outside the card detail area
|
||||
Utils.goBoardId(Session.get('currentBoard'));
|
||||
@@ -1777,13 +1662,7 @@ Template.cardAssigneesPopup.helpers({
|
||||
|
||||
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, {
|
||||
return Users.findOne(this.userId, {
|
||||
fields: {
|
||||
profile: 1,
|
||||
username: 1,
|
||||
@@ -1796,17 +1675,17 @@ Template.cardAssigneePopup.helpers({
|
||||
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';
|
||||
},
|
||||
*/
|
||||
/*
|
||||
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();
|
||||
|
||||
@@ -34,13 +34,13 @@ template(name="checklistDetail")
|
||||
a.fa.fa-navicon.checklist-details-menu.js-open-checklist-details-menu(title="{{_ 'checklistActionsPopup-title'}}")
|
||||
|
||||
if canModifyCard
|
||||
h2.title.js-open-inlined-form.is-editable
|
||||
if isMiniScreenOrShowDesktopDragHandles
|
||||
h4.title.js-open-inlined-form.is-editable
|
||||
if isTouchScreenOrShowDesktopDragHandles
|
||||
span.fa.checklist-handle(class="fa-arrows" title="{{_ 'dragChecklist'}}")
|
||||
+viewer
|
||||
= checklist.title
|
||||
else
|
||||
h2.title
|
||||
h4.title
|
||||
+viewer
|
||||
= checklist.title
|
||||
|
||||
@@ -100,11 +100,12 @@ template(name="checklistItems")
|
||||
i.fa.fa-plus
|
||||
|
||||
template(name='checklistItemDetail')
|
||||
.js-checklist-item.checklist-item(class="{{#if item.isFinished }}is-checked{{#if hideCheckedItems}} invisible{{/if}}{{/if}}")
|
||||
.js-checklist-item.checklist-item(class="{{#if item.isFinished }}is-checked{{#if hideCheckedItems}} invisible{{/if}}{{/if}}"
|
||||
role="checkbox" aria-checked="{{#if item.isFinished }}true{{else}}false{{/if}}" tabindex="0")
|
||||
if canModifyCard
|
||||
.check-box-container
|
||||
.check-box.materialCheckBox(class="{{#if item.isFinished }}is-checked{{/if}}")
|
||||
if isMiniScreenOrShowDesktopDragHandles
|
||||
if isTouchScreenOrShowDesktopDragHandles
|
||||
span.fa.checklistitem-handle(class="fa-arrows" title="{{_ 'dragChecklistItem'}}")
|
||||
.item-title.js-open-inlined-form.is-editable(class="{{#if item.isFinished }}is-checked{{/if}}")
|
||||
+viewer
|
||||
@@ -115,35 +116,6 @@ template(name='checklistItemDetail')
|
||||
+viewer
|
||||
= item.title
|
||||
|
||||
template(name="convertChecklistItemToCardPopup")
|
||||
label(for='convert-checklist-item-to-card-title') {{_ 'title'}}:
|
||||
textarea#copy-card-title.minicard-composer-textarea.js-card-title(autofocus)
|
||||
= item.title
|
||||
+boardsSwimlanesAndLists
|
||||
|
||||
template(name="boardsSwimlanesAndLists")
|
||||
unless currentUser.isWorker
|
||||
label {{_ 'boards'}}:
|
||||
select.js-select-boards(autofocus)
|
||||
each boards
|
||||
if $eq _id currentBoard._id
|
||||
option(value="{{_id}}" selected) {{_ 'current'}}
|
||||
else
|
||||
option(value="{{_id}}") {{title}}
|
||||
|
||||
label {{_ 'swimlanes'}}:
|
||||
select.js-select-swimlanes
|
||||
each swimlanes
|
||||
option(value="{{_id}}") {{title}}
|
||||
|
||||
label {{_ 'lists'}}:
|
||||
select.js-select-lists
|
||||
each aBoardLists
|
||||
option(value="{{_id}}") {{title}}
|
||||
|
||||
.edit-controls.clearfix
|
||||
button.primary.confirm.js-done {{_ 'done'}}
|
||||
|
||||
template(name="checklistActionsPopup")
|
||||
ul.pop-over-list
|
||||
li
|
||||
@@ -171,22 +143,22 @@ template(name="copyAndMoveChecklist")
|
||||
if $eq _id currentBoard._id
|
||||
option(value="{{_id}}" selected) {{_ 'current'}}
|
||||
else
|
||||
option(value="{{_id}}" selected="{{#if isChecklistDialogOptionBoardId _id}}selected{{/if}}") {{title}}
|
||||
option(value="{{_id}}" selected="{{#if isDialogOptionBoardId _id}}selected{{/if}}") {{title}}
|
||||
|
||||
label {{_ 'swimlanes'}}:
|
||||
select.js-select-swimlanes
|
||||
each swimlanes
|
||||
option(value="{{_id}}" selected="{{#if isChecklistDialogOptionSwimlaneId _id}}selected{{/if}}") {{title}}
|
||||
option(value="{{_id}}" selected="{{#if isDialogOptionSwimlaneId _id}}selected{{/if}}") {{title}}
|
||||
|
||||
label {{_ 'lists'}}:
|
||||
select.js-select-lists
|
||||
each lists
|
||||
option(value="{{_id}}" selected="{{#if isChecklistDialogOptionListId _id}}selected{{/if}}") {{title}}
|
||||
option(value="{{_id}}" selected="{{#if isDialogOptionListId _id}}selected{{/if}}") {{title}}
|
||||
|
||||
label {{_ 'cards'}}:
|
||||
select.js-select-cards
|
||||
each cards
|
||||
option(value="{{_id}}" selected="{{#if isChecklistDialogOptionCardId _id}}selected{{/if}}") {{title}}
|
||||
option(value="{{_id}}" selected="{{#if isDialogOptionCardId _id}}selected{{/if}}") {{title}}
|
||||
|
||||
.edit-controls.clearfix
|
||||
button.primary.confirm.js-done {{_ 'done'}}
|
||||
@@ -1,6 +1,7 @@
|
||||
import { TAPi18n } from '/imports/i18n';
|
||||
import Cards from '/models/cards';
|
||||
import Boards from '/models/boards';
|
||||
import { DialogWithBoardSwimlaneListCard } from '/client/lib/dialogWithBoardSwimlaneListCard';
|
||||
|
||||
const subManager = new SubsManager();
|
||||
const { calculateIndexData, capitalize } = Utils;
|
||||
@@ -48,7 +49,7 @@ BlazeComponent.extendComponent({
|
||||
const self = this;
|
||||
self.itemsDom = this.$('.js-checklist-items');
|
||||
initSorting(self.itemsDom);
|
||||
self.itemsDom.mousedown(function(evt) {
|
||||
self.itemsDom.mousedown(function (evt) {
|
||||
evt.stopPropagation();
|
||||
});
|
||||
|
||||
@@ -61,7 +62,7 @@ BlazeComponent.extendComponent({
|
||||
const $itemsDom = $(self.itemsDom);
|
||||
if ($itemsDom.data('uiSortable') || $itemsDom.data('sortable')) {
|
||||
$(self.itemsDom).sortable('option', 'disabled', !userIsMember());
|
||||
if (Utils.isMiniScreenOrShowDesktopDragHandles()) {
|
||||
if (Utils.isTouchScreenOrShowDesktopDragHandles()) {
|
||||
$(self.itemsDom).sortable({
|
||||
handle: 'span.fa.checklistitem-handle',
|
||||
});
|
||||
@@ -306,15 +307,15 @@ BlazeComponent.extendComponent({
|
||||
events() {
|
||||
return [
|
||||
{
|
||||
'click .js-delete-checklist' : Popup.afterConfirm('checklistDelete', function () {
|
||||
'click .js-delete-checklist': Popup.afterConfirm('checklistDelete', function () {
|
||||
Popup.back(2);
|
||||
const checklist = this.checklist;
|
||||
if (checklist && checklist._id) {
|
||||
Checklists.remove(checklist._id);
|
||||
}
|
||||
}),
|
||||
'click .js-move-checklist' : Popup.open('moveChecklist'),
|
||||
'click .js-copy-checklist' : Popup.open('copyChecklist'),
|
||||
'click .js-move-checklist': Popup.open('moveChecklist'),
|
||||
'click .js-copy-checklist': Popup.open('copyChecklist'),
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -380,213 +381,9 @@ BlazeComponent.extendComponent({
|
||||
},
|
||||
}).register('checklistItemDetail');
|
||||
|
||||
class DialogWithBoardSwimlaneListAndCard extends BlazeComponent {
|
||||
/** returns the checklist dialog options
|
||||
* @return Object with properties { boardId, swimlaneId, listId, cardId }
|
||||
*/
|
||||
getChecklistDialogOptions() {
|
||||
}
|
||||
|
||||
/** checklist is done
|
||||
* @param cardId the selected card id
|
||||
* @param options the selected options (Object with properties { boardId, swimlaneId, listId, cardId })
|
||||
*/
|
||||
setDone(cardId, options) {
|
||||
}
|
||||
|
||||
onCreated() {
|
||||
this.currentBoardId = Utils.getCurrentBoardId();
|
||||
this.selectedBoardId = new ReactiveVar(this.currentBoardId);
|
||||
this.selectedSwimlaneId = new ReactiveVar('');
|
||||
this.selectedListId = new ReactiveVar('');
|
||||
this.setChecklistDialogOption(this.currentBoardId);
|
||||
}
|
||||
|
||||
/** set the last confirmed dialog field values
|
||||
* @param boardId the current board id
|
||||
*/
|
||||
setChecklistDialogOption(boardId) {
|
||||
this.checklistDialogOption = {
|
||||
'boardId' : "",
|
||||
'swimlaneId' : "",
|
||||
'listId' : "",
|
||||
'cardId': "",
|
||||
}
|
||||
|
||||
let currentOptions = this.getChecklistDialogOptions();
|
||||
if (currentOptions && boardId && currentOptions[boardId]) {
|
||||
this.checklistDialogOption = currentOptions[boardId];
|
||||
if (this.checklistDialogOption.boardId &&
|
||||
this.checklistDialogOption.swimlaneId &&
|
||||
this.checklistDialogOption.listId
|
||||
)
|
||||
{
|
||||
this.selectedBoardId.set(this.checklistDialogOption.boardId)
|
||||
this.selectedSwimlaneId.set(this.checklistDialogOption.swimlaneId);
|
||||
this.selectedListId.set(this.checklistDialogOption.listId);
|
||||
}
|
||||
}
|
||||
this.getBoardData(this.selectedBoardId.get());
|
||||
if (!this.selectedSwimlaneId.get() || !Swimlanes.findOne({_id: this.selectedSwimlaneId.get(), boardId: this.selectedBoardId.get()})) {
|
||||
this.setFirstSwimlaneId();
|
||||
}
|
||||
if (!this.selectedListId.get() || !Lists.findOne({_id: this.selectedListId.get(), boardId: this.selectedBoardId.get()})) {
|
||||
this.setFirstListId();
|
||||
}
|
||||
}
|
||||
/** sets the first swimlane id */
|
||||
setFirstSwimlaneId() {
|
||||
try {
|
||||
const board = Boards.findOne(this.selectedBoardId.get());
|
||||
const swimlaneId = board.swimlanes().fetch()[0]._id;
|
||||
this.selectedSwimlaneId.set(swimlaneId);
|
||||
} catch (e) {}
|
||||
}
|
||||
/** sets the first list id */
|
||||
setFirstListId() {
|
||||
try {
|
||||
const board = Boards.findOne(this.selectedBoardId.get());
|
||||
const listId = board.lists().fetch()[0]._id;
|
||||
this.selectedListId.set(listId);
|
||||
} catch (e) {}
|
||||
}
|
||||
|
||||
/** returns if the board id was the last confirmed one
|
||||
* @param boardId check this board id
|
||||
* @return if the board id was the last confirmed one
|
||||
*/
|
||||
isChecklistDialogOptionBoardId(boardId) {
|
||||
let ret = this.checklistDialogOption.boardId == boardId;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** returns if the swimlane id was the last confirmed one
|
||||
* @param swimlaneId check this swimlane id
|
||||
* @return if the swimlane id was the last confirmed one
|
||||
*/
|
||||
isChecklistDialogOptionSwimlaneId(swimlaneId) {
|
||||
let ret = this.checklistDialogOption.swimlaneId == swimlaneId;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** returns if the list id was the last confirmed one
|
||||
* @param listId check this list id
|
||||
* @return if the list id was the last confirmed one
|
||||
*/
|
||||
isChecklistDialogOptionListId(listId) {
|
||||
let ret = this.checklistDialogOption.listId == listId;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** returns if the card id was the last confirmed one
|
||||
* @param cardId check this card id
|
||||
* @return if the card id was the last confirmed one
|
||||
*/
|
||||
isChecklistDialogOptionCardId(cardId) {
|
||||
let ret = this.checklistDialogOption.cardId == cardId;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** returns all available board */
|
||||
boards() {
|
||||
const ret = Boards.find(
|
||||
{
|
||||
archived: false,
|
||||
'members.userId': Meteor.userId(),
|
||||
_id: { $ne: Meteor.user().getTemplatesBoardId() },
|
||||
},
|
||||
{
|
||||
sort: { sort: 1 },
|
||||
},
|
||||
);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** returns all available swimlanes of the current board */
|
||||
swimlanes() {
|
||||
const board = Boards.findOne(this.selectedBoardId.get());
|
||||
const ret = board.swimlanes();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** returns all available lists of the current board */
|
||||
lists() {
|
||||
const board = Boards.findOne(this.selectedBoardId.get());
|
||||
const ret = board.lists();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** returns all available cards of the current list */
|
||||
cards() {
|
||||
const list = Lists.findOne(this.selectedListId.get());
|
||||
const ret = list.cards(this.selectedSwimlaneId.get());
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** get the board data from the server
|
||||
* @param boardId get the board data of this board id
|
||||
*/
|
||||
getBoardData(boardId) {
|
||||
const self = this;
|
||||
Meteor.subscribe('board', boardId, false, {
|
||||
onReady() {
|
||||
const sameBoardId = self.selectedBoardId.get() == boardId;
|
||||
self.selectedBoardId.set(boardId);
|
||||
|
||||
if (!sameBoardId) {
|
||||
// reset swimlane id (for selection in cards())
|
||||
self.setFirstSwimlaneId();
|
||||
|
||||
// reset list id (for selection in cards())
|
||||
self.setFirstListId();
|
||||
}
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
events() {
|
||||
return [
|
||||
{
|
||||
'click .js-done'() {
|
||||
const boardSelect = this.$('.js-select-boards')[0];
|
||||
const boardId = boardSelect.options[boardSelect.selectedIndex].value;
|
||||
|
||||
const listSelect = this.$('.js-select-lists')[0];
|
||||
const listId = listSelect.options[listSelect.selectedIndex].value;
|
||||
|
||||
const swimlaneSelect = this.$('.js-select-swimlanes')[0];
|
||||
const swimlaneId = swimlaneSelect.options[swimlaneSelect.selectedIndex].value;
|
||||
|
||||
const cardSelect = this.$('.js-select-cards')[0];
|
||||
const cardId = cardSelect.options[cardSelect.selectedIndex].value;
|
||||
|
||||
const options = {
|
||||
'boardId' : boardId,
|
||||
'swimlaneId' : swimlaneId,
|
||||
'listId' : listId,
|
||||
'cardId': cardId,
|
||||
}
|
||||
this.setDone(cardId, options);
|
||||
Popup.back(2);
|
||||
},
|
||||
'change .js-select-boards'(event) {
|
||||
const boardId = $(event.currentTarget).val();
|
||||
this.getBoardData(boardId);
|
||||
},
|
||||
'change .js-select-swimlanes'(event) {
|
||||
this.selectedSwimlaneId.set($(event.currentTarget).val());
|
||||
},
|
||||
'change .js-select-lists'(event) {
|
||||
this.selectedListId.set($(event.currentTarget).val());
|
||||
},
|
||||
},
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
/** Move Checklist Dialog */
|
||||
(class extends DialogWithBoardSwimlaneListAndCard {
|
||||
getChecklistDialogOptions() {
|
||||
(class extends DialogWithBoardSwimlaneListCard {
|
||||
getDialogOptions() {
|
||||
const ret = Meteor.user().getMoveChecklistDialogOptions();
|
||||
return ret;
|
||||
}
|
||||
@@ -597,8 +394,8 @@ class DialogWithBoardSwimlaneListAndCard extends BlazeComponent {
|
||||
}).register('moveChecklistPopup');
|
||||
|
||||
/** Copy Checklist Dialog */
|
||||
(class extends DialogWithBoardSwimlaneListAndCard {
|
||||
getChecklistDialogOptions() {
|
||||
(class extends DialogWithBoardSwimlaneListCard {
|
||||
getDialogOptions() {
|
||||
const ret = Meteor.user().getCopyChecklistDialogOptions();
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -29,7 +29,7 @@ template(name="cardLabelsPopup")
|
||||
each board.labels
|
||||
li.js-card-label-item
|
||||
a.card-label-edit-button.fa.fa-pencil.js-edit-label
|
||||
if isMiniScreenOrShowDesktopDragHandles
|
||||
if isTouchScreenOrShowDesktopDragHandles
|
||||
span.fa.label-handle(class="fa-arrows" title="{{_ 'dragLabel'}}")
|
||||
span.card-label.card-label-selectable.js-select-label.card-label-wrapper(class="card-label-{{color}}"
|
||||
class="{{# if isLabelSelected ../_id }}active{{/if}}")
|
||||
|
||||
@@ -50,8 +50,7 @@ BlazeComponent.extendComponent({
|
||||
appendTo: '.edit-labels-pop-over',
|
||||
helper(element, currentItem) {
|
||||
let ret = currentItem.clone();
|
||||
if (currentItem.closest('.popup-container-depth-0').size() == 0)
|
||||
{ // only set css transform at every sub-popup, not at the main popup
|
||||
if (currentItem.closest('.popup-container-depth-0').size() == 0) { // only set css transform at every sub-popup, not at the main popup
|
||||
const content = currentItem.closest('.content')[0]
|
||||
const offsetLeft = content.offsetLeft;
|
||||
const offsetTop = $('.pop-over > .header').height() * -1;
|
||||
@@ -76,7 +75,7 @@ BlazeComponent.extendComponent({
|
||||
|
||||
// Disable drag-dropping if the current user is not a board member or is comment only
|
||||
this.autorun(() => {
|
||||
if (Utils.isMiniScreenOrShowDesktopDragHandles()) {
|
||||
if (Utils.isTouchScreenOrShowDesktopDragHandles()) {
|
||||
$labels.sortable({
|
||||
handle: '.label-handle',
|
||||
});
|
||||
@@ -130,7 +129,7 @@ Template.createLabelPopup.events({
|
||||
});
|
||||
|
||||
Template.editLabelPopup.events({
|
||||
'click .js-delete-label': Popup.afterConfirm('deleteLabel', function() {
|
||||
'click .js-delete-label': Popup.afterConfirm('deleteLabel', function () {
|
||||
const board = Boards.findOne(Session.get('currentBoard'));
|
||||
board.removeLabel(this._id);
|
||||
Popup.back(2);
|
||||
|
||||
@@ -3,7 +3,7 @@ template(name="minicard")
|
||||
class="{{#if isLinkedCard}}linked-card{{/if}}"
|
||||
class="{{#if isLinkedBoard}}linked-board{{/if}}"
|
||||
class="{{#if colorClass}}minicard-{{colorClass}}{{/if}}")
|
||||
if isMiniScreenOrShowDesktopDragHandles
|
||||
if isTouchScreenOrShowDesktopDragHandles
|
||||
.handle
|
||||
.fa.fa-arrows
|
||||
if cover
|
||||
|
||||
@@ -56,17 +56,17 @@ template(name="importMapMembersAddPopup")
|
||||
p
|
||||
| {{_ 'import-user-select'}}
|
||||
.js-map-member
|
||||
+esInput(index="users")
|
||||
+EasySearch.Input(index=searchIndex)
|
||||
ul.pop-over-list
|
||||
+esEach(index="users")
|
||||
+EasySearch.Each(index=searchIndex)
|
||||
li.item.js-member-item
|
||||
a.name.js-select-import(title="{{profile.fullname}} ({{username}})" data-id="{{_id}}")
|
||||
+userAvatar(userId=_id esSearch=true)
|
||||
a.name.js-select-import(title="{{profile.fullname}} ({{username}})" data-id="{{__originalId}}")
|
||||
+userAvatar(userId=__originalId)
|
||||
span.full-name
|
||||
= profile.fullname
|
||||
| (<span class="username">{{username}}</span>)
|
||||
+ifEsIsSearching(index='users')
|
||||
+EasySearch.IfSearching(index=searchIndex)
|
||||
+spinner
|
||||
+ifEsHasNoResults(index="users")
|
||||
+EasySearch.IfNoResults(index=searchIndex)
|
||||
.manage-member-section
|
||||
p.quiet {{_ 'no-results'}}
|
||||
@@ -297,7 +297,7 @@ BlazeComponent.extendComponent({
|
||||
},
|
||||
|
||||
onSelectUser() {
|
||||
Popup.getOpenerComponent().mapSelectedMember(this.currentData()._id);
|
||||
Popup.getOpenerComponent(5).mapSelectedMember(this.currentData().__originalId);
|
||||
Popup.back();
|
||||
},
|
||||
|
||||
@@ -309,3 +309,7 @@ BlazeComponent.extendComponent({
|
||||
];
|
||||
},
|
||||
}).register('importMapMembersAddPopup');
|
||||
|
||||
Template.importMapMembersAddPopup.helpers({
|
||||
searchIndex: () => UserSearchIndex,
|
||||
})
|
||||
@@ -9,6 +9,11 @@
|
||||
float: left;
|
||||
min-width: 270px;
|
||||
max-width: 270px;
|
||||
/* Reverted incomplete change list width: */
|
||||
/* https://github.com/wekan/wekan/issues/4558 */
|
||||
/* Orinal width: 270px. Changes not saved yet: */
|
||||
/*resize: both; - List width and height resizeable */
|
||||
/* overflow: auto; - List width and height resizeable */
|
||||
}
|
||||
.list:first-child {
|
||||
margin-left: 5px;
|
||||
@@ -154,7 +159,7 @@
|
||||
#js-wip-limit-edit div {
|
||||
float: left;
|
||||
}
|
||||
@media screen and (max-width: 800px) {
|
||||
@media screen and (max-width: 250px) {
|
||||
.mini-list {
|
||||
flex: 0 0 60px;
|
||||
height: auto;
|
||||
|
||||
@@ -96,7 +96,7 @@ BlazeComponent.extendComponent({
|
||||
$cards.sortable('cancel');
|
||||
|
||||
if (MultiSelection.isActive()) {
|
||||
Cards.find(MultiSelection.getMongoSelector(), {sort: ['sort']}).forEach((card, i) => {
|
||||
Cards.find(MultiSelection.getMongoSelector(), { sort: ['sort'] }).forEach((card, i) => {
|
||||
const newSwimlaneId = targetSwimlaneId
|
||||
? targetSwimlaneId
|
||||
: card.swimlaneId || defaultSwimlaneId;
|
||||
@@ -119,35 +119,31 @@ BlazeComponent.extendComponent({
|
||||
},
|
||||
sort(event, ui) {
|
||||
const $boardCanvas = $('.board-canvas');
|
||||
const boardCanvas = $boardCanvas[0];
|
||||
const boardCanvas = $boardCanvas[0];
|
||||
|
||||
if (event.pageX < 10)
|
||||
{ // scroll to the left
|
||||
if (event.pageX < 10) { // scroll to the left
|
||||
boardCanvas.scrollLeft -= 15;
|
||||
ui.helper[0].offsetLeft -= 15;
|
||||
}
|
||||
if (
|
||||
event.pageX > boardCanvas.offsetWidth - 10 &&
|
||||
boardCanvas.scrollLeft < $boardCanvas.data('scrollLeftMax') // don't scroll more than possible
|
||||
)
|
||||
{ // scroll to the right
|
||||
) { // scroll to the right
|
||||
boardCanvas.scrollLeft += 15;
|
||||
}
|
||||
if (
|
||||
event.pageY > boardCanvas.offsetHeight - 10 &&
|
||||
event.pageY + boardCanvas.scrollTop < $boardCanvas.data('scrollTopMax') // don't scroll more than possible
|
||||
)
|
||||
{ // scroll to the bottom
|
||||
) { // scroll to the bottom
|
||||
boardCanvas.scrollTop += 15;
|
||||
}
|
||||
if (event.pageY < 10)
|
||||
{ // scroll to the top
|
||||
if (event.pageY < 10) { // scroll to the top
|
||||
boardCanvas.scrollTop -= 15;
|
||||
}
|
||||
},
|
||||
activate(event, ui) {
|
||||
const $boardCanvas = $('.board-canvas');
|
||||
const boardCanvas = $boardCanvas[0];
|
||||
const boardCanvas = $boardCanvas[0];
|
||||
// scrollTopMax and scrollLeftMax only available at Firefox (https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollTopMax)
|
||||
// https://www.it-swarm.com.de/de/javascript/so-erhalten-sie-den-maximalen-dokument-scrolltop-wert/1069126844/
|
||||
$boardCanvas.data('scrollTopMax', boardCanvas.scrollHeight - boardCanvas.clientTop);
|
||||
@@ -157,7 +153,7 @@ BlazeComponent.extendComponent({
|
||||
});
|
||||
|
||||
this.autorun(() => {
|
||||
if (Utils.isMiniScreenOrShowDesktopDragHandles()) {
|
||||
if (Utils.isTouchScreenOrShowDesktopDragHandles()) {
|
||||
$cards.sortable({
|
||||
handle: '.handle',
|
||||
});
|
||||
|
||||
@@ -44,7 +44,7 @@ template(name="listHeader")
|
||||
a.js-add-card.fa.fa-plus.list-header-plus-top(title="{{_ 'add-card-to-top-of-list'}}")
|
||||
a.fa.fa-navicon.js-open-list-menu(title="{{_ 'listActionPopup-title'}}")
|
||||
if currentUser.isBoardAdmin
|
||||
if isShowDesktopDragHandles
|
||||
if isTouchScreenOrShowDesktopDragHandles
|
||||
a.list-header-handle.handle.fa.fa-arrows.js-list-handle
|
||||
|
||||
template(name="editListTitleForm")
|
||||
|
||||
@@ -394,6 +394,9 @@ Template.viewer.events({
|
||||
} else {
|
||||
const href = event.currentTarget.href;
|
||||
if (href) {
|
||||
// Open links in current browser tab, changed from _blank to _self, and back to _blank:
|
||||
// https://github.com/wekan/wekan/discussions/3534
|
||||
//window.open(href, '_self');
|
||||
window.open(href, '_blank');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -178,13 +178,15 @@
|
||||
top: -5px;
|
||||
margin-right: 5px;
|
||||
}
|
||||
#header-quick-access #header-user-bar .header-user-bar-avatar .member {
|
||||
#header-quick-access #header-user-bar .header-user-bar-avatar .member,
|
||||
#header-quick-access #header-help {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
margin: 0;
|
||||
margin-top: 1px;
|
||||
}
|
||||
#header-quick-access #header-user-bar .header-user-bar-name {
|
||||
#header-quick-access #header-user-bar .header-user-bar-name,
|
||||
#header-quick-access #header-help {
|
||||
margin: 4px 8px 0 0;
|
||||
float: left;
|
||||
}
|
||||
|
||||
@@ -67,6 +67,11 @@ template(name="header")
|
||||
|
||||
+notifications
|
||||
|
||||
if currentSetting.customHelpLinkUrl
|
||||
#header-help
|
||||
a(href="{{currentSetting.customHelpLinkUrl}}", title="{{_ 'help'}}", target="_blank", rel="noopener noreferrer")
|
||||
span.fa.fa-question
|
||||
|
||||
+headerUserBar
|
||||
|
||||
#header(class=currentBoard.colorClass)
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
* {
|
||||
-webkit-box-sizing: unset;
|
||||
box-sizing: unset;
|
||||
}
|
||||
/* Fixed missing 'import nib' stylesheet reset and extra li bullet points
|
||||
* https://github.com/wekan/wekan/issues/4512#issuecomment-1129347536
|
||||
* https://github.com/stylus/nib/blob/master/lib/nib/reset.styl
|
||||
*/
|
||||
a, abbr, acronym, address, applet, big, blockquote, body, caption, cite,
|
||||
code, dd, del, dfn, div, dl, dt, em, fieldset, form, h1, h2, h3, h4, h5,
|
||||
@@ -16,51 +19,6 @@ table, tbody, td, tfoot, th, thread, tr, tt, ul, var {
|
||||
font-size: 100%;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
ol, ul {
|
||||
list-style: none;
|
||||
}
|
||||
a img {
|
||||
border: none;
|
||||
}
|
||||
/* reset body */
|
||||
body {
|
||||
line-height: 1;
|
||||
color: black;
|
||||
background: white;
|
||||
}
|
||||
/* reset table cell */
|
||||
table {
|
||||
border-collapse: separate;
|
||||
border-spacing: 0;
|
||||
vertical-align: middle;
|
||||
}
|
||||
caption, td, th {
|
||||
text-align: left;
|
||||
font-weight: normal;
|
||||
vertical-align: middle;
|
||||
}
|
||||
/* reset html5 */
|
||||
article, aside, canvas, details, figcaption,
|
||||
figure, footer, header, hgroup, menu, nav,
|
||||
section, summary, main {
|
||||
display: block;
|
||||
}
|
||||
audio, canvas, video {
|
||||
display: inline-block;
|
||||
*display: inline;
|
||||
*zoom: 1;
|
||||
}
|
||||
audio:not([controls]),[hidden] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* End of reset css */
|
||||
|
||||
|
||||
* {
|
||||
-webkit-box-sizing: unset;
|
||||
box-sizing: unset;
|
||||
}
|
||||
.note-popover .popover-content .note-color-palette div .note-color-btn,
|
||||
.panel-heading.note-toolbar .note-color-palette div .note-color-btn {
|
||||
background: none;
|
||||
|
||||
@@ -16,6 +16,7 @@ head
|
||||
meta(name="application-name" content="Wekan")
|
||||
meta(name="msapplication-TileColor" content="#00aba9")
|
||||
meta(name="theme-color" content="#ffffff")
|
||||
//link(rel="stylesheet" type="text/css" class="__meteor-css__" href="css/html5-default-theme.css")
|
||||
|
||||
template(name="userFormsLayout")
|
||||
section.auth-layout
|
||||
|
||||
@@ -4,7 +4,7 @@ BlazeLayout.setRoot('body');
|
||||
|
||||
let alreadyCheck = 1;
|
||||
let isCheckDone = false;
|
||||
|
||||
let counter = 0;
|
||||
const validator = {
|
||||
set(obj, prop, value) {
|
||||
if (prop === 'state' && value !== 'signIn') {
|
||||
@@ -21,7 +21,7 @@ const validator = {
|
||||
|
||||
// let isSettingDatabaseFctCallDone = false;
|
||||
|
||||
Template.userFormsLayout.onCreated(function() {
|
||||
Template.userFormsLayout.onCreated(function () {
|
||||
const templateInstance = this;
|
||||
templateInstance.currentSetting = new ReactiveVar();
|
||||
templateInstance.isLoading = new ReactiveVar(false);
|
||||
@@ -37,7 +37,7 @@ Template.userFormsLayout.onCreated(function() {
|
||||
}
|
||||
|
||||
// isSettingDatabaseFctCallDone = true;
|
||||
if(currSetting && currSetting !== undefined && currSetting.customLoginLogoImageUrl !== undefined)
|
||||
if (currSetting && currSetting !== undefined && currSetting.customLoginLogoImageUrl !== undefined)
|
||||
document.getElementById("isSettingDatabaseCallDone").style.display = 'none';
|
||||
else
|
||||
document.getElementById("isSettingDatabaseCallDone").style.display = 'block';
|
||||
@@ -50,6 +50,18 @@ Template.userFormsLayout.onCreated(function() {
|
||||
}
|
||||
});
|
||||
|
||||
if (!Meteor.user()?.profile) {
|
||||
Meteor.call('isOidcRedirectionEnabled', (_, result) => {
|
||||
if (result) {
|
||||
AccountsTemplates.options.socialLoginStyle = 'redirect';
|
||||
options = {
|
||||
loginStyle: AccountsTemplates.options.socialLoginStyle,
|
||||
};
|
||||
Meteor.loginWithOidc(options);
|
||||
}
|
||||
else console.log("oidc redirect not set");
|
||||
});
|
||||
}
|
||||
Meteor.call('isDisableRegistration', (_, result) => {
|
||||
if (result) {
|
||||
$('.at-signup-link').hide();
|
||||
@@ -81,22 +93,22 @@ Template.userFormsLayout.helpers({
|
||||
// return isSettingDatabaseFctCallDone;
|
||||
// },
|
||||
|
||||
isLegalNoticeLinkExist(){
|
||||
isLegalNoticeLinkExist() {
|
||||
const currSet = Template.instance().currentSetting.get();
|
||||
if(currSet && currSet !== undefined && currSet != null){
|
||||
if (currSet && currSet !== undefined && currSet != null) {
|
||||
return currSet.legalNotice !== undefined && currSet.legalNotice.trim() != "";
|
||||
}
|
||||
else
|
||||
return false;
|
||||
},
|
||||
|
||||
getLegalNoticeWithWritTraduction(){
|
||||
getLegalNoticeWithWritTraduction() {
|
||||
let spanLegalNoticeElt = $("#legalNoticeSpan");
|
||||
if(spanLegalNoticeElt != null && spanLegalNoticeElt != undefined){
|
||||
if (spanLegalNoticeElt != null && spanLegalNoticeElt != undefined) {
|
||||
spanLegalNoticeElt.html(TAPi18n.__('acceptance_of_our_legalNotice', {}));
|
||||
}
|
||||
let atLinkLegalNoticeElt = $("#legalNoticeAtLink");
|
||||
if(atLinkLegalNoticeElt != null && atLinkLegalNoticeElt != undefined){
|
||||
if (atLinkLegalNoticeElt != null && atLinkLegalNoticeElt != undefined) {
|
||||
atLinkLegalNoticeElt.html(TAPi18n.__('legalNotice', {}));
|
||||
}
|
||||
return true;
|
||||
@@ -147,41 +159,41 @@ Template.userFormsLayout.events({
|
||||
}
|
||||
isCheckDone = false;
|
||||
},
|
||||
'click #at-signUp'(event, templateInstance){
|
||||
'click #at-signUp'(event, templateInstance) {
|
||||
isCheckDone = false;
|
||||
},
|
||||
'DOMSubtreeModified #at-oidc'(event){
|
||||
if(alreadyCheck <= 2){
|
||||
'DOMSubtreeModified #at-oidc'(event) {
|
||||
if (alreadyCheck <= 2) {
|
||||
let currSetting = Settings.findOne();
|
||||
let oidcBtnElt = $("#at-oidc");
|
||||
if(currSetting && currSetting !== undefined && currSetting.oidcBtnText !== undefined && oidcBtnElt != null && oidcBtnElt != undefined){
|
||||
if (currSetting && currSetting !== undefined && currSetting.oidcBtnText !== undefined && oidcBtnElt != null && oidcBtnElt != undefined) {
|
||||
let htmlvalue = "<i class='fa fa-oidc'></i>" + currSetting.oidcBtnText;
|
||||
if(alreadyCheck == 1){
|
||||
if (alreadyCheck == 1) {
|
||||
alreadyCheck++;
|
||||
oidcBtnElt.html("");
|
||||
}
|
||||
else{
|
||||
else {
|
||||
alreadyCheck++;
|
||||
oidcBtnElt.html(htmlvalue);
|
||||
}
|
||||
}
|
||||
}
|
||||
else{
|
||||
else {
|
||||
alreadyCheck = 1;
|
||||
}
|
||||
},
|
||||
'DOMSubtreeModified .at-form'(event){
|
||||
if(alreadyCheck <= 2 && !isCheckDone){
|
||||
if(document.getElementById("at-oidc") != null){
|
||||
'DOMSubtreeModified .at-form'(event) {
|
||||
if (alreadyCheck <= 2 && !isCheckDone) {
|
||||
if (document.getElementById("at-oidc") != null) {
|
||||
let currSetting = Settings.findOne();
|
||||
let oidcBtnElt = $("#at-oidc");
|
||||
if(currSetting && currSetting !== undefined && currSetting.oidcBtnText !== undefined && oidcBtnElt != null && oidcBtnElt != undefined){
|
||||
if (currSetting && currSetting !== undefined && currSetting.oidcBtnText !== undefined && oidcBtnElt != null && oidcBtnElt != undefined) {
|
||||
let htmlvalue = "<i class='fa fa-oidc'></i>" + currSetting.oidcBtnText;
|
||||
if(alreadyCheck == 1){
|
||||
if (alreadyCheck == 1) {
|
||||
alreadyCheck++;
|
||||
oidcBtnElt.html("");
|
||||
}
|
||||
else{
|
||||
else {
|
||||
alreadyCheck++;
|
||||
isCheckDone = true;
|
||||
oidcBtnElt.html(htmlvalue);
|
||||
@@ -189,7 +201,7 @@ Template.userFormsLayout.events({
|
||||
}
|
||||
}
|
||||
}
|
||||
else{
|
||||
else {
|
||||
alreadyCheck = 1;
|
||||
}
|
||||
},
|
||||
@@ -221,7 +233,7 @@ async function authentication(event, templateInstance) {
|
||||
switch (result) {
|
||||
case 'ldap':
|
||||
return new Promise(resolve => {
|
||||
Meteor.loginWithLDAP(match, password, function() {
|
||||
Meteor.loginWithLDAP(match, password, function () {
|
||||
resolve(FlowRouter.go('/'));
|
||||
});
|
||||
});
|
||||
@@ -233,7 +245,7 @@ async function authentication(event, templateInstance) {
|
||||
{
|
||||
provider,
|
||||
},
|
||||
function() {
|
||||
function () {
|
||||
resolve(FlowRouter.go('/'));
|
||||
},
|
||||
);
|
||||
@@ -241,7 +253,7 @@ async function authentication(event, templateInstance) {
|
||||
|
||||
case 'cas':
|
||||
return new Promise(resolve => {
|
||||
Meteor.loginWithCas(match, password, function() {
|
||||
Meteor.loginWithCas(match, password, function () {
|
||||
resolve(FlowRouter.go('/'));
|
||||
});
|
||||
});
|
||||
@@ -267,7 +279,6 @@ function getUserAuthenticationMethod(defaultAuthenticationMethod, match) {
|
||||
Meteor.subscribe('user-authenticationMethod', match, {
|
||||
onReady() {
|
||||
const user = Users.findOne();
|
||||
|
||||
const authenticationMethod = user
|
||||
? user.authenticationMethod
|
||||
: defaultAuthenticationMethod;
|
||||
|
||||
@@ -63,6 +63,7 @@
|
||||
.my-cards-card-title-table {
|
||||
font-weight: bold;
|
||||
padding-left: 2px;
|
||||
max-width: 243px;
|
||||
}
|
||||
.my-cards-board-badge {
|
||||
width: 36px;
|
||||
|
||||
@@ -88,7 +88,7 @@ template(name="filesReport")
|
||||
each att in results
|
||||
tr
|
||||
td {{ att.name }}
|
||||
td.right {{fileSize att.size }}
|
||||
td.right {{ fileSize att.size }}
|
||||
td {{ att.type }}
|
||||
td {{ att._id }}
|
||||
td {{ att.meta.boardId }}
|
||||
|
||||
@@ -4,6 +4,7 @@ import { CardSearchPagedComponent } from '/client/lib/cardSearch';
|
||||
import SessionData from '/models/usersessiondata';
|
||||
import { QueryParams } from '/config/query-classes';
|
||||
import { OPERATOR_LIMIT } from '/config/search-const';
|
||||
const filesize = require('filesize');
|
||||
|
||||
BlazeComponent.extendComponent({
|
||||
subscription: null,
|
||||
@@ -114,7 +115,8 @@ class AdminReport extends BlazeComponent {
|
||||
}
|
||||
|
||||
fileSize(size) {
|
||||
return Math.round(size / 1024);
|
||||
const ret = filesize(size);
|
||||
return ret;
|
||||
}
|
||||
|
||||
abbreviate(text) {
|
||||
|
||||
@@ -52,7 +52,7 @@ template(name="moveBoardAttachments")
|
||||
th {{_ 'name'}}
|
||||
th {{_ 'path'}}
|
||||
th {{_ 'version-name'}}
|
||||
th {{_ 'size'}} (B)
|
||||
th {{_ 'size'}}
|
||||
th GridFsFileId
|
||||
th {{_ 'storage'}}
|
||||
th {{_ 'action'}}
|
||||
@@ -68,7 +68,7 @@ template(name="moveAttachment")
|
||||
td {{ name }}
|
||||
td {{ version.path }}
|
||||
td {{ version.versionName }}
|
||||
td {{ version.size }}
|
||||
td {{ fileSize version.size }}
|
||||
td {{ version.meta.gridFsFileId }}
|
||||
td {{ version.storageName }}
|
||||
td
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import Attachments, { fileStoreStrategyFactory } from '/models/attachments';
|
||||
const filesize = require('filesize');
|
||||
|
||||
BlazeComponent.extendComponent({
|
||||
subscription: null,
|
||||
@@ -108,6 +109,10 @@ BlazeComponent.extendComponent({
|
||||
}).register('moveBoardAttachments');
|
||||
|
||||
BlazeComponent.extendComponent({
|
||||
fileSize(size) {
|
||||
const ret = filesize(size);
|
||||
return ret;
|
||||
},
|
||||
events() {
|
||||
return [
|
||||
{
|
||||
|
||||
@@ -58,38 +58,38 @@ template(name='statistics')
|
||||
td {{numFormat statistics.os.loadavg.[0]}}, {{numFormat statistics.os.loadavg.[1]}}, {{numFormat statistics.os.loadavg.[2]}}
|
||||
tr
|
||||
th {{_ 'OS_Totalmem'}}
|
||||
td {{bytesToSize statistics.os.totalmem}}
|
||||
td {{fileSize statistics.os.totalmem}}
|
||||
tr
|
||||
th {{_ 'OS_Freemem'}}
|
||||
td {{bytesToSize statistics.os.freemem}}
|
||||
td {{fileSize statistics.os.freemem}}
|
||||
tr
|
||||
th {{_ 'OS_Cpus'}}
|
||||
td {{statistics.os.cpus.length}}
|
||||
unless isSandstorm
|
||||
tr
|
||||
th {{_ 'Node_heap_total_heap_size'}}
|
||||
td {{bytesToSize statistics.nodeHeapStats.totalHeapSize}}
|
||||
td {{fileSize statistics.nodeHeapStats.totalHeapSize}}
|
||||
tr
|
||||
th {{_ 'Node_heap_total_heap_size_executable'}}
|
||||
td {{bytesToSize statistics.nodeHeapStats.totalHeapSizeExecutable}}
|
||||
td {{fileSize statistics.nodeHeapStats.totalHeapSizeExecutable}}
|
||||
tr
|
||||
th {{_ 'Node_heap_total_physical_size'}}
|
||||
td {{bytesToSize statistics.nodeHeapStats.totalPhysicalSize}}
|
||||
td {{fileSize statistics.nodeHeapStats.totalPhysicalSize}}
|
||||
tr
|
||||
th {{_ 'Node_heap_total_available_size'}}
|
||||
td {{bytesToSize statistics.nodeHeapStats.totalAvailableSize}}
|
||||
td {{fileSize statistics.nodeHeapStats.totalAvailableSize}}
|
||||
tr
|
||||
th {{_ 'Node_heap_used_heap_size'}}
|
||||
td {{bytesToSize statistics.nodeHeapStats.usedHeapSize}}
|
||||
td {{fileSize statistics.nodeHeapStats.usedHeapSize}}
|
||||
tr
|
||||
th {{_ 'Node_heap_heap_size_limit'}}
|
||||
td {{bytesToSize statistics.nodeHeapStats.heapSizeLimit}}
|
||||
td {{fileSize statistics.nodeHeapStats.heapSizeLimit}}
|
||||
tr
|
||||
th {{_ 'Node_heap_malloced_memory'}}
|
||||
td {{bytesToSize statistics.nodeHeapStats.mallocedMemory}}
|
||||
td {{fileSize statistics.nodeHeapStats.mallocedMemory}}
|
||||
tr
|
||||
th {{_ 'Node_heap_peak_malloced_memory'}}
|
||||
td {{bytesToSize statistics.nodeHeapStats.peakMallocedMemory}}
|
||||
td {{fileSize statistics.nodeHeapStats.peakMallocedMemory}}
|
||||
tr
|
||||
th {{_ 'Node_heap_does_zap_garbage'}}
|
||||
td {{statistics.nodeHeapStats.doesZapGarbage}}
|
||||
@@ -101,13 +101,13 @@ template(name='statistics')
|
||||
td {{statistics.nodeHeapStats.numberOfDetachedContexts}}
|
||||
tr
|
||||
th {{_ 'Node_memory_usage_rss'}}
|
||||
td {{bytesToSize statistics.nodeMemoryUsage.rss}}
|
||||
td {{fileSize statistics.nodeMemoryUsage.rss}}
|
||||
tr
|
||||
th {{_ 'Node_memory_usage_heap_total'}}
|
||||
td {{bytesToSize statistics.nodeMemoryUsage.heapTotal}}
|
||||
td {{fileSize statistics.nodeMemoryUsage.heapTotal}}
|
||||
tr
|
||||
th {{_ 'Node_memory_usage_heap_used'}}
|
||||
td {{bytesToSize statistics.nodeMemoryUsage.heapUsed}}
|
||||
td {{fileSize statistics.nodeMemoryUsage.heapUsed}}
|
||||
tr
|
||||
th {{_ 'Node_memory_usage_external'}}
|
||||
td {{bytesToSize statistics.nodeMemoryUsage.external}}
|
||||
td {{fileSize statistics.nodeMemoryUsage.external}}
|
||||
@@ -1,4 +1,5 @@
|
||||
import { TAPi18n } from '/imports/i18n';
|
||||
const filesize = require('filesize');
|
||||
|
||||
BlazeComponent.extendComponent({
|
||||
onCreated() {
|
||||
@@ -39,12 +40,8 @@ BlazeComponent.extendComponent({
|
||||
return parseFloat(number).toFixed(2);
|
||||
},
|
||||
|
||||
bytesToSize(bytes) {
|
||||
const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
|
||||
if (bytes === 0) {
|
||||
return '0 Byte';
|
||||
}
|
||||
const i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)), 10);
|
||||
return `${Math.round(bytes / Math.pow(1024, i), 2)} ${sizes[i]}`;
|
||||
fileSize(size) {
|
||||
const ret = filesize(size);
|
||||
return ret;
|
||||
},
|
||||
}).register('statistics');
|
||||
@@ -190,22 +190,19 @@ BlazeComponent.extendComponent({
|
||||
|
||||
Template.orgRow.helpers({
|
||||
orgData() {
|
||||
const orgCollection = this.esSearch ? ESSearchResults : Org;
|
||||
return orgCollection.findOne(this.orgId);
|
||||
return Org.findOne(this.orgId);
|
||||
},
|
||||
});
|
||||
|
||||
Template.teamRow.helpers({
|
||||
teamData() {
|
||||
const teamCollection = this.esSearch ? ESSearchResults : Team;
|
||||
return teamCollection.findOne(this.teamId);
|
||||
return Team.findOne(this.teamId);
|
||||
},
|
||||
});
|
||||
|
||||
Template.peopleRow.helpers({
|
||||
userData() {
|
||||
const userCollection = this.esSearch ? ESSearchResults : Users;
|
||||
return userCollection.findOne(this.userId);
|
||||
return Users.findOne(this.userId);
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@@ -229,6 +229,10 @@ template(name='layoutSettings')
|
||||
.title {{_ 'custom-login-logo-link-url'}}
|
||||
.form-group
|
||||
input.wekan-form-control#custom-login-logo-link-url(type="text", placeholder="" value="{{currentSetting.customLoginLogoLinkUrl}}")
|
||||
li.layout-form
|
||||
.title {{_ 'custom-help-link-url'}}
|
||||
.form-group
|
||||
input.wekan-form-control#custom-help-link-url(type="text", placeholder="" value="{{currentSetting.customHelpLinkUrl}}")
|
||||
li.layout-form
|
||||
.title {{_ 'text-below-custom-login-logo'}}
|
||||
.form-group
|
||||
|
||||
@@ -189,6 +189,9 @@ BlazeComponent.extendComponent({
|
||||
const customLoginLogoLinkUrl = $('#custom-login-logo-link-url')
|
||||
.val()
|
||||
.trim();
|
||||
const customHelpLinkUrl = $('#custom-help-link-url')
|
||||
.val()
|
||||
.trim();
|
||||
const textBelowCustomLoginLogo = $('#text-below-custom-login-logo')
|
||||
.val()
|
||||
.trim();
|
||||
@@ -240,6 +243,7 @@ BlazeComponent.extendComponent({
|
||||
hideLogo: hideLogoChange,
|
||||
customLoginLogoImageUrl,
|
||||
customLoginLogoLinkUrl,
|
||||
customHelpLinkUrl,
|
||||
textBelowCustomLoginLogo,
|
||||
customTopLeftCornerLogoImageUrl,
|
||||
customTopLeftCornerLogoLinkUrl,
|
||||
|
||||
@@ -15,6 +15,7 @@ template(name="sidebar")
|
||||
+Template.dynamic(template=getViewTemplate)
|
||||
|
||||
template(name='homeSidebar')
|
||||
hr
|
||||
+membersWidget
|
||||
hr
|
||||
+labelsWidget
|
||||
@@ -31,61 +32,59 @@ template(name='homeSidebar')
|
||||
+activities(mode="board")
|
||||
|
||||
template(name="membersWidget")
|
||||
if AtLeastOneOrgWasCreated
|
||||
.board-widget.board-widget-members
|
||||
unless currentUser.isCommentOnly
|
||||
unless currentUser.isWorker
|
||||
h3
|
||||
i.fa.fa-users
|
||||
| {{_ 'organizations'}}
|
||||
|
||||
.board-widget-content
|
||||
+boardOrgGeneral
|
||||
.clearfix
|
||||
br
|
||||
hr
|
||||
if AtLeastOneTeamWasCreated
|
||||
.board-widget.board-widget-members
|
||||
h3
|
||||
i.fa.fa-users
|
||||
| {{_ 'teams'}}
|
||||
|
||||
.board-widget-content
|
||||
+boardTeamGeneral
|
||||
.clearfix
|
||||
br
|
||||
hr
|
||||
a.board-header-btn.js-open-board-menu(title="{{_ 'boardMenuPopup-title'}}")
|
||||
i.board-header-btn-icon.fa.fa-cog
|
||||
| {{_ 'boardMenuPopup-title'}}
|
||||
.board-widget.board-widget-members
|
||||
h3
|
||||
i.fa.fa-users
|
||||
| {{_ 'members'}}
|
||||
|
||||
.sidebar-shortcuts
|
||||
a.board-header-btn.js-shortcuts(title="{{_ 'keyboard-shortcuts' }}")
|
||||
i.fa.fa-keyboard-o
|
||||
span {{_ 'keyboard-shortcuts' }}
|
||||
|
||||
unless currentUser.isCommentOnly
|
||||
hr
|
||||
h3
|
||||
i.fa.fa-users
|
||||
| {{_ 'members'}}
|
||||
+basicTabs(tabs=tabs)
|
||||
+tabContent(slug="people")
|
||||
unless currentUser.isWorker
|
||||
a.board-header-btn.js-open-board-menu(title="{{_ 'boardMenuPopup-title'}}").right
|
||||
i.board-header-btn-icon.fa.fa-cog
|
||||
|
||||
.board-widget-content
|
||||
each currentBoard.activeMembers
|
||||
+userAvatar(userId=this.userId showStatus=true)
|
||||
if isSandstorm
|
||||
if currentUser.isBoardMember
|
||||
a.member.add-member.sandstorm-powerbox-request-identity(title="{{_ 'add-members'}}")
|
||||
i.fa.fa-plus
|
||||
else if currentUser.isBoardAdmin
|
||||
a.member.add-member.js-manage-board-members(title="{{_ 'add-members'}}")
|
||||
i.fa.fa-plus
|
||||
.clearfix
|
||||
if isInvited
|
||||
hr
|
||||
p
|
||||
i.fa.fa-exclamation-circle
|
||||
| {{_ 'just-invited'}}
|
||||
button.js-member-invite-accept.primary {{_ 'accept'}}
|
||||
button.js-member-invite-decline {{_ 'decline'}}
|
||||
p.quiet
|
||||
.board-widget-content
|
||||
each currentBoard.activeMembers
|
||||
+userAvatar(userId=this.userId showStatus=true)
|
||||
if isSandstorm
|
||||
if currentUser.isBoardMember
|
||||
a.member.add-member.sandstorm-powerbox-request-identity(title="{{_ 'add-members'}}")
|
||||
i.fa.fa-plus
|
||||
else if currentUser.isBoardAdmin
|
||||
a.member.add-member.js-manage-board-members(title="{{_ 'add-members'}}")
|
||||
i.fa.fa-plus
|
||||
.clearfix
|
||||
if isInvited
|
||||
hr
|
||||
p
|
||||
i.fa.fa-exclamation-circle
|
||||
| {{_ 'just-invited'}}
|
||||
button.js-member-invite-accept.primary {{_ 'accept'}}
|
||||
button.js-member-invite-decline {{_ 'decline'}}
|
||||
+tabContent(slug='organizations')
|
||||
unless currentUser.isWorker
|
||||
p.quiet
|
||||
if AtLeastOneOrgWasCreated
|
||||
.board-widget.board-widget-members
|
||||
.board-widget-content
|
||||
+boardOrgGeneral
|
||||
.clearfix
|
||||
+tabContent(slug="teams")
|
||||
unless currentUser.isWorker
|
||||
p.quiet
|
||||
if AtLeastOneTeamWasCreated
|
||||
.board-widget.board-widget-members
|
||||
.board-widget-content
|
||||
+boardTeamGeneral
|
||||
.clearfix
|
||||
|
||||
template(name="boardOrgGeneral")
|
||||
table
|
||||
@@ -561,7 +560,7 @@ template(name="removeBoardTeamPopup")
|
||||
|
||||
template(name="addMemberPopup")
|
||||
.js-search-member
|
||||
+esInput(index="users")
|
||||
+EasySearch.Input(index=searchIndex)
|
||||
|
||||
if loading.get
|
||||
+spinner
|
||||
@@ -569,20 +568,20 @@ template(name="addMemberPopup")
|
||||
.warning {{_ error.get}}
|
||||
else
|
||||
ul.pop-over-list
|
||||
+esEach(index="users")
|
||||
+EasySearch.Each(index=searchIndex)
|
||||
li.item.js-member-item(class="{{#if isBoardMember}}disabled{{/if}}")
|
||||
a.name.js-select-member(title="{{profile.fullname}} ({{username}})")
|
||||
+userAvatar(userId=_id esSearch=true)
|
||||
+userAvatar(userId=__originalId)
|
||||
span.full-name
|
||||
= profile.fullname
|
||||
| (<span class="username">{{username}}</span>)
|
||||
if isBoardMember
|
||||
.quiet ({{_ 'joined'}})
|
||||
|
||||
+ifEsIsSearching(index='users')
|
||||
+EasySearch.IfSearching(index=searchIndex)
|
||||
+spinner
|
||||
|
||||
+ifEsHasNoResults(index="users")
|
||||
+EasySearch.IfNoResults(index=searchIndex)
|
||||
.manage-member-section
|
||||
p.quiet {{_ 'no-results'}}
|
||||
button.js-email-invite.primary.full {{_ 'email-invite'}}
|
||||
|
||||
@@ -330,6 +330,14 @@ BlazeComponent.extendComponent({
|
||||
isLoading() {
|
||||
return this.loading.get();
|
||||
},
|
||||
|
||||
tabs() {
|
||||
return [
|
||||
{ name: TAPi18n.__('people'), slug: 'people' },
|
||||
{ name: TAPi18n.__('organizations'), slug: 'organizations' },
|
||||
{ name: TAPi18n.__('teams'), slug: 'teams' },
|
||||
];
|
||||
},
|
||||
}).register('membersWidget');
|
||||
|
||||
Template.membersWidget.helpers({
|
||||
@@ -1333,7 +1341,7 @@ BlazeComponent.extendComponent({
|
||||
},
|
||||
|
||||
isBoardMember() {
|
||||
const userId = this.currentData()._id;
|
||||
const userId = this.currentData().__originalId;
|
||||
const user = Users.findOne(userId);
|
||||
return user && user.isBoardMember();
|
||||
},
|
||||
@@ -1373,7 +1381,7 @@ BlazeComponent.extendComponent({
|
||||
this.setError('');
|
||||
},
|
||||
'click .js-select-member'() {
|
||||
const userId = this.currentData()._id;
|
||||
const userId = this.currentData().__originalId;
|
||||
const currentBoard = Boards.findOne(Session.get('currentBoard'));
|
||||
if (!currentBoard.hasMember(userId)) {
|
||||
this.inviteUser(userId);
|
||||
@@ -1390,6 +1398,10 @@ BlazeComponent.extendComponent({
|
||||
},
|
||||
}).register('addMemberPopup');
|
||||
|
||||
Template.addMemberPopup.helpers({
|
||||
searchIndex: () => UserSearchIndex,
|
||||
})
|
||||
|
||||
BlazeComponent.extendComponent({
|
||||
onCreated() {
|
||||
this.error = new ReactiveVar('');
|
||||
|
||||
@@ -25,10 +25,10 @@ template(name="swimlaneFixedHeader")
|
||||
if currentUser.isBoardAdmin
|
||||
a.fa.fa-plus.js-open-add-swimlane-menu.swimlane-header-plus-icon(title="{{_ 'add-swimlane'}}")
|
||||
a.fa.fa-navicon.js-open-swimlane-menu(title="{{_ 'swimlaneActionPopup-title'}}")
|
||||
unless isMiniScreen
|
||||
unless isTouchScreen
|
||||
if isShowDesktopDragHandles
|
||||
a.swimlane-header-handle.handle.fa.fa-arrows.js-swimlane-header-handle
|
||||
if isMiniScreen
|
||||
if isTouchScreen
|
||||
a.swimlane-header-miniscreen-handle.handle.fa.fa-arrows.js-swimlane-header-handle
|
||||
|
||||
template(name="editSwimlaneTitleForm")
|
||||
|
||||
@@ -46,7 +46,6 @@
|
||||
background: #dedede;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
overflow: 0;
|
||||
max-height: calc(100% - 26px);
|
||||
}
|
||||
.swimlane.placeholder {
|
||||
|
||||
@@ -10,10 +10,10 @@ function currentListIsInThisSwimlane(swimlaneId) {
|
||||
|
||||
function currentCardIsInThisList(listId, swimlaneId) {
|
||||
const currentCard = Utils.getCurrentCard();
|
||||
const currentUser = Meteor.user();
|
||||
//const currentUser = Meteor.user();
|
||||
if (
|
||||
currentUser &&
|
||||
currentUser.profile &&
|
||||
//currentUser &&
|
||||
//currentUser.profile &&
|
||||
Utils.boardView() === 'board-view-swimlanes'
|
||||
)
|
||||
return (
|
||||
@@ -21,7 +21,15 @@ function currentCardIsInThisList(listId, swimlaneId) {
|
||||
currentCard.listId === listId &&
|
||||
currentCard.swimlaneId === swimlaneId
|
||||
);
|
||||
else return currentCard && currentCard.listId === listId;
|
||||
else if (
|
||||
//currentUser &&
|
||||
//currentUser.profile &&
|
||||
Utils.boardView() === 'board-view-lists'
|
||||
)
|
||||
return (
|
||||
currentCard &&
|
||||
currentCard.listId === listId
|
||||
);
|
||||
|
||||
// https://github.com/wekan/wekan/issues/1623
|
||||
// https://github.com/ChronikEwok/wekan/commit/cad9b20451bb6149bfb527a99b5001873b06c3de
|
||||
@@ -77,6 +85,15 @@ function initSortable(boardComponent, $listsDom) {
|
||||
const listDomElement = ui.item.get(0);
|
||||
const list = Blaze.getData(listDomElement);
|
||||
|
||||
/*
|
||||
Reverted incomplete change list width,
|
||||
removed from below Lists.update:
|
||||
https://github.com/wekan/wekan/issues/4558
|
||||
$set: {
|
||||
width: list._id.width(),
|
||||
height: list._id.height(),
|
||||
*/
|
||||
|
||||
Lists.update(list._id, {
|
||||
$set: {
|
||||
sort: sortIndex.base,
|
||||
@@ -97,7 +114,7 @@ function initSortable(boardComponent, $listsDom) {
|
||||
//}
|
||||
|
||||
boardComponent.autorun(() => {
|
||||
if (Utils.isMiniScreenOrShowDesktopDragHandles()) {
|
||||
if (Utils.isTouchScreenOrShowDesktopDragHandles()) {
|
||||
$listsDom.sortable({
|
||||
handle: '.js-list-handle',
|
||||
});
|
||||
@@ -183,7 +200,7 @@ BlazeComponent.extendComponent({
|
||||
// his mouse.
|
||||
|
||||
const noDragInside = ['a', 'input', 'textarea', 'p'].concat(
|
||||
Utils.isMiniScreenOrShowDesktopDragHandles()
|
||||
Utils.isTouchScreenOrShowDesktopDragHandles()
|
||||
? ['.js-list-handle', '.js-swimlane-header-handle']
|
||||
: ['.js-list-header'],
|
||||
);
|
||||
|
||||
@@ -3,17 +3,10 @@ import Avatars from '/models/avatars';
|
||||
import Users from '/models/users';
|
||||
import Org from '/models/org';
|
||||
import Team from '/models/team';
|
||||
import { formatFleURL } from 'meteor/ostrio:files/lib';
|
||||
|
||||
Template.userAvatar.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, {
|
||||
return Users.findOne(this.userId, {
|
||||
fields: {
|
||||
profile: 1,
|
||||
username: 1,
|
||||
@@ -95,8 +88,7 @@ BlazeComponent.extendComponent({
|
||||
|
||||
Template.boardOrgRow.helpers({
|
||||
orgData() {
|
||||
const orgCollection = this.esSearch ? ESSearchResults : Org;
|
||||
return orgCollection.findOne(this.orgId);
|
||||
return Org.findOne(this.orgId);
|
||||
},
|
||||
currentUser(){
|
||||
return Meteor.user();
|
||||
@@ -158,8 +150,7 @@ BlazeComponent.extendComponent({
|
||||
|
||||
Template.boardTeamRow.helpers({
|
||||
teamData() {
|
||||
const teamCollection = this.esSearch ? ESSearchResults : Team;
|
||||
return teamCollection.findOne(this.teamId);
|
||||
return Team.findOne(this.teamId);
|
||||
},
|
||||
currentUser(){
|
||||
return Meteor.user();
|
||||
@@ -226,13 +217,6 @@ BlazeComponent.extendComponent({
|
||||
},
|
||||
false,
|
||||
);
|
||||
uploader.on('uploaded', (error, fileRef) => {
|
||||
if (!error) {
|
||||
self.setAvatar(
|
||||
`${formatFleURL(fileRef)}?auth=false&brokenIsFine=true`,
|
||||
);
|
||||
}
|
||||
});
|
||||
uploader.on('error', (error, fileData) => {
|
||||
self.setError(error.reason);
|
||||
});
|
||||
@@ -246,8 +230,9 @@ BlazeComponent.extendComponent({
|
||||
'click .js-select-initials'() {
|
||||
this.setAvatar('');
|
||||
},
|
||||
'click .js-delete-avatar'() {
|
||||
'click .js-delete-avatar'(event) {
|
||||
Avatars.remove(this.currentData()._id);
|
||||
event.stopPropagation();
|
||||
},
|
||||
},
|
||||
];
|
||||
|
||||
@@ -180,6 +180,13 @@ template(name="changeSettingsPopup")
|
||||
option(selected="true", value="#{day.value}") #{day.name}
|
||||
else
|
||||
option(value="#{day.value}") #{day.name}
|
||||
label.bold.clear
|
||||
| {{_ 'card-settings'}}
|
||||
ul#cards.card-description-rescued
|
||||
a.flex.js-rescue-card-description(title="{{_ 'rescue-card-description'}}")
|
||||
b
|
||||
#rescue-card-description.materialCheckBox.left(class="{{#if rescueCardDescription}}is-checked{{/if}}", value=rescueCardDescription)
|
||||
span {{_ 'rescue-card-description'}}
|
||||
input.js-apply-user-settings.left(type="submit" value="{{_ 'apply'}}")
|
||||
|
||||
template(name="userDeletePopup")
|
||||
|
||||
@@ -297,6 +297,16 @@ Template.changeSettingsPopup.helpers({
|
||||
return false;
|
||||
}
|
||||
},
|
||||
rescueCardDescription() {
|
||||
currentUser = Meteor.user();
|
||||
if (currentUser) {
|
||||
return (currentUser.profile || {}).rescueCardDescription;
|
||||
} else if (window.localStorage.getItem('rescueCardDescription')) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
},
|
||||
showCardsCountAt() {
|
||||
currentUser = Meteor.user();
|
||||
if (currentUser) {
|
||||
@@ -356,6 +366,9 @@ Template.changeSettingsPopup.events({
|
||||
window.localStorage.setItem('hasHiddenSystemMessages', 'true');
|
||||
}
|
||||
},
|
||||
'click .js-rescue-card-description'() {
|
||||
Meteor.call('toggleRescueCardDescription')
|
||||
},
|
||||
'click .js-apply-user-settings'(event, templateInstance) {
|
||||
event.preventDefault();
|
||||
let minLimit = parseInt(
|
||||
|
||||
@@ -27,12 +27,14 @@ Blaze.registerHelper('concat', (...args) => args.slice(0, -1).join(''));
|
||||
|
||||
Blaze.registerHelper('isMiniScreen', () => Utils.isMiniScreen());
|
||||
|
||||
Blaze.registerHelper('isTouchScreen', () => Utils.isTouchScreen());
|
||||
|
||||
Blaze.registerHelper('isShowDesktopDragHandles', () =>
|
||||
Utils.isShowDesktopDragHandles(),
|
||||
);
|
||||
|
||||
Blaze.registerHelper('isMiniScreenOrShowDesktopDragHandles', () =>
|
||||
Utils.isMiniScreenOrShowDesktopDragHandles(),
|
||||
Blaze.registerHelper('isTouchScreenOrShowDesktopDragHandles', () =>
|
||||
Utils.isTouchScreenOrShowDesktopDragHandles(),
|
||||
);
|
||||
|
||||
Blaze.registerHelper('moment', (...args) => {
|
||||
|
||||
@@ -0,0 +1,188 @@
|
||||
export class DialogWithBoardSwimlaneList extends BlazeComponent {
|
||||
/** returns the card dialog options
|
||||
* @return Object with properties { boardId, swimlaneId, listId }
|
||||
*/
|
||||
getDialogOptions() {
|
||||
}
|
||||
|
||||
/** list is done
|
||||
* @param listId the selected list id
|
||||
* @param options the selected options (Object with properties { boardId, swimlaneId, listId })
|
||||
*/
|
||||
setDone(listId, options) {
|
||||
}
|
||||
|
||||
/** get the default options
|
||||
* @return the options
|
||||
*/
|
||||
getDefaultOption(boardId) {
|
||||
const ret = {
|
||||
'boardId' : "",
|
||||
'swimlaneId' : "",
|
||||
'listId' : "",
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
onCreated() {
|
||||
this.currentBoardId = Utils.getCurrentBoardId();
|
||||
this.selectedBoardId = new ReactiveVar(this.currentBoardId);
|
||||
this.selectedSwimlaneId = new ReactiveVar('');
|
||||
this.selectedListId = new ReactiveVar('');
|
||||
this.setOption(this.currentBoardId);
|
||||
}
|
||||
|
||||
/** set the last confirmed dialog field values
|
||||
* @param boardId the current board id
|
||||
*/
|
||||
setOption(boardId) {
|
||||
this.cardOption = this.getDefaultOption();
|
||||
|
||||
let currentOptions = this.getDialogOptions();
|
||||
if (currentOptions && boardId && currentOptions[boardId]) {
|
||||
this.cardOption = currentOptions[boardId];
|
||||
if (this.cardOption.boardId &&
|
||||
this.cardOption.swimlaneId &&
|
||||
this.cardOption.listId
|
||||
)
|
||||
{
|
||||
this.selectedBoardId.set(this.cardOption.boardId)
|
||||
this.selectedSwimlaneId.set(this.cardOption.swimlaneId);
|
||||
this.selectedListId.set(this.cardOption.listId);
|
||||
}
|
||||
}
|
||||
this.getBoardData(this.selectedBoardId.get());
|
||||
if (!this.selectedSwimlaneId.get() || !Swimlanes.findOne({_id: this.selectedSwimlaneId.get(), boardId: this.selectedBoardId.get()})) {
|
||||
this.setFirstSwimlaneId();
|
||||
}
|
||||
if (!this.selectedListId.get() || !Lists.findOne({_id: this.selectedListId.get(), boardId: this.selectedBoardId.get()})) {
|
||||
this.setFirstListId();
|
||||
}
|
||||
}
|
||||
/** sets the first swimlane id */
|
||||
setFirstSwimlaneId() {
|
||||
try {
|
||||
const board = Boards.findOne(this.selectedBoardId.get());
|
||||
const swimlaneId = board.swimlanes().fetch()[0]._id;
|
||||
this.selectedSwimlaneId.set(swimlaneId);
|
||||
} catch (e) {}
|
||||
}
|
||||
/** sets the first list id */
|
||||
setFirstListId() {
|
||||
try {
|
||||
const board = Boards.findOne(this.selectedBoardId.get());
|
||||
const listId = board.lists().fetch()[0]._id;
|
||||
this.selectedListId.set(listId);
|
||||
} catch (e) {}
|
||||
}
|
||||
|
||||
/** returns if the board id was the last confirmed one
|
||||
* @param boardId check this board id
|
||||
* @return if the board id was the last confirmed one
|
||||
*/
|
||||
isDialogOptionBoardId(boardId) {
|
||||
let ret = this.cardOption.boardId == boardId;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** returns if the swimlane id was the last confirmed one
|
||||
* @param swimlaneId check this swimlane id
|
||||
* @return if the swimlane id was the last confirmed one
|
||||
*/
|
||||
isDialogOptionSwimlaneId(swimlaneId) {
|
||||
let ret = this.cardOption.swimlaneId == swimlaneId;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** returns if the list id was the last confirmed one
|
||||
* @param listId check this list id
|
||||
* @return if the list id was the last confirmed one
|
||||
*/
|
||||
isDialogOptionListId(listId) {
|
||||
let ret = this.cardOption.listId == listId;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** returns all available board */
|
||||
boards() {
|
||||
const ret = Boards.find(
|
||||
{
|
||||
archived: false,
|
||||
'members.userId': Meteor.userId(),
|
||||
_id: { $ne: Meteor.user().getTemplatesBoardId() },
|
||||
},
|
||||
{
|
||||
sort: { sort: 1 },
|
||||
},
|
||||
);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** returns all available swimlanes of the current board */
|
||||
swimlanes() {
|
||||
const board = Boards.findOne(this.selectedBoardId.get());
|
||||
const ret = board.swimlanes();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** returns all available lists of the current board */
|
||||
lists() {
|
||||
const board = Boards.findOne(this.selectedBoardId.get());
|
||||
const ret = board.lists();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** get the board data from the server
|
||||
* @param boardId get the board data of this board id
|
||||
*/
|
||||
getBoardData(boardId) {
|
||||
const self = this;
|
||||
Meteor.subscribe('board', boardId, false, {
|
||||
onReady() {
|
||||
const sameBoardId = self.selectedBoardId.get() == boardId;
|
||||
self.selectedBoardId.set(boardId);
|
||||
|
||||
if (!sameBoardId) {
|
||||
// reset swimlane id (for selection in cards())
|
||||
self.setFirstSwimlaneId();
|
||||
|
||||
// reset list id (for selection in cards())
|
||||
self.setFirstListId();
|
||||
}
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
events() {
|
||||
return [
|
||||
{
|
||||
'click .js-done'() {
|
||||
const boardSelect = this.$('.js-select-boards')[0];
|
||||
const boardId = boardSelect.options[boardSelect.selectedIndex].value;
|
||||
|
||||
const listSelect = this.$('.js-select-lists')[0];
|
||||
const listId = listSelect.options[listSelect.selectedIndex].value;
|
||||
|
||||
const swimlaneSelect = this.$('.js-select-swimlanes')[0];
|
||||
const swimlaneId = swimlaneSelect.options[swimlaneSelect.selectedIndex].value;
|
||||
|
||||
const options = {
|
||||
'boardId' : boardId,
|
||||
'swimlaneId' : swimlaneId,
|
||||
'listId' : listId,
|
||||
}
|
||||
this.setDone(boardId, swimlaneId, listId, options);
|
||||
Popup.back(2);
|
||||
},
|
||||
'change .js-select-boards'(event) {
|
||||
const boardId = $(event.currentTarget).val();
|
||||
this.getBoardData(boardId);
|
||||
},
|
||||
'change .js-select-swimlanes'(event) {
|
||||
this.selectedSwimlaneId.set($(event.currentTarget).val());
|
||||
},
|
||||
},
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
import { DialogWithBoardSwimlaneList } from '/client/lib/dialogWithBoardSwimlaneList';
|
||||
|
||||
export class DialogWithBoardSwimlaneListCard extends DialogWithBoardSwimlaneList {
|
||||
getDefaultOption(boardId) {
|
||||
const ret = {
|
||||
'boardId' : "",
|
||||
'swimlaneId' : "",
|
||||
'listId' : "",
|
||||
'cardId': "",
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** returns if the card id was the last confirmed one
|
||||
* @param cardId check this card id
|
||||
* @return if the card id was the last confirmed one
|
||||
*/
|
||||
isDialogOptionCardId(cardId) {
|
||||
let ret = this.cardOption.cardId == cardId;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/** returns all available cards of the current list */
|
||||
cards() {
|
||||
const list = Lists.findOne(this.selectedListId.get());
|
||||
let ret = {}
|
||||
if (list) {
|
||||
ret = list.cards(this.selectedSwimlaneId.get());
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
events() {
|
||||
return [
|
||||
{
|
||||
'click .js-done'() {
|
||||
const boardSelect = this.$('.js-select-boards')[0];
|
||||
const boardId = boardSelect.options[boardSelect.selectedIndex].value;
|
||||
|
||||
const listSelect = this.$('.js-select-lists')[0];
|
||||
const listId = listSelect.options[listSelect.selectedIndex].value;
|
||||
|
||||
const swimlaneSelect = this.$('.js-select-swimlanes')[0];
|
||||
const swimlaneId = swimlaneSelect.options[swimlaneSelect.selectedIndex].value;
|
||||
|
||||
const cardSelect = this.$('.js-select-cards')[0];
|
||||
const cardId = cardSelect.options[cardSelect.selectedIndex].value;
|
||||
|
||||
const options = {
|
||||
'boardId' : boardId,
|
||||
'swimlaneId' : swimlaneId,
|
||||
'listId' : listId,
|
||||
'cardId': cardId,
|
||||
}
|
||||
this.setDone(cardId, options);
|
||||
Popup.back(2);
|
||||
},
|
||||
'change .js-select-boards'(event) {
|
||||
const boardId = $(event.currentTarget).val();
|
||||
this.getBoardData(boardId);
|
||||
},
|
||||
'change .js-select-swimlanes'(event) {
|
||||
this.selectedSwimlaneId.set($(event.currentTarget).val());
|
||||
},
|
||||
'change .js-select-lists'(event) {
|
||||
this.selectedListId.set($(event.currentTarget).val());
|
||||
},
|
||||
},
|
||||
];
|
||||
}
|
||||
}
|
||||
+3
-3
@@ -149,12 +149,12 @@ window.Popup = new (class {
|
||||
}
|
||||
}
|
||||
|
||||
getOpenerComponent() {
|
||||
const { openerElement } = Template.parentData(4);
|
||||
getOpenerComponent(n=4) {
|
||||
const { openerElement } = Template.parentData(n);
|
||||
return BlazeComponent.getComponentForElement(openerElement);
|
||||
}
|
||||
|
||||
// An utility fonction that returns the top element of the internal stack
|
||||
// An utility function that returns the top element of the internal stack
|
||||
_getTopStack() {
|
||||
return this._stack[this._stack.length - 1];
|
||||
}
|
||||
|
||||
@@ -5,20 +5,20 @@ import { Random } from 'meteor/random';
|
||||
import '../utils';
|
||||
|
||||
|
||||
describe('Utils', function() {
|
||||
beforeEach(function() {
|
||||
sinon.stub(Utils, 'reload').callsFake(() => {});
|
||||
describe('Utils', function () {
|
||||
beforeEach(function () {
|
||||
sinon.stub(Utils, 'reload').callsFake(() => { });
|
||||
});
|
||||
|
||||
afterEach(function() {
|
||||
afterEach(function () {
|
||||
window.localStorage.removeItem(boardView);
|
||||
sinon.restore();
|
||||
});
|
||||
|
||||
const boardView = 'boardView';
|
||||
|
||||
describe(Utils.setBoardView.name, function() {
|
||||
it('sets the board view if the user exists', function(done) {
|
||||
describe(Utils.setBoardView.name, function () {
|
||||
it('sets the board view if the user exists', function (done) {
|
||||
const viewId = Random.id();
|
||||
const user = {
|
||||
setBoardView: (view) => {
|
||||
@@ -32,14 +32,14 @@ describe('Utils', function() {
|
||||
expect(window.localStorage.getItem(boardView)).to.equal(viewId);
|
||||
});
|
||||
|
||||
it('sets a specific view if no user exists but a view is defined', function() {
|
||||
it('sets a specific view if no user exists but a view is defined', function () {
|
||||
const views = [
|
||||
'board-view-swimlanes',
|
||||
'board-view-lists',
|
||||
'board-view-cal'
|
||||
];
|
||||
|
||||
sinon.stub(Meteor, 'user').callsFake(() => {});
|
||||
sinon.stub(Meteor, 'user').callsFake(() => { });
|
||||
|
||||
views.forEach(viewName => {
|
||||
Utils.setBoardView(viewName);
|
||||
@@ -47,15 +47,15 @@ describe('Utils', function() {
|
||||
});
|
||||
});
|
||||
|
||||
it('sets a default view if no user and no view are given', function() {
|
||||
sinon.stub(Meteor, 'user').callsFake(() => {});
|
||||
it('sets a default view if no user and no view are given', function () {
|
||||
sinon.stub(Meteor, 'user').callsFake(() => { });
|
||||
Utils.setBoardView();
|
||||
expect(window.localStorage.getItem(boardView)).to.equal('board-view-swimlanes');
|
||||
});
|
||||
});
|
||||
|
||||
describe(Utils.unsetBoardView.name, function() {
|
||||
it('removes the boardview from localStoage', function() {
|
||||
describe(Utils.unsetBoardView.name, function () {
|
||||
it('removes the boardview from localStoage', function () {
|
||||
window.localStorage.setItem(boardView, Random.id());
|
||||
window.localStorage.setItem('collapseSwimlane', Random.id());
|
||||
|
||||
@@ -66,8 +66,8 @@ describe('Utils', function() {
|
||||
});
|
||||
});
|
||||
|
||||
describe(Utils.boardView.name, function() {
|
||||
it('returns the user\'s board view if a user exists', function() {
|
||||
describe(Utils.boardView.name, function () {
|
||||
it('returns the user\'s board view if a user exists', function () {
|
||||
const viewId = Random.id();
|
||||
const user = {};
|
||||
sinon.stub(Meteor, 'user').callsFake(() => user);
|
||||
@@ -78,108 +78,108 @@ describe('Utils', function() {
|
||||
|
||||
expect(Utils.boardView()).to.equal(boardView);
|
||||
});
|
||||
it('returns the current defined view', function() {
|
||||
it('returns the current defined view', function () {
|
||||
const views = [
|
||||
'board-view-swimlanes',
|
||||
'board-view-lists',
|
||||
'board-view-cal'
|
||||
];
|
||||
|
||||
sinon.stub(Meteor, 'user').callsFake(() => {});
|
||||
sinon.stub(Meteor, 'user').callsFake(() => { });
|
||||
|
||||
views.forEach(viewName => {
|
||||
window.localStorage.setItem(boardView, viewName);
|
||||
expect(Utils.boardView()).to.equal(viewName);
|
||||
});
|
||||
});
|
||||
it('returns a default if nothing is set', function() {
|
||||
sinon.stub(Meteor, 'user').callsFake(() => {});
|
||||
it('returns a default if nothing is set', function () {
|
||||
sinon.stub(Meteor, 'user').callsFake(() => { });
|
||||
expect(Utils.boardView()).to.equal('board-view-swimlanes');
|
||||
expect(window.localStorage.getItem(boardView)).to.equal('board-view-swimlanes');
|
||||
});
|
||||
});
|
||||
|
||||
describe(Utils.myCardsSort.name, function() {
|
||||
describe(Utils.myCardsSort.name, function () {
|
||||
it('has no tests yet');
|
||||
});
|
||||
|
||||
describe(Utils.myCardsSortToggle.name, function() {
|
||||
describe(Utils.myCardsSortToggle.name, function () {
|
||||
it('has no tests yet');
|
||||
});
|
||||
|
||||
describe(Utils.setMyCardsSort.name, function() {
|
||||
describe(Utils.setMyCardsSort.name, function () {
|
||||
it('has no tests yet');
|
||||
});
|
||||
|
||||
describe(Utils.archivedBoardIds.name, function() {
|
||||
describe(Utils.archivedBoardIds.name, function () {
|
||||
it('has no tests yet');
|
||||
});
|
||||
|
||||
describe(Utils.dueCardsView.name, function() {
|
||||
describe(Utils.dueCardsView.name, function () {
|
||||
it('has no tests yet');
|
||||
});
|
||||
|
||||
describe(Utils.setDueCardsView.name, function() {
|
||||
describe(Utils.setDueCardsView.name, function () {
|
||||
it('has no tests yet');
|
||||
});
|
||||
|
||||
describe(Utils.goBoardId.name, function() {
|
||||
describe(Utils.goBoardId.name, function () {
|
||||
it('has no tests yet');
|
||||
});
|
||||
|
||||
describe(Utils.goCardId.name, function() {
|
||||
describe(Utils.goCardId.name, function () {
|
||||
it('has no tests yet');
|
||||
});
|
||||
|
||||
describe(Utils.processUploadedAttachment.name, function() {
|
||||
describe(Utils.processUploadedAttachment.name, function () {
|
||||
it('has no tests yet');
|
||||
});
|
||||
|
||||
describe(Utils.shrinkImage.name, function() {
|
||||
describe(Utils.shrinkImage.name, function () {
|
||||
it('has no tests yet');
|
||||
});
|
||||
|
||||
describe(Utils.capitalize.name, function() {
|
||||
describe(Utils.capitalize.name, function () {
|
||||
it('has no tests yet');
|
||||
});
|
||||
|
||||
describe(Utils.isMiniScreen.name, function() {
|
||||
describe(Utils.isMiniScreen.name, function () {
|
||||
it('has no tests yet');
|
||||
});
|
||||
|
||||
describe(Utils.isShowDesktopDragHandles.name, function() {
|
||||
describe(Utils.isShowDesktopDragHandles.name, function () {
|
||||
it('has no tests yet');
|
||||
});
|
||||
|
||||
describe(Utils.isMiniScreenOrShowDesktopDragHandles.name, function() {
|
||||
describe(Utils.isTouchScreenOrShowDesktopDragHandles.name, function () {
|
||||
it('has no tests yet');
|
||||
});
|
||||
|
||||
describe(Utils.calculateIndexData.name, function() {
|
||||
describe(Utils.calculateIndexData.name, function () {
|
||||
it('has no tests yet');
|
||||
});
|
||||
|
||||
describe(Utils.calculateIndex.name, function() {
|
||||
describe(Utils.calculateIndex.name, function () {
|
||||
it('has no tests yet');
|
||||
});
|
||||
|
||||
describe(Utils.manageCustomUI.name, function() {
|
||||
describe(Utils.manageCustomUI.name, function () {
|
||||
it('has no tests yet');
|
||||
});
|
||||
|
||||
describe(Utils.setCustomUI.name, function() {
|
||||
describe(Utils.setCustomUI.name, function () {
|
||||
it('has no tests yet');
|
||||
});
|
||||
|
||||
describe(Utils.setMatomo.name, function() {
|
||||
describe(Utils.setMatomo.name, function () {
|
||||
it('has no tests yet');
|
||||
});
|
||||
|
||||
describe(Utils.manageMatomo.name, function() {
|
||||
describe(Utils.manageMatomo.name, function () {
|
||||
it('has no tests yet');
|
||||
});
|
||||
|
||||
describe(Utils.getTriggerActionDesc.name, function() {
|
||||
describe(Utils.getTriggerActionDesc.name, function () {
|
||||
it('has no tests yet');
|
||||
});
|
||||
});
|
||||
+29
-30
@@ -40,7 +40,7 @@ Utils = {
|
||||
const ret = Cards.findOne(cardId);
|
||||
return ret;
|
||||
},
|
||||
reload () {
|
||||
reload() {
|
||||
// we move all window.location.reload calls into this function
|
||||
// so we can disable it when running tests.
|
||||
// This is because we are not allowed to override location.reload but
|
||||
@@ -201,14 +201,14 @@ Utils = {
|
||||
image = document.createElement('img');
|
||||
const maxSize = options.maxSize || 1024;
|
||||
const ratio = options.ratio || 1.0;
|
||||
const next = function(result) {
|
||||
const next = function (result) {
|
||||
image = null;
|
||||
canvas = null;
|
||||
if (typeof callback === 'function') {
|
||||
callback(result);
|
||||
}
|
||||
};
|
||||
image.onload = function() {
|
||||
image.onload = function () {
|
||||
let width = this.width,
|
||||
height = this.height;
|
||||
let changed = false;
|
||||
@@ -237,7 +237,7 @@ Utils = {
|
||||
next(changed);
|
||||
}
|
||||
};
|
||||
image.onerror = function() {
|
||||
image.onerror = function () {
|
||||
next(false);
|
||||
};
|
||||
image.src = dataurl;
|
||||
@@ -255,36 +255,35 @@ Utils = {
|
||||
isMiniScreen() {
|
||||
// OLD WINDOW WIDTH DETECTION:
|
||||
this.windowResizeDep.depend();
|
||||
return $(window).width() <= 800;
|
||||
return $(window).width() <= 250;
|
||||
},
|
||||
|
||||
isTouchScreen() {
|
||||
|
||||
// NEW TOUCH DEVICE DETECTION:
|
||||
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Browser_detection_using_the_user_agent
|
||||
|
||||
/*
|
||||
var hasTouchScreen = false;
|
||||
if ("maxTouchPoints" in navigator) {
|
||||
hasTouchScreen = navigator.maxTouchPoints > 0;
|
||||
hasTouchScreen = navigator.maxTouchPoints > 0;
|
||||
} else if ("msMaxTouchPoints" in navigator) {
|
||||
hasTouchScreen = navigator.msMaxTouchPoints > 0;
|
||||
hasTouchScreen = navigator.msMaxTouchPoints > 0;
|
||||
} else {
|
||||
var mQ = window.matchMedia && matchMedia("(pointer:coarse)");
|
||||
if (mQ && mQ.media === "(pointer:coarse)") {
|
||||
hasTouchScreen = !!mQ.matches;
|
||||
} else if ('orientation' in window) {
|
||||
hasTouchScreen = true; // deprecated, but good fallback
|
||||
} else {
|
||||
// Only as a last resort, fall back to user agent sniffing
|
||||
var UA = navigator.userAgent;
|
||||
hasTouchScreen = (
|
||||
/\b(BlackBerry|webOS|iPhone|IEMobile)\b/i.test(UA) ||
|
||||
/\b(Android|Windows Phone|iPad|iPod)\b/i.test(UA)
|
||||
);
|
||||
}
|
||||
var mQ = window.matchMedia && matchMedia("(pointer:coarse)");
|
||||
if (mQ && mQ.media === "(pointer:coarse)") {
|
||||
hasTouchScreen = !!mQ.matches;
|
||||
} else if ('orientation' in window) {
|
||||
hasTouchScreen = true; // deprecated, but good fallback
|
||||
} else {
|
||||
// Only as a last resort, fall back to user agent sniffing
|
||||
var UA = navigator.userAgent;
|
||||
hasTouchScreen = (
|
||||
/\b(BlackBerry|webOS|iPhone|IEMobile)\b/i.test(UA) ||
|
||||
/\b(Android|Windows Phone|iPad|iPod)\b/i.test(UA)
|
||||
);
|
||||
}
|
||||
}
|
||||
*/
|
||||
//if (hasTouchScreen)
|
||||
// document.getElementById("exampleButton").style.padding="1em";
|
||||
//return false;
|
||||
return hasTouchScreen;
|
||||
},
|
||||
|
||||
// returns if desktop drag handles are enabled
|
||||
@@ -300,8 +299,8 @@ Utils = {
|
||||
},
|
||||
|
||||
// returns if mini screen or desktop drag handles
|
||||
isMiniScreenOrShowDesktopDragHandles() {
|
||||
return this.isMiniScreen() || this.isShowDesktopDragHandles();
|
||||
isTouchScreenOrShowDesktopDragHandles() {
|
||||
return this.isTouchScreen() || this.isShowDesktopDragHandles();
|
||||
},
|
||||
|
||||
calculateIndexData(prevData, nextData, nItems = 1) {
|
||||
@@ -396,7 +395,7 @@ Utils = {
|
||||
window._paq.push(['trackPageView']);
|
||||
window._paq.push(['enableLinkTracking']);
|
||||
|
||||
(function() {
|
||||
(function () {
|
||||
window._paq.push(['setTrackerUrl', `${data.address}piwik.php`]);
|
||||
window._paq.push(['setSiteId', data.siteId]);
|
||||
|
||||
@@ -500,8 +499,8 @@ Utils = {
|
||||
copyTextToClipboard(text) {
|
||||
let ret;
|
||||
if (navigator.clipboard) {
|
||||
ret = navigator.clipboard.writeText(text).then(function() {
|
||||
}, function(err) {
|
||||
ret = navigator.clipboard.writeText(text).then(function () {
|
||||
}, function (err) {
|
||||
console.error('Async: Could not copy text: ', err);
|
||||
});
|
||||
} else {
|
||||
|
||||
+35
-5
@@ -5,6 +5,16 @@ const emailField = AccountsTemplates.removeField('email');
|
||||
let disableRegistration = false;
|
||||
let disableForgotPassword = false;
|
||||
let passwordLoginDisabled = false;
|
||||
let oidcRedirectionEnabled = false;
|
||||
let oauthServerUrl = "home";
|
||||
let oauthDashboardUrl = "";
|
||||
|
||||
Meteor.call('isOidcRedirectionEnabled', (_, result) => {
|
||||
if(result)
|
||||
{
|
||||
oidcRedirectionEnabled = true;
|
||||
}
|
||||
});
|
||||
|
||||
Meteor.call('isPasswordLoginDisabled', (_, result) => {
|
||||
if (result) {
|
||||
@@ -14,6 +24,18 @@ Meteor.call('isPasswordLoginDisabled', (_, result) => {
|
||||
}
|
||||
});
|
||||
|
||||
Meteor.call('getOauthServerUrl', (_, result) => {
|
||||
if (result) {
|
||||
oauthServerUrl = result;
|
||||
}
|
||||
});
|
||||
|
||||
Meteor.call('getOauthDashboardUrl', (_, result) => {
|
||||
if (result) {
|
||||
oauthDashboardUrl = result;
|
||||
}
|
||||
});
|
||||
|
||||
Meteor.call('isDisableRegistration', (_, result) => {
|
||||
if (result) {
|
||||
disableRegistration = true;
|
||||
@@ -59,11 +81,19 @@ AccountsTemplates.configure({
|
||||
showForgotPasswordLink: !disableForgotPassword,
|
||||
forbidClientAccountCreation: disableRegistration,
|
||||
onLogoutHook() {
|
||||
const homePage = 'home';
|
||||
if (FlowRouter.getRouteName() === homePage) {
|
||||
FlowRouter.reload();
|
||||
} else {
|
||||
FlowRouter.go(homePage);
|
||||
// here comeslogic for redirect
|
||||
if(oidcRedirectionEnabled)
|
||||
{
|
||||
window.location = oauthServerUrl + oauthDashboardUrl;
|
||||
}
|
||||
else
|
||||
{
|
||||
const homePage = 'home';
|
||||
if (FlowRouter.getRouteName() === homePage) {
|
||||
FlowRouter.reload();
|
||||
} else {
|
||||
FlowRouter.go(homePage);
|
||||
}
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
@@ -127,6 +127,13 @@ services:
|
||||
# image: wekanteam/wekan
|
||||
#-------------------------------------------------------------------------------------
|
||||
container_name: wekan-app
|
||||
# On CentOS 7 there is seccomp issue with glibc 6,
|
||||
# so CentOS 7 users shoud use these security_opt seccomp:unconfined
|
||||
# settings to get WeKan working. See:
|
||||
# - https://github.com/wekan/wekan/issues/4585
|
||||
# - https://github.com/wekan/wekan/issues/4587
|
||||
#security_opt:
|
||||
# - seccomp:unconfined
|
||||
restart: always
|
||||
networks:
|
||||
- wekan-tier
|
||||
@@ -260,6 +267,16 @@ services:
|
||||
# https://github.com/wekan/wekan/issues/2518
|
||||
- CARD_OPENED_WEBHOOK_ENABLED=false
|
||||
#---------------------------------------------------------------
|
||||
# ==== Allow configuration to validate uploaded attachments ====
|
||||
#-ATTACHMENTS_UPLOAD_EXTERNAL_PROGRAM=/usr/local/bin/avscan {file}
|
||||
#-ATTACHMENTS_UPLOAD_MIME_TYPES=image/*,text/*
|
||||
#-ATTACHMENTS_UPLOAD_MAX_SIZE=5000000
|
||||
#---------------------------------------------------------------
|
||||
# ==== Allow configuration to validate uploaded avatars ====
|
||||
#-AVATARS_UPLOAD_EXTERNAL_PROGRAM=/usr/local/bin/avscan {file}
|
||||
#-AVATARS_UPLOAD_MIME_TYPES=image/*
|
||||
#-AVATARS_UPLOAD_MAX_SIZE=500000
|
||||
#---------------------------------------------------------------
|
||||
# ==== Allow to shrink attached/pasted image ====
|
||||
# https://github.com/wekan/wekan/pull/2544
|
||||
#-MAX_IMAGE_PIXEL=1024
|
||||
@@ -336,6 +353,10 @@ services:
|
||||
#-----------------------------------------------------------------
|
||||
# ==== Debug OIDC OAuth2 etc ====
|
||||
#- DEBUG=true
|
||||
#---------------------------------------------
|
||||
# ==== AUTOLOGIN WITH OIDC/OAUTH2 ====
|
||||
# https://github.com/wekan/wekan/wiki/autologin
|
||||
#- OIDC_REDIRECTION_ENABLED=true
|
||||
#-----------------------------------------------------------------
|
||||
# ==== OAUTH2 ORACLE on premise identity manager OIM ====
|
||||
#- ORACLE_OIM_ENABLED=true
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
apiVersion: v2
|
||||
appVersion: "6.26"
|
||||
appVersion: "6.45"
|
||||
dependencies:
|
||||
- condition: mongodb.enabled
|
||||
name: mongodb
|
||||
|
||||
@@ -14,7 +14,7 @@ serviceAccounts:
|
||||
##
|
||||
image:
|
||||
repository: quay.io/wekan/wekan
|
||||
tag: v6.26
|
||||
tag: v6.45
|
||||
pullPolicy: IfNotPresent
|
||||
|
||||
## Configuration for wekan component
|
||||
|
||||
File diff suppressed because it is too large.
Load diff
@@ -295,9 +295,9 @@
|
||||
"linkCardPopup-title": "Link Card",
|
||||
"searchElementPopup-title": "Search",
|
||||
"copyCardPopup-title": "Copy Card",
|
||||
"copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
|
||||
"copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
|
||||
"copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
|
||||
"copyManyCardsPopup-title": "Copy Template to Many Cards",
|
||||
"copyManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
|
||||
"copyManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
|
||||
"create": "Create",
|
||||
"createBoardPopup-title": "Create Board",
|
||||
"chooseBoardSourcePopup-title": "Import board",
|
||||
@@ -512,7 +512,7 @@
|
||||
"normal": "Normal",
|
||||
"normal-desc": "Can view and edit cards. Can't change settings.",
|
||||
"not-accepted-yet": "Invitation not accepted yet",
|
||||
"notify-participate": "Receive updates to any cards you participate as creater or member",
|
||||
"notify-participate": "Receive updates to any cards you participate as creator or member",
|
||||
"notify-watch": "Receive updates to any boards, lists, or cards you’re watching",
|
||||
"optional": "optional",
|
||||
"or": "or",
|
||||
@@ -541,6 +541,9 @@
|
||||
"rename": "Rename",
|
||||
"rename-board": "Rename Board",
|
||||
"restore": "Restore",
|
||||
"rescue-card-description": "Show rescue dialogue before closing for unsaved card descriptions",
|
||||
"rescue-card-description-dialogue": "Overwrite current card description with your changes?",
|
||||
"card-settings": "Card Settings",
|
||||
"save": "Save",
|
||||
"search": "Search",
|
||||
"rules": "Rules",
|
||||
@@ -594,6 +597,7 @@
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
"custom-login-logo-image-url": "Custom Login Logo Image URL",
|
||||
"custom-login-logo-link-url": "Custom Login Logo Link URL",
|
||||
"custom-help-link-url": "Custom Help Link URL",
|
||||
"text-below-custom-login-logo": "Text below Custom Login Logo",
|
||||
"automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line",
|
||||
"username": "Username",
|
||||
@@ -706,7 +710,6 @@
|
||||
"default": "Default",
|
||||
"queue": "Queue",
|
||||
"subtask-settings": "Subtasks Settings",
|
||||
"card-settings": "Card Settings",
|
||||
"minicard-settings": "Minicard Settings",
|
||||
"boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
|
||||
"boardCardSettingsPopup-title": "Card Settings",
|
||||
@@ -901,6 +904,7 @@
|
||||
"editUserPopup-title": "Edit User",
|
||||
"newUserPopup-title": "New User",
|
||||
"notifications": "Notifications",
|
||||
"help": "Help",
|
||||
"view-all": "View All",
|
||||
"filter-by-unread": "Filter by Unread",
|
||||
"mark-all-as-read": "Mark all as read",
|
||||
@@ -1177,5 +1181,13 @@
|
||||
"storage": "Storage",
|
||||
"action": "Action",
|
||||
"board-title": "Board Title",
|
||||
"attachmentRenamePopup-title": "Rename"
|
||||
"attachmentRenamePopup-title": "Rename",
|
||||
"uploading": "Uploading",
|
||||
"remaining_time": "Remaining time",
|
||||
"speed": "Speed",
|
||||
"progress": "Progress",
|
||||
"password-again": "Password (again)",
|
||||
"if-you-already-have-an-account": "If you already have an account",
|
||||
"register": "Register",
|
||||
"forgot-password": "Forgot password"
|
||||
}
|
||||
@@ -1,41 +1,41 @@
|
||||
{
|
||||
"accept": "قبول",
|
||||
"act-activity-notify": "اشعار النشاط",
|
||||
"act-addAttachment": "added attachment __attachment__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"act-deleteAttachment": "deleted attachment __attachment__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"act-addSubtask": "added subtask __subtask__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"act-addLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"act-addedLabel": "Added label __label__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"act-removeLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"act-removedLabel": "Removed label __label__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"act-addChecklist": "added checklist __checklist__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"act-addChecklistItem": "added checklist item __checklistItem__ to checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"act-removeChecklist": "removed checklist __checklist__ from card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"act-removeChecklistItem": "removed checklist item __checklistItem__ from checklist __checkList__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"act-checkedItem": "checked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"act-uncheckedItem": "unchecked __checklistItem__ of checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"act-completeChecklist": "completed checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"act-uncompleteChecklist": "uncompleted checklist __checklist__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"act-addComment": "commented on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"act-editComment": "edited comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"act-deleteComment": "deleted comment on card __card__: __comment__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"act-createBoard": "created board __board__",
|
||||
"act-createSwimlane": "created swimlane __swimlane__ to board __board__",
|
||||
"act-createCard": "created card __card__ to list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"act-createCustomField": "created custom field __customField__ at board __board__",
|
||||
"act-deleteCustomField": "deleted custom field __customField__ at board __board__",
|
||||
"act-setCustomField": "edited custom field __customField__: __customFieldValue__ at card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"act-createList": "added list __list__ to board __board__",
|
||||
"act-addBoardMember": "added member __member__ to board __board__",
|
||||
"act-archivedBoard": "Board __board__ moved to Archive",
|
||||
"act-archivedCard": "Card __card__ at list __list__ at swimlane __swimlane__ at board __board__ moved to Archive",
|
||||
"act-archivedList": "List __list__ at swimlane __swimlane__ at board __board__ moved to Archive",
|
||||
"act-archivedSwimlane": "Swimlane __swimlane__ at board __board__ moved to Archive",
|
||||
"act-importBoard": "imported board __board__",
|
||||
"act-importCard": "imported card __card__ to list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"act-importList": "imported list __list__ to swimlane __swimlane__ at board __board__",
|
||||
"act-joinMember": "added member __member__ to card __card__ at list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"act-moveCard": "moved card __card__ at board __board__ from list __oldList__ at swimlane __oldSwimlane__ to list __list__ at swimlane __swimlane__",
|
||||
"act-addAttachment": "ماتمت اضافتة__اضافة_للكرت\n__الكرت__في قائمة__قائمة__في المنطقة العائمة \n__المنطقة العائمة__في اللوح__اللوح__",
|
||||
"act-deleteAttachment": "حذف الاضافة__الاضافة__في كرت\n__كرت__في قائمة__قائمة__في المنطقة العائمة\n__المنطقة العائمة__في اللوح__اللوح__",
|
||||
"act-addSubtask": "مهمة فرعية مضافة__مهمة فرعية__ للكرت\n__الكرت__في قائمة__قائمة__في المنطقة العائمة\n__المنطقة العائمة__في اللوح__اللوح__",
|
||||
"act-addLabel": "العلامة المضافة__العلامة__للكرت__كرت__في قائمة__القائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__",
|
||||
"act-addedLabel": "العلامة المضافة__العلامة__للكرت__كرت__في قائمة__القائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__",
|
||||
"act-removeLabel": "العلامة المحذوفة__العلامة__من الكرت__في قائمة__القائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__",
|
||||
"act-removedLabel": "العلامة المحذوفة__العلامة__من الكرت__في قائمة__القائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__",
|
||||
"act-addChecklist": "قائمة التأكد المضافة__قائمة التأكد__للكرت__كرت__في قائمة__قائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__",
|
||||
"act-addChecklistItem": "عنصر قائمة التأكد المضافة__عنصر قائمة التأكد__لقائمة التأكد__قائمة التأكد__لكرت__الكرت__في قائمة__القائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__",
|
||||
"act-removeChecklist": " قائمة التأكد المحذوفة__عنصر قائمة التأكد__لقائمة التأكد__قائمة التأكد__لكرت__الكرت__في قائمة__القائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__",
|
||||
"act-removeChecklistItem": "عنصر قائمة التأكد المحذوف__عنصر قائمة التأكد__لقائمة التأكد__قائمة التأكد__لكرت__الكرت__في قائمة__القائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__",
|
||||
"act-checkedItem": "مختار__عنصر قائمة التأكد__لقائمة التأكد__قائمة التأكد__ لكرت__الكرت__في قائمة__القائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__",
|
||||
"act-uncheckedItem": "غير مختار__عنصر قائمة التأكد__لقائمة التأكد__قائمة التأكد__ لكرت__الكرت__في قائمة__القائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__",
|
||||
"act-completeChecklist": "قائمة تأكد مكتملة__عنصر قائمة التأكد__لقائمة التأكد__قائمة التأكد__ لكرت__الكرت__في قائمة__القائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__",
|
||||
"act-uncompleteChecklist": "قائمة تأكد غير مكتملة__عنصر قائمة التأكد__لقائمة التأكد__قائمة التأكد__ لكرت__الكرت__في قائمة__القائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__",
|
||||
"act-addComment": "تعليق على كرت__كرت__:\n__تعليق__في قائمة__قائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__",
|
||||
"act-editComment": "تعليق معدل على كرت__كرت__:\n__تعليق__في قائمة__قائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__",
|
||||
"act-deleteComment": "تعليق محذوف على كرت__كرت__:\n__تعليق__في قائمة__قائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__",
|
||||
"act-createBoard": "لوح مكون__لوح__",
|
||||
"act-createSwimlane": "منطقة عائمة مكونة__منطقة عائمة__في اللوح__اللوح__",
|
||||
"act-createCard": "كرت مكون__كرت__في قائمة__قائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__",
|
||||
"act-createCustomField": "مجال مخصوص مكون__مجال مخصوص__في اللوح__اللوح__",
|
||||
"act-deleteCustomField": "مجال مخصوص محذوف__مجال مخصوص__في اللوح__اللوح__",
|
||||
"act-setCustomField": "مجال مخصوص معدل__مجال مخصوص__:__قيمة مجال مخصوص__للكرت_الكرت__في قائمة__القائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__",
|
||||
"act-createList": "قائمة مضافة__قائمة__ في اللوح __اللوح__",
|
||||
"act-addBoardMember": "عضو مضاف__عضو__في اللوح__اللوح__",
|
||||
"act-archivedBoard": "اللوح__اللوح__منقول الى الارشيف",
|
||||
"act-archivedCard": "الكرت__الكرت__في قائمة__القائمة__في المنطقة العائمة__المنطقة العائمة__في قائمة__القائمة__ منقول الى الارشيف",
|
||||
"act-archivedList": "القائمة__القائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__ منقول الى الارشيف",
|
||||
"act-archivedSwimlane": "المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__ منقول الى الارشيف",
|
||||
"act-importBoard": "اللوح المستورد__اللوح__",
|
||||
"act-importCard": "الكرت المستورد__الكرت__في القائمة__القائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__",
|
||||
"act-importList": " القائمة المستوردة__القائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__",
|
||||
"act-joinMember": "العضو المضاف__العضو__للكرت_الكرت__في قائمة__القائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__",
|
||||
"act-moveCard": "الكرت المحذوف__الكرت__في اللوح_اللوح__من قائمة__قائمة قديمة__في المنطقة العائمة__منطقة عائمة قديمة__في القائمة__القائمة__في المنطقة العائمة__المنطقة العائمة__",
|
||||
"act-moveCardToOtherBoard": "moved card __card__ from list __oldList__ at swimlane __oldSwimlane__ at board __oldBoard__ to list __list__ at swimlane __swimlane__ at board __board__",
|
||||
"act-removeBoardMember": "removed member __member__ from board __board__",
|
||||
"act-restoredCard": "restored card __card__ to list __list__ at swimlane __swimlane__ at board __board__",
|
||||
@@ -71,7 +71,7 @@
|
||||
"add": "أضف",
|
||||
"activity-checked-item-card": "checked %s in checklist %s",
|
||||
"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-completed-card": "قائمة تأكد مكتماة__عنصر قائمة التأكد__لقائمة التأكد__قائمة التأكد__ لكرت__الكرت__في قائمة__القائمة__في المنطقة العائمة__المنطقة العائمة__في اللوح__اللوح__",
|
||||
"activity-checklist-uncompleted-card": "uncompleted the checklist %s",
|
||||
"activity-editComment": "edited comment %s",
|
||||
"activity-deleteComment": "تعليق محذوف %s",
|
||||
@@ -107,7 +107,7 @@
|
||||
"and-n-other-card_plural": "And __count__ other بطاقات",
|
||||
"apply": "طبق",
|
||||
"app-is-offline": "Loading, please wait. Refreshing the page will cause data loss. If loading does not work, please check that server has not stopped.",
|
||||
"app-try-reconnect": "Try to reconnect.",
|
||||
"app-try-reconnect": "محاولة إعادة الاتصال.",
|
||||
"archive": "نقل الى الارشيف",
|
||||
"archive-all": "نقل الكل الى الارشيف",
|
||||
"archive-board": "نقل اللوح الى الارشيف",
|
||||
@@ -136,9 +136,9 @@
|
||||
"back": "رجوع",
|
||||
"board-change-color": "تغيير اللومr",
|
||||
"show-at-all-boards-page": "Show at All Boards page",
|
||||
"board-info-on-my-boards": "All Boards Settings",
|
||||
"boardInfoOnMyBoardsPopup-title": "All Boards Settings",
|
||||
"boardInfoOnMyBoards-title": "All Boards Settings",
|
||||
"board-info-on-my-boards": "جميع إعدادات اللوحات",
|
||||
"boardInfoOnMyBoardsPopup-title": "جميع إعدادات اللوحات",
|
||||
"boardInfoOnMyBoards-title": "جميع إعدادات اللوحات",
|
||||
"show-card-counter-per-list": "Show card count per list",
|
||||
"show-board_members-avatar": "Show Board members avatars",
|
||||
"board-nb-stars": "%s نجوم",
|
||||
@@ -150,13 +150,13 @@
|
||||
"boardChangeTitlePopup-title": "إعادة تسمية اللوحة",
|
||||
"boardChangeVisibilityPopup-title": "تعديل وضوح الرؤية",
|
||||
"boardChangeWatchPopup-title": "تغيير المتابعة",
|
||||
"boardMenuPopup-title": "Board Settings",
|
||||
"boardMenuPopup-title": "إعدادات اللوحة",
|
||||
"boardChangeViewPopup-title": "عرض اللوحات",
|
||||
"boards": "لوحات",
|
||||
"board-view": "عرض اللوحات",
|
||||
"board-view-cal": "التقويم",
|
||||
"board-view-swimlanes": "خطوط السباحة",
|
||||
"board-view-collapse": "Collapse",
|
||||
"board-view-collapse": "انهيار",
|
||||
"board-view-gantt": "Gantt",
|
||||
"board-view-lists": "القائمات",
|
||||
"bucket-example": "مثل « todo list » على سبيل المثال",
|
||||
@@ -193,7 +193,7 @@
|
||||
"vote-public": "Show who voted what",
|
||||
"vote-for-it": "مع",
|
||||
"vote-against": "ضد",
|
||||
"deleteVotePopup-title": "Delete vote?",
|
||||
"deleteVotePopup-title": "حذف التصويت؟",
|
||||
"vote-delete-pop": "Deleting is permanent. You will lose all actions associated with this vote.",
|
||||
"cardStartPlanningPokerPopup-title": "Start a Planning Poker",
|
||||
"card-edit-planning-poker": "Edit Planning Poker",
|
||||
@@ -208,10 +208,10 @@
|
||||
"poker-twenty": "20",
|
||||
"poker-forty": "40",
|
||||
"poker-oneHundred": "100",
|
||||
"poker-unsure": "?",
|
||||
"poker-unsure": "؟",
|
||||
"poker-finish": "Finish",
|
||||
"poker-result-votes": "Votes",
|
||||
"poker-result-who": "Who",
|
||||
"poker-result-votes": "الأصوات",
|
||||
"poker-result-who": "من",
|
||||
"poker-replay": "Replay",
|
||||
"set-estimation": "Set Estimation",
|
||||
"deletePokerPopup-title": "Delete planning poker?",
|
||||
@@ -274,7 +274,7 @@
|
||||
"color-slateblue": "slateblue",
|
||||
"color-white": "أبيض",
|
||||
"color-yellow": "yellow",
|
||||
"unset-color": "Unset",
|
||||
"unset-color": "غير محدد",
|
||||
"comment": "تعليق",
|
||||
"comment-placeholder": "أكتب تعليق",
|
||||
"comment-only": "التعليق فقط",
|
||||
@@ -283,7 +283,7 @@
|
||||
"deleteCommentPopup-title": "Delete comment?",
|
||||
"no-comments": "لا يوجد تعليقات",
|
||||
"no-comments-desc": "Can not see comments and activities.",
|
||||
"worker": "Worker",
|
||||
"worker": "عامل",
|
||||
"worker-desc": "Can only move cards, assign itself to card and comment.",
|
||||
"computer": "حاسوب",
|
||||
"confirm-subtask-delete-popup": "Are you sure you want to delete subtask?",
|
||||
@@ -295,9 +295,9 @@
|
||||
"linkCardPopup-title": "ربط البطاقة",
|
||||
"searchElementPopup-title": "بحث",
|
||||
"copyCardPopup-title": "نسخ البطاقة",
|
||||
"copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
|
||||
"copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
|
||||
"copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
|
||||
"copyManyCardsPopup-title": "Copy Template to Many Cards",
|
||||
"copyManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
|
||||
"copyManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
|
||||
"create": "إنشاء",
|
||||
"createBoardPopup-title": "إنشاء لوحة",
|
||||
"chooseBoardSourcePopup-title": "استيراد لوحة",
|
||||
@@ -307,7 +307,7 @@
|
||||
"current": "الحالي",
|
||||
"custom-field-delete-pop": "There is no undo. This will remove this custom field from all cards and destroy its history.",
|
||||
"custom-field-checkbox": "Checkbox",
|
||||
"custom-field-currency": "Currency",
|
||||
"custom-field-currency": "عملة",
|
||||
"custom-field-currency-option": "Currency Code",
|
||||
"custom-field-date": "تاريخ",
|
||||
"custom-field-dropdown": "Dropdown List",
|
||||
@@ -512,7 +512,7 @@
|
||||
"normal": "عادي",
|
||||
"normal-desc": "يمكن مشاهدة و تعديل البطاقات. لا يمكن تغيير إعدادات الضبط.",
|
||||
"not-accepted-yet": "Invitation not accepted yet",
|
||||
"notify-participate": "Receive updates to any cards you participate as creater or member",
|
||||
"notify-participate": "Receive updates to any cards you participate as creator or member",
|
||||
"notify-watch": "Receive updates to any boards, lists, or cards you’re watching",
|
||||
"optional": "اختياري",
|
||||
"or": "or",
|
||||
@@ -541,9 +541,12 @@
|
||||
"rename": "إعادة التسمية",
|
||||
"rename-board": "إعادة تسمية اللوحة",
|
||||
"restore": "استعادة",
|
||||
"rescue-card-description": "Show rescue dialogue before closing for unsaved card descriptions",
|
||||
"rescue-card-description-dialogue": "Overwrite current card description with your changes?",
|
||||
"card-settings": "Card Settings",
|
||||
"save": "حفظ",
|
||||
"search": "بحث",
|
||||
"rules": "Rules",
|
||||
"rules": "قواعد",
|
||||
"search-cards": "Search from card/list titles, descriptions and custom fields on this board",
|
||||
"search-example": "Write text you search and press Enter",
|
||||
"select-color": "اختيار اللون",
|
||||
@@ -594,6 +597,7 @@
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
"custom-login-logo-image-url": "Custom Login Logo Image URL",
|
||||
"custom-login-logo-link-url": "Custom Login Logo Link URL",
|
||||
"custom-help-link-url": "Custom Help Link URL",
|
||||
"text-below-custom-login-logo": "Text below Custom Login Logo",
|
||||
"automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line",
|
||||
"username": "اسم المستخدم",
|
||||
@@ -706,7 +710,6 @@
|
||||
"default": "Default",
|
||||
"queue": "Queue",
|
||||
"subtask-settings": "Subtasks Settings",
|
||||
"card-settings": "Card Settings",
|
||||
"minicard-settings": "Minicard Settings",
|
||||
"boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
|
||||
"boardCardSettingsPopup-title": "Card Settings",
|
||||
@@ -832,14 +835,14 @@
|
||||
"r-checklist-note": "Note: checklist's items have to be written as comma separated values.",
|
||||
"r-when-a-card-is-moved": "When a card is moved to another list",
|
||||
"r-set": "Set",
|
||||
"r-update": "Update",
|
||||
"r-update": "تحديث",
|
||||
"r-datefield": "date field",
|
||||
"r-df-start-at": "بداية",
|
||||
"r-df-due-at": "due",
|
||||
"r-df-end-at": "نهاية",
|
||||
"r-df-received-at": "received",
|
||||
"r-to-current-datetime": "to current date/time",
|
||||
"r-remove-value-from": "Remove value from",
|
||||
"r-remove-value-from": "إزالة القيمة من",
|
||||
"ldap": "LDAP",
|
||||
"oauth2": "OAuth2",
|
||||
"cas": "CAS",
|
||||
@@ -862,9 +865,9 @@
|
||||
"swimlaneDeletePopup-title": "Delete Swimlane ?",
|
||||
"swimlane-delete-pop": "All actions will be removed from the activity feed and you won't be able to recover the swimlane. There is no undo.",
|
||||
"restore-all": "Restore all",
|
||||
"delete-all": "Delete all",
|
||||
"delete-all": "حذف الكل",
|
||||
"loading": "Loading, please wait.",
|
||||
"previous_as": "last time was",
|
||||
"previous_as": "كانت آخر مرة",
|
||||
"act-a-dueAt": "modified due time to \nWhen: __timeValue__\nWhere: __card__\n previous due was __timeOldValue__",
|
||||
"act-a-endAt": "modified ending time to __timeValue__ from (__timeOldValue__)",
|
||||
"act-a-startAt": "modified starting time to __timeValue__ from (__timeOldValue__)",
|
||||
@@ -893,14 +896,15 @@
|
||||
"addmore-detail": "Add a more detailed description",
|
||||
"show-on-card": "Show on Card",
|
||||
"show-on-minicard": "Show on Minicard",
|
||||
"new": "New",
|
||||
"new": "جديد",
|
||||
"editOrgPopup-title": "Edit Organization",
|
||||
"newOrgPopup-title": "New Organization",
|
||||
"editTeamPopup-title": "Edit Team",
|
||||
"newTeamPopup-title": "New Team",
|
||||
"editUserPopup-title": "Edit User",
|
||||
"newUserPopup-title": "New User",
|
||||
"newUserPopup-title": "مستخدم جديد",
|
||||
"notifications": "Notifications",
|
||||
"help": "Help",
|
||||
"view-all": "View All",
|
||||
"filter-by-unread": "Filter by Unread",
|
||||
"mark-all-as-read": "Mark all as read",
|
||||
@@ -909,18 +913,18 @@
|
||||
"allowRenamePopup-title": "Allow Rename",
|
||||
"start-day-of-week": "Set day of the week start",
|
||||
"monday": "Monday",
|
||||
"tuesday": "Tuesday",
|
||||
"tuesday": "الثلاثاء",
|
||||
"wednesday": "Wednesday",
|
||||
"thursday": "Thursday",
|
||||
"thursday": "الخميس",
|
||||
"friday": "Friday",
|
||||
"saturday": "Saturday",
|
||||
"saturday": "السبت",
|
||||
"sunday": "Sunday",
|
||||
"status": "Status",
|
||||
"swimlane": "Swimlane",
|
||||
"owner": "Owner",
|
||||
"last-modified-at": "Last modified at",
|
||||
"last-activity": "Last activity",
|
||||
"voting": "Voting",
|
||||
"voting": "التصويت",
|
||||
"archived": "Archived",
|
||||
"delete-linked-card-before-this-card": "You can not delete this card before first deleting linked card that has",
|
||||
"delete-linked-cards-before-this-list": "You can not delete this list before first deleting linked cards that are pointing to cards in this list",
|
||||
@@ -932,8 +936,8 @@
|
||||
"teams": "Teams",
|
||||
"displayName": "Display Name",
|
||||
"shortName": "Short Name",
|
||||
"website": "Website",
|
||||
"person": "Person",
|
||||
"website": "موقع الكتروني",
|
||||
"person": "شخص",
|
||||
"my-cards": "My Cards",
|
||||
"card": "بطاقة",
|
||||
"board": "Board",
|
||||
@@ -968,7 +972,7 @@
|
||||
"n-cards-found": "%s Cards Found",
|
||||
"n-n-of-n-cards-found": "__start__-__end__ of __total__ Cards Found",
|
||||
"operator-board": "لوح",
|
||||
"operator-board-abbrev": "b",
|
||||
"operator-board-abbrev": "ب",
|
||||
"operator-swimlane": "swimlane",
|
||||
"operator-swimlane-abbrev": "s",
|
||||
"operator-list": "قائمة",
|
||||
@@ -987,7 +991,7 @@
|
||||
"operator-created": "created",
|
||||
"operator-modified": "modified",
|
||||
"operator-sort": "sort",
|
||||
"operator-comment": "comment",
|
||||
"operator-comment": "تعليق",
|
||||
"operator-has": "has",
|
||||
"operator-limit": "limit",
|
||||
"operator-debug": "debug",
|
||||
@@ -1114,12 +1118,12 @@
|
||||
"open": "مفتوح",
|
||||
"pending": "Pending",
|
||||
"closed": "مقفل",
|
||||
"resolved": "Resolved",
|
||||
"resolved": "تم الحل",
|
||||
"cancelled": "الغاء",
|
||||
"history": "تاريخ",
|
||||
"request": "Request",
|
||||
"requests": "Requests",
|
||||
"help-request": "Help Request",
|
||||
"request": "طلب",
|
||||
"requests": "الطلبات",
|
||||
"help-request": "طلب مساعدة",
|
||||
"editCardSortOrderPopup-title": "Change Sorting",
|
||||
"cardDetailsPopup-title": "نقاصيل البطاقة",
|
||||
"add-teams": "اضافة فرق",
|
||||
@@ -1177,5 +1181,13 @@
|
||||
"storage": "Storage",
|
||||
"action": "Action",
|
||||
"board-title": "عنوان اللوح",
|
||||
"attachmentRenamePopup-title": "إعادة التسمية"
|
||||
"attachmentRenamePopup-title": "إعادة التسمية",
|
||||
"uploading": "Uploading",
|
||||
"remaining_time": "Remaining time",
|
||||
"speed": "Speed",
|
||||
"progress": "Progress",
|
||||
"password-again": "Password (again)",
|
||||
"if-you-already-have-an-account": "If you already have an account",
|
||||
"register": "Register",
|
||||
"forgot-password": "Forgot password"
|
||||
}
|
||||
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
File diff suppressed because it is too large.
Load diff
@@ -295,9 +295,9 @@
|
||||
"linkCardPopup-title": "Свържи картата",
|
||||
"searchElementPopup-title": "Търсене",
|
||||
"copyCardPopup-title": "Копирай картата",
|
||||
"copyChecklistToManyCardsPopup-title": "Копирай чеклисти в други карти",
|
||||
"copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
|
||||
"copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
|
||||
"copyManyCardsPopup-title": "Copy Template to Many Cards",
|
||||
"copyManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
|
||||
"copyManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
|
||||
"create": "Създай",
|
||||
"createBoardPopup-title": "Създай Табло",
|
||||
"chooseBoardSourcePopup-title": "Импортирай Табло",
|
||||
@@ -512,7 +512,7 @@
|
||||
"normal": "Нормално",
|
||||
"normal-desc": "Can view and edit cards. Can't change settings.",
|
||||
"not-accepted-yet": "Invitation not accepted yet",
|
||||
"notify-participate": "Получавате информация за всички карти, в които сте отбелязани или сте създали",
|
||||
"notify-participate": "Receive updates to any cards you participate as creator or member",
|
||||
"notify-watch": "Получавате информация за всички табла, списъци и карти, които наблюдавате",
|
||||
"optional": "не е задължително",
|
||||
"or": "или",
|
||||
@@ -541,6 +541,9 @@
|
||||
"rename": "Преименуване",
|
||||
"rename-board": "Промени името на Таблото",
|
||||
"restore": "Възстанови",
|
||||
"rescue-card-description": "Show rescue dialogue before closing for unsaved card descriptions",
|
||||
"rescue-card-description-dialogue": "Overwrite current card description with your changes?",
|
||||
"card-settings": "Настройки на Карта",
|
||||
"save": "Запази",
|
||||
"search": "Търсене",
|
||||
"rules": "Правила",
|
||||
@@ -594,6 +597,7 @@
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
"custom-login-logo-image-url": "Custom Login Logo Image URL",
|
||||
"custom-login-logo-link-url": "Custom Login Logo Link URL",
|
||||
"custom-help-link-url": "Custom Help Link URL",
|
||||
"text-below-custom-login-logo": "Text below Custom Login Logo",
|
||||
"automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line",
|
||||
"username": "Потребителско име",
|
||||
@@ -706,7 +710,6 @@
|
||||
"default": "по подразбиране",
|
||||
"queue": "Опашка",
|
||||
"subtask-settings": "Настройки на Подзадачите",
|
||||
"card-settings": "Настройки на Карта",
|
||||
"minicard-settings": "Minicard Settings",
|
||||
"boardSubtaskSettingsPopup-title": "Настройки за Подзадачите за това Табло",
|
||||
"boardCardSettingsPopup-title": "Настройки на Карта",
|
||||
@@ -901,6 +904,7 @@
|
||||
"editUserPopup-title": "Edit User",
|
||||
"newUserPopup-title": "New User",
|
||||
"notifications": "Уведомления",
|
||||
"help": "Help",
|
||||
"view-all": "View All",
|
||||
"filter-by-unread": "Filter by Unread",
|
||||
"mark-all-as-read": "Mark all as read",
|
||||
@@ -1177,5 +1181,13 @@
|
||||
"storage": "Storage",
|
||||
"action": "Действие",
|
||||
"board-title": "Board Title",
|
||||
"attachmentRenamePopup-title": "Преименуване"
|
||||
"attachmentRenamePopup-title": "Преименуване",
|
||||
"uploading": "Uploading",
|
||||
"remaining_time": "Remaining time",
|
||||
"speed": "Speed",
|
||||
"progress": "Progress",
|
||||
"password-again": "Password (again)",
|
||||
"if-you-already-have-an-account": "If you already have an account",
|
||||
"register": "Register",
|
||||
"forgot-password": "Forgot password"
|
||||
}
|
||||
@@ -295,9 +295,9 @@
|
||||
"linkCardPopup-title": "Link Card",
|
||||
"searchElementPopup-title": "Search",
|
||||
"copyCardPopup-title": "Copy Card",
|
||||
"copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
|
||||
"copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
|
||||
"copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
|
||||
"copyManyCardsPopup-title": "Copy Template to Many Cards",
|
||||
"copyManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
|
||||
"copyManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
|
||||
"create": "Krouiñ",
|
||||
"createBoardPopup-title": "Create Board",
|
||||
"chooseBoardSourcePopup-title": "Import board",
|
||||
@@ -512,7 +512,7 @@
|
||||
"normal": "Normal",
|
||||
"normal-desc": "Can view and edit cards. Can't change settings.",
|
||||
"not-accepted-yet": "Invitation not accepted yet",
|
||||
"notify-participate": "Receive updates to any cards you participate as creater or member",
|
||||
"notify-participate": "Receive updates to any cards you participate as creator or member",
|
||||
"notify-watch": "Receive updates to any boards, lists, or cards you’re watching",
|
||||
"optional": "optional",
|
||||
"or": "or",
|
||||
@@ -541,6 +541,9 @@
|
||||
"rename": "Rename",
|
||||
"rename-board": "Rename Board",
|
||||
"restore": "Restore",
|
||||
"rescue-card-description": "Show rescue dialogue before closing for unsaved card descriptions",
|
||||
"rescue-card-description-dialogue": "Overwrite current card description with your changes?",
|
||||
"card-settings": "Card Settings",
|
||||
"save": "Save",
|
||||
"search": "Search",
|
||||
"rules": "Rules",
|
||||
@@ -594,6 +597,7 @@
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
"custom-login-logo-image-url": "Custom Login Logo Image URL",
|
||||
"custom-login-logo-link-url": "Custom Login Logo Link URL",
|
||||
"custom-help-link-url": "Custom Help Link URL",
|
||||
"text-below-custom-login-logo": "Text below Custom Login Logo",
|
||||
"automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line",
|
||||
"username": "Username",
|
||||
@@ -706,7 +710,6 @@
|
||||
"default": "Default",
|
||||
"queue": "Queue",
|
||||
"subtask-settings": "Subtasks Settings",
|
||||
"card-settings": "Card Settings",
|
||||
"minicard-settings": "Minicard Settings",
|
||||
"boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
|
||||
"boardCardSettingsPopup-title": "Card Settings",
|
||||
@@ -901,6 +904,7 @@
|
||||
"editUserPopup-title": "Edit User",
|
||||
"newUserPopup-title": "New User",
|
||||
"notifications": "Notifications",
|
||||
"help": "Help",
|
||||
"view-all": "View All",
|
||||
"filter-by-unread": "Filter by Unread",
|
||||
"mark-all-as-read": "Mark all as read",
|
||||
@@ -1177,5 +1181,13 @@
|
||||
"storage": "Storage",
|
||||
"action": "Action",
|
||||
"board-title": "Board Title",
|
||||
"attachmentRenamePopup-title": "Rename"
|
||||
"attachmentRenamePopup-title": "Rename",
|
||||
"uploading": "Uploading",
|
||||
"remaining_time": "Remaining time",
|
||||
"speed": "Speed",
|
||||
"progress": "Progress",
|
||||
"password-again": "Password (again)",
|
||||
"if-you-already-have-an-account": "If you already have an account",
|
||||
"register": "Register",
|
||||
"forgot-password": "Forgot password"
|
||||
}
|
||||
@@ -295,9 +295,9 @@
|
||||
"linkCardPopup-title": "Link Card",
|
||||
"searchElementPopup-title": "Cerca",
|
||||
"copyCardPopup-title": "Copia la fitxa",
|
||||
"copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
|
||||
"copyChecklistToManyCardsPopup-instructions": "Títols de fitxa i Descripcions de destí en aquest format JSON",
|
||||
"copyChecklistToManyCardsPopup-format": "[ {\"title\": \"Títol de la primera fitxa\", \"description\":\"Descripció de la primera fitxa\"}, {\"title\":\"Títol de la segona fitxa\",\"description\":\"Descripció de la segona fitxa\"},{\"title\":\"Títol de l'última fitxa\",\"description\":\"Descripció de l'última fitxa\"} ]",
|
||||
"copyManyCardsPopup-title": "Copy Template to Many Cards",
|
||||
"copyManyCardsPopup-instructions": "Títols de fitxa i Descripcions de destí en aquest format JSON",
|
||||
"copyManyCardsPopup-format": "[ {\"title\": \"Títol de la primera fitxa\", \"description\":\"Descripció de la primera fitxa\"}, {\"title\":\"Títol de la segona fitxa\",\"description\":\"Descripció de la segona fitxa\"},{\"title\":\"Títol de l'última fitxa\",\"description\":\"Descripció de l'última fitxa\"} ]",
|
||||
"create": "Crea",
|
||||
"createBoardPopup-title": "Crea tauler",
|
||||
"chooseBoardSourcePopup-title": "Importa Tauler",
|
||||
@@ -512,7 +512,7 @@
|
||||
"normal": "Normal",
|
||||
"normal-desc": "Podeu veure i editar fitxes. No podeu canviar la configuració.",
|
||||
"not-accepted-yet": "La invitació no ha esta acceptada encara",
|
||||
"notify-participate": "Rebre actualitzacions per a cada fitxa de la qual n'ets creador o membre",
|
||||
"notify-participate": "Receive updates to any cards you participate as creator or member",
|
||||
"notify-watch": "Rebre actualitzacions per qualsevol tauler, llista o fitxa en observació",
|
||||
"optional": "opcional",
|
||||
"or": "o",
|
||||
@@ -541,6 +541,9 @@
|
||||
"rename": "Canvia el nom",
|
||||
"rename-board": "Canvia el nom del tauler",
|
||||
"restore": "Restaura",
|
||||
"rescue-card-description": "Show rescue dialogue before closing for unsaved card descriptions",
|
||||
"rescue-card-description-dialogue": "Overwrite current card description with your changes?",
|
||||
"card-settings": "Configuració de targeta",
|
||||
"save": "Desa",
|
||||
"search": "Cerca",
|
||||
"rules": "Regles",
|
||||
@@ -594,6 +597,7 @@
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
"custom-login-logo-image-url": "Custom Login Logo Image URL",
|
||||
"custom-login-logo-link-url": "Custom Login Logo Link URL",
|
||||
"custom-help-link-url": "Custom Help Link URL",
|
||||
"text-below-custom-login-logo": "Text below Custom Login Logo",
|
||||
"automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line",
|
||||
"username": "Nom d'Usuari",
|
||||
@@ -706,7 +710,6 @@
|
||||
"default": "Default",
|
||||
"queue": "Queue",
|
||||
"subtask-settings": "Subtasks Settings",
|
||||
"card-settings": "Configuració de targeta",
|
||||
"minicard-settings": "Minicard Settings",
|
||||
"boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
|
||||
"boardCardSettingsPopup-title": "Configuració de targeta",
|
||||
@@ -901,6 +904,7 @@
|
||||
"editUserPopup-title": "Edit User",
|
||||
"newUserPopup-title": "New User",
|
||||
"notifications": "Notifications",
|
||||
"help": "Help",
|
||||
"view-all": "View All",
|
||||
"filter-by-unread": "Filter by Unread",
|
||||
"mark-all-as-read": "Mark all as read",
|
||||
@@ -1177,5 +1181,13 @@
|
||||
"storage": "Storage",
|
||||
"action": "Action",
|
||||
"board-title": "Board Title",
|
||||
"attachmentRenamePopup-title": "Canvia el nom"
|
||||
"attachmentRenamePopup-title": "Canvia el nom",
|
||||
"uploading": "Uploading",
|
||||
"remaining_time": "Remaining time",
|
||||
"speed": "Speed",
|
||||
"progress": "Progress",
|
||||
"password-again": "Password (again)",
|
||||
"if-you-already-have-an-account": "If you already have an account",
|
||||
"register": "Register",
|
||||
"forgot-password": "Forgot password"
|
||||
}
|
||||
@@ -295,9 +295,9 @@
|
||||
"linkCardPopup-title": "Propojit kartu",
|
||||
"searchElementPopup-title": "Hledat",
|
||||
"copyCardPopup-title": "Kopírovat kartu",
|
||||
"copyChecklistToManyCardsPopup-title": "Kopírovat checklist do více karet",
|
||||
"copyChecklistToManyCardsPopup-instructions": "Názvy a popisy cílové karty v tomto formátu JSON",
|
||||
"copyChecklistToManyCardsPopup-format": "[ {\"title\": \"Nadpis první karty\", \"description\":\"Popis první karty\"}, {\"title\":\"Nadpis druhé karty\",\"description\":\"Popis druhé karty\"},{\"title\":\"Nadpis poslední kary\",\"description\":\"Popis poslední karty\"} ]",
|
||||
"copyManyCardsPopup-title": "Copy Template to Many Cards",
|
||||
"copyManyCardsPopup-instructions": "Názvy a popisy cílové karty v tomto formátu JSON",
|
||||
"copyManyCardsPopup-format": "[ {\"title\": \"Nadpis první karty\", \"description\":\"Popis první karty\"}, {\"title\":\"Nadpis druhé karty\",\"description\":\"Popis druhé karty\"},{\"title\":\"Nadpis poslední kary\",\"description\":\"Popis poslední karty\"} ]",
|
||||
"create": "Vytvořit",
|
||||
"createBoardPopup-title": "Vytvořit tablo",
|
||||
"chooseBoardSourcePopup-title": "Importovat tablo",
|
||||
@@ -512,7 +512,7 @@
|
||||
"normal": "Normální",
|
||||
"normal-desc": "Může zobrazovat a upravovat karty. Nemůže měnit nastavení.",
|
||||
"not-accepted-yet": "Pozvánka ještě nebyla přijmuta",
|
||||
"notify-participate": "Dostane aktualizace do všech karet, ve kterých se účastní jako tvůrce nebo člen",
|
||||
"notify-participate": "Receive updates to any cards you participate as creator or member",
|
||||
"notify-watch": "Dostane aktualitace to všech tabel, sloupců nebo karet, které sledujete",
|
||||
"optional": "volitelný",
|
||||
"or": "nebo",
|
||||
@@ -541,6 +541,9 @@
|
||||
"rename": "Přejmenovat",
|
||||
"rename-board": "Přejmenovat tablo",
|
||||
"restore": "Obnovit",
|
||||
"rescue-card-description": "Show rescue dialogue before closing for unsaved card descriptions",
|
||||
"rescue-card-description-dialogue": "Overwrite current card description with your changes?",
|
||||
"card-settings": "Nastavení karet",
|
||||
"save": "Uložit",
|
||||
"search": "Hledat",
|
||||
"rules": "Pravidla",
|
||||
@@ -594,6 +597,7 @@
|
||||
"custom-top-left-corner-logo-height": "Výška vlastního loga v horním levém rohu. Defaultně: 27",
|
||||
"custom-login-logo-image-url": "URL vlastního loga přihlášení",
|
||||
"custom-login-logo-link-url": "URL odkazu vlastního loga přihlášení",
|
||||
"custom-help-link-url": "Custom Help Link URL",
|
||||
"text-below-custom-login-logo": "Text pod vlastním logem přihlášení",
|
||||
"automatic-linked-url-schemes": "Vlastní URL schémata, která by automaticky měla být klikatelná.\nJedno schéma na řádek",
|
||||
"username": "Uživatelské jméno",
|
||||
@@ -706,7 +710,6 @@
|
||||
"default": "Výchozí",
|
||||
"queue": "Fronta",
|
||||
"subtask-settings": "Nastavení podúkolů",
|
||||
"card-settings": "Nastavení karet",
|
||||
"minicard-settings": "Minicard Settings",
|
||||
"boardSubtaskSettingsPopup-title": "Nastavení podúkolů tabla",
|
||||
"boardCardSettingsPopup-title": "Nastavení karet",
|
||||
@@ -901,6 +904,7 @@
|
||||
"editUserPopup-title": "Editovat uživatele",
|
||||
"newUserPopup-title": "Nový uživatel",
|
||||
"notifications": "Upozornění",
|
||||
"help": "Help",
|
||||
"view-all": "Zobrazit vše",
|
||||
"filter-by-unread": "Zobrazit nepřečtené",
|
||||
"mark-all-as-read": "Označit vše jako přečtené",
|
||||
@@ -1177,5 +1181,13 @@
|
||||
"storage": "Storage",
|
||||
"action": "Akce",
|
||||
"board-title": "Board Title",
|
||||
"attachmentRenamePopup-title": "Přejmenovat"
|
||||
"attachmentRenamePopup-title": "Přejmenovat",
|
||||
"uploading": "Uploading",
|
||||
"remaining_time": "Remaining time",
|
||||
"speed": "Speed",
|
||||
"progress": "Progress",
|
||||
"password-again": "Password (again)",
|
||||
"if-you-already-have-an-account": "If you already have an account",
|
||||
"register": "Register",
|
||||
"forgot-password": "Forgot password"
|
||||
}
|
||||
@@ -295,9 +295,9 @@
|
||||
"linkCardPopup-title": "Propojit kartu",
|
||||
"searchElementPopup-title": "Hledat",
|
||||
"copyCardPopup-title": "Kopírovat kartu",
|
||||
"copyChecklistToManyCardsPopup-title": "Kopírovat checklist do více karet",
|
||||
"copyChecklistToManyCardsPopup-instructions": "Názvy a popisy cílové karty v tomto formátu JSON",
|
||||
"copyChecklistToManyCardsPopup-format": "[ {\"title\": \"Nadpis první karty\", \"description\":\"Popis první karty\"}, {\"title\":\"Nadpis druhé karty\",\"description\":\"Popis druhé karty\"},{\"title\":\"Nadpis poslední kary\",\"description\":\"Popis poslední karty\"} ]",
|
||||
"copyManyCardsPopup-title": "Copy Template to Many Cards",
|
||||
"copyManyCardsPopup-instructions": "Názvy a popisy cílové karty v tomto formátu JSON",
|
||||
"copyManyCardsPopup-format": "[ {\"title\": \"Nadpis první karty\", \"description\":\"Popis první karty\"}, {\"title\":\"Nadpis druhé karty\",\"description\":\"Popis druhé karty\"},{\"title\":\"Nadpis poslední kary\",\"description\":\"Popis poslední karty\"} ]",
|
||||
"create": "Vytvořit",
|
||||
"createBoardPopup-title": "Vytvořit tablo",
|
||||
"chooseBoardSourcePopup-title": "Importovat tablo",
|
||||
@@ -512,7 +512,7 @@
|
||||
"normal": "Normální",
|
||||
"normal-desc": "Může zobrazovat a upravovat karty. Nemůže měnit nastavení.",
|
||||
"not-accepted-yet": "Pozvánka ještě nebyla přijmuta",
|
||||
"notify-participate": "Dostane aktualizace do všech karet, ve kterých se účastní jako tvůrce nebo člen",
|
||||
"notify-participate": "Receive updates to any cards you participate as creator or member",
|
||||
"notify-watch": "Dostane aktualitace to všech tabel, sloupců nebo karet, které sledujete",
|
||||
"optional": "volitelný",
|
||||
"or": "nebo",
|
||||
@@ -541,6 +541,9 @@
|
||||
"rename": "Přejmenovat",
|
||||
"rename-board": "Přejmenovat tablo",
|
||||
"restore": "Obnovit",
|
||||
"rescue-card-description": "Show rescue dialogue before closing for unsaved card descriptions",
|
||||
"rescue-card-description-dialogue": "Overwrite current card description with your changes?",
|
||||
"card-settings": "Nastavení karet",
|
||||
"save": "Uložit",
|
||||
"search": "Hledat",
|
||||
"rules": "Pravidla",
|
||||
@@ -594,6 +597,7 @@
|
||||
"custom-top-left-corner-logo-height": "Výška vlastního loga v horním levém rohu. Defaultně: 27",
|
||||
"custom-login-logo-image-url": "URL vlastního loga přihlášení",
|
||||
"custom-login-logo-link-url": "URL odkazu vlastního loga přihlášení",
|
||||
"custom-help-link-url": "Custom Help Link URL",
|
||||
"text-below-custom-login-logo": "Text pod vlastním logem přihlášení",
|
||||
"automatic-linked-url-schemes": "Vlastní URL schémata, která by automaticky měla být klikatelná.\nJedno schéma na řádek",
|
||||
"username": "Uživatelské jméno",
|
||||
@@ -706,7 +710,6 @@
|
||||
"default": "Výchozí",
|
||||
"queue": "Fronta",
|
||||
"subtask-settings": "Nastavení podúkolů",
|
||||
"card-settings": "Nastavení karet",
|
||||
"minicard-settings": "Minicard Settings",
|
||||
"boardSubtaskSettingsPopup-title": "Nastavení podúkolů tabla",
|
||||
"boardCardSettingsPopup-title": "Nastavení karet",
|
||||
@@ -901,6 +904,7 @@
|
||||
"editUserPopup-title": "Editovat uživatele",
|
||||
"newUserPopup-title": "Nový uživatel",
|
||||
"notifications": "Upozornění",
|
||||
"help": "Help",
|
||||
"view-all": "Zobrazit vše",
|
||||
"filter-by-unread": "Zobrazit nepřečtené",
|
||||
"mark-all-as-read": "Označit vše jako přečtené",
|
||||
@@ -1177,5 +1181,13 @@
|
||||
"storage": "Storage",
|
||||
"action": "Akce",
|
||||
"board-title": "Board Title",
|
||||
"attachmentRenamePopup-title": "Přejmenovat"
|
||||
"attachmentRenamePopup-title": "Přejmenovat",
|
||||
"uploading": "Uploading",
|
||||
"remaining_time": "Remaining time",
|
||||
"speed": "Speed",
|
||||
"progress": "Progress",
|
||||
"password-again": "Password (again)",
|
||||
"if-you-already-have-an-account": "If you already have an account",
|
||||
"register": "Register",
|
||||
"forgot-password": "Forgot password"
|
||||
}
|
||||
@@ -295,9 +295,9 @@
|
||||
"linkCardPopup-title": "Link Card",
|
||||
"searchElementPopup-title": "Search",
|
||||
"copyCardPopup-title": "Copy Card",
|
||||
"copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
|
||||
"copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
|
||||
"copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
|
||||
"copyManyCardsPopup-title": "Copy Template to Many Cards",
|
||||
"copyManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
|
||||
"copyManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
|
||||
"create": "Create",
|
||||
"createBoardPopup-title": "Create Board",
|
||||
"chooseBoardSourcePopup-title": "Import board",
|
||||
@@ -512,7 +512,7 @@
|
||||
"normal": "Normal",
|
||||
"normal-desc": "Can view and edit cards. Can't change settings.",
|
||||
"not-accepted-yet": "Invitation not accepted yet",
|
||||
"notify-participate": "Receive updates to any cards you participate as creater or member",
|
||||
"notify-participate": "Receive updates to any cards you participate as creator or member",
|
||||
"notify-watch": "Receive updates to any boards, lists, or cards you’re watching",
|
||||
"optional": "optional",
|
||||
"or": "or",
|
||||
@@ -541,6 +541,9 @@
|
||||
"rename": "Rename",
|
||||
"rename-board": "Rename Board",
|
||||
"restore": "Restore",
|
||||
"rescue-card-description": "Show rescue dialogue before closing for unsaved card descriptions",
|
||||
"rescue-card-description-dialogue": "Overwrite current card description with your changes?",
|
||||
"card-settings": "Card Settings",
|
||||
"save": "Save",
|
||||
"search": "Search",
|
||||
"rules": "Rules",
|
||||
@@ -594,6 +597,7 @@
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
"custom-login-logo-image-url": "Custom Login Logo Image URL",
|
||||
"custom-login-logo-link-url": "Custom Login Logo Link URL",
|
||||
"custom-help-link-url": "Custom Help Link URL",
|
||||
"text-below-custom-login-logo": "Text below Custom Login Logo",
|
||||
"automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line",
|
||||
"username": "Username",
|
||||
@@ -706,7 +710,6 @@
|
||||
"default": "Default",
|
||||
"queue": "Queue",
|
||||
"subtask-settings": "Subtasks Settings",
|
||||
"card-settings": "Card Settings",
|
||||
"minicard-settings": "Minicard Settings",
|
||||
"boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
|
||||
"boardCardSettingsPopup-title": "Card Settings",
|
||||
@@ -901,6 +904,7 @@
|
||||
"editUserPopup-title": "Edit User",
|
||||
"newUserPopup-title": "New User",
|
||||
"notifications": "Notifications",
|
||||
"help": "Help",
|
||||
"view-all": "View All",
|
||||
"filter-by-unread": "Filter by Unread",
|
||||
"mark-all-as-read": "Mark all as read",
|
||||
@@ -1177,5 +1181,13 @@
|
||||
"storage": "Storage",
|
||||
"action": "Action",
|
||||
"board-title": "Board Title",
|
||||
"attachmentRenamePopup-title": "Rename"
|
||||
"attachmentRenamePopup-title": "Rename",
|
||||
"uploading": "Uploading",
|
||||
"remaining_time": "Remaining time",
|
||||
"speed": "Speed",
|
||||
"progress": "Progress",
|
||||
"password-again": "Password (again)",
|
||||
"if-you-already-have-an-account": "If you already have an account",
|
||||
"register": "Register",
|
||||
"forgot-password": "Forgot password"
|
||||
}
|
||||
@@ -295,9 +295,9 @@
|
||||
"linkCardPopup-title": "Link Card",
|
||||
"searchElementPopup-title": "Search",
|
||||
"copyCardPopup-title": "Copy Card",
|
||||
"copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
|
||||
"copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
|
||||
"copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
|
||||
"copyManyCardsPopup-title": "Copy Template to Many Cards",
|
||||
"copyManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
|
||||
"copyManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
|
||||
"create": "Create",
|
||||
"createBoardPopup-title": "Create Board",
|
||||
"chooseBoardSourcePopup-title": "Import board",
|
||||
@@ -512,7 +512,7 @@
|
||||
"normal": "Normal",
|
||||
"normal-desc": "Can view and edit cards. Can't change settings.",
|
||||
"not-accepted-yet": "Invitation not accepted yet",
|
||||
"notify-participate": "Receive updates to any cards you participate as creater or member",
|
||||
"notify-participate": "Receive updates to any cards you participate as creator or member",
|
||||
"notify-watch": "Receive updates to any boards, lists, or cards you’re watching",
|
||||
"optional": "optional",
|
||||
"or": "or",
|
||||
@@ -541,6 +541,9 @@
|
||||
"rename": "Rename",
|
||||
"rename-board": "Rename Board",
|
||||
"restore": "Restore",
|
||||
"rescue-card-description": "Show rescue dialogue before closing for unsaved card descriptions",
|
||||
"rescue-card-description-dialogue": "Overwrite current card description with your changes?",
|
||||
"card-settings": "Card Settings",
|
||||
"save": "Save",
|
||||
"search": "Search",
|
||||
"rules": "Rules",
|
||||
@@ -594,6 +597,7 @@
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
"custom-login-logo-image-url": "Custom Login Logo Image URL",
|
||||
"custom-login-logo-link-url": "Custom Login Logo Link URL",
|
||||
"custom-help-link-url": "Custom Help Link URL",
|
||||
"text-below-custom-login-logo": "Text below Custom Login Logo",
|
||||
"automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line",
|
||||
"username": "Username",
|
||||
@@ -706,7 +710,6 @@
|
||||
"default": "Default",
|
||||
"queue": "Queue",
|
||||
"subtask-settings": "Subtasks Settings",
|
||||
"card-settings": "Card Settings",
|
||||
"minicard-settings": "Minicard Settings",
|
||||
"boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
|
||||
"boardCardSettingsPopup-title": "Card Settings",
|
||||
@@ -901,6 +904,7 @@
|
||||
"editUserPopup-title": "Edit User",
|
||||
"newUserPopup-title": "New User",
|
||||
"notifications": "Notifications",
|
||||
"help": "Help",
|
||||
"view-all": "View All",
|
||||
"filter-by-unread": "Filter by Unread",
|
||||
"mark-all-as-read": "Mark all as read",
|
||||
@@ -1177,5 +1181,13 @@
|
||||
"storage": "Storage",
|
||||
"action": "Action",
|
||||
"board-title": "Board Title",
|
||||
"attachmentRenamePopup-title": "Rename"
|
||||
"attachmentRenamePopup-title": "Rename",
|
||||
"uploading": "Uploading",
|
||||
"remaining_time": "Remaining time",
|
||||
"speed": "Speed",
|
||||
"progress": "Progress",
|
||||
"password-again": "Password (again)",
|
||||
"if-you-already-have-an-account": "If you already have an account",
|
||||
"register": "Register",
|
||||
"forgot-password": "Forgot password"
|
||||
}
|
||||
@@ -295,9 +295,9 @@
|
||||
"linkCardPopup-title": "Sammenkæd kort",
|
||||
"searchElementPopup-title": "Søg",
|
||||
"copyCardPopup-title": "Kopiér kort",
|
||||
"copyChecklistToManyCardsPopup-title": "Kopiér tjeklisteskabelon til flere kort",
|
||||
"copyChecklistToManyCardsPopup-instructions": "Destination for kortenes titler og beskrivelser i dette JSON-format",
|
||||
"copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
|
||||
"copyManyCardsPopup-title": "Copy Template to Many Cards",
|
||||
"copyManyCardsPopup-instructions": "Destination for kortenes titler og beskrivelser i dette JSON-format",
|
||||
"copyManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
|
||||
"create": "Opret",
|
||||
"createBoardPopup-title": "Opret tavle",
|
||||
"chooseBoardSourcePopup-title": "Importér tavle",
|
||||
@@ -512,7 +512,7 @@
|
||||
"normal": "Normal",
|
||||
"normal-desc": "Du kan se og redigere kort. Indstillinger kan ikke ændres.",
|
||||
"not-accepted-yet": "Invitation er endnu ikke accepteret",
|
||||
"notify-participate": "Modtag opdateringer for alle kort du deltager i, som opretter eller medlem ",
|
||||
"notify-participate": "Receive updates to any cards you participate as creator or member",
|
||||
"notify-watch": "Modtag opdateringer for alle tavler eller kort som du følger ",
|
||||
"optional": "valgfri",
|
||||
"or": "eller",
|
||||
@@ -541,6 +541,9 @@
|
||||
"rename": "Omdøb",
|
||||
"rename-board": "Omdøb tavle",
|
||||
"restore": "Genskab",
|
||||
"rescue-card-description": "Show rescue dialogue before closing for unsaved card descriptions",
|
||||
"rescue-card-description-dialogue": "Overwrite current card description with your changes?",
|
||||
"card-settings": "Indstillinger for kort",
|
||||
"save": "Gem",
|
||||
"search": "Søg",
|
||||
"rules": "Regler",
|
||||
@@ -594,6 +597,7 @@
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
"custom-login-logo-image-url": "Custom Login Logo Image URL",
|
||||
"custom-login-logo-link-url": "Custom Login Logo Link URL",
|
||||
"custom-help-link-url": "Custom Help Link URL",
|
||||
"text-below-custom-login-logo": "Text below Custom Login Logo",
|
||||
"automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line",
|
||||
"username": "Brugernavn",
|
||||
@@ -706,7 +710,6 @@
|
||||
"default": "Standard",
|
||||
"queue": "Kø",
|
||||
"subtask-settings": "Indstillinger for delopgaver",
|
||||
"card-settings": "Indstillinger for kort",
|
||||
"minicard-settings": "Minicard Settings",
|
||||
"boardSubtaskSettingsPopup-title": "Indstillinger for delopgaver i tavle",
|
||||
"boardCardSettingsPopup-title": "Indstillinger for kort",
|
||||
@@ -901,6 +904,7 @@
|
||||
"editUserPopup-title": "Redigér bruger",
|
||||
"newUserPopup-title": "Ny bruger",
|
||||
"notifications": "Notifikationer",
|
||||
"help": "Help",
|
||||
"view-all": "Vis alle",
|
||||
"filter-by-unread": "Filtrér efter ulæst",
|
||||
"mark-all-as-read": "Markér alle som læst",
|
||||
@@ -1177,5 +1181,13 @@
|
||||
"storage": "Storage",
|
||||
"action": "Action",
|
||||
"board-title": "Board Title",
|
||||
"attachmentRenamePopup-title": "Omdøb"
|
||||
"attachmentRenamePopup-title": "Omdøb",
|
||||
"uploading": "Uploading",
|
||||
"remaining_time": "Remaining time",
|
||||
"speed": "Speed",
|
||||
"progress": "Progress",
|
||||
"password-again": "Password (again)",
|
||||
"if-you-already-have-an-account": "If you already have an account",
|
||||
"register": "Register",
|
||||
"forgot-password": "Forgot password"
|
||||
}
|
||||
@@ -295,9 +295,9 @@
|
||||
"linkCardPopup-title": "Karte verknüpfen",
|
||||
"searchElementPopup-title": "Suche",
|
||||
"copyCardPopup-title": "Karte kopieren",
|
||||
"copyChecklistToManyCardsPopup-title": "Checklistenvorlage in mehrere Karten kopieren",
|
||||
"copyChecklistToManyCardsPopup-instructions": "Titel und Beschreibungen der Zielkarten im folgenden JSON-Format",
|
||||
"copyChecklistToManyCardsPopup-format": "[ {\"title\": \"Titel der ersten Karte\", \"description\":\"Beschreibung der ersten Karte\"}, {\"title\":\"Titel der zweiten Karte\",\"description\":\"Beschreibung der zweiten Karte\"},{\"title\":\"Titel der letzten Karte\",\"description\":\"Beschreibung der letzten Karte\"} ]",
|
||||
"copyManyCardsPopup-title": "Copy Template to Many Cards",
|
||||
"copyManyCardsPopup-instructions": "Titel und Beschreibungen der Zielkarten im folgenden JSON-Format",
|
||||
"copyManyCardsPopup-format": "[ {\"title\": \"Titel der ersten Karte\", \"description\":\"Beschreibung der ersten Karte\"}, {\"title\":\"Titel der zweiten Karte\",\"description\":\"Beschreibung der zweiten Karte\"},{\"title\":\"Titel der letzten Karte\",\"description\":\"Beschreibung der letzten Karte\"} ]",
|
||||
"create": "Erstellen",
|
||||
"createBoardPopup-title": "Board erstellen",
|
||||
"chooseBoardSourcePopup-title": "Board importieren",
|
||||
@@ -512,7 +512,7 @@
|
||||
"normal": "Normal",
|
||||
"normal-desc": "Kann Karten anzeigen und bearbeiten, aber keine Einstellungen ändern.",
|
||||
"not-accepted-yet": "Die Einladung wurde noch nicht angenommen",
|
||||
"notify-participate": "Benachrichtigungen zu allen Karten erhalten, an denen Sie teilnehmen",
|
||||
"notify-participate": "Receive updates to any cards you participate as creator or member",
|
||||
"notify-watch": "Benachrichtigungen über alle Boards, Listen oder Karten erhalten, die Sie beobachten",
|
||||
"optional": "optional",
|
||||
"or": "oder",
|
||||
@@ -541,6 +541,9 @@
|
||||
"rename": "Umbenennen",
|
||||
"rename-board": "Board umbenennen",
|
||||
"restore": "Wiederherstellen",
|
||||
"rescue-card-description": "Show rescue dialogue before closing for unsaved card descriptions",
|
||||
"rescue-card-description-dialogue": "Overwrite current card description with your changes?",
|
||||
"card-settings": "Karten-Einstellungen",
|
||||
"save": "Speichern",
|
||||
"search": "Suchen",
|
||||
"rules": "Regeln",
|
||||
@@ -594,6 +597,7 @@
|
||||
"custom-top-left-corner-logo-height": "Benutzerdefiniertes Logo oben links Höhe. Voreinstellung: 27",
|
||||
"custom-login-logo-image-url": "Benutzerdefiniertes Login Logo Bild URL",
|
||||
"custom-login-logo-link-url": "Benutzerdefiniertes Login Logo Link URL",
|
||||
"custom-help-link-url": "Custom Help Link URL",
|
||||
"text-below-custom-login-logo": "Text unterhalb benutzerdefiniertem Login Logo",
|
||||
"automatic-linked-url-schemes": "Spezielle URL-Schemas, die durch Klick automatisch öffenbar sein sollen. Ein URL-Schema pro Zeile",
|
||||
"username": "Benutzername",
|
||||
@@ -706,7 +710,6 @@
|
||||
"default": "Standard",
|
||||
"queue": "Warteschlange",
|
||||
"subtask-settings": "Einstellungen für Teilaufgaben",
|
||||
"card-settings": "Karten-Einstellungen",
|
||||
"minicard-settings": "Minicard Settings",
|
||||
"boardSubtaskSettingsPopup-title": "Boardeinstellungen für Teilaufgaben",
|
||||
"boardCardSettingsPopup-title": "Karten-Einstellungen",
|
||||
@@ -901,6 +904,7 @@
|
||||
"editUserPopup-title": "Benutzer ändern",
|
||||
"newUserPopup-title": "Neuer Benutzer",
|
||||
"notifications": "Benachrichtigungen",
|
||||
"help": "Help",
|
||||
"view-all": "Alle anzeigen",
|
||||
"filter-by-unread": "Nur ungelesene",
|
||||
"mark-all-as-read": "Alle als gelesen markieren",
|
||||
@@ -1177,5 +1181,13 @@
|
||||
"storage": "Storage",
|
||||
"action": "Aktion",
|
||||
"board-title": "Board Title",
|
||||
"attachmentRenamePopup-title": "Umbenennen"
|
||||
"attachmentRenamePopup-title": "Umbenennen",
|
||||
"uploading": "Uploading",
|
||||
"remaining_time": "Remaining time",
|
||||
"speed": "Speed",
|
||||
"progress": "Progress",
|
||||
"password-again": "Password (again)",
|
||||
"if-you-already-have-an-account": "If you already have an account",
|
||||
"register": "Register",
|
||||
"forgot-password": "Forgot password"
|
||||
}
|
||||
@@ -135,12 +135,12 @@
|
||||
"avatar-too-big": "Das Profilbild ist zu gross (520KB max)",
|
||||
"back": "Zurück",
|
||||
"board-change-color": "Farbe ändern",
|
||||
"show-at-all-boards-page": "Show at All Boards page",
|
||||
"board-info-on-my-boards": "All Boards Settings",
|
||||
"boardInfoOnMyBoardsPopup-title": "All Boards Settings",
|
||||
"boardInfoOnMyBoards-title": "All Boards Settings",
|
||||
"show-card-counter-per-list": "Show card count per list",
|
||||
"show-board_members-avatar": "Show Board members avatars",
|
||||
"show-at-all-boards-page": "Zeigen auf der Seite \"Alle Boards\"",
|
||||
"board-info-on-my-boards": "Einstellungen für alle Boards",
|
||||
"boardInfoOnMyBoardsPopup-title": "Einstellungen für alle Boards",
|
||||
"boardInfoOnMyBoards-title": "Einstellungen für alle Boards",
|
||||
"show-card-counter-per-list": "Zeige Kartenanzahl pro Liste",
|
||||
"show-board_members-avatar": "Zeige Profilbilder der Board-Mitglieder",
|
||||
"board-nb-stars": "%s Sterne",
|
||||
"board-not-found": "Board nicht gefunden",
|
||||
"board-private-info": "Dieses Board wird <strong>privat</strong> sein.",
|
||||
@@ -288,16 +288,16 @@
|
||||
"computer": "Computer",
|
||||
"confirm-subtask-delete-popup": "Wollen Sie die Teilaufgabe wirklich löschen?",
|
||||
"confirm-checklist-delete-popup": "Wollen Sie diese Checkliste wirklich löschen?",
|
||||
"subtaskDeletePopup-title": "Delete Subtask?",
|
||||
"subtaskDeletePopup-title": "Teilaufgabe löschen?",
|
||||
"checklistDeletePopup-title": "Checkliste löschen?",
|
||||
"copy-card-link-to-clipboard": "Kopiere Link zur Karte in die Zwischenablage",
|
||||
"copy-text-to-clipboard": "Text in die Zwischenablage kopieren",
|
||||
"linkCardPopup-title": "Karte verknüpfen",
|
||||
"searchElementPopup-title": "Suche",
|
||||
"copyCardPopup-title": "Karte kopieren",
|
||||
"copyChecklistToManyCardsPopup-title": "Checklisten-Vorlage in mehrere Karten kopieren",
|
||||
"copyChecklistToManyCardsPopup-instructions": "Titel und Beschreibungen der Zielkarten im folgenden JSON-Format",
|
||||
"copyChecklistToManyCardsPopup-format": "[ {\"title\": \"Titel der ersten Karte\", \"description\":\"Beschreibung der ersten Karte\"}, {\"title\":\"Titel der zweiten Karte\",\"description\":\"Beschreibung der zweiten Karte\"},{\"title\":\"Titel der letzten Karte\",\"description\":\"Beschreibung der letzten Karte\"} ]",
|
||||
"copyManyCardsPopup-title": "Copy Template to Many Cards",
|
||||
"copyManyCardsPopup-instructions": "Titel und Beschreibungen der Zielkarten im folgenden JSON-Format",
|
||||
"copyManyCardsPopup-format": "[ {\"title\": \"Titel der ersten Karte\", \"description\":\"Beschreibung der ersten Karte\"}, {\"title\":\"Titel der zweiten Karte\",\"description\":\"Beschreibung der zweiten Karte\"},{\"title\":\"Titel der letzten Karte\",\"description\":\"Beschreibung der letzten Karte\"} ]",
|
||||
"create": "Erstellen",
|
||||
"createBoardPopup-title": "Board erstellen",
|
||||
"chooseBoardSourcePopup-title": "Board importieren",
|
||||
@@ -512,7 +512,7 @@
|
||||
"normal": "Normal",
|
||||
"normal-desc": "Kann Karten anzeigen und bearbeiten, aber keine Einstellungen ändern.",
|
||||
"not-accepted-yet": "Die Einladung wurde noch nicht angenommen",
|
||||
"notify-participate": "Benachrichtigungen zu allen Karten erhalten, an denen Sie teilnehmen",
|
||||
"notify-participate": "Receive updates to any cards you participate as creator or member",
|
||||
"notify-watch": "Benachrichtigungen über alle Boards, Listen oder Karten erhalten, die Sie beobachten",
|
||||
"optional": "optional",
|
||||
"or": "oder",
|
||||
@@ -541,6 +541,9 @@
|
||||
"rename": "Umbenennen",
|
||||
"rename-board": "Board umbenennen",
|
||||
"restore": "Wiederherstellen",
|
||||
"rescue-card-description": "Show rescue dialogue before closing for unsaved card descriptions",
|
||||
"rescue-card-description-dialogue": "Overwrite current card description with your changes?",
|
||||
"card-settings": "Karten-Einstellungen",
|
||||
"save": "Speichern",
|
||||
"search": "Suchen",
|
||||
"rules": "Regeln",
|
||||
@@ -578,8 +581,8 @@
|
||||
"has-spenttime-cards": "Hat Karten mit aufgewendeten Zeiten",
|
||||
"time": "Zeit",
|
||||
"title": "Titel",
|
||||
"toggle-labels": "Toggle labels 1-9 for card. Multi-Selection adds labels 1-9",
|
||||
"remove-labels-multiselect": "Multi-Selection removes labels 1-9",
|
||||
"toggle-labels": "Label 1-9 zur Karte hinzufügen. Bei Mehrfachauswahl Label 1-9 hinzufügen",
|
||||
"remove-labels-multiselect": "Labels 1-9 bei Karten-Mehrfachauswahl entfernen",
|
||||
"tracking": "Folgen",
|
||||
"tracking-info": "Sie werden über alle Änderungen an Karten benachrichtigt, an denen Sie als Ersteller oder Mitglied beteiligt sind.",
|
||||
"type": "Typ",
|
||||
@@ -594,6 +597,7 @@
|
||||
"custom-top-left-corner-logo-height": "Benutzerdefiniertes Logo oben links Höhe. Voreinstellung: 27",
|
||||
"custom-login-logo-image-url": "Benutzerdefiniertes Login Logo Bild URL",
|
||||
"custom-login-logo-link-url": "Benutzerdefiniertes Login Logo Link URL",
|
||||
"custom-help-link-url": "Custom Help Link URL",
|
||||
"text-below-custom-login-logo": "Text unterhalb benutzerdefiniertem Login Logo",
|
||||
"automatic-linked-url-schemes": "Spezielle URL-Schemas, die durch Klick automatisch öffenbar sein sollen. Ein URL-Schema pro Zeile",
|
||||
"username": "Benutzername",
|
||||
@@ -706,15 +710,14 @@
|
||||
"default": "Standard",
|
||||
"queue": "Warteschlange",
|
||||
"subtask-settings": "Einstellungen für Teilaufgaben",
|
||||
"card-settings": "Karten-Einstellungen",
|
||||
"minicard-settings": "Minicard Settings",
|
||||
"minicard-settings": "Einstellungen für Minikarte",
|
||||
"boardSubtaskSettingsPopup-title": "Boardeinstellungen für Teilaufgaben",
|
||||
"boardCardSettingsPopup-title": "Karten-Einstellungen",
|
||||
"boardMinicardSettingsPopup-title": "Minicard Settings",
|
||||
"boardMinicardSettingsPopup-title": "Einstellungen für Minikarte",
|
||||
"deposit-subtasks-board": "Teilaufgaben in diesem Board ablegen:",
|
||||
"deposit-subtasks-list": "Zielliste für hier abgelegte Teilaufgaben:",
|
||||
"show-parent-in-minicard": "Übergeordnetes Element auf Minikarte anzeigen:",
|
||||
"description-on-minicard": "Description on minicard",
|
||||
"description-on-minicard": "Beschreibung auf Minikarte",
|
||||
"prefix-with-full-path": "Vollständiger Pfad über Titel",
|
||||
"prefix-with-parent": "Über Titel",
|
||||
"subtext-with-full-path": "Vollständiger Pfad unter Titel",
|
||||
@@ -892,7 +895,7 @@
|
||||
"cardAssigneesPopup-title": "Zugewiesen",
|
||||
"addmore-detail": "Eine detailliertere Beschreibung hinzufügen",
|
||||
"show-on-card": "Zeige auf Karte",
|
||||
"show-on-minicard": "Show on Minicard",
|
||||
"show-on-minicard": "Anzeigen auf Minikarte",
|
||||
"new": "Neu",
|
||||
"editOrgPopup-title": "Organisation bearbeiten",
|
||||
"newOrgPopup-title": "Neue Organisation",
|
||||
@@ -901,6 +904,7 @@
|
||||
"editUserPopup-title": "Benutzer ändern",
|
||||
"newUserPopup-title": "Neuer Benutzer",
|
||||
"notifications": "Benachrichtigungen",
|
||||
"help": "Help",
|
||||
"view-all": "Alle anzeigen",
|
||||
"filter-by-unread": "Nur ungelesene",
|
||||
"mark-all-as-read": "Alle als gelesen markieren",
|
||||
@@ -938,10 +942,10 @@
|
||||
"card": "Karte",
|
||||
"board": "Board",
|
||||
"context-separator": "/",
|
||||
"myCardsViewChange-title": "My Cards View",
|
||||
"myCardsViewChangePopup-title": "My Cards View",
|
||||
"myCardsViewChange-title": "Meine Kartenansicht",
|
||||
"myCardsViewChangePopup-title": "Meine Kartenansicht",
|
||||
"myCardsViewChange-choice-boards": "Boards",
|
||||
"myCardsViewChange-choice-table": "Table",
|
||||
"myCardsViewChange-choice-table": "Tabelle",
|
||||
"myCardsSortChange-title": "Meine Karten Sortierung",
|
||||
"myCardsSortChangePopup-title": "Meine Karten Sortierung",
|
||||
"myCardsSortChange-choice-board": "nach Board",
|
||||
@@ -1162,20 +1166,28 @@
|
||||
"copyChecklist": "Checkliste kopieren",
|
||||
"copyChecklistPopup-title": "Checkliste kopieren",
|
||||
"card-show-lists": "Listen anzeigen",
|
||||
"subtaskActionsPopup-title": "Subtask Actions",
|
||||
"attachmentActionsPopup-title": "Attachment Actions",
|
||||
"attachment-move-storage-fs": "Move attachment to filesystem",
|
||||
"attachment-move-storage-gridfs": "Move attachment to GridFS",
|
||||
"attachment-move": "Move Attachment",
|
||||
"move-all-attachments-to-fs": "Move all attachments to filesystem",
|
||||
"move-all-attachments-to-gridfs": "Move all attachments to GridFS",
|
||||
"move-all-attachments-of-board-to-fs": "Move all attachments of board to filesystem",
|
||||
"move-all-attachments-of-board-to-gridfs": "Move all attachments of board to GridFS",
|
||||
"path": "Path",
|
||||
"version-name": "Version-Name",
|
||||
"size": "Size",
|
||||
"storage": "Storage",
|
||||
"subtaskActionsPopup-title": "Teilaufgabenaktionen",
|
||||
"attachmentActionsPopup-title": "Anhang-Aktionen",
|
||||
"attachment-move-storage-fs": "Verschiebe den Anhang ins Dateisystem",
|
||||
"attachment-move-storage-gridfs": "Verschiebe den Anhang zu GridFS",
|
||||
"attachment-move": "Verschiebe den Anhang",
|
||||
"move-all-attachments-to-fs": "Verschiebe alle Anhänge ins Dateisystem",
|
||||
"move-all-attachments-to-gridfs": "Verschiebe alle Anhänge zu GridFS",
|
||||
"move-all-attachments-of-board-to-fs": "Verschiebe alle Anhänge des Boards ins Dateisystem",
|
||||
"move-all-attachments-of-board-to-gridfs": "Verschiebe alle Anhänge des Boards zu GridFS",
|
||||
"path": "Pfad",
|
||||
"version-name": "Versionsname",
|
||||
"size": "Grösse",
|
||||
"storage": "Speicher",
|
||||
"action": "Aktion",
|
||||
"board-title": "Board Title",
|
||||
"attachmentRenamePopup-title": "Umbenennen"
|
||||
"board-title": "Board-Titel",
|
||||
"attachmentRenamePopup-title": "Umbenennen",
|
||||
"uploading": "Uploading",
|
||||
"remaining_time": "Remaining time",
|
||||
"speed": "Speed",
|
||||
"progress": "Progress",
|
||||
"password-again": "Password (again)",
|
||||
"if-you-already-have-an-account": "If you already have an account",
|
||||
"register": "Register",
|
||||
"forgot-password": "Forgot password"
|
||||
}
|
||||
@@ -137,8 +137,8 @@
|
||||
"board-change-color": "Farbe ändern",
|
||||
"show-at-all-boards-page": "Zeige auf \"Alle Boards\" Seite",
|
||||
"board-info-on-my-boards": "\"Alle Boards\" Einstellungen",
|
||||
"boardInfoOnMyBoardsPopup-title": "\"Alle Boards\" Einstellungen",
|
||||
"boardInfoOnMyBoards-title": "\"Alle Boards\" Einstellungen",
|
||||
"boardInfoOnMyBoardsPopup-title": "Einstellungen für Alle Boards",
|
||||
"boardInfoOnMyBoards-title": "Einstellungen für Alle Boards",
|
||||
"show-card-counter-per-list": "Zeige Kartenanzahl pro Liste",
|
||||
"show-board_members-avatar": "Zeige Profilbilder der Board-Mitglieder",
|
||||
"board-nb-stars": "%s Sterne",
|
||||
@@ -295,9 +295,9 @@
|
||||
"linkCardPopup-title": "Karte verknüpfen",
|
||||
"searchElementPopup-title": "Suche",
|
||||
"copyCardPopup-title": "Karte kopieren",
|
||||
"copyChecklistToManyCardsPopup-title": "Checklistenvorlage in mehrere Karten kopieren",
|
||||
"copyChecklistToManyCardsPopup-instructions": "Titel und Beschreibungen der Zielkarten im folgenden JSON-Format",
|
||||
"copyChecklistToManyCardsPopup-format": "[ {\"title\": \"Titel der ersten Karte\", \"description\":\"Beschreibung der ersten Karte\"}, {\"title\":\"Titel der zweiten Karte\",\"description\":\"Beschreibung der zweiten Karte\"},{\"title\":\"Titel der letzten Karte\",\"description\":\"Beschreibung der letzten Karte\"} ]",
|
||||
"copyManyCardsPopup-title": "Kopiere die Vorlage zu mehreren Karten",
|
||||
"copyManyCardsPopup-instructions": "Titel und Beschreibungen der Zielkarten im folgenden JSON-Format",
|
||||
"copyManyCardsPopup-format": "[ {\"title\": \"Titel der ersten Karte\", \"description\":\"Beschreibung der ersten Karte\"}, {\"title\":\"Titel der zweiten Karte\",\"description\":\"Beschreibung der zweiten Karte\"},{\"title\":\"Titel der letzten Karte\",\"description\":\"Beschreibung der letzten Karte\"} ]",
|
||||
"create": "Erstellen",
|
||||
"createBoardPopup-title": "Board erstellen",
|
||||
"chooseBoardSourcePopup-title": "Board importieren",
|
||||
@@ -512,7 +512,7 @@
|
||||
"normal": "Normal",
|
||||
"normal-desc": "Kann Karten anzeigen und bearbeiten, aber keine Einstellungen ändern.",
|
||||
"not-accepted-yet": "Die Einladung wurde noch nicht angenommen",
|
||||
"notify-participate": "Benachrichtigungen zu allen Karten erhalten, an denen Sie teilnehmen",
|
||||
"notify-participate": "Benachrichtigungen zu allen Karten erhalten, bei denen Sie Ersteller oder Mitglied sind ",
|
||||
"notify-watch": "Benachrichtigungen über alle Boards, Listen oder Karten erhalten, die Sie beobachten",
|
||||
"optional": "optional",
|
||||
"or": "oder",
|
||||
@@ -541,6 +541,9 @@
|
||||
"rename": "Umbenennen",
|
||||
"rename-board": "Board umbenennen",
|
||||
"restore": "Wiederherstellen",
|
||||
"rescue-card-description": "Zeige eine Sicherheitsmeldung, bevor die Kartenbeschreibung ungespeichert geschlossen wird.",
|
||||
"rescue-card-description-dialogue": "Soll die aktuelle Kartenbeschreibung mit deinen Änderungen überschrieben werden?",
|
||||
"card-settings": "Karten-Einstellungen",
|
||||
"save": "Speichern",
|
||||
"search": "Suchen",
|
||||
"rules": "Regeln",
|
||||
@@ -594,6 +597,7 @@
|
||||
"custom-top-left-corner-logo-height": "Benutzerdefiniertes Logo oben links Höhe. Voreinstellung: 27",
|
||||
"custom-login-logo-image-url": "Benutzerdefiniertes Login Logo Bild URL",
|
||||
"custom-login-logo-link-url": "Benutzerdefiniertes Login Logo Link URL",
|
||||
"custom-help-link-url": "Custom Help Link URL",
|
||||
"text-below-custom-login-logo": "Text unterhalb benutzerdefiniertem Login Logo",
|
||||
"automatic-linked-url-schemes": "Spezielle URL-Schemas, die durch Klick automatisch öffenbar sein sollen. Ein URL-Schema pro Zeile",
|
||||
"username": "Benutzername",
|
||||
@@ -706,7 +710,6 @@
|
||||
"default": "Standard",
|
||||
"queue": "Warteschlange",
|
||||
"subtask-settings": "Einstellungen für Teilaufgaben",
|
||||
"card-settings": "Karten-Einstellungen",
|
||||
"minicard-settings": "Minikarte-Einstellungen",
|
||||
"boardSubtaskSettingsPopup-title": "Boardeinstellungen für Teilaufgaben",
|
||||
"boardCardSettingsPopup-title": "Karten-Einstellungen",
|
||||
@@ -882,10 +885,10 @@
|
||||
"act-pastdue": "erinnernd an das aktuelle Fälligkeitszeitpunkt (__timeValue__) von __card__ ist vorbei",
|
||||
"act-duenow": "erinnernd an das aktuelle Fälligkeitszeitpunkt (__timeValue__) von __card__ ist jetzt",
|
||||
"act-atUserComment": "Sie wurden in [__board__] __list__/__card__ erwähnt",
|
||||
"delete-user-confirm-popup": "Sind Sie sicher, dass Sie diesen Account löschen wollen? Die Aktion kann nicht rückgängig gemacht werden.",
|
||||
"delete-user-confirm-popup": "Möchten Sie dieses Benutzerkonto wirklich löschen? Die Aktion kann nicht rückgängig gemacht werden.",
|
||||
"delete-team-confirm-popup": "Sind Sie sicher, daß Sie dieses Team löschen wollen? Es gibt keine Möglichkeit, das rückgängig zu machen.",
|
||||
"delete-org-confirm-popup": "Sind Sie sicher, daß Sie diese Organisation löschen wollen? Es gibt keine Möglichkeit, das rückgängig zu machen.",
|
||||
"accounts-allowUserDelete": "Erlaube Benutzern ihren eigenen Account zu löschen",
|
||||
"accounts-allowUserDelete": "Erlaube Benutzern ihr Benutzerkonto selbst zu löschen",
|
||||
"hide-minicard-label-text": "Labeltext auf Minikarte ausblenden",
|
||||
"show-desktop-drag-handles": "Desktop-Ziehpunkte anzeigen",
|
||||
"assignee": "Zugewiesen",
|
||||
@@ -901,6 +904,7 @@
|
||||
"editUserPopup-title": "Benutzer ändern",
|
||||
"newUserPopup-title": "Neuer Benutzer",
|
||||
"notifications": "Benachrichtigungen",
|
||||
"help": "Help",
|
||||
"view-all": "Alle anzeigen",
|
||||
"filter-by-unread": "Nur ungelesene",
|
||||
"mark-all-as-read": "Alle als gelesen markieren",
|
||||
@@ -1158,7 +1162,7 @@
|
||||
"checklistActionsPopup-title": "Checklistenaktionen",
|
||||
"moveChecklist": "Checkliste verschieben",
|
||||
"moveChecklistPopup-title": "Checkliste verschieben",
|
||||
"newlineBecomesNewChecklistItem": "Neue Zeile wird ein neues Checklistenelement",
|
||||
"newlineBecomesNewChecklistItem": "Neue Zeile wird neuer Checklisteneintrag",
|
||||
"copyChecklist": "Checkliste kopieren",
|
||||
"copyChecklistPopup-title": "Checkliste kopieren",
|
||||
"card-show-lists": "Listen anzeigen",
|
||||
@@ -1177,5 +1181,13 @@
|
||||
"storage": "Speicher",
|
||||
"action": "Aktion",
|
||||
"board-title": "Board-Titel",
|
||||
"attachmentRenamePopup-title": "Umbenennen"
|
||||
"attachmentRenamePopup-title": "Umbenennen",
|
||||
"uploading": "Hochladen",
|
||||
"remaining_time": "Verbleibende Zeit",
|
||||
"speed": "Schnelligkeit",
|
||||
"progress": "Fortschritt",
|
||||
"password-again": "Passwort (wiederholen)",
|
||||
"if-you-already-have-an-account": "Wenn Sie bereits ein Benutzerkonto haben",
|
||||
"register": "Registrieren",
|
||||
"forgot-password": "Passwort vergessen"
|
||||
}
|
||||
@@ -295,9 +295,9 @@
|
||||
"linkCardPopup-title": "Σύνδεση Κάρτας",
|
||||
"searchElementPopup-title": "Αναζήτηση",
|
||||
"copyCardPopup-title": "Αντιγραφή Κάρτας",
|
||||
"copyChecklistToManyCardsPopup-title": "Αντιγραφή του Προτύπου Λίστας Ελέγχου - Checklist σε πολλές Κάρτες",
|
||||
"copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
|
||||
"copyChecklistToManyCardsPopup-format": "[ {\"title\": \"Τίτλος πρώτης κάρτας\", \"description\":\"Περιγραφή πρώτης κάρτας\"}, {\"title\":\"Τίτλος δεύτερης κάρτας\",\"description\":\"Περιγραφή δεύτερης κάρτας\"},{\"title\":\"Τίτλος τελευταίας κάρτας\",\"description\":\"Περιγραφή τελευταίας κάρτας\"} ]",
|
||||
"copyManyCardsPopup-title": "Copy Template to Many Cards",
|
||||
"copyManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
|
||||
"copyManyCardsPopup-format": "[ {\"title\": \"Τίτλος πρώτης κάρτας\", \"description\":\"Περιγραφή πρώτης κάρτας\"}, {\"title\":\"Τίτλος δεύτερης κάρτας\",\"description\":\"Περιγραφή δεύτερης κάρτας\"},{\"title\":\"Τίτλος τελευταίας κάρτας\",\"description\":\"Περιγραφή τελευταίας κάρτας\"} ]",
|
||||
"create": "Δημιουργία",
|
||||
"createBoardPopup-title": "Δημιουργία Πίνακα",
|
||||
"chooseBoardSourcePopup-title": "Εισαγωγή πίνακα",
|
||||
@@ -512,7 +512,7 @@
|
||||
"normal": "Κανονικό",
|
||||
"normal-desc": "Can view and edit cards. Can't change settings.",
|
||||
"not-accepted-yet": "Η πρόσκληση δεν έχει λάβει αποδοχή ακόμη",
|
||||
"notify-participate": "Receive updates to any cards you participate as creater or member",
|
||||
"notify-participate": "Receive updates to any cards you participate as creator or member",
|
||||
"notify-watch": "Receive updates to any boards, lists, or cards you’re watching",
|
||||
"optional": "προεραιτικό",
|
||||
"or": "ή",
|
||||
@@ -541,6 +541,9 @@
|
||||
"rename": "Μετανομασία",
|
||||
"rename-board": "Μετονομασία Πίνακα",
|
||||
"restore": "Επαναφορά",
|
||||
"rescue-card-description": "Show rescue dialogue before closing for unsaved card descriptions",
|
||||
"rescue-card-description-dialogue": "Overwrite current card description with your changes?",
|
||||
"card-settings": "Ρυθμίσεις Κάρτας",
|
||||
"save": "Αποθήκευση",
|
||||
"search": "Αναζήτηση",
|
||||
"rules": "Κανόνες",
|
||||
@@ -594,6 +597,7 @@
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
"custom-login-logo-image-url": "Custom Login Logo Image URL",
|
||||
"custom-login-logo-link-url": "Custom Login Logo Link URL",
|
||||
"custom-help-link-url": "Custom Help Link URL",
|
||||
"text-below-custom-login-logo": "Text below Custom Login Logo",
|
||||
"automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line",
|
||||
"username": "Όνομα Χρήστη",
|
||||
@@ -706,7 +710,6 @@
|
||||
"default": "Προεπιλογή",
|
||||
"queue": "Ουρά αναμονής",
|
||||
"subtask-settings": "Ρυθμίσεις υποεργασιών (subtasks)",
|
||||
"card-settings": "Ρυθμίσεις Κάρτας",
|
||||
"minicard-settings": "Minicard Settings",
|
||||
"boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
|
||||
"boardCardSettingsPopup-title": "Ρυθμίσεις Κάρτας",
|
||||
@@ -901,6 +904,7 @@
|
||||
"editUserPopup-title": "Edit User",
|
||||
"newUserPopup-title": "New User",
|
||||
"notifications": "Notifications",
|
||||
"help": "Help",
|
||||
"view-all": "View All",
|
||||
"filter-by-unread": "Filter by Unread",
|
||||
"mark-all-as-read": "Mark all as read",
|
||||
@@ -1177,5 +1181,13 @@
|
||||
"storage": "Storage",
|
||||
"action": "Ενέργεια",
|
||||
"board-title": "Board Title",
|
||||
"attachmentRenamePopup-title": "Μετανομασία"
|
||||
"attachmentRenamePopup-title": "Μετανομασία",
|
||||
"uploading": "Uploading",
|
||||
"remaining_time": "Remaining time",
|
||||
"speed": "Speed",
|
||||
"progress": "Progress",
|
||||
"password-again": "Password (again)",
|
||||
"if-you-already-have-an-account": "If you already have an account",
|
||||
"register": "Register",
|
||||
"forgot-password": "Forgot password"
|
||||
}
|
||||
@@ -288,9 +288,9 @@
|
||||
"linkCardPopup-title": "Σύνδεση Κάρτας",
|
||||
"searchElementPopup-title": "Αναζήτηση",
|
||||
"copyCardPopup-title": "Αντιγραφή Κάρτας",
|
||||
"copyChecklistToManyCardsPopup-title": "Αντιγραφή του Προτύπου Λίστας Ελέγχου - Checklist σε πολλές Κάρτες",
|
||||
"copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
|
||||
"copyChecklistToManyCardsPopup-format": "[ {\"title\": \"Τίτλος πρώτης κάρτας\", \"description\":\"Περιγραφή πρώτης κάρτας\"}, {\"title\":\"Τίτλος δεύτερης κάρτας\",\"description\":\"Περιγραφή δεύτερης κάρτας\"},{\"title\":\"Τίτλος τελευταίας κάρτας\",\"description\":\"Περιγραφή τελευταίας κάρτας\"} ]",
|
||||
"copyManyCardsPopup-title": "Αντιγραφή του Προτύπου Λίστας Ελέγχου - Checklist σε πολλές Κάρτες",
|
||||
"copyManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
|
||||
"copyManyCardsPopup-format": "[ {\"title\": \"Τίτλος πρώτης κάρτας\", \"description\":\"Περιγραφή πρώτης κάρτας\"}, {\"title\":\"Τίτλος δεύτερης κάρτας\",\"description\":\"Περιγραφή δεύτερης κάρτας\"},{\"title\":\"Τίτλος τελευταίας κάρτας\",\"description\":\"Περιγραφή τελευταίας κάρτας\"} ]",
|
||||
"create": "Δημιουργία",
|
||||
"createBoardPopup-title": "Δημιουργία Πίνακα",
|
||||
"chooseBoardSourcePopup-title": "Εισαγωγή πίνακα",
|
||||
|
||||
@@ -295,9 +295,9 @@
|
||||
"linkCardPopup-title": "Link Card",
|
||||
"searchElementPopup-title": "Search",
|
||||
"copyCardPopup-title": "Copy Card",
|
||||
"copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
|
||||
"copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
|
||||
"copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
|
||||
"copyManyCardsPopup-title": "Copy Template to Many Cards",
|
||||
"copyManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
|
||||
"copyManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
|
||||
"create": "Create",
|
||||
"createBoardPopup-title": "Create Board",
|
||||
"chooseBoardSourcePopup-title": "Import board",
|
||||
@@ -512,7 +512,7 @@
|
||||
"normal": "Normal",
|
||||
"normal-desc": "Can view and edit cards. Can't change settings.",
|
||||
"not-accepted-yet": "Invitation not accepted yet",
|
||||
"notify-participate": "Receive updates to any cards you participate as creater or member",
|
||||
"notify-participate": "Receive updates to any cards you participate as creator or member",
|
||||
"notify-watch": "Receive updates to any boards, lists, or cards you’re watching",
|
||||
"optional": "optional",
|
||||
"or": "or",
|
||||
@@ -541,6 +541,9 @@
|
||||
"rename": "Rename",
|
||||
"rename-board": "Rename Board",
|
||||
"restore": "Restore",
|
||||
"rescue-card-description": "Show rescue dialogue before closing for unsaved card descriptions",
|
||||
"rescue-card-description-dialogue": "Overwrite current card description with your changes?",
|
||||
"card-settings": "Card Settings",
|
||||
"save": "Save",
|
||||
"search": "Search",
|
||||
"rules": "Rules",
|
||||
@@ -594,6 +597,7 @@
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
"custom-login-logo-image-url": "Custom Login Logo Image URL",
|
||||
"custom-login-logo-link-url": "Custom Login Logo Link URL",
|
||||
"custom-help-link-url": "Custom Help Link URL",
|
||||
"text-below-custom-login-logo": "Text below Custom Login Logo",
|
||||
"automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line",
|
||||
"username": "Username",
|
||||
@@ -706,7 +710,6 @@
|
||||
"default": "Default",
|
||||
"queue": "Queue",
|
||||
"subtask-settings": "Subtasks Settings",
|
||||
"card-settings": "Card Settings",
|
||||
"minicard-settings": "Minicard Settings",
|
||||
"boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
|
||||
"boardCardSettingsPopup-title": "Card Settings",
|
||||
@@ -901,6 +904,7 @@
|
||||
"editUserPopup-title": "Edit User",
|
||||
"newUserPopup-title": "New User",
|
||||
"notifications": "Notifications",
|
||||
"help": "Help",
|
||||
"view-all": "View All",
|
||||
"filter-by-unread": "Filter by Unread",
|
||||
"mark-all-as-read": "Mark all as read",
|
||||
@@ -1177,5 +1181,13 @@
|
||||
"storage": "Storage",
|
||||
"action": "Action",
|
||||
"board-title": "Board Title",
|
||||
"attachmentRenamePopup-title": "Rename"
|
||||
"attachmentRenamePopup-title": "Rename",
|
||||
"uploading": "Uploading",
|
||||
"remaining_time": "Remaining time",
|
||||
"speed": "Speed",
|
||||
"progress": "Progress",
|
||||
"password-again": "Password (again)",
|
||||
"if-you-already-have-an-account": "If you already have an account",
|
||||
"register": "Register",
|
||||
"forgot-password": "Forgot password"
|
||||
}
|
||||
@@ -295,9 +295,9 @@
|
||||
"linkCardPopup-title": "Link Card",
|
||||
"searchElementPopup-title": "Search",
|
||||
"copyCardPopup-title": "Copy Card",
|
||||
"copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
|
||||
"copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
|
||||
"copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
|
||||
"copyManyCardsPopup-title": "Copy Template to Many Cards",
|
||||
"copyManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
|
||||
"copyManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
|
||||
"create": "Create",
|
||||
"createBoardPopup-title": "Create Board",
|
||||
"chooseBoardSourcePopup-title": "Import board",
|
||||
@@ -512,7 +512,7 @@
|
||||
"normal": "Normal",
|
||||
"normal-desc": "Can view and edit cards. Can't change settings.",
|
||||
"not-accepted-yet": "Invitation not accepted yet",
|
||||
"notify-participate": "Receive updates to any cards you participate as creater or member",
|
||||
"notify-participate": "Receive updates to any cards you participate as creator or member",
|
||||
"notify-watch": "Receive updates to any boards, lists, or cards you’re watching",
|
||||
"optional": "optional",
|
||||
"or": "or",
|
||||
@@ -541,6 +541,9 @@
|
||||
"rename": "Rename",
|
||||
"rename-board": "Rename Board",
|
||||
"restore": "Restore",
|
||||
"rescue-card-description": "Show rescue dialogue before closing for unsaved card descriptions",
|
||||
"rescue-card-description-dialogue": "Overwrite current card description with your changes?",
|
||||
"card-settings": "Card Settings",
|
||||
"save": "Save",
|
||||
"search": "Search",
|
||||
"rules": "Rules",
|
||||
@@ -594,6 +597,7 @@
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
"custom-login-logo-image-url": "Custom Login Logo Image URL",
|
||||
"custom-login-logo-link-url": "Custom Login Logo Link URL",
|
||||
"custom-help-link-url": "Custom Help Link URL",
|
||||
"text-below-custom-login-logo": "Text below Custom Login Logo",
|
||||
"automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line",
|
||||
"username": "Username",
|
||||
@@ -706,7 +710,6 @@
|
||||
"default": "Default",
|
||||
"queue": "Queue",
|
||||
"subtask-settings": "Subtasks Settings",
|
||||
"card-settings": "Card Settings",
|
||||
"minicard-settings": "Minicard Settings",
|
||||
"boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
|
||||
"boardCardSettingsPopup-title": "Card Settings",
|
||||
@@ -901,6 +904,7 @@
|
||||
"editUserPopup-title": "Edit User",
|
||||
"newUserPopup-title": "New User",
|
||||
"notifications": "Notifications",
|
||||
"help": "Help",
|
||||
"view-all": "View All",
|
||||
"filter-by-unread": "Filter by Unread",
|
||||
"mark-all-as-read": "Mark all as read",
|
||||
@@ -1177,5 +1181,13 @@
|
||||
"storage": "Storage",
|
||||
"action": "Action",
|
||||
"board-title": "Board Title",
|
||||
"attachmentRenamePopup-title": "Rename"
|
||||
"attachmentRenamePopup-title": "Rename",
|
||||
"uploading": "Uploading",
|
||||
"remaining_time": "Remaining time",
|
||||
"speed": "Speed",
|
||||
"progress": "Progress",
|
||||
"password-again": "Password (again)",
|
||||
"if-you-already-have-an-account": "If you already have an account",
|
||||
"register": "Register",
|
||||
"forgot-password": "Forgot password"
|
||||
}
|
||||
@@ -295,9 +295,9 @@
|
||||
"linkCardPopup-title": "Link Card",
|
||||
"searchElementPopup-title": "Search",
|
||||
"copyCardPopup-title": "Copy Card",
|
||||
"copyChecklistToManyCardsPopup-title": "Copy Checklist Template to Many Cards",
|
||||
"copyChecklistToManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
|
||||
"copyChecklistToManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
|
||||
"copyManyCardsPopup-title": "Copy Template to Many Cards",
|
||||
"copyManyCardsPopup-instructions": "Destination Card Titles and Descriptions in this JSON format",
|
||||
"copyManyCardsPopup-format": "[ {\"title\": \"First card title\", \"description\":\"First card description\"}, {\"title\":\"Second card title\",\"description\":\"Second card description\"},{\"title\":\"Last card title\",\"description\":\"Last card description\"} ]",
|
||||
"create": "Create",
|
||||
"createBoardPopup-title": "Create Board",
|
||||
"chooseBoardSourcePopup-title": "Import board",
|
||||
@@ -512,7 +512,7 @@
|
||||
"normal": "Normal",
|
||||
"normal-desc": "Can view and edit cards. Can't change settings.",
|
||||
"not-accepted-yet": "Invitation not accepted yet",
|
||||
"notify-participate": "Receive updates to any cards you participate as creater or member",
|
||||
"notify-participate": "Receive updates to any cards you participate as creator or member",
|
||||
"notify-watch": "Receive updates to any boards, lists, or cards you’re watching",
|
||||
"optional": "optional",
|
||||
"or": "or",
|
||||
@@ -541,6 +541,9 @@
|
||||
"rename": "Rename",
|
||||
"rename-board": "Rename Board",
|
||||
"restore": "Restore",
|
||||
"rescue-card-description": "Show rescue dialogue before closing for unsaved card descriptions",
|
||||
"rescue-card-description-dialogue": "Overwrite current card description with your changes?",
|
||||
"card-settings": "Card Settings",
|
||||
"save": "Save",
|
||||
"search": "Search",
|
||||
"rules": "Rules",
|
||||
@@ -594,6 +597,7 @@
|
||||
"custom-top-left-corner-logo-height": "Custom Top Left Corner Logo Height. Default: 27",
|
||||
"custom-login-logo-image-url": "Custom Login Logo Image URL",
|
||||
"custom-login-logo-link-url": "Custom Login Logo Link URL",
|
||||
"custom-help-link-url": "Custom Help Link URL",
|
||||
"text-below-custom-login-logo": "Text below Custom Login Logo",
|
||||
"automatic-linked-url-schemes": "Custom URL Schemes which should automatically be clickable. One URL Scheme per line",
|
||||
"username": "Username",
|
||||
@@ -706,7 +710,6 @@
|
||||
"default": "Default",
|
||||
"queue": "Queue",
|
||||
"subtask-settings": "Subtasks Settings",
|
||||
"card-settings": "Card Settings",
|
||||
"minicard-settings": "Minicard Settings",
|
||||
"boardSubtaskSettingsPopup-title": "Board Subtasks Settings",
|
||||
"boardCardSettingsPopup-title": "Card Settings",
|
||||
@@ -901,6 +904,7 @@
|
||||
"editUserPopup-title": "Edit User",
|
||||
"newUserPopup-title": "New User",
|
||||
"notifications": "Notifications",
|
||||
"help": "Help",
|
||||
"view-all": "View All",
|
||||
"filter-by-unread": "Filter by Unread",
|
||||
"mark-all-as-read": "Mark all as read",
|
||||
@@ -1177,5 +1181,13 @@
|
||||
"storage": "Storage",
|
||||
"action": "Action",
|
||||
"board-title": "Board Title",
|
||||
"attachmentRenamePopup-title": "Rename"
|
||||
"attachmentRenamePopup-title": "Rename",
|
||||
"uploading": "Uploading",
|
||||
"remaining_time": "Remaining time",
|
||||
"speed": "Speed",
|
||||
"progress": "Progress",
|
||||
"password-again": "Password (again)",
|
||||
"if-you-already-have-an-account": "If you already have an account",
|
||||
"register": "Register",
|
||||
"forgot-password": "Forgot password"
|
||||
}
|
||||
Loaded 100 of 251 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user