Compare commits
355 Commits
backport/5
...
v1.12.3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c325a15971 | ||
|
|
34741c3efd | ||
|
|
36646f8be8 | ||
|
|
231b6e5be3 | ||
|
|
8398dcdb6f | ||
|
|
63846cb72a | ||
|
|
040f48657a | ||
|
|
16c44c36dc | ||
|
|
d5a443ebbd | ||
|
|
bba0d951d5 | ||
|
|
2dd0c09a38 | ||
|
|
01a527b748 | ||
|
|
dd2641d250 | ||
|
|
2c6a38d2ba | ||
|
|
af27b4ff05 | ||
|
|
91347360aa | ||
|
|
49ce3ea9b3 | ||
|
|
2dde00690c | ||
|
|
7eac5db40a | ||
|
|
e93526fde0 | ||
|
|
405a48ba57 | ||
|
|
6dd9edb2af | ||
|
|
4e3493c047 | ||
|
|
566c521139 | ||
|
|
83d80d65d7 | ||
|
|
810ff87893 | ||
|
|
c458a201be | ||
|
|
3810b1ed03 | ||
|
|
7e0c336eef | ||
|
|
547dcbc35b | ||
|
|
52032dd3d1 | ||
|
|
7d7edfb3b0 | ||
|
|
2f124c2f14 | ||
|
|
e0f88e6a27 | ||
|
|
3896c1c9ee | ||
|
|
8670380001 | ||
|
|
9cd58cae17 | ||
|
|
304a4e290e | ||
|
|
e43ad40335 | ||
|
|
5c9df98aee | ||
|
|
548637155c | ||
|
|
4ac0ba920b | ||
|
|
16f7f5453a | ||
|
|
35ee8dc5d1 | ||
|
|
55849d0efb | ||
|
|
1ebae75d25 | ||
|
|
224921e033 | ||
|
|
b942ac9cc1 | ||
|
|
ca063c0f6c | ||
|
|
29d7abd76a | ||
|
|
a9b8fce30e | ||
|
|
6a41c6403e | ||
|
|
e9bf197b29 | ||
|
|
55a28b0853 | ||
|
|
d35f15d65d | ||
|
|
a448546f43 | ||
|
|
a83bcbc00c | ||
|
|
d1b9db0c51 | ||
|
|
2b3c43d658 | ||
|
|
7d6e9feab0 | ||
|
|
53c79253ff | ||
|
|
00dbcd962e | ||
|
|
4eeb67bb56 | ||
|
|
59fe26b1ba | ||
|
|
567ecd782e | ||
|
|
3b5b471c87 | ||
|
|
7211d73159 | ||
|
|
6da7aa5480 | ||
|
|
8832a345b8 | ||
|
|
4e7d50bf2c | ||
|
|
6a6bd5b72b | ||
|
|
5767b70613 | ||
|
|
dc4b77edc8 | ||
|
|
2c1835a287 | ||
|
|
1fd3592ebe | ||
|
|
e5417f0eed | ||
|
|
ee6be8404c | ||
|
|
f5b0077de4 | ||
|
|
97f05e6374 | ||
|
|
4e2b33127c | ||
|
|
20def97ddf | ||
|
|
a1c486cefa | ||
|
|
224a8a059d | ||
|
|
50587f2202 | ||
|
|
b1793e12f8 | ||
|
|
305315c031 | ||
|
|
0803b9bdc2 | ||
|
|
ff3a2ae3c0 | ||
|
|
13e89ae68f | ||
|
|
1b83dfc372 | ||
|
|
cf5ff3cd55 | ||
|
|
0be801dee3 | ||
|
|
f975dc6863 | ||
|
|
c8e94b5b2f | ||
|
|
ea8a982f78 | ||
|
|
e4db0f9286 | ||
|
|
9bb6d1b04f | ||
|
|
6ad1c94060 | ||
|
|
ec281c2068 | ||
|
|
56bb9affea | ||
|
|
c8672ee464 | ||
|
|
3613c2cd68 | ||
|
|
e5dcd211de | ||
|
|
f0e64228fc | ||
|
|
cd72557078 | ||
|
|
e9d0c0131d | ||
|
|
417b7b13e7 | ||
|
|
a1347d6db7 | ||
|
|
c7ecbc99a7 | ||
|
|
e7d5e52c00 | ||
|
|
bb6cc695b6 | ||
|
|
4613c0ccd5 | ||
|
|
566cae9682 | ||
|
|
1375d33091 | ||
|
|
e51aba4e79 | ||
|
|
3e964e3277 | ||
|
|
91a61283e6 | ||
|
|
752fb198f1 | ||
|
|
8fc87997f6 | ||
|
|
cf3fad4f18 | ||
|
|
1bb26481ba | ||
|
|
63325ef0da | ||
|
|
0b1006ff57 | ||
|
|
c52afdb059 | ||
|
|
b13a8014d7 | ||
|
|
869e8a8b88 | ||
|
|
59dedc9d9a | ||
|
|
28b6fbf7b4 | ||
|
|
243a3ba349 | ||
|
|
4fea944207 | ||
|
|
303a4ee737 | ||
|
|
808f28125e | ||
|
|
d4fa66050b | ||
|
|
129d972a37 | ||
|
|
0ee347ab9f | ||
|
|
e7a0c7bee5 | ||
|
|
735579fd1d | ||
|
|
c3168429d8 | ||
|
|
672b301a14 | ||
|
|
7aafcbf80d | ||
|
|
11466c32ea | ||
|
|
3775f53ff8 | ||
|
|
2e7cdcbeec | ||
|
|
1bb2a849b4 | ||
|
|
78e876f9e4 | ||
|
|
d1496a6b95 | ||
|
|
66d4841359 | ||
|
|
8521de277a | ||
|
|
189125aca3 | ||
|
|
eacd219938 | ||
|
|
c48d3b7cb7 | ||
|
|
161fad4df3 | ||
|
|
ae02338f5e | ||
|
|
2cfeeed597 | ||
|
|
2b7804f296 | ||
|
|
eb18d27bc5 | ||
|
|
e85ad0c402 | ||
|
|
7542c44d57 | ||
|
|
fdb157eff7 | ||
|
|
6f0dcbba03 | ||
|
|
061dd35449 | ||
|
|
66a27691e4 | ||
|
|
88ccbdcf5b | ||
|
|
a8d581cbc2 | ||
|
|
f4736861f9 | ||
|
|
1e1fe22154 | ||
|
|
c8931128e7 | ||
|
|
c9b1adbbb6 | ||
|
|
0cc580d46c | ||
|
|
697db29456 | ||
|
|
87eb65ce0b | ||
|
|
1cfaa5ee3c | ||
|
|
888fd674a2 | ||
|
|
5334fc8673 | ||
|
|
a7f486d6b1 | ||
|
|
f1aabb35fd | ||
|
|
8bf087fa87 | ||
|
|
b5440e99a0 | ||
|
|
694a3e8525 | ||
|
|
30a43423f7 | ||
|
|
444e3a967b | ||
|
|
d9689533ed | ||
|
|
a2690e2a6f | ||
|
|
dc6748c6a9 | ||
|
|
d7d6c9ba5e | ||
|
|
a00e42d97f | ||
|
|
142a7e7e44 | ||
|
|
11cf8214ef | ||
|
|
98391cf3de | ||
|
|
52ae8b0261 | ||
|
|
46b2be0532 | ||
|
|
c538a5dce0 | ||
|
|
d28d6f7ca1 | ||
|
|
f0e2459f86 | ||
|
|
d87e8a5f9d | ||
|
|
39ecb4c9ed | ||
|
|
afcd3b7dd2 | ||
|
|
21c34d8000 | ||
|
|
089c55c989 | ||
|
|
d8090331a0 | ||
|
|
de0163f377 | ||
|
|
41c88bd529 | ||
|
|
b740814786 | ||
|
|
52e30a7ca8 | ||
|
|
4faa460afc | ||
|
|
3a461f5e12 | ||
|
|
7520da3455 | ||
|
|
5f790264f4 | ||
|
|
bb38a505a8 | ||
|
|
215925740e | ||
|
|
2cad880bd2 | ||
|
|
8cf754d5e1 | ||
|
|
86f9325542 | ||
|
|
b173684e66 | ||
|
|
01d242077e | ||
|
|
8d1fc3e08d | ||
|
|
1b000264a0 | ||
|
|
357397a2dd | ||
|
|
8d092053bf | ||
|
|
a302b554c8 | ||
|
|
04351d8778 | ||
|
|
4128af5a8d | ||
|
|
4ae731339f | ||
|
|
419b6a223c | ||
|
|
17f31a39a1 | ||
|
|
b34a301936 | ||
|
|
99dcce4d2e | ||
|
|
cdd0796814 | ||
|
|
bf0efbfe51 | ||
|
|
a3ce3c9939 | ||
|
|
d187637bc2 | ||
|
|
501084dc89 | ||
|
|
eaa2cccf55 | ||
|
|
dbac248ff2 | ||
|
|
bf39c2b2b0 | ||
|
|
69d446aaa7 | ||
|
|
2ddf10ef33 | ||
|
|
7702a577a9 | ||
|
|
6834a8cb39 | ||
|
|
485f11a38e | ||
|
|
46ace17a65 | ||
|
|
8f3382191e | ||
|
|
c4bd2995c3 | ||
|
|
61c6d7f005 | ||
|
|
59ecf6936b | ||
|
|
5ede270690 | ||
|
|
fc41410812 | ||
|
|
ec11bf0468 | ||
|
|
ee0b6bfea9 | ||
|
|
7459424216 | ||
|
|
3995b326e4 | ||
|
|
c42a5241fb | ||
|
|
2494770bab | ||
|
|
32a72c8335 | ||
|
|
9ee235d24e | ||
|
|
14236e7934 | ||
|
|
7dd6c19e0d | ||
|
|
cfc1f38378 | ||
|
|
4751517e9a | ||
|
|
9e7224a561 | ||
|
|
f41070c777 | ||
|
|
8965bc2d15 | ||
|
|
2c499601ca | ||
|
|
c80ac4ab9d | ||
|
|
473b481183 | ||
|
|
aeda808d67 | ||
|
|
9b5552663f | ||
|
|
e7a20c18b0 | ||
|
|
899ee5d459 | ||
|
|
778e6980a1 | ||
|
|
9710013a9d | ||
|
|
2e41be3b83 | ||
|
|
334788f4ba | ||
|
|
5f9fcdf3dd | ||
|
|
ec04eadd3b | ||
|
|
68b598f047 | ||
|
|
41d224d7ab | ||
|
|
295d80ec28 | ||
|
|
7aeec0199d | ||
|
|
f6eb4929ca | ||
|
|
01f3514a44 | ||
|
|
443d3f7585 | ||
|
|
22f07394ef | ||
|
|
f760d1b159 | ||
|
|
a950d76e4d | ||
|
|
968cbc39eb | ||
|
|
3fe2e37e64 | ||
|
|
8623e9f3af | ||
|
|
91344b296d | ||
|
|
174756e486 | ||
|
|
47dd5cfdf6 | ||
|
|
170dc6f9b3 | ||
|
|
75e065bcb9 | ||
|
|
07b3d91e4f | ||
|
|
aecd332d5b | ||
|
|
22f4742a73 | ||
|
|
ba645054ea | ||
|
|
ac437b99de | ||
|
|
e537e41254 | ||
|
|
64308791fd | ||
|
|
23a29c62cd | ||
|
|
6d31ba2b04 | ||
|
|
8920bddfd5 | ||
|
|
7b2f32e6a5 | ||
|
|
a464c5c785 | ||
|
|
dc9a0cb31b | ||
|
|
e03b7aa385 | ||
|
|
ab1d89f5b4 | ||
|
|
4e6a7bcd30 | ||
|
|
f3c408abb6 | ||
|
|
3cd514e722 | ||
|
|
471b724ae8 | ||
|
|
e58981577c | ||
|
|
3768013c17 | ||
|
|
d72aa4b047 | ||
|
|
4dcf91e691 | ||
|
|
1cd787fb31 | ||
|
|
6434c7afc4 | ||
|
|
44e61bdc49 | ||
|
|
23c4730ef0 | ||
|
|
744812f01f | ||
|
|
008732aba1 | ||
|
|
7446acebff | ||
|
|
ecc9cbab33 | ||
|
|
3898d17b83 | ||
|
|
365639e9dc | ||
|
|
b5ff812e84 | ||
|
|
8800053905 | ||
|
|
0a77443c5c | ||
|
|
49d9f975f8 | ||
|
|
363812fa4b | ||
|
|
e8ab1adb50 | ||
|
|
0bfa2ac16b | ||
|
|
6b6ce1a3a9 | ||
|
|
0589d4dd61 | ||
|
|
581755e520 | ||
|
|
2d30564a69 | ||
|
|
1474e84640 | ||
|
|
33572a6af9 | ||
|
|
4e2ea13c2c | ||
|
|
216967e976 | ||
|
|
2d9febf8a4 | ||
|
|
2cdca8250c | ||
|
|
81a41ffd6f | ||
|
|
bd02944bf3 | ||
|
|
c34c1bbbf1 | ||
|
|
44fc8a3931 | ||
|
|
44d072647e | ||
|
|
3cb8821dca | ||
|
|
0a649768fa | ||
|
|
c624d51586 | ||
|
|
12514b8c55 | ||
|
|
4d3953ec13 | ||
|
|
1a45c2dba3 | ||
|
|
4b886c6097 |
40
.github/dependabot.yml
vendored
40
.github/dependabot.yml
vendored
@@ -11,24 +11,6 @@ updates:
|
||||
open-pull-requests-limit: 10
|
||||
reviewers:
|
||||
- juliushaertl
|
||||
- luka-nextcloud
|
||||
|
||||
- package-ecosystem: npm
|
||||
target-branch: stable28
|
||||
versioning-strategy: lockfile-only
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: weekly
|
||||
day: saturday
|
||||
time: "03:00"
|
||||
timezone: Europe/Paris
|
||||
ignore:
|
||||
- dependency-name: "*"
|
||||
update-types: ["version-update:semver-major"]
|
||||
open-pull-requests-limit: 30
|
||||
labels:
|
||||
- 3. to review
|
||||
- dependencies
|
||||
|
||||
- package-ecosystem: npm
|
||||
target-branch: stable27
|
||||
@@ -47,6 +29,23 @@ updates:
|
||||
- 3. to review
|
||||
- dependencies
|
||||
|
||||
- package-ecosystem: npm
|
||||
target-branch: stable26
|
||||
versioning-strategy: lockfile-only
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: weekly
|
||||
day: saturday
|
||||
time: "03:00"
|
||||
timezone: Europe/Paris
|
||||
ignore:
|
||||
- dependency-name: "*"
|
||||
update-types: ["version-update:semver-major"]
|
||||
open-pull-requests-limit: 30
|
||||
labels:
|
||||
- 3. to review
|
||||
- dependencies
|
||||
|
||||
- package-ecosystem: composer
|
||||
directory: "/"
|
||||
schedule:
|
||||
@@ -57,8 +56,6 @@ updates:
|
||||
open-pull-requests-limit: 10
|
||||
reviewers:
|
||||
- juliushaertl
|
||||
- luka-nextcloud
|
||||
|
||||
- package-ecosystem: composer
|
||||
directory: "/tests/integration"
|
||||
schedule:
|
||||
@@ -69,8 +66,6 @@ updates:
|
||||
open-pull-requests-limit: 10
|
||||
reviewers:
|
||||
- juliushaertl
|
||||
- luka-nextcloud
|
||||
|
||||
- package-ecosystem: github-actions
|
||||
directory: "/"
|
||||
schedule:
|
||||
@@ -81,4 +76,3 @@ updates:
|
||||
open-pull-requests-limit: 10
|
||||
reviewers:
|
||||
- juliushaertl
|
||||
- luka-nextcloud
|
||||
|
||||
8
.github/workflows/appbuild.yml
vendored
8
.github/workflows/appbuild.yml
vendored
@@ -16,15 +16,15 @@ jobs:
|
||||
node-version: [16.x]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.1
|
||||
- uses: actions/checkout@v4
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v4.0.2
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
- name: Set up npm7
|
||||
run: npm i -g npm@7
|
||||
- name: Setup PHP
|
||||
uses: shivammathur/setup-php@2.30.0
|
||||
uses: shivammathur/setup-php@2.27.1
|
||||
with:
|
||||
php-version: '7.4'
|
||||
tools: composer
|
||||
@@ -37,7 +37,7 @@ jobs:
|
||||
uname -a
|
||||
RUST_BACKTRACE=1 krankerl --version
|
||||
RUST_BACKTRACE=1 krankerl package
|
||||
- uses: actions/upload-artifact@v4
|
||||
- uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: Deck app tarball
|
||||
path: build/artifacts/deck.tar.gz
|
||||
|
||||
8
.github/workflows/appstore-build-publish.yml
vendored
8
.github/workflows/appstore-build-publish.yml
vendored
@@ -51,12 +51,12 @@ jobs:
|
||||
with:
|
||||
path: ${{ env.APP_NAME }}
|
||||
fallbackNode: '^20'
|
||||
fallbackNpm: '^9'
|
||||
fallbackNpm: '^10'
|
||||
|
||||
- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
|
||||
# Skip if no package.json
|
||||
if: ${{ steps.versions.outputs.nodeVersion }}
|
||||
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v3
|
||||
uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v3
|
||||
with:
|
||||
node-version: ${{ steps.versions.outputs.nodeVersion }}
|
||||
|
||||
@@ -66,7 +66,7 @@ jobs:
|
||||
run: npm i -g npm@"${{ steps.versions.outputs.npmVersion }}"
|
||||
|
||||
- name: Set up php ${{ env.PHP_VERSION }}
|
||||
uses: shivammathur/setup-php@a4e22b60bbb9c1021113f2860347b0759f66fe5d # v2
|
||||
uses: shivammathur/setup-php@6d7209f44a25a59e904b1ee9f3b0c33ab2cd888d # v2
|
||||
with:
|
||||
php-version: ${{ env.PHP_VERSION }}
|
||||
coverage: none
|
||||
@@ -151,7 +151,7 @@ jobs:
|
||||
tar -zcvf ${{ env.APP_NAME }}.tar.gz ${{ env.APP_NAME }}
|
||||
|
||||
- name: Attach tarball to github release
|
||||
uses: svenstaro/upload-release-action@04733e069f2d7f7f0b4aebc4fbdbce8613b03ccd # v2
|
||||
uses: svenstaro/upload-release-action@1beeb572c19a9242f4361f4cee78f8e0d9aec5df # v2
|
||||
id: attach_to_release
|
||||
with:
|
||||
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
6
.github/workflows/command-rebase.yml
vendored
6
.github/workflows/command-rebase.yml
vendored
@@ -23,7 +23,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Add reaction on start
|
||||
uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4.0.0
|
||||
uses: peter-evans/create-or-update-comment@23ff15729ef2fc348714a3bb66d2f655ca9066f2 # v3.1.0
|
||||
with:
|
||||
token: ${{ secrets.COMMAND_BOT_PAT }}
|
||||
repository: ${{ github.event.repository.full_name }}
|
||||
@@ -31,7 +31,7 @@ jobs:
|
||||
reaction-type: "+1"
|
||||
|
||||
- name: Checkout the latest code
|
||||
uses: actions/checkout@v4.1.1 # v3.5.2
|
||||
uses: actions/checkout@v4 # v3.5.2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
token: ${{ secrets.COMMAND_BOT_PAT }}
|
||||
@@ -42,7 +42,7 @@ jobs:
|
||||
GITHUB_TOKEN: ${{ secrets.COMMAND_BOT_PAT }}
|
||||
|
||||
- name: Add reaction on failure
|
||||
uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4.0.0
|
||||
uses: peter-evans/create-or-update-comment@23ff15729ef2fc348714a3bb66d2f655ca9066f2 # v3.1.0
|
||||
if: failure()
|
||||
with:
|
||||
token: ${{ secrets.COMMAND_BOT_PAT }}
|
||||
|
||||
16
.github/workflows/cypress.yml
vendored
16
.github/workflows/cypress.yml
vendored
@@ -23,11 +23,11 @@ jobs:
|
||||
# containers: [1, 2, 3]
|
||||
php-versions: [ '8.0' ]
|
||||
databases: [ 'sqlite' ]
|
||||
server-versions: [ 'stable29' ]
|
||||
server-versions: [ 'stable28' ]
|
||||
|
||||
steps:
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v4.0.2
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
|
||||
@@ -37,7 +37,7 @@ jobs:
|
||||
echo "text_app_ref=$text_app_ref" >> $GITHUB_ENV
|
||||
|
||||
- name: Checkout server
|
||||
uses: actions/checkout@v4.1.1
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: nextcloud/server
|
||||
ref: ${{ matrix.server-versions }}
|
||||
@@ -50,19 +50,19 @@ jobs:
|
||||
git -c "http.extraheader=$auth_header" -c protocol.version=2 submodule update --init --force --recursive --depth=1
|
||||
|
||||
- name: Checkout ${{ env.APP_NAME }}
|
||||
uses: actions/checkout@v4.1.1
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
path: apps/${{ env.APP_NAME }}
|
||||
|
||||
- name: Checkout text
|
||||
uses: actions/checkout@v4.1.1
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: nextcloud/text
|
||||
ref: ${{ env.text_app_ref }}
|
||||
path: apps/text
|
||||
|
||||
- name: Set up php ${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@2.30.0
|
||||
uses: shivammathur/setup-php@2.27.1
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
extensions: mbstring, iconv, fileinfo, intl, sqlite, pdo_sqlite, zip, gd, apcu
|
||||
@@ -106,7 +106,7 @@ jobs:
|
||||
npm_package_name: ${{ env.APP_NAME }}
|
||||
|
||||
- name: Upload test failure screenshots
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v3
|
||||
if: failure()
|
||||
with:
|
||||
name: Upload screenshots
|
||||
@@ -114,7 +114,7 @@ jobs:
|
||||
retention-days: 5
|
||||
|
||||
- name: Upload nextcloud logs
|
||||
uses: actions/upload-artifact@v4
|
||||
uses: actions/upload-artifact@v3
|
||||
if: failure()
|
||||
with:
|
||||
name: Upload nextcloud log
|
||||
|
||||
@@ -22,7 +22,7 @@ concurrency:
|
||||
jobs:
|
||||
auto-approve-merge:
|
||||
if: github.actor == 'dependabot[bot]'
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-latest-low
|
||||
permissions:
|
||||
# for hmarr/auto-approve-action to approve PRs
|
||||
pull-requests: write
|
||||
|
||||
2
.github/workflows/fixup.yml
vendored
2
.github/workflows/fixup.yml
vendored
@@ -24,7 +24,7 @@ jobs:
|
||||
pull-requests: write
|
||||
name: Block fixup and squash commits
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-latest-low
|
||||
|
||||
steps:
|
||||
- name: Run check
|
||||
|
||||
10
.github/workflows/integration.yml
vendored
10
.github/workflows/integration.yml
vendored
@@ -28,7 +28,7 @@ jobs:
|
||||
matrix:
|
||||
php-versions: ['8.1']
|
||||
databases: ['sqlite', 'mysql', 'pgsql']
|
||||
server-versions: ['stable29']
|
||||
server-versions: ['stable28']
|
||||
|
||||
name: php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }}
|
||||
|
||||
@@ -52,7 +52,7 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout server
|
||||
uses: actions/checkout@v4.1.1
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: nextcloud/server
|
||||
ref: ${{ matrix.server-versions }}
|
||||
@@ -66,19 +66,19 @@ jobs:
|
||||
cd build/integration && composer require --dev phpunit/phpunit:~9
|
||||
|
||||
- name: Checkout app
|
||||
uses: actions/checkout@v4.1.1
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
path: apps/${{ env.APP_NAME }}
|
||||
|
||||
- name: Checkout activity
|
||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
|
||||
uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||
with:
|
||||
repository: nextcloud/activity
|
||||
ref: ${{ matrix.server-versions }}
|
||||
path: apps/activity
|
||||
|
||||
- name: Set up php ${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@2.30.0
|
||||
uses: shivammathur/setup-php@2.27.1
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
extensions: mbstring, iconv, fileinfo, intl, sqlite, pdo_sqlite, mysql, pdo_mysql, pgsql, pdo_pgsql, apcu
|
||||
|
||||
10
.github/workflows/lint-eslint.yml
vendored
10
.github/workflows/lint-eslint.yml
vendored
@@ -19,13 +19,13 @@ concurrency:
|
||||
|
||||
jobs:
|
||||
changes:
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-latest-low
|
||||
|
||||
outputs:
|
||||
src: ${{ steps.changes.outputs.src}}
|
||||
|
||||
steps:
|
||||
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
||||
- uses: dorny/paths-filter@0bc4621a3135347011ad047f9ecf449bf72ce2bd # v3.0.0
|
||||
id: changes
|
||||
continue-on-error: true
|
||||
with:
|
||||
@@ -60,10 +60,10 @@ jobs:
|
||||
id: versions
|
||||
with:
|
||||
fallbackNode: '^20'
|
||||
fallbackNpm: '^9'
|
||||
fallbackNpm: '^10'
|
||||
|
||||
- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
|
||||
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v3
|
||||
uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v3
|
||||
with:
|
||||
node-version: ${{ steps.versions.outputs.nodeVersion }}
|
||||
|
||||
@@ -82,7 +82,7 @@ jobs:
|
||||
summary:
|
||||
permissions:
|
||||
contents: none
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-latest-low
|
||||
needs: [changes, lint]
|
||||
|
||||
if: always()
|
||||
|
||||
3
.github/workflows/lint-php-cs.yml
vendored
3
.github/workflows/lint-php-cs.yml
vendored
@@ -25,9 +25,10 @@ jobs:
|
||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
|
||||
|
||||
- name: Set up php8.2
|
||||
uses: shivammathur/setup-php@a4e22b60bbb9c1021113f2860347b0759f66fe5d # v2
|
||||
uses: shivammathur/setup-php@6d7209f44a25a59e904b1ee9f3b0c33ab2cd888d # v2
|
||||
with:
|
||||
php-version: 8.2
|
||||
extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite
|
||||
coverage: none
|
||||
ini-file: development
|
||||
env:
|
||||
|
||||
5
.github/workflows/lint-php.yml
vendored
5
.github/workflows/lint-php.yml
vendored
@@ -28,9 +28,10 @@ jobs:
|
||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
|
||||
|
||||
- name: Set up php ${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@a4e22b60bbb9c1021113f2860347b0759f66fe5d # v2
|
||||
uses: shivammathur/setup-php@6d7209f44a25a59e904b1ee9f3b0c33ab2cd888d # v2
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite
|
||||
coverage: none
|
||||
ini-file: development
|
||||
env:
|
||||
@@ -42,7 +43,7 @@ jobs:
|
||||
summary:
|
||||
permissions:
|
||||
contents: none
|
||||
runs-on: ubuntu-latest
|
||||
runs-on: ubuntu-latest-low
|
||||
needs: php-lint
|
||||
|
||||
if: always()
|
||||
|
||||
4
.github/workflows/lint-stylelint.yml
vendored
4
.github/workflows/lint-stylelint.yml
vendored
@@ -29,10 +29,10 @@ jobs:
|
||||
id: versions
|
||||
with:
|
||||
fallbackNode: '^20'
|
||||
fallbackNpm: '^9'
|
||||
fallbackNpm: '^10'
|
||||
|
||||
- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
|
||||
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v3
|
||||
uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v3
|
||||
with:
|
||||
node-version: ${{ steps.versions.outputs.nodeVersion }}
|
||||
|
||||
|
||||
4
.github/workflows/nodejs.yml
vendored
4
.github/workflows/nodejs.yml
vendored
@@ -12,9 +12,9 @@ jobs:
|
||||
node-version: [14.x]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4.1.1
|
||||
- uses: actions/checkout@v4
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v4.0.2
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
- name: Set up npm7
|
||||
|
||||
6
.github/workflows/npm-audit-fix.yml
vendored
6
.github/workflows/npm-audit-fix.yml
vendored
@@ -33,10 +33,10 @@ jobs:
|
||||
id: versions
|
||||
with:
|
||||
fallbackNode: '^20'
|
||||
fallbackNpm: '^9'
|
||||
fallbackNpm: '^10'
|
||||
|
||||
- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
|
||||
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v3
|
||||
uses: actions/setup-node@b39b52d1213e96004bfcb1c61a8a6fa8ab84f3e8 # v3
|
||||
with:
|
||||
node-version: ${{ steps.versions.outputs.nodeVersion }}
|
||||
|
||||
@@ -57,7 +57,7 @@ jobs:
|
||||
|
||||
- name: Create Pull Request
|
||||
if: always()
|
||||
uses: peter-evans/create-pull-request@70a41aba780001da0a30141984ae2a0c95d8704e # v5
|
||||
uses: peter-evans/create-pull-request@b1ddad2c994a25fbc81a28b3ec0e368bb2021c50 # v5
|
||||
with:
|
||||
token: ${{ secrets.COMMAND_BOT_PAT }}
|
||||
commit-message: "chore(deps): fix npm audit"
|
||||
|
||||
185
.github/workflows/phpunit-mysql.yml
vendored
185
.github/workflows/phpunit-mysql.yml
vendored
@@ -1,185 +0,0 @@
|
||||
# This workflow is provided via the organization template repository
|
||||
#
|
||||
# https://github.com/nextcloud/.github
|
||||
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
|
||||
|
||||
name: PHPUnit MySQL
|
||||
|
||||
on: pull_request
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
concurrency:
|
||||
group: phpunit-mysql-${{ github.head_ref || github.run_id }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
matrix:
|
||||
runs-on: ubuntu-latest-low
|
||||
outputs:
|
||||
matrix: ${{ steps.versions.outputs.sparse-matrix }}
|
||||
steps:
|
||||
- name: Checkout app
|
||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
|
||||
|
||||
- name: Get version matrix
|
||||
id: versions
|
||||
uses: icewind1991/nextcloud-version-matrix@58becf3b4bb6dc6cef677b15e2fd8e7d48c0908f # v1.3.1
|
||||
with:
|
||||
matrix: '{"mysql-versions": ["8.1"]}'
|
||||
|
||||
changes:
|
||||
runs-on: ubuntu-latest-low
|
||||
|
||||
outputs:
|
||||
src: ${{ steps.changes.outputs.src}}
|
||||
|
||||
steps:
|
||||
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
||||
id: changes
|
||||
continue-on-error: true
|
||||
with:
|
||||
filters: |
|
||||
src:
|
||||
- '.github/workflows/**'
|
||||
- 'appinfo/**'
|
||||
- 'lib/**'
|
||||
- 'templates/**'
|
||||
- 'tests/**'
|
||||
- 'vendor/**'
|
||||
- 'vendor-bin/**'
|
||||
- '.php-cs-fixer.dist.php'
|
||||
- 'composer.json'
|
||||
- 'composer.lock'
|
||||
|
||||
phpunit-mysql:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
needs: [changes, matrix]
|
||||
if: needs.changes.outputs.src != 'false'
|
||||
|
||||
strategy:
|
||||
matrix: ${{ fromJson(needs.matrix.outputs.matrix) }}
|
||||
|
||||
name: MySQL ${{ matrix.mysql-versions }} PHP ${{ matrix.php-versions }} Nextcloud ${{ matrix.server-versions }}
|
||||
|
||||
services:
|
||||
mysql:
|
||||
image: ghcr.io/nextcloud/continuous-integration-mysql-${{ matrix.mysql-versions }}:latest
|
||||
ports:
|
||||
- 4444:3306/tcp
|
||||
env:
|
||||
MYSQL_ROOT_PASSWORD: rootpassword
|
||||
options: --health-cmd="mysqladmin ping" --health-interval 5s --health-timeout 2s --health-retries 10
|
||||
|
||||
steps:
|
||||
- name: Set app env
|
||||
run: |
|
||||
# Split and keep last
|
||||
echo "APP_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV
|
||||
|
||||
- name: Checkout server
|
||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
|
||||
with:
|
||||
submodules: true
|
||||
repository: nextcloud/server
|
||||
ref: ${{ matrix.server-versions }}
|
||||
|
||||
- name: Checkout app
|
||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
|
||||
with:
|
||||
path: apps/${{ env.APP_NAME }}
|
||||
|
||||
- name: Set up php ${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@a4e22b60bbb9c1021113f2860347b0759f66fe5d # v2
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
|
||||
extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, mysql, pdo_mysql
|
||||
coverage: none
|
||||
ini-file: development
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Enable ONLY_FULL_GROUP_BY MySQL option
|
||||
run: |
|
||||
echo "SET GLOBAL sql_mode=(SELECT CONCAT(@@sql_mode,',ONLY_FULL_GROUP_BY'));" | mysql -h 127.0.0.1 -P 4444 -u root -prootpassword
|
||||
echo "SELECT @@sql_mode;" | mysql -h 127.0.0.1 -P 4444 -u root -prootpassword
|
||||
|
||||
- name: Check composer file existence
|
||||
id: check_composer
|
||||
uses: andstor/file-existence-action@076e0072799f4942c8bc574a82233e1e4d13e9d6 # v3.0.0
|
||||
with:
|
||||
files: apps/${{ env.APP_NAME }}/composer.json
|
||||
|
||||
- name: Set up dependencies
|
||||
# Only run if phpunit config file exists
|
||||
if: steps.check_composer.outputs.files_exists == 'true'
|
||||
working-directory: apps/${{ env.APP_NAME }}
|
||||
run: composer i
|
||||
|
||||
- name: Set up Nextcloud
|
||||
env:
|
||||
DB_PORT: 4444
|
||||
run: |
|
||||
mkdir data
|
||||
./occ maintenance:install --verbose --database=mysql --database-name=nextcloud --database-host=127.0.0.1 --database-port=$DB_PORT --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass admin
|
||||
./occ app:enable --force ${{ env.APP_NAME }}
|
||||
|
||||
- name: Check PHPUnit script is defined
|
||||
id: check_phpunit
|
||||
continue-on-error: true
|
||||
working-directory: apps/${{ env.APP_NAME }}
|
||||
run: |
|
||||
composer run --list | grep "^ test:unit " | wc -l | grep 1
|
||||
|
||||
- name: PHPUnit
|
||||
# Only run if phpunit config file exists
|
||||
if: steps.check_phpunit.outcome == 'success'
|
||||
working-directory: apps/${{ env.APP_NAME }}
|
||||
run: composer run test:unit
|
||||
|
||||
- name: Check PHPUnit integration script is defined
|
||||
id: check_integration
|
||||
continue-on-error: true
|
||||
working-directory: apps/${{ env.APP_NAME }}
|
||||
run: |
|
||||
composer run --list | grep "^ test:integration " | wc -l | grep 1
|
||||
|
||||
- name: Run Nextcloud
|
||||
# Only run if phpunit integration config file exists
|
||||
if: steps.check_integration.outcome == 'success'
|
||||
run: php -S localhost:8080 &
|
||||
|
||||
- name: PHPUnit integration
|
||||
# Only run if phpunit integration config file exists
|
||||
if: steps.check_integration.outcome == 'success'
|
||||
working-directory: apps/${{ env.APP_NAME }}
|
||||
run: composer run test:integration
|
||||
|
||||
- name: Print logs
|
||||
if: always()
|
||||
run: |
|
||||
cat data/nextcloud.log
|
||||
|
||||
- name: Skipped
|
||||
# Fail the action when neither unit nor integration tests ran
|
||||
if: steps.check_phpunit.outcome == 'failure' && steps.check_integration.outcome == 'failure'
|
||||
run: |
|
||||
echo 'Neither PHPUnit nor PHPUnit integration tests are specified in composer.json scripts'
|
||||
exit 1
|
||||
|
||||
summary:
|
||||
permissions:
|
||||
contents: none
|
||||
runs-on: ubuntu-latest-low
|
||||
needs: [changes, phpunit-mysql]
|
||||
|
||||
if: always()
|
||||
|
||||
name: phpunit-mysql-summary
|
||||
|
||||
steps:
|
||||
- name: Summary status
|
||||
run: if ${{ needs.changes.outputs.src != 'false' && needs.phpunit-mysql.result != 'success' }}; then exit 1; fi
|
||||
168
.github/workflows/phpunit-pgsql.yml
vendored
168
.github/workflows/phpunit-pgsql.yml
vendored
@@ -1,168 +0,0 @@
|
||||
# This workflow is provided via the organization template repository
|
||||
#
|
||||
# https://github.com/nextcloud/.github
|
||||
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
|
||||
|
||||
name: PHPUnit pgsql
|
||||
|
||||
on: pull_request
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
concurrency:
|
||||
group: phpunit-pgsql-${{ github.head_ref || github.run_id }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
changes:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
outputs:
|
||||
src: ${{ steps.changes.outputs.src}}
|
||||
|
||||
steps:
|
||||
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
||||
id: changes
|
||||
continue-on-error: true
|
||||
with:
|
||||
filters: |
|
||||
src:
|
||||
- '.github/workflows/**'
|
||||
- 'appinfo/**'
|
||||
- 'lib/**'
|
||||
- 'templates/**'
|
||||
- 'tests/**'
|
||||
- 'vendor/**'
|
||||
- 'vendor-bin/**'
|
||||
- '.php-cs-fixer.dist.php'
|
||||
- 'composer.json'
|
||||
- 'composer.lock'
|
||||
|
||||
phpunit-pgsql:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
needs: changes
|
||||
if: needs.changes.outputs.src != 'false'
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
php-versions: ['8.2']
|
||||
server-versions: ['stable29']
|
||||
|
||||
services:
|
||||
postgres:
|
||||
image: ghcr.io/nextcloud/continuous-integration-postgres-14:latest
|
||||
ports:
|
||||
- 4444:5432/tcp
|
||||
env:
|
||||
POSTGRES_USER: root
|
||||
POSTGRES_PASSWORD: rootpassword
|
||||
POSTGRES_DB: nextcloud
|
||||
options: --health-cmd pg_isready --health-interval 5s --health-timeout 2s --health-retries 5
|
||||
|
||||
steps:
|
||||
- name: Set app env
|
||||
run: |
|
||||
# Split and keep last
|
||||
echo "APP_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV
|
||||
|
||||
- name: Checkout server
|
||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
|
||||
with:
|
||||
submodules: true
|
||||
repository: nextcloud/server
|
||||
ref: ${{ matrix.server-versions }}
|
||||
|
||||
- name: Checkout app
|
||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
|
||||
with:
|
||||
path: apps/${{ env.APP_NAME }}
|
||||
|
||||
- name: Set up php ${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@a4e22b60bbb9c1021113f2860347b0759f66fe5d # v2
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
|
||||
extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, pgsql, pdo_pgsql
|
||||
coverage: none
|
||||
ini-file: development
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Check composer file existence
|
||||
id: check_composer
|
||||
uses: andstor/file-existence-action@076e0072799f4942c8bc574a82233e1e4d13e9d6 # v2
|
||||
with:
|
||||
files: apps/${{ env.APP_NAME }}/composer.json
|
||||
|
||||
- name: Set up dependencies
|
||||
# Only run if phpunit config file exists
|
||||
if: steps.check_composer.outputs.files_exists == 'true'
|
||||
working-directory: apps/${{ env.APP_NAME }}
|
||||
run: composer i
|
||||
|
||||
- name: Set up Nextcloud
|
||||
env:
|
||||
DB_PORT: 4444
|
||||
run: |
|
||||
mkdir data
|
||||
./occ maintenance:install --verbose --database=pgsql --database-name=nextcloud --database-host=127.0.0.1 --database-port=$DB_PORT --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass admin
|
||||
./occ app:enable --force ${{ env.APP_NAME }}
|
||||
|
||||
- name: Check PHPUnit script is defined
|
||||
id: check_phpunit
|
||||
continue-on-error: true
|
||||
working-directory: apps/${{ env.APP_NAME }}
|
||||
run: |
|
||||
composer run --list | grep "^ test:unit " | wc -l | grep 1
|
||||
|
||||
- name: PHPUnit
|
||||
# Only run if phpunit config file exists
|
||||
if: steps.check_phpunit.outcome == 'success'
|
||||
working-directory: apps/${{ env.APP_NAME }}
|
||||
run: composer run test:unit
|
||||
|
||||
- name: Check PHPUnit integration script is defined
|
||||
id: check_integration
|
||||
continue-on-error: true
|
||||
working-directory: apps/${{ env.APP_NAME }}
|
||||
run: |
|
||||
composer run --list | grep "^ test:integration " | wc -l | grep 1
|
||||
|
||||
- name: Run Nextcloud
|
||||
# Only run if phpunit integration config file exists
|
||||
if: steps.check_integration.outcome == 'success'
|
||||
run: php -S localhost:8080 &
|
||||
|
||||
- name: PHPUnit integration
|
||||
# Only run if phpunit integration config file exists
|
||||
if: steps.check_integration.outcome == 'success'
|
||||
working-directory: apps/${{ env.APP_NAME }}
|
||||
run: composer run test:integration
|
||||
|
||||
- name: Print logs
|
||||
if: always()
|
||||
run: |
|
||||
cat data/nextcloud.log
|
||||
|
||||
- name: Skipped
|
||||
# Fail the action when neither unit nor integration tests ran
|
||||
if: steps.check_phpunit.outcome == 'failure' && steps.check_integration.outcome == 'failure'
|
||||
run: |
|
||||
echo 'Neither PHPUnit nor PHPUnit integration tests are specified in composer.json scripts'
|
||||
exit 1
|
||||
|
||||
summary:
|
||||
permissions:
|
||||
contents: none
|
||||
runs-on: ubuntu-latest
|
||||
needs: [changes, phpunit-pgsql]
|
||||
|
||||
if: always()
|
||||
|
||||
name: phpunit-pgsql-summary
|
||||
|
||||
steps:
|
||||
- name: Summary status
|
||||
run: if ${{ needs.changes.outputs.src != 'false' && needs.phpunit-pgsql.result != 'success' }}; then exit 1; fi
|
||||
157
.github/workflows/phpunit-sqlite.yml
vendored
157
.github/workflows/phpunit-sqlite.yml
vendored
@@ -1,157 +0,0 @@
|
||||
# This workflow is provided via the organization template repository
|
||||
#
|
||||
# https://github.com/nextcloud/.github
|
||||
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
|
||||
|
||||
name: PHPUnit sqlite
|
||||
|
||||
on: pull_request
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
concurrency:
|
||||
group: phpunit-sqlite-${{ github.head_ref || github.run_id }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
changes:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
outputs:
|
||||
src: ${{ steps.changes.outputs.src}}
|
||||
|
||||
steps:
|
||||
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
||||
id: changes
|
||||
continue-on-error: true
|
||||
with:
|
||||
filters: |
|
||||
src:
|
||||
- '.github/workflows/**'
|
||||
- 'appinfo/**'
|
||||
- 'lib/**'
|
||||
- 'templates/**'
|
||||
- 'tests/**'
|
||||
- 'vendor/**'
|
||||
- 'vendor-bin/**'
|
||||
- '.php-cs-fixer.dist.php'
|
||||
- 'composer.json'
|
||||
- 'composer.lock'
|
||||
|
||||
phpunit-sqlite:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
needs: changes
|
||||
if: needs.changes.outputs.src != 'false'
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
php-versions: ['8.2']
|
||||
server-versions: ['stable29']
|
||||
|
||||
steps:
|
||||
- name: Set app env
|
||||
run: |
|
||||
# Split and keep last
|
||||
echo "APP_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV
|
||||
|
||||
- name: Checkout server
|
||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
|
||||
with:
|
||||
submodules: true
|
||||
repository: nextcloud/server
|
||||
ref: ${{ matrix.server-versions }}
|
||||
|
||||
- name: Checkout app
|
||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
|
||||
with:
|
||||
path: apps/${{ env.APP_NAME }}
|
||||
|
||||
- name: Set up php ${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@a4e22b60bbb9c1021113f2860347b0759f66fe5d # v2
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
|
||||
extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite
|
||||
coverage: none
|
||||
ini-file: development
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Check composer file existence
|
||||
id: check_composer
|
||||
uses: andstor/file-existence-action@076e0072799f4942c8bc574a82233e1e4d13e9d6 # v2
|
||||
with:
|
||||
files: apps/${{ env.APP_NAME }}/composer.json
|
||||
|
||||
- name: Set up dependencies
|
||||
# Only run if phpunit config file exists
|
||||
if: steps.check_composer.outputs.files_exists == 'true'
|
||||
working-directory: apps/${{ env.APP_NAME }}
|
||||
run: composer i
|
||||
|
||||
- name: Set up Nextcloud
|
||||
env:
|
||||
DB_PORT: 4444
|
||||
run: |
|
||||
mkdir data
|
||||
./occ maintenance:install --verbose --database=sqlite --database-name=nextcloud --database-host=127.0.0.1 --database-port=$DB_PORT --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass admin
|
||||
./occ app:enable --force ${{ env.APP_NAME }}
|
||||
|
||||
- name: Check PHPUnit script is defined
|
||||
id: check_phpunit
|
||||
continue-on-error: true
|
||||
working-directory: apps/${{ env.APP_NAME }}
|
||||
run: |
|
||||
composer run --list | grep "^ test:unit " | wc -l | grep 1
|
||||
|
||||
- name: PHPUnit
|
||||
# Only run if phpunit config file exists
|
||||
if: steps.check_phpunit.outcome == 'success'
|
||||
working-directory: apps/${{ env.APP_NAME }}
|
||||
run: composer run test:unit
|
||||
|
||||
- name: Check PHPUnit integration script is defined
|
||||
id: check_integration
|
||||
continue-on-error: true
|
||||
working-directory: apps/${{ env.APP_NAME }}
|
||||
run: |
|
||||
composer run --list | grep "^ test:integration " | wc -l | grep 1
|
||||
|
||||
- name: Run Nextcloud
|
||||
# Only run if phpunit integration config file exists
|
||||
if: steps.check_integration.outcome == 'success'
|
||||
run: php -S localhost:8080 &
|
||||
|
||||
- name: PHPUnit integration
|
||||
# Only run if phpunit integration config file exists
|
||||
if: steps.check_integration.outcome == 'success'
|
||||
working-directory: apps/${{ env.APP_NAME }}
|
||||
run: composer run test:integration
|
||||
|
||||
- name: Print logs
|
||||
if: always()
|
||||
run: |
|
||||
cat data/nextcloud.log
|
||||
|
||||
- name: Skipped
|
||||
# Fail the action when neither unit nor integration tests ran
|
||||
if: steps.check_phpunit.outcome == 'failure' && steps.check_integration.outcome == 'failure'
|
||||
run: |
|
||||
echo 'Neither PHPUnit nor PHPUnit integration tests are specified in composer.json scripts'
|
||||
exit 1
|
||||
|
||||
summary:
|
||||
permissions:
|
||||
contents: none
|
||||
runs-on: ubuntu-latest
|
||||
needs: [changes, phpunit-sqlite]
|
||||
|
||||
if: always()
|
||||
|
||||
name: phpunit-sqlite-summary
|
||||
|
||||
steps:
|
||||
- name: Summary status
|
||||
run: if ${{ needs.changes.outputs.src != 'false' && needs.phpunit-sqlite.result != 'success' }}; then exit 1; fi
|
||||
102
.github/workflows/phpunit.yml
vendored
Normal file
102
.github/workflows/phpunit.yml
vendored
Normal file
@@ -0,0 +1,102 @@
|
||||
name: PHPUnit
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
paths:
|
||||
- '.github/workflows/phpunit.yml'
|
||||
- 'appinfo/**'
|
||||
- 'lib/**'
|
||||
- 'templates/**'
|
||||
- 'tests/**'
|
||||
- 'composer.json'
|
||||
- 'composer.lock'
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- stable*
|
||||
|
||||
env:
|
||||
APP_NAME: deck
|
||||
|
||||
|
||||
jobs:
|
||||
integration:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
php-versions: ['8.0', '8.1', '8.2', '8.3']
|
||||
databases: ['sqlite', 'mysql', 'pgsql']
|
||||
server-versions: ['stable28']
|
||||
|
||||
name: php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }}
|
||||
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:14
|
||||
ports:
|
||||
- 4445:5432/tcp
|
||||
env:
|
||||
POSTGRES_USER: root
|
||||
POSTGRES_PASSWORD: rootpassword
|
||||
POSTGRES_DB: nextcloud
|
||||
options: --health-cmd pg_isready --health-interval 5s --health-timeout 2s --health-retries 5
|
||||
mysql:
|
||||
image: mariadb:10.5
|
||||
ports:
|
||||
- 4444:3306/tcp
|
||||
env:
|
||||
MYSQL_ROOT_PASSWORD: rootpassword
|
||||
options: --health-cmd="mysqladmin ping" --health-interval 5s --health-timeout 2s --health-retries 5
|
||||
|
||||
steps:
|
||||
- name: Checkout server
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
repository: nextcloud/server
|
||||
ref: ${{ matrix.server-versions }}
|
||||
|
||||
- name: Checkout submodules
|
||||
shell: bash
|
||||
run: |
|
||||
auth_header="$(git config --local --get http.https://github.com/.extraheader)"
|
||||
git submodule sync --recursive
|
||||
git -c "http.extraheader=$auth_header" -c protocol.version=2 submodule update --init --force --recursive --depth=1
|
||||
|
||||
- name: Checkout app
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
path: apps/${{ env.APP_NAME }}
|
||||
|
||||
- name: Set up php ${{ matrix.php-versions }}
|
||||
uses: shivammathur/setup-php@2.27.1
|
||||
with:
|
||||
php-version: ${{ matrix.php-versions }}
|
||||
tools: phpunit
|
||||
extensions: zip, gd, mbstring, iconv, fileinfo, intl, sqlite, pdo_sqlite, mysql, pdo_mysql, pgsql, pdo_pgsql
|
||||
coverage: none
|
||||
|
||||
- name: Set up PHPUnit
|
||||
working-directory: apps/${{ env.APP_NAME }}
|
||||
run: composer i
|
||||
|
||||
- name: Set up Nextcloud
|
||||
run: |
|
||||
if [ "${{ matrix.databases }}" = "mysql" ]; then
|
||||
export DB_PORT=4444
|
||||
elif [ "${{ matrix.databases }}" = "pgsql" ]; then
|
||||
export DB_PORT=4445
|
||||
fi
|
||||
mkdir data
|
||||
./occ maintenance:install --verbose --database=${{ matrix.databases }} --database-name=nextcloud --database-host=127.0.0.1 --database-port=$DB_PORT --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass admin
|
||||
./occ app:enable --force ${{ env.APP_NAME }}
|
||||
php -S localhost:8080 &
|
||||
|
||||
- name: PHPUnit
|
||||
working-directory: apps/${{ env.APP_NAME }}
|
||||
run: ./vendor/phpunit/phpunit/phpunit -c tests/phpunit.xml
|
||||
|
||||
- name: PHPUnit integration
|
||||
working-directory: apps/${{ env.APP_NAME }}
|
||||
run: ./vendor/phpunit/phpunit/phpunit -c tests/phpunit.integration.xml
|
||||
3
.github/workflows/psalm.yml
vendored
3
.github/workflows/psalm.yml
vendored
@@ -21,9 +21,10 @@ jobs:
|
||||
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
|
||||
|
||||
- name: Set up php8.2
|
||||
uses: shivammathur/setup-php@a4e22b60bbb9c1021113f2860347b0759f66fe5d # v2
|
||||
uses: shivammathur/setup-php@6d7209f44a25a59e904b1ee9f3b0c33ab2cd888d # v2
|
||||
with:
|
||||
php-version: 8.2
|
||||
extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite
|
||||
coverage: none
|
||||
ini-file: development
|
||||
env:
|
||||
|
||||
@@ -1,49 +0,0 @@
|
||||
# This workflow is provided via the organization template repository
|
||||
#
|
||||
# https://github.com/nextcloud/.github
|
||||
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
|
||||
|
||||
name: Auto approve nextcloud/ocp
|
||||
|
||||
on:
|
||||
pull_request_target:
|
||||
branches:
|
||||
- main
|
||||
- master
|
||||
- stable*
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
concurrency:
|
||||
group: update-nextcloud-ocp-approve-merge-${{ github.head_ref || github.run_id }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
auto-approve-merge:
|
||||
if: github.actor == 'nextcloud-command'
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
# for hmarr/auto-approve-action to approve PRs
|
||||
pull-requests: write
|
||||
# for alexwilson/enable-github-automerge-action to approve PRs
|
||||
contents: write
|
||||
|
||||
steps:
|
||||
- uses: mdecoleman/pr-branch-name@bab4c71506bcd299fb350af63bb8e53f2940a599 # v2.0.0
|
||||
id: branchname
|
||||
with:
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
# GitHub actions bot approve
|
||||
- uses: hmarr/auto-approve-action@b40d6c9ed2fa10c9a2749eca7eb004418a705501 # v2
|
||||
if: startsWith(steps.branchname.outputs.branch, 'automated/noid/') && endsWith(steps.branchname.outputs.branch, 'update-nextcloud-ocp')
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
# Enable GitHub auto merge
|
||||
- name: Auto merge
|
||||
uses: alexwilson/enable-github-automerge-action@d8d24b8699d9749aca9279609909abca856457c8 # main
|
||||
if: startsWith(steps.branchname.outputs.branch, 'automated/noid/') && endsWith(steps.branchname.outputs.branch, 'update-nextcloud-ocp')
|
||||
with:
|
||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
8
.github/workflows/update-nextcloud-ocp.yml
vendored
8
.github/workflows/update-nextcloud-ocp.yml
vendored
@@ -31,7 +31,7 @@ jobs:
|
||||
|
||||
- name: Set up php8.2
|
||||
if: steps.checkout.outcome == 'success'
|
||||
uses: shivammathur/setup-php@a4e22b60bbb9c1021113f2860347b0759f66fe5d # v2
|
||||
uses: shivammathur/setup-php@6d7209f44a25a59e904b1ee9f3b0c33ab2cd888d # v2
|
||||
with:
|
||||
php-version: 8.2
|
||||
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
|
||||
@@ -57,7 +57,7 @@ jobs:
|
||||
run: composer require --dev nextcloud/ocp:dev-${{ matrix.branches }}
|
||||
|
||||
- name: Raise on issue on failure
|
||||
uses: dacbd/create-issue-action@cdb57ab6ff8862aa09fee2be6ba77a59581921c2 # v2.0.0
|
||||
uses: dacbd/create-issue-action@ba4d1c45cccf9c483f2720cefb40e437f0ee6f7d # v1.2.1
|
||||
if: ${{ steps.checkout.outcome == 'success' && failure() && steps.update_branch.conclusion == 'failure' }}
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -70,7 +70,7 @@ jobs:
|
||||
run: composer require --dev nextcloud/ocp:dev-master
|
||||
|
||||
- name: Raise on issue on failure
|
||||
uses: dacbd/create-issue-action@cdb57ab6ff8862aa09fee2be6ba77a59581921c2 # v2.0.0
|
||||
uses: dacbd/create-issue-action@ba4d1c45cccf9c483f2720cefb40e437f0ee6f7d # v1.2.1
|
||||
if: ${{ steps.checkout.outcome == 'success' && failure() && steps.update_main.conclusion == 'failure' }}
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@@ -100,7 +100,7 @@ jobs:
|
||||
|
||||
- name: Create Pull Request
|
||||
if: steps.checkout.outcome == 'success'
|
||||
uses: peter-evans/create-pull-request@70a41aba780001da0a30141984ae2a0c95d8704e # v3
|
||||
uses: peter-evans/create-pull-request@b1ddad2c994a25fbc81a28b3ec0e368bb2021c50 # v3
|
||||
with:
|
||||
token: ${{ secrets.COMMAND_BOT_PAT }}
|
||||
commit-message: "chore(dev-deps): Bump nextcloud/ocp package"
|
||||
|
||||
147
CHANGELOG.md
147
CHANGELOG.md
@@ -1,63 +1,122 @@
|
||||
# Changelog
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
## 1.13.1
|
||||
### Fixed
|
||||
- fix: Adjust dependencies to fix filepicker #6038
|
||||
- Fix npm audit #6028
|
||||
- Fix npm audit #6001
|
||||
- fix: Avoid optional before required parameter #5820
|
||||
- fix: permission check for cloning board #5853
|
||||
## 1.12.3
|
||||
- don't reset update time when no update was written to db #6035
|
||||
- Clarify config file not found exception message #5725
|
||||
- fix: permission check for cloning board #5854
|
||||
- fix: Avoid conflicts on deck attachments folder name #5704
|
||||
- Update dependencies
|
||||
|
||||
## 1.13.0
|
||||
|
||||
### Added
|
||||
|
||||
- feat: Rename to teams @juliushaertl [#5611](https://github.com/nextcloud/deck/pull/5611)
|
||||
- feat: Implement a team resource provider @juliushaertl [#5625](https://github.com/nextcloud/deck/pull/5625)
|
||||
- Interactive board widget @juliushaertl [#5630](https://github.com/nextcloud/deck/pull/5630)
|
||||
- introduce done and open filters @grnd-alt [#5488](https://github.com/nextcloud/deck/pull/5488)
|
||||
## 1.12.2
|
||||
|
||||
### Fixed
|
||||
|
||||
- fixed sorting for upcoming cards @elzody [#5493](https://github.com/nextcloud/deck/pull/5493)
|
||||
- fix(PermissionService#getPermissions): Catch exceptions from getBoard method @marcelklehr [#5542](https://github.com/nextcloud/deck/pull/5542)
|
||||
- fix(activity): Fix permission checks when rendering activities in bac… @nickvergessen [#5533](https://github.com/nextcloud/deck/pull/5533)
|
||||
- fix: Safeguard sync requests to hopefully not spam then server @juliushaertl [#5590](https://github.com/nextcloud/deck/pull/5590)
|
||||
- fix: card move dialog auto close @luka-nextcloud [#5537](https://github.com/nextcloud/deck/pull/5537)
|
||||
- fix: Avoid conflicts on deck attachments folder name @juliushaertl [#5703](https://github.com/nextcloud/deck/pull/5703)
|
||||
- fix: Adapt NcAppSidebar props to new version @backportbot[bot] [#5768](https://github.com/nextcloud/deck/pull/5768)
|
||||
- Fix tags' display when they are numerous @backportbot[bot] [#5727](https://github.com/nextcloud/deck/pull/5727)
|
||||
- Clarify config file not found exception message @backportbot[bot] [#5724](https://github.com/nextcloud/deck/pull/5724)
|
||||
- fix(done): Mark card as undone when updating card [#5492](https://github.com/nextcloud/deck/pull/5492)
|
||||
- fix(activity): Fix permission checks when rendering activities in bac… @backportbot[bot] [#5543](https://github.com/nextcloud/deck/pull/5543)
|
||||
- fix(PermissionService#getPermissions): Catch exceptions from getBoard method @backportbot[bot] [#5546](https://github.com/nextcloud/deck/pull/5546)
|
||||
- fix: Safeguard sync requests to hopefully not spam then server @backportbot[bot] [#5593](https://github.com/nextcloud/deck/pull/5593)
|
||||
- fix: card move dialog auto close @backportbot[bot] [#5596](https://github.com/nextcloud/deck/pull/5596)
|
||||
|
||||
### Other
|
||||
|
||||
- chore(CI): Adjust testing matrix for Nextcloud 29 on stable29 @nickvergessen [#5711](https://github.com/nextcloud/deck/pull/5711)
|
||||
- fix(i18n): Improved wording [#5497](https://github.com/nextcloud/deck/pull/5497)
|
||||
|
||||
## 1.13.0-beta.1
|
||||
|
||||
### Added
|
||||
|
||||
- feat: Rename to teams @juliushaertl [#5611](https://github.com/nextcloud/deck/pull/5611)
|
||||
- feat: Implement a team resource provider @juliushaertl [#5625](https://github.com/nextcloud/deck/pull/5625)
|
||||
- Interactive board widget @juliushaertl [#5630](https://github.com/nextcloud/deck/pull/5630)
|
||||
## 1.12.1
|
||||
|
||||
### Fixed
|
||||
|
||||
- Fix deleted card/board issues @juliushaertl [#5423](https://github.com/nextcloud/deck/pull/5423)
|
||||
- Fixing #5451 @mintsoft [#5455](https://github.com/nextcloud/deck/pull/5455)
|
||||
- fix: Add debounce to update due date @juliushaertl [#5458](https://github.com/nextcloud/deck/pull/5458)
|
||||
- fix(done): Mark card as undone when updating card @stefan-niedermann [#5491](https://github.com/nextcloud/deck/pull/5491)
|
||||
- fixed sorting for upcoming cards @elzody [#5493](https://github.com/nextcloud/deck/pull/5493)
|
||||
- fix(PermissionService#getPermissions): Catch exceptions from getBoard method @marcelklehr [#5542](https://github.com/nextcloud/deck/pull/5542)
|
||||
- fix(activity): Fix permission checks when rendering activities in bac… @nickvergessen [#5533](https://github.com/nextcloud/deck/pull/5533)
|
||||
- fix: Safeguard sync requests to hopefully not spam then server @juliushaertl [#5590](https://github.com/nextcloud/deck/pull/5590)
|
||||
- fix: card move dialog auto close @luka-nextcloud [#5537](https://github.com/nextcloud/deck/pull/5537)
|
||||
- also filter by storage when getting shares in folder @icewind1991 [#5452](https://github.com/nextcloud/deck/pull/5452)
|
||||
- Fix deleted card/board issues @juliushaertl [#5441](https://github.com/nextcloud/deck/pull/5441)
|
||||
- Fixing #5451 [#5457](https://github.com/nextcloud/deck/pull/5457)
|
||||
- fix: Add debounce to update due date [#5483](https://github.com/nextcloud/deck/pull/5483)
|
||||
- fix(i18n): Fixed typo [#5424](https://github.com/nextcloud/deck/pull/5424)
|
||||
|
||||
### Other
|
||||
## 1.12.0
|
||||
|
||||
- fix(i18n): Improved wording @rakekniven [#5496](https://github.com/nextcloud/deck/pull/5496)
|
||||
### Added
|
||||
|
||||
- Added ability to mark a card as done @TehThanos [#4137](https://github.com/nextcloud/deck/pull/4137)
|
||||
- Card Cover Images @jszeibert [#5035](https://github.com/nextcloud/deck/pull/5035)
|
||||
- Upcoming/Today/Tomorrow dashboard widgets @BKapelari [#2658](https://github.com/nextcloud/deck/pull/2658)
|
||||
- Enabled advanced fields option on tag color picker @faab007nl [#4362](https://github.com/nextcloud/deck/pull/4362)
|
||||
- Remember last board, list for new card dialog @luka-nextcloud [#5046](https://github.com/nextcloud/deck/pull/5046)
|
||||
- Add support for bidirectional text @jamazi [#5258](https://github.com/nextcloud/deck/pull/5258)
|
||||
- Card layout polishing @juliushaertl [#5264](https://github.com/nextcloud/deck/pull/5264)
|
||||
- feat: Move to contenteditable for inline title editing @juliushaertl [#5282](https://github.com/nextcloud/deck/pull/5282)
|
||||
- scroll board by dragging @shoetten [#5293](https://github.com/nextcloud/deck/pull/5293)
|
||||
- Keyboard shortcuts [#5358](https://github.com/nextcloud/deck/pull/5358)
|
||||
|
||||
### Fixed
|
||||
|
||||
- fix: allow null label colors in trello json importer [#5355](https://github.com/nextcloud/deck/pull/5355)
|
||||
- fix: Get proper rich object for card actions [#5352](https://github.com/nextcloud/deck/pull/5352)
|
||||
- fix: Use text content as result for comments @juliushaertl [#5294](https://github.com/nextcloud/deck/pull/5294)
|
||||
- fix: Bring back due date indicator to compact mode @juliushaertl [#5292](https://github.com/nextcloud/deck/pull/5292)
|
||||
- Fix small issues around delete/undo @juliushaertl [#5296](https://github.com/nextcloud/deck/pull/5296)
|
||||
- fix(controls): use primary when filter is active @fitrahfm [#5299](https://github.com/nextcloud/deck/pull/5299)
|
||||
- fix: Properly get done state for dav @juliushaertl [#5287](https://github.com/nextcloud/deck/pull/5287)
|
||||
- Fix upcoming cards and label input @juliushaertl [#5290](https://github.com/nextcloud/deck/pull/5290)
|
||||
- fix: Properly handle adding new tags through multiselect @juliushaertl [#5285](https://github.com/nextcloud/deck/pull/5285)
|
||||
- fix: Avoid throwing errors if no token provided on close @juliushaertl [#5284](https://github.com/nextcloud/deck/pull/5284)
|
||||
- fix: Expose card actions in the card menu (fix #3180) [#5280](https://github.com/nextcloud/deck/pull/5280)
|
||||
- fix: Use full card menu everywhere (fix #3993) [#5280](https://github.com/nextcloud/deck/pull/5280)
|
||||
- fix: Detect end of the activity responses (fix #3395) [#5280](https://github.com/nextcloud/deck/pull/5280)
|
||||
- fix: Add title with absolute date time to activity (fix #4508, fix #2122) [#5280](https://github.com/nextcloud/deck/pull/5280)
|
||||
- fix: Disable dragging archived cards (fix #3271) [#5280](https://github.com/nextcloud/deck/pull/5280)
|
||||
- fix: Hide unavailable card menu entries for archived card view [#5280](https://github.com/nextcloud/deck/pull/5280)
|
||||
- fix: Use localCompare to sort labels (fix #2736) [#5280](https://github.com/nextcloud/deck/pull/5280)
|
||||
- fix: More fitting click target for title editing [#5280](https://github.com/nextcloud/deck/pull/5280)
|
||||
- fix: Always load proper dashboard js (fixes a log error) [#5280](https://github.com/nextcloud/deck/pull/5280)
|
||||
- fix: Set fixed height for card modal (fix #4296) [#5280](https://github.com/nextcloud/deck/pull/5280)
|
||||
- fix: Make sure to always update card description when navigating away (fix #5254 #2705) [#5280](https://github.com/nextcloud/deck/pull/5280)
|
||||
- perf: Already pass board list as initial state @juliushaertl [#5281](https://github.com/nextcloud/deck/pull/5281)
|
||||
- Deck card comment notification label improvement @Jerome-Herbinet [#4748](https://github.com/nextcloud/deck/pull/4748)
|
||||
- update smart picker links @luka-nextcloud [#5047](https://github.com/nextcloud/deck/pull/5047)
|
||||
- feat: Enhance dark mode @juliushaertl [#5045](https://github.com/nextcloud/deck/pull/5045)
|
||||
- fix: export doesn't handle lists with no cards @magikmw [#5096](https://github.com/nextcloud/deck/pull/5096)
|
||||
- add attributes aria-label= and title= to Filters & View Modes buttons @privatemaker [#5133](https://github.com/nextcloud/deck/pull/5133)
|
||||
- fix: Check both card reference url patterns @juliushaertl [#5262](https://github.com/nextcloud/deck/pull/5262)
|
||||
- fix: Avoid too large index on postgres as indexing just the last_editor column is enough @juliushaertl [#5260](https://github.com/nextcloud/deck/pull/5260)
|
||||
- feat: error msg on CreateNewCardCustomPicker & only show available bo… @luka-nextcloud [#5029](https://github.com/nextcloud/deck/pull/5029)
|
||||
- test: add cypress tests for create new deck card @luka-nextcloud [#5025](https://github.com/nextcloud/deck/pull/5025)
|
||||
- Remove duplicate button @solracsf [#4850](https://github.com/nextcloud/deck/pull/4850)
|
||||
- [stable27] fix cypress for new file picker [#5088](https://github.com/nextcloud/deck/pull/5088)
|
||||
- Replace "Timeline" wording with "Activity" in order to be consistent with equivalent contexts throughout Nextcloud @Jerome-Herbinet [#5164](https://github.com/nextcloud/deck/pull/5164)
|
||||
- Board creation limitation : More understandable wordings @Jerome-Herbinet [#5168](https://github.com/nextcloud/deck/pull/5168)
|
||||
- ci(cypress): Fix file picker selector @juliushaertl [#5212](https://github.com/nextcloud/deck/pull/5212)
|
||||
- Switch to native date picker @juliushaertl [#4668](https://github.com/nextcloud/deck/pull/4668)
|
||||
- fixes minor spelling error @FundreasFrohsinn [#5216](https://github.com/nextcloud/deck/pull/5216)
|
||||
- feat(card): tooltip for comment timestamp @fitrahfm [#5253](https://github.com/nextcloud/deck/pull/5253)
|
||||
|
||||
## 1.12.0-beta.5
|
||||
|
||||
### Added
|
||||
|
||||
- Keyboard shortcuts [#5358](https://github.com/nextcloud/deck/pull/5358)
|
||||
|
||||
### Fixed
|
||||
|
||||
- fix: allow null label colors in trello json importer [#5355](https://github.com/nextcloud/deck/pull/5355)
|
||||
- fix: Get proper rich object for card actions [#5352](https://github.com/nextcloud/deck/pull/5352)
|
||||
|
||||
### Dependencies
|
||||
|
||||
- Update nextcloud/ocp dependency @nextcloud-command [#5343](https://github.com/nextcloud/deck/pull/5343)
|
||||
- Chore(deps): Bump @babel/runtime from 7.23.4 to 7.23.5 @dependabot[bot] [#5338](https://github.com/nextcloud/deck/pull/5338)
|
||||
|
||||
|
||||
## 1.12.0-beta.4
|
||||
|
||||
### Added
|
||||
|
||||
- scroll board by dragging @shoetten [#5293](https://github.com/nextcloud/deck/pull/5293)
|
||||
|
||||
### Fixed
|
||||
|
||||
- fix: Use text content as result for comments @juliushaertl [#5294](https://github.com/nextcloud/deck/pull/5294)
|
||||
- fix: Bring back due date indicator to compact mode @juliushaertl [#5292](https://github.com/nextcloud/deck/pull/5292)
|
||||
- Fix small issues around delete/undo @juliushaertl [#5296](https://github.com/nextcloud/deck/pull/5296)
|
||||
- fix(controls): use primary when filter is active @fitrahfm [#5299](https://github.com/nextcloud/deck/pull/5299)
|
||||
|
||||
## 1.12.0-beta.3
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
- 🚀 Get your project organized
|
||||
|
||||
</description>
|
||||
<version>1.13.1</version>
|
||||
<version>1.12.3</version>
|
||||
<licence>agpl</licence>
|
||||
<author>Julius Härtl</author>
|
||||
<documentation>
|
||||
@@ -38,7 +38,7 @@
|
||||
<database min-version="9.4">pgsql</database>
|
||||
<database>sqlite</database>
|
||||
<database min-version="8.0">mysql</database>
|
||||
<nextcloud min-version="29" max-version="29"/>
|
||||
<nextcloud min-version="28" max-version="28"/>
|
||||
</dependencies>
|
||||
<background-jobs>
|
||||
<job>OCA\Deck\Cron\DeleteCron</job>
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
"roave/security-advisories": "dev-master",
|
||||
"phpunit/phpunit": "^9",
|
||||
"nextcloud/coding-standard": "^1.1",
|
||||
"nextcloud/ocp": "dev-stable29",
|
||||
"nextcloud/ocp": "dev-stable28",
|
||||
"psalm/phar": "^5.13"
|
||||
},
|
||||
"config": {
|
||||
|
||||
530
composer.lock
generated
530
composer.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -69,13 +69,11 @@ describe('Card', function() {
|
||||
.first().click()
|
||||
cy.get('.modal-mask.card-selector .card-title').should('be.visible').click().type(newCardTitle)
|
||||
cy.get('.modal-mask.card-selector .multiselect-board').should('be.visible').click()
|
||||
cy.get('.vs__dropdown-menu [data-cy="board-select-title"]:contains("' + boardData.title + '")').should('be.visible').click()
|
||||
|
||||
cy.get('.modal-mask.card-selector .multiselect-board li:contains("' + boardData.title + '")').should('be.visible').click()
|
||||
cy.wait('@getBoard', { timeout: 7000 })
|
||||
|
||||
cy.get('.modal-mask.card-selector .multiselect-list').should('be.visible').click()
|
||||
cy.get('.vs__dropdown-menu span[title="TestList"]').should('be.visible').click()
|
||||
|
||||
cy.get('.modal-mask.card-selector .multiselect-list li').eq(0).should('be.visible').click()
|
||||
cy.get('.modal-mask.card-selector button.button-vue--vue-primary').should('be.visible').click()
|
||||
cy.wait('@save', { timeout: 7000 })
|
||||
|
||||
@@ -103,13 +101,13 @@ describe('Card', function() {
|
||||
})
|
||||
|
||||
cy.get('.modal__card').should('be.visible')
|
||||
cy.get('.app-sidebar-header__mainname').contains('Hello world')
|
||||
cy.get('.app-sidebar-header__maintitle').contains('Hello world')
|
||||
})
|
||||
|
||||
it('Attachment from files app', () => {
|
||||
cy.get('.card:contains("Hello world")').should('be.visible').click()
|
||||
cy.get('.modal__card').should('be.visible')
|
||||
cy.get('#tab-button-attachments').click()
|
||||
cy.get('.app-sidebar-tabs__tab [data-id="attachments"]').click()
|
||||
cy.get('button.icon-upload').should('be.visible')
|
||||
cy.get('button.icon-folder').should('be.visible')
|
||||
.click()
|
||||
@@ -120,11 +118,11 @@ describe('Card', function() {
|
||||
cy.get('.attachment-list .basename').contains('welcome.txt')
|
||||
})
|
||||
|
||||
it.only('Shows the modal with the editor', () => {
|
||||
it('Shows the modal with the editor', () => {
|
||||
cy.get('.card:contains("Hello world")').should('be.visible').click()
|
||||
cy.intercept({ method: 'PUT', url: '**/apps/deck/cards/*' }).as('save')
|
||||
cy.get('.modal__card').should('be.visible')
|
||||
cy.get('.app-sidebar-header__mainname').contains('Hello world')
|
||||
cy.get('.app-sidebar-header__maintitle').contains('Hello world')
|
||||
cy.get('.modal__card .ProseMirror h1').contains('Hello world').should('be.visible')
|
||||
cy.get('.modal__card .ProseMirror h1')
|
||||
.click()
|
||||
@@ -231,13 +229,20 @@ describe('Card', function() {
|
||||
cy.get(`.card:contains("${newCardTitle}")`).should('be.visible').click()
|
||||
|
||||
cy.get('#app-sidebar-vue [data-test="tag-selector"]').should('be.visible').click()
|
||||
cy.get('.vs__dropdown-menu .tag:contains("Action needed")').should('be.visible').click()
|
||||
cy.get('.vs__selected .tag:contains("Action needed")').should('be.visible')
|
||||
cy.get('.vs__dropdown-menu .tag:contains("Later")').should('be.visible').click()
|
||||
cy.get('.multiselect__option:contains("Action needed")').should('be.visible').click()
|
||||
|
||||
cy.get('.vs__selected .tag:contains("Action needed")').should('be.visible')
|
||||
cy.get('.vs__selected .tag:contains("Action needed")')
|
||||
.parent().find('button').click()
|
||||
cy.get('[data-test="tag-selector"] .selector-wrapper--icon').click()
|
||||
cy.get('.multiselect__option:contains("Action needed")').should('not.be.visible')
|
||||
|
||||
cy.get('[data-test="tag-selector"] .multiselect__tags .tag:contains("Action needed")')
|
||||
.should('be.visible')
|
||||
|
||||
cy.get(`.card:contains("${newCardTitle}")`).find('.labels li:contains("Action needed")')
|
||||
.should('be.visible')
|
||||
|
||||
cy.get('#app-sidebar-vue [data-test="tag-selector"]').should('be.visible').click()
|
||||
cy.get('.multiselect__option:contains("Later")').should('be.visible').click()
|
||||
cy.get('.multiselect__option:contains("Action needed")').should('be.visible').click()
|
||||
|
||||
cy.get(`.card:contains("${newCardTitle}")`).find('.labels li:contains("Later")')
|
||||
.should('be.visible')
|
||||
|
||||
@@ -38,10 +38,7 @@ describe('Board', function() {
|
||||
cy.get('.board-title').contains(board.title)
|
||||
|
||||
cy.shareBoardWithUi(recipient.userId)
|
||||
|
||||
cy.intercept({ method: 'PUT', url: '**/apps/deck/boards/*/acl/*' }).as('setAcl')
|
||||
cy.get(`[data-cy="acl-participant:${recipient.userId}"]`).find('[data-cy="action:permission-edit"]').click()
|
||||
cy.wait('@setAcl')
|
||||
|
||||
cy.login(recipient)
|
||||
cy.visit(`/apps/deck/#/board/${boardId}`)
|
||||
|
||||
@@ -107,14 +107,11 @@ Cypress.Commands.add('getNavigationEntry', (boardTitle) => {
|
||||
})
|
||||
|
||||
Cypress.Commands.add('shareBoardWithUi', (userId) => {
|
||||
cy.intercept({ method: 'GET', url: `**/ocs/v2.php/apps/files_sharing/api/v1/sharees?search=${userId}*` }).as('fetchRecipients')
|
||||
cy.get('[aria-label="Open details"]').click()
|
||||
cy.get('.app-sidebar').should('be.visible')
|
||||
cy.get('.select input').type(`${userId}`)
|
||||
cy.wait('@fetchRecipients', { timeout: 7000 })
|
||||
|
||||
cy.get('.vs__dropdown-menu .option').first().contains(userId)
|
||||
cy.get('.select input').type('{enter}')
|
||||
cy.get('.multiselect__input').type(`${userId}`)
|
||||
cy.get('.multiselect__content .multiselect__element').first().contains(userId)
|
||||
cy.get('.multiselect__input').type('{enter}')
|
||||
|
||||
cy.get('.shareWithList').contains(userId)
|
||||
})
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
import './commands.js'
|
||||
|
||||
Cypress.on('uncaught:exception', (err) => {
|
||||
return !err.message.includes('ResizeObserver loop limit exceeded') && !err.message.includes('ResizeObserver loop completed with undelivered notifications')
|
||||
return !err.message.includes('ResizeObserver loop limit exceeded')
|
||||
})
|
||||
|
||||
// Alternatively you can use CommonJS syntax:
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1" viewBox="0 0 16 16">
|
||||
<g fill="currentColor">
|
||||
<rect ry="1" height="8" width="14" y="7" x="1"/>
|
||||
<rect ry=".5" height="1" width="12" y="5" x="2"/>
|
||||
<rect ry=".5" height="1" width="10" y="3" x="3"/>
|
||||
<rect ry=".5" height="1" width="8" y="1" x="4"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 372 B |
@@ -29,7 +29,6 @@ OC.L10N.register(
|
||||
"Invalid path selected" : "An hent dibabet n'eus ket anezhañ",
|
||||
"Comments" : "Displegadennoù",
|
||||
"Modified" : "Cheñchet",
|
||||
"Created" : "Krouet",
|
||||
"Save" : "Enrollañ",
|
||||
"Reply" : "Respont",
|
||||
"Update" : "Adnevesaat",
|
||||
@@ -39,7 +38,7 @@ OC.L10N.register(
|
||||
"seconds ago" : "eilenn zo",
|
||||
"Search" : "Klask",
|
||||
"Shared with you" : "Rannet ganeoc'h",
|
||||
"No notifications" : "Kemennadenn ebet",
|
||||
"No notifications" : "Kemenaden ebet",
|
||||
"Today" : "Hiziv",
|
||||
"Tomorrow" : "Warc'hoaz",
|
||||
"Close" : "Seriñ",
|
||||
|
||||
@@ -27,7 +27,6 @@
|
||||
"Invalid path selected" : "An hent dibabet n'eus ket anezhañ",
|
||||
"Comments" : "Displegadennoù",
|
||||
"Modified" : "Cheñchet",
|
||||
"Created" : "Krouet",
|
||||
"Save" : "Enrollañ",
|
||||
"Reply" : "Respont",
|
||||
"Update" : "Adnevesaat",
|
||||
@@ -37,7 +36,7 @@
|
||||
"seconds ago" : "eilenn zo",
|
||||
"Search" : "Klask",
|
||||
"Shared with you" : "Rannet ganeoc'h",
|
||||
"No notifications" : "Kemennadenn ebet",
|
||||
"No notifications" : "Kemenaden ebet",
|
||||
"Today" : "Hiziv",
|
||||
"Tomorrow" : "Warc'hoaz",
|
||||
"Close" : "Seriñ",
|
||||
|
||||
@@ -251,7 +251,6 @@ OC.L10N.register(
|
||||
"Remove due date" : "Suprimeix la data de caducitat",
|
||||
"Mark as done" : "Marcat com a fet",
|
||||
"Due at:" : "Venciment a:",
|
||||
"Not done" : "No s'ha fet",
|
||||
"Unarchive card" : "Desarxiva targeta",
|
||||
"Archive card" : "Arxiva la targeta",
|
||||
"Select Date" : "Selecciona la data",
|
||||
|
||||
@@ -249,7 +249,6 @@
|
||||
"Remove due date" : "Suprimeix la data de caducitat",
|
||||
"Mark as done" : "Marcat com a fet",
|
||||
"Due at:" : "Venciment a:",
|
||||
"Not done" : "No s'ha fet",
|
||||
"Unarchive card" : "Desarxiva targeta",
|
||||
"Archive card" : "Arxiva la targeta",
|
||||
"Select Date" : "Selecciona la data",
|
||||
|
||||
16
l10n/el.js
16
l10n/el.js
@@ -37,10 +37,6 @@ OC.L10N.register(
|
||||
"{user} has archived card {card} in list {stack} on board {board}" : "Ο/η {user} αρχειοθέτησε την κάρτα {card} στην λίστα {stack} του πίνακα {board} ",
|
||||
"You have unarchived card {card} in list {stack} on board {board}" : "Επαναφέρατε από το αρχείο την καρτέλα {card} της λίστας {stack} του πίνακα {board}",
|
||||
"{user} has unarchived card {card} in list {stack} on board {board}" : "Ο/η {user} επανέφερε από το αρχείο την κάρτα {card} της λίστας {stack} του πίνακα {board}",
|
||||
"You have marked the card {card} as done in list {stack} on board {board}" : "Έχετε επισημάνει την κάρτα {card} ως ολοκληρωμένη στη λίστα {stack} του πίνακα {board}",
|
||||
"{user} has marked card {card} as done in list {stack} on board {board}" : "{user} έχει επισημάνει την κάρτα {card} ως ολοκληρωμένη στη λίστα {stack} του πίνακα {board}",
|
||||
"You have marked the card {card} as undone in list {stack} on board {board}" : "Έχετε επισημάνει την κάρτα {card} ως μη ολοκληρωμένη στη λίστα {stack} του πίνακα {board}",
|
||||
"{user} has marked the card {card} as undone in list {stack} on board {board}" : "{user} έχει επισημάνει την κάρτα {card} ως μη ολοκληρωμένη στη λίστα {stack} του πίνακα {board}",
|
||||
"You have removed the due date of card {card}" : "Καταργήσατε την ημερομηνία λήξης της καρτέλας {card}",
|
||||
"{user} has removed the due date of card {card}" : "Ο/η {user} κατάργησε την ημερομηνία λήξης της καρτέλας {card}",
|
||||
"You have set the due date of card {card} to {after}" : "Ορίσατε την ημερομηνία λήξης της καρτέλας {card} σε {after}",
|
||||
@@ -88,7 +84,6 @@ OC.L10N.register(
|
||||
"Deck board" : "Πίνακας του Deck",
|
||||
"Owned by %1$s" : "Ανήκει στον/στην %1$s",
|
||||
"Deck boards, cards and comments" : "Πίνακες, κάρτες και σχόλια Deck",
|
||||
"Create a new deck card" : "Δημιουργήστε μια νέα κάρτα",
|
||||
"Card comments" : "Σχόλια καρτέλας",
|
||||
"%s on %s" : "%s στο %s",
|
||||
"Deck boards and cards" : "Πίνακες και κάρτες Deck",
|
||||
@@ -148,8 +143,6 @@ OC.L10N.register(
|
||||
"Filter by tag" : "Φίλτρο ανά ετικέτα",
|
||||
"Filter by assigned user" : "Φίλτρο ανά χρήστη",
|
||||
"Unassigned" : "Χωρίς ανάθεση",
|
||||
"Filter by status" : "Φίλτρο με βάση την κατάσταση",
|
||||
"Open and completed" : "Ανοιχτά και ολοκληρωμένα",
|
||||
"Open" : "Ανοιχτός",
|
||||
"Completed" : "Ολοκληρωμένες",
|
||||
"Filter by due date" : "Φίλτρο ανά ημερομηνία λήξης",
|
||||
@@ -160,7 +153,6 @@ OC.L10N.register(
|
||||
"No due date" : "Χωρίς ημερομηνία λήξης",
|
||||
"Clear filter" : "Εκκαθάριση φίλτρου",
|
||||
"View Modes" : "Τρόποι προβολής",
|
||||
"Toggle View Modes" : "Εναλλαγή τρόπων προβολής",
|
||||
"Hide archived cards" : "Απόκρυψη καρτελών που αρχειοθετήθηκαν",
|
||||
"Show archived cards" : "Εμφάνιση καρτελών που αρχειοθετήθηκαν",
|
||||
"Toggle compact mode" : "Εναλλαγή λειτουργίας μικρού μεγέθους",
|
||||
@@ -179,8 +171,6 @@ OC.L10N.register(
|
||||
"Deleted lists" : "Διαγραμμένες λίστες",
|
||||
"Undo" : "Αναίρεση",
|
||||
"Deleted cards" : "Διαγραμμένες καρτέλες",
|
||||
"Share board with a user, group or team …" : "Κοινή χρήση πίνακα με έναν χρήστη, μια ομάδα ή team ...",
|
||||
"Searching for users, groups and teams …" : "Αναζήτηση χρηστών, ομάδων και teams …",
|
||||
"No participants found" : "Δε βρέθηκαν συμμετέχοντες",
|
||||
"Board owner" : "Κάτοχος πίνακα",
|
||||
"(Group)" : "(Ομάδα)",
|
||||
@@ -210,7 +200,6 @@ OC.L10N.register(
|
||||
"title and color value must be provided" : "ο τίτλος και η τιμή χρώματος πρέπει να παρέχονται",
|
||||
"Board name" : "Όνομα πίνακα",
|
||||
"Members" : "Μέλη",
|
||||
"Assign to users/groups/team" : "Ανάθεση σε χρήστες/ομάδες/teams",
|
||||
"Assign a user to this card…" : "Ανάθεση χρήστη στην καρτέλα...",
|
||||
"Select a user to assign to this card…" : "Επιλέξτε έναν χρήστη για να του αναθέσετε αυτή την κάρτα...",
|
||||
"Upload new files" : "Ανεβάστε νέα αρχεία",
|
||||
@@ -257,7 +246,6 @@ OC.L10N.register(
|
||||
"Remove due date" : "Αφαίρεση ημερομηνίας λήξης",
|
||||
"Mark as done" : "Σήμανση ως ολοκληρωμένου",
|
||||
"Due at:" : "Λήγει στις:",
|
||||
"Not done" : "Μη ολοκληρωμένο",
|
||||
"Unarchive card" : "Αναίρεση αρχειοθέτησης καρτέλας",
|
||||
"Archive card" : "Αρχειοθέτηση καρτέλας",
|
||||
"Select Date" : "Επιλέξτε ημερομηνία",
|
||||
@@ -311,7 +299,6 @@ OC.L10N.register(
|
||||
"Shared with you" : "Διαμοιρασμένα μαζί σας",
|
||||
"Deck settings" : "Ρυθμίσεις Deck",
|
||||
"Use bigger card view" : "Χρησιμοποιήστε μεγαλύτερη προβολή καρτέλας",
|
||||
"Show card ID badge" : "Εμφάνιση ID κάρτας",
|
||||
"Show boards in calendar/tasks" : "Εμφάνιση πινάκων στο ημερολόγιο / εργασίες",
|
||||
"Limit board creation to some groups" : "Περιορισμός της δημιουργίας πινάκων σε ορισμένες ομάδες",
|
||||
"Users outside of those groups will not be able to create their own boards, but will still be able to work on boards that have been shared with them." : "Οι χρήστες εκτός αυτών των ομάδων δεν θα μπορούν να δημιουργούν τους δικούς τους πίνακες, αλλά θα μπορούν να εργάζονται σε πίνακες που τους έχουν διαμοιραστεί.",
|
||||
@@ -384,7 +371,6 @@ OC.L10N.register(
|
||||
"List is empty" : "Η λίστα είναι κενή",
|
||||
"Limit deck usage of groups" : "Περιορίστε τη χρήση της εφαρμογής deck σε ομάδες",
|
||||
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Ο περιορισμός του Deck θα εμποδίσει τους χρήστες που δεν είναι μέρος αυτών των ομάδων να δημιουργούν δικούς τους πίνακες. Οι χρήστες θα εξακολουθήσουν να εργάζονται σε πίνακες που έχουν διαμοιραστεί μαζί τους.",
|
||||
"Not completed" : "Μη ολοκληρωμένο",
|
||||
"Filter by completed" : "Φίλτρο ανά ολοκλήρωση"
|
||||
"Not completed" : "Μη ολοκληρωμένο"
|
||||
},
|
||||
"nplurals=2; plural=(n != 1);");
|
||||
|
||||
16
l10n/el.json
16
l10n/el.json
@@ -35,10 +35,6 @@
|
||||
"{user} has archived card {card} in list {stack} on board {board}" : "Ο/η {user} αρχειοθέτησε την κάρτα {card} στην λίστα {stack} του πίνακα {board} ",
|
||||
"You have unarchived card {card} in list {stack} on board {board}" : "Επαναφέρατε από το αρχείο την καρτέλα {card} της λίστας {stack} του πίνακα {board}",
|
||||
"{user} has unarchived card {card} in list {stack} on board {board}" : "Ο/η {user} επανέφερε από το αρχείο την κάρτα {card} της λίστας {stack} του πίνακα {board}",
|
||||
"You have marked the card {card} as done in list {stack} on board {board}" : "Έχετε επισημάνει την κάρτα {card} ως ολοκληρωμένη στη λίστα {stack} του πίνακα {board}",
|
||||
"{user} has marked card {card} as done in list {stack} on board {board}" : "{user} έχει επισημάνει την κάρτα {card} ως ολοκληρωμένη στη λίστα {stack} του πίνακα {board}",
|
||||
"You have marked the card {card} as undone in list {stack} on board {board}" : "Έχετε επισημάνει την κάρτα {card} ως μη ολοκληρωμένη στη λίστα {stack} του πίνακα {board}",
|
||||
"{user} has marked the card {card} as undone in list {stack} on board {board}" : "{user} έχει επισημάνει την κάρτα {card} ως μη ολοκληρωμένη στη λίστα {stack} του πίνακα {board}",
|
||||
"You have removed the due date of card {card}" : "Καταργήσατε την ημερομηνία λήξης της καρτέλας {card}",
|
||||
"{user} has removed the due date of card {card}" : "Ο/η {user} κατάργησε την ημερομηνία λήξης της καρτέλας {card}",
|
||||
"You have set the due date of card {card} to {after}" : "Ορίσατε την ημερομηνία λήξης της καρτέλας {card} σε {after}",
|
||||
@@ -86,7 +82,6 @@
|
||||
"Deck board" : "Πίνακας του Deck",
|
||||
"Owned by %1$s" : "Ανήκει στον/στην %1$s",
|
||||
"Deck boards, cards and comments" : "Πίνακες, κάρτες και σχόλια Deck",
|
||||
"Create a new deck card" : "Δημιουργήστε μια νέα κάρτα",
|
||||
"Card comments" : "Σχόλια καρτέλας",
|
||||
"%s on %s" : "%s στο %s",
|
||||
"Deck boards and cards" : "Πίνακες και κάρτες Deck",
|
||||
@@ -146,8 +141,6 @@
|
||||
"Filter by tag" : "Φίλτρο ανά ετικέτα",
|
||||
"Filter by assigned user" : "Φίλτρο ανά χρήστη",
|
||||
"Unassigned" : "Χωρίς ανάθεση",
|
||||
"Filter by status" : "Φίλτρο με βάση την κατάσταση",
|
||||
"Open and completed" : "Ανοιχτά και ολοκληρωμένα",
|
||||
"Open" : "Ανοιχτός",
|
||||
"Completed" : "Ολοκληρωμένες",
|
||||
"Filter by due date" : "Φίλτρο ανά ημερομηνία λήξης",
|
||||
@@ -158,7 +151,6 @@
|
||||
"No due date" : "Χωρίς ημερομηνία λήξης",
|
||||
"Clear filter" : "Εκκαθάριση φίλτρου",
|
||||
"View Modes" : "Τρόποι προβολής",
|
||||
"Toggle View Modes" : "Εναλλαγή τρόπων προβολής",
|
||||
"Hide archived cards" : "Απόκρυψη καρτελών που αρχειοθετήθηκαν",
|
||||
"Show archived cards" : "Εμφάνιση καρτελών που αρχειοθετήθηκαν",
|
||||
"Toggle compact mode" : "Εναλλαγή λειτουργίας μικρού μεγέθους",
|
||||
@@ -177,8 +169,6 @@
|
||||
"Deleted lists" : "Διαγραμμένες λίστες",
|
||||
"Undo" : "Αναίρεση",
|
||||
"Deleted cards" : "Διαγραμμένες καρτέλες",
|
||||
"Share board with a user, group or team …" : "Κοινή χρήση πίνακα με έναν χρήστη, μια ομάδα ή team ...",
|
||||
"Searching for users, groups and teams …" : "Αναζήτηση χρηστών, ομάδων και teams …",
|
||||
"No participants found" : "Δε βρέθηκαν συμμετέχοντες",
|
||||
"Board owner" : "Κάτοχος πίνακα",
|
||||
"(Group)" : "(Ομάδα)",
|
||||
@@ -208,7 +198,6 @@
|
||||
"title and color value must be provided" : "ο τίτλος και η τιμή χρώματος πρέπει να παρέχονται",
|
||||
"Board name" : "Όνομα πίνακα",
|
||||
"Members" : "Μέλη",
|
||||
"Assign to users/groups/team" : "Ανάθεση σε χρήστες/ομάδες/teams",
|
||||
"Assign a user to this card…" : "Ανάθεση χρήστη στην καρτέλα...",
|
||||
"Select a user to assign to this card…" : "Επιλέξτε έναν χρήστη για να του αναθέσετε αυτή την κάρτα...",
|
||||
"Upload new files" : "Ανεβάστε νέα αρχεία",
|
||||
@@ -255,7 +244,6 @@
|
||||
"Remove due date" : "Αφαίρεση ημερομηνίας λήξης",
|
||||
"Mark as done" : "Σήμανση ως ολοκληρωμένου",
|
||||
"Due at:" : "Λήγει στις:",
|
||||
"Not done" : "Μη ολοκληρωμένο",
|
||||
"Unarchive card" : "Αναίρεση αρχειοθέτησης καρτέλας",
|
||||
"Archive card" : "Αρχειοθέτηση καρτέλας",
|
||||
"Select Date" : "Επιλέξτε ημερομηνία",
|
||||
@@ -309,7 +297,6 @@
|
||||
"Shared with you" : "Διαμοιρασμένα μαζί σας",
|
||||
"Deck settings" : "Ρυθμίσεις Deck",
|
||||
"Use bigger card view" : "Χρησιμοποιήστε μεγαλύτερη προβολή καρτέλας",
|
||||
"Show card ID badge" : "Εμφάνιση ID κάρτας",
|
||||
"Show boards in calendar/tasks" : "Εμφάνιση πινάκων στο ημερολόγιο / εργασίες",
|
||||
"Limit board creation to some groups" : "Περιορισμός της δημιουργίας πινάκων σε ορισμένες ομάδες",
|
||||
"Users outside of those groups will not be able to create their own boards, but will still be able to work on boards that have been shared with them." : "Οι χρήστες εκτός αυτών των ομάδων δεν θα μπορούν να δημιουργούν τους δικούς τους πίνακες, αλλά θα μπορούν να εργάζονται σε πίνακες που τους έχουν διαμοιραστεί.",
|
||||
@@ -382,7 +369,6 @@
|
||||
"List is empty" : "Η λίστα είναι κενή",
|
||||
"Limit deck usage of groups" : "Περιορίστε τη χρήση της εφαρμογής deck σε ομάδες",
|
||||
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Ο περιορισμός του Deck θα εμποδίσει τους χρήστες που δεν είναι μέρος αυτών των ομάδων να δημιουργούν δικούς τους πίνακες. Οι χρήστες θα εξακολουθήσουν να εργάζονται σε πίνακες που έχουν διαμοιραστεί μαζί τους.",
|
||||
"Not completed" : "Μη ολοκληρωμένο",
|
||||
"Filter by completed" : "Φίλτρο ανά ολοκλήρωση"
|
||||
"Not completed" : "Μη ολοκληρωμένο"
|
||||
},"pluralForm" :"nplurals=2; plural=(n != 1);"
|
||||
}
|
||||
@@ -28,11 +28,9 @@ OC.L10N.register(
|
||||
"Do you want to overwrite it?" : "¿Deseas sobre escribirlo?",
|
||||
"Drop your files to upload" : "Arrastre sus archivos para cargar",
|
||||
"Add card" : "Agregar tarjeta",
|
||||
"Active filters" : "Filtros activos",
|
||||
"Filter by tag" : "Filtrar por etiqueta",
|
||||
"Open" : "Abrir",
|
||||
"Completed" : "Completado",
|
||||
"Clear filter" : "Limpiar filtro",
|
||||
"Hide archived cards" : "Ocultar tarjetas archivadas",
|
||||
"Show archived cards" : "Mostrar tarjetas archivadas",
|
||||
"Open details" : "Abrir detalles",
|
||||
@@ -87,15 +85,12 @@ OC.L10N.register(
|
||||
"Archive board" : "Archivar tablero",
|
||||
"No notifications" : "No hay notificaciones",
|
||||
"Delete board" : "Borrar tableros",
|
||||
"No reminder" : "Sin recordatorio",
|
||||
"An error occurred" : "Ha ocurrido un error",
|
||||
"Today" : "Hoy",
|
||||
"Tomorrow" : "Mañana",
|
||||
"Close" : "Cerrar",
|
||||
"Error creating the share" : "Error creando el recurso compartido",
|
||||
"Share" : "Compartir",
|
||||
"Searching for users, groups and circles …" : "Buscando usuarios, grupos y círculos …",
|
||||
"Next week" : "Semana siguiente",
|
||||
"Next month" : "Próximo mes"
|
||||
"Searching for users, groups and circles …" : "Buscando usuarios, grupos y círculos …"
|
||||
},
|
||||
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
|
||||
|
||||
@@ -26,11 +26,9 @@
|
||||
"Do you want to overwrite it?" : "¿Deseas sobre escribirlo?",
|
||||
"Drop your files to upload" : "Arrastre sus archivos para cargar",
|
||||
"Add card" : "Agregar tarjeta",
|
||||
"Active filters" : "Filtros activos",
|
||||
"Filter by tag" : "Filtrar por etiqueta",
|
||||
"Open" : "Abrir",
|
||||
"Completed" : "Completado",
|
||||
"Clear filter" : "Limpiar filtro",
|
||||
"Hide archived cards" : "Ocultar tarjetas archivadas",
|
||||
"Show archived cards" : "Mostrar tarjetas archivadas",
|
||||
"Open details" : "Abrir detalles",
|
||||
@@ -85,15 +83,12 @@
|
||||
"Archive board" : "Archivar tablero",
|
||||
"No notifications" : "No hay notificaciones",
|
||||
"Delete board" : "Borrar tableros",
|
||||
"No reminder" : "Sin recordatorio",
|
||||
"An error occurred" : "Ha ocurrido un error",
|
||||
"Today" : "Hoy",
|
||||
"Tomorrow" : "Mañana",
|
||||
"Close" : "Cerrar",
|
||||
"Error creating the share" : "Error creando el recurso compartido",
|
||||
"Share" : "Compartir",
|
||||
"Searching for users, groups and circles …" : "Buscando usuarios, grupos y círculos …",
|
||||
"Next week" : "Semana siguiente",
|
||||
"Next month" : "Próximo mes"
|
||||
"Searching for users, groups and circles …" : "Buscando usuarios, grupos y círculos …"
|
||||
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
|
||||
}
|
||||
@@ -321,16 +321,16 @@ OC.L10N.register(
|
||||
"Unarchive board" : "Atera taula artxibotik",
|
||||
"Archive board" : "Artxibatu taula",
|
||||
"Export board" : "Esportatu taula",
|
||||
"Turn on due date reminders" : "Aktibatu epemuga gogorarazpenak",
|
||||
"Turn off due date reminders" : "Desaktibatu epemuga gogorarazpenak",
|
||||
"Due date reminders" : "Epemuga gogorarazpenak",
|
||||
"Turn on due date reminders" : "Aktibatu epemugako abisuak",
|
||||
"Turn off due date reminders" : "Desaktibatu epemugako abisuak",
|
||||
"Due date reminders" : "Epemugako abisuak",
|
||||
"All cards" : "Txartel guztiak",
|
||||
"Assigned cards" : "Esleitutako txartelak",
|
||||
"No notifications" : "Jakinarazpenik ez",
|
||||
"Delete board" : "Ezabatu taula",
|
||||
"Board {0} deleted" : "{0} taula ezabatu da",
|
||||
"Only assigned cards" : "Bakarrik esleitutako txartelak",
|
||||
"No reminder" : "Gogorarazpenik ez",
|
||||
"No reminder" : "Abisurik ez",
|
||||
"An error occurred" : "Errore bat gertatu da",
|
||||
"Are you sure you want to delete the board {title}? This will delete all the data of this board including archived cards." : "Ziur zaude {title} taula ezabatu nahi duzula? Honek taula honen datu guztiak ezabatuko ditu, artxibatutako txartelak barne.",
|
||||
"Delete the board?" : "Taula ezabatu?",
|
||||
|
||||
@@ -319,16 +319,16 @@
|
||||
"Unarchive board" : "Atera taula artxibotik",
|
||||
"Archive board" : "Artxibatu taula",
|
||||
"Export board" : "Esportatu taula",
|
||||
"Turn on due date reminders" : "Aktibatu epemuga gogorarazpenak",
|
||||
"Turn off due date reminders" : "Desaktibatu epemuga gogorarazpenak",
|
||||
"Due date reminders" : "Epemuga gogorarazpenak",
|
||||
"Turn on due date reminders" : "Aktibatu epemugako abisuak",
|
||||
"Turn off due date reminders" : "Desaktibatu epemugako abisuak",
|
||||
"Due date reminders" : "Epemugako abisuak",
|
||||
"All cards" : "Txartel guztiak",
|
||||
"Assigned cards" : "Esleitutako txartelak",
|
||||
"No notifications" : "Jakinarazpenik ez",
|
||||
"Delete board" : "Ezabatu taula",
|
||||
"Board {0} deleted" : "{0} taula ezabatu da",
|
||||
"Only assigned cards" : "Bakarrik esleitutako txartelak",
|
||||
"No reminder" : "Gogorarazpenik ez",
|
||||
"No reminder" : "Abisurik ez",
|
||||
"An error occurred" : "Errore bat gertatu da",
|
||||
"Are you sure you want to delete the board {title}? This will delete all the data of this board including archived cards." : "Ziur zaude {title} taula ezabatu nahi duzula? Honek taula honen datu guztiak ezabatuko ditu, artxibatutako txartelak barne.",
|
||||
"Delete the board?" : "Taula ezabatu?",
|
||||
|
||||
@@ -110,7 +110,6 @@ OC.L10N.register(
|
||||
"Archived cards" : "Arkistoidut kortit",
|
||||
"Add list" : "Lisää lista",
|
||||
"List name" : "Listan nimi",
|
||||
"Active filters" : "Aktiiviset suodattimet",
|
||||
"Apply filter" : "Toteuta suodatus",
|
||||
"Filter by tag" : "Suodata tunnisteen perusteella",
|
||||
"Filter by assigned user" : "Suodata määritetyn käyttäjän mukaan",
|
||||
|
||||
@@ -108,7 +108,6 @@
|
||||
"Archived cards" : "Arkistoidut kortit",
|
||||
"Add list" : "Lisää lista",
|
||||
"List name" : "Listan nimi",
|
||||
"Active filters" : "Aktiiviset suodattimet",
|
||||
"Apply filter" : "Toteuta suodatus",
|
||||
"Filter by tag" : "Suodata tunnisteen perusteella",
|
||||
"Filter by assigned user" : "Suodata määritetyn käyttäjän mukaan",
|
||||
|
||||
12
l10n/gl.js
12
l10n/gl.js
@@ -43,8 +43,8 @@ OC.L10N.register(
|
||||
"{user} has marked the card {card} as undone in list {stack} on board {board}" : "{user} marcou a tarxeta {card} como sen facer na lista {stack} no taboleiro {board}",
|
||||
"You have removed the due date of card {card}" : "Vde. retirou a caducidade da tarxeta {card}",
|
||||
"{user} has removed the due date of card {card}" : "{user} retirou a caducidade da tarxeta {card}",
|
||||
"You have set the due date of card {card} to {after}" : "Vde. definiu a caducidade da tarxeta {card} a {after}",
|
||||
"{user} has set the due date of card {card} to {after}" : "{user} definiu a caducidade da tarxeta {card} a {after}",
|
||||
"You have set the due date of card {card} to {after}" : "Vde. estabeleceu a caducidade da tarxeta {card} a {after}",
|
||||
"{user} has set the due date of card {card} to {after}" : "{user} estabeleceu a caducidade da tarxeta {card} a {after}",
|
||||
"You have updated the due date of card {card} to {after}" : "Vde. actualizou a caducidade da tarxeta {card} a {after}",
|
||||
"{user} has updated the due date of card {card} to {after}" : "{user} actualizou a caducidade da tarxeta {card} a {after}",
|
||||
"You have added the tag {label} to card {card} in list {stack} on board {board}" : "Vde. engadiu a etiqueta {label} á tarxeta {card} na lista {stack} no taboleiro {board}",
|
||||
@@ -117,7 +117,7 @@ OC.L10N.register(
|
||||
"This comment has more than %s characters.\nAdded as an attachment to the card with name %s.\nAccessible on URL: %s." : "Este comentario ten máis de %s caracteres.\nEngadido como anexo á tarxeta co nome %s.\nAccesíbel no URL: %s.",
|
||||
"Card not found" : "Non se atopou a tarxeta",
|
||||
"Path is already shared with this card" : "A ruta xa está compartida con esta tarxeta",
|
||||
"Invalid date, date format must be YYYY-MM-DD" : "Data incorrecta, o formato da data debe ser AAAA-MM-DD",
|
||||
"Invalid date, date format must be YYYY-MM-DD" : "Data incorrecta, o formato da date debe ser AAAA-MM-DD",
|
||||
"Personal planning and team project organization" : "Planificación persoal e organización de proxectos de equipo",
|
||||
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in Markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your Markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Gabeta é unha ferramenta de organización de estilo kanban dirixida a planificación persoal e organización de proxectos para equipos integrados con Nextcloud. \n\n\n– 📥 Engada as súas tarefas ás tarxetas e fagas ordenadas\n– 📄 Escriba notas adicionais en Markdown\n– 🔖 Asigne etiquetas para unha mellor organización\n– 👥 Comparta co seu equipo, amigos ou a súa familia\n– 📎 Anexe ficheiros e integreos na súa descrición de Markdown\n– 💬 Debata co seu equipo usando os comentarios\n– ⚡ Faga un seguimento dos cambios no fluxo de actividade\n– 🚀 Teña o seu proxecto organizado",
|
||||
"Add board" : "Engadir taboleiro",
|
||||
@@ -150,8 +150,8 @@ OC.L10N.register(
|
||||
"Filter by assigned user" : "Filtrar polo usuario asignado",
|
||||
"Unassigned" : "Sen asignar",
|
||||
"Filter by status" : "Filtrar polo estado",
|
||||
"Open and completed" : "Aberto ou rematado",
|
||||
"Open" : "Aberto",
|
||||
"Open and completed" : "Aberto e rematado",
|
||||
"Open" : "Abrir",
|
||||
"Completed" : "Completado",
|
||||
"Filter by due date" : "Filtrar pola data de caducidade",
|
||||
"Overdue" : "Caducado",
|
||||
@@ -252,7 +252,7 @@ OC.L10N.register(
|
||||
"Write a description …" : "Escriba unha descrición…",
|
||||
"Choose attachment" : "Escoller o anexo",
|
||||
"Assign a due date to this card…" : "Asignar unha data de caducidade a esta tarxeta…",
|
||||
"Set a due date" : "Definir a data de caducidade",
|
||||
"Set a due date" : "Estabelecer a data de caducidade",
|
||||
"Add due date" : "Engadir a data de remate",
|
||||
"Choose a date" : "Escoller a data",
|
||||
"Remove due date" : "Retirar a data de caducidade",
|
||||
|
||||
12
l10n/gl.json
12
l10n/gl.json
@@ -41,8 +41,8 @@
|
||||
"{user} has marked the card {card} as undone in list {stack} on board {board}" : "{user} marcou a tarxeta {card} como sen facer na lista {stack} no taboleiro {board}",
|
||||
"You have removed the due date of card {card}" : "Vde. retirou a caducidade da tarxeta {card}",
|
||||
"{user} has removed the due date of card {card}" : "{user} retirou a caducidade da tarxeta {card}",
|
||||
"You have set the due date of card {card} to {after}" : "Vde. definiu a caducidade da tarxeta {card} a {after}",
|
||||
"{user} has set the due date of card {card} to {after}" : "{user} definiu a caducidade da tarxeta {card} a {after}",
|
||||
"You have set the due date of card {card} to {after}" : "Vde. estabeleceu a caducidade da tarxeta {card} a {after}",
|
||||
"{user} has set the due date of card {card} to {after}" : "{user} estabeleceu a caducidade da tarxeta {card} a {after}",
|
||||
"You have updated the due date of card {card} to {after}" : "Vde. actualizou a caducidade da tarxeta {card} a {after}",
|
||||
"{user} has updated the due date of card {card} to {after}" : "{user} actualizou a caducidade da tarxeta {card} a {after}",
|
||||
"You have added the tag {label} to card {card} in list {stack} on board {board}" : "Vde. engadiu a etiqueta {label} á tarxeta {card} na lista {stack} no taboleiro {board}",
|
||||
@@ -115,7 +115,7 @@
|
||||
"This comment has more than %s characters.\nAdded as an attachment to the card with name %s.\nAccessible on URL: %s." : "Este comentario ten máis de %s caracteres.\nEngadido como anexo á tarxeta co nome %s.\nAccesíbel no URL: %s.",
|
||||
"Card not found" : "Non se atopou a tarxeta",
|
||||
"Path is already shared with this card" : "A ruta xa está compartida con esta tarxeta",
|
||||
"Invalid date, date format must be YYYY-MM-DD" : "Data incorrecta, o formato da data debe ser AAAA-MM-DD",
|
||||
"Invalid date, date format must be YYYY-MM-DD" : "Data incorrecta, o formato da date debe ser AAAA-MM-DD",
|
||||
"Personal planning and team project organization" : "Planificación persoal e organización de proxectos de equipo",
|
||||
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in Markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your Markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Gabeta é unha ferramenta de organización de estilo kanban dirixida a planificación persoal e organización de proxectos para equipos integrados con Nextcloud. \n\n\n– 📥 Engada as súas tarefas ás tarxetas e fagas ordenadas\n– 📄 Escriba notas adicionais en Markdown\n– 🔖 Asigne etiquetas para unha mellor organización\n– 👥 Comparta co seu equipo, amigos ou a súa familia\n– 📎 Anexe ficheiros e integreos na súa descrición de Markdown\n– 💬 Debata co seu equipo usando os comentarios\n– ⚡ Faga un seguimento dos cambios no fluxo de actividade\n– 🚀 Teña o seu proxecto organizado",
|
||||
"Add board" : "Engadir taboleiro",
|
||||
@@ -148,8 +148,8 @@
|
||||
"Filter by assigned user" : "Filtrar polo usuario asignado",
|
||||
"Unassigned" : "Sen asignar",
|
||||
"Filter by status" : "Filtrar polo estado",
|
||||
"Open and completed" : "Aberto ou rematado",
|
||||
"Open" : "Aberto",
|
||||
"Open and completed" : "Aberto e rematado",
|
||||
"Open" : "Abrir",
|
||||
"Completed" : "Completado",
|
||||
"Filter by due date" : "Filtrar pola data de caducidade",
|
||||
"Overdue" : "Caducado",
|
||||
@@ -250,7 +250,7 @@
|
||||
"Write a description …" : "Escriba unha descrición…",
|
||||
"Choose attachment" : "Escoller o anexo",
|
||||
"Assign a due date to this card…" : "Asignar unha data de caducidade a esta tarxeta…",
|
||||
"Set a due date" : "Definir a data de caducidade",
|
||||
"Set a due date" : "Estabelecer a data de caducidade",
|
||||
"Add due date" : "Engadir a data de remate",
|
||||
"Choose a date" : "Escoller a data",
|
||||
"Remove due date" : "Retirar a data de caducidade",
|
||||
|
||||
@@ -174,7 +174,6 @@ OC.L10N.register(
|
||||
"Deleted lists" : "Törölt listák",
|
||||
"Undo" : "Visszavonás",
|
||||
"Deleted cards" : "Törölt kártyák",
|
||||
"Searching for users, groups and teams …" : "Felhasználók, csoportok és csapatok keresése…",
|
||||
"No participants found" : "Nem találhatók résztvevők",
|
||||
"Board owner" : "Tábla tulajdonosa",
|
||||
"(Group)" : "(Csoport)",
|
||||
|
||||
@@ -172,7 +172,6 @@
|
||||
"Deleted lists" : "Törölt listák",
|
||||
"Undo" : "Visszavonás",
|
||||
"Deleted cards" : "Törölt kártyák",
|
||||
"Searching for users, groups and teams …" : "Felhasználók, csoportok és csapatok keresése…",
|
||||
"No participants found" : "Nem találhatók résztvevők",
|
||||
"Board owner" : "Tábla tulajdonosa",
|
||||
"(Group)" : "(Csoport)",
|
||||
|
||||
@@ -37,10 +37,6 @@ OC.L10N.register(
|
||||
"{user} has archived card {card} in list {stack} on board {board}" : "{user}がボード{board}のリスト{stack}にカード{card}をアーカイブしました",
|
||||
"You have unarchived card {card} in list {stack} on board {board}" : "ボード {board}のリスト {stack}にあるカード {card} をアーカイブ解除しました",
|
||||
"{user} has unarchived card {card} in list {stack} on board {board}" : "{user}がボード {board}のリスト {stack}にあるカード {card} をアーカイブ解除しました",
|
||||
"You have marked the card {card} as done in list {stack} on board {board}" : "ボード{board}のリスト{stack}で、カード{card}に完了のマークを付けました。",
|
||||
"{user} has marked card {card} as done in list {stack} on board {board}" : "{user}は、ボード{board}のリスト{stack}で、カード{card}に完了のマークを付けました。",
|
||||
"You have marked the card {card} as undone in list {stack} on board {board}" : "ボード{board}のリスト{stack}でカード{card}に未完成のマークを付けました。",
|
||||
"{user} has marked the card {card} as undone in list {stack} on board {board}" : "{user}は、ボード{board}のリスト{stack}でカード{card}に未完成のマークを付けました。",
|
||||
"You have removed the due date of card {card}" : "カード{card}の期日を削除しました",
|
||||
"{user} has removed the due date of card {card}" : "{user}がカード{card}の期日を削除しました",
|
||||
"You have set the due date of card {card} to {after}" : "カード{card}の期日を{after}に設定しました",
|
||||
@@ -149,7 +145,6 @@ OC.L10N.register(
|
||||
"Filter by tag" : "タグによるフィルター",
|
||||
"Filter by assigned user" : "割当ユーザーでフィルター",
|
||||
"Unassigned" : "未割り当て",
|
||||
"Filter by status" : "ステータスによるフィルター",
|
||||
"Open and completed" : "開いて完成",
|
||||
"Open" : "開く",
|
||||
"Completed" : "完了",
|
||||
@@ -315,7 +310,6 @@ OC.L10N.register(
|
||||
"Show card ID badge" : "カードIDバジを表示",
|
||||
"Show boards in calendar/tasks" : "カレンダー/タスクでボードを表示する",
|
||||
"Limit board creation to some groups" : "ボード作成は一部のグループに制限する",
|
||||
"Users outside of those groups will not be able to create their own boards, but will still be able to work on boards that have been shared with them." : "これらのグループ以外のユーザーは、独自のボードを作成することはできませんが、共有されているボードで作業することはできます。",
|
||||
"Board details" : "ボードの詳細",
|
||||
"Edit board" : "ボードを編集",
|
||||
"Clone board" : "ボードを複製",
|
||||
@@ -333,7 +327,6 @@ OC.L10N.register(
|
||||
"Only assigned cards" : "割り当てられたカードのみ",
|
||||
"No reminder" : "リマインダーなし",
|
||||
"An error occurred" : "エラーが発生しました",
|
||||
"Are you sure you want to delete the board {title}? This will delete all the data of this board including archived cards." : "ボード{title}を削除しますか? これにより、アーカイブされたカードを含むこのボードのすべてのデータが削除されます。",
|
||||
"Delete the board?" : "ボードを削除しますか?",
|
||||
"Loading filtered view" : "フィルタされたビューを読み込み中",
|
||||
"Today" : "今日",
|
||||
@@ -345,7 +338,6 @@ OC.L10N.register(
|
||||
"Deck board {name}\n* Last modified on {lastMod}" : "デッキボード{name}\n最終更新日:{lastMod}",
|
||||
"{stack} in {board}" : "{board} 内の {stack}",
|
||||
"Click to expand description" : "説明を展開するにはクリックしてください",
|
||||
"* Created on {created}\n* Last modified on {lastMod}\n* {nbAttachments} attachments\n* {nbComments} comments" : "* 作成: {created}\n* 最終変更: {lastMod}\n* {nbAttachments} 添付ファイル\n* {nbComments} コメント",
|
||||
"{nbCards} cards" : "{nbCards} カード",
|
||||
"Click to expand comment" : "コメントを展開するにはクリックしてください",
|
||||
"Create a new card" : "新しいカードを作成する",
|
||||
|
||||
@@ -35,10 +35,6 @@
|
||||
"{user} has archived card {card} in list {stack} on board {board}" : "{user}がボード{board}のリスト{stack}にカード{card}をアーカイブしました",
|
||||
"You have unarchived card {card} in list {stack} on board {board}" : "ボード {board}のリスト {stack}にあるカード {card} をアーカイブ解除しました",
|
||||
"{user} has unarchived card {card} in list {stack} on board {board}" : "{user}がボード {board}のリスト {stack}にあるカード {card} をアーカイブ解除しました",
|
||||
"You have marked the card {card} as done in list {stack} on board {board}" : "ボード{board}のリスト{stack}で、カード{card}に完了のマークを付けました。",
|
||||
"{user} has marked card {card} as done in list {stack} on board {board}" : "{user}は、ボード{board}のリスト{stack}で、カード{card}に完了のマークを付けました。",
|
||||
"You have marked the card {card} as undone in list {stack} on board {board}" : "ボード{board}のリスト{stack}でカード{card}に未完成のマークを付けました。",
|
||||
"{user} has marked the card {card} as undone in list {stack} on board {board}" : "{user}は、ボード{board}のリスト{stack}でカード{card}に未完成のマークを付けました。",
|
||||
"You have removed the due date of card {card}" : "カード{card}の期日を削除しました",
|
||||
"{user} has removed the due date of card {card}" : "{user}がカード{card}の期日を削除しました",
|
||||
"You have set the due date of card {card} to {after}" : "カード{card}の期日を{after}に設定しました",
|
||||
@@ -147,7 +143,6 @@
|
||||
"Filter by tag" : "タグによるフィルター",
|
||||
"Filter by assigned user" : "割当ユーザーでフィルター",
|
||||
"Unassigned" : "未割り当て",
|
||||
"Filter by status" : "ステータスによるフィルター",
|
||||
"Open and completed" : "開いて完成",
|
||||
"Open" : "開く",
|
||||
"Completed" : "完了",
|
||||
@@ -313,7 +308,6 @@
|
||||
"Show card ID badge" : "カードIDバジを表示",
|
||||
"Show boards in calendar/tasks" : "カレンダー/タスクでボードを表示する",
|
||||
"Limit board creation to some groups" : "ボード作成は一部のグループに制限する",
|
||||
"Users outside of those groups will not be able to create their own boards, but will still be able to work on boards that have been shared with them." : "これらのグループ以外のユーザーは、独自のボードを作成することはできませんが、共有されているボードで作業することはできます。",
|
||||
"Board details" : "ボードの詳細",
|
||||
"Edit board" : "ボードを編集",
|
||||
"Clone board" : "ボードを複製",
|
||||
@@ -331,7 +325,6 @@
|
||||
"Only assigned cards" : "割り当てられたカードのみ",
|
||||
"No reminder" : "リマインダーなし",
|
||||
"An error occurred" : "エラーが発生しました",
|
||||
"Are you sure you want to delete the board {title}? This will delete all the data of this board including archived cards." : "ボード{title}を削除しますか? これにより、アーカイブされたカードを含むこのボードのすべてのデータが削除されます。",
|
||||
"Delete the board?" : "ボードを削除しますか?",
|
||||
"Loading filtered view" : "フィルタされたビューを読み込み中",
|
||||
"Today" : "今日",
|
||||
@@ -343,7 +336,6 @@
|
||||
"Deck board {name}\n* Last modified on {lastMod}" : "デッキボード{name}\n最終更新日:{lastMod}",
|
||||
"{stack} in {board}" : "{board} 内の {stack}",
|
||||
"Click to expand description" : "説明を展開するにはクリックしてください",
|
||||
"* Created on {created}\n* Last modified on {lastMod}\n* {nbAttachments} attachments\n* {nbComments} comments" : "* 作成: {created}\n* 最終変更: {lastMod}\n* {nbAttachments} 添付ファイル\n* {nbComments} コメント",
|
||||
"{nbCards} cards" : "{nbCards} カード",
|
||||
"Click to expand comment" : "コメントを展開するにはクリックしてください",
|
||||
"Create a new card" : "新しいカードを作成する",
|
||||
|
||||
@@ -186,7 +186,7 @@ OC.L10N.register(
|
||||
"Board owner" : "보드 소유자",
|
||||
"(Group)" : "(그룹)",
|
||||
"(Team)" : "(팀)",
|
||||
"Can edit" : "편집 허용",
|
||||
"Can edit" : "수정할 수 있음",
|
||||
"Can share" : "공유할 수 있음",
|
||||
"Can manage" : "관리 가능",
|
||||
"Owner" : "소유자",
|
||||
|
||||
@@ -184,7 +184,7 @@
|
||||
"Board owner" : "보드 소유자",
|
||||
"(Group)" : "(그룹)",
|
||||
"(Team)" : "(팀)",
|
||||
"Can edit" : "편집 허용",
|
||||
"Can edit" : "수정할 수 있음",
|
||||
"Can share" : "공유할 수 있음",
|
||||
"Can manage" : "관리 가능",
|
||||
"Owner" : "소유자",
|
||||
|
||||
@@ -150,7 +150,7 @@ OC.L10N.register(
|
||||
"Filter by assigned user" : "Отбор по назначению:",
|
||||
"Unassigned" : "Без назначения",
|
||||
"Filter by status" : "Отбор по состоянию:",
|
||||
"Open and completed" : "Открытые или завершённые",
|
||||
"Open and completed" : "Открытые и завершённые",
|
||||
"Open" : "Открытые",
|
||||
"Completed" : "Завершённые",
|
||||
"Filter by due date" : "Отбор по сроку исполнения:",
|
||||
|
||||
@@ -148,7 +148,7 @@
|
||||
"Filter by assigned user" : "Отбор по назначению:",
|
||||
"Unassigned" : "Без назначения",
|
||||
"Filter by status" : "Отбор по состоянию:",
|
||||
"Open and completed" : "Открытые или завершённые",
|
||||
"Open and completed" : "Открытые и завершённые",
|
||||
"Open" : "Открытые",
|
||||
"Completed" : "Завершённые",
|
||||
"Filter by due date" : "Отбор по сроку исполнения:",
|
||||
|
||||
@@ -129,13 +129,10 @@ OC.L10N.register(
|
||||
"Archived cards" : "Arhivirane naloge",
|
||||
"Add list" : "Dodaj seznam",
|
||||
"List name" : "Ime seznama",
|
||||
"Active filters" : "Dejavni filtri",
|
||||
"Apply filter" : "Uveljavi filter",
|
||||
"Filter by tag" : "Filtriraj po oznaki",
|
||||
"Filter by assigned user" : "Filtriraj po dodeljenem uporabniku",
|
||||
"Unassigned" : "Nedodeljeno",
|
||||
"Filter by status" : "Filtri po stanju",
|
||||
"Open and completed" : "Odprto in končano",
|
||||
"Open" : "Odpri",
|
||||
"Completed" : "Končano",
|
||||
"Filter by due date" : "Filtriraj po datumu preteka",
|
||||
@@ -145,8 +142,6 @@ OC.L10N.register(
|
||||
"Next 30 days" : "Naslednjih 30 dni",
|
||||
"No due date" : "Ni datuma preteka",
|
||||
"Clear filter" : "Počisti filter",
|
||||
"View Modes" : "Načini pogleda",
|
||||
"Toggle View Modes" : "Preklopi načine pogleda",
|
||||
"Hide archived cards" : "Skrij arhivirane naloge",
|
||||
"Show archived cards" : "Prikaži arhivirane naloge",
|
||||
"Toggle compact mode" : "Preklopi način prikaza",
|
||||
|
||||
@@ -127,13 +127,10 @@
|
||||
"Archived cards" : "Arhivirane naloge",
|
||||
"Add list" : "Dodaj seznam",
|
||||
"List name" : "Ime seznama",
|
||||
"Active filters" : "Dejavni filtri",
|
||||
"Apply filter" : "Uveljavi filter",
|
||||
"Filter by tag" : "Filtriraj po oznaki",
|
||||
"Filter by assigned user" : "Filtriraj po dodeljenem uporabniku",
|
||||
"Unassigned" : "Nedodeljeno",
|
||||
"Filter by status" : "Filtri po stanju",
|
||||
"Open and completed" : "Odprto in končano",
|
||||
"Open" : "Odpri",
|
||||
"Completed" : "Končano",
|
||||
"Filter by due date" : "Filtriraj po datumu preteka",
|
||||
@@ -143,8 +140,6 @@
|
||||
"Next 30 days" : "Naslednjih 30 dni",
|
||||
"No due date" : "Ni datuma preteka",
|
||||
"Clear filter" : "Počisti filter",
|
||||
"View Modes" : "Načini pogleda",
|
||||
"Toggle View Modes" : "Preklopi načine pogleda",
|
||||
"Hide archived cards" : "Skrij arhivirane naloge",
|
||||
"Show archived cards" : "Prikaži arhivirane naloge",
|
||||
"Toggle compact mode" : "Preklopi način prikaza",
|
||||
|
||||
@@ -117,7 +117,7 @@ OC.L10N.register(
|
||||
"This comment has more than %s characters.\nAdded as an attachment to the card with name %s.\nAccessible on URL: %s." : "Овај коментар има више од %s карактера.\nДодат је као прилог картици под именом %s.\nДоступно је на URL адреси: %s.",
|
||||
"Card not found" : "Картица није нађена",
|
||||
"Path is already shared with this card" : "Путања се већ дели са овом картицом",
|
||||
"Invalid date, date format must be YYYY-MM-DD" : "Неисправан датум, формат датума мора бити ГГГГ-ММ-ДД",
|
||||
"Invalid date, date format must be YYYY-MM-DD" : "Неисправан датим, формат датума мора бити ГГГГ-ММ-ДД",
|
||||
"Personal planning and team project organization" : "Лични планер и организатор тимског пројекта",
|
||||
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in Markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your Markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Шпил је организациони алат у канбан стилу који је намењен личном планирању и организацији пројекта у тимовима интегрисаним са Nextcloud.\n\n\n- 📥 Додајте своје задатке у картице и поређајте их по редоследу\n- 📄 Напишите додатне белешке употребом Markdown синтаксе\n- 🔖 Доделите ознаке у циљу још боље организације\n- 👥 Делите са својим тимом, пријатељима или породицом\n- 📎 Прикачите фајлове и уградите их у свој Markdown опис\n- 💬 Дискутујте са својим тимом користећи коментаре\n- ⚡ Пратите измене у току активности\n- 🚀 Организујте свој пројекат",
|
||||
"Add board" : "Додај таблу",
|
||||
|
||||
@@ -115,7 +115,7 @@
|
||||
"This comment has more than %s characters.\nAdded as an attachment to the card with name %s.\nAccessible on URL: %s." : "Овај коментар има више од %s карактера.\nДодат је као прилог картици под именом %s.\nДоступно је на URL адреси: %s.",
|
||||
"Card not found" : "Картица није нађена",
|
||||
"Path is already shared with this card" : "Путања се већ дели са овом картицом",
|
||||
"Invalid date, date format must be YYYY-MM-DD" : "Неисправан датум, формат датума мора бити ГГГГ-ММ-ДД",
|
||||
"Invalid date, date format must be YYYY-MM-DD" : "Неисправан датим, формат датума мора бити ГГГГ-ММ-ДД",
|
||||
"Personal planning and team project organization" : "Лични планер и организатор тимског пројекта",
|
||||
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in Markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your Markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Шпил је организациони алат у канбан стилу који је намењен личном планирању и организацији пројекта у тимовима интегрисаним са Nextcloud.\n\n\n- 📥 Додајте своје задатке у картице и поређајте их по редоследу\n- 📄 Напишите додатне белешке употребом Markdown синтаксе\n- 🔖 Доделите ознаке у циљу још боље организације\n- 👥 Делите са својим тимом, пријатељима или породицом\n- 📎 Прикачите фајлове и уградите их у свој Markdown опис\n- 💬 Дискутујте са својим тимом користећи коментаре\n- ⚡ Пратите измене у току активности\n- 🚀 Организујте свој пројекат",
|
||||
"Add board" : "Додај таблу",
|
||||
|
||||
@@ -4,14 +4,6 @@ OC.L10N.register(
|
||||
"Finished" : "Završeno",
|
||||
"copy" : "kopiraj",
|
||||
"Done" : "Done",
|
||||
"The file was uploaded" : "Fajl je otpremljen",
|
||||
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Fajl za otpremljivanje premašuje upload_max_filesize direktivu u php.ini",
|
||||
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Fajl za otpremanje premašuje MAX_FILE_SIZE navedenu u HTML obrascu",
|
||||
"The file was only partially uploaded" : "Fajl je parcijalno otpremljen",
|
||||
"No file was uploaded" : "Nijedan fajl nije otpremljen",
|
||||
"Missing a temporary folder" : "Nedostaje privremena fascikla",
|
||||
"Could not write file to disk" : "Ne mogu da upišem fajl na disk",
|
||||
"A PHP extension stopped the file upload" : "PHP ekstenzija je zaustavila otpremanje fajla",
|
||||
"Add board" : "Dodaj tablu",
|
||||
"Move card" : "Premesti karticu",
|
||||
"Cancel" : "Otkaži",
|
||||
|
||||
@@ -2,14 +2,6 @@
|
||||
"Finished" : "Završeno",
|
||||
"copy" : "kopiraj",
|
||||
"Done" : "Done",
|
||||
"The file was uploaded" : "Fajl je otpremljen",
|
||||
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Fajl za otpremljivanje premašuje upload_max_filesize direktivu u php.ini",
|
||||
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Fajl za otpremanje premašuje MAX_FILE_SIZE navedenu u HTML obrascu",
|
||||
"The file was only partially uploaded" : "Fajl je parcijalno otpremljen",
|
||||
"No file was uploaded" : "Nijedan fajl nije otpremljen",
|
||||
"Missing a temporary folder" : "Nedostaje privremena fascikla",
|
||||
"Could not write file to disk" : "Ne mogu da upišem fajl na disk",
|
||||
"A PHP extension stopped the file upload" : "PHP ekstenzija je zaustavila otpremanje fajla",
|
||||
"Add board" : "Dodaj tablu",
|
||||
"Move card" : "Premesti karticu",
|
||||
"Cancel" : "Otkaži",
|
||||
|
||||
@@ -100,7 +100,6 @@ OC.L10N.register(
|
||||
"Archived cards" : "Архівні картки",
|
||||
"Add list" : "Додати список",
|
||||
"List name" : "Назва списку",
|
||||
"Active filters" : "Активні фільтри",
|
||||
"Apply filter" : "Відфільтрувати",
|
||||
"Filter by tag" : "Відібрати за мітками",
|
||||
"Filter by assigned user" : "Відібрати за призначеним користувачем",
|
||||
|
||||
@@ -98,7 +98,6 @@
|
||||
"Archived cards" : "Архівні картки",
|
||||
"Add list" : "Додати список",
|
||||
"List name" : "Назва списку",
|
||||
"Active filters" : "Активні фільтри",
|
||||
"Apply filter" : "Відфільтрувати",
|
||||
"Filter by tag" : "Відібрати за мітками",
|
||||
"Filter by assigned user" : "Відібрати за призначеним користувачем",
|
||||
|
||||
15
l10n/vi.js
15
l10n/vi.js
@@ -149,8 +149,6 @@ OC.L10N.register(
|
||||
"Filter by tag" : "Lọc theo nhãn",
|
||||
"Filter by assigned user" : "Lọc theo người dùng được phân công",
|
||||
"Unassigned" : "Chưa được phân công",
|
||||
"Filter by status" : "Lọc theo trạng thái",
|
||||
"Open and completed" : "Đã mở và hoàn thành",
|
||||
"Open" : "Mở",
|
||||
"Completed" : "Hoàn thành",
|
||||
"Filter by due date" : "Lọc theo thời hạn",
|
||||
@@ -163,7 +161,7 @@ OC.L10N.register(
|
||||
"View Modes" : "Chế độ xem",
|
||||
"Toggle View Modes" : "Chế độ xem chuyển đổi",
|
||||
"Hide archived cards" : "Ẩn tác vụ đã lưu trữ",
|
||||
"Show archived cards" : "Hiển thị các thẻ đã lưu trữ",
|
||||
"Show archived cards" : "Hiện tác vụ đã lưu trữ",
|
||||
"Toggle compact mode" : "Chuyển đổi chế độ thu gọn",
|
||||
"Hide card cover images" : "Ẩn hình ảnh bìa thẻ",
|
||||
"Show card cover images" : "Hiển thị hình ảnh bìa thẻ",
|
||||
@@ -180,12 +178,9 @@ OC.L10N.register(
|
||||
"Deleted lists" : "Danh sách đã bị xóa",
|
||||
"Undo" : "Hoàn tác",
|
||||
"Deleted cards" : "Thẻ đã xóa",
|
||||
"Share board with a user, group or team …" : "Chia sẻ bảng với người dùng, nhóm hoặc đội ...",
|
||||
"Searching for users, groups and teams …" : "Đang tìm kiếm người dùng, nhóm và đội ...",
|
||||
"No participants found" : "Không tìm thấy người tham gia",
|
||||
"Board owner" : "Chủ sở hữu bảng",
|
||||
"(Group)" : "(Nhóm)",
|
||||
"(Team)" : "(Đội)",
|
||||
"Can edit" : "Có thể chỉnh sửa",
|
||||
"Can share" : "Can share",
|
||||
"Can manage" : "Có thể quản lý",
|
||||
@@ -211,9 +206,7 @@ OC.L10N.register(
|
||||
"title and color value must be provided" : "tiều đề và giá trị màu phải được cung cấp",
|
||||
"Board name" : "Tên bảng",
|
||||
"Members" : "Thành viên",
|
||||
"Assign to users/groups/team" : "Gán cho người dùng/nhóm/đội",
|
||||
"Assign a user to this card…" : "Gán một người dùng cho thẻ này...",
|
||||
"Select a user to assign to this card…" : "Chọn một người dùng để gán cho thẻ này…",
|
||||
"Upload new files" : "Tải lên các tệp mới",
|
||||
"Share from Files" : "Chia sẻ từ Thư mục",
|
||||
"Pending share" : "Chia sẻ đang chờ xử lý",
|
||||
@@ -258,7 +251,6 @@ OC.L10N.register(
|
||||
"Remove due date" : "Xóa thời hạn",
|
||||
"Mark as done" : "Đánh dấu là đã hoàn thành",
|
||||
"Due at:" : "Đến lúc:",
|
||||
"Not done" : "Chưa hoàn thành",
|
||||
"Unarchive card" : "Thẻ chưa lưu trữ",
|
||||
"Archive card" : "Lưu trữ thẻ",
|
||||
"Select Date" : "Chọn ngày",
|
||||
@@ -267,7 +259,6 @@ OC.L10N.register(
|
||||
"Set due date for this weekend" : "Đặt ngày hết hạn cho cuối tuần này",
|
||||
"Set due date for next week" : "Đặt ngày hết hạn cho tuần sau",
|
||||
"Assign a tag to this card…" : "Gán một \"thẻ phân biệt\" cho thẻ này ...",
|
||||
"Select or create a tag…" : "Chọn hoặc tạo một thẻ…",
|
||||
"Create a new tag:" : "Tạo một thẻ phân biệt mới:",
|
||||
"(group)" : "(nhóm)",
|
||||
"Next week – {timeLocale}" : "Tuần sau - {timeLocale}",
|
||||
@@ -282,7 +273,6 @@ OC.L10N.register(
|
||||
"Card deleted" : "Thẻ đã bị xóa",
|
||||
"seconds ago" : "vài giây trước",
|
||||
"Keyboard shortcuts" : "Phím tắt",
|
||||
"Boost your productivity using Deck with keyboard shortcuts." : "Tăng cường năng suất của bạn khi sử dụng Deck với các phím tắt.",
|
||||
"Board actions" : "Hành động cho Bảng",
|
||||
"Keyboard shortcut" : "Phím tắt bàn phím",
|
||||
"Action" : "Hành động",
|
||||
@@ -385,7 +375,6 @@ OC.L10N.register(
|
||||
"List is empty" : "Danh sách trống",
|
||||
"Limit deck usage of groups" : "Giới hạn việc sử dụng Kế Hoạch của các nhóm",
|
||||
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Giới hạn của Kế Hoạch sẽ chặn người dùng không thuộc nhóm đó khỏi việc tạo bảng của riêng họ. Người dùng vẫn có thể làm việc trên các bảng đã được chia sẻ với họ.",
|
||||
"Not completed" : "Chưa hoàn thành",
|
||||
"Filter by completed" : "Lọc theo đã việc đã hoàn thành"
|
||||
"Not completed" : "Chưa hoàn thành"
|
||||
},
|
||||
"nplurals=1; plural=0;");
|
||||
|
||||
15
l10n/vi.json
15
l10n/vi.json
@@ -147,8 +147,6 @@
|
||||
"Filter by tag" : "Lọc theo nhãn",
|
||||
"Filter by assigned user" : "Lọc theo người dùng được phân công",
|
||||
"Unassigned" : "Chưa được phân công",
|
||||
"Filter by status" : "Lọc theo trạng thái",
|
||||
"Open and completed" : "Đã mở và hoàn thành",
|
||||
"Open" : "Mở",
|
||||
"Completed" : "Hoàn thành",
|
||||
"Filter by due date" : "Lọc theo thời hạn",
|
||||
@@ -161,7 +159,7 @@
|
||||
"View Modes" : "Chế độ xem",
|
||||
"Toggle View Modes" : "Chế độ xem chuyển đổi",
|
||||
"Hide archived cards" : "Ẩn tác vụ đã lưu trữ",
|
||||
"Show archived cards" : "Hiển thị các thẻ đã lưu trữ",
|
||||
"Show archived cards" : "Hiện tác vụ đã lưu trữ",
|
||||
"Toggle compact mode" : "Chuyển đổi chế độ thu gọn",
|
||||
"Hide card cover images" : "Ẩn hình ảnh bìa thẻ",
|
||||
"Show card cover images" : "Hiển thị hình ảnh bìa thẻ",
|
||||
@@ -178,12 +176,9 @@
|
||||
"Deleted lists" : "Danh sách đã bị xóa",
|
||||
"Undo" : "Hoàn tác",
|
||||
"Deleted cards" : "Thẻ đã xóa",
|
||||
"Share board with a user, group or team …" : "Chia sẻ bảng với người dùng, nhóm hoặc đội ...",
|
||||
"Searching for users, groups and teams …" : "Đang tìm kiếm người dùng, nhóm và đội ...",
|
||||
"No participants found" : "Không tìm thấy người tham gia",
|
||||
"Board owner" : "Chủ sở hữu bảng",
|
||||
"(Group)" : "(Nhóm)",
|
||||
"(Team)" : "(Đội)",
|
||||
"Can edit" : "Có thể chỉnh sửa",
|
||||
"Can share" : "Can share",
|
||||
"Can manage" : "Có thể quản lý",
|
||||
@@ -209,9 +204,7 @@
|
||||
"title and color value must be provided" : "tiều đề và giá trị màu phải được cung cấp",
|
||||
"Board name" : "Tên bảng",
|
||||
"Members" : "Thành viên",
|
||||
"Assign to users/groups/team" : "Gán cho người dùng/nhóm/đội",
|
||||
"Assign a user to this card…" : "Gán một người dùng cho thẻ này...",
|
||||
"Select a user to assign to this card…" : "Chọn một người dùng để gán cho thẻ này…",
|
||||
"Upload new files" : "Tải lên các tệp mới",
|
||||
"Share from Files" : "Chia sẻ từ Thư mục",
|
||||
"Pending share" : "Chia sẻ đang chờ xử lý",
|
||||
@@ -256,7 +249,6 @@
|
||||
"Remove due date" : "Xóa thời hạn",
|
||||
"Mark as done" : "Đánh dấu là đã hoàn thành",
|
||||
"Due at:" : "Đến lúc:",
|
||||
"Not done" : "Chưa hoàn thành",
|
||||
"Unarchive card" : "Thẻ chưa lưu trữ",
|
||||
"Archive card" : "Lưu trữ thẻ",
|
||||
"Select Date" : "Chọn ngày",
|
||||
@@ -265,7 +257,6 @@
|
||||
"Set due date for this weekend" : "Đặt ngày hết hạn cho cuối tuần này",
|
||||
"Set due date for next week" : "Đặt ngày hết hạn cho tuần sau",
|
||||
"Assign a tag to this card…" : "Gán một \"thẻ phân biệt\" cho thẻ này ...",
|
||||
"Select or create a tag…" : "Chọn hoặc tạo một thẻ…",
|
||||
"Create a new tag:" : "Tạo một thẻ phân biệt mới:",
|
||||
"(group)" : "(nhóm)",
|
||||
"Next week – {timeLocale}" : "Tuần sau - {timeLocale}",
|
||||
@@ -280,7 +271,6 @@
|
||||
"Card deleted" : "Thẻ đã bị xóa",
|
||||
"seconds ago" : "vài giây trước",
|
||||
"Keyboard shortcuts" : "Phím tắt",
|
||||
"Boost your productivity using Deck with keyboard shortcuts." : "Tăng cường năng suất của bạn khi sử dụng Deck với các phím tắt.",
|
||||
"Board actions" : "Hành động cho Bảng",
|
||||
"Keyboard shortcut" : "Phím tắt bàn phím",
|
||||
"Action" : "Hành động",
|
||||
@@ -383,7 +373,6 @@
|
||||
"List is empty" : "Danh sách trống",
|
||||
"Limit deck usage of groups" : "Giới hạn việc sử dụng Kế Hoạch của các nhóm",
|
||||
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Giới hạn của Kế Hoạch sẽ chặn người dùng không thuộc nhóm đó khỏi việc tạo bảng của riêng họ. Người dùng vẫn có thể làm việc trên các bảng đã được chia sẻ với họ.",
|
||||
"Not completed" : "Chưa hoàn thành",
|
||||
"Filter by completed" : "Lọc theo đã việc đã hoàn thành"
|
||||
"Not completed" : "Chưa hoàn thành"
|
||||
},"pluralForm" :"nplurals=1; plural=0;"
|
||||
}
|
||||
@@ -23,12 +23,12 @@
|
||||
|
||||
namespace OCA\Deck\Activity;
|
||||
|
||||
use \OCP\Comments\ICommentsEventHandler;
|
||||
use OCA\Deck\Db\CardMapper;
|
||||
use OCA\Deck\Db\ChangeHelper;
|
||||
use OCA\Deck\Notification\NotificationHelper;
|
||||
use OCP\Comments\CommentsEvent;
|
||||
use OCP\Comments\IComment;
|
||||
use OCP\Comments\ICommentsEventHandler;
|
||||
|
||||
class CommentEventHandler implements ICommentsEventHandler {
|
||||
|
||||
|
||||
@@ -77,7 +77,7 @@ class DeckProvider implements IProvider {
|
||||
* @throws \InvalidArgumentException Should be thrown if your provider does not know this event
|
||||
* @since 11.0.0
|
||||
*/
|
||||
public function parse($language, IEvent $event, ?IEvent $previousEvent = null): IEvent {
|
||||
public function parse($language, IEvent $event, IEvent $previousEvent = null): IEvent {
|
||||
if ($event->getApp() !== 'deck') {
|
||||
throw new \InvalidArgumentException();
|
||||
}
|
||||
|
||||
@@ -62,7 +62,6 @@ use OCA\Deck\Search\DeckProvider;
|
||||
use OCA\Deck\Service\PermissionService;
|
||||
use OCA\Deck\Sharing\DeckShareProvider;
|
||||
use OCA\Deck\Sharing\Listener;
|
||||
use OCA\Deck\Teams\DeckTeamResourceProvider;
|
||||
use OCA\Text\Event\LoadEditor;
|
||||
use OCP\AppFramework\App;
|
||||
use OCP\AppFramework\Bootstrap\IBootContext;
|
||||
@@ -180,8 +179,6 @@ class Application extends App implements IBootstrap {
|
||||
|
||||
$context->registerNotifierService(Notifier::class);
|
||||
$context->registerEventListener(LoadAdditionalScriptsEvent::class, ResourceAdditionalScriptsListener::class);
|
||||
|
||||
$context->registerTeamResourceProvider(DeckTeamResourceProvider::class);
|
||||
}
|
||||
|
||||
public function registerCommentsEntity(IEventDispatcher $eventDispatcher): void {
|
||||
|
||||
@@ -55,7 +55,7 @@ class BoardController extends ApiController {
|
||||
* @param $boardId
|
||||
* @return \OCP\AppFramework\Db\Entity
|
||||
*/
|
||||
public function read(int $boardId) {
|
||||
public function read($boardId) {
|
||||
return $this->boardService->find($boardId);
|
||||
}
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
|
||||
namespace OCA\Deck\Controller;
|
||||
|
||||
use \OCP\AppFramework\Http\RedirectResponse;
|
||||
use OCA\Deck\Db\Acl;
|
||||
use OCA\Deck\Db\CardMapper;
|
||||
use OCA\Deck\Service\BoardService;
|
||||
@@ -36,7 +37,6 @@ use OCP\AppFramework\Controller;
|
||||
use OCP\AppFramework\Http\Attribute\NoAdminRequired;
|
||||
use OCP\AppFramework\Http\Attribute\NoCSRFRequired;
|
||||
use OCP\AppFramework\Http\ContentSecurityPolicy;
|
||||
use OCP\AppFramework\Http\RedirectResponse;
|
||||
use OCP\AppFramework\Http\TemplateResponse;
|
||||
use OCP\AppFramework\Services\IInitialState;
|
||||
use OCP\Collaboration\Resources\LoadAdditionalScriptsEvent as CollaborationResourcesEvent;
|
||||
|
||||
@@ -68,7 +68,7 @@ class SessionController extends OCSController {
|
||||
|
||||
#[NoAdminRequired]
|
||||
#[NoCSRFRequired]
|
||||
public function close(int $boardId, ?string $token = null): DataResponse {
|
||||
public function close(int $boardId, string $token = null): DataResponse {
|
||||
if ($token === null) {
|
||||
return new DataResponse();
|
||||
}
|
||||
|
||||
@@ -23,10 +23,10 @@
|
||||
|
||||
namespace OCA\Deck\Db;
|
||||
|
||||
use OC\Cache\CappedMemoryCache;
|
||||
use OCA\Deck\Service\CirclesService;
|
||||
use OCP\AppFramework\Db\DoesNotExistException;
|
||||
use OCP\AppFramework\Db\QBMapper;
|
||||
use OCP\Cache\CappedMemoryCache;
|
||||
use OCP\DB\QueryBuilder\IQueryBuilder;
|
||||
use OCP\IDBConnection;
|
||||
use OCP\IGroupManager;
|
||||
@@ -35,22 +35,37 @@ use Psr\Log\LoggerInterface;
|
||||
|
||||
/** @template-extends QBMapper<Board> */
|
||||
class BoardMapper extends QBMapper implements IPermissionMapper {
|
||||
private $labelMapper;
|
||||
private $aclMapper;
|
||||
private $stackMapper;
|
||||
private $userManager;
|
||||
private $groupManager;
|
||||
private $circlesService;
|
||||
private $logger;
|
||||
|
||||
/** @var CappedMemoryCache<Board[]> */
|
||||
private CappedMemoryCache $userBoardCache;
|
||||
private $userBoardCache;
|
||||
/** @var CappedMemoryCache<Board> */
|
||||
private CappedMemoryCache $boardCache;
|
||||
private $boardCache;
|
||||
|
||||
public function __construct(
|
||||
IDBConnection $db,
|
||||
private LabelMapper $labelMapper,
|
||||
private AclMapper $aclMapper,
|
||||
private StackMapper $stackMapper,
|
||||
private IUserManager $userManager,
|
||||
private IGroupManager $groupManager,
|
||||
private CirclesService $circlesService,
|
||||
private LoggerInterface $logger
|
||||
LabelMapper $labelMapper,
|
||||
AclMapper $aclMapper,
|
||||
StackMapper $stackMapper,
|
||||
IUserManager $userManager,
|
||||
IGroupManager $groupManager,
|
||||
CirclesService $circlesService,
|
||||
LoggerInterface $logger
|
||||
) {
|
||||
parent::__construct($db, 'deck_boards', Board::class);
|
||||
$this->labelMapper = $labelMapper;
|
||||
$this->aclMapper = $aclMapper;
|
||||
$this->stackMapper = $stackMapper;
|
||||
$this->userManager = $userManager;
|
||||
$this->groupManager = $groupManager;
|
||||
$this->circlesService = $circlesService;
|
||||
$this->logger = $logger;
|
||||
|
||||
$this->userBoardCache = new CappedMemoryCache();
|
||||
$this->boardCache = new CappedMemoryCache();
|
||||
@@ -66,8 +81,7 @@ class BoardMapper extends QBMapper implements IPermissionMapper {
|
||||
* @throws DoesNotExistException
|
||||
*/
|
||||
public function find(int $id, bool $withLabels = false, bool $withAcl = false, bool $allowDeleted = false): Board {
|
||||
$cacheKey = (string)$id;
|
||||
if (!isset($this->boardCache[$cacheKey])) {
|
||||
if (!isset($this->boardCache[$id])) {
|
||||
$qb = $this->db->getQueryBuilder();
|
||||
$deletedWhere = $allowDeleted ? $qb->expr()->gte('deleted_at', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT)) : $qb->expr()->eq('deleted_at', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT));
|
||||
$qb->select('*')
|
||||
@@ -75,22 +89,22 @@ class BoardMapper extends QBMapper implements IPermissionMapper {
|
||||
->where($qb->expr()->eq('id', $qb->createNamedParameter($id, IQueryBuilder::PARAM_INT)))
|
||||
->andWhere($deletedWhere)
|
||||
->orderBy('id');
|
||||
$this->boardCache[(string)$id] = $this->findEntity($qb);
|
||||
$this->boardCache[$id] = $this->findEntity($qb);
|
||||
}
|
||||
|
||||
// Add labels
|
||||
if ($withLabels && $this->boardCache[$cacheKey]->getLabels() === null) {
|
||||
if ($withLabels && $this->boardCache[$id]->getLabels() === null) {
|
||||
$labels = $this->labelMapper->findAll($id);
|
||||
$this->boardCache[$cacheKey]->setLabels($labels);
|
||||
$this->boardCache[$id]->setLabels($labels);
|
||||
}
|
||||
|
||||
// Add acl
|
||||
if ($withAcl && $this->boardCache[$cacheKey]->getAcl() === null) {
|
||||
if ($withAcl && $this->boardCache[$id]->getAcl() === null) {
|
||||
$acl = $this->aclMapper->findAll($id);
|
||||
$this->boardCache[$cacheKey]->setAcl($acl);
|
||||
$this->boardCache[$id]->setAcl($acl);
|
||||
}
|
||||
|
||||
return $this->boardCache[$cacheKey];
|
||||
return $this->boardCache[$id];
|
||||
}
|
||||
|
||||
public function findBoardIds(string $userId): array {
|
||||
@@ -400,51 +414,6 @@ class BoardMapper extends QBMapper implements IPermissionMapper {
|
||||
return $entries;
|
||||
}
|
||||
|
||||
public function findAllByTeam(string $teamId): array {
|
||||
$qb = $this->db->getQueryBuilder();
|
||||
$qb->select('b.id', 'title', 'owner', 'color', 'archived', 'deleted_at', 'last_modified')
|
||||
->from('deck_boards', 'b')
|
||||
->innerJoin('b', 'deck_board_acl', 'acl', $qb->expr()->eq('b.id', 'acl.board_id'))
|
||||
->where($qb->expr()->eq('acl.type', $qb->createNamedParameter(Acl::PERMISSION_TYPE_CIRCLE, IQueryBuilder::PARAM_INT)))
|
||||
->andWhere($qb->expr()->eq('acl.participant', $qb->createNamedParameter($teamId, IQueryBuilder::PARAM_STR)));
|
||||
$entries = $this->findEntities($qb);
|
||||
foreach ($entries as $entry) {
|
||||
$entry->setShared(2);
|
||||
}
|
||||
return $entries;
|
||||
}
|
||||
|
||||
public function findTeamsForBoard(int $boardId): array {
|
||||
$qb = $this->db->getQueryBuilder();
|
||||
$qb->select('acl.participant')
|
||||
->from('deck_boards', 'b')
|
||||
->innerJoin('b', 'deck_board_acl', 'acl', $qb->expr()->eq('b.id', 'acl.board_id'))
|
||||
->where($qb->expr()->eq('b.id', $qb->createNamedParameter($boardId, IQueryBuilder::PARAM_INT)))
|
||||
->andWhere($qb->expr()->eq('acl.type', $qb->createNamedParameter(Acl::PERMISSION_TYPE_CIRCLE, IQueryBuilder::PARAM_INT)));
|
||||
|
||||
$result = $qb->executeQuery();
|
||||
return array_map(function ($entry) {
|
||||
return $entry['participant'];
|
||||
}, $result->fetchAll());
|
||||
}
|
||||
|
||||
public function isSharedWithTeam(int $boardId, string $teamId): bool {
|
||||
$qb = $this->db->getQueryBuilder();
|
||||
$qb->select('b.id', 'title', 'owner', 'color', 'archived', 'deleted_at', 'last_modified')
|
||||
->from('deck_boards', 'b')
|
||||
->innerJoin('b', 'deck_board_acl', 'acl', $qb->expr()->eq('b.id', 'acl.board_id'))
|
||||
->where($qb->expr()->eq('b.id', $qb->createNamedParameter($boardId, IQueryBuilder::PARAM_INT)))
|
||||
->andWhere($qb->expr()->eq('acl.type', $qb->createNamedParameter(Acl::PERMISSION_TYPE_CIRCLE, IQueryBuilder::PARAM_INT)))
|
||||
->andWhere($qb->expr()->eq('acl.participant', $qb->createNamedParameter($teamId, IQueryBuilder::PARAM_STR)));
|
||||
try {
|
||||
$this->findEntity($qb);
|
||||
return true;
|
||||
} catch (DoesNotExistException $e) {
|
||||
// Expected return falue
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public function findAll(): array {
|
||||
$qb = $this->db->getQueryBuilder();
|
||||
$qb->select('id')
|
||||
@@ -495,7 +464,8 @@ class BoardMapper extends QBMapper implements IPermissionMapper {
|
||||
}
|
||||
|
||||
public function mapAcl(Acl &$acl) {
|
||||
$acl->resolveRelation('participant', function ($participant) use (&$acl) {
|
||||
$groupManager = $this->groupManager;
|
||||
$acl->resolveRelation('participant', function ($participant) use (&$acl, &$userManager, &$groupManager) {
|
||||
if ($acl->getType() === Acl::PERMISSION_TYPE_USER) {
|
||||
if ($this->userManager->userExists($acl->getParticipant())) {
|
||||
return new User($acl->getParticipant(), $this->userManager);
|
||||
@@ -504,7 +474,7 @@ class BoardMapper extends QBMapper implements IPermissionMapper {
|
||||
return null;
|
||||
}
|
||||
if ($acl->getType() === Acl::PERMISSION_TYPE_GROUP) {
|
||||
$group = $this->groupManager->get($participant);
|
||||
$group = $groupManager->get($participant);
|
||||
if ($group !== null) {
|
||||
return new Group($group);
|
||||
}
|
||||
|
||||
@@ -171,7 +171,7 @@ class CardMapper extends QBMapper implements IPermissionMapper {
|
||||
|
||||
public function queryCardsByBoards(array $boardIds): IQueryBuilder {
|
||||
$qb = $this->db->getQueryBuilder();
|
||||
$qb->selectDistinct('c.*')
|
||||
$qb->select('c.*')
|
||||
->from('deck_cards', 'c')
|
||||
->innerJoin('c', 'deck_stacks', 's', $qb->expr()->eq('s.id', 'c.stack_id'))
|
||||
->andWhere($qb->expr()->in('s.board_id', $qb->createNamedParameter($boardIds, IQueryBuilder::PARAM_INT_ARRAY)));
|
||||
@@ -313,7 +313,7 @@ class CardMapper extends QBMapper implements IPermissionMapper {
|
||||
return $this->findEntities($qb);
|
||||
}
|
||||
|
||||
public function search(array $boardIds, SearchQuery $query, ?int $limit = null, ?int $offset = null): array {
|
||||
public function search(array $boardIds, SearchQuery $query, int $limit = null, int $offset = null): array {
|
||||
$qb = $this->queryCardsByBoards($boardIds);
|
||||
$this->extendQueryByFilter($qb, $query);
|
||||
|
||||
@@ -339,6 +339,7 @@ class CardMapper extends QBMapper implements IPermissionMapper {
|
||||
);
|
||||
}
|
||||
|
||||
$qb->groupBy('c.id');
|
||||
$qb->orderBy('c.last_modified', 'DESC');
|
||||
if ($limit !== null) {
|
||||
$qb->setMaxResults($limit);
|
||||
@@ -356,7 +357,7 @@ class CardMapper extends QBMapper implements IPermissionMapper {
|
||||
return $entities;
|
||||
}
|
||||
|
||||
public function searchComments(array $boardIds, SearchQuery $query, ?int $limit = null, ?int $offset = null): array {
|
||||
public function searchComments(array $boardIds, SearchQuery $query, int $limit = null, int $offset = null): array {
|
||||
if (count($query->getTextTokens()) === 0) {
|
||||
return [];
|
||||
}
|
||||
@@ -382,6 +383,7 @@ class CardMapper extends QBMapper implements IPermissionMapper {
|
||||
$tokenMatching
|
||||
);
|
||||
|
||||
$qb->groupBy('comments.id', 'c.id');
|
||||
$qb->orderBy('comments.id', 'DESC');
|
||||
if ($limit !== null) {
|
||||
$qb->setMaxResults($limit);
|
||||
@@ -614,7 +616,7 @@ class CardMapper extends QBMapper implements IPermissionMapper {
|
||||
});
|
||||
}
|
||||
|
||||
public function transferOwnership(string $ownerId, string $newOwnerId, ?int $boardId = null): void {
|
||||
public function transferOwnership(string $ownerId, string $newOwnerId, int $boardId = null): void {
|
||||
$params = [
|
||||
'owner' => $ownerId,
|
||||
'newOwner' => $newOwnerId
|
||||
|
||||
@@ -31,7 +31,7 @@ use OCA\Deck\Db\Card;
|
||||
class CardUpdatedEvent extends ACardEvent {
|
||||
private $cardBefore;
|
||||
|
||||
public function __construct(Card $card, ?Card $before = null) {
|
||||
public function __construct(Card $card, Card $before = null) {
|
||||
parent::__construct($card);
|
||||
$this->cardBefore = $before;
|
||||
}
|
||||
|
||||
@@ -110,7 +110,7 @@ class ConfigService {
|
||||
return false;
|
||||
}
|
||||
|
||||
public function isCalendarEnabled(?int $boardId = null): bool {
|
||||
public function isCalendarEnabled(int $boardId = null): bool {
|
||||
if ($this->getUserId() === null) {
|
||||
return false;
|
||||
}
|
||||
@@ -124,7 +124,7 @@ class ConfigService {
|
||||
return (bool)$this->config->getUserValue($this->getUserId(), Application::APP_ID, 'board:' . $boardId . ':calendar', $defaultState);
|
||||
}
|
||||
|
||||
public function isCardDetailsInModal(?int $boardId = null): bool {
|
||||
public function isCardDetailsInModal(int $boardId = null): bool {
|
||||
if ($this->getUserId() === null) {
|
||||
return false;
|
||||
}
|
||||
@@ -223,7 +223,7 @@ class ConfigService {
|
||||
return array_filter($groups);
|
||||
}
|
||||
|
||||
public function getAttachmentFolder(?string $userId = null): string {
|
||||
public function getAttachmentFolder(string $userId = null): string {
|
||||
if ($userId === null && $this->getUserId() === null) {
|
||||
throw new NoPermissionException('Must be logged in get the attachment folder');
|
||||
}
|
||||
@@ -231,7 +231,7 @@ class ConfigService {
|
||||
return $this->config->getUserValue($userId ?? $this->getUserId(), 'deck', 'attachment_folder', '/Deck');
|
||||
}
|
||||
|
||||
public function setAttachmentFolder(?string $userId, string $path): void {
|
||||
public function setAttachmentFolder(?string $userId = null, string $path): void {
|
||||
if ($userId === null && $this->getUserId() === null) {
|
||||
throw new NoPermissionException('Must be logged in get the attachment folder');
|
||||
}
|
||||
|
||||
@@ -75,7 +75,7 @@ class SearchService {
|
||||
$this->urlGenerator = $urlGenerator;
|
||||
}
|
||||
|
||||
public function searchCards(string $term, ?int $limit = null, ?int $cursor = null): array {
|
||||
public function searchCards(string $term, int $limit = null, ?int $cursor = null): array {
|
||||
$boards = $this->boardService->getUserBoards();
|
||||
$boardIds = array_map(static function (Board $board) {
|
||||
return $board->getId();
|
||||
|
||||
@@ -516,7 +516,6 @@ class DeckShareProvider implements \OCP\Share\IShareProvider {
|
||||
}
|
||||
|
||||
$qb->innerJoin('s', 'filecache', 'f', $qb->expr()->eq('s.file_source', 'f.fileid'));
|
||||
$qb->andWhere($qb->expr()->eq('f.storage', $qb->createNamedParameter($node->getMountPoint()->getNumericStorageId(), IQueryBuilder::PARAM_INT)));
|
||||
if ($shallow) {
|
||||
$qb->andWhere($qb->expr()->eq('f.parent', $qb->createNamedParameter($node->getId())));
|
||||
} else {
|
||||
@@ -848,7 +847,7 @@ class DeckShareProvider implements \OCP\Share\IShareProvider {
|
||||
$pathSections = explode('/', $data['path'], 2);
|
||||
// FIXME: would not detect rare md5'd home storage case properly
|
||||
if ($pathSections[0] !== 'files'
|
||||
&& (strpos($data['storage_string_id'], 'home::') === 0 || strpos($data['storage_string_id'], 'object::user') === 0)) {
|
||||
&& in_array(explode(':', $data['storage_string_id'], 2)[0], ['home', 'object'])) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
||||
@@ -1,80 +0,0 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace OCA\Deck\Teams;
|
||||
|
||||
use OCA\Deck\AppInfo\Application;
|
||||
use OCA\Deck\Db\Board;
|
||||
use OCA\Deck\Db\BoardMapper;
|
||||
use OCP\IURLGenerator;
|
||||
use OCP\Teams\TeamResource;
|
||||
|
||||
/**
|
||||
* @copyright Copyright (c) 2024 Julius Härtl <jus@bitgrid.net>
|
||||
*
|
||||
* @author Julius Härtl <jus@bitgrid.net>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
class DeckTeamResourceProvider implements \OCP\Teams\ITeamResourceProvider {
|
||||
|
||||
public function __construct(
|
||||
private BoardMapper $boardMapper,
|
||||
private IURLGenerator $urlGenerator,
|
||||
) {
|
||||
}
|
||||
|
||||
|
||||
public function getId(): string {
|
||||
return Application::APP_ID;
|
||||
}
|
||||
|
||||
public function getName(): string {
|
||||
return 'Deck';
|
||||
}
|
||||
|
||||
public function getIconSvg(): string {
|
||||
return file_get_contents(__DIR__ . '/../../img/deck-current.svg');
|
||||
}
|
||||
|
||||
public function getSharedWith($teamId): array {
|
||||
$boards = $this->boardMapper->findAllByTeam($teamId);
|
||||
return array_map(function (Board $board) {
|
||||
return new TeamResource(
|
||||
$this,
|
||||
(string)$board->getId(),
|
||||
$board->getTitle(),
|
||||
$this->urlGenerator->linkToRouteAbsolute('deck.page.index') . '#/board/' . $board->getId(),
|
||||
$this->getBoardBulletIcon($board),
|
||||
$this->urlGenerator->getAbsoluteURL($this->urlGenerator->imagePath('deck', 'deck-current.svg')),
|
||||
);
|
||||
}, $boards);
|
||||
}
|
||||
|
||||
public function isSharedWithTeam(string $teamId, string $resourceId): bool {
|
||||
return $this->boardMapper->isSharedWithTeam((int)$resourceId, $teamId);
|
||||
}
|
||||
|
||||
public function getTeamsForResource(string $resourceId): array {
|
||||
return $this->boardMapper->findTeamsForBoard((int)$resourceId);
|
||||
}
|
||||
|
||||
public function getBoardBulletIcon(Board $board): string {
|
||||
return '<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16" version="1.1" viewBox="0 0 16 16"><g fill="#' . $board->getColor(). '"><rect ry="15" height="14" width="14" y="1" x="1"/></g></svg>';
|
||||
}
|
||||
}
|
||||
6654
package-lock.json
generated
6654
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
47
package.json
47
package.json
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "deck",
|
||||
"description": "",
|
||||
"version": "1.13.1",
|
||||
"version": "1.12.3",
|
||||
"authors": [
|
||||
{
|
||||
"name": "Julius Härtl",
|
||||
@@ -31,36 +31,35 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/polyfill": "^7.12.1",
|
||||
"@babel/runtime": "^7.24.1",
|
||||
"@nextcloud/auth": "^2.3.0",
|
||||
"@babel/runtime": "^7.23.2",
|
||||
"@nextcloud/auth": "^2.2.1",
|
||||
"@nextcloud/axios": "^2.4.0",
|
||||
"@nextcloud/capabilities": "^1.1.0",
|
||||
"@nextcloud/dialogs": "^5.3.2",
|
||||
"@nextcloud/dialogs": "^4.2.2",
|
||||
"@nextcloud/event-bus": "^3.1.0",
|
||||
"@nextcloud/files": "^3.4.0",
|
||||
"@nextcloud/files": "^3.0.0",
|
||||
"@nextcloud/initial-state": "^2.1.0",
|
||||
"@nextcloud/l10n": "^2.2.0",
|
||||
"@nextcloud/moment": "^1.3.1",
|
||||
"@nextcloud/notify_push": "^1.1.4",
|
||||
"@nextcloud/router": "^3.0.0",
|
||||
"@nextcloud/vue": "^8.12.0",
|
||||
"@nextcloud/moment": "^1.2.2",
|
||||
"@nextcloud/notify_push": "^1.1.3",
|
||||
"@nextcloud/router": "^2.2.0",
|
||||
"@nextcloud/vue": "^7.12.6",
|
||||
"blueimp-md5": "^2.19.0",
|
||||
"chroma-js": "^2.4.2",
|
||||
"dompurify": "^3.0.11",
|
||||
"dompurify": "^3.0.6",
|
||||
"lodash": "^4.17.21",
|
||||
"markdown-it": "^14.1.0",
|
||||
"markdown-it": "^13.0.2",
|
||||
"markdown-it-link-attributes": "^4.0.1",
|
||||
"markdown-it-task-checkbox": "^1.0.6",
|
||||
"moment": "^2.30.1",
|
||||
"nextcloud-vue-collections": "^0.12.0",
|
||||
"p-queue": "^8.0.1",
|
||||
"moment": "^2.29.4",
|
||||
"nextcloud-vue-collections": "^0.11.1",
|
||||
"p-queue": "^7.4.1",
|
||||
"url-search-params-polyfill": "^8.2.5",
|
||||
"vue": "^2.7.15",
|
||||
"vue-at": "^2.5.1",
|
||||
"vue-click-outside": "^1.1.0",
|
||||
"vue-easymde": "^2.0.0",
|
||||
"vue-infinite-loading": "^2.4.5",
|
||||
"vue-material-design-icons": "^5.3.0",
|
||||
"vue-material-design-icons": "^5.2.0",
|
||||
"vue-router": "^3.6.5",
|
||||
"vue-smooth-dnd": "^0.8.1",
|
||||
"vuex": "^3.6.2",
|
||||
@@ -76,20 +75,20 @@
|
||||
"devDependencies": {
|
||||
"@nextcloud/babel-config": "^1.0.0",
|
||||
"@nextcloud/browserslist-config": "^3.0.0",
|
||||
"@nextcloud/cypress": "^1.0.0-beta.7",
|
||||
"@nextcloud/cypress": "^1.0.0-beta.6",
|
||||
"@nextcloud/eslint-config": "^8.3.0",
|
||||
"@nextcloud/stylelint-config": "^2.4.0",
|
||||
"@nextcloud/stylelint-config": "^2.3.1",
|
||||
"@nextcloud/webpack-vue-config": "^6.0.0",
|
||||
"@relative-ci/agent": "^4.2.5",
|
||||
"@vue/test-utils": "^2.4.5",
|
||||
"@relative-ci/agent": "^4.2.1",
|
||||
"@vue/test-utils": "^1.3.6",
|
||||
"@vue/vue2-jest": "^29.2.6",
|
||||
"cypress": "^13.7.1",
|
||||
"cypress": "^13.5.1",
|
||||
"eslint-plugin-cypress": "^2.15.1",
|
||||
"eslint-webpack-plugin": "^4.1.0",
|
||||
"eslint-webpack-plugin": "^4.0.1",
|
||||
"jest": "^29.7.0",
|
||||
"jest-serializer-vue": "^3.1.0",
|
||||
"stylelint-webpack-plugin": "^5.0.0",
|
||||
"vue-template-compiler": "^2.7.16"
|
||||
"stylelint-webpack-plugin": "^4.1.1",
|
||||
"vue-template-compiler": "^2.7.15"
|
||||
},
|
||||
"jest": {
|
||||
"moduleFileExtensions": [
|
||||
|
||||
@@ -200,13 +200,11 @@ export default {
|
||||
background-image: url('../img/color_picker.svg');
|
||||
}
|
||||
|
||||
.v-select {
|
||||
.multiselect {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.modal__card {
|
||||
width: 100%;
|
||||
min-width: 100%;
|
||||
height: 100vh;
|
||||
max-height: calc(100vh - 120px);
|
||||
overflow: auto;
|
||||
|
||||
@@ -2,20 +2,21 @@
|
||||
<NcModal v-if="modalShow" :title="t('deck', 'Move card to another board')" @close="modalShow=false">
|
||||
<div class="modal__content">
|
||||
<h3>{{ t('deck', 'Move card to another board') }}</h3>
|
||||
<NcSelect v-model="selectedBoard"
|
||||
:input-label="t('deck', 'Select a board')"
|
||||
<NcMultiselect v-model="selectedBoard"
|
||||
:placeholder="t('deck', 'Select a board')"
|
||||
:options="activeBoards"
|
||||
:max-height="100"
|
||||
label="title"
|
||||
@option:selected="loadStacksFromBoard" />
|
||||
<NcSelect v-model="selectedStack"
|
||||
:disabled="stacksFromBoard.length === 0"
|
||||
:placeholder="stacksFromBoard.length === 0 ? t('deck', 'No lists available') : t('deck', 'Select a list')"
|
||||
:input-label="t('deck', 'Select a list')"
|
||||
@select="loadStacksFromBoard" />
|
||||
<NcMultiselect v-model="selectedStack"
|
||||
:placeholder="t('deck', 'Select a list')"
|
||||
:options="stacksFromBoard"
|
||||
:max-height="100"
|
||||
label="title" />
|
||||
label="title">
|
||||
<span slot="noOptions">
|
||||
{{ t('deck', 'List is empty') }}
|
||||
</span>
|
||||
</NcMultiselect>
|
||||
|
||||
<button :disabled="!isBoardAndStackChoosen" class="primary" @click="moveCard">
|
||||
{{ t('deck', 'Move card') }}
|
||||
@@ -28,14 +29,14 @@
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { NcModal, NcSelect } from '@nextcloud/vue'
|
||||
import { NcModal, NcMultiselect } from '@nextcloud/vue'
|
||||
import { generateUrl } from '@nextcloud/router'
|
||||
import axios from '@nextcloud/axios'
|
||||
import { subscribe, unsubscribe } from '@nextcloud/event-bus'
|
||||
|
||||
export default {
|
||||
name: 'CardMoveDialog',
|
||||
components: { NcModal, NcSelect },
|
||||
components: { NcModal, NcMultiselect },
|
||||
data() {
|
||||
return {
|
||||
card: null,
|
||||
@@ -91,15 +92,11 @@ export default {
|
||||
width: 25vw;
|
||||
min-width: 250px;
|
||||
min-height: 120px;
|
||||
text-align: center;
|
||||
margin: 20px 20px 100px 20px;
|
||||
|
||||
h3 {
|
||||
font-weight: bold;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.select {
|
||||
margin-bottom: 12px;
|
||||
.multiselect {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -24,12 +24,12 @@
|
||||
<NcModal class="card-selector" @close="close">
|
||||
<div id="modal-inner" :class="{ 'icon-loading': loading }">
|
||||
<h3>{{ title }}</h3>
|
||||
<NcSelect v-model="selectedBoard"
|
||||
<NcMultiselect v-model="selectedBoard"
|
||||
:placeholder="t('deck', 'Select a board')"
|
||||
:options="boards"
|
||||
:disabled="loading"
|
||||
label="title"
|
||||
@option:selected="fetchCardsFromBoard">
|
||||
@select="fetchCardsFromBoard">
|
||||
<template slot="singleLabel" slot-scope="props">
|
||||
<span>
|
||||
<span :style="{ 'backgroundColor': '#' + props.option.color }" class="board-bullet" />
|
||||
@@ -42,9 +42,9 @@
|
||||
<span>{{ props.option.title }}</span>
|
||||
</span>
|
||||
</template>
|
||||
</NcSelect>
|
||||
</NcMultiselect>
|
||||
|
||||
<NcSelect v-model="selectedCard"
|
||||
<NcMultiselect v-model="selectedCard"
|
||||
:placeholder="t('deck', 'Select a card')"
|
||||
:options="cardsFromBoard"
|
||||
:disabled="loading || selectedBoard === ''"
|
||||
@@ -62,14 +62,14 @@
|
||||
|
||||
<script>
|
||||
import { generateUrl } from '@nextcloud/router'
|
||||
import { NcModal, NcSelect } from '@nextcloud/vue'
|
||||
import { NcModal, NcMultiselect } from '@nextcloud/vue'
|
||||
import axios from '@nextcloud/axios'
|
||||
|
||||
export default {
|
||||
name: 'CardSelector',
|
||||
components: {
|
||||
NcModal,
|
||||
NcSelect,
|
||||
NcMultiselect,
|
||||
},
|
||||
props: {
|
||||
title: {
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
<div class="activity--header">
|
||||
<img :src="activity.icon" class="activity--icon">
|
||||
<NcRichText class="activity--subject" :text="message.subject" :arguments="message.parameters" />
|
||||
<div class="activity--timestamp" :name="formatReadableDate(activity.datetime)">
|
||||
<div class="activity--timestamp" :title="formatReadableDate(activity.datetime)">
|
||||
{{ relativeDate(activity.datetime) }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
</div>
|
||||
</transition>
|
||||
|
||||
<NcModal v-if="modalShow" :name="t('deck', 'File already exists')" @close="modalShow=false">
|
||||
<NcModal v-if="modalShow" :title="t('deck', 'File already exists')" @close="modalShow=false">
|
||||
<div class="modal__content">
|
||||
<h2>{{ t('deck', 'File already exists') }}</h2>
|
||||
<p>
|
||||
|
||||
@@ -78,7 +78,7 @@
|
||||
required
|
||||
@focus="$store.dispatch('toggleShortcutLock', true)"
|
||||
@blur="$store.dispatch('toggleShortcutLock', false)">
|
||||
<input :title="t('deck', 'Add list')"
|
||||
<input v-tooltip="t('deck', 'Add list')"
|
||||
class="icon-confirm"
|
||||
type="submit"
|
||||
value="">
|
||||
@@ -86,24 +86,24 @@
|
||||
</div>
|
||||
<div v-if="board" class="board-action-buttons">
|
||||
<div class="board-action-buttons__filter">
|
||||
<NcPopover :placement="'bottom-end'"
|
||||
<NcPopover container=".board-action-buttons__filter"
|
||||
:placement="'bottom-end'"
|
||||
:aria-label="t('deck', 'Active filters')"
|
||||
:name="t('deck', 'Active filters')"
|
||||
:title="t('deck', 'Active filters')"
|
||||
:tooltip="t('deck', 'Active filters')"
|
||||
@show="filterVisible=true"
|
||||
@hide="filterVisible=false">
|
||||
<!-- We cannot use NcActions here are the popover trigger does not update on reactive icons -->
|
||||
<template #trigger>
|
||||
<NcButton ref="filterPopover"
|
||||
:title="t('deck', 'Apply filter')"
|
||||
:aria-label="t('deck', 'Apply filter')"
|
||||
class="filter-button"
|
||||
:type="isFilterActive ? 'primary' : 'tertiary'">
|
||||
<template #icon>
|
||||
<FilterIcon v-if="isFilterActive" :size="20" decorative />
|
||||
<FilterOffIcon v-else :size="20" decorative />
|
||||
</template>
|
||||
</NcButton>
|
||||
</template>
|
||||
<NcButton slot="trigger"
|
||||
ref="filterPopover"
|
||||
:title="t('deck', 'Apply filter')"
|
||||
class="filter-button"
|
||||
:type="isFilterActive ? 'primary' : 'tertiary'">
|
||||
<template #icon>
|
||||
<FilterIcon v-if="isFilterActive" :size="20" decorative />
|
||||
<FilterOffIcon v-else :size="20" decorative />
|
||||
</template>
|
||||
</NcButton>
|
||||
|
||||
<div v-if="filterVisible" class="filter">
|
||||
<h3>{{ t('deck', 'Filter by tag') }}</h3>
|
||||
@@ -138,40 +138,8 @@
|
||||
<label :for="user.uid"><NcAvatar :user="user.uid" :size="24" :disable-menu="true" /> {{ user.displayname }}</label>
|
||||
</div>
|
||||
|
||||
<h3>{{ t('deck', 'Filter by completed') }}</h3>
|
||||
<div class="filter--item">
|
||||
<input id="filter-option-both"
|
||||
v-model="filter.completed"
|
||||
type="radio"
|
||||
class="radio"
|
||||
value="both"
|
||||
@change="setFilter"
|
||||
@click="beforeSetFilter">
|
||||
<label for="filter-option-both">{{ t('deck', 'Open and completed') }}</label>
|
||||
</div>
|
||||
<div class="filter--item">
|
||||
<input id="filter-option-open"
|
||||
v-model="filter.completed"
|
||||
type="radio"
|
||||
class="radio"
|
||||
value="open"
|
||||
@change="setFilter"
|
||||
@click="beforeSetFilter">
|
||||
<label for="filter-option-open">{{ t('deck', 'Open') }}</label>
|
||||
</div>
|
||||
|
||||
<div class="filter--item">
|
||||
<input id="filter-option-completed"
|
||||
v-model="filter.completed"
|
||||
type="radio"
|
||||
class="radio"
|
||||
value="completed"
|
||||
@change="setFilter"
|
||||
@click="beforeSetFilter">
|
||||
<label for="filter-option-completed">{{ t('deck', 'Completed') }}</label>
|
||||
</div>
|
||||
|
||||
<h3>{{ t('deck', 'Filter by due date') }}</h3>
|
||||
|
||||
<div class="filter--item">
|
||||
<input id="overdue"
|
||||
v-model="filter.due"
|
||||
@@ -235,7 +203,7 @@
|
||||
</div>
|
||||
|
||||
<NcActions :aria-label="t('deck', 'View Modes')"
|
||||
:name="t('deck', 'Toggle View Modes')">
|
||||
:title="t('deck', 'Toggle View Modes')">
|
||||
<NcActionButton @click="toggleShowArchived">
|
||||
<template #icon>
|
||||
<ArchiveIcon :size="20" decorative />
|
||||
@@ -260,10 +228,10 @@
|
||||
</NcActionButton>
|
||||
</NcActions>
|
||||
<!-- FIXME: NcActionRouter currently doesn't work as an inline action -->
|
||||
<NcActions v-if="isFullApp">
|
||||
<NcActions>
|
||||
<NcActionButton icon="icon-menu-sidebar"
|
||||
:aria-label="t('deck', 'Open details')"
|
||||
:name="t('deck', 'Details')"
|
||||
:title="t('deck', 'Details')"
|
||||
@click="toggleDetailsView" />
|
||||
</NcActions>
|
||||
</div>
|
||||
@@ -325,7 +293,7 @@ export default {
|
||||
filterVisible: false,
|
||||
showArchived: false,
|
||||
isAddStackVisible: false,
|
||||
filter: { tags: [], users: [], due: '', unassigned: false, completed: 'both' },
|
||||
filter: { tags: [], users: [], due: '', unassigned: false },
|
||||
showAddCardModal: false,
|
||||
defaultPageTitle: false,
|
||||
isNotifyPushEnabled: isNotifyPushEnabled(),
|
||||
@@ -338,7 +306,6 @@ export default {
|
||||
'canManage',
|
||||
]),
|
||||
...mapState({
|
||||
isFullApp: state => state.isFullApp,
|
||||
compactMode: state => state.compactMode,
|
||||
showCardCover: state => state.showCardCover,
|
||||
searchQuery: state => state.searchQuery,
|
||||
@@ -349,7 +316,7 @@ export default {
|
||||
}
|
||||
},
|
||||
isFilterActive() {
|
||||
return this.filter.tags.length !== 0 || this.filter.users.length !== 0 || this.filter.due !== '' || this.filter.completed !== 'both'
|
||||
return this.filter.tags.length !== 0 || this.filter.users.length !== 0 || this.filter.due !== ''
|
||||
},
|
||||
labelsSorted() {
|
||||
return [...this.board.labels].sort((a, b) => (a.title < b.title) ? -1 : 1)
|
||||
@@ -392,12 +359,7 @@ export default {
|
||||
}
|
||||
if (e.target.value === 'unassigned') {
|
||||
this.filter.users = []
|
||||
this.$store.dispatch('setFilter', { ...this.filter })
|
||||
} else {
|
||||
this.filter.completed = 'both'
|
||||
this.$store.dispatch('setFilter', { ...this.filter })
|
||||
}
|
||||
this.$store.dispatch('setFilter', { ...this.filter })
|
||||
},
|
||||
setFilter() {
|
||||
if (this.filter.users.length > 0) {
|
||||
@@ -439,7 +401,7 @@ export default {
|
||||
}
|
||||
},
|
||||
clearFilter() {
|
||||
const filterReset = { tags: [], users: [], due: '', completed: 'both' }
|
||||
const filterReset = { tags: [], users: [], due: '' }
|
||||
this.$store.dispatch('setFilter', { ...filterReset })
|
||||
this.filter = filterReset
|
||||
},
|
||||
@@ -450,9 +412,6 @@ export default {
|
||||
this.showAddCardModal = false
|
||||
},
|
||||
setPageTitle(title) {
|
||||
if (!this.isFullApp) {
|
||||
return
|
||||
}
|
||||
if (this.defaultPageTitle === false) {
|
||||
this.defaultPageTitle = window.document.title
|
||||
if (this.defaultPageTitle.indexOf(' - Deck - ') !== -1) {
|
||||
@@ -556,6 +515,7 @@ export default {
|
||||
input + label {
|
||||
display: block;
|
||||
padding: 6px 0;
|
||||
vertical-align: middle;
|
||||
.avatardiv {
|
||||
vertical-align: middle;
|
||||
margin-bottom: 2px;
|
||||
@@ -599,4 +559,8 @@ export default {
|
||||
.popover:focus {
|
||||
outline: 2px solid var(--color-main-text);
|
||||
}
|
||||
|
||||
.tooltip-inner.popover-inner {
|
||||
text-align: left;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
* -->
|
||||
|
||||
<template>
|
||||
<div :title="t('text', 'Currently present people')"
|
||||
<div v-tooltip.bottom="t('text', 'Currently present people')"
|
||||
class="avatar-list">
|
||||
<div v-for="session in sessionsVisible"
|
||||
:key="session.uid"
|
||||
@@ -37,13 +37,16 @@
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { NcAvatar } from '@nextcloud/vue'
|
||||
import { NcAvatar, Tooltip } from '@nextcloud/vue'
|
||||
|
||||
export default {
|
||||
name: 'SessionList',
|
||||
components: {
|
||||
NcAvatar,
|
||||
},
|
||||
directives: {
|
||||
tooltip: Tooltip,
|
||||
},
|
||||
props: {
|
||||
sessions: {
|
||||
type: Array,
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
class="no-close"
|
||||
:placeholder="t('deck', 'List name')"
|
||||
required>
|
||||
<input title="t('deck', 'Add list')"
|
||||
<input v-tooltip="t('deck', 'Add list')"
|
||||
class="icon-confirm"
|
||||
type="submit"
|
||||
value="">
|
||||
@@ -81,16 +81,7 @@
|
||||
</Container>
|
||||
</div>
|
||||
</transition>
|
||||
<GlobalSearchResults v-if="isFullApp" />
|
||||
<NcModal v-if="localModal"
|
||||
:clear-view-delay="0"
|
||||
:close-button-contained="true"
|
||||
size="large"
|
||||
@close="localModal = null">
|
||||
<div class="modal__content modal__card">
|
||||
<CardSidebar :id="localModal" @close="localModal = null" />
|
||||
</div>
|
||||
</NcModal>
|
||||
<GlobalSearchResults />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -100,11 +91,11 @@ import { mapState, mapGetters } from 'vuex'
|
||||
import Controls from '../Controls.vue'
|
||||
import DeckIcon from '../icons/DeckIcon.vue'
|
||||
import Stack from './Stack.vue'
|
||||
import { NcEmptyContent, NcModal } from '@nextcloud/vue'
|
||||
import { NcEmptyContent } from '@nextcloud/vue'
|
||||
import GlobalSearchResults from '../search/GlobalSearchResults.vue'
|
||||
import { showError } from '../../helpers/errors.js'
|
||||
import { createSession } from '../../sessions.js'
|
||||
import CardSidebar from '../card/CardSidebar.vue'
|
||||
|
||||
export default {
|
||||
name: 'Board',
|
||||
components: {
|
||||
@@ -115,8 +106,6 @@ export default {
|
||||
Draggable,
|
||||
Stack,
|
||||
NcEmptyContent,
|
||||
NcModal,
|
||||
CardSidebar,
|
||||
},
|
||||
inject: [
|
||||
'boardApi',
|
||||
@@ -134,12 +123,10 @@ export default {
|
||||
newStackTitle: '',
|
||||
currentScrollPosX: null,
|
||||
currentMousePosX: null,
|
||||
localModal: null,
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
...mapState({
|
||||
isFullApp: state => state.isFullApp,
|
||||
board: state => state.currentBoard,
|
||||
showArchived: state => state.showArchived,
|
||||
}),
|
||||
@@ -168,9 +155,6 @@ export default {
|
||||
created() {
|
||||
this.session = createSession(this.id)
|
||||
this.fetchData()
|
||||
this.$root.$on('open-card', (cardId) => {
|
||||
this.localModal = cardId
|
||||
})
|
||||
},
|
||||
beforeDestroy() {
|
||||
this.session.close()
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
<template>
|
||||
<NcAppSidebar v-if="board != null"
|
||||
:actions="[]"
|
||||
:name="board.title"
|
||||
:title="board.title"
|
||||
@close="closeSidebar">
|
||||
<NcAppSidebarTab id="sharing"
|
||||
:order="0"
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
<template>
|
||||
<div>
|
||||
<NcSelect v-if="canShare"
|
||||
<NcMultiselect v-if="canShare"
|
||||
v-model="addAcl"
|
||||
:input-label="t('deck', 'Share board with a user, group or team …')"
|
||||
:placeholder="t('deck', 'Share board with a user, group or circle …')"
|
||||
:options="formatedSharees"
|
||||
:user-select="true"
|
||||
label="displayName"
|
||||
@@ -11,20 +11,20 @@
|
||||
track-by="multiselectKey"
|
||||
:internal-search="false"
|
||||
@input="clickAddAcl"
|
||||
@search="(search, loading) => asyncFind(search, loading)">
|
||||
@search-change="asyncFind">
|
||||
<template #noOptions>
|
||||
{{ isSearching ? t('deck', 'Searching for users, groups and teams …') : t('deck', 'No participants found') }}
|
||||
{{ isSearching ? t('deck', 'Searching for users, groups and circles …') : t('deck', 'No participants found') }}
|
||||
</template>
|
||||
<template #noResult>
|
||||
{{ isSearching ? t('deck', 'Searching for users, groups and teams …') : t('deck', 'No participants found') }}
|
||||
{{ isSearching ? t('deck', 'Searching for users, groups and circles …') : t('deck', 'No participants found') }}
|
||||
</template>
|
||||
</NcSelect>
|
||||
</NcMultiselect>
|
||||
|
||||
<ul id="shareWithList"
|
||||
class="shareWithList">
|
||||
<li>
|
||||
<NcAvatar :user="board.owner.uid" />
|
||||
<span class="username">
|
||||
<span class="has-tooltip username">
|
||||
{{ board.owner.displayname }}
|
||||
<span v-if="!isCurrentUser(board.owner.uid)" class="board-owner-label">
|
||||
{{ t('deck', 'Board owner') }}
|
||||
@@ -35,10 +35,10 @@
|
||||
<NcAvatar v-if="acl.type===0" :user="acl.participant.uid" />
|
||||
<div v-if="acl.type===1" class="avatardiv icon icon-group" />
|
||||
<div v-if="acl.type===7" class="avatardiv icon icon-circles" />
|
||||
<span class="username">
|
||||
<span class="has-tooltip username">
|
||||
{{ acl.participant.displayname }}
|
||||
<span v-if="acl.type===1">{{ t('deck', '(Group)') }}</span>
|
||||
<span v-if="acl.type===7">{{ t('deck', '(Team)') }}</span>
|
||||
<span v-if="acl.type===7">{{ t('deck', '(Circle)') }}</span>
|
||||
</span>
|
||||
|
||||
<NcActionCheckbox v-if="!(isCurrentUser(acl.participant.uid) && acl.type === 0) && (canManage || (canEdit && canShare))"
|
||||
@@ -88,7 +88,7 @@
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { NcAvatar, NcSelect, NcActions, NcActionButton, NcActionCheckbox, NcRelatedResourcesPanel } from '@nextcloud/vue'
|
||||
import { NcAvatar, NcMultiselect, NcActions, NcActionButton, NcActionCheckbox, NcRelatedResourcesPanel } from '@nextcloud/vue'
|
||||
import { CollectionList } from 'nextcloud-vue-collections'
|
||||
import { mapGetters, mapState } from 'vuex'
|
||||
import { getCurrentUser } from '@nextcloud/auth'
|
||||
@@ -103,7 +103,7 @@ export default {
|
||||
NcActions,
|
||||
NcActionButton,
|
||||
NcActionCheckbox,
|
||||
NcSelect,
|
||||
NcMultiselect,
|
||||
CollectionList,
|
||||
NcRelatedResourcesPanel,
|
||||
},
|
||||
@@ -170,7 +170,7 @@ export default {
|
||||
},
|
||||
},
|
||||
mounted() {
|
||||
this.asyncFind('', () => {})
|
||||
this.asyncFind('')
|
||||
},
|
||||
methods: {
|
||||
debouncedFind: debounce(async function(query) {
|
||||
@@ -178,10 +178,8 @@ export default {
|
||||
await this.$store.dispatch('loadSharees', query)
|
||||
this.isSearching = false
|
||||
}, 300),
|
||||
async asyncFind(query, loading) {
|
||||
loading(true)
|
||||
async asyncFind(query) {
|
||||
await this.debouncedFind(query)
|
||||
loading(false)
|
||||
},
|
||||
async clickAddAcl() {
|
||||
this.addAclForAPI = {
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
{{ stack.title }}
|
||||
</h3>
|
||||
<h3 v-else-if="!editing"
|
||||
title="stack.title"
|
||||
v-tooltip="stack.title"
|
||||
dir="auto"
|
||||
tabindex="0"
|
||||
:aria-label="stack.title"
|
||||
@@ -51,7 +51,7 @@
|
||||
dir="auto"
|
||||
type="text"
|
||||
required="required">
|
||||
<input title="t('deck', 'Edit list title')"
|
||||
<input v-tooltip="t('deck', 'Edit list title')"
|
||||
class="icon-confirm"
|
||||
type="submit"
|
||||
value="">
|
||||
@@ -118,7 +118,6 @@
|
||||
:placeholder="t('deck', 'Card name')"
|
||||
required
|
||||
pattern=".*\S+.*"
|
||||
@focus="onCreateCardFocus"
|
||||
@keydown.esc="stopCardCreation">
|
||||
<input v-show="!stateCardCreating"
|
||||
class="icon-confirm"
|
||||
@@ -159,7 +158,7 @@ import { showError, showUndo } from '@nextcloud/dialogs'
|
||||
|
||||
import CardItem from '../cards/CardItem.vue'
|
||||
|
||||
import '@nextcloud/dialogs/style.css'
|
||||
import '@nextcloud/dialogs/dist/index.css'
|
||||
|
||||
export default {
|
||||
name: 'Stack',
|
||||
@@ -230,13 +229,6 @@ export default {
|
||||
},
|
||||
},
|
||||
},
|
||||
watch: {
|
||||
showAddCard(newValue) {
|
||||
if (!newValue) {
|
||||
this.$store.dispatch('toggleShortcutLock', false)
|
||||
}
|
||||
},
|
||||
},
|
||||
|
||||
methods: {
|
||||
stopCardCreation(e) {
|
||||
@@ -326,9 +318,6 @@ export default {
|
||||
this.stateCardCreating = false
|
||||
}
|
||||
},
|
||||
onCreateCardFocus() {
|
||||
this.$store.dispatch('toggleShortcutLock', true)
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
@@ -12,21 +12,20 @@
|
||||
<div :style="{ backgroundColor: '#' + editingLabel.color }" class="color0 icon-colorpicker" />
|
||||
</NcColorPicker>
|
||||
<input v-model="editingLabel.title" type="text">
|
||||
<input :disabled="!editLabelObjValidated"
|
||||
<input v-tooltip="{content: missingDataLabel, show: !editLabelObjValidated, trigger: 'manual' }"
|
||||
:disabled="!editLabelObjValidated"
|
||||
type="submit"
|
||||
value=""
|
||||
class="icon-confirm">
|
||||
<NcActions>
|
||||
<NcActionButton :disabled="!editLabelObjValidated"
|
||||
<NcActionButton v-tooltip="{content: missingDataLabel, show: !editLabelObjValidated, trigger: 'manual' }"
|
||||
:disabled="!editLabelObjValidated"
|
||||
icon="icon-close"
|
||||
@click="editingLabelId = null">
|
||||
{{ t('deck', 'Cancel') }}
|
||||
</NcActionButton>
|
||||
</NcActions>
|
||||
</form>
|
||||
<p v-if="!editLabelObjValidated">
|
||||
{{ missingDataLabel }}
|
||||
</p>
|
||||
</template>
|
||||
<template v-else>
|
||||
<div v-if="canManage && !isArchived" class="label-title" @click="clickEdit(label)">
|
||||
@@ -59,7 +58,8 @@
|
||||
<div :style="{ backgroundColor: '#' + addLabelObj.color }" class="color0 icon-colorpicker" />
|
||||
</NcColorPicker>
|
||||
<input v-model="addLabelObj.title" type="text">
|
||||
<input :disabled="!addLabelObjValidated"
|
||||
<input v-tooltip="{content: missingDataLabel, show: !addLabelObjValidated, trigger: 'manual' }"
|
||||
:disabled="!addLabelObjValidated"
|
||||
type="submit"
|
||||
value=""
|
||||
class="icon-confirm">
|
||||
@@ -69,9 +69,6 @@
|
||||
</NcActionButton>
|
||||
</NcActions>
|
||||
</form>
|
||||
<p v-if="!addLabelObjValidated">
|
||||
{{ missingDataLabel }}
|
||||
</p>
|
||||
</li>
|
||||
<button v-if="canManage && !isArchived" @click="clickShowAddLabel()">
|
||||
<span class="icon-add" />{{ t('deck', 'Add a new tag') }}
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
:user="user.participant.uid"
|
||||
:display-name="user.participant.displayname"
|
||||
class="board-list-avatar" />
|
||||
<div v-if="board.acl.length > 5" :title="otherAcl" class="avatardiv popovermenu-wrapper board-list-avatar icon-more" />
|
||||
<div v-if="board.acl.length > 5" v-tooltip="otherAcl" class="avatardiv popovermenu-wrapper board-list-avatar icon-more" />
|
||||
</div>
|
||||
<div class="board-list-actions-cell" />
|
||||
</router-link>
|
||||
|
||||
@@ -1,21 +1,21 @@
|
||||
<template>
|
||||
<div class="selector-wrapper" :aria-label="t('deck', 'Assign to users/groups/team')" data-test="assignment-selector">
|
||||
<div class="selector-wrapper" :aria-label="t('deck', 'Assign to users/groups/circles')" data-test="assignment-selector">
|
||||
<div class="selector-wrapper--icon">
|
||||
<AccountMultiple :size="20" />
|
||||
</div>
|
||||
<NcSelect v-if="canEdit"
|
||||
<NcMultiselect v-if="canEdit"
|
||||
v-model="assignedUsers"
|
||||
class="selector-wrapper--selector"
|
||||
:disabled="assignables.length === 0"
|
||||
:multiple="true"
|
||||
:options="formatedAssignables"
|
||||
:user-select="true"
|
||||
:aria-label-combobox="t('deck', 'Assign a user to this card…')"
|
||||
:placeholder="t('deck', 'Select a user to assign to this card…')"
|
||||
:auto-limit="false"
|
||||
:placeholder="t('deck', 'Assign a user to this card…')"
|
||||
label="displayname"
|
||||
track-by="multiselectKey"
|
||||
@option:selected="onSelect"
|
||||
@option:deselected="onRemove">
|
||||
@select="onSelect"
|
||||
@remove="onRemove">
|
||||
<template #tag="scope">
|
||||
<div class="avatarlist--inline">
|
||||
<NcAvatar :user="scope.option.uid"
|
||||
@@ -25,7 +25,7 @@
|
||||
:disable-menu="true" />
|
||||
</div>
|
||||
</template>
|
||||
</NcSelect>
|
||||
</NcMultiselect>
|
||||
<div v-else class="avatar-list--readonly">
|
||||
<NcAvatar v-for="option in assignedUsers"
|
||||
:key="option.primaryKey"
|
||||
@@ -39,14 +39,14 @@
|
||||
|
||||
<script>
|
||||
import { defineComponent } from 'vue'
|
||||
import { NcAvatar, NcSelect } from '@nextcloud/vue'
|
||||
import { NcAvatar, NcMultiselect } from '@nextcloud/vue'
|
||||
import AccountMultiple from 'vue-material-design-icons/AccountMultiple.vue'
|
||||
|
||||
export default defineComponent({
|
||||
name: 'AssignmentSelector',
|
||||
components: {
|
||||
AccountMultiple,
|
||||
NcSelect,
|
||||
NcMultiselect,
|
||||
NcAvatar,
|
||||
},
|
||||
props: {
|
||||
@@ -117,12 +117,11 @@ export default defineComponent({
|
||||
this.assignedUsers = []
|
||||
}
|
||||
},
|
||||
onSelect(options) {
|
||||
const addition = options.filter((item) => !this.card.assignedUsers.find((user) => user.participant.primaryKey === item.primaryKey))
|
||||
this.$emit('select', addition[0])
|
||||
onSelect(user) {
|
||||
this.$emit('select', user)
|
||||
},
|
||||
onRemove(removed) {
|
||||
this.$emit('remove', removed)
|
||||
onRemove(user) {
|
||||
this.$emit('remove', user)
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
@@ -117,6 +117,7 @@ const maxUploadSizeState = loadState('deck', 'maxUploadSize', -1)
|
||||
|
||||
const picker = getFilePickerBuilder(t('deck', 'File to share'))
|
||||
.setMultiSelect(false)
|
||||
.setModal(true)
|
||||
.setType(1)
|
||||
.allowDirectories()
|
||||
.build()
|
||||
|
||||
@@ -23,19 +23,19 @@
|
||||
<template>
|
||||
<NcAppSidebar v-if="currentBoard && currentCard"
|
||||
:active="tabId"
|
||||
:name="title"
|
||||
:subname="subtitle"
|
||||
:subtitle="subtitleTooltip"
|
||||
:name-editable="titleEditable"
|
||||
@update:nameEditable="handleUpdateTitleEditable"
|
||||
@update:name="handleUpdateTitle"
|
||||
@submit-name="handleSubmitTitle"
|
||||
:title="title"
|
||||
:subtitle="subtitle"
|
||||
:subtitle-tooltip="subtitleTooltip"
|
||||
:title-editable="titleEditable"
|
||||
@update:titleEditable="handleUpdateTitleEditable"
|
||||
@update:title="handleUpdateTitle"
|
||||
@submit-title="handleSubmitTitle"
|
||||
@close="closeSidebar">
|
||||
<template #secondary-actions>
|
||||
<NcActionButton v-if="cardDetailsInModal && isFullApp" icon="icon-menu-sidebar" @click.stop="closeModal()">
|
||||
<NcActionButton v-if="cardDetailsInModal" icon="icon-menu-sidebar" @click.stop="closeModal()">
|
||||
{{ t('deck', 'Open in sidebar view') }}
|
||||
</NcActionButton>
|
||||
<NcActionButton v-else-if="isFullApp" icon="icon-external" @click.stop="showModal()">
|
||||
<NcActionButton v-else icon="icon-external" @click.stop="showModal()">
|
||||
{{ t('deck', 'Open in bigger view') }}
|
||||
</NcActionButton>
|
||||
|
||||
@@ -83,7 +83,6 @@
|
||||
|
||||
<script>
|
||||
import { NcActionButton, NcAppSidebar, NcAppSidebarTab } from '@nextcloud/vue'
|
||||
import { getCapabilities } from '@nextcloud/capabilities'
|
||||
import { mapState, mapGetters } from 'vuex'
|
||||
import CardSidebarTabDetails from './CardSidebarTabDetails.vue'
|
||||
import CardSidebarTabAttachments from './CardSidebarTabAttachments.vue'
|
||||
@@ -100,7 +99,7 @@ import { showError } from '@nextcloud/dialogs'
|
||||
import { getLocale } from '@nextcloud/l10n'
|
||||
import CardMenuEntries from '../cards/CardMenuEntries.vue'
|
||||
|
||||
const capabilities = getCapabilities()
|
||||
const capabilities = window.OC.getCapabilities()
|
||||
|
||||
export default {
|
||||
name: 'CardSidebar',
|
||||
@@ -145,7 +144,6 @@ export default {
|
||||
},
|
||||
computed: {
|
||||
...mapState({
|
||||
isFullApp: state => state.isFullApp,
|
||||
currentBoard: state => state.currentBoard,
|
||||
}),
|
||||
...mapGetters(['canEdit', 'assignables', 'cardActions', 'stackById']),
|
||||
@@ -190,8 +188,7 @@ export default {
|
||||
},
|
||||
|
||||
closeSidebar() {
|
||||
this.$router?.push({ name: 'board' })
|
||||
this.$emit('close')
|
||||
this.$router.push({ name: 'board' })
|
||||
},
|
||||
|
||||
showModal() {
|
||||
@@ -207,7 +204,7 @@ export default {
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
<style lang="scss" scoped>
|
||||
|
||||
section.app-sidebar__tab--active {
|
||||
min-height: auto;
|
||||
@@ -228,7 +225,7 @@ section.app-sidebar__tab--active {
|
||||
right: 0;
|
||||
max-width: calc(100% - #{$modal-padding * 2});
|
||||
padding: 0 14px;
|
||||
height: 100%;
|
||||
height: auto;
|
||||
overflow: initial;
|
||||
user-select: text;
|
||||
-webkit-user-select: text;
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
<div>
|
||||
<div class="comment--header">
|
||||
<NcAvatar :user="currentUser.uid" />
|
||||
<span class="username">
|
||||
<span class="has-tooltip username">
|
||||
{{ currentUser.displayName }}
|
||||
</span>
|
||||
</div>
|
||||
|
||||
@@ -178,13 +178,14 @@ export default {
|
||||
},
|
||||
|
||||
async addLabelToBoardAndCard(name) {
|
||||
await this.$store.dispatch('addLabelToCurrentBoardAndCard', {
|
||||
const newLabel = await this.$store.dispatch('addLabelToCurrentBoardAndCard', {
|
||||
card: this.copiedCard,
|
||||
newLabel: {
|
||||
title: name,
|
||||
color: this.randomColor(),
|
||||
},
|
||||
})
|
||||
this.copiedCard.labels.push(newLabel)
|
||||
},
|
||||
|
||||
removeLabelFromCard(removedLabel) {
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
@blur="error = null"
|
||||
@input="validate()" />
|
||||
</At>
|
||||
<input :title="t('deck', 'Save')"
|
||||
<input v-tooltip="t('deck', 'Save')"
|
||||
class="icon-confirm"
|
||||
type="submit"
|
||||
value=""
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
<li v-else class="comment">
|
||||
<div class="comment--header">
|
||||
<NcAvatar :user="comment.actorId" />
|
||||
<span class="username">
|
||||
<span class="has-tooltip username">
|
||||
{{ comment.actorDisplayName }}
|
||||
</span>
|
||||
<NcActions v-show="!edit" :force-menu="true">
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
<span v-if="descriptionLastEdit && !descriptionSaving">{{ t('deck', '(Unsaved)') }}</span>
|
||||
<span v-if="descriptionSaving">{{ t('deck', '(Saving…)') }}</span>
|
||||
<a v-if="!textAppAvailable"
|
||||
:title="t('deck', 'Formatting help')"
|
||||
v-tooltip="t('deck', 'Formatting help')"
|
||||
href="https://deck.readthedocs.io/en/latest/Markdown/"
|
||||
target="_blank"
|
||||
class="icon icon-info" />
|
||||
@@ -440,6 +440,6 @@ h5 {
|
||||
}
|
||||
|
||||
.modal__card .description__text .text-menubar {
|
||||
top: 0;
|
||||
top: 142px !important;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
<template #icon>
|
||||
<CheckIcon :size="20" />
|
||||
</template>
|
||||
{{ t('deck', 'Mark as done') }}
|
||||
{{ t('deck', 'Completed') }}
|
||||
</NcButton>
|
||||
</template>
|
||||
<template v-else>
|
||||
@@ -66,7 +66,7 @@
|
||||
<div class="due-actions">
|
||||
<NcButton v-if="!card.archived"
|
||||
type="tertiary"
|
||||
:name="t('deck', 'Not done')"
|
||||
:title="t('deck', 'Not completed')"
|
||||
@click="changeCardDoneStatus()">
|
||||
<template #icon>
|
||||
<ClearIcon :size="20" />
|
||||
|
||||
@@ -3,48 +3,46 @@
|
||||
<div class="selector-wrapper--icon">
|
||||
<TagMultiple :size="20" />
|
||||
</div>
|
||||
<NcSelect :value="assignedLabels"
|
||||
<NcMultiselect :value="assignedLabels"
|
||||
class="selector-wrapper--selector"
|
||||
:multiple="true"
|
||||
:disabled="disabled"
|
||||
:options="labelsSorted"
|
||||
:aria-label-combobox="t('deck', 'Assign a tag to this card…')"
|
||||
:placeholder="t('deck', 'Select or create a tag…')"
|
||||
:placeholder="t('deck', 'Assign a tag to this card…')"
|
||||
:taggable="true"
|
||||
:close-on-select="false"
|
||||
label="title"
|
||||
track-by="id"
|
||||
tag-position="bottom"
|
||||
@option:selected="onSelect"
|
||||
@option:deselected="onRemove"
|
||||
@option:created="onNewTag">
|
||||
@select="onSelect"
|
||||
@remove="onRemove"
|
||||
@tag="onNewTag">
|
||||
<template #option="scope">
|
||||
<div v-if="!scope?.isTag" :style="{ backgroundColor: '#' + scope.color, color: textColor(scope.color)}" class="tag">
|
||||
{{ scope.title }}
|
||||
<div v-if="!scope.option?.isTag" :style="{ backgroundColor: '#' + scope.option.color, color: textColor(scope.option.color)}" class="tag">
|
||||
{{ scope.option.title }}
|
||||
</div>
|
||||
<div v-else>
|
||||
{{ t('deck', 'Create a new tag:') }} <div class="tag">
|
||||
{{ scope.label }}
|
||||
{{ scope.option.label }}
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<template #selected-option="scope">
|
||||
<div :style="{ backgroundColor: '#' + scope.color, color: textColor(scope.color)}" class="tag">
|
||||
{{ scope.title }}
|
||||
<template #tag="scope">
|
||||
<div :style="{ backgroundColor: '#' + scope.option.color, color: textColor(scope.option.color)}" class="tag">
|
||||
{{ scope.option.title }}
|
||||
</div>
|
||||
</template>
|
||||
</NcSelect>
|
||||
</NcMultiselect>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { NcSelect } from '@nextcloud/vue'
|
||||
import { NcMultiselect } from '@nextcloud/vue'
|
||||
import Color from '../../mixins/color.js'
|
||||
import TagMultiple from 'vue-material-design-icons/TagMultiple.vue'
|
||||
|
||||
export default {
|
||||
name: 'TagSelector',
|
||||
components: { TagMultiple, NcSelect },
|
||||
components: { TagMultiple, NcMultiselect },
|
||||
mixins: [Color],
|
||||
props: {
|
||||
card: {
|
||||
@@ -63,22 +61,20 @@ export default {
|
||||
computed: {
|
||||
labelsSorted() {
|
||||
return [...this.labels].sort((a, b) => (a.title < b.title) ? -1 : 1)
|
||||
.filter(label => this.card.labels.findIndex((l) => l.id === label.id) === -1)
|
||||
},
|
||||
assignedLabels() {
|
||||
return [...this.card.labels].sort((a, b) => (a.title < b.title) ? -1 : 1)
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
onSelect(options) {
|
||||
const addedLabel = options.filter(option => !this.card.labels.includes(option))
|
||||
this.$emit('select', addedLabel[0])
|
||||
onSelect(newLabel) {
|
||||
this.$emit('select', newLabel)
|
||||
},
|
||||
onRemove(removedLabel) {
|
||||
this.$emit('remove', removedLabel)
|
||||
},
|
||||
async onNewTag(option) {
|
||||
this.$emit('newtag', option.title)
|
||||
async onNewTag(name) {
|
||||
this.$emit('newtag', name)
|
||||
},
|
||||
},
|
||||
}
|
||||
@@ -87,19 +83,17 @@ export default {
|
||||
<style lang="scss" scoped>
|
||||
@import '../../css/selector';
|
||||
|
||||
.v-select:deep(.vs__selected) {
|
||||
padding-left: 0 !important;
|
||||
.multiselect--active {
|
||||
z-index: 10022;
|
||||
}
|
||||
|
||||
.tag {
|
||||
flex-grow: 0;
|
||||
flex-shrink: 1;
|
||||
overflow: hidden;
|
||||
padding: 3px 12px;
|
||||
display: inline-block;
|
||||
border-radius: var(--border-radius-pill);
|
||||
padding: 0px 5px;
|
||||
border-radius: 15px;
|
||||
font-size: 85%;
|
||||
margin-right: 3px;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
</style>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user