Compare commits
274 Commits
fix/autosa
...
backport/7
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
87c7fdbad2 | ||
|
|
4c1243363a | ||
|
|
16ccc79bb4 | ||
|
|
df4fd1de2f | ||
|
|
8e03f8cc64 | ||
|
|
f1e5038756 | ||
|
|
ba6902e470 | ||
|
|
5674887b61 | ||
|
|
3bc0ddcca2 | ||
|
|
48e904c37b | ||
|
|
44a5eadb73 | ||
|
|
7b7221b3e1 | ||
|
|
b19872e56c | ||
|
|
cb1819cf10 | ||
|
|
7d6d41a5d1 | ||
|
|
aa6c488845 | ||
|
|
a14aa1b5d4 | ||
|
|
e2e14d88be | ||
|
|
2546ff981d | ||
|
|
a2e5e9fe5b | ||
|
|
985eaa0133 | ||
|
|
db48deb4f8 | ||
|
|
173ec28c6d | ||
|
|
9d18b08325 | ||
|
|
7775ddd9f7 | ||
|
|
d5fb6cb4b0 | ||
|
|
a5245b41ac | ||
|
|
e34f4f081c | ||
|
|
0292b0307e | ||
|
|
913a2fac8f | ||
|
|
aac7f0c943 | ||
|
|
5f0a55b5cd | ||
|
|
95958e5465 | ||
|
|
19bb3aba97 | ||
|
|
1345b9cfee | ||
|
|
646cf7f0c6 | ||
|
|
6d29ef0607 | ||
|
|
c27bc874eb | ||
|
|
bdb8f1845b | ||
|
|
75f6af1e6b | ||
|
|
81bd239dec | ||
|
|
4d4fbd8fc9 | ||
|
|
d46b554576 | ||
|
|
3dc52816eb | ||
|
|
2799bc3bb8 | ||
|
|
f275dcc5be | ||
|
|
19ef846692 | ||
|
|
75542efab4 | ||
|
|
b41a7eac8b | ||
|
|
9e07995011 | ||
|
|
348e10bb6c | ||
|
|
ff5db11e9c | ||
|
|
b30e742114 | ||
|
|
aefdcb70e9 | ||
|
|
dbc350cd4b | ||
|
|
7e2fb648b0 | ||
|
|
2773208eb5 | ||
|
|
d1559ac674 | ||
|
|
eafd6eeff0 | ||
|
|
b0a77ac025 | ||
|
|
9744ae04d6 | ||
|
|
d0e177bb41 | ||
|
|
7478e5c1d6 | ||
|
|
0bce7f0ea9 | ||
|
|
8bed62debc | ||
|
|
1b9ddf9ebc | ||
|
|
1770e8ee7e | ||
|
|
fe0c4361f3 | ||
|
|
6a3553404b | ||
|
|
5b494738fd | ||
|
|
79db1d3275 | ||
|
|
d91c53669f | ||
|
|
cbb67b30b6 | ||
|
|
39f00e0e68 | ||
|
|
a0e9494ff1 | ||
|
|
8658c7dfca | ||
|
|
427fe4e87d | ||
|
|
e38e7bb027 | ||
|
|
6993fc906f | ||
|
|
6685341d9c | ||
|
|
05733dad96 | ||
|
|
dbdfe16e9f | ||
|
|
bf40a4b23b | ||
|
|
42d52c519d | ||
|
|
1c3c7c730a | ||
|
|
ccb6fb3187 | ||
|
|
ef3db3eec0 | ||
|
|
59e003df21 | ||
|
|
5847735557 | ||
|
|
e2cc6918cb | ||
|
|
61a5b4b331 | ||
|
|
9bd00803d8 | ||
|
|
59a2dff228 | ||
|
|
c0f4c94d30 | ||
|
|
d414de4012 | ||
|
|
8dc9240681 | ||
|
|
8a27a799cb | ||
|
|
eb994fea12 | ||
|
|
4e1f65b10d | ||
|
|
97aa84f03d | ||
|
|
04511acef2 | ||
|
|
9be47f6d5d | ||
|
|
46f723cc98 | ||
|
|
a242d5551a | ||
|
|
0cdd972722 | ||
|
|
84c1d828da | ||
|
|
5df6b1caf4 | ||
|
|
74342d7581 | ||
|
|
4beba4f7d3 | ||
|
|
73d57e3ee1 | ||
|
|
530774c9e6 | ||
|
|
149d273c35 | ||
|
|
d3fa2b018f | ||
|
|
1e132bb1fa | ||
|
|
730a6c89ea | ||
|
|
78819da98d | ||
|
|
b8898e7f96 | ||
|
|
f32df15d90 | ||
|
|
e147939157 | ||
|
|
26b98d726f | ||
|
|
50d029e50e | ||
|
|
31634ab57e | ||
|
|
2bff37c3b4 | ||
|
|
482555ac6d | ||
|
|
3d3b8d72bf | ||
|
|
367a20e7af | ||
|
|
376bd46de7 | ||
|
|
fe30fa95aa | ||
|
|
1b40ad9797 | ||
|
|
5bb3a21b80 | ||
|
|
c55b980d96 | ||
|
|
c93b4a09cb | ||
|
|
0bc8a0f3ba | ||
|
|
6368d965ec | ||
|
|
591a894b7e | ||
|
|
c5e5715a0c | ||
|
|
80828f7674 | ||
|
|
1acdf9e716 | ||
|
|
0fd7dd9d68 | ||
|
|
e670ede7b4 | ||
|
|
d0eb16c242 | ||
|
|
50c43aed6d | ||
|
|
d2ad7bdc29 | ||
|
|
8e7e9d85ac | ||
|
|
53f5fbdadd | ||
|
|
fbccabceaf | ||
|
|
d33305b77c | ||
|
|
dba232041d | ||
|
|
2b17403129 | ||
|
|
5cfc3a7a3a | ||
|
|
60f250d69a | ||
|
|
bb60f7f57b | ||
|
|
1219d52b02 | ||
|
|
5c769aa82d | ||
|
|
7c615f2607 | ||
|
|
64d3a69f28 | ||
|
|
26494eee86 | ||
|
|
336b6f3348 | ||
|
|
380184af50 | ||
|
|
16aa9c954b | ||
|
|
01842c7f92 | ||
|
|
1c38638ee8 | ||
|
|
dd534fbea1 | ||
|
|
b7cb1f7d05 | ||
|
|
c9d45f4a96 | ||
|
|
dfc61453c4 | ||
|
|
4dd48d18c7 | ||
|
|
ee51cb8e3c | ||
|
|
4aaaca52c6 | ||
|
|
ee67476581 | ||
|
|
1f82d386e0 | ||
|
|
d7d6009070 | ||
|
|
263f9c8bbe | ||
|
|
92b641c52d | ||
|
|
26da5a17a6 | ||
|
|
e6a3e1a7bf | ||
|
|
339c13447a | ||
|
|
3e674381ca | ||
|
|
5479bc16af | ||
|
|
96fdacc46d | ||
|
|
a1a5aa9bd2 | ||
|
|
e7a4eec911 | ||
|
|
0191d54369 | ||
|
|
3e69070e8c | ||
|
|
240ea42a51 | ||
|
|
15e019fd03 | ||
|
|
ca9bf74434 | ||
|
|
c3362a8584 | ||
|
|
6764873d66 | ||
|
|
a692b8c512 | ||
|
|
0d23cc0951 | ||
|
|
b7f5648e63 | ||
|
|
ec292df849 | ||
|
|
63e39bcc51 | ||
|
|
878f9caf87 | ||
|
|
1156688517 | ||
|
|
8d2e018b9c | ||
|
|
b66d6c5b46 | ||
|
|
8dbfd37fe0 | ||
|
|
04e16e003d | ||
|
|
91b9b8804e | ||
|
|
0a415b97df | ||
|
|
9e36a9ebe2 | ||
|
|
c70d089ca7 | ||
|
|
53acec7372 | ||
|
|
5ca18b1d32 | ||
|
|
3a454b75e0 | ||
|
|
79ab6a16af | ||
|
|
62dd2e29cd | ||
|
|
00a63e59ae | ||
|
|
4b6540880c | ||
|
|
a735d85c25 | ||
|
|
b93bb93895 | ||
|
|
77d4126aa9 | ||
|
|
647b9dece2 | ||
|
|
a931433475 | ||
|
|
726e62527a | ||
|
|
24bb353a74 | ||
|
|
fba3b030ac | ||
|
|
a868425dd3 | ||
|
|
3033cb4d8c | ||
|
|
c4ea019eee | ||
|
|
6a19934ace | ||
|
|
2fd7586902 | ||
|
|
77b0602833 | ||
|
|
715b8fc6aa | ||
|
|
f1d3631d22 | ||
|
|
3e05e88a6b | ||
|
|
238f5674ab | ||
|
|
0ddefff9c1 | ||
|
|
91aaf3d6b0 | ||
|
|
48b25da3ea | ||
|
|
4059042a9c | ||
|
|
e6b29b7cb1 | ||
|
|
d934867381 | ||
|
|
f130baff43 | ||
|
|
6f8baba8c5 | ||
|
|
3badc5c90c | ||
|
|
c6b04b9abf | ||
|
|
3ec8ff3d1f | ||
|
|
a721fe27a6 | ||
|
|
1d848e0fc4 | ||
|
|
9e8c1e982f | ||
|
|
11276ea5e1 | ||
|
|
f0840641ba | ||
|
|
f53de9a269 | ||
|
|
9b5bdc3d02 | ||
|
|
e9e5234925 | ||
|
|
81c8aad66f | ||
|
|
7cc43c706b | ||
|
|
19b0d60b21 | ||
|
|
b1b38e05eb | ||
|
|
687414a7a2 | ||
|
|
35a6c4d783 | ||
|
|
c863c78623 | ||
|
|
affcbf7287 | ||
|
|
aab45b764d | ||
|
|
3288e0e002 | ||
|
|
cca9cc08f0 | ||
|
|
508dddc7cd | ||
|
|
fd75f66624 | ||
|
|
7635cde5cd | ||
|
|
5b48075bc2 | ||
|
|
fb0096b113 | ||
|
|
d9ce467c98 | ||
|
|
ccd10248f7 | ||
|
|
2473117892 | ||
|
|
e729bdcd04 | ||
|
|
58de28909f | ||
|
|
eda6bca538 | ||
|
|
aa90c0b2d4 | ||
|
|
5a08e57de8 | ||
|
|
75067a0695 | ||
|
|
00d63692c8 |
76
.github/dependabot.yml
vendored
76
.github/dependabot.yml
vendored
@@ -13,40 +13,6 @@ updates:
|
|||||||
- juliushaertl
|
- juliushaertl
|
||||||
- luka-nextcloud
|
- luka-nextcloud
|
||||||
|
|
||||||
- package-ecosystem: npm
|
|
||||||
target-branch: stable32
|
|
||||||
versioning-strategy: lockfile-only
|
|
||||||
directory: "/"
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
day: saturday
|
|
||||||
time: "03:15"
|
|
||||||
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: stable31
|
|
||||||
versioning-strategy: lockfile-only
|
|
||||||
directory: "/"
|
|
||||||
schedule:
|
|
||||||
interval: weekly
|
|
||||||
day: saturday
|
|
||||||
time: "03:15"
|
|
||||||
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
|
- package-ecosystem: npm
|
||||||
target-branch: stable30
|
target-branch: stable30
|
||||||
versioning-strategy: lockfile-only
|
versioning-strategy: lockfile-only
|
||||||
@@ -54,7 +20,41 @@ updates:
|
|||||||
schedule:
|
schedule:
|
||||||
interval: weekly
|
interval: weekly
|
||||||
day: saturday
|
day: saturday
|
||||||
time: "03:30"
|
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: stable29
|
||||||
|
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: stable28
|
||||||
|
versioning-strategy: lockfile-only
|
||||||
|
directory: "/"
|
||||||
|
schedule:
|
||||||
|
interval: weekly
|
||||||
|
day: saturday
|
||||||
|
time: "03:00"
|
||||||
timezone: Europe/Paris
|
timezone: Europe/Paris
|
||||||
ignore:
|
ignore:
|
||||||
- dependency-name: "*"
|
- dependency-name: "*"
|
||||||
@@ -69,7 +69,7 @@ updates:
|
|||||||
schedule:
|
schedule:
|
||||||
interval: weekly
|
interval: weekly
|
||||||
day: saturday
|
day: saturday
|
||||||
time: "03:45"
|
time: "03:00"
|
||||||
timezone: Europe/Paris
|
timezone: Europe/Paris
|
||||||
open-pull-requests-limit: 10
|
open-pull-requests-limit: 10
|
||||||
reviewers:
|
reviewers:
|
||||||
@@ -81,7 +81,7 @@ updates:
|
|||||||
schedule:
|
schedule:
|
||||||
interval: weekly
|
interval: weekly
|
||||||
day: saturday
|
day: saturday
|
||||||
time: "04:00"
|
time: "03:00"
|
||||||
timezone: Europe/Paris
|
timezone: Europe/Paris
|
||||||
open-pull-requests-limit: 10
|
open-pull-requests-limit: 10
|
||||||
reviewers:
|
reviewers:
|
||||||
@@ -93,7 +93,7 @@ updates:
|
|||||||
schedule:
|
schedule:
|
||||||
interval: weekly
|
interval: weekly
|
||||||
day: saturday
|
day: saturday
|
||||||
time: "04:15"
|
time: "03:00"
|
||||||
timezone: Europe/Paris
|
timezone: Europe/Paris
|
||||||
open-pull-requests-limit: 10
|
open-pull-requests-limit: 10
|
||||||
reviewers:
|
reviewers:
|
||||||
|
|||||||
4
.github/workflows/appbuild.yml
vendored
4
.github/workflows/appbuild.yml
vendored
@@ -18,13 +18,13 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.2.2
|
- uses: actions/checkout@v4.2.2
|
||||||
- name: Use Node.js ${{ matrix.node-version }}
|
- name: Use Node.js ${{ matrix.node-version }}
|
||||||
uses: actions/setup-node@v4.4.0
|
uses: actions/setup-node@v4.1.0
|
||||||
with:
|
with:
|
||||||
node-version: ${{ matrix.node-version }}
|
node-version: ${{ matrix.node-version }}
|
||||||
- name: Set up npm7
|
- name: Set up npm7
|
||||||
run: npm i -g npm@7
|
run: npm i -g npm@7
|
||||||
- name: Setup PHP
|
- name: Setup PHP
|
||||||
uses: shivammathur/setup-php@2.34.1
|
uses: shivammathur/setup-php@2.31.1
|
||||||
with:
|
with:
|
||||||
php-version: '7.4'
|
php-version: '7.4'
|
||||||
tools: composer
|
tools: composer
|
||||||
|
|||||||
6
.github/workflows/appstore-build-publish.yml
vendored
6
.github/workflows/appstore-build-publish.yml
vendored
@@ -71,7 +71,7 @@ jobs:
|
|||||||
- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
|
- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
|
||||||
# Skip if no package.json
|
# Skip if no package.json
|
||||||
if: ${{ steps.versions.outputs.nodeVersion }}
|
if: ${{ steps.versions.outputs.nodeVersion }}
|
||||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.1.0
|
uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0
|
||||||
with:
|
with:
|
||||||
node-version: ${{ steps.versions.outputs.nodeVersion }}
|
node-version: ${{ steps.versions.outputs.nodeVersion }}
|
||||||
|
|
||||||
@@ -87,7 +87,7 @@ jobs:
|
|||||||
filename: ${{ env.APP_NAME }}/appinfo/info.xml
|
filename: ${{ env.APP_NAME }}/appinfo/info.xml
|
||||||
|
|
||||||
- name: Set up php ${{ steps.php-versions.outputs.php-min }}
|
- name: Set up php ${{ steps.php-versions.outputs.php-min }}
|
||||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e # v2.34.1
|
uses: shivammathur/setup-php@c541c155eee45413f5b09a52248675b1a2575231 # v2.31.1
|
||||||
with:
|
with:
|
||||||
php-version: ${{ steps.php-versions.outputs.php-min }}
|
php-version: ${{ steps.php-versions.outputs.php-min }}
|
||||||
coverage: none
|
coverage: none
|
||||||
@@ -173,7 +173,7 @@ jobs:
|
|||||||
tar -zcvf ${{ env.APP_NAME }}.tar.gz ${{ env.APP_NAME }}
|
tar -zcvf ${{ env.APP_NAME }}.tar.gz ${{ env.APP_NAME }}
|
||||||
|
|
||||||
- name: Attach tarball to github release
|
- name: Attach tarball to github release
|
||||||
uses: svenstaro/upload-release-action@81c65b7cd4de9b2570615ce3aad67a41de5b1a13 # v2
|
uses: svenstaro/upload-release-action@04733e069f2d7f7f0b4aebc4fbdbce8613b03ccd # v2
|
||||||
id: attach_to_release
|
id: attach_to_release
|
||||||
with:
|
with:
|
||||||
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|||||||
6
.github/workflows/cypress-e2e.yml
vendored
6
.github/workflows/cypress-e2e.yml
vendored
@@ -22,7 +22,7 @@ jobs:
|
|||||||
node-version: [20.x]
|
node-version: [20.x]
|
||||||
# containers: [1, 2, 3]
|
# containers: [1, 2, 3]
|
||||||
php-versions: [ '8.2' ]
|
php-versions: [ '8.2' ]
|
||||||
server-versions: [ 'master' ]
|
server-versions: [ 'stable31' ]
|
||||||
|
|
||||||
env:
|
env:
|
||||||
extensions: mbstring, iconv, fileinfo, intl, sqlite, pdo_sqlite, zip, gd, apcu
|
extensions: mbstring, iconv, fileinfo, intl, sqlite, pdo_sqlite, zip, gd, apcu
|
||||||
@@ -41,7 +41,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Use Node.js ${{ matrix.node-version }}
|
- name: Use Node.js ${{ matrix.node-version }}
|
||||||
uses: actions/setup-node@v4.4.0
|
uses: actions/setup-node@v4.1.0
|
||||||
with:
|
with:
|
||||||
node-version: ${{ matrix.node-version }}
|
node-version: ${{ matrix.node-version }}
|
||||||
|
|
||||||
@@ -91,7 +91,7 @@ jobs:
|
|||||||
restore-keys: ${{ steps.extcache.outputs.key }}
|
restore-keys: ${{ steps.extcache.outputs.key }}
|
||||||
|
|
||||||
- name: Set up php ${{ matrix.php-versions }}
|
- name: Set up php ${{ matrix.php-versions }}
|
||||||
uses: shivammathur/setup-php@2.34.1
|
uses: shivammathur/setup-php@2.31.1
|
||||||
with:
|
with:
|
||||||
php-version: ${{ matrix.php-versions }}
|
php-version: ${{ matrix.php-versions }}
|
||||||
extensions: ${{ env.extensions }}
|
extensions: ${{ env.extensions }}
|
||||||
|
|||||||
2
.github/workflows/integration.yml
vendored
2
.github/workflows/integration.yml
vendored
@@ -78,7 +78,7 @@ jobs:
|
|||||||
path: apps/activity
|
path: apps/activity
|
||||||
|
|
||||||
- name: Set up php ${{ matrix.php-versions }}
|
- name: Set up php ${{ matrix.php-versions }}
|
||||||
uses: shivammathur/setup-php@2.34.1
|
uses: shivammathur/setup-php@2.31.1
|
||||||
with:
|
with:
|
||||||
php-version: ${{ matrix.php-versions }}
|
php-version: ${{ matrix.php-versions }}
|
||||||
extensions: mbstring, iconv, fileinfo, intl, sqlite, pdo_sqlite, mysql, pdo_mysql, pgsql, pdo_pgsql, apcu, gd
|
extensions: mbstring, iconv, fileinfo, intl, sqlite, pdo_sqlite, mysql, pdo_mysql, pgsql, pdo_pgsql, apcu, gd
|
||||||
|
|||||||
2
.github/workflows/lint-eslint.yml
vendored
2
.github/workflows/lint-eslint.yml
vendored
@@ -68,7 +68,7 @@ jobs:
|
|||||||
fallbackNpm: '^10'
|
fallbackNpm: '^10'
|
||||||
|
|
||||||
- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
|
- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
|
||||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.1.0
|
uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0
|
||||||
with:
|
with:
|
||||||
node-version: ${{ steps.versions.outputs.nodeVersion }}
|
node-version: ${{ steps.versions.outputs.nodeVersion }}
|
||||||
|
|
||||||
|
|||||||
4
.github/workflows/lint-php-cs.yml
vendored
4
.github/workflows/lint-php-cs.yml
vendored
@@ -33,8 +33,8 @@ jobs:
|
|||||||
id: versions
|
id: versions
|
||||||
uses: icewind1991/nextcloud-version-matrix@58becf3b4bb6dc6cef677b15e2fd8e7d48c0908f # v1.3.1
|
uses: icewind1991/nextcloud-version-matrix@58becf3b4bb6dc6cef677b15e2fd8e7d48c0908f # v1.3.1
|
||||||
|
|
||||||
- name: Set up php${{ steps.versions.outputs.php-min }}
|
- name: Set up php${{ steps.versions.outputs.php-available }}
|
||||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e # v2.34.1
|
uses: shivammathur/setup-php@c541c155eee45413f5b09a52248675b1a2575231 # v2.31.1
|
||||||
with:
|
with:
|
||||||
php-version: ${{ steps.versions.outputs.php-min }}
|
php-version: ${{ steps.versions.outputs.php-min }}
|
||||||
extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite
|
extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite
|
||||||
|
|||||||
2
.github/workflows/lint-php.yml
vendored
2
.github/workflows/lint-php.yml
vendored
@@ -48,7 +48,7 @@ jobs:
|
|||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
|
|
||||||
- name: Set up php ${{ matrix.php-versions }}
|
- name: Set up php ${{ matrix.php-versions }}
|
||||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e # v2.34.1
|
uses: shivammathur/setup-php@c541c155eee45413f5b09a52248675b1a2575231 # v2.31.1
|
||||||
with:
|
with:
|
||||||
php-version: ${{ matrix.php-versions }}
|
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
|
extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite
|
||||||
|
|||||||
2
.github/workflows/lint-stylelint.yml
vendored
2
.github/workflows/lint-stylelint.yml
vendored
@@ -37,7 +37,7 @@ jobs:
|
|||||||
fallbackNpm: '^10'
|
fallbackNpm: '^10'
|
||||||
|
|
||||||
- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
|
- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
|
||||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.1.0
|
uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0
|
||||||
with:
|
with:
|
||||||
node-version: ${{ steps.versions.outputs.nodeVersion }}
|
node-version: ${{ steps.versions.outputs.nodeVersion }}
|
||||||
|
|
||||||
|
|||||||
2
.github/workflows/nodejs.yml
vendored
2
.github/workflows/nodejs.yml
vendored
@@ -14,7 +14,7 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.2.2
|
- uses: actions/checkout@v4.2.2
|
||||||
- name: Use Node.js ${{ matrix.node-version }}
|
- name: Use Node.js ${{ matrix.node-version }}
|
||||||
uses: actions/setup-node@v4.4.0
|
uses: actions/setup-node@v4.1.0
|
||||||
with:
|
with:
|
||||||
node-version: ${{ matrix.node-version }}
|
node-version: ${{ matrix.node-version }}
|
||||||
- name: Set up npm7
|
- name: Set up npm7
|
||||||
|
|||||||
18
.github/workflows/npm-audit-fix.yml
vendored
18
.github/workflows/npm-audit-fix.yml
vendored
@@ -14,9 +14,6 @@ on:
|
|||||||
# At 2:30 on Sundays
|
# At 2:30 on Sundays
|
||||||
- cron: '30 2 * * 0'
|
- cron: '30 2 * * 0'
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -24,18 +21,15 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
branches: ['main', 'master', 'stable32', 'stable31', 'stable30']
|
branches: ['main', 'master', 'stable30', 'stable29', 'stable28']
|
||||||
|
|
||||||
name: npm-audit-fix-${{ matrix.branches }}
|
name: npm-audit-fix-${{ matrix.branches }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
id: checkout
|
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
|
||||||
ref: ${{ matrix.branches }}
|
ref: ${{ matrix.branches }}
|
||||||
continue-on-error: true
|
|
||||||
|
|
||||||
- name: Read package.json node and npm engines version
|
- name: Read package.json node and npm engines version
|
||||||
uses: skjnldsv/read-package-engines-version-actions@06d6baf7d8f41934ab630e97d9e6c0bc9c9ac5e4 # v3
|
uses: skjnldsv/read-package-engines-version-actions@06d6baf7d8f41934ab630e97d9e6c0bc9c9ac5e4 # v3
|
||||||
@@ -45,7 +39,7 @@ jobs:
|
|||||||
fallbackNpm: '^10'
|
fallbackNpm: '^10'
|
||||||
|
|
||||||
- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
|
- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
|
||||||
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.1.0
|
uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0
|
||||||
with:
|
with:
|
||||||
node-version: ${{ steps.versions.outputs.nodeVersion }}
|
node-version: ${{ steps.versions.outputs.nodeVersion }}
|
||||||
|
|
||||||
@@ -54,10 +48,10 @@ jobs:
|
|||||||
|
|
||||||
- name: Fix npm audit
|
- name: Fix npm audit
|
||||||
id: npm-audit
|
id: npm-audit
|
||||||
uses: nextcloud-libraries/npm-audit-action@1b1728b2b4a7a78d69de65608efcf4db0e3e42d0 # v0.2.0
|
uses: nextcloud-libraries/npm-audit-action@2a60bd2e79cc77f2cc4d9a3fe40f1a69896f3a87 # v0.1.0
|
||||||
|
|
||||||
- name: Run npm ci and npm run build
|
- name: Run npm ci and npm run build
|
||||||
if: steps.checkout.outcome == 'success'
|
if: always()
|
||||||
env:
|
env:
|
||||||
CYPRESS_INSTALL_BINARY: 0
|
CYPRESS_INSTALL_BINARY: 0
|
||||||
run: |
|
run: |
|
||||||
@@ -65,8 +59,8 @@ jobs:
|
|||||||
npm run build --if-present
|
npm run build --if-present
|
||||||
|
|
||||||
- name: Create Pull Request
|
- name: Create Pull Request
|
||||||
if: steps.checkout.outcome == 'success'
|
if: always()
|
||||||
uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8
|
uses: peter-evans/create-pull-request@5e914681df9dc83aa4e4905692ca88beb2f9e91f # v7.0.5
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.COMMAND_BOT_PAT }}
|
token: ${{ secrets.COMMAND_BOT_PAT }}
|
||||||
commit-message: 'fix(deps): Fix npm audit'
|
commit-message: 'fix(deps): Fix npm audit'
|
||||||
|
|||||||
2
.github/workflows/phpunit-mysql.yml
vendored
2
.github/workflows/phpunit-mysql.yml
vendored
@@ -103,7 +103,7 @@ jobs:
|
|||||||
path: apps/${{ env.APP_NAME }}
|
path: apps/${{ env.APP_NAME }}
|
||||||
|
|
||||||
- name: Set up php ${{ matrix.php-versions }}
|
- name: Set up php ${{ matrix.php-versions }}
|
||||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e # v2.34.1
|
uses: shivammathur/setup-php@c541c155eee45413f5b09a52248675b1a2575231 # v2.31.1
|
||||||
with:
|
with:
|
||||||
php-version: ${{ matrix.php-versions }}
|
php-version: ${{ matrix.php-versions }}
|
||||||
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
|
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
|
||||||
|
|||||||
2
.github/workflows/phpunit-pgsql.yml
vendored
2
.github/workflows/phpunit-pgsql.yml
vendored
@@ -106,7 +106,7 @@ jobs:
|
|||||||
path: apps/${{ env.APP_NAME }}
|
path: apps/${{ env.APP_NAME }}
|
||||||
|
|
||||||
- name: Set up php ${{ matrix.php-versions }}
|
- name: Set up php ${{ matrix.php-versions }}
|
||||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e # v2.34.1
|
uses: shivammathur/setup-php@c541c155eee45413f5b09a52248675b1a2575231 # v2.31.1
|
||||||
with:
|
with:
|
||||||
php-version: ${{ matrix.php-versions }}
|
php-version: ${{ matrix.php-versions }}
|
||||||
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
|
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
|
||||||
|
|||||||
2
.github/workflows/phpunit-sqlite.yml
vendored
2
.github/workflows/phpunit-sqlite.yml
vendored
@@ -95,7 +95,7 @@ jobs:
|
|||||||
path: apps/${{ env.APP_NAME }}
|
path: apps/${{ env.APP_NAME }}
|
||||||
|
|
||||||
- name: Set up php ${{ matrix.php-versions }}
|
- name: Set up php ${{ matrix.php-versions }}
|
||||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e # v2.34.1
|
uses: shivammathur/setup-php@c541c155eee45413f5b09a52248675b1a2575231 # v2.31.1
|
||||||
with:
|
with:
|
||||||
php-version: ${{ matrix.php-versions }}
|
php-version: ${{ matrix.php-versions }}
|
||||||
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
|
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
|
||||||
|
|||||||
5
.github/workflows/pr-feedback.yml
vendored
5
.github/workflows/pr-feedback.yml
vendored
@@ -15,13 +15,8 @@ on:
|
|||||||
schedule:
|
schedule:
|
||||||
- cron: '30 1 * * *'
|
- cron: '30 1 * * *'
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
pull-requests: write
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
pr-feedback:
|
pr-feedback:
|
||||||
if: ${{ github.repository_owner == 'nextcloud' }}
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: The get-github-handles-from-website action
|
- name: The get-github-handles-from-website action
|
||||||
|
|||||||
4
.github/workflows/psalm.yml
vendored
4
.github/workflows/psalm.yml
vendored
@@ -35,8 +35,8 @@ jobs:
|
|||||||
- name: Check enforcement of minimum PHP version ${{ steps.versions.outputs.php-min }} in psalm.xml
|
- name: Check enforcement of minimum PHP version ${{ steps.versions.outputs.php-min }} in psalm.xml
|
||||||
run: grep 'phpVersion="${{ steps.versions.outputs.php-min }}' psalm.xml
|
run: grep 'phpVersion="${{ steps.versions.outputs.php-min }}' psalm.xml
|
||||||
|
|
||||||
- name: Set up php${{ steps.versions.outputs.php-min }}
|
- name: Set up php${{ steps.versions.outputs.php-available }}
|
||||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e # v2.34.1
|
uses: shivammathur/setup-php@c541c155eee45413f5b09a52248675b1a2575231 # v2.31.1
|
||||||
with:
|
with:
|
||||||
php-version: ${{ steps.versions.outputs.php-min }}
|
php-version: ${{ steps.versions.outputs.php-min }}
|
||||||
extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite
|
extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite
|
||||||
|
|||||||
2
.github/workflows/reuse.yml
vendored
2
.github/workflows/reuse.yml
vendored
@@ -16,7 +16,7 @@ permissions:
|
|||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
reuse-compliance-check:
|
reuse-compliance-check:
|
||||||
runs-on: ubuntu-latest-low
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||||
|
|||||||
6
.github/workflows/update-nextcloud-ocp.yml
vendored
6
.github/workflows/update-nextcloud-ocp.yml
vendored
@@ -23,7 +23,7 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
branches: ['main', 'master', 'stable32', 'stable31', 'stable30']
|
branches: ['main', 'master', 'stable30', 'stable29', 'stable28']
|
||||||
|
|
||||||
name: update-nextcloud-ocp-${{ matrix.branches }}
|
name: update-nextcloud-ocp-${{ matrix.branches }}
|
||||||
|
|
||||||
@@ -38,7 +38,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Set up php8.2
|
- name: Set up php8.2
|
||||||
if: steps.checkout.outcome == 'success'
|
if: steps.checkout.outcome == 'success'
|
||||||
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e # v2.34.1
|
uses: shivammathur/setup-php@c541c155eee45413f5b09a52248675b1a2575231 # v2.31.1
|
||||||
with:
|
with:
|
||||||
php-version: 8.2
|
php-version: 8.2
|
||||||
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
|
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
|
||||||
@@ -107,7 +107,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Create Pull Request
|
- name: Create Pull Request
|
||||||
if: steps.checkout.outcome == 'success'
|
if: steps.checkout.outcome == 'success'
|
||||||
uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8
|
uses: peter-evans/create-pull-request@5e914681df9dc83aa4e4905692ca88beb2f9e91f # v7.0.5
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.COMMAND_BOT_PAT }}
|
token: ${{ secrets.COMMAND_BOT_PAT }}
|
||||||
commit-message: 'chore(dev-deps): Bump nextcloud/ocp package'
|
commit-message: 'chore(dev-deps): Bump nextcloud/ocp package'
|
||||||
|
|||||||
@@ -6,7 +6,6 @@
|
|||||||
|
|
||||||
- Adrian Missy <adrian.missy@onewavestudios.com>
|
- Adrian Missy <adrian.missy@onewavestudios.com>
|
||||||
- Alexandru Puiu <alexpuiu20@yahoo.com>
|
- Alexandru Puiu <alexpuiu20@yahoo.com>
|
||||||
- Arne Bartelt <arne.bartelt@gmail.com>
|
|
||||||
- Chandi Langecker <git@chandi.it>
|
- Chandi Langecker <git@chandi.it>
|
||||||
- Christoph Wurst <christoph@winzerhof-wurst.at>
|
- Christoph Wurst <christoph@winzerhof-wurst.at>
|
||||||
- Gary Kim <gary@garykim.dev>
|
- Gary Kim <gary@garykim.dev>
|
||||||
|
|||||||
62
CHANGELOG.md
62
CHANGELOG.md
@@ -5,16 +5,64 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
## 1.16.0-beta.1
|
# 1.15.3
|
||||||
|
### Fixed
|
||||||
|
* [stable31] fix: Use getId() method for card ID retrieval by @backportbot[bot] in https://github.com/nextcloud/deck/pull/7144
|
||||||
|
* [stable31]fix: ensure correct type when filtering events by @backportbot[bot] in https://github.com/nextcloud/deck/pull/7148
|
||||||
|
* [stable31] fix: do not change focus when card id stays the same by @backportbot[bot] in https://github.com/nextcloud/deck/pull/7173
|
||||||
|
* [stable31] fix(darkmode): Fix activity icon colors by @backportbot[bot] in https://github.com/nextcloud/deck/pull/7240
|
||||||
|
* [stable31] fix: make comments with mention editable @backportbot[bot] in https://github.com/nextcloud/deck/pull/7198
|
||||||
|
* [stable31] fix: redirect to cleaner URL if RewriteBase is enabled by @backportbot[bot] in https://github.com/nextcloud/deck/pull/7267
|
||||||
|
* [stable31] fix: missing push notifications by @backportbot[bot] in https://github.com/nextcloud/deck/pull/7269
|
||||||
|
* [stable31] fix: use text cursor for card title on dashboard by @backportbot[bot] in https://github.com/nextcloud/deck/pull/7274
|
||||||
|
* [stable31] fix: parse arguments to CardService.reorder correctly to int by @backportbot[bot] in https://github.com/nextcloud/deck/pull/7275
|
||||||
|
|
||||||
|
### Improvements
|
||||||
|
* [stable31] Clean attachment sharing records after permanent deleted by @backportbot[bot] in https://github.com/nextcloud/deck/pull/7180
|
||||||
|
* Chore(deps): Bump @nextcloud/vue from 8.22.0 to 8.31.0 by @luka-nextcloud in https://github.com/nextcloud/deck/pull/7272
|
||||||
|
|
||||||
|
# 1.15.2
|
||||||
|
### Fixed
|
||||||
|
* [stable31] fix: update DeleteCron to remove deleted lists by @backportbot[bot] in https://github.com/nextcloud/deck/pull/7029
|
||||||
|
* [stable31] fix: not show Share with a Deck card for unauthorized users by @backportbot[bot] in https://github.com/nextcloud/deck/pull/7061
|
||||||
|
* [stable31] fix: unstable cypress test by @backportbot[bot] in https://github.com/nextcloud/deck/pull/7063
|
||||||
|
* [stable31] fix: add retry and show warning on description saving error by @backportbot[bot] in https://github.com/nextcloud/deck/pull/7091
|
||||||
|
* [stable31] fix: styling for new stack input field by @backportbot[bot] in https://github.com/nextcloud/deck/pull/7113
|
||||||
|
* [stable31] fix:allow foreign label deletion by @backportbot[bot] in https://github.com/nextcloud/deck/pull/7130
|
||||||
|
* [stable31] fix: acl check when delete, update board acl by @backportbot[bot] in https://github.com/nextcloud/deck/pull/7132
|
||||||
|
|
||||||
|
### Improvements
|
||||||
|
* [stable31] perf: don't enrich cards when finding calendar entries by @backportbot[bot] in https://github.com/nextcloud/deck/pull/6959
|
||||||
|
|
||||||
|
## 1.15.1
|
||||||
|
### Fixed
|
||||||
|
* [stable31] fix: Properly show attachment extension by @backportbot in https://github.com/nextcloud/deck/pull/6701
|
||||||
|
* [stable31] Clear selected stack when selected board changed by @backportbot in https://github.com/nextcloud/deck/pull/6915
|
||||||
|
* [stable31] fix: Use strings as rich object ids by @backportbot in https://github.com/nextcloud/deck/pull/6951
|
||||||
|
* [stable31] fix: Limit label actions to labels of the cards board by @backportbot in https://github.com/nextcloud/deck/pull/6954
|
||||||
|
* [stable31] fix: only delete assignments on unshared board by @grnd-alt in https://github.com/nextcloud/deck/pull/6934
|
||||||
|
|
||||||
|
### Improvements
|
||||||
|
* [stable31] perf: Skip doing a query just to check if a board is deleted by @backportbot in https://github.com/nextcloud/deck/pull/6894
|
||||||
|
|
||||||
|
## 1.15.0
|
||||||
|
### Fixed
|
||||||
|
- Fix: Adapt URLs generated in the backend to new routes #6743
|
||||||
|
- Fix npm audit #6719
|
||||||
|
- Fix: skip exporting a deleted card #6723
|
||||||
|
|
||||||
|
## 1.15.0-beta.2
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
- feat: update default content @luka-nextcloud [#6740](https://github.com/nextcloud/deck/pull/6740)
|
|
||||||
- feat: add board import and export @luka-nextcloud [#6872](https://github.com/nextcloud/deck/pull/6872)
|
|
||||||
- feat: use outline icons @luka-nextcloud [#7114](https://github.com/nextcloud/deck/pull/7114)
|
|
||||||
- Add OCC commands for global calendar feature opt-in and opt-out in Deck @Fledermaus-20 [#7080](https://github.com/nextcloud/deck/pull/7080)
|
|
||||||
|
|
||||||
### Fixed
|
- feat: Implement reference resolving for cards that have a link in the title @juliusknorr [#6286](https://github.com/nextcloud/deck/pull/6286)
|
||||||
- CSV export fixes @gidan80 [#6800](https://github.com/nextcloud/deck/pull/6800)
|
|
||||||
|
### Other
|
||||||
|
|
||||||
|
- Remove old project from README @edent [#6658](https://github.com/nextcloud/deck/pull/6658)
|
||||||
|
- devcontainer(image): Fix package path @niclasheinz [#6653](https://github.com/nextcloud/deck/pull/6653)
|
||||||
|
- remove deprecated nextcloud-vue-collections @grnd-alt [#6664](https://github.com/nextcloud/deck/pull/6664)
|
||||||
|
- fix: set cypress ci server version to stable31 @grnd-alt [#6705](https://github.com/nextcloud/deck/pull/6705)
|
||||||
|
|
||||||
## 1.15.0-beta.1
|
## 1.15.0-beta.1
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ SPDX-FileCopyrightText = "none"
|
|||||||
SPDX-License-Identifier = "CC0-1.0"
|
SPDX-License-Identifier = "CC0-1.0"
|
||||||
|
|
||||||
[[annotations]]
|
[[annotations]]
|
||||||
path = ["l10n/**.js", "l10n/**.json", "js/**.js.map", "js/**.js", "js/**.mjs", "js/**.mjs.map", "js/templates/**.handlebars", "lib/Service/Importer/fixtures/config-deckJson-schema.json", "lib/Service/Importer/fixtures/config-trelloApi-schema.json", "lib/Service/Importer/fixtures/config-trelloJson-schema.json", "lib/Service/fixtures/default-board.json", "screenshots/screenshot1.png", "src/assets/file-placeholder.svg", "img/favicon.ico", "img/favicon.png", "img/favicon.svg", "img/activity.svg", "img/activity-dark.svg", "img/deck.svg", "img/deck-current.svg", "img/deck-dark.svg", "img/details-white.svg", "img/card.svg", "img/sample-image.jpg"]
|
path = ["l10n/**.js", "l10n/**.json", "js/**.js.map", "js/**.js", "js/**.mjs", "js/**.mjs.map", "js/templates/**.handlebars", "lib/Service/Importer/fixtures/config-deckJson-schema.json", "lib/Service/Importer/fixtures/config-trelloApi-schema.json", "lib/Service/Importer/fixtures/config-trelloJson-schema.json", "screenshots/screenshot1.png", "src/assets/file-placeholder.svg", "img/favicon.ico", "img/favicon.png", "img/favicon.svg", "img/activity.svg", "img/activity-dark.svg", "img/deck.svg", "img/deck-current.svg", "img/deck-dark.svg", "img/details-white.svg", "img/card.svg"]
|
||||||
precedence = "aggregate"
|
precedence = "aggregate"
|
||||||
SPDX-FileCopyrightText = "2019 Nextcloud GmbH and Nextcloud contributors"
|
SPDX-FileCopyrightText = "2019 Nextcloud GmbH and Nextcloud contributors"
|
||||||
SPDX-License-Identifier = "AGPL-3.0-or-later"
|
SPDX-License-Identifier = "AGPL-3.0-or-later"
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
- 🚀 Get your project organized
|
- 🚀 Get your project organized
|
||||||
|
|
||||||
</description>
|
</description>
|
||||||
<version>2.0.0-dev.0</version>
|
<version>1.15.3</version>
|
||||||
<licence>agpl</licence>
|
<licence>agpl</licence>
|
||||||
<author>Julius Härtl</author>
|
<author>Julius Härtl</author>
|
||||||
<namespace>Deck</namespace>
|
<namespace>Deck</namespace>
|
||||||
@@ -42,7 +42,7 @@
|
|||||||
<database min-version="9.4">pgsql</database>
|
<database min-version="9.4">pgsql</database>
|
||||||
<database>sqlite</database>
|
<database>sqlite</database>
|
||||||
<database min-version="8.0">mysql</database>
|
<database min-version="8.0">mysql</database>
|
||||||
<nextcloud min-version="33" max-version="33"/>
|
<nextcloud min-version="31" max-version="31"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<background-jobs>
|
<background-jobs>
|
||||||
<job>OCA\Deck\Cron\DeleteCron</job>
|
<job>OCA\Deck\Cron\DeleteCron</job>
|
||||||
@@ -54,15 +54,11 @@
|
|||||||
<live-migration>
|
<live-migration>
|
||||||
<step>OCA\Deck\Migration\DeletedCircleCleanup</step>
|
<step>OCA\Deck\Migration\DeletedCircleCleanup</step>
|
||||||
</live-migration>
|
</live-migration>
|
||||||
<post-migration>
|
|
||||||
<step>OCA\Deck\Migration\LabelMismatchCleanup</step>
|
|
||||||
</post-migration>
|
|
||||||
</repair-steps>
|
</repair-steps>
|
||||||
<commands>
|
<commands>
|
||||||
<command>OCA\Deck\Command\UserExport</command>
|
<command>OCA\Deck\Command\UserExport</command>
|
||||||
<command>OCA\Deck\Command\BoardImport</command>
|
<command>OCA\Deck\Command\BoardImport</command>
|
||||||
<command>OCA\Deck\Command\TransferOwnership</command>
|
<command>OCA\Deck\Command\TransferOwnership</command>
|
||||||
<command>OCA\Deck\Command\CalendarToggle</command>
|
|
||||||
</commands>
|
</commands>
|
||||||
<activity>
|
<activity>
|
||||||
<settings>
|
<settings>
|
||||||
|
|||||||
@@ -29,7 +29,6 @@ return [
|
|||||||
['name' => 'board#clone', 'url' => '/boards/{boardId}/clone', 'verb' => 'POST'],
|
['name' => 'board#clone', 'url' => '/boards/{boardId}/clone', 'verb' => 'POST'],
|
||||||
['name' => 'board#transferOwner', 'url' => '/boards/{boardId}/transferOwner', 'verb' => 'PUT'],
|
['name' => 'board#transferOwner', 'url' => '/boards/{boardId}/transferOwner', 'verb' => 'PUT'],
|
||||||
['name' => 'board#export', 'url' => '/boards/{boardId}/export', 'verb' => 'GET'],
|
['name' => 'board#export', 'url' => '/boards/{boardId}/export', 'verb' => 'GET'],
|
||||||
['name' => 'board#import', 'url' => '/boards/import', 'verb' => 'POST'],
|
|
||||||
|
|
||||||
// stacks
|
// stacks
|
||||||
['name' => 'stack#index', 'url' => '/stacks/{boardId}', 'verb' => 'GET'],
|
['name' => 'stack#index', 'url' => '/stacks/{boardId}', 'verb' => 'GET'],
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
"roave/security-advisories": "dev-master",
|
"roave/security-advisories": "dev-master",
|
||||||
"phpunit/phpunit": "^9",
|
"phpunit/phpunit": "^9",
|
||||||
"nextcloud/coding-standard": "^1.1",
|
"nextcloud/coding-standard": "^1.1",
|
||||||
"nextcloud/ocp": "dev-master",
|
"nextcloud/ocp": "dev-stable31",
|
||||||
"psalm/phar": "^5.13"
|
"psalm/phar": "^5.13"
|
||||||
},
|
},
|
||||||
"config": {
|
"config": {
|
||||||
|
|||||||
161
composer.lock
generated
161
composer.lock
generated
@@ -4,34 +4,146 @@
|
|||||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||||
"This file is @generated automatically"
|
"This file is @generated automatically"
|
||||||
],
|
],
|
||||||
"content-hash": "6950663d9d213151028e780637480220",
|
"content-hash": "c89537a172cee5c19093b4ea0cb5365c",
|
||||||
"packages": [
|
"packages": [
|
||||||
{
|
{
|
||||||
"name": "justinrainbow/json-schema",
|
"name": "icecave/parity",
|
||||||
"version": "6.4.2",
|
"version": "1.0.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/jsonrainbow/json-schema.git",
|
"url": "https://github.com/icecave/parity.git",
|
||||||
"reference": "ce1fd2d47799bb60668643bc6220f6278a4c1d02"
|
"reference": "0109fef58b3230d23b20b2ac52ecdf477218d300"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/ce1fd2d47799bb60668643bc6220f6278a4c1d02",
|
"url": "https://api.github.com/repos/icecave/parity/zipball/0109fef58b3230d23b20b2ac52ecdf477218d300",
|
||||||
"reference": "ce1fd2d47799bb60668643bc6220f6278a4c1d02",
|
"reference": "0109fef58b3230d23b20b2ac52ecdf477218d300",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
"ext-json": "*",
|
"icecave/repr": "~1",
|
||||||
"marc-mabe/php-enum": "^4.0",
|
"php": ">=5.3"
|
||||||
"php": "^7.2 || ^8.0"
|
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"friendsofphp/php-cs-fixer": "3.3.0",
|
"eloquent/liberator": "~1",
|
||||||
|
"icecave/archer": "~1"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"eloquent/asplode": "Drop-in exception-based error handling."
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"psr-0": {
|
||||||
|
"Icecave\\Parity": "src"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "James Harris",
|
||||||
|
"email": "james.harris@icecave.com.au",
|
||||||
|
"homepage": "https://github.com/jmalloc"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "A customizable deep comparison library.",
|
||||||
|
"homepage": "https://github.com/IcecaveStudios/parity",
|
||||||
|
"keywords": [
|
||||||
|
"compare",
|
||||||
|
"comparison",
|
||||||
|
"equal",
|
||||||
|
"equality",
|
||||||
|
"greater",
|
||||||
|
"less",
|
||||||
|
"sort",
|
||||||
|
"sorting"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/icecave/parity/issues",
|
||||||
|
"source": "https://github.com/icecave/parity/tree/1.0.0"
|
||||||
|
},
|
||||||
|
"time": "2014-01-17T05:56:27+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "icecave/repr",
|
||||||
|
"version": "1.0.1",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/icecave/repr.git",
|
||||||
|
"reference": "8a3d2953adf5f464a06e3e2587aeacc97e2bed07"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/icecave/repr/zipball/8a3d2953adf5f464a06e3e2587aeacc97e2bed07",
|
||||||
|
"reference": "8a3d2953adf5f464a06e3e2587aeacc97e2bed07",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.3"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"icecave/archer": "~1"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"eloquent/asplode": "Drop-in exception-based error handling."
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Icecave\\Repr\\": "src"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "James Harris",
|
||||||
|
"email": "james.harris@icecave.com.au",
|
||||||
|
"homepage": "https://github.com/jmalloc"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "A library for generating string representations of any value, inspired by Python's reprlib library.",
|
||||||
|
"homepage": "https://github.com/IcecaveStudios/repr",
|
||||||
|
"keywords": [
|
||||||
|
"human",
|
||||||
|
"readable",
|
||||||
|
"repr",
|
||||||
|
"representation",
|
||||||
|
"string"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/icecave/repr/issues",
|
||||||
|
"source": "https://github.com/icecave/repr/tree/1.0.1"
|
||||||
|
},
|
||||||
|
"time": "2014-07-25T05:44:41+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "justinrainbow/json-schema",
|
||||||
|
"version": "6.0.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/jsonrainbow/json-schema.git",
|
||||||
|
"reference": "a38c6198d53b09c0702f440585a4f4a5d9137bd9"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/a38c6198d53b09c0702f440585a4f4a5d9137bd9",
|
||||||
|
"reference": "a38c6198d53b09c0702f440585a4f4a5d9137bd9",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"icecave/parity": "1.0.0",
|
||||||
|
"marc-mabe/php-enum": "^2.0 || ^3.0 || ^4.0",
|
||||||
|
"php": ">=5.3.3"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"friendsofphp/php-cs-fixer": "~2.2.20 || ~2.19.0",
|
||||||
"json-schema/json-schema-test-suite": "1.2.0",
|
"json-schema/json-schema-test-suite": "1.2.0",
|
||||||
"marc-mabe/php-enum-phpstan": "^2.0",
|
"phpunit/phpunit": "^4.8.35"
|
||||||
"phpspec/prophecy": "^1.19",
|
|
||||||
"phpstan/phpstan": "^1.12",
|
|
||||||
"phpunit/phpunit": "^8.5"
|
|
||||||
},
|
},
|
||||||
"bin": [
|
"bin": [
|
||||||
"bin/validate-json"
|
"bin/validate-json"
|
||||||
@@ -77,9 +189,9 @@
|
|||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/jsonrainbow/json-schema/issues",
|
"issues": "https://github.com/jsonrainbow/json-schema/issues",
|
||||||
"source": "https://github.com/jsonrainbow/json-schema/tree/6.4.2"
|
"source": "https://github.com/jsonrainbow/json-schema/tree/6.0.0"
|
||||||
},
|
},
|
||||||
"time": "2025-06-03T18:27:04+00:00"
|
"time": "2024-07-30T17:49:21+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "marc-mabe/php-enum",
|
"name": "marc-mabe/php-enum",
|
||||||
@@ -376,16 +488,16 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "nextcloud/ocp",
|
"name": "nextcloud/ocp",
|
||||||
"version": "dev-master",
|
"version": "dev-stable31",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/nextcloud-deps/ocp.git",
|
"url": "https://github.com/nextcloud-deps/ocp.git",
|
||||||
"reference": "d927392a2a368c372ef80096171139d4287b2339"
|
"reference": "abd32429d794ede1d92b7b0a88a1070371c907b5"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/nextcloud-deps/ocp/zipball/d927392a2a368c372ef80096171139d4287b2339",
|
"url": "https://api.github.com/repos/nextcloud-deps/ocp/zipball/abd32429d794ede1d92b7b0a88a1070371c907b5",
|
||||||
"reference": "d927392a2a368c372ef80096171139d4287b2339",
|
"reference": "abd32429d794ede1d92b7b0a88a1070371c907b5",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
@@ -395,11 +507,10 @@
|
|||||||
"psr/event-dispatcher": "^1.0",
|
"psr/event-dispatcher": "^1.0",
|
||||||
"psr/log": "^3.0.2"
|
"psr/log": "^3.0.2"
|
||||||
},
|
},
|
||||||
"default-branch": true,
|
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"extra": {
|
"extra": {
|
||||||
"branch-alias": {
|
"branch-alias": {
|
||||||
"dev-master": "33.0.0-dev"
|
"dev-stable31": "31.0.0-dev"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"notification-url": "https://packagist.org/downloads/",
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
@@ -419,9 +530,9 @@
|
|||||||
"description": "Composer package containing Nextcloud's public OCP API and the unstable NCU API",
|
"description": "Composer package containing Nextcloud's public OCP API and the unstable NCU API",
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/nextcloud-deps/ocp/issues",
|
"issues": "https://github.com/nextcloud-deps/ocp/issues",
|
||||||
"source": "https://github.com/nextcloud-deps/ocp/tree/master"
|
"source": "https://github.com/nextcloud-deps/ocp/tree/stable31"
|
||||||
},
|
},
|
||||||
"time": "2025-09-16T00:45:42+00:00"
|
"time": "2025-07-31T00:57:37+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "nikic/php-parser",
|
"name": "nikic/php-parser",
|
||||||
|
|||||||
@@ -14,7 +14,6 @@
|
|||||||
|
|
||||||
input[type=submit].icon-confirm {
|
input[type=submit].icon-confirm {
|
||||||
border-color: var(--color-border-maxcontrast) !important;
|
border-color: var(--color-border-maxcontrast) !important;
|
||||||
border-style: solid;
|
|
||||||
border-left: none;
|
border-left: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -129,81 +129,3 @@ describe('Board cloning', function() {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('Board export', function() {
|
|
||||||
before(function() {
|
|
||||||
cy.createUser(user)
|
|
||||||
})
|
|
||||||
|
|
||||||
it('Exports a board as JSON', function() {
|
|
||||||
const boardName = 'Export JSON board'
|
|
||||||
const board = sampleBoard(boardName)
|
|
||||||
cy.createExampleBoard({ user, board }).then((board) => {
|
|
||||||
const boardId = board.id
|
|
||||||
cy.visit(`/apps/deck/board/${boardId}`)
|
|
||||||
cy.get('.app-navigation__list .app-navigation-entry:contains("' + boardName + '")')
|
|
||||||
.parent()
|
|
||||||
.find('button[aria-label="Actions"]')
|
|
||||||
.click()
|
|
||||||
cy.get('button:contains("Export board")')
|
|
||||||
.click()
|
|
||||||
cy.get('.modal-container .checkbox-radio-switch__text:contains("Export as JSON")')
|
|
||||||
.click()
|
|
||||||
cy.get('.modal-container button:contains("Export")')
|
|
||||||
.click()
|
|
||||||
|
|
||||||
const downloadsFolder = Cypress.config('downloadsFolder')
|
|
||||||
cy.readFile(`${downloadsFolder}/${boardName}.json`)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
it('Exports a board as CSV', function() {
|
|
||||||
const boardName = 'Export CSV board'
|
|
||||||
const board = sampleBoard(boardName)
|
|
||||||
cy.createExampleBoard({ user, board }).then((board) => {
|
|
||||||
const boardId = board.id
|
|
||||||
cy.visit(`/apps/deck/board/${boardId}`)
|
|
||||||
cy.get('.app-navigation__list .app-navigation-entry:contains("' + boardName + '")')
|
|
||||||
.parent()
|
|
||||||
.find('button[aria-label="Actions"]')
|
|
||||||
.click()
|
|
||||||
cy.get('button:contains("Export board")')
|
|
||||||
.click()
|
|
||||||
cy.get('.modal-container .checkbox-radio-switch__text:contains("Export as CSV")')
|
|
||||||
.click()
|
|
||||||
cy.get('.modal-container button:contains("Export")')
|
|
||||||
.click()
|
|
||||||
|
|
||||||
const downloadsFolder = Cypress.config('downloadsFolder')
|
|
||||||
cy.readFile(`${downloadsFolder}/${boardName}.csv`)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
describe('Board import', function() {
|
|
||||||
before(function () {
|
|
||||||
cy.createUser(user)
|
|
||||||
})
|
|
||||||
beforeEach(function() {
|
|
||||||
cy.login(user)
|
|
||||||
cy.visit('/apps/deck')
|
|
||||||
})
|
|
||||||
|
|
||||||
it('Imports a board from JSON', function() {
|
|
||||||
cy.get('#app-navigation-vue .app-navigation__list .app-navigation-entry:contains("Import board")')
|
|
||||||
.should('be.visible')
|
|
||||||
.click()
|
|
||||||
|
|
||||||
// Upload a JSON file
|
|
||||||
cy.get('input[type="file"]')
|
|
||||||
.selectFile([
|
|
||||||
{
|
|
||||||
contents: 'cypress/fixtures/import-board.json',
|
|
||||||
fileName: 'import-board.json',
|
|
||||||
},
|
|
||||||
], { force: true })
|
|
||||||
|
|
||||||
cy.get('.app-navigation__list .app-navigation-entry:contains("Imported board")')
|
|
||||||
.should('be.visible')
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|||||||
@@ -302,9 +302,6 @@ describe('Card', function () {
|
|||||||
.first().click()
|
.first().click()
|
||||||
cy.get(`.card:contains("${newCardTitle}")`).should('be.visible').click()
|
cy.get(`.card:contains("${newCardTitle}")`).should('be.visible').click()
|
||||||
|
|
||||||
// Add delay to ensure the events are bound
|
|
||||||
cy.wait(1000)
|
|
||||||
|
|
||||||
cy.get('#app-sidebar-vue [data-test="tag-selector"] .vs__dropdown-toggle').should('be.visible').click()
|
cy.get('#app-sidebar-vue [data-test="tag-selector"] .vs__dropdown-toggle').should('be.visible').click()
|
||||||
cy.get('.vs__dropdown-menu .tag:contains("Action needed")').should('be.visible').click()
|
cy.get('.vs__dropdown-menu .tag:contains("Action needed")').should('be.visible').click()
|
||||||
cy.get('.vs__dropdown-menu .tag:contains("Later")').should('be.visible').click()
|
cy.get('.vs__dropdown-menu .tag:contains("Later")').should('be.visible').click()
|
||||||
|
|||||||
@@ -22,10 +22,10 @@ describe('Deck dashboard', function() {
|
|||||||
.should($el => expect($el.text().trim()).to.equal('Upcoming cards'))
|
.should($el => expect($el.text().trim()).to.equal('Upcoming cards'))
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Can see the default "Welcome Board" created for user by default', function() {
|
it('Can see the default "Personal Board" created for user by default', function() {
|
||||||
cy.visit('/apps/deck')
|
cy.visit('/apps/deck')
|
||||||
|
|
||||||
const defaultBoard = 'Welcome to Nextcloud Deck!'
|
const defaultBoard = 'Personal'
|
||||||
|
|
||||||
cy.get('.app-navigation-entry-wrapper[icon=icon-deck]')
|
cy.get('.app-navigation-entry-wrapper[icon=icon-deck]')
|
||||||
.find('ul.app-navigation-entry__children .app-navigation-entry:contains(' + defaultBoard + ')')
|
.find('ul.app-navigation-entry__children .app-navigation-entry:contains(' + defaultBoard + ')')
|
||||||
|
|||||||
@@ -1,102 +0,0 @@
|
|||||||
{
|
|
||||||
"boards": [
|
|
||||||
{
|
|
||||||
"id": 70,
|
|
||||||
"title": "Imported board",
|
|
||||||
"owner": "unvjrmwuag",
|
|
||||||
"color": "00ff00",
|
|
||||||
"archived": false,
|
|
||||||
"labels": [
|
|
||||||
{
|
|
||||||
"id": 293,
|
|
||||||
"title": "Finished",
|
|
||||||
"color": "31CC7C",
|
|
||||||
"boardId": 70,
|
|
||||||
"cardId": null,
|
|
||||||
"lastModified": 0,
|
|
||||||
"ETag": "cfcd208495d565ef66e7dff9f98764da"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 294,
|
|
||||||
"title": "To review",
|
|
||||||
"color": "317CCC",
|
|
||||||
"boardId": 70,
|
|
||||||
"cardId": null,
|
|
||||||
"lastModified": 0,
|
|
||||||
"ETag": "cfcd208495d565ef66e7dff9f98764da"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 295,
|
|
||||||
"title": "Action needed",
|
|
||||||
"color": "FF7A66",
|
|
||||||
"boardId": 70,
|
|
||||||
"cardId": null,
|
|
||||||
"lastModified": 0,
|
|
||||||
"ETag": "cfcd208495d565ef66e7dff9f98764da"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 296,
|
|
||||||
"title": "Later",
|
|
||||||
"color": "F1DB50",
|
|
||||||
"boardId": 70,
|
|
||||||
"cardId": null,
|
|
||||||
"lastModified": 0,
|
|
||||||
"ETag": "cfcd208495d565ef66e7dff9f98764da"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"acl": [],
|
|
||||||
"permissions": [],
|
|
||||||
"users": [],
|
|
||||||
"stacks": {
|
|
||||||
"114": {
|
|
||||||
"id": 114,
|
|
||||||
"title": "TestList",
|
|
||||||
"boardId": 70,
|
|
||||||
"deletedAt": 0,
|
|
||||||
"lastModified": 1743495533,
|
|
||||||
"cards": [
|
|
||||||
{
|
|
||||||
"id": 124,
|
|
||||||
"title": "Hello world",
|
|
||||||
"description": "# Hello world",
|
|
||||||
"descriptionPrev": null,
|
|
||||||
"stackId": 114,
|
|
||||||
"type": "plain",
|
|
||||||
"lastModified": 1743495533,
|
|
||||||
"lastEditor": null,
|
|
||||||
"createdAt": 1743495533,
|
|
||||||
"labels": [],
|
|
||||||
"assignedUsers": null,
|
|
||||||
"attachments": null,
|
|
||||||
"attachmentCount": null,
|
|
||||||
"owner": {
|
|
||||||
"primaryKey": "unvjrmwuag",
|
|
||||||
"uid": "unvjrmwuag",
|
|
||||||
"displayname": "unvjrmwuag",
|
|
||||||
"type": 0
|
|
||||||
},
|
|
||||||
"order": 999,
|
|
||||||
"archived": false,
|
|
||||||
"done": null,
|
|
||||||
"duedate": null,
|
|
||||||
"notified": false,
|
|
||||||
"deletedAt": 0,
|
|
||||||
"commentsUnread": 0,
|
|
||||||
"commentsCount": 0,
|
|
||||||
"relatedStack": null,
|
|
||||||
"relatedBoard": null,
|
|
||||||
"ETag": "aa85bb973089e7fbc0bbf122e926c23f"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"order": 0,
|
|
||||||
"ETag": "aa85bb973089e7fbc0bbf122e926c23f"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"activeSessions": [],
|
|
||||||
"deletedAt": 0,
|
|
||||||
"lastModified": 1743495533,
|
|
||||||
"settings": [],
|
|
||||||
"ETag": "aa85bb973089e7fbc0bbf122e926c23f"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -102,11 +102,7 @@ Cypress.Commands.add('shareBoardWithUi', (query, userId=query) => {
|
|||||||
cy.intercept({ method: 'GET', url: `**/ocs/v2.php/apps/files_sharing/api/v1/sharees?search=${query}*` }).as('fetchRecipients')
|
cy.intercept({ method: 'GET', url: `**/ocs/v2.php/apps/files_sharing/api/v1/sharees?search=${query}*` }).as('fetchRecipients')
|
||||||
cy.get('[aria-label="Open details"]').click()
|
cy.get('[aria-label="Open details"]').click()
|
||||||
cy.get('.app-sidebar').should('be.visible')
|
cy.get('.app-sidebar').should('be.visible')
|
||||||
|
cy.get('.select input').type(`${query}`)
|
||||||
// Add delay to ensure the events are bound
|
|
||||||
cy.wait(1000)
|
|
||||||
|
|
||||||
cy.get('.select input').click().type(`${query}`)
|
|
||||||
cy.wait('@fetchRecipients', { timeout: 7000 })
|
cy.wait('@fetchRecipients', { timeout: 7000 })
|
||||||
|
|
||||||
cy.get('.vs__dropdown-menu .option').first().contains(query)
|
cy.get('.vs__dropdown-menu .option').first().contains(query)
|
||||||
|
|||||||
24
docs/API.md
24
docs/API.md
@@ -6,7 +6,7 @@ The REST API provides access for authenticated users to their data inside the De
|
|||||||
|
|
||||||
# Prerequisites
|
# Prerequisites
|
||||||
|
|
||||||
- All requests require a `OCS-APIRequest` HTTP header to be set to `true` and a `Content-Type` of `application/json`. This does not apply to the endpoint for uploading attachments, which consumes `multipart/form-data`.
|
- All requests require a `OCS-APIRequest` HTTP header to be set to `true` and a `Content-Type` of `application/json`.
|
||||||
- The API is located at https://nextcloud.local/index.php/apps/deck/api/v1.0
|
- The API is located at https://nextcloud.local/index.php/apps/deck/api/v1.0
|
||||||
- All request parameters are required, unless otherwise specified
|
- All request parameters are required, unless otherwise specified
|
||||||
|
|
||||||
@@ -733,7 +733,6 @@ The board list endpoint supports setting an `If-Modified-Since` header to limit
|
|||||||
| Parameter | Type | Description |
|
| Parameter | Type | Description |
|
||||||
| --------- | ------- | --------------------------------------- |
|
| --------- | ------- | --------------------------------------- |
|
||||||
| labelId | Integer | The label id to assign to the card |
|
| labelId | Integer | The label id to assign to the card |
|
||||||
|
|
||||||
#### Response
|
#### Response
|
||||||
|
|
||||||
##### 200 Success
|
##### 200 Success
|
||||||
@@ -998,12 +997,10 @@ The request can fail with a bad request response for the following reasons:
|
|||||||
|
|
||||||
#### Request data
|
#### Request data
|
||||||
|
|
||||||
The request is performed as `multipart/form-data`.
|
| Parameter | Type | Description |
|
||||||
|
| --------- | ------- | --------------------------------------------- |
|
||||||
| Parameter | Type | Description |
|
| type | String | The type of the attachement |
|
||||||
| --------- | ------- | ----------------------------------------------------------------------------------------------- |
|
| file | Binary | File data to add as an attachment |
|
||||||
| type | String | The type of the attachement. Use `file` or `deck_file`. |
|
|
||||||
| file | Binary | File data to add as an attachment together with the `filename` parameter according to RFC 7578. |
|
|
||||||
|
|
||||||
- Prior to Deck version v1.3.0 (API v1.0), attachments were stored within deck. For this type of attachments `deck_file` was used as the default type of attachments
|
- Prior to Deck version v1.3.0 (API v1.0), attachments were stored within deck. For this type of attachments `deck_file` was used as the default type of attachments
|
||||||
- Starting with Deck version 1.3.0 (API v1.1) files are stored within the users regular Nextcloud files and the type `file` has been introduced for that
|
- Starting with Deck version 1.3.0 (API v1.1) files are stored within the users regular Nextcloud files and the type `file` has been introduced for that
|
||||||
@@ -1025,13 +1022,12 @@ The request is performed as `multipart/form-data`.
|
|||||||
|
|
||||||
#### Request data
|
#### Request data
|
||||||
|
|
||||||
The request is performed as `multipart/form-data`.
|
| Parameter | Type | Description |
|
||||||
|
| --------- | ------- | --------------------------------------------- |
|
||||||
| Parameter | Type | Description |
|
| type | String | The type of the attachement |
|
||||||
| --------- | ------- | ----------------------------------------------------------------------------------------------- |
|
| file | Binary | File data to add as an attachment |
|
||||||
| type | String | The type of the attachement. For now only `deck_file` is supported as an attachment type. |
|
|
||||||
| file | Binary | File data to add as an attachment together with the `filename` parameter according to RFC 7578. |
|
|
||||||
|
|
||||||
|
For now only `deck_file` is supported as an attachment type.
|
||||||
|
|
||||||
#### Response
|
#### Response
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
|
Before Width: | Height: | Size: 188 KiB |
13
l10n/be.js
13
l10n/be.js
@@ -9,9 +9,11 @@ OC.L10N.register(
|
|||||||
"Missing a temporary folder" : "Адсутнічае часовая папка",
|
"Missing a temporary folder" : "Адсутнічае часовая папка",
|
||||||
"Could not write file to disk" : "Не ўдалося запісаць файл на дыск",
|
"Could not write file to disk" : "Не ўдалося запісаць файл на дыск",
|
||||||
"A PHP extension stopped the file upload" : "Пашырэнне PHP спыніла запампоўванне файла",
|
"A PHP extension stopped the file upload" : "Пашырэнне PHP спыніла запампоўванне файла",
|
||||||
|
"No file uploaded or file size exceeds maximum of %s" : "Файл не запампаваны, або памер файла перавышае максімальны %s",
|
||||||
"copy" : "копія",
|
"copy" : "копія",
|
||||||
"Done" : "Гатова",
|
"Done" : "Гатова",
|
||||||
"File" : "Файл",
|
"File" : "Файл",
|
||||||
|
"Invalid date, date format must be YYYY-MM-DD" : "Памылковая дата, дата павінна быць у фармаце ГГГГ-ММ-ДД",
|
||||||
"Cancel" : "Скасаваць",
|
"Cancel" : "Скасаваць",
|
||||||
"Drop your files to upload" : "Перацягніце файлы для запампоўвання",
|
"Drop your files to upload" : "Перацягніце файлы для запампоўвання",
|
||||||
"File already exists" : "Файл ужо існуе",
|
"File already exists" : "Файл ужо існуе",
|
||||||
@@ -37,6 +39,7 @@ OC.L10N.register(
|
|||||||
"Delete" : "Выдаліць",
|
"Delete" : "Выдаліць",
|
||||||
"Edit" : "Рэдагаваць",
|
"Edit" : "Рэдагаваць",
|
||||||
"Members" : "Удзельнікі",
|
"Members" : "Удзельнікі",
|
||||||
|
"File to share" : "Файл для абагульвання",
|
||||||
"Invalid path selected" : "Выбраны памылковы шлях",
|
"Invalid path selected" : "Выбраны памылковы шлях",
|
||||||
"Share from Files" : "Абагуліць з Файлаў",
|
"Share from Files" : "Абагуліць з Файлаў",
|
||||||
"Show in Files" : "Паказаць у Файлах",
|
"Show in Files" : "Паказаць у Файлах",
|
||||||
@@ -49,7 +52,15 @@ OC.L10N.register(
|
|||||||
"Reply" : "Адказаць",
|
"Reply" : "Адказаць",
|
||||||
"Update" : "Абнавіць",
|
"Update" : "Абнавіць",
|
||||||
"Description" : "Апісанне",
|
"Description" : "Апісанне",
|
||||||
|
"Formatting help" : "Даведка па фармаціраванні",
|
||||||
|
"Later today – {timeLocale}" : "Пазней сёння – {timeLocale}",
|
||||||
|
"Set due date for later today" : "Задаць дату выканання на пазней сёння",
|
||||||
"Tomorrow – {timeLocale}" : "Заўтра – {timeLocale}",
|
"Tomorrow – {timeLocale}" : "Заўтра – {timeLocale}",
|
||||||
|
"This weekend – {timeLocale}" : "У гэты ўік-энд – {timeLocale}",
|
||||||
|
"Set due date for this weekend" : "Задаць дату выканання на гэты ўік-энд",
|
||||||
|
"Next week – {timeLocale}" : "На наступным тыдні – {timeLocale}",
|
||||||
|
"Set due date for next week" : "Задаць дату выканання на наступны тыдзень",
|
||||||
|
"Create a new tag:" : "Стварыць новы тэг:",
|
||||||
"(group)" : "(група)",
|
"(group)" : "(група)",
|
||||||
"Open link" : "Адкрыць спасылку",
|
"Open link" : "Адкрыць спасылку",
|
||||||
"Edit title" : "Рэдагаваць загаловак",
|
"Edit title" : "Рэдагаваць загаловак",
|
||||||
@@ -58,6 +69,7 @@ OC.L10N.register(
|
|||||||
"Keyboard shortcut" : "Спалучэнне клавіш",
|
"Keyboard shortcut" : "Спалучэнне клавіш",
|
||||||
"Action" : "Дзеянне",
|
"Action" : "Дзеянне",
|
||||||
"Shift" : "Shift",
|
"Shift" : "Shift",
|
||||||
|
"Ctrl" : "Ctrl",
|
||||||
"Search" : "Пошук",
|
"Search" : "Пошук",
|
||||||
"Enter" : "Enter",
|
"Enter" : "Enter",
|
||||||
"Shared with you" : "Абагулена з вамі",
|
"Shared with you" : "Абагулена з вамі",
|
||||||
@@ -71,6 +83,7 @@ OC.L10N.register(
|
|||||||
"Message from {author} in {conversationName}" : "Паведамленне ад {author} у {conversationName}",
|
"Message from {author} in {conversationName}" : "Паведамленне ад {author} у {conversationName}",
|
||||||
"Failed to upload {name}" : "Не ўдалося запампаваць {name}",
|
"Failed to upload {name}" : "Не ўдалося запампаваць {name}",
|
||||||
"Share" : "Абагуліць",
|
"Share" : "Абагуліць",
|
||||||
|
"Personal" : "Асабістыя",
|
||||||
"Today" : "Сёння",
|
"Today" : "Сёння",
|
||||||
"Tomorrow" : "Заўтра"
|
"Tomorrow" : "Заўтра"
|
||||||
},
|
},
|
||||||
|
|||||||
13
l10n/be.json
13
l10n/be.json
@@ -7,9 +7,11 @@
|
|||||||
"Missing a temporary folder" : "Адсутнічае часовая папка",
|
"Missing a temporary folder" : "Адсутнічае часовая папка",
|
||||||
"Could not write file to disk" : "Не ўдалося запісаць файл на дыск",
|
"Could not write file to disk" : "Не ўдалося запісаць файл на дыск",
|
||||||
"A PHP extension stopped the file upload" : "Пашырэнне PHP спыніла запампоўванне файла",
|
"A PHP extension stopped the file upload" : "Пашырэнне PHP спыніла запампоўванне файла",
|
||||||
|
"No file uploaded or file size exceeds maximum of %s" : "Файл не запампаваны, або памер файла перавышае максімальны %s",
|
||||||
"copy" : "копія",
|
"copy" : "копія",
|
||||||
"Done" : "Гатова",
|
"Done" : "Гатова",
|
||||||
"File" : "Файл",
|
"File" : "Файл",
|
||||||
|
"Invalid date, date format must be YYYY-MM-DD" : "Памылковая дата, дата павінна быць у фармаце ГГГГ-ММ-ДД",
|
||||||
"Cancel" : "Скасаваць",
|
"Cancel" : "Скасаваць",
|
||||||
"Drop your files to upload" : "Перацягніце файлы для запампоўвання",
|
"Drop your files to upload" : "Перацягніце файлы для запампоўвання",
|
||||||
"File already exists" : "Файл ужо існуе",
|
"File already exists" : "Файл ужо існуе",
|
||||||
@@ -35,6 +37,7 @@
|
|||||||
"Delete" : "Выдаліць",
|
"Delete" : "Выдаліць",
|
||||||
"Edit" : "Рэдагаваць",
|
"Edit" : "Рэдагаваць",
|
||||||
"Members" : "Удзельнікі",
|
"Members" : "Удзельнікі",
|
||||||
|
"File to share" : "Файл для абагульвання",
|
||||||
"Invalid path selected" : "Выбраны памылковы шлях",
|
"Invalid path selected" : "Выбраны памылковы шлях",
|
||||||
"Share from Files" : "Абагуліць з Файлаў",
|
"Share from Files" : "Абагуліць з Файлаў",
|
||||||
"Show in Files" : "Паказаць у Файлах",
|
"Show in Files" : "Паказаць у Файлах",
|
||||||
@@ -47,7 +50,15 @@
|
|||||||
"Reply" : "Адказаць",
|
"Reply" : "Адказаць",
|
||||||
"Update" : "Абнавіць",
|
"Update" : "Абнавіць",
|
||||||
"Description" : "Апісанне",
|
"Description" : "Апісанне",
|
||||||
|
"Formatting help" : "Даведка па фармаціраванні",
|
||||||
|
"Later today – {timeLocale}" : "Пазней сёння – {timeLocale}",
|
||||||
|
"Set due date for later today" : "Задаць дату выканання на пазней сёння",
|
||||||
"Tomorrow – {timeLocale}" : "Заўтра – {timeLocale}",
|
"Tomorrow – {timeLocale}" : "Заўтра – {timeLocale}",
|
||||||
|
"This weekend – {timeLocale}" : "У гэты ўік-энд – {timeLocale}",
|
||||||
|
"Set due date for this weekend" : "Задаць дату выканання на гэты ўік-энд",
|
||||||
|
"Next week – {timeLocale}" : "На наступным тыдні – {timeLocale}",
|
||||||
|
"Set due date for next week" : "Задаць дату выканання на наступны тыдзень",
|
||||||
|
"Create a new tag:" : "Стварыць новы тэг:",
|
||||||
"(group)" : "(група)",
|
"(group)" : "(група)",
|
||||||
"Open link" : "Адкрыць спасылку",
|
"Open link" : "Адкрыць спасылку",
|
||||||
"Edit title" : "Рэдагаваць загаловак",
|
"Edit title" : "Рэдагаваць загаловак",
|
||||||
@@ -56,6 +67,7 @@
|
|||||||
"Keyboard shortcut" : "Спалучэнне клавіш",
|
"Keyboard shortcut" : "Спалучэнне клавіш",
|
||||||
"Action" : "Дзеянне",
|
"Action" : "Дзеянне",
|
||||||
"Shift" : "Shift",
|
"Shift" : "Shift",
|
||||||
|
"Ctrl" : "Ctrl",
|
||||||
"Search" : "Пошук",
|
"Search" : "Пошук",
|
||||||
"Enter" : "Enter",
|
"Enter" : "Enter",
|
||||||
"Shared with you" : "Абагулена з вамі",
|
"Shared with you" : "Абагулена з вамі",
|
||||||
@@ -69,6 +81,7 @@
|
|||||||
"Message from {author} in {conversationName}" : "Паведамленне ад {author} у {conversationName}",
|
"Message from {author} in {conversationName}" : "Паведамленне ад {author} у {conversationName}",
|
||||||
"Failed to upload {name}" : "Не ўдалося запампаваць {name}",
|
"Failed to upload {name}" : "Не ўдалося запампаваць {name}",
|
||||||
"Share" : "Абагуліць",
|
"Share" : "Абагуліць",
|
||||||
|
"Personal" : "Асабістыя",
|
||||||
"Today" : "Сёння",
|
"Today" : "Сёння",
|
||||||
"Tomorrow" : "Заўтра"
|
"Tomorrow" : "Заўтра"
|
||||||
},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"
|
},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"
|
||||||
|
|||||||
@@ -51,8 +51,8 @@ OC.L10N.register(
|
|||||||
"{user} has assigned the card {deck-card} on {deck-board} to you." : "{user} har tilknyttet kortet {deck-card} på {deck-board} til dig.",
|
"{user} has assigned the card {deck-card} on {deck-board} to you." : "{user} har tilknyttet kortet {deck-card} på {deck-board} til dig.",
|
||||||
"The card \"%s\" on \"%s\" has reached its due date." : "Kortet \"%s\" på \"%s\" har nået sin forfaldsdato.",
|
"The card \"%s\" on \"%s\" has reached its due date." : "Kortet \"%s\" på \"%s\" har nået sin forfaldsdato.",
|
||||||
"The card {deck-card} on {deck-board} has reached its due date." : "Kortet {deck-card} på {deck-board} har nået sin forfaldsdato.",
|
"The card {deck-card} on {deck-board} has reached its due date." : "Kortet {deck-card} på {deck-board} har nået sin forfaldsdato.",
|
||||||
"%s has mentioned you in a comment on \"%s\"." : " %s har nævnt dig i en kommentar på \"%s\".",
|
"%s has mentioned you in a comment on \"%s\"." : " %s har omtalt dig i en kommentar på \"%s\".",
|
||||||
"{user} has mentioned you in a comment on {deck-card}." : "{user} har nævnt dig i en kommentar på {deck-card}.",
|
"{user} has mentioned you in a comment on {deck-card}." : "{user} har omtalt dig i en kommentar på {deck-card}.",
|
||||||
"The board \"%s\" has been shared with you by %s." : "Tavlen \"%s\" er blevet delt med dig af %s.",
|
"The board \"%s\" has been shared with you by %s." : "Tavlen \"%s\" er blevet delt med dig af %s.",
|
||||||
"{user} has shared {deck-board} with you." : "{user} har delt {deck-board} med dig.",
|
"{user} has shared {deck-board} with you." : "{user} har delt {deck-board} med dig.",
|
||||||
"Deck board" : "Opslagstavle",
|
"Deck board" : "Opslagstavle",
|
||||||
@@ -188,6 +188,10 @@ OC.L10N.register(
|
|||||||
"Add Attachment" : "Tilføj vedhæftning",
|
"Add Attachment" : "Tilføj vedhæftning",
|
||||||
"Choose attachment" : "Vælg en vedhæftning",
|
"Choose attachment" : "Vælg en vedhæftning",
|
||||||
"Select Date" : "Vælg dato",
|
"Select Date" : "Vælg dato",
|
||||||
|
"Later today – {timeLocale}" : "Senere i dag – {timeLocale}",
|
||||||
|
"Tomorrow – {timeLocale}" : "I morgen – {timeLocale}",
|
||||||
|
"This weekend – {timeLocale}" : "Denne weekend – {timeLocale}",
|
||||||
|
"Next week – {timeLocale}" : "Næste uge – {timeLocale}",
|
||||||
"Set a due date" : "Angiv en forfaldsdato",
|
"Set a due date" : "Angiv en forfaldsdato",
|
||||||
"Remove due date" : "Fjern forfaldsdato",
|
"Remove due date" : "Fjern forfaldsdato",
|
||||||
"Mark as done" : "Marker som færdig",
|
"Mark as done" : "Marker som færdig",
|
||||||
|
|||||||
@@ -49,8 +49,8 @@
|
|||||||
"{user} has assigned the card {deck-card} on {deck-board} to you." : "{user} har tilknyttet kortet {deck-card} på {deck-board} til dig.",
|
"{user} has assigned the card {deck-card} on {deck-board} to you." : "{user} har tilknyttet kortet {deck-card} på {deck-board} til dig.",
|
||||||
"The card \"%s\" on \"%s\" has reached its due date." : "Kortet \"%s\" på \"%s\" har nået sin forfaldsdato.",
|
"The card \"%s\" on \"%s\" has reached its due date." : "Kortet \"%s\" på \"%s\" har nået sin forfaldsdato.",
|
||||||
"The card {deck-card} on {deck-board} has reached its due date." : "Kortet {deck-card} på {deck-board} har nået sin forfaldsdato.",
|
"The card {deck-card} on {deck-board} has reached its due date." : "Kortet {deck-card} på {deck-board} har nået sin forfaldsdato.",
|
||||||
"%s has mentioned you in a comment on \"%s\"." : " %s har nævnt dig i en kommentar på \"%s\".",
|
"%s has mentioned you in a comment on \"%s\"." : " %s har omtalt dig i en kommentar på \"%s\".",
|
||||||
"{user} has mentioned you in a comment on {deck-card}." : "{user} har nævnt dig i en kommentar på {deck-card}.",
|
"{user} has mentioned you in a comment on {deck-card}." : "{user} har omtalt dig i en kommentar på {deck-card}.",
|
||||||
"The board \"%s\" has been shared with you by %s." : "Tavlen \"%s\" er blevet delt med dig af %s.",
|
"The board \"%s\" has been shared with you by %s." : "Tavlen \"%s\" er blevet delt med dig af %s.",
|
||||||
"{user} has shared {deck-board} with you." : "{user} har delt {deck-board} med dig.",
|
"{user} has shared {deck-board} with you." : "{user} har delt {deck-board} med dig.",
|
||||||
"Deck board" : "Opslagstavle",
|
"Deck board" : "Opslagstavle",
|
||||||
@@ -186,6 +186,10 @@
|
|||||||
"Add Attachment" : "Tilføj vedhæftning",
|
"Add Attachment" : "Tilføj vedhæftning",
|
||||||
"Choose attachment" : "Vælg en vedhæftning",
|
"Choose attachment" : "Vælg en vedhæftning",
|
||||||
"Select Date" : "Vælg dato",
|
"Select Date" : "Vælg dato",
|
||||||
|
"Later today – {timeLocale}" : "Senere i dag – {timeLocale}",
|
||||||
|
"Tomorrow – {timeLocale}" : "I morgen – {timeLocale}",
|
||||||
|
"This weekend – {timeLocale}" : "Denne weekend – {timeLocale}",
|
||||||
|
"Next week – {timeLocale}" : "Næste uge – {timeLocale}",
|
||||||
"Set a due date" : "Angiv en forfaldsdato",
|
"Set a due date" : "Angiv en forfaldsdato",
|
||||||
"Remove due date" : "Fjern forfaldsdato",
|
"Remove due date" : "Fjern forfaldsdato",
|
||||||
"Mark as done" : "Marker som færdig",
|
"Mark as done" : "Marker som færdig",
|
||||||
|
|||||||
44
l10n/el.js
44
l10n/el.js
@@ -81,10 +81,14 @@ OC.L10N.register(
|
|||||||
"Could not write file to disk" : "Αδυναμία εγγραφής αρχείου στον δίσκο",
|
"Could not write file to disk" : "Αδυναμία εγγραφής αρχείου στον δίσκο",
|
||||||
"A PHP extension stopped the file upload" : "Ένα πρόσθετο PHP διέκοψε την μεταφόρτωση του αρχείου",
|
"A PHP extension stopped the file upload" : "Ένα πρόσθετο PHP διέκοψε την μεταφόρτωση του αρχείου",
|
||||||
"No file uploaded or file size exceeds maximum of %s" : "Δεν μεταφορτώθηκε αρχείο ή το μέγεθος αρχείου υπερβαίνει το μέγιστο %s",
|
"No file uploaded or file size exceeds maximum of %s" : "Δεν μεταφορτώθηκε αρχείο ή το μέγεθος αρχείου υπερβαίνει το μέγιστο %s",
|
||||||
|
"Invalid file type. Only JSON files are allowed." : "Μη έγκυρος τύπος αρχείου. Επιτρέπονται μόνο αρχεία JSON.",
|
||||||
|
"Invalid JSON data" : "Μη έγκυρα δεδομένα JSON",
|
||||||
|
"Failed to import board" : "Αποτυχία εισαγωγής πίνακα",
|
||||||
"Cards due today" : "Κάρτες που λήγουν σήμερα",
|
"Cards due today" : "Κάρτες που λήγουν σήμερα",
|
||||||
"Cards due tomorrow" : "Κάρτες που λήγουν αύριο",
|
"Cards due tomorrow" : "Κάρτες που λήγουν αύριο",
|
||||||
"Upcoming cards" : "Επερχόμενες καρτέλες",
|
"Upcoming cards" : "Επερχόμενες καρτέλες",
|
||||||
"Load more" : "Φόρτωση περισσότερων",
|
"Load more" : "Φόρτωση περισσότερων",
|
||||||
|
"Welcome to Nextcloud Deck!" : "Καλώς ήρθατε στο Nextcloud Deck!",
|
||||||
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "Η καρτέλα \"%s\" του \"%s\" ανατέθηκε σε εσάς από τον %s.",
|
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "Η καρτέλα \"%s\" του \"%s\" ανατέθηκε σε εσάς από τον %s.",
|
||||||
"{user} has assigned the card {deck-card} on {deck-board} to you." : "Ο/Η {user} έχει αναθέσει την καρτέλα {deck-card} του πίνακα {deck-board} σε εσάς.",
|
"{user} has assigned the card {deck-card} on {deck-board} to you." : "Ο/Η {user} έχει αναθέσει την καρτέλα {deck-card} του πίνακα {deck-board} σε εσάς.",
|
||||||
"The card \"%s\" on \"%s\" has reached its due date." : "Η καρτέλα \"%s\" στο \"%s\" έχει λήξει.",
|
"The card \"%s\" on \"%s\" has reached its due date." : "Η καρτέλα \"%s\" στο \"%s\" έχει λήξει.",
|
||||||
@@ -96,6 +100,7 @@ OC.L10N.register(
|
|||||||
"Deck board" : "Πίνακας του Deck",
|
"Deck board" : "Πίνακας του Deck",
|
||||||
"Owned by %1$s" : "Ανήκει στον/στην %1$s",
|
"Owned by %1$s" : "Ανήκει στον/στην %1$s",
|
||||||
"Deck boards, cards and comments" : "Πίνακες, κάρτες και σχόλια Deck",
|
"Deck boards, cards and comments" : "Πίνακες, κάρτες και σχόλια Deck",
|
||||||
|
"From %1$s, in %2$s/%3$s, owned by %4$s" : "Από %1$s, στον %2$s/%3$s, που ανήκει στον %4$s",
|
||||||
"Create a new deck card" : "Δημιουργήστε μια νέα κάρτα",
|
"Create a new deck card" : "Δημιουργήστε μια νέα κάρτα",
|
||||||
"Card comments" : "Σχόλια καρτέλας",
|
"Card comments" : "Σχόλια καρτέλας",
|
||||||
"%s on %s" : "%s στο %s",
|
"%s on %s" : "%s στο %s",
|
||||||
@@ -106,11 +111,20 @@ OC.L10N.register(
|
|||||||
"Action needed" : "Απαιτείται ενέργεια",
|
"Action needed" : "Απαιτείται ενέργεια",
|
||||||
"Later" : "Αργότερα",
|
"Later" : "Αργότερα",
|
||||||
"copy" : "Αντιγραφή",
|
"copy" : "Αντιγραφή",
|
||||||
|
"Read more inside" : "Διαβάστε περισσότερα εντός",
|
||||||
|
"Custom lists - click to rename!" : "Προσαρμοσμένες λίστες - κάντε κλικ για μετονομασία!",
|
||||||
"To Do" : "Προς Ενέργεια",
|
"To Do" : "Προς Ενέργεια",
|
||||||
|
"In Progress" : "Σε Εξέλιξη",
|
||||||
"Done" : "Ολοκληρώθηκε",
|
"Done" : "Ολοκληρώθηκε",
|
||||||
|
"1. Open to learn more about boards and cards" : "1. Ανοίξτε για να μάθετε περισσότερα για τους πίνακες και τις κάρτες",
|
||||||
|
"2. Drag cards left and right, up and down" : "2. Σύρετε κάρτες αριστερά και δεξιά, πάνω και κάτω",
|
||||||
|
"3. Apply rich formatting and link content" : "3. Εφαρμόστε πλούσια μορφοποίηση και συνδέστε περιεχόμενο",
|
||||||
|
"4. Share, comment and collaborate!" : "4. Μοιραστείτε, σχολιάστε και συνεργαστείτε!",
|
||||||
|
"Create your first card!" : "Δημιουργήστε την πρώτη σας κάρτα!",
|
||||||
"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.",
|
"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.",
|
||||||
"Attachments" : "Συνημμένα",
|
"Attachments" : "Συνημμένα",
|
||||||
"File" : "Αρχείο",
|
"File" : "Αρχείο",
|
||||||
|
"date" : "ημερομηνία",
|
||||||
"Card not found" : "Η καρτέλα δεν βρέθηκε",
|
"Card not found" : "Η καρτέλα δεν βρέθηκε",
|
||||||
"Path is already shared with this card" : "Η διαδρομή κοινοποιείται ήδη σε αυτήν την καρτέλα",
|
"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" : "Μη έγκυρη ημερομηνία, η μορφή ημερομηνίας πρέπει να είναι ΕΕΕΕ-ΜΜ-ΗΗ",
|
||||||
@@ -121,10 +135,12 @@ OC.L10N.register(
|
|||||||
"Select the board to link to a project" : "Επιλέξτε πίνακα και συνδέστε τον σε ένα έργο",
|
"Select the board to link to a project" : "Επιλέξτε πίνακα και συνδέστε τον σε ένα έργο",
|
||||||
"Search by board title" : "Αναζήτηση με το όνομα πίνακα",
|
"Search by board title" : "Αναζήτηση με το όνομα πίνακα",
|
||||||
"Select board" : "Επιλογή πίνακα",
|
"Select board" : "Επιλογή πίνακα",
|
||||||
|
"Move/copy card" : "Μετακίνηση/αντιγραφή κάρτας",
|
||||||
"Select a board" : "Επιλογή ενός πίνακα",
|
"Select a board" : "Επιλογή ενός πίνακα",
|
||||||
"No lists available" : "Δεν υπάρχουν διαθέσιμες λίστες",
|
"No lists available" : "Δεν υπάρχουν διαθέσιμες λίστες",
|
||||||
"Select a list" : "Επιλέξτε μια λίστα",
|
"Select a list" : "Επιλέξτε μια λίστα",
|
||||||
"Move card" : "Μετακίνηση καρτέλας",
|
"Move card" : "Μετακίνηση καρτέλας",
|
||||||
|
"Copy card" : "Αντίγραφο κάρτας",
|
||||||
"Select the card to link to a project" : "Επιλογή καρτέλας για σύνδεση στο έργο",
|
"Select the card to link to a project" : "Επιλογή καρτέλας για σύνδεση στο έργο",
|
||||||
"Link to card" : "Σύνδεσμος σε καρτέλα",
|
"Link to card" : "Σύνδεσμος σε καρτέλα",
|
||||||
"Select a card" : "Επιλογή μιας καρτέλας",
|
"Select a card" : "Επιλογή μιας καρτέλας",
|
||||||
@@ -212,7 +228,7 @@ OC.L10N.register(
|
|||||||
"Select a user to assign to this card…" : "Επιλέξτε έναν χρήστη για να του αναθέσετε αυτή την κάρτα...",
|
"Select a user to assign to this card…" : "Επιλέξτε έναν χρήστη για να του αναθέσετε αυτή την κάρτα...",
|
||||||
"File to share" : "Αρχείο για κοινή χρήση",
|
"File to share" : "Αρχείο για κοινή χρήση",
|
||||||
"Invalid path selected" : "Επιλέχθηκε μη έγκυρη διαδρομή",
|
"Invalid path selected" : "Επιλέχθηκε μη έγκυρη διαδρομή",
|
||||||
"Upload new files" : "Ανεβάστε νέα αρχεία",
|
"Upload new files" : "Μεταφορτώστε νέα αρχεία",
|
||||||
"Share from Files" : "Κοινή χρήση από Αρχεία",
|
"Share from Files" : "Κοινή χρήση από Αρχεία",
|
||||||
"Pending share" : "Κοινή χρήση σε εκκρεμότητα",
|
"Pending share" : "Κοινή χρήση σε εκκρεμότητα",
|
||||||
"Add this attachment" : "Προσθήκη αυτού του συνημμένου",
|
"Add this attachment" : "Προσθήκη αυτού του συνημμένου",
|
||||||
@@ -224,6 +240,7 @@ OC.L10N.register(
|
|||||||
"Modified" : "Τροποποιήθηκε",
|
"Modified" : "Τροποποιήθηκε",
|
||||||
"Created" : "Δημιουργήθηκε",
|
"Created" : "Δημιουργήθηκε",
|
||||||
"The title cannot be empty." : "Ο τίτλος δεν μπορεί να είναι κενός.",
|
"The title cannot be empty." : "Ο τίτλος δεν μπορεί να είναι κενός.",
|
||||||
|
"Cannot close unsaved card!" : "Αδυναμία κλεισίματος της κάρτας που δεν έχει αποθηκευτεί!",
|
||||||
"Open in sidebar view" : "Άνοιγμα σε προβολή πλευρικής στήλης",
|
"Open in sidebar view" : "Άνοιγμα σε προβολή πλευρικής στήλης",
|
||||||
"Open in bigger view" : "Άνοιγμα σε μεγαλύτερη προβολή",
|
"Open in bigger view" : "Άνοιγμα σε μεγαλύτερη προβολή",
|
||||||
"Comments" : "Σχόλια",
|
"Comments" : "Σχόλια",
|
||||||
@@ -238,6 +255,7 @@ OC.L10N.register(
|
|||||||
"Reply" : "Απάντηση",
|
"Reply" : "Απάντηση",
|
||||||
"Update" : "Ενημέρωση",
|
"Update" : "Ενημέρωση",
|
||||||
"Write a description …" : "Γράψτε μια περιγραφή…",
|
"Write a description …" : "Γράψτε μια περιγραφή…",
|
||||||
|
"Could not save description" : "Αδυναμία αποθήκευσης της περιγραφής",
|
||||||
"Description" : "Περιγραφή",
|
"Description" : "Περιγραφή",
|
||||||
"(Unsaved)" : "(Δεν αποθηκεύτηκε)",
|
"(Unsaved)" : "(Δεν αποθηκεύτηκε)",
|
||||||
"(Saving…)" : "(Αποθήκευση...)",
|
"(Saving…)" : "(Αποθήκευση...)",
|
||||||
@@ -316,6 +334,7 @@ OC.L10N.register(
|
|||||||
"Limit board creation to some groups" : "Περιορισμός της δημιουργίας πινάκων σε ορισμένες ομάδες",
|
"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." : "Οι χρήστες εκτός αυτών των ομάδων δεν θα μπορούν να δημιουργούν τους δικούς τους πίνακες, αλλά θα μπορούν να εργάζονται σε πίνακες που τους έχουν διαμοιραστεί.",
|
"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." : "Οι χρήστες εκτός αυτών των ομάδων δεν θα μπορούν να δημιουργούν τους δικούς τους πίνακες, αλλά θα μπορούν να εργάζονται σε πίνακες που τους έχουν διαμοιραστεί.",
|
||||||
"Cancel edit" : "Ακύρωση επεξεργασίας",
|
"Cancel edit" : "Ακύρωση επεξεργασίας",
|
||||||
|
"Save board" : "Αποθήκευση πίνακα",
|
||||||
"Board {0} deleted" : "Διαγράφηκε {0} πίνακας ",
|
"Board {0} deleted" : "Διαγράφηκε {0} πίνακας ",
|
||||||
"All cards" : "Όλες οι καρτέλες",
|
"All cards" : "Όλες οι καρτέλες",
|
||||||
"Only assigned cards" : "Μόνο καρτέλες που έχουν ανατεθεί",
|
"Only assigned cards" : "Μόνο καρτέλες που έχουν ανατεθεί",
|
||||||
@@ -323,6 +342,7 @@ OC.L10N.register(
|
|||||||
"An error occurred" : "Παρουσιάστηκε σφάλμα",
|
"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}; Αυτό θα διαγράψει όλα τα δεδομένα του πίνακα συμπεριλαμβανομένων και των αρχειοθετημένων καρτών.",
|
"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?" : "Διαγραφή του πίνακα;",
|
"Delete the board?" : "Διαγραφή του πίνακα;",
|
||||||
|
"Exporting board..." : "Εξαγωγή πίνακα...",
|
||||||
"Board details" : "Λεπτομέριες πίνακα",
|
"Board details" : "Λεπτομέριες πίνακα",
|
||||||
"Edit board" : "Επεξεργασία πίνακα",
|
"Edit board" : "Επεξεργασία πίνακα",
|
||||||
"Clone board" : "Κλώνος πίνακα",
|
"Clone board" : "Κλώνος πίνακα",
|
||||||
@@ -335,12 +355,25 @@ OC.L10N.register(
|
|||||||
"Assigned cards" : "Ανατεθειμένες καρτέλες",
|
"Assigned cards" : "Ανατεθειμένες καρτέλες",
|
||||||
"No notifications" : "Δεν υπάρχουν ειδοποιήσεις",
|
"No notifications" : "Δεν υπάρχουν ειδοποιήσεις",
|
||||||
"Delete board" : "Διαγραφή πίνακα",
|
"Delete board" : "Διαγραφή πίνακα",
|
||||||
"Clone cards" : "Κάρτες κλώνου",
|
"Importing board..." : "Εισαγωγή πίνακα...",
|
||||||
"Advanced options" : "Επιλογές για προχωρημένους",
|
"Board imported successfully" : "Ο πίνακας εισήχθη επιτυχώς",
|
||||||
"Clone" : "Κλώνος",
|
"Import board" : "Εισαγωγή πίνακα",
|
||||||
"Export as CSV" : "Εξαγωγή σε CSV",
|
"Clone {boardTitle}" : "Κλωνοποίηση {boardTitle}",
|
||||||
|
"Clone cards" : "Κλωνοποίηση καρτών",
|
||||||
|
"Clone assignments" : "Κλωνοποίηση αναθέσεων",
|
||||||
|
"Clone labels" : "Κλωνοποίηση ετικετών",
|
||||||
|
"Clone due dates" : "Κλωνοποίηση προθεσμιών",
|
||||||
|
"Advanced options" : "Προχωρημένες επιλογές",
|
||||||
|
"Move all cards to the first list" : "Μετακίνηση όλων των καρτών στην πρώτη λίστα",
|
||||||
|
"Restore archived cards" : "Επαναφορά αρχειοθετημένων καρτών",
|
||||||
|
"Clone" : "Κλωνοποίηση",
|
||||||
|
"Export {boardTitle}" : "Εξαγωγή {boardTitle}",
|
||||||
|
"Export as JSON" : "Εξαγωγή ως JSON",
|
||||||
|
"Export as CSV" : "Εξαγωγή ως CSV",
|
||||||
|
"Note: Only the JSON format is supported for importing back into the Deck app." : "Σημείωση: Μόνο η μορφή JSON υποστηρίζεται για εισαγωγή πίσω στην εφαρμογή Deck.",
|
||||||
"Export" : "Εξαγωγή",
|
"Export" : "Εξαγωγή",
|
||||||
"Loading filtered view" : "Φόρτωση εμφάνισης με βάση το φίλτρο",
|
"Loading filtered view" : "Φόρτωση εμφάνισης με βάση το φίλτρο",
|
||||||
|
"Search for {searchQuery} in other boards" : "Αναζήτηση για {searchQuery} σε άλλους πίνακες",
|
||||||
"Search for {searchQuery} in all boards" : "Αναζήτηση για {searchQuery} σε όλους τους πίνακες",
|
"Search for {searchQuery} in all boards" : "Αναζήτηση για {searchQuery} σε όλους τους πίνακες",
|
||||||
"No results found" : "Δεν βρέθηκαν αποτελέσματα",
|
"No results found" : "Δεν βρέθηκαν αποτελέσματα",
|
||||||
"Deck board {name}\n* Last modified on {lastMod}" : "Πίνακας Deck {name}\n* Τελευταία τροποποίηση στις {lastMod}",
|
"Deck board {name}\n* Last modified on {lastMod}" : "Πίνακας Deck {name}\n* Τελευταία τροποποίηση στις {lastMod}",
|
||||||
@@ -369,6 +402,7 @@ OC.L10N.register(
|
|||||||
"Something went wrong" : "Κάτι πήγε στραβά",
|
"Something went wrong" : "Κάτι πήγε στραβά",
|
||||||
"Failed to upload {name}" : "Αποτυχία μεταφόρτωσης {name}",
|
"Failed to upload {name}" : "Αποτυχία μεταφόρτωσης {name}",
|
||||||
"Maximum file size of {size} exceeded" : "Υπέρβαση επιτρεπόμενου μεγέθους αρχείου {size}",
|
"Maximum file size of {size} exceeded" : "Υπέρβαση επιτρεπόμενου μεγέθους αρχείου {size}",
|
||||||
|
"Assigned users" : "Ανατεθειμένοι χρήστες",
|
||||||
"Due date" : "Προθεσμία",
|
"Due date" : "Προθεσμία",
|
||||||
"Error creating the share" : "Σφάλμα κατά τη δημιουργία της κοινοποίησης",
|
"Error creating the share" : "Σφάλμα κατά τη δημιουργία της κοινοποίησης",
|
||||||
"Share with a Deck card" : "Μοιραστείτε με μια καρτέλα Deck",
|
"Share with a Deck card" : "Μοιραστείτε με μια καρτέλα Deck",
|
||||||
|
|||||||
44
l10n/el.json
44
l10n/el.json
@@ -79,10 +79,14 @@
|
|||||||
"Could not write file to disk" : "Αδυναμία εγγραφής αρχείου στον δίσκο",
|
"Could not write file to disk" : "Αδυναμία εγγραφής αρχείου στον δίσκο",
|
||||||
"A PHP extension stopped the file upload" : "Ένα πρόσθετο PHP διέκοψε την μεταφόρτωση του αρχείου",
|
"A PHP extension stopped the file upload" : "Ένα πρόσθετο PHP διέκοψε την μεταφόρτωση του αρχείου",
|
||||||
"No file uploaded or file size exceeds maximum of %s" : "Δεν μεταφορτώθηκε αρχείο ή το μέγεθος αρχείου υπερβαίνει το μέγιστο %s",
|
"No file uploaded or file size exceeds maximum of %s" : "Δεν μεταφορτώθηκε αρχείο ή το μέγεθος αρχείου υπερβαίνει το μέγιστο %s",
|
||||||
|
"Invalid file type. Only JSON files are allowed." : "Μη έγκυρος τύπος αρχείου. Επιτρέπονται μόνο αρχεία JSON.",
|
||||||
|
"Invalid JSON data" : "Μη έγκυρα δεδομένα JSON",
|
||||||
|
"Failed to import board" : "Αποτυχία εισαγωγής πίνακα",
|
||||||
"Cards due today" : "Κάρτες που λήγουν σήμερα",
|
"Cards due today" : "Κάρτες που λήγουν σήμερα",
|
||||||
"Cards due tomorrow" : "Κάρτες που λήγουν αύριο",
|
"Cards due tomorrow" : "Κάρτες που λήγουν αύριο",
|
||||||
"Upcoming cards" : "Επερχόμενες καρτέλες",
|
"Upcoming cards" : "Επερχόμενες καρτέλες",
|
||||||
"Load more" : "Φόρτωση περισσότερων",
|
"Load more" : "Φόρτωση περισσότερων",
|
||||||
|
"Welcome to Nextcloud Deck!" : "Καλώς ήρθατε στο Nextcloud Deck!",
|
||||||
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "Η καρτέλα \"%s\" του \"%s\" ανατέθηκε σε εσάς από τον %s.",
|
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "Η καρτέλα \"%s\" του \"%s\" ανατέθηκε σε εσάς από τον %s.",
|
||||||
"{user} has assigned the card {deck-card} on {deck-board} to you." : "Ο/Η {user} έχει αναθέσει την καρτέλα {deck-card} του πίνακα {deck-board} σε εσάς.",
|
"{user} has assigned the card {deck-card} on {deck-board} to you." : "Ο/Η {user} έχει αναθέσει την καρτέλα {deck-card} του πίνακα {deck-board} σε εσάς.",
|
||||||
"The card \"%s\" on \"%s\" has reached its due date." : "Η καρτέλα \"%s\" στο \"%s\" έχει λήξει.",
|
"The card \"%s\" on \"%s\" has reached its due date." : "Η καρτέλα \"%s\" στο \"%s\" έχει λήξει.",
|
||||||
@@ -94,6 +98,7 @@
|
|||||||
"Deck board" : "Πίνακας του Deck",
|
"Deck board" : "Πίνακας του Deck",
|
||||||
"Owned by %1$s" : "Ανήκει στον/στην %1$s",
|
"Owned by %1$s" : "Ανήκει στον/στην %1$s",
|
||||||
"Deck boards, cards and comments" : "Πίνακες, κάρτες και σχόλια Deck",
|
"Deck boards, cards and comments" : "Πίνακες, κάρτες και σχόλια Deck",
|
||||||
|
"From %1$s, in %2$s/%3$s, owned by %4$s" : "Από %1$s, στον %2$s/%3$s, που ανήκει στον %4$s",
|
||||||
"Create a new deck card" : "Δημιουργήστε μια νέα κάρτα",
|
"Create a new deck card" : "Δημιουργήστε μια νέα κάρτα",
|
||||||
"Card comments" : "Σχόλια καρτέλας",
|
"Card comments" : "Σχόλια καρτέλας",
|
||||||
"%s on %s" : "%s στο %s",
|
"%s on %s" : "%s στο %s",
|
||||||
@@ -104,11 +109,20 @@
|
|||||||
"Action needed" : "Απαιτείται ενέργεια",
|
"Action needed" : "Απαιτείται ενέργεια",
|
||||||
"Later" : "Αργότερα",
|
"Later" : "Αργότερα",
|
||||||
"copy" : "Αντιγραφή",
|
"copy" : "Αντιγραφή",
|
||||||
|
"Read more inside" : "Διαβάστε περισσότερα εντός",
|
||||||
|
"Custom lists - click to rename!" : "Προσαρμοσμένες λίστες - κάντε κλικ για μετονομασία!",
|
||||||
"To Do" : "Προς Ενέργεια",
|
"To Do" : "Προς Ενέργεια",
|
||||||
|
"In Progress" : "Σε Εξέλιξη",
|
||||||
"Done" : "Ολοκληρώθηκε",
|
"Done" : "Ολοκληρώθηκε",
|
||||||
|
"1. Open to learn more about boards and cards" : "1. Ανοίξτε για να μάθετε περισσότερα για τους πίνακες και τις κάρτες",
|
||||||
|
"2. Drag cards left and right, up and down" : "2. Σύρετε κάρτες αριστερά και δεξιά, πάνω και κάτω",
|
||||||
|
"3. Apply rich formatting and link content" : "3. Εφαρμόστε πλούσια μορφοποίηση και συνδέστε περιεχόμενο",
|
||||||
|
"4. Share, comment and collaborate!" : "4. Μοιραστείτε, σχολιάστε και συνεργαστείτε!",
|
||||||
|
"Create your first card!" : "Δημιουργήστε την πρώτη σας κάρτα!",
|
||||||
"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.",
|
"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.",
|
||||||
"Attachments" : "Συνημμένα",
|
"Attachments" : "Συνημμένα",
|
||||||
"File" : "Αρχείο",
|
"File" : "Αρχείο",
|
||||||
|
"date" : "ημερομηνία",
|
||||||
"Card not found" : "Η καρτέλα δεν βρέθηκε",
|
"Card not found" : "Η καρτέλα δεν βρέθηκε",
|
||||||
"Path is already shared with this card" : "Η διαδρομή κοινοποιείται ήδη σε αυτήν την καρτέλα",
|
"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" : "Μη έγκυρη ημερομηνία, η μορφή ημερομηνίας πρέπει να είναι ΕΕΕΕ-ΜΜ-ΗΗ",
|
||||||
@@ -119,10 +133,12 @@
|
|||||||
"Select the board to link to a project" : "Επιλέξτε πίνακα και συνδέστε τον σε ένα έργο",
|
"Select the board to link to a project" : "Επιλέξτε πίνακα και συνδέστε τον σε ένα έργο",
|
||||||
"Search by board title" : "Αναζήτηση με το όνομα πίνακα",
|
"Search by board title" : "Αναζήτηση με το όνομα πίνακα",
|
||||||
"Select board" : "Επιλογή πίνακα",
|
"Select board" : "Επιλογή πίνακα",
|
||||||
|
"Move/copy card" : "Μετακίνηση/αντιγραφή κάρτας",
|
||||||
"Select a board" : "Επιλογή ενός πίνακα",
|
"Select a board" : "Επιλογή ενός πίνακα",
|
||||||
"No lists available" : "Δεν υπάρχουν διαθέσιμες λίστες",
|
"No lists available" : "Δεν υπάρχουν διαθέσιμες λίστες",
|
||||||
"Select a list" : "Επιλέξτε μια λίστα",
|
"Select a list" : "Επιλέξτε μια λίστα",
|
||||||
"Move card" : "Μετακίνηση καρτέλας",
|
"Move card" : "Μετακίνηση καρτέλας",
|
||||||
|
"Copy card" : "Αντίγραφο κάρτας",
|
||||||
"Select the card to link to a project" : "Επιλογή καρτέλας για σύνδεση στο έργο",
|
"Select the card to link to a project" : "Επιλογή καρτέλας για σύνδεση στο έργο",
|
||||||
"Link to card" : "Σύνδεσμος σε καρτέλα",
|
"Link to card" : "Σύνδεσμος σε καρτέλα",
|
||||||
"Select a card" : "Επιλογή μιας καρτέλας",
|
"Select a card" : "Επιλογή μιας καρτέλας",
|
||||||
@@ -210,7 +226,7 @@
|
|||||||
"Select a user to assign to this card…" : "Επιλέξτε έναν χρήστη για να του αναθέσετε αυτή την κάρτα...",
|
"Select a user to assign to this card…" : "Επιλέξτε έναν χρήστη για να του αναθέσετε αυτή την κάρτα...",
|
||||||
"File to share" : "Αρχείο για κοινή χρήση",
|
"File to share" : "Αρχείο για κοινή χρήση",
|
||||||
"Invalid path selected" : "Επιλέχθηκε μη έγκυρη διαδρομή",
|
"Invalid path selected" : "Επιλέχθηκε μη έγκυρη διαδρομή",
|
||||||
"Upload new files" : "Ανεβάστε νέα αρχεία",
|
"Upload new files" : "Μεταφορτώστε νέα αρχεία",
|
||||||
"Share from Files" : "Κοινή χρήση από Αρχεία",
|
"Share from Files" : "Κοινή χρήση από Αρχεία",
|
||||||
"Pending share" : "Κοινή χρήση σε εκκρεμότητα",
|
"Pending share" : "Κοινή χρήση σε εκκρεμότητα",
|
||||||
"Add this attachment" : "Προσθήκη αυτού του συνημμένου",
|
"Add this attachment" : "Προσθήκη αυτού του συνημμένου",
|
||||||
@@ -222,6 +238,7 @@
|
|||||||
"Modified" : "Τροποποιήθηκε",
|
"Modified" : "Τροποποιήθηκε",
|
||||||
"Created" : "Δημιουργήθηκε",
|
"Created" : "Δημιουργήθηκε",
|
||||||
"The title cannot be empty." : "Ο τίτλος δεν μπορεί να είναι κενός.",
|
"The title cannot be empty." : "Ο τίτλος δεν μπορεί να είναι κενός.",
|
||||||
|
"Cannot close unsaved card!" : "Αδυναμία κλεισίματος της κάρτας που δεν έχει αποθηκευτεί!",
|
||||||
"Open in sidebar view" : "Άνοιγμα σε προβολή πλευρικής στήλης",
|
"Open in sidebar view" : "Άνοιγμα σε προβολή πλευρικής στήλης",
|
||||||
"Open in bigger view" : "Άνοιγμα σε μεγαλύτερη προβολή",
|
"Open in bigger view" : "Άνοιγμα σε μεγαλύτερη προβολή",
|
||||||
"Comments" : "Σχόλια",
|
"Comments" : "Σχόλια",
|
||||||
@@ -236,6 +253,7 @@
|
|||||||
"Reply" : "Απάντηση",
|
"Reply" : "Απάντηση",
|
||||||
"Update" : "Ενημέρωση",
|
"Update" : "Ενημέρωση",
|
||||||
"Write a description …" : "Γράψτε μια περιγραφή…",
|
"Write a description …" : "Γράψτε μια περιγραφή…",
|
||||||
|
"Could not save description" : "Αδυναμία αποθήκευσης της περιγραφής",
|
||||||
"Description" : "Περιγραφή",
|
"Description" : "Περιγραφή",
|
||||||
"(Unsaved)" : "(Δεν αποθηκεύτηκε)",
|
"(Unsaved)" : "(Δεν αποθηκεύτηκε)",
|
||||||
"(Saving…)" : "(Αποθήκευση...)",
|
"(Saving…)" : "(Αποθήκευση...)",
|
||||||
@@ -314,6 +332,7 @@
|
|||||||
"Limit board creation to some groups" : "Περιορισμός της δημιουργίας πινάκων σε ορισμένες ομάδες",
|
"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." : "Οι χρήστες εκτός αυτών των ομάδων δεν θα μπορούν να δημιουργούν τους δικούς τους πίνακες, αλλά θα μπορούν να εργάζονται σε πίνακες που τους έχουν διαμοιραστεί.",
|
"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." : "Οι χρήστες εκτός αυτών των ομάδων δεν θα μπορούν να δημιουργούν τους δικούς τους πίνακες, αλλά θα μπορούν να εργάζονται σε πίνακες που τους έχουν διαμοιραστεί.",
|
||||||
"Cancel edit" : "Ακύρωση επεξεργασίας",
|
"Cancel edit" : "Ακύρωση επεξεργασίας",
|
||||||
|
"Save board" : "Αποθήκευση πίνακα",
|
||||||
"Board {0} deleted" : "Διαγράφηκε {0} πίνακας ",
|
"Board {0} deleted" : "Διαγράφηκε {0} πίνακας ",
|
||||||
"All cards" : "Όλες οι καρτέλες",
|
"All cards" : "Όλες οι καρτέλες",
|
||||||
"Only assigned cards" : "Μόνο καρτέλες που έχουν ανατεθεί",
|
"Only assigned cards" : "Μόνο καρτέλες που έχουν ανατεθεί",
|
||||||
@@ -321,6 +340,7 @@
|
|||||||
"An error occurred" : "Παρουσιάστηκε σφάλμα",
|
"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}; Αυτό θα διαγράψει όλα τα δεδομένα του πίνακα συμπεριλαμβανομένων και των αρχειοθετημένων καρτών.",
|
"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?" : "Διαγραφή του πίνακα;",
|
"Delete the board?" : "Διαγραφή του πίνακα;",
|
||||||
|
"Exporting board..." : "Εξαγωγή πίνακα...",
|
||||||
"Board details" : "Λεπτομέριες πίνακα",
|
"Board details" : "Λεπτομέριες πίνακα",
|
||||||
"Edit board" : "Επεξεργασία πίνακα",
|
"Edit board" : "Επεξεργασία πίνακα",
|
||||||
"Clone board" : "Κλώνος πίνακα",
|
"Clone board" : "Κλώνος πίνακα",
|
||||||
@@ -333,12 +353,25 @@
|
|||||||
"Assigned cards" : "Ανατεθειμένες καρτέλες",
|
"Assigned cards" : "Ανατεθειμένες καρτέλες",
|
||||||
"No notifications" : "Δεν υπάρχουν ειδοποιήσεις",
|
"No notifications" : "Δεν υπάρχουν ειδοποιήσεις",
|
||||||
"Delete board" : "Διαγραφή πίνακα",
|
"Delete board" : "Διαγραφή πίνακα",
|
||||||
"Clone cards" : "Κάρτες κλώνου",
|
"Importing board..." : "Εισαγωγή πίνακα...",
|
||||||
"Advanced options" : "Επιλογές για προχωρημένους",
|
"Board imported successfully" : "Ο πίνακας εισήχθη επιτυχώς",
|
||||||
"Clone" : "Κλώνος",
|
"Import board" : "Εισαγωγή πίνακα",
|
||||||
"Export as CSV" : "Εξαγωγή σε CSV",
|
"Clone {boardTitle}" : "Κλωνοποίηση {boardTitle}",
|
||||||
|
"Clone cards" : "Κλωνοποίηση καρτών",
|
||||||
|
"Clone assignments" : "Κλωνοποίηση αναθέσεων",
|
||||||
|
"Clone labels" : "Κλωνοποίηση ετικετών",
|
||||||
|
"Clone due dates" : "Κλωνοποίηση προθεσμιών",
|
||||||
|
"Advanced options" : "Προχωρημένες επιλογές",
|
||||||
|
"Move all cards to the first list" : "Μετακίνηση όλων των καρτών στην πρώτη λίστα",
|
||||||
|
"Restore archived cards" : "Επαναφορά αρχειοθετημένων καρτών",
|
||||||
|
"Clone" : "Κλωνοποίηση",
|
||||||
|
"Export {boardTitle}" : "Εξαγωγή {boardTitle}",
|
||||||
|
"Export as JSON" : "Εξαγωγή ως JSON",
|
||||||
|
"Export as CSV" : "Εξαγωγή ως CSV",
|
||||||
|
"Note: Only the JSON format is supported for importing back into the Deck app." : "Σημείωση: Μόνο η μορφή JSON υποστηρίζεται για εισαγωγή πίσω στην εφαρμογή Deck.",
|
||||||
"Export" : "Εξαγωγή",
|
"Export" : "Εξαγωγή",
|
||||||
"Loading filtered view" : "Φόρτωση εμφάνισης με βάση το φίλτρο",
|
"Loading filtered view" : "Φόρτωση εμφάνισης με βάση το φίλτρο",
|
||||||
|
"Search for {searchQuery} in other boards" : "Αναζήτηση για {searchQuery} σε άλλους πίνακες",
|
||||||
"Search for {searchQuery} in all boards" : "Αναζήτηση για {searchQuery} σε όλους τους πίνακες",
|
"Search for {searchQuery} in all boards" : "Αναζήτηση για {searchQuery} σε όλους τους πίνακες",
|
||||||
"No results found" : "Δεν βρέθηκαν αποτελέσματα",
|
"No results found" : "Δεν βρέθηκαν αποτελέσματα",
|
||||||
"Deck board {name}\n* Last modified on {lastMod}" : "Πίνακας Deck {name}\n* Τελευταία τροποποίηση στις {lastMod}",
|
"Deck board {name}\n* Last modified on {lastMod}" : "Πίνακας Deck {name}\n* Τελευταία τροποποίηση στις {lastMod}",
|
||||||
@@ -367,6 +400,7 @@
|
|||||||
"Something went wrong" : "Κάτι πήγε στραβά",
|
"Something went wrong" : "Κάτι πήγε στραβά",
|
||||||
"Failed to upload {name}" : "Αποτυχία μεταφόρτωσης {name}",
|
"Failed to upload {name}" : "Αποτυχία μεταφόρτωσης {name}",
|
||||||
"Maximum file size of {size} exceeded" : "Υπέρβαση επιτρεπόμενου μεγέθους αρχείου {size}",
|
"Maximum file size of {size} exceeded" : "Υπέρβαση επιτρεπόμενου μεγέθους αρχείου {size}",
|
||||||
|
"Assigned users" : "Ανατεθειμένοι χρήστες",
|
||||||
"Due date" : "Προθεσμία",
|
"Due date" : "Προθεσμία",
|
||||||
"Error creating the share" : "Σφάλμα κατά τη δημιουργία της κοινοποίησης",
|
"Error creating the share" : "Σφάλμα κατά τη δημιουργία της κοινοποίησης",
|
||||||
"Share with a Deck card" : "Μοιραστείτε με μια καρτέλα Deck",
|
"Share with a Deck card" : "Μοιραστείτε με μια καρτέλα Deck",
|
||||||
|
|||||||
@@ -357,7 +357,7 @@ OC.L10N.register(
|
|||||||
"Delete board" : "Supprimer le tableau",
|
"Delete board" : "Supprimer le tableau",
|
||||||
"Importing board..." : "Importation du tableau...",
|
"Importing board..." : "Importation du tableau...",
|
||||||
"Board imported successfully" : "Carte importée avec succès",
|
"Board imported successfully" : "Carte importée avec succès",
|
||||||
"Import board" : "Tableau d'importation",
|
"Import board" : "Importer un tableau",
|
||||||
"Clone {boardTitle}" : "Cloner {boardTitle}",
|
"Clone {boardTitle}" : "Cloner {boardTitle}",
|
||||||
"Clone cards" : "Dupliquer les cartes",
|
"Clone cards" : "Dupliquer les cartes",
|
||||||
"Clone assignments" : "Cloner les affectations",
|
"Clone assignments" : "Cloner les affectations",
|
||||||
@@ -373,6 +373,7 @@ OC.L10N.register(
|
|||||||
"Note: Only the JSON format is supported for importing back into the Deck app." : "Remarque : seul le format JSON est pris en charge pour la réimportation dans l'application Deck.",
|
"Note: Only the JSON format is supported for importing back into the Deck app." : "Remarque : seul le format JSON est pris en charge pour la réimportation dans l'application Deck.",
|
||||||
"Export" : "Exporter",
|
"Export" : "Exporter",
|
||||||
"Loading filtered view" : "Chargement de la vue filtrée",
|
"Loading filtered view" : "Chargement de la vue filtrée",
|
||||||
|
"Search for {searchQuery} in other boards" : "Rechercher {searchQuery} dans les autres tableaux",
|
||||||
"Search for {searchQuery} in all boards" : "Recherche de {searchQuery} dans tous les tableaux",
|
"Search for {searchQuery} in all boards" : "Recherche de {searchQuery} dans tous les tableaux",
|
||||||
"No results found" : "Aucun résultat",
|
"No results found" : "Aucun résultat",
|
||||||
"Deck board {name}\n* Last modified on {lastMod}" : "Tableau Deck {name}\n* Dernière modification le {lastMod}",
|
"Deck board {name}\n* Last modified on {lastMod}" : "Tableau Deck {name}\n* Dernière modification le {lastMod}",
|
||||||
|
|||||||
@@ -355,7 +355,7 @@
|
|||||||
"Delete board" : "Supprimer le tableau",
|
"Delete board" : "Supprimer le tableau",
|
||||||
"Importing board..." : "Importation du tableau...",
|
"Importing board..." : "Importation du tableau...",
|
||||||
"Board imported successfully" : "Carte importée avec succès",
|
"Board imported successfully" : "Carte importée avec succès",
|
||||||
"Import board" : "Tableau d'importation",
|
"Import board" : "Importer un tableau",
|
||||||
"Clone {boardTitle}" : "Cloner {boardTitle}",
|
"Clone {boardTitle}" : "Cloner {boardTitle}",
|
||||||
"Clone cards" : "Dupliquer les cartes",
|
"Clone cards" : "Dupliquer les cartes",
|
||||||
"Clone assignments" : "Cloner les affectations",
|
"Clone assignments" : "Cloner les affectations",
|
||||||
@@ -371,6 +371,7 @@
|
|||||||
"Note: Only the JSON format is supported for importing back into the Deck app." : "Remarque : seul le format JSON est pris en charge pour la réimportation dans l'application Deck.",
|
"Note: Only the JSON format is supported for importing back into the Deck app." : "Remarque : seul le format JSON est pris en charge pour la réimportation dans l'application Deck.",
|
||||||
"Export" : "Exporter",
|
"Export" : "Exporter",
|
||||||
"Loading filtered view" : "Chargement de la vue filtrée",
|
"Loading filtered view" : "Chargement de la vue filtrée",
|
||||||
|
"Search for {searchQuery} in other boards" : "Rechercher {searchQuery} dans les autres tableaux",
|
||||||
"Search for {searchQuery} in all boards" : "Recherche de {searchQuery} dans tous les tableaux",
|
"Search for {searchQuery} in all boards" : "Recherche de {searchQuery} dans tous les tableaux",
|
||||||
"No results found" : "Aucun résultat",
|
"No results found" : "Aucun résultat",
|
||||||
"Deck board {name}\n* Last modified on {lastMod}" : "Tableau Deck {name}\n* Dernière modification le {lastMod}",
|
"Deck board {name}\n* Last modified on {lastMod}" : "Tableau Deck {name}\n* Dernière modification le {lastMod}",
|
||||||
|
|||||||
@@ -373,6 +373,7 @@ OC.L10N.register(
|
|||||||
"Note: Only the JSON format is supported for importing back into the Deck app." : "Megjegyzés: Csak a JSON formátum támogatott a Kártyák alkalmazásba való importáláskor.",
|
"Note: Only the JSON format is supported for importing back into the Deck app." : "Megjegyzés: Csak a JSON formátum támogatott a Kártyák alkalmazásba való importáláskor.",
|
||||||
"Export" : "Exportálás",
|
"Export" : "Exportálás",
|
||||||
"Loading filtered view" : "Szűrt nézet betöltése",
|
"Loading filtered view" : "Szűrt nézet betöltése",
|
||||||
|
"Search for {searchQuery} in other boards" : "Keresés a(z) {searchQuery} kifejezésre a többi táblában",
|
||||||
"Search for {searchQuery} in all boards" : "Keresés a(z) {searchQuery} kifejezésre az összes táblában",
|
"Search for {searchQuery} in all boards" : "Keresés a(z) {searchQuery} kifejezésre az összes táblában",
|
||||||
"No results found" : "Nincs találat",
|
"No results found" : "Nincs találat",
|
||||||
"Deck board {name}\n* Last modified on {lastMod}" : "{name} kártyatábla\n* Legutóbb módosítva: {lastMod}",
|
"Deck board {name}\n* Last modified on {lastMod}" : "{name} kártyatábla\n* Legutóbb módosítva: {lastMod}",
|
||||||
|
|||||||
@@ -371,6 +371,7 @@
|
|||||||
"Note: Only the JSON format is supported for importing back into the Deck app." : "Megjegyzés: Csak a JSON formátum támogatott a Kártyák alkalmazásba való importáláskor.",
|
"Note: Only the JSON format is supported for importing back into the Deck app." : "Megjegyzés: Csak a JSON formátum támogatott a Kártyák alkalmazásba való importáláskor.",
|
||||||
"Export" : "Exportálás",
|
"Export" : "Exportálás",
|
||||||
"Loading filtered view" : "Szűrt nézet betöltése",
|
"Loading filtered view" : "Szűrt nézet betöltése",
|
||||||
|
"Search for {searchQuery} in other boards" : "Keresés a(z) {searchQuery} kifejezésre a többi táblában",
|
||||||
"Search for {searchQuery} in all boards" : "Keresés a(z) {searchQuery} kifejezésre az összes táblában",
|
"Search for {searchQuery} in all boards" : "Keresés a(z) {searchQuery} kifejezésre az összes táblában",
|
||||||
"No results found" : "Nincs találat",
|
"No results found" : "Nincs találat",
|
||||||
"Deck board {name}\n* Last modified on {lastMod}" : "{name} kártyatábla\n* Legutóbb módosítva: {lastMod}",
|
"Deck board {name}\n* Last modified on {lastMod}" : "{name} kártyatábla\n* Legutóbb módosítva: {lastMod}",
|
||||||
|
|||||||
@@ -6,16 +6,19 @@ OC.L10N.register(
|
|||||||
"No file was uploaded" : "Ulac afaylu i d-yettwasulin",
|
"No file was uploaded" : "Ulac afaylu i d-yettwasulin",
|
||||||
"Missing a temporary folder" : "Ixuṣ ukaram akudan",
|
"Missing a temporary folder" : "Ixuṣ ukaram akudan",
|
||||||
"Finished" : "Immed",
|
"Finished" : "Immed",
|
||||||
|
"copy" : "nɣel",
|
||||||
"Done" : "Immed",
|
"Done" : "Immed",
|
||||||
"Attachments" : "Ticeqqufin",
|
"Attachments" : "Ticeqqufin",
|
||||||
"File" : "Afaylu",
|
"File" : "Afaylu",
|
||||||
"Cancel" : "Sefsex",
|
"Cancel" : "Sefsex",
|
||||||
"Open" : "Ldi",
|
"Open" : "Ldi",
|
||||||
"Completed" : "Yemmed",
|
"Completed" : "Yemmed",
|
||||||
|
"Open details" : "Ldi talqayt",
|
||||||
"Details" : "Talqayt",
|
"Details" : "Talqayt",
|
||||||
"Sharing" : "Beṭṭu",
|
"Sharing" : "Beṭṭu",
|
||||||
"Tags" : "Tibzimin",
|
"Tags" : "Tibzimin",
|
||||||
"Activity" : "Armud",
|
"Activity" : "Armud",
|
||||||
|
"Transfer" : "Seḍfeṛ",
|
||||||
"Owner" : "Bab",
|
"Owner" : "Bab",
|
||||||
"Delete" : "Kkes",
|
"Delete" : "Kkes",
|
||||||
"Edit" : "Ẓreg",
|
"Edit" : "Ẓreg",
|
||||||
@@ -26,6 +29,9 @@ OC.L10N.register(
|
|||||||
"Save" : "Sekles",
|
"Save" : "Sekles",
|
||||||
"Cancel reply" : "Semmet tiririt.",
|
"Cancel reply" : "Semmet tiririt.",
|
||||||
"Reply" : "Err",
|
"Reply" : "Err",
|
||||||
|
"Description" : "Aglam",
|
||||||
|
"Open link" : "Nɣel aseɣwen",
|
||||||
|
"Keyboard shortcuts" : "Inegzumen n unasiw",
|
||||||
"Ctrl" : "Ctrl",
|
"Ctrl" : "Ctrl",
|
||||||
"Search" : "Nadi",
|
"Search" : "Nadi",
|
||||||
"Cancel edit" : "Sefsex aseẓreg",
|
"Cancel edit" : "Sefsex aseẓreg",
|
||||||
|
|||||||
@@ -4,16 +4,19 @@
|
|||||||
"No file was uploaded" : "Ulac afaylu i d-yettwasulin",
|
"No file was uploaded" : "Ulac afaylu i d-yettwasulin",
|
||||||
"Missing a temporary folder" : "Ixuṣ ukaram akudan",
|
"Missing a temporary folder" : "Ixuṣ ukaram akudan",
|
||||||
"Finished" : "Immed",
|
"Finished" : "Immed",
|
||||||
|
"copy" : "nɣel",
|
||||||
"Done" : "Immed",
|
"Done" : "Immed",
|
||||||
"Attachments" : "Ticeqqufin",
|
"Attachments" : "Ticeqqufin",
|
||||||
"File" : "Afaylu",
|
"File" : "Afaylu",
|
||||||
"Cancel" : "Sefsex",
|
"Cancel" : "Sefsex",
|
||||||
"Open" : "Ldi",
|
"Open" : "Ldi",
|
||||||
"Completed" : "Yemmed",
|
"Completed" : "Yemmed",
|
||||||
|
"Open details" : "Ldi talqayt",
|
||||||
"Details" : "Talqayt",
|
"Details" : "Talqayt",
|
||||||
"Sharing" : "Beṭṭu",
|
"Sharing" : "Beṭṭu",
|
||||||
"Tags" : "Tibzimin",
|
"Tags" : "Tibzimin",
|
||||||
"Activity" : "Armud",
|
"Activity" : "Armud",
|
||||||
|
"Transfer" : "Seḍfeṛ",
|
||||||
"Owner" : "Bab",
|
"Owner" : "Bab",
|
||||||
"Delete" : "Kkes",
|
"Delete" : "Kkes",
|
||||||
"Edit" : "Ẓreg",
|
"Edit" : "Ẓreg",
|
||||||
@@ -24,6 +27,9 @@
|
|||||||
"Save" : "Sekles",
|
"Save" : "Sekles",
|
||||||
"Cancel reply" : "Semmet tiririt.",
|
"Cancel reply" : "Semmet tiririt.",
|
||||||
"Reply" : "Err",
|
"Reply" : "Err",
|
||||||
|
"Description" : "Aglam",
|
||||||
|
"Open link" : "Nɣel aseɣwen",
|
||||||
|
"Keyboard shortcuts" : "Inegzumen n unasiw",
|
||||||
"Ctrl" : "Ctrl",
|
"Ctrl" : "Ctrl",
|
||||||
"Search" : "Nadi",
|
"Search" : "Nadi",
|
||||||
"Cancel edit" : "Sefsex aseẓreg",
|
"Cancel edit" : "Sefsex aseẓreg",
|
||||||
|
|||||||
145
l10n/mk.js
145
l10n/mk.js
@@ -12,7 +12,7 @@ OC.L10N.register(
|
|||||||
"You have removed {acl} from the board {board}" : "Го избришавте {acl} од таблата {board}",
|
"You have removed {acl} from the board {board}" : "Го избришавте {acl} од таблата {board}",
|
||||||
"{user} has removed {acl} from the board {board}" : "{user} го избриша {acl} од таблата {board}",
|
"{user} has removed {acl} from the board {board}" : "{user} го избриша {acl} од таблата {board}",
|
||||||
"You have renamed the board {before} to {board}" : "Ја преименувавте таблата {before} во {board}",
|
"You have renamed the board {before} to {board}" : "Ја преименувавте таблата {before} во {board}",
|
||||||
"{user} has renamed the board {before} to {board}" : "{user} ја преименување таблата {before} во {board}",
|
"{user} has renamed the board {before} to {board}" : "{user} ја преименуваше таблата {before} во {board}",
|
||||||
"You have archived the board {board}" : "Ја архивиравте таблата {board}",
|
"You have archived the board {board}" : "Ја архивиравте таблата {board}",
|
||||||
"{user} has archived the board {before}" : "{user} ја архивирање таблата {before}",
|
"{user} has archived the board {before}" : "{user} ја архивирање таблата {before}",
|
||||||
"You have unarchived the board {board}" : "Ја вративте од архива таблата {board}",
|
"You have unarchived the board {board}" : "Ја вративте од архива таблата {board}",
|
||||||
@@ -20,7 +20,7 @@ OC.L10N.register(
|
|||||||
"You have created a new list {stack} on board {board}" : "Креиравте нова листа {stack} на таблата {board}",
|
"You have created a new list {stack} on board {board}" : "Креиравте нова листа {stack} на таблата {board}",
|
||||||
"{user} has created a new list {stack} on board {board}" : "{user} креирање нова листа {stack} на таблата {board}",
|
"{user} has created a new list {stack} on board {board}" : "{user} креирање нова листа {stack} на таблата {board}",
|
||||||
"You have renamed list {before} to {stack} on board {board}" : "Ја преименувавте листа {before} во {stack} на таблата {board}",
|
"You have renamed list {before} to {stack} on board {board}" : "Ја преименувавте листа {before} во {stack} на таблата {board}",
|
||||||
"{user} has renamed list {before} to {stack} on board {board}" : "{user} ја преименување листата {before} во {stack} на таблата {board}",
|
"{user} has renamed list {before} to {stack} on board {board}" : "{user} ја преименуваше листата {before} во {stack} на таблата {board}",
|
||||||
"You have deleted list {stack} on board {board}" : "Ја избришавте листата {stack} од таблата {board}",
|
"You have deleted list {stack} on board {board}" : "Ја избришавте листата {stack} од таблата {board}",
|
||||||
"{user} has deleted list {stack} on board {board}" : "{user} ја избриша листата {stack} од таблата {board}",
|
"{user} has deleted list {stack} on board {board}" : "{user} ја избриша листата {stack} од таблата {board}",
|
||||||
"You have created card {card} in list {stack} on board {board}" : "Креиравте картица {card} во листата {stack} на таблата {board}",
|
"You have created card {card} in list {stack} on board {board}" : "Креиравте картица {card} во листата {stack} на таблата {board}",
|
||||||
@@ -28,7 +28,7 @@ OC.L10N.register(
|
|||||||
"You have deleted card {card} in list {stack} on board {board}" : "Избришавте картица {card} во листата {stack} на таблата {board}",
|
"You have deleted card {card} in list {stack} on board {board}" : "Избришавте картица {card} во листата {stack} на таблата {board}",
|
||||||
"{user} has deleted card {card} in list {stack} on board {board}" : "{user} избриша картица {card} во листата {stack} на таблата {board}",
|
"{user} has deleted card {card} in list {stack} on board {board}" : "{user} избриша картица {card} во листата {stack} на таблата {board}",
|
||||||
"You have renamed the card {before} to {card}" : "Ја преименувавте картицата {before} во {card}",
|
"You have renamed the card {before} to {card}" : "Ја преименувавте картицата {before} во {card}",
|
||||||
"{user} has renamed the card {before} to {card}" : "{user} ја преименување картицата {before} во {card}",
|
"{user} has renamed the card {before} to {card}" : "{user} ја преименуваше картицата {before} во {card}",
|
||||||
"You have added a description to card {card} in list {stack} on board {board}" : "Додадовте опис на картицата {card} во листата {stack} на таблата {board}",
|
"You have added a description to card {card} in list {stack} on board {board}" : "Додадовте опис на картицата {card} во листата {stack} на таблата {board}",
|
||||||
"{user} has added a description to card {card} in list {stack} on board {board}" : "{user} додаде опис на картицата {card} во листата {stack} на таблата {board}",
|
"{user} has added a description to card {card} in list {stack} on board {board}" : "{user} додаде опис на картицата {card} во листата {stack} на таблата {board}",
|
||||||
"You have updated the description of card {card} in list {stack} on board {board}" : "Го ажуриравте описот на картицата {card} во листата {stack} на таблата {board}",
|
"You have updated the description of card {card} in list {stack} on board {board}" : "Го ажуриравте описот на картицата {card} во листата {stack} на таблата {board}",
|
||||||
@@ -37,6 +37,10 @@ OC.L10N.register(
|
|||||||
"{user} has archived card {card} in list {stack} on board {board}" : "{user} ја архивираше картицата {card} во листата {stack} на таблата {board}",
|
"{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}",
|
"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}",
|
"{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}",
|
"You have removed the due date of card {card}" : "Го избришавте датумот на истекување на картицата {card}",
|
||||||
"{user} has removed the due date of card {card}" : "{user} го избриша датумот на истекување на картицата {card}",
|
"{user} has removed the due date of card {card}" : "{user} го избриша датумот на истекување на картицата {card}",
|
||||||
"You have set the due date of card {card} to {after}" : "Поставивте датум на истекување на картицата {card}",
|
"You have set the due date of card {card} to {after}" : "Поставивте датум на истекување на картицата {card}",
|
||||||
@@ -65,7 +69,9 @@ OC.L10N.register(
|
|||||||
"{user} has commented on card {card}" : "{user} коментирање на картицата {card}",
|
"{user} has commented on card {card}" : "{user} коментирање на картицата {card}",
|
||||||
"Deck" : "Deck",
|
"Deck" : "Deck",
|
||||||
"Changes in the <strong>Deck app</strong>" : "Промени во <strong>апликацијата Deck</strong>",
|
"Changes in the <strong>Deck app</strong>" : "Промени во <strong>апликацијата Deck</strong>",
|
||||||
|
"A <strong>board, list or card</strong> was changed" : "Променета е <strong>табла, листа или картица</strong>",
|
||||||
"A <strong>comment</strong> was created on a card" : "<strong>Коментар</strong> е креиран на картица",
|
"A <strong>comment</strong> was created on a card" : "<strong>Коментар</strong> е креиран на картица",
|
||||||
|
"A <strong>card description</strong> has been changed" : "Променет е <strong>опис на картица</strong> ",
|
||||||
"The file was uploaded" : "Датотеката е прикачена",
|
"The file was uploaded" : "Датотеката е прикачена",
|
||||||
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Подигнатата датотека ја надминува upload_max_filesize директивата во php.ini",
|
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Подигнатата датотека ја надминува upload_max_filesize директивата во php.ini",
|
||||||
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Големината на датотеката ја надминува MAX_FILE_SIZE директивата која беше специфицирана во HTML формата",
|
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Големината на датотеката ја надминува MAX_FILE_SIZE директивата која беше специфицирана во HTML формата",
|
||||||
@@ -75,35 +81,66 @@ OC.L10N.register(
|
|||||||
"Could not write file to disk" : "Неможе да се запишува на дискот",
|
"Could not write file to disk" : "Неможе да се запишува на дискот",
|
||||||
"A PHP extension stopped the file upload" : "PHP додаток го стопираше прикачувањето на датотеката",
|
"A PHP extension stopped the file upload" : "PHP додаток го стопираше прикачувањето на датотеката",
|
||||||
"No file uploaded or file size exceeds maximum of %s" : "Нема прикачена дадотека или големината го надмминува максимумот од %s",
|
"No file uploaded or file size exceeds maximum of %s" : "Нема прикачена дадотека или големината го надмминува максимумот од %s",
|
||||||
|
"Invalid file type. Only JSON files are allowed." : "Невалиден тип на датотека. Дозволени се само JSON датотеки.",
|
||||||
|
"Invalid JSON data" : "Невалидни JSON податоци",
|
||||||
|
"Failed to import board" : "Неуспешен увоз на табла",
|
||||||
|
"Cards due today" : "Картици со рок до денес",
|
||||||
|
"Cards due tomorrow" : "Картици со рок до утре",
|
||||||
"Upcoming cards" : "Престојни картици",
|
"Upcoming cards" : "Престојни картици",
|
||||||
"Load more" : "Вчитај повеќе",
|
"Load more" : "Вчитај повеќе",
|
||||||
|
"Welcome to Nextcloud Deck!" : "Добредојдовте во Nextcloud Deck!",
|
||||||
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "Картицата \"%s\" на \"%s\" ти е доделена од %s.",
|
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "Картицата \"%s\" на \"%s\" ти е доделена од %s.",
|
||||||
|
"{user} has assigned the card {deck-card} on {deck-board} to you." : "{user} ти ја додели картицата {deck-card} на {deck-board}.",
|
||||||
"The card \"%s\" on \"%s\" has reached its due date." : "Картицата \"%s\" на \"%s\" го достигна датумот на истекување.",
|
"The card \"%s\" on \"%s\" has reached its due date." : "Картицата \"%s\" на \"%s\" го достигна датумот на истекување.",
|
||||||
|
"The card {deck-card} on {deck-board} has reached its due date." : "Картицата {deck-card} на {deck-board} го достигна рокот.",
|
||||||
"%s has mentioned you in a comment on \"%s\"." : "%s те спомна во коментар на \"%s\".",
|
"%s has mentioned you in a comment on \"%s\"." : "%s те спомна во коментар на \"%s\".",
|
||||||
|
"{user} has mentioned you in a comment on {deck-card}." : "{user} те спомна во коментар на {deck-card}.",
|
||||||
"The board \"%s\" has been shared with you by %s." : "Таблата \"%s\" ја сподли со тебе %s.",
|
"The board \"%s\" has been shared with you by %s." : "Таблата \"%s\" ја сподли со тебе %s.",
|
||||||
|
"{user} has shared {deck-board} with you." : "{user} сподели {deck-board} со вас.",
|
||||||
|
"Deck board" : "Табла",
|
||||||
|
"Owned by %1$s" : "Сопственик %1$s",
|
||||||
|
"Deck boards, cards and comments" : "Табли, картици и коментари",
|
||||||
|
"From %1$s, in %2$s/%3$s, owned by %4$s" : "Од %1$s, во %2$s/%3$s, сопственик %4$s",
|
||||||
|
"Create a new deck card" : "Креирај нова картица",
|
||||||
|
"Card comments" : "Коментари на картица",
|
||||||
|
"%s on %s" : "%s на %s",
|
||||||
|
"Deck boards and cards" : "Табли и картици",
|
||||||
"No data was provided to create an attachment." : "Нема податоци за креирање на прилог.",
|
"No data was provided to create an attachment." : "Нема податоци за креирање на прилог.",
|
||||||
"Finished" : "Завршено",
|
"Finished" : "Завршено",
|
||||||
"To review" : "На ревизија",
|
"To review" : "На ревизија",
|
||||||
"Action needed" : "Потребна е акција",
|
"Action needed" : "Потребна е акција",
|
||||||
"Later" : "Покасно",
|
"Later" : "Покасно",
|
||||||
"copy" : "копирај",
|
"copy" : "копирај",
|
||||||
|
"Read more inside" : "Прочитај повеќе",
|
||||||
|
"Custom lists - click to rename!" : "Прилагодени листи – кликнете за преименување!",
|
||||||
"To Do" : "За правење",
|
"To Do" : "За правење",
|
||||||
|
"In Progress" : "Во тек",
|
||||||
"Done" : "Готово",
|
"Done" : "Готово",
|
||||||
|
"1. Open to learn more about boards and cards" : "1. Отворете за да дознаете повеќе за таблите и картичките",
|
||||||
|
"2. Drag cards left and right, up and down" : "2. Влечете ги картичките лево и десно, горе и долу",
|
||||||
|
"3. Apply rich formatting and link content" : "3. Применете богато форматирање и поврзете содржина",
|
||||||
|
"4. Share, comment and collaborate!" : "4. Споделувајте, коментирајте и соработувајте!",
|
||||||
|
"Create your first card!" : "Креирајте ја вашата прва картичка!",
|
||||||
|
"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Достапен е на линк: %s.",
|
||||||
"Attachments" : "Прилози",
|
"Attachments" : "Прилози",
|
||||||
"File" : "Датотека",
|
"File" : "Датотека",
|
||||||
|
"date" : "датум",
|
||||||
"Card not found" : "Картицата не е пронајдена",
|
"Card not found" : "Картицата не е пронајдена",
|
||||||
"Path is already shared with this card" : "Патеката веќе е споделена со оваа картица",
|
"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" : "Персонален планер и тимски проект организер",
|
"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" : "Deck е алатка за организација во стил на kanban, наменета за лични планови и организација на проекти за тимови интегрирани со Nextcloud.\n\n\n📥 Додај ги задачите на картички и подреди ги\n📄 Запиши дополнителни белешки во Markdown\n🔖 Додели етикети за уште подобра организација\n👥 Сподели со твојот тим, пријатели или семејство\n📎 Прикачи датотеки и вметни ги во Markdown описот\n💬 Дискутирај со твојот тим преку коментари\n⚡ Следи ги промените во активностите\n🚀 Организирај го твојот проект",
|
||||||
"Add board" : "Додади табла",
|
"Add board" : "Додади табла",
|
||||||
"Card details" : "Детали за картица",
|
"Card details" : "Детали за картица",
|
||||||
"Select the board to link to a project" : "Избери табла за поврзување со проект",
|
"Select the board to link to a project" : "Избери табла за поврзување со проект",
|
||||||
"Search by board title" : "Барај по име на табла",
|
"Search by board title" : "Барај по име на табла",
|
||||||
"Select board" : "Избери табла",
|
"Select board" : "Избери табла",
|
||||||
|
"Move/copy card" : "Премести/копирај картица",
|
||||||
"Select a board" : "Избери табла",
|
"Select a board" : "Избери табла",
|
||||||
"No lists available" : "Нема достапни листи",
|
"No lists available" : "Нема достапни листи",
|
||||||
"Select a list" : "Избери листа",
|
"Select a list" : "Избери листа",
|
||||||
"Move card" : "Премести картица",
|
"Move card" : "Премести картица",
|
||||||
|
"Copy card" : "Копирај картица",
|
||||||
"Select the card to link to a project" : "Избери картица за поврзување со проект",
|
"Select the card to link to a project" : "Избери картица за поврзување со проект",
|
||||||
"Link to card" : "Линк до картица",
|
"Link to card" : "Линк до картица",
|
||||||
"Select a card" : "Избери картица",
|
"Select a card" : "Избери картица",
|
||||||
@@ -124,6 +161,8 @@ OC.L10N.register(
|
|||||||
"Filter by tag" : "Филтрирај по ознака",
|
"Filter by tag" : "Филтрирај по ознака",
|
||||||
"Filter by assigned user" : "Филтрирај по назначени корисници",
|
"Filter by assigned user" : "Филтрирај по назначени корисници",
|
||||||
"Unassigned" : "Неназначени",
|
"Unassigned" : "Неназначени",
|
||||||
|
"Filter by status" : "Филтрирај по статус",
|
||||||
|
"Open and completed" : "Отворени и завршени",
|
||||||
"Open" : "Отвори",
|
"Open" : "Отвори",
|
||||||
"Completed" : "Завршено",
|
"Completed" : "Завршено",
|
||||||
"Filter by due date" : "Филтрирај по краен рок",
|
"Filter by due date" : "Филтрирај по краен рок",
|
||||||
@@ -133,12 +172,17 @@ OC.L10N.register(
|
|||||||
"Next 30 days" : "Следни 30 дена",
|
"Next 30 days" : "Следни 30 дена",
|
||||||
"No due date" : "Нема краен рок",
|
"No due date" : "Нема краен рок",
|
||||||
"Clear filter" : "Исчисти филтри",
|
"Clear filter" : "Исчисти филтри",
|
||||||
|
"View Modes" : "Режими на приказ",
|
||||||
|
"Toggle View Modes" : "Промени режими на приказ",
|
||||||
"Hide archived cards" : "Сокриј ги архивираните картици",
|
"Hide archived cards" : "Сокриј ги архивираните картици",
|
||||||
"Show archived cards" : "Прикажи ги архивираните картици",
|
"Show archived cards" : "Прикажи ги архивираните картици",
|
||||||
"Toggle compact mode" : "Вклучи компактен мод",
|
"Toggle compact mode" : "Вклучи компактен мод",
|
||||||
|
"Hide card cover images" : "Сокриј насловни слики на картици",
|
||||||
|
"Show card cover images" : "Прикажи насловни слики на картици",
|
||||||
"Open details" : "Отвори детали",
|
"Open details" : "Отвори детали",
|
||||||
"Details" : "Детали",
|
"Details" : "Детали",
|
||||||
"Loading board" : "Вчирување на табла",
|
"Currently present people" : "Моментално приситни корисници",
|
||||||
|
"Loading board" : "Вчитување на табла",
|
||||||
"Board not found" : "Таблата не е пронајдена",
|
"Board not found" : "Таблата не е пронајдена",
|
||||||
"Create a new list to add cards to this board" : "Додадете нова листа за да додадете картици на таблата",
|
"Create a new list to add cards to this board" : "Додадете нова листа за да додадете картици на таблата",
|
||||||
"Sharing" : "Споделување",
|
"Sharing" : "Споделување",
|
||||||
@@ -149,51 +193,69 @@ OC.L10N.register(
|
|||||||
"Undo" : "Врати",
|
"Undo" : "Врати",
|
||||||
"Deleted cards" : "Избришани картици",
|
"Deleted cards" : "Избришани картици",
|
||||||
"Failed to create share with {displayName}" : "Неможе да се сподели со {displayName}",
|
"Failed to create share with {displayName}" : "Неможе да се сподели со {displayName}",
|
||||||
|
"Are you sure you want to transfer the board {title} to {user}?" : "Дали сте сигурни дека сакате да ја префрлите таблата {title} на {user}?",
|
||||||
|
"Transfer the board." : "Префрли табла.",
|
||||||
"Transfer" : "Трансфер",
|
"Transfer" : "Трансфер",
|
||||||
|
"The board has been transferred to {user}" : "Таблата е префрлена на {user}",
|
||||||
|
"Failed to transfer the board to {user}" : "Неуспешно префрлање на таблата на {user}",
|
||||||
|
"Share board with a user, group or team …" : "Сподели табла со корисник, група или тим...",
|
||||||
|
"Searching for users, groups and teams …" : "Пребарување на корисници, групи или тимови...",
|
||||||
"No participants found" : "Не се пронајдени учесници",
|
"No participants found" : "Не се пронајдени учесници",
|
||||||
"Board owner" : "Сопственик на таблата",
|
"Board owner" : "Сопственик на таблата",
|
||||||
"(Group)" : "(Група)",
|
"(Group)" : "(Група)",
|
||||||
|
"(Team)" : "(Тим)",
|
||||||
"Can edit" : "Може да се уредува",
|
"Can edit" : "Може да се уредува",
|
||||||
"Can share" : "Can share",
|
"Can share" : "Can share",
|
||||||
"Can manage" : "Може да ја менаџира",
|
"Can manage" : "Може да ја менаџира",
|
||||||
"Owner" : "Сопственик",
|
"Owner" : "Сопственик",
|
||||||
"Delete" : "Избриши",
|
"Delete" : "Избриши",
|
||||||
"List deleted" : "Листата е избришана",
|
"List deleted" : "Листата е избришана",
|
||||||
|
"Edit list title" : "Удери наслов на листата",
|
||||||
"Archive all cards" : "Архивирај ги сите картици",
|
"Archive all cards" : "Архивирај ги сите картици",
|
||||||
|
"Unarchive all cards" : "Врати ги од архива сите картици",
|
||||||
"Delete list" : "Избриши листа",
|
"Delete list" : "Избриши листа",
|
||||||
"Archive all cards in this list" : "Архивирај ги сите картици во листата",
|
"Archive all cards in this list" : "Архивирај ги сите картици во листата",
|
||||||
|
"Unarchive all cards in this list" : "Врати ги од архива сите картици во оваа листа",
|
||||||
"Add a new card" : "Додади нова картица",
|
"Add a new card" : "Додади нова картица",
|
||||||
"Card name" : "Име на картицата",
|
"Card name" : "Име на картицата",
|
||||||
"title and color value must be provided" : "наслов и боја мора да се приложи",
|
"title and color value must be provided" : "Мора да се внесе наслов и боја",
|
||||||
"Edit" : "Уреди",
|
"Edit" : "Уреди",
|
||||||
"Add a new tag" : "Додади нова ознака",
|
"Add a new tag" : "Додади нова ознака",
|
||||||
"Board name" : "Име на табла",
|
"Board name" : "Име на табла",
|
||||||
"Members" : "Членови",
|
"Members" : "Членови",
|
||||||
|
"Assign to users/groups/team" : "Додели на корисници/групи/тимови",
|
||||||
"Assign a user to this card…" : "Додели корисник на оваа картица...",
|
"Assign a user to this card…" : "Додели корисник на оваа картица...",
|
||||||
|
"Select a user to assign to this card…" : "Избери на кого да се додели оваа картица…",
|
||||||
"File to share" : "Датотека за споделување",
|
"File to share" : "Датотека за споделување",
|
||||||
"Invalid path selected" : "Избрана невалидна патека",
|
"Invalid path selected" : "Избрана невалидна патека",
|
||||||
"Upload new files" : "Прикачи нови датотеки",
|
"Upload new files" : "Прикачи нови датотеки",
|
||||||
"Share from Files" : "Сподели од датотеките",
|
"Share from Files" : "Сподели од датотеките",
|
||||||
|
"Pending share" : "Споделување на чекање",
|
||||||
"Add this attachment" : "Додади го овој прилог",
|
"Add this attachment" : "Додади го овој прилог",
|
||||||
"Show in Files" : "Прикажи во датотеките",
|
"Show in Files" : "Прикажи во датотеките",
|
||||||
"Download" : "Преземи",
|
"Download" : "Преземи",
|
||||||
|
"Remove attachment" : "Отстрани прилог",
|
||||||
"Delete Attachment" : "Избриши прилог",
|
"Delete Attachment" : "Избриши прилог",
|
||||||
"Restore Attachment" : "Врати прилог",
|
"Restore Attachment" : "Врати прилог",
|
||||||
"Modified" : "Изменето",
|
"Modified" : "Изменето",
|
||||||
"Created" : "Креирано",
|
"Created" : "Креирано",
|
||||||
"The title cannot be empty." : "Насловот неможе да биде празен.",
|
"The title cannot be empty." : "Насловот неможе да биде празен.",
|
||||||
|
"Cannot close unsaved card!" : "Неможе да се затвори незачувана картица!",
|
||||||
"Open in sidebar view" : "Отвори страничен поглед",
|
"Open in sidebar view" : "Отвори страничен поглед",
|
||||||
"Open in bigger view" : "Отвори на голем екран",
|
"Open in bigger view" : "Отвори на голем екран",
|
||||||
"Comments" : "Коментари",
|
"Comments" : "Коментари",
|
||||||
|
"Failed to load comments" : "Неуспешно вчитување на коментари",
|
||||||
"No comments yet. Begin the discussion!" : "Сеуште нема коментари. Започни дискусија!",
|
"No comments yet. Begin the discussion!" : "Сеуште нема коментари. Започни дискусија!",
|
||||||
"The comment cannot be empty." : "Коментарот неможе да биде празен.",
|
"The comment cannot be empty." : "Коментарот неможе да биде празен.",
|
||||||
"The comment cannot be longer than 1000 characters." : "Коментарот неможе да биде поголем од 1000 карактери.",
|
"The comment cannot be longer than 1000 characters." : "Коментарот неможе да биде поголем од 1000 карактери.",
|
||||||
"Save" : "Зачувај",
|
"Save" : "Зачувај",
|
||||||
"Created:" : "Создадено:",
|
"Created:" : "Создадено:",
|
||||||
"In reply to" : "Како одговор на",
|
"In reply to" : "Како одговор на",
|
||||||
|
"Cancel reply" : "Откажи одговор",
|
||||||
"Reply" : "Одговор",
|
"Reply" : "Одговор",
|
||||||
"Update" : "Ажурирај",
|
"Update" : "Ажурирај",
|
||||||
"Write a description …" : "Напиши опис ...",
|
"Write a description …" : "Напиши опис ...",
|
||||||
|
"Could not save description" : "Неможе да се зачува описот",
|
||||||
"Description" : "Опис",
|
"Description" : "Опис",
|
||||||
"(Unsaved)" : "(Незачувано)",
|
"(Unsaved)" : "(Незачувано)",
|
||||||
"(Saving…)" : "(Снимање…)",
|
"(Saving…)" : "(Снимање…)",
|
||||||
@@ -204,63 +266,135 @@ OC.L10N.register(
|
|||||||
"Choose attachment" : "Избери прилог",
|
"Choose attachment" : "Избери прилог",
|
||||||
"Select Date" : "Избери датум",
|
"Select Date" : "Избери датум",
|
||||||
"Later today – {timeLocale}" : "Денес покасно – {timeLocale}",
|
"Later today – {timeLocale}" : "Денес покасно – {timeLocale}",
|
||||||
|
"Set due date for later today" : "Постави краен рок за денес подоцна",
|
||||||
"Tomorrow – {timeLocale}" : "Утре – {timeLocale}",
|
"Tomorrow – {timeLocale}" : "Утре – {timeLocale}",
|
||||||
|
"Set due date for tomorrow" : "Постави краен рок за утре",
|
||||||
|
"This weekend – {timeLocale}" : "Овој викенд – {timeLocale}",
|
||||||
|
"Set due date for this weekend" : "Постави краен рок за овој викенд",
|
||||||
|
"Next week – {timeLocale}" : "Следна недела – {timeLocale}",
|
||||||
|
"Set due date for next week" : "Постави краен рок за следната недела",
|
||||||
|
"Assign a due date to this card…" : "Додели рок за оваа картица…",
|
||||||
"Set a due date" : "Постави краен рок",
|
"Set a due date" : "Постави краен рок",
|
||||||
|
"Add due date" : "Додади краен рок",
|
||||||
|
"Choose a date" : "Избери датум",
|
||||||
"Remove due date" : "Отстрани краен рок",
|
"Remove due date" : "Отстрани краен рок",
|
||||||
"Mark as done" : "Означи како готово",
|
"Mark as done" : "Означи како готово",
|
||||||
|
"Due at:" : "Краен рок:",
|
||||||
|
"Not done" : "Не е завршено",
|
||||||
"Unarchive card" : "Врати картица од архива",
|
"Unarchive card" : "Врати картица од архива",
|
||||||
"Archive card" : "Архивирај картица",
|
"Archive card" : "Архивирај картица",
|
||||||
"Assign a tag to this card…" : "Додади ознака на оваа картица...",
|
"Assign a tag to this card…" : "Додади ознака на оваа картица...",
|
||||||
|
"Select or create a tag…" : "Избери или креирај ознака...",
|
||||||
|
"Create a new tag:" : "Направи нова ознака:",
|
||||||
"(group)" : "(group)",
|
"(group)" : "(group)",
|
||||||
|
"{count} comments, {unread} unread" : "{count} коментари, {unread} непрочитани",
|
||||||
|
"Todo items" : "Работи за правење",
|
||||||
|
"Edit card title" : "Измени наслов на картица",
|
||||||
|
"Open link" : "Отвори линк",
|
||||||
"Card deleted" : "Картицата е избришана",
|
"Card deleted" : "Картицата е избришана",
|
||||||
"Edit title" : "Удери наслов",
|
"Edit title" : "Удери наслов",
|
||||||
"Assign to me" : "Доделени мене",
|
"Assign to me" : "Доделени мене",
|
||||||
"Unassign myself" : "Откажи се",
|
"Unassign myself" : "Откажи се",
|
||||||
|
"Mark as not done" : "Означи како не-готово",
|
||||||
"Delete card" : "Избриши картица",
|
"Delete card" : "Избриши картица",
|
||||||
"seconds ago" : "пред неколку секунди",
|
"seconds ago" : "пред неколку секунди",
|
||||||
"Keyboard shortcuts" : "Кратенки преку тастатура",
|
"Keyboard shortcuts" : "Кратенки преку тастатура",
|
||||||
|
"Boost your productivity using Deck with keyboard shortcuts." : "Зголеми ја продуктивноста со користење на кратенки преку тастатура.",
|
||||||
|
"Board actions" : "Акции за табла",
|
||||||
"Keyboard shortcut" : "Кратенка преку тастатура",
|
"Keyboard shortcut" : "Кратенка преку тастатура",
|
||||||
|
"Action" : "Акција",
|
||||||
"Shift" : "Shift",
|
"Shift" : "Shift",
|
||||||
|
"Scroll" : "Scroll",
|
||||||
|
"Scroll sideways" : "Лизгај странично",
|
||||||
|
"Navigate between cards" : "Навигација помеѓу картиците",
|
||||||
|
"Esc" : "Esc",
|
||||||
|
"Close card details" : "Затвори детали на картица",
|
||||||
"Ctrl" : "Ctrl",
|
"Ctrl" : "Ctrl",
|
||||||
"Search" : "Барај",
|
"Search" : "Барај",
|
||||||
|
"Show card filters" : "Прикажи филтри за картици",
|
||||||
|
"Clear card filters" : "Исчисти филтри за картици",
|
||||||
|
"Show help dialog" : "Прикажи дијалог за помош",
|
||||||
|
"Card actions" : "Акции за картици",
|
||||||
|
"The following actions can be triggered on the currently highlighted card" : "Следните акции можат да се активираат на моментално обележаната картичка",
|
||||||
|
"Enter" : "Ентер",
|
||||||
"Space" : "Празно место",
|
"Space" : "Празно место",
|
||||||
|
"Open card details" : "Отвори детали на картица",
|
||||||
|
"Edit the card title" : "Измени наслов на картица",
|
||||||
|
"Assign yourself to the current card" : "Доделете се себеси на тековната картица",
|
||||||
|
"Archive/unarchive the current card" : "Архивирај/одархивирај тековната картица",
|
||||||
|
"Mark card as completed/not completed" : "Означи ја картицата како завршена/незавршена",
|
||||||
|
"Open card menu" : "Отвори мени на картица",
|
||||||
"All boards" : "Сите табли",
|
"All boards" : "Сите табли",
|
||||||
"Archived boards" : "Архивирани табли",
|
"Archived boards" : "Архивирани табли",
|
||||||
"Shared with you" : "Споделено со тебе",
|
"Shared with you" : "Споделено со тебе",
|
||||||
|
"Deck settings" : "Deck параметри",
|
||||||
"Use bigger card view" : "Користи поголем преглед на картици",
|
"Use bigger card view" : "Користи поголем преглед на картици",
|
||||||
|
"Show card ID badge" : "Прикажи ID на картиците",
|
||||||
"Show boards in calendar/tasks" : "Прикажи ги таблите во календарнот",
|
"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." : "Корисниците кој што не се во овие групи нема да можат да прават нови таби, но ќе можат да работат на таблите кој ќе бидат споделени со нив.",
|
||||||
"Cancel edit" : "Откажи ажурирање",
|
"Cancel edit" : "Откажи ажурирање",
|
||||||
|
"Save board" : "Зачувај табла",
|
||||||
"Board {0} deleted" : "Таблата {0} е избришана",
|
"Board {0} deleted" : "Таблата {0} е избришана",
|
||||||
"All cards" : "Сите картици",
|
"All cards" : "Сите картици",
|
||||||
"Only assigned cards" : "Само доделени картици",
|
"Only assigned cards" : "Само доделени картици",
|
||||||
"No reminder" : "Нема потсетник",
|
"No reminder" : "Нема потсетник",
|
||||||
"An error occurred" : "Настана грешка",
|
"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?" : "Бришење на таблата?",
|
"Delete the board?" : "Бришење на таблата?",
|
||||||
|
"Exporting board..." : "Извоз на табла...",
|
||||||
"Board details" : "Детали за таблата",
|
"Board details" : "Детали за таблата",
|
||||||
"Edit board" : "Измени табла",
|
"Edit board" : "Измени табла",
|
||||||
"Clone board" : "Клонирај табла",
|
"Clone board" : "Клонирај табла",
|
||||||
"Unarchive board" : "Врати табла од архива",
|
"Unarchive board" : "Врати табла од архива",
|
||||||
"Archive board" : "Архивирај табла",
|
"Archive board" : "Архивирај табла",
|
||||||
|
"Export board" : "Извези табла",
|
||||||
"Turn on due date reminders" : "Вклучи потсетници за крајните рокови",
|
"Turn on due date reminders" : "Вклучи потсетници за крајните рокови",
|
||||||
"Turn off due date reminders" : "Исклучи потсетници за крајните рокови",
|
"Turn off due date reminders" : "Исклучи потсетници за крајните рокови",
|
||||||
"Due date reminders" : "Потсетници за крајните рокови",
|
"Due date reminders" : "Потсетници за крајните рокови",
|
||||||
"Assigned cards" : "Доделени картици",
|
"Assigned cards" : "Доделени картици",
|
||||||
"No notifications" : "Нема известувања",
|
"No notifications" : "Нема известувања",
|
||||||
"Delete board" : "Избриши табла",
|
"Delete board" : "Избриши табла",
|
||||||
|
"Importing board..." : "Увезување табла...",
|
||||||
|
"Board imported successfully" : "Таблата е успешно увезена",
|
||||||
|
"Import board" : "Увези табла",
|
||||||
|
"Clone {boardTitle}" : "Клонирај {boardTitle}",
|
||||||
"Clone cards" : "Клинирај картици",
|
"Clone cards" : "Клинирај картици",
|
||||||
|
"Clone assignments" : "Клонирај задачи",
|
||||||
|
"Clone labels" : "Клонирај ознаки",
|
||||||
|
"Clone due dates" : "Клонирај крајни рокови",
|
||||||
"Advanced options" : "Напредни опции",
|
"Advanced options" : "Напредни опции",
|
||||||
|
"Move all cards to the first list" : "Помести ги сите картици во првата листа",
|
||||||
|
"Restore archived cards" : "Врати архивирани картици",
|
||||||
"Clone" : "Клонирај",
|
"Clone" : "Клонирај",
|
||||||
|
"Export {boardTitle}" : "Извези {boardTitle}",
|
||||||
|
"Export as JSON" : "Извези како JSON",
|
||||||
|
"Export as CSV" : "Извези како CSV",
|
||||||
|
"Note: Only the JSON format is supported for importing back into the Deck app." : "Забелешка: Поддржан е само JSON формат за увоз назад во апликацијата Deck.",
|
||||||
"Export" : "Извези",
|
"Export" : "Извези",
|
||||||
"Loading filtered view" : "Вчитување на филтриран поглед",
|
"Loading filtered view" : "Вчитување на филтриран поглед",
|
||||||
|
"Search for {searchQuery} in other boards" : "Барај {searchQuery} во други табли",
|
||||||
|
"Search for {searchQuery} in all boards" : "Барај {searchQuery} во сите табли",
|
||||||
"No results found" : "Нема пронајдено резултати",
|
"No results found" : "Нема пронајдено резултати",
|
||||||
|
"Deck board {name}\n* Last modified on {lastMod}" : "Табла {name}\n* Последна промена на {lastMod}",
|
||||||
|
"* Created on {created}\n* Last modified on {lastMod}\n* {nbAttachments} attachments\n* {nbComments} comments" : "* Креирана на {created}\n* Последна промена на {lastMod}\n* {nbAttachments} прилози\n* {nbComments} коментари",
|
||||||
|
"{nbCards} cards" : "{nbCards} картици",
|
||||||
|
"Due on {date}" : "Истекува на {date}",
|
||||||
"{stack} in {board}" : "{stack} во {board}",
|
"{stack} in {board}" : "{stack} во {board}",
|
||||||
|
"Click to expand description" : "Кликнни за проширување на опис",
|
||||||
|
"Click to expand comment" : "Кликнни за проширување на коментарот",
|
||||||
"Create card" : "Креирајте картица",
|
"Create card" : "Креирајте картица",
|
||||||
"Create a new card" : "Креирајте нова картица",
|
"Create a new card" : "Креирајте нова картица",
|
||||||
"Card title" : "Наслов на картицата",
|
"Card title" : "Наслов на картицата",
|
||||||
|
"Creating the new card …" : "Креирање нова картица ...",
|
||||||
|
"Card \"{card}\" was added to \"{board}\"" : "Картицата \"{card}\" е додадена во \"{board}\"",
|
||||||
"Open card" : "Отвори картица",
|
"Open card" : "Отвори картица",
|
||||||
"Close" : "Затвори",
|
"Close" : "Затвори",
|
||||||
"No upcoming cards" : "Нема престојни картици",
|
"No upcoming cards" : "Нема престојни картици",
|
||||||
|
"upcoming cards today" : "престојни картици за денес",
|
||||||
|
"upcoming cards tomorrow" : "престојни картици за утре",
|
||||||
"upcoming cards" : "престојни картици",
|
"upcoming cards" : "престојни картици",
|
||||||
|
"New card" : "Нова картица",
|
||||||
"Link to a board" : "Линк до табла",
|
"Link to a board" : "Линк до табла",
|
||||||
"Link to a card" : "Линк до картица",
|
"Link to a card" : "Линк до картица",
|
||||||
"Create a card" : "Креирајте картица",
|
"Create a card" : "Креирајте картица",
|
||||||
@@ -268,6 +402,7 @@ OC.L10N.register(
|
|||||||
"Something went wrong" : "Нешто не е во ред",
|
"Something went wrong" : "Нешто не е во ред",
|
||||||
"Failed to upload {name}" : "Неуспешно прикачување {name}",
|
"Failed to upload {name}" : "Неуспешно прикачување {name}",
|
||||||
"Maximum file size of {size} exceeded" : "Максималната големина на датотека од {size} е достигната",
|
"Maximum file size of {size} exceeded" : "Максималната големина на датотека од {size} е достигната",
|
||||||
|
"Assigned users" : "Доделени корисници",
|
||||||
"Due date" : "До датум",
|
"Due date" : "До датум",
|
||||||
"Error creating the share" : "Грешка при креирање на споделување",
|
"Error creating the share" : "Грешка при креирање на споделување",
|
||||||
"Share with a Deck card" : "Споделено со Deck картица",
|
"Share with a Deck card" : "Споделено со Deck картица",
|
||||||
|
|||||||
145
l10n/mk.json
145
l10n/mk.json
@@ -10,7 +10,7 @@
|
|||||||
"You have removed {acl} from the board {board}" : "Го избришавте {acl} од таблата {board}",
|
"You have removed {acl} from the board {board}" : "Го избришавте {acl} од таблата {board}",
|
||||||
"{user} has removed {acl} from the board {board}" : "{user} го избриша {acl} од таблата {board}",
|
"{user} has removed {acl} from the board {board}" : "{user} го избриша {acl} од таблата {board}",
|
||||||
"You have renamed the board {before} to {board}" : "Ја преименувавте таблата {before} во {board}",
|
"You have renamed the board {before} to {board}" : "Ја преименувавте таблата {before} во {board}",
|
||||||
"{user} has renamed the board {before} to {board}" : "{user} ја преименување таблата {before} во {board}",
|
"{user} has renamed the board {before} to {board}" : "{user} ја преименуваше таблата {before} во {board}",
|
||||||
"You have archived the board {board}" : "Ја архивиравте таблата {board}",
|
"You have archived the board {board}" : "Ја архивиравте таблата {board}",
|
||||||
"{user} has archived the board {before}" : "{user} ја архивирање таблата {before}",
|
"{user} has archived the board {before}" : "{user} ја архивирање таблата {before}",
|
||||||
"You have unarchived the board {board}" : "Ја вративте од архива таблата {board}",
|
"You have unarchived the board {board}" : "Ја вративте од архива таблата {board}",
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
"You have created a new list {stack} on board {board}" : "Креиравте нова листа {stack} на таблата {board}",
|
"You have created a new list {stack} on board {board}" : "Креиравте нова листа {stack} на таблата {board}",
|
||||||
"{user} has created a new list {stack} on board {board}" : "{user} креирање нова листа {stack} на таблата {board}",
|
"{user} has created a new list {stack} on board {board}" : "{user} креирање нова листа {stack} на таблата {board}",
|
||||||
"You have renamed list {before} to {stack} on board {board}" : "Ја преименувавте листа {before} во {stack} на таблата {board}",
|
"You have renamed list {before} to {stack} on board {board}" : "Ја преименувавте листа {before} во {stack} на таблата {board}",
|
||||||
"{user} has renamed list {before} to {stack} on board {board}" : "{user} ја преименување листата {before} во {stack} на таблата {board}",
|
"{user} has renamed list {before} to {stack} on board {board}" : "{user} ја преименуваше листата {before} во {stack} на таблата {board}",
|
||||||
"You have deleted list {stack} on board {board}" : "Ја избришавте листата {stack} од таблата {board}",
|
"You have deleted list {stack} on board {board}" : "Ја избришавте листата {stack} од таблата {board}",
|
||||||
"{user} has deleted list {stack} on board {board}" : "{user} ја избриша листата {stack} од таблата {board}",
|
"{user} has deleted list {stack} on board {board}" : "{user} ја избриша листата {stack} од таблата {board}",
|
||||||
"You have created card {card} in list {stack} on board {board}" : "Креиравте картица {card} во листата {stack} на таблата {board}",
|
"You have created card {card} in list {stack} on board {board}" : "Креиравте картица {card} во листата {stack} на таблата {board}",
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
"You have deleted card {card} in list {stack} on board {board}" : "Избришавте картица {card} во листата {stack} на таблата {board}",
|
"You have deleted card {card} in list {stack} on board {board}" : "Избришавте картица {card} во листата {stack} на таблата {board}",
|
||||||
"{user} has deleted card {card} in list {stack} on board {board}" : "{user} избриша картица {card} во листата {stack} на таблата {board}",
|
"{user} has deleted card {card} in list {stack} on board {board}" : "{user} избриша картица {card} во листата {stack} на таблата {board}",
|
||||||
"You have renamed the card {before} to {card}" : "Ја преименувавте картицата {before} во {card}",
|
"You have renamed the card {before} to {card}" : "Ја преименувавте картицата {before} во {card}",
|
||||||
"{user} has renamed the card {before} to {card}" : "{user} ја преименување картицата {before} во {card}",
|
"{user} has renamed the card {before} to {card}" : "{user} ја преименуваше картицата {before} во {card}",
|
||||||
"You have added a description to card {card} in list {stack} on board {board}" : "Додадовте опис на картицата {card} во листата {stack} на таблата {board}",
|
"You have added a description to card {card} in list {stack} on board {board}" : "Додадовте опис на картицата {card} во листата {stack} на таблата {board}",
|
||||||
"{user} has added a description to card {card} in list {stack} on board {board}" : "{user} додаде опис на картицата {card} во листата {stack} на таблата {board}",
|
"{user} has added a description to card {card} in list {stack} on board {board}" : "{user} додаде опис на картицата {card} во листата {stack} на таблата {board}",
|
||||||
"You have updated the description of card {card} in list {stack} on board {board}" : "Го ажуриравте описот на картицата {card} во листата {stack} на таблата {board}",
|
"You have updated the description of card {card} in list {stack} on board {board}" : "Го ажуриравте описот на картицата {card} во листата {stack} на таблата {board}",
|
||||||
@@ -35,6 +35,10 @@
|
|||||||
"{user} has archived card {card} in list {stack} on board {board}" : "{user} ја архивираше картицата {card} во листата {stack} на таблата {board}",
|
"{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}",
|
"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}",
|
"{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}",
|
"You have removed the due date of card {card}" : "Го избришавте датумот на истекување на картицата {card}",
|
||||||
"{user} has removed the due date of card {card}" : "{user} го избриша датумот на истекување на картицата {card}",
|
"{user} has removed the due date of card {card}" : "{user} го избриша датумот на истекување на картицата {card}",
|
||||||
"You have set the due date of card {card} to {after}" : "Поставивте датум на истекување на картицата {card}",
|
"You have set the due date of card {card} to {after}" : "Поставивте датум на истекување на картицата {card}",
|
||||||
@@ -63,7 +67,9 @@
|
|||||||
"{user} has commented on card {card}" : "{user} коментирање на картицата {card}",
|
"{user} has commented on card {card}" : "{user} коментирање на картицата {card}",
|
||||||
"Deck" : "Deck",
|
"Deck" : "Deck",
|
||||||
"Changes in the <strong>Deck app</strong>" : "Промени во <strong>апликацијата Deck</strong>",
|
"Changes in the <strong>Deck app</strong>" : "Промени во <strong>апликацијата Deck</strong>",
|
||||||
|
"A <strong>board, list or card</strong> was changed" : "Променета е <strong>табла, листа или картица</strong>",
|
||||||
"A <strong>comment</strong> was created on a card" : "<strong>Коментар</strong> е креиран на картица",
|
"A <strong>comment</strong> was created on a card" : "<strong>Коментар</strong> е креиран на картица",
|
||||||
|
"A <strong>card description</strong> has been changed" : "Променет е <strong>опис на картица</strong> ",
|
||||||
"The file was uploaded" : "Датотеката е прикачена",
|
"The file was uploaded" : "Датотеката е прикачена",
|
||||||
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Подигнатата датотека ја надминува upload_max_filesize директивата во php.ini",
|
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "Подигнатата датотека ја надминува upload_max_filesize директивата во php.ini",
|
||||||
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Големината на датотеката ја надминува MAX_FILE_SIZE директивата која беше специфицирана во HTML формата",
|
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Големината на датотеката ја надминува MAX_FILE_SIZE директивата која беше специфицирана во HTML формата",
|
||||||
@@ -73,35 +79,66 @@
|
|||||||
"Could not write file to disk" : "Неможе да се запишува на дискот",
|
"Could not write file to disk" : "Неможе да се запишува на дискот",
|
||||||
"A PHP extension stopped the file upload" : "PHP додаток го стопираше прикачувањето на датотеката",
|
"A PHP extension stopped the file upload" : "PHP додаток го стопираше прикачувањето на датотеката",
|
||||||
"No file uploaded or file size exceeds maximum of %s" : "Нема прикачена дадотека или големината го надмминува максимумот од %s",
|
"No file uploaded or file size exceeds maximum of %s" : "Нема прикачена дадотека или големината го надмминува максимумот од %s",
|
||||||
|
"Invalid file type. Only JSON files are allowed." : "Невалиден тип на датотека. Дозволени се само JSON датотеки.",
|
||||||
|
"Invalid JSON data" : "Невалидни JSON податоци",
|
||||||
|
"Failed to import board" : "Неуспешен увоз на табла",
|
||||||
|
"Cards due today" : "Картици со рок до денес",
|
||||||
|
"Cards due tomorrow" : "Картици со рок до утре",
|
||||||
"Upcoming cards" : "Престојни картици",
|
"Upcoming cards" : "Престојни картици",
|
||||||
"Load more" : "Вчитај повеќе",
|
"Load more" : "Вчитај повеќе",
|
||||||
|
"Welcome to Nextcloud Deck!" : "Добредојдовте во Nextcloud Deck!",
|
||||||
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "Картицата \"%s\" на \"%s\" ти е доделена од %s.",
|
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "Картицата \"%s\" на \"%s\" ти е доделена од %s.",
|
||||||
|
"{user} has assigned the card {deck-card} on {deck-board} to you." : "{user} ти ја додели картицата {deck-card} на {deck-board}.",
|
||||||
"The card \"%s\" on \"%s\" has reached its due date." : "Картицата \"%s\" на \"%s\" го достигна датумот на истекување.",
|
"The card \"%s\" on \"%s\" has reached its due date." : "Картицата \"%s\" на \"%s\" го достигна датумот на истекување.",
|
||||||
|
"The card {deck-card} on {deck-board} has reached its due date." : "Картицата {deck-card} на {deck-board} го достигна рокот.",
|
||||||
"%s has mentioned you in a comment on \"%s\"." : "%s те спомна во коментар на \"%s\".",
|
"%s has mentioned you in a comment on \"%s\"." : "%s те спомна во коментар на \"%s\".",
|
||||||
|
"{user} has mentioned you in a comment on {deck-card}." : "{user} те спомна во коментар на {deck-card}.",
|
||||||
"The board \"%s\" has been shared with you by %s." : "Таблата \"%s\" ја сподли со тебе %s.",
|
"The board \"%s\" has been shared with you by %s." : "Таблата \"%s\" ја сподли со тебе %s.",
|
||||||
|
"{user} has shared {deck-board} with you." : "{user} сподели {deck-board} со вас.",
|
||||||
|
"Deck board" : "Табла",
|
||||||
|
"Owned by %1$s" : "Сопственик %1$s",
|
||||||
|
"Deck boards, cards and comments" : "Табли, картици и коментари",
|
||||||
|
"From %1$s, in %2$s/%3$s, owned by %4$s" : "Од %1$s, во %2$s/%3$s, сопственик %4$s",
|
||||||
|
"Create a new deck card" : "Креирај нова картица",
|
||||||
|
"Card comments" : "Коментари на картица",
|
||||||
|
"%s on %s" : "%s на %s",
|
||||||
|
"Deck boards and cards" : "Табли и картици",
|
||||||
"No data was provided to create an attachment." : "Нема податоци за креирање на прилог.",
|
"No data was provided to create an attachment." : "Нема податоци за креирање на прилог.",
|
||||||
"Finished" : "Завршено",
|
"Finished" : "Завршено",
|
||||||
"To review" : "На ревизија",
|
"To review" : "На ревизија",
|
||||||
"Action needed" : "Потребна е акција",
|
"Action needed" : "Потребна е акција",
|
||||||
"Later" : "Покасно",
|
"Later" : "Покасно",
|
||||||
"copy" : "копирај",
|
"copy" : "копирај",
|
||||||
|
"Read more inside" : "Прочитај повеќе",
|
||||||
|
"Custom lists - click to rename!" : "Прилагодени листи – кликнете за преименување!",
|
||||||
"To Do" : "За правење",
|
"To Do" : "За правење",
|
||||||
|
"In Progress" : "Во тек",
|
||||||
"Done" : "Готово",
|
"Done" : "Готово",
|
||||||
|
"1. Open to learn more about boards and cards" : "1. Отворете за да дознаете повеќе за таблите и картичките",
|
||||||
|
"2. Drag cards left and right, up and down" : "2. Влечете ги картичките лево и десно, горе и долу",
|
||||||
|
"3. Apply rich formatting and link content" : "3. Применете богато форматирање и поврзете содржина",
|
||||||
|
"4. Share, comment and collaborate!" : "4. Споделувајте, коментирајте и соработувајте!",
|
||||||
|
"Create your first card!" : "Креирајте ја вашата прва картичка!",
|
||||||
|
"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Достапен е на линк: %s.",
|
||||||
"Attachments" : "Прилози",
|
"Attachments" : "Прилози",
|
||||||
"File" : "Датотека",
|
"File" : "Датотека",
|
||||||
|
"date" : "датум",
|
||||||
"Card not found" : "Картицата не е пронајдена",
|
"Card not found" : "Картицата не е пронајдена",
|
||||||
"Path is already shared with this card" : "Патеката веќе е споделена со оваа картица",
|
"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" : "Персонален планер и тимски проект организер",
|
"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" : "Deck е алатка за организација во стил на kanban, наменета за лични планови и организација на проекти за тимови интегрирани со Nextcloud.\n\n\n📥 Додај ги задачите на картички и подреди ги\n📄 Запиши дополнителни белешки во Markdown\n🔖 Додели етикети за уште подобра организација\n👥 Сподели со твојот тим, пријатели или семејство\n📎 Прикачи датотеки и вметни ги во Markdown описот\n💬 Дискутирај со твојот тим преку коментари\n⚡ Следи ги промените во активностите\n🚀 Организирај го твојот проект",
|
||||||
"Add board" : "Додади табла",
|
"Add board" : "Додади табла",
|
||||||
"Card details" : "Детали за картица",
|
"Card details" : "Детали за картица",
|
||||||
"Select the board to link to a project" : "Избери табла за поврзување со проект",
|
"Select the board to link to a project" : "Избери табла за поврзување со проект",
|
||||||
"Search by board title" : "Барај по име на табла",
|
"Search by board title" : "Барај по име на табла",
|
||||||
"Select board" : "Избери табла",
|
"Select board" : "Избери табла",
|
||||||
|
"Move/copy card" : "Премести/копирај картица",
|
||||||
"Select a board" : "Избери табла",
|
"Select a board" : "Избери табла",
|
||||||
"No lists available" : "Нема достапни листи",
|
"No lists available" : "Нема достапни листи",
|
||||||
"Select a list" : "Избери листа",
|
"Select a list" : "Избери листа",
|
||||||
"Move card" : "Премести картица",
|
"Move card" : "Премести картица",
|
||||||
|
"Copy card" : "Копирај картица",
|
||||||
"Select the card to link to a project" : "Избери картица за поврзување со проект",
|
"Select the card to link to a project" : "Избери картица за поврзување со проект",
|
||||||
"Link to card" : "Линк до картица",
|
"Link to card" : "Линк до картица",
|
||||||
"Select a card" : "Избери картица",
|
"Select a card" : "Избери картица",
|
||||||
@@ -122,6 +159,8 @@
|
|||||||
"Filter by tag" : "Филтрирај по ознака",
|
"Filter by tag" : "Филтрирај по ознака",
|
||||||
"Filter by assigned user" : "Филтрирај по назначени корисници",
|
"Filter by assigned user" : "Филтрирај по назначени корисници",
|
||||||
"Unassigned" : "Неназначени",
|
"Unassigned" : "Неназначени",
|
||||||
|
"Filter by status" : "Филтрирај по статус",
|
||||||
|
"Open and completed" : "Отворени и завршени",
|
||||||
"Open" : "Отвори",
|
"Open" : "Отвори",
|
||||||
"Completed" : "Завршено",
|
"Completed" : "Завршено",
|
||||||
"Filter by due date" : "Филтрирај по краен рок",
|
"Filter by due date" : "Филтрирај по краен рок",
|
||||||
@@ -131,12 +170,17 @@
|
|||||||
"Next 30 days" : "Следни 30 дена",
|
"Next 30 days" : "Следни 30 дена",
|
||||||
"No due date" : "Нема краен рок",
|
"No due date" : "Нема краен рок",
|
||||||
"Clear filter" : "Исчисти филтри",
|
"Clear filter" : "Исчисти филтри",
|
||||||
|
"View Modes" : "Режими на приказ",
|
||||||
|
"Toggle View Modes" : "Промени режими на приказ",
|
||||||
"Hide archived cards" : "Сокриј ги архивираните картици",
|
"Hide archived cards" : "Сокриј ги архивираните картици",
|
||||||
"Show archived cards" : "Прикажи ги архивираните картици",
|
"Show archived cards" : "Прикажи ги архивираните картици",
|
||||||
"Toggle compact mode" : "Вклучи компактен мод",
|
"Toggle compact mode" : "Вклучи компактен мод",
|
||||||
|
"Hide card cover images" : "Сокриј насловни слики на картици",
|
||||||
|
"Show card cover images" : "Прикажи насловни слики на картици",
|
||||||
"Open details" : "Отвори детали",
|
"Open details" : "Отвори детали",
|
||||||
"Details" : "Детали",
|
"Details" : "Детали",
|
||||||
"Loading board" : "Вчирување на табла",
|
"Currently present people" : "Моментално приситни корисници",
|
||||||
|
"Loading board" : "Вчитување на табла",
|
||||||
"Board not found" : "Таблата не е пронајдена",
|
"Board not found" : "Таблата не е пронајдена",
|
||||||
"Create a new list to add cards to this board" : "Додадете нова листа за да додадете картици на таблата",
|
"Create a new list to add cards to this board" : "Додадете нова листа за да додадете картици на таблата",
|
||||||
"Sharing" : "Споделување",
|
"Sharing" : "Споделување",
|
||||||
@@ -147,51 +191,69 @@
|
|||||||
"Undo" : "Врати",
|
"Undo" : "Врати",
|
||||||
"Deleted cards" : "Избришани картици",
|
"Deleted cards" : "Избришани картици",
|
||||||
"Failed to create share with {displayName}" : "Неможе да се сподели со {displayName}",
|
"Failed to create share with {displayName}" : "Неможе да се сподели со {displayName}",
|
||||||
|
"Are you sure you want to transfer the board {title} to {user}?" : "Дали сте сигурни дека сакате да ја префрлите таблата {title} на {user}?",
|
||||||
|
"Transfer the board." : "Префрли табла.",
|
||||||
"Transfer" : "Трансфер",
|
"Transfer" : "Трансфер",
|
||||||
|
"The board has been transferred to {user}" : "Таблата е префрлена на {user}",
|
||||||
|
"Failed to transfer the board to {user}" : "Неуспешно префрлање на таблата на {user}",
|
||||||
|
"Share board with a user, group or team …" : "Сподели табла со корисник, група или тим...",
|
||||||
|
"Searching for users, groups and teams …" : "Пребарување на корисници, групи или тимови...",
|
||||||
"No participants found" : "Не се пронајдени учесници",
|
"No participants found" : "Не се пронајдени учесници",
|
||||||
"Board owner" : "Сопственик на таблата",
|
"Board owner" : "Сопственик на таблата",
|
||||||
"(Group)" : "(Група)",
|
"(Group)" : "(Група)",
|
||||||
|
"(Team)" : "(Тим)",
|
||||||
"Can edit" : "Може да се уредува",
|
"Can edit" : "Може да се уредува",
|
||||||
"Can share" : "Can share",
|
"Can share" : "Can share",
|
||||||
"Can manage" : "Може да ја менаџира",
|
"Can manage" : "Може да ја менаџира",
|
||||||
"Owner" : "Сопственик",
|
"Owner" : "Сопственик",
|
||||||
"Delete" : "Избриши",
|
"Delete" : "Избриши",
|
||||||
"List deleted" : "Листата е избришана",
|
"List deleted" : "Листата е избришана",
|
||||||
|
"Edit list title" : "Удери наслов на листата",
|
||||||
"Archive all cards" : "Архивирај ги сите картици",
|
"Archive all cards" : "Архивирај ги сите картици",
|
||||||
|
"Unarchive all cards" : "Врати ги од архива сите картици",
|
||||||
"Delete list" : "Избриши листа",
|
"Delete list" : "Избриши листа",
|
||||||
"Archive all cards in this list" : "Архивирај ги сите картици во листата",
|
"Archive all cards in this list" : "Архивирај ги сите картици во листата",
|
||||||
|
"Unarchive all cards in this list" : "Врати ги од архива сите картици во оваа листа",
|
||||||
"Add a new card" : "Додади нова картица",
|
"Add a new card" : "Додади нова картица",
|
||||||
"Card name" : "Име на картицата",
|
"Card name" : "Име на картицата",
|
||||||
"title and color value must be provided" : "наслов и боја мора да се приложи",
|
"title and color value must be provided" : "Мора да се внесе наслов и боја",
|
||||||
"Edit" : "Уреди",
|
"Edit" : "Уреди",
|
||||||
"Add a new tag" : "Додади нова ознака",
|
"Add a new tag" : "Додади нова ознака",
|
||||||
"Board name" : "Име на табла",
|
"Board name" : "Име на табла",
|
||||||
"Members" : "Членови",
|
"Members" : "Членови",
|
||||||
|
"Assign to users/groups/team" : "Додели на корисници/групи/тимови",
|
||||||
"Assign a user to this card…" : "Додели корисник на оваа картица...",
|
"Assign a user to this card…" : "Додели корисник на оваа картица...",
|
||||||
|
"Select a user to assign to this card…" : "Избери на кого да се додели оваа картица…",
|
||||||
"File to share" : "Датотека за споделување",
|
"File to share" : "Датотека за споделување",
|
||||||
"Invalid path selected" : "Избрана невалидна патека",
|
"Invalid path selected" : "Избрана невалидна патека",
|
||||||
"Upload new files" : "Прикачи нови датотеки",
|
"Upload new files" : "Прикачи нови датотеки",
|
||||||
"Share from Files" : "Сподели од датотеките",
|
"Share from Files" : "Сподели од датотеките",
|
||||||
|
"Pending share" : "Споделување на чекање",
|
||||||
"Add this attachment" : "Додади го овој прилог",
|
"Add this attachment" : "Додади го овој прилог",
|
||||||
"Show in Files" : "Прикажи во датотеките",
|
"Show in Files" : "Прикажи во датотеките",
|
||||||
"Download" : "Преземи",
|
"Download" : "Преземи",
|
||||||
|
"Remove attachment" : "Отстрани прилог",
|
||||||
"Delete Attachment" : "Избриши прилог",
|
"Delete Attachment" : "Избриши прилог",
|
||||||
"Restore Attachment" : "Врати прилог",
|
"Restore Attachment" : "Врати прилог",
|
||||||
"Modified" : "Изменето",
|
"Modified" : "Изменето",
|
||||||
"Created" : "Креирано",
|
"Created" : "Креирано",
|
||||||
"The title cannot be empty." : "Насловот неможе да биде празен.",
|
"The title cannot be empty." : "Насловот неможе да биде празен.",
|
||||||
|
"Cannot close unsaved card!" : "Неможе да се затвори незачувана картица!",
|
||||||
"Open in sidebar view" : "Отвори страничен поглед",
|
"Open in sidebar view" : "Отвори страничен поглед",
|
||||||
"Open in bigger view" : "Отвори на голем екран",
|
"Open in bigger view" : "Отвори на голем екран",
|
||||||
"Comments" : "Коментари",
|
"Comments" : "Коментари",
|
||||||
|
"Failed to load comments" : "Неуспешно вчитување на коментари",
|
||||||
"No comments yet. Begin the discussion!" : "Сеуште нема коментари. Започни дискусија!",
|
"No comments yet. Begin the discussion!" : "Сеуште нема коментари. Започни дискусија!",
|
||||||
"The comment cannot be empty." : "Коментарот неможе да биде празен.",
|
"The comment cannot be empty." : "Коментарот неможе да биде празен.",
|
||||||
"The comment cannot be longer than 1000 characters." : "Коментарот неможе да биде поголем од 1000 карактери.",
|
"The comment cannot be longer than 1000 characters." : "Коментарот неможе да биде поголем од 1000 карактери.",
|
||||||
"Save" : "Зачувај",
|
"Save" : "Зачувај",
|
||||||
"Created:" : "Создадено:",
|
"Created:" : "Создадено:",
|
||||||
"In reply to" : "Како одговор на",
|
"In reply to" : "Како одговор на",
|
||||||
|
"Cancel reply" : "Откажи одговор",
|
||||||
"Reply" : "Одговор",
|
"Reply" : "Одговор",
|
||||||
"Update" : "Ажурирај",
|
"Update" : "Ажурирај",
|
||||||
"Write a description …" : "Напиши опис ...",
|
"Write a description …" : "Напиши опис ...",
|
||||||
|
"Could not save description" : "Неможе да се зачува описот",
|
||||||
"Description" : "Опис",
|
"Description" : "Опис",
|
||||||
"(Unsaved)" : "(Незачувано)",
|
"(Unsaved)" : "(Незачувано)",
|
||||||
"(Saving…)" : "(Снимање…)",
|
"(Saving…)" : "(Снимање…)",
|
||||||
@@ -202,63 +264,135 @@
|
|||||||
"Choose attachment" : "Избери прилог",
|
"Choose attachment" : "Избери прилог",
|
||||||
"Select Date" : "Избери датум",
|
"Select Date" : "Избери датум",
|
||||||
"Later today – {timeLocale}" : "Денес покасно – {timeLocale}",
|
"Later today – {timeLocale}" : "Денес покасно – {timeLocale}",
|
||||||
|
"Set due date for later today" : "Постави краен рок за денес подоцна",
|
||||||
"Tomorrow – {timeLocale}" : "Утре – {timeLocale}",
|
"Tomorrow – {timeLocale}" : "Утре – {timeLocale}",
|
||||||
|
"Set due date for tomorrow" : "Постави краен рок за утре",
|
||||||
|
"This weekend – {timeLocale}" : "Овој викенд – {timeLocale}",
|
||||||
|
"Set due date for this weekend" : "Постави краен рок за овој викенд",
|
||||||
|
"Next week – {timeLocale}" : "Следна недела – {timeLocale}",
|
||||||
|
"Set due date for next week" : "Постави краен рок за следната недела",
|
||||||
|
"Assign a due date to this card…" : "Додели рок за оваа картица…",
|
||||||
"Set a due date" : "Постави краен рок",
|
"Set a due date" : "Постави краен рок",
|
||||||
|
"Add due date" : "Додади краен рок",
|
||||||
|
"Choose a date" : "Избери датум",
|
||||||
"Remove due date" : "Отстрани краен рок",
|
"Remove due date" : "Отстрани краен рок",
|
||||||
"Mark as done" : "Означи како готово",
|
"Mark as done" : "Означи како готово",
|
||||||
|
"Due at:" : "Краен рок:",
|
||||||
|
"Not done" : "Не е завршено",
|
||||||
"Unarchive card" : "Врати картица од архива",
|
"Unarchive card" : "Врати картица од архива",
|
||||||
"Archive card" : "Архивирај картица",
|
"Archive card" : "Архивирај картица",
|
||||||
"Assign a tag to this card…" : "Додади ознака на оваа картица...",
|
"Assign a tag to this card…" : "Додади ознака на оваа картица...",
|
||||||
|
"Select or create a tag…" : "Избери или креирај ознака...",
|
||||||
|
"Create a new tag:" : "Направи нова ознака:",
|
||||||
"(group)" : "(group)",
|
"(group)" : "(group)",
|
||||||
|
"{count} comments, {unread} unread" : "{count} коментари, {unread} непрочитани",
|
||||||
|
"Todo items" : "Работи за правење",
|
||||||
|
"Edit card title" : "Измени наслов на картица",
|
||||||
|
"Open link" : "Отвори линк",
|
||||||
"Card deleted" : "Картицата е избришана",
|
"Card deleted" : "Картицата е избришана",
|
||||||
"Edit title" : "Удери наслов",
|
"Edit title" : "Удери наслов",
|
||||||
"Assign to me" : "Доделени мене",
|
"Assign to me" : "Доделени мене",
|
||||||
"Unassign myself" : "Откажи се",
|
"Unassign myself" : "Откажи се",
|
||||||
|
"Mark as not done" : "Означи како не-готово",
|
||||||
"Delete card" : "Избриши картица",
|
"Delete card" : "Избриши картица",
|
||||||
"seconds ago" : "пред неколку секунди",
|
"seconds ago" : "пред неколку секунди",
|
||||||
"Keyboard shortcuts" : "Кратенки преку тастатура",
|
"Keyboard shortcuts" : "Кратенки преку тастатура",
|
||||||
|
"Boost your productivity using Deck with keyboard shortcuts." : "Зголеми ја продуктивноста со користење на кратенки преку тастатура.",
|
||||||
|
"Board actions" : "Акции за табла",
|
||||||
"Keyboard shortcut" : "Кратенка преку тастатура",
|
"Keyboard shortcut" : "Кратенка преку тастатура",
|
||||||
|
"Action" : "Акција",
|
||||||
"Shift" : "Shift",
|
"Shift" : "Shift",
|
||||||
|
"Scroll" : "Scroll",
|
||||||
|
"Scroll sideways" : "Лизгај странично",
|
||||||
|
"Navigate between cards" : "Навигација помеѓу картиците",
|
||||||
|
"Esc" : "Esc",
|
||||||
|
"Close card details" : "Затвори детали на картица",
|
||||||
"Ctrl" : "Ctrl",
|
"Ctrl" : "Ctrl",
|
||||||
"Search" : "Барај",
|
"Search" : "Барај",
|
||||||
|
"Show card filters" : "Прикажи филтри за картици",
|
||||||
|
"Clear card filters" : "Исчисти филтри за картици",
|
||||||
|
"Show help dialog" : "Прикажи дијалог за помош",
|
||||||
|
"Card actions" : "Акции за картици",
|
||||||
|
"The following actions can be triggered on the currently highlighted card" : "Следните акции можат да се активираат на моментално обележаната картичка",
|
||||||
|
"Enter" : "Ентер",
|
||||||
"Space" : "Празно место",
|
"Space" : "Празно место",
|
||||||
|
"Open card details" : "Отвори детали на картица",
|
||||||
|
"Edit the card title" : "Измени наслов на картица",
|
||||||
|
"Assign yourself to the current card" : "Доделете се себеси на тековната картица",
|
||||||
|
"Archive/unarchive the current card" : "Архивирај/одархивирај тековната картица",
|
||||||
|
"Mark card as completed/not completed" : "Означи ја картицата како завршена/незавршена",
|
||||||
|
"Open card menu" : "Отвори мени на картица",
|
||||||
"All boards" : "Сите табли",
|
"All boards" : "Сите табли",
|
||||||
"Archived boards" : "Архивирани табли",
|
"Archived boards" : "Архивирани табли",
|
||||||
"Shared with you" : "Споделено со тебе",
|
"Shared with you" : "Споделено со тебе",
|
||||||
|
"Deck settings" : "Deck параметри",
|
||||||
"Use bigger card view" : "Користи поголем преглед на картици",
|
"Use bigger card view" : "Користи поголем преглед на картици",
|
||||||
|
"Show card ID badge" : "Прикажи ID на картиците",
|
||||||
"Show boards in calendar/tasks" : "Прикажи ги таблите во календарнот",
|
"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." : "Корисниците кој што не се во овие групи нема да можат да прават нови таби, но ќе можат да работат на таблите кој ќе бидат споделени со нив.",
|
||||||
"Cancel edit" : "Откажи ажурирање",
|
"Cancel edit" : "Откажи ажурирање",
|
||||||
|
"Save board" : "Зачувај табла",
|
||||||
"Board {0} deleted" : "Таблата {0} е избришана",
|
"Board {0} deleted" : "Таблата {0} е избришана",
|
||||||
"All cards" : "Сите картици",
|
"All cards" : "Сите картици",
|
||||||
"Only assigned cards" : "Само доделени картици",
|
"Only assigned cards" : "Само доделени картици",
|
||||||
"No reminder" : "Нема потсетник",
|
"No reminder" : "Нема потсетник",
|
||||||
"An error occurred" : "Настана грешка",
|
"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?" : "Бришење на таблата?",
|
"Delete the board?" : "Бришење на таблата?",
|
||||||
|
"Exporting board..." : "Извоз на табла...",
|
||||||
"Board details" : "Детали за таблата",
|
"Board details" : "Детали за таблата",
|
||||||
"Edit board" : "Измени табла",
|
"Edit board" : "Измени табла",
|
||||||
"Clone board" : "Клонирај табла",
|
"Clone board" : "Клонирај табла",
|
||||||
"Unarchive board" : "Врати табла од архива",
|
"Unarchive board" : "Врати табла од архива",
|
||||||
"Archive board" : "Архивирај табла",
|
"Archive board" : "Архивирај табла",
|
||||||
|
"Export board" : "Извези табла",
|
||||||
"Turn on due date reminders" : "Вклучи потсетници за крајните рокови",
|
"Turn on due date reminders" : "Вклучи потсетници за крајните рокови",
|
||||||
"Turn off due date reminders" : "Исклучи потсетници за крајните рокови",
|
"Turn off due date reminders" : "Исклучи потсетници за крајните рокови",
|
||||||
"Due date reminders" : "Потсетници за крајните рокови",
|
"Due date reminders" : "Потсетници за крајните рокови",
|
||||||
"Assigned cards" : "Доделени картици",
|
"Assigned cards" : "Доделени картици",
|
||||||
"No notifications" : "Нема известувања",
|
"No notifications" : "Нема известувања",
|
||||||
"Delete board" : "Избриши табла",
|
"Delete board" : "Избриши табла",
|
||||||
|
"Importing board..." : "Увезување табла...",
|
||||||
|
"Board imported successfully" : "Таблата е успешно увезена",
|
||||||
|
"Import board" : "Увези табла",
|
||||||
|
"Clone {boardTitle}" : "Клонирај {boardTitle}",
|
||||||
"Clone cards" : "Клинирај картици",
|
"Clone cards" : "Клинирај картици",
|
||||||
|
"Clone assignments" : "Клонирај задачи",
|
||||||
|
"Clone labels" : "Клонирај ознаки",
|
||||||
|
"Clone due dates" : "Клонирај крајни рокови",
|
||||||
"Advanced options" : "Напредни опции",
|
"Advanced options" : "Напредни опции",
|
||||||
|
"Move all cards to the first list" : "Помести ги сите картици во првата листа",
|
||||||
|
"Restore archived cards" : "Врати архивирани картици",
|
||||||
"Clone" : "Клонирај",
|
"Clone" : "Клонирај",
|
||||||
|
"Export {boardTitle}" : "Извези {boardTitle}",
|
||||||
|
"Export as JSON" : "Извези како JSON",
|
||||||
|
"Export as CSV" : "Извези како CSV",
|
||||||
|
"Note: Only the JSON format is supported for importing back into the Deck app." : "Забелешка: Поддржан е само JSON формат за увоз назад во апликацијата Deck.",
|
||||||
"Export" : "Извези",
|
"Export" : "Извези",
|
||||||
"Loading filtered view" : "Вчитување на филтриран поглед",
|
"Loading filtered view" : "Вчитување на филтриран поглед",
|
||||||
|
"Search for {searchQuery} in other boards" : "Барај {searchQuery} во други табли",
|
||||||
|
"Search for {searchQuery} in all boards" : "Барај {searchQuery} во сите табли",
|
||||||
"No results found" : "Нема пронајдено резултати",
|
"No results found" : "Нема пронајдено резултати",
|
||||||
|
"Deck board {name}\n* Last modified on {lastMod}" : "Табла {name}\n* Последна промена на {lastMod}",
|
||||||
|
"* Created on {created}\n* Last modified on {lastMod}\n* {nbAttachments} attachments\n* {nbComments} comments" : "* Креирана на {created}\n* Последна промена на {lastMod}\n* {nbAttachments} прилози\n* {nbComments} коментари",
|
||||||
|
"{nbCards} cards" : "{nbCards} картици",
|
||||||
|
"Due on {date}" : "Истекува на {date}",
|
||||||
"{stack} in {board}" : "{stack} во {board}",
|
"{stack} in {board}" : "{stack} во {board}",
|
||||||
|
"Click to expand description" : "Кликнни за проширување на опис",
|
||||||
|
"Click to expand comment" : "Кликнни за проширување на коментарот",
|
||||||
"Create card" : "Креирајте картица",
|
"Create card" : "Креирајте картица",
|
||||||
"Create a new card" : "Креирајте нова картица",
|
"Create a new card" : "Креирајте нова картица",
|
||||||
"Card title" : "Наслов на картицата",
|
"Card title" : "Наслов на картицата",
|
||||||
|
"Creating the new card …" : "Креирање нова картица ...",
|
||||||
|
"Card \"{card}\" was added to \"{board}\"" : "Картицата \"{card}\" е додадена во \"{board}\"",
|
||||||
"Open card" : "Отвори картица",
|
"Open card" : "Отвори картица",
|
||||||
"Close" : "Затвори",
|
"Close" : "Затвори",
|
||||||
"No upcoming cards" : "Нема престојни картици",
|
"No upcoming cards" : "Нема престојни картици",
|
||||||
|
"upcoming cards today" : "престојни картици за денес",
|
||||||
|
"upcoming cards tomorrow" : "престојни картици за утре",
|
||||||
"upcoming cards" : "престојни картици",
|
"upcoming cards" : "престојни картици",
|
||||||
|
"New card" : "Нова картица",
|
||||||
"Link to a board" : "Линк до табла",
|
"Link to a board" : "Линк до табла",
|
||||||
"Link to a card" : "Линк до картица",
|
"Link to a card" : "Линк до картица",
|
||||||
"Create a card" : "Креирајте картица",
|
"Create a card" : "Креирајте картица",
|
||||||
@@ -266,6 +400,7 @@
|
|||||||
"Something went wrong" : "Нешто не е во ред",
|
"Something went wrong" : "Нешто не е во ред",
|
||||||
"Failed to upload {name}" : "Неуспешно прикачување {name}",
|
"Failed to upload {name}" : "Неуспешно прикачување {name}",
|
||||||
"Maximum file size of {size} exceeded" : "Максималната големина на датотека од {size} е достигната",
|
"Maximum file size of {size} exceeded" : "Максималната големина на датотека од {size} е достигната",
|
||||||
|
"Assigned users" : "Доделени корисници",
|
||||||
"Due date" : "До датум",
|
"Due date" : "До датум",
|
||||||
"Error creating the share" : "Грешка при креирање на споделување",
|
"Error creating the share" : "Грешка при креирање на споделување",
|
||||||
"Share with a Deck card" : "Споделено со Deck картица",
|
"Share with a Deck card" : "Споделено со Deck картица",
|
||||||
|
|||||||
@@ -266,6 +266,7 @@ OC.L10N.register(
|
|||||||
"{count} comments, {unread} unread" : "{count} reacties, {unread} ongelezen",
|
"{count} comments, {unread} unread" : "{count} reacties, {unread} ongelezen",
|
||||||
"Todo items" : "Te doen onderwerpen",
|
"Todo items" : "Te doen onderwerpen",
|
||||||
"Edit card title" : "Wijzig de titel van de kaart",
|
"Edit card title" : "Wijzig de titel van de kaart",
|
||||||
|
"Open link" : "Open link",
|
||||||
"Card deleted" : "Kaart verwijderd",
|
"Card deleted" : "Kaart verwijderd",
|
||||||
"Edit title" : "Titel bewerken",
|
"Edit title" : "Titel bewerken",
|
||||||
"Assign to me" : "Aan mij toewijzen",
|
"Assign to me" : "Aan mij toewijzen",
|
||||||
@@ -279,6 +280,7 @@ OC.L10N.register(
|
|||||||
"Shift" : "Shift",
|
"Shift" : "Shift",
|
||||||
"Ctrl" : "Ctrl",
|
"Ctrl" : "Ctrl",
|
||||||
"Search" : "Zoeken",
|
"Search" : "Zoeken",
|
||||||
|
"Enter" : "Enter",
|
||||||
"All boards" : "Alle borden",
|
"All boards" : "Alle borden",
|
||||||
"Archived boards" : "Gearchiveerde borden",
|
"Archived boards" : "Gearchiveerde borden",
|
||||||
"Shared with you" : "Deelde met jou",
|
"Shared with you" : "Deelde met jou",
|
||||||
|
|||||||
@@ -264,6 +264,7 @@
|
|||||||
"{count} comments, {unread} unread" : "{count} reacties, {unread} ongelezen",
|
"{count} comments, {unread} unread" : "{count} reacties, {unread} ongelezen",
|
||||||
"Todo items" : "Te doen onderwerpen",
|
"Todo items" : "Te doen onderwerpen",
|
||||||
"Edit card title" : "Wijzig de titel van de kaart",
|
"Edit card title" : "Wijzig de titel van de kaart",
|
||||||
|
"Open link" : "Open link",
|
||||||
"Card deleted" : "Kaart verwijderd",
|
"Card deleted" : "Kaart verwijderd",
|
||||||
"Edit title" : "Titel bewerken",
|
"Edit title" : "Titel bewerken",
|
||||||
"Assign to me" : "Aan mij toewijzen",
|
"Assign to me" : "Aan mij toewijzen",
|
||||||
@@ -277,6 +278,7 @@
|
|||||||
"Shift" : "Shift",
|
"Shift" : "Shift",
|
||||||
"Ctrl" : "Ctrl",
|
"Ctrl" : "Ctrl",
|
||||||
"Search" : "Zoeken",
|
"Search" : "Zoeken",
|
||||||
|
"Enter" : "Enter",
|
||||||
"All boards" : "Alle borden",
|
"All boards" : "Alle borden",
|
||||||
"Archived boards" : "Gearchiveerde borden",
|
"Archived boards" : "Gearchiveerde borden",
|
||||||
"Shared with you" : "Deelde met jou",
|
"Shared with you" : "Deelde met jou",
|
||||||
|
|||||||
@@ -373,6 +373,7 @@ OC.L10N.register(
|
|||||||
"Note: Only the JSON format is supported for importing back into the Deck app." : "Observera: Endast JSON-formatet stöds för import tillbaka till Deck-appen.",
|
"Note: Only the JSON format is supported for importing back into the Deck app." : "Observera: Endast JSON-formatet stöds för import tillbaka till Deck-appen.",
|
||||||
"Export" : "Exportera",
|
"Export" : "Exportera",
|
||||||
"Loading filtered view" : "Laddar filtrerad vy",
|
"Loading filtered view" : "Laddar filtrerad vy",
|
||||||
|
"Search for {searchQuery} in other boards" : "Sök efter {searchQuery} i andra tavlor",
|
||||||
"Search for {searchQuery} in all boards" : "Sök efter {searchQuery} i alla tavlor",
|
"Search for {searchQuery} in all boards" : "Sök efter {searchQuery} i alla tavlor",
|
||||||
"No results found" : "Inga resultat funna",
|
"No results found" : "Inga resultat funna",
|
||||||
"Deck board {name}\n* Last modified on {lastMod}" : "Deck tavla {name}\n* Senast ändrad den {lastMod}",
|
"Deck board {name}\n* Last modified on {lastMod}" : "Deck tavla {name}\n* Senast ändrad den {lastMod}",
|
||||||
|
|||||||
@@ -371,6 +371,7 @@
|
|||||||
"Note: Only the JSON format is supported for importing back into the Deck app." : "Observera: Endast JSON-formatet stöds för import tillbaka till Deck-appen.",
|
"Note: Only the JSON format is supported for importing back into the Deck app." : "Observera: Endast JSON-formatet stöds för import tillbaka till Deck-appen.",
|
||||||
"Export" : "Exportera",
|
"Export" : "Exportera",
|
||||||
"Loading filtered view" : "Laddar filtrerad vy",
|
"Loading filtered view" : "Laddar filtrerad vy",
|
||||||
|
"Search for {searchQuery} in other boards" : "Sök efter {searchQuery} i andra tavlor",
|
||||||
"Search for {searchQuery} in all boards" : "Sök efter {searchQuery} i alla tavlor",
|
"Search for {searchQuery} in all boards" : "Sök efter {searchQuery} i alla tavlor",
|
||||||
"No results found" : "Inga resultat funna",
|
"No results found" : "Inga resultat funna",
|
||||||
"Deck board {name}\n* Last modified on {lastMod}" : "Deck tavla {name}\n* Senast ändrad den {lastMod}",
|
"Deck board {name}\n* Last modified on {lastMod}" : "Deck tavla {name}\n* Senast ändrad den {lastMod}",
|
||||||
|
|||||||
@@ -1,67 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
|
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
*/
|
|
||||||
namespace OCA\Deck\Command;
|
|
||||||
|
|
||||||
use OCP\IConfig;
|
|
||||||
use OCP\IUserManager;
|
|
||||||
use Symfony\Component\Console\Command\Command;
|
|
||||||
use Symfony\Component\Console\Input\InputInterface;
|
|
||||||
use Symfony\Component\Console\Input\InputOption;
|
|
||||||
use Symfony\Component\Console\Output\OutputInterface;
|
|
||||||
|
|
||||||
class CalendarToggle extends Command {
|
|
||||||
private IUserManager $userManager;
|
|
||||||
private IConfig $config;
|
|
||||||
|
|
||||||
public function __construct(IUserManager $userManager, IConfig $config) {
|
|
||||||
parent::__construct();
|
|
||||||
$this->userManager = $userManager;
|
|
||||||
$this->config = $config;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function configure() {
|
|
||||||
$this
|
|
||||||
->setName('deck:calendar-toggle')
|
|
||||||
->setDescription('Enable or disable Deck calendar/tasks integration for all existing users. Users can still change their own setting afterwards. Only affects users that already exist at the time of execution.')
|
|
||||||
->addOption(
|
|
||||||
'on',
|
|
||||||
null,
|
|
||||||
InputOption::VALUE_NONE,
|
|
||||||
'Enable calendar/tasks integration for all existing users (users can opt-out later)'
|
|
||||||
)
|
|
||||||
->addOption(
|
|
||||||
'off',
|
|
||||||
null,
|
|
||||||
InputOption::VALUE_NONE,
|
|
||||||
'Disable calendar/tasks integration for all existing users (users can opt-in later)'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function execute(InputInterface $input, OutputInterface $output): int {
|
|
||||||
$enable = $input->getOption('on');
|
|
||||||
$disable = $input->getOption('off');
|
|
||||||
if ($enable && $disable) {
|
|
||||||
$output->writeln('<error>Cannot use --on and --off together.</error>');
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if (!$enable && !$disable) {
|
|
||||||
$output->writeln('<error>Please specify either --on or --off.</error>');
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
$value = $enable ? 'yes' : '';
|
|
||||||
$users = $this->userManager->search('');
|
|
||||||
$count = 0;
|
|
||||||
foreach ($users as $user) {
|
|
||||||
$uid = $user->getUID();
|
|
||||||
$this->config->setUserValue($uid, 'deck', 'calendar', $value);
|
|
||||||
$output->writeln("Set calendar integration to '" . ($enable ? 'on' : 'off') . "' for user: $uid");
|
|
||||||
$count++;
|
|
||||||
}
|
|
||||||
$output->writeln("Done. Updated $count existing users.");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -10,12 +10,10 @@ namespace OCA\Deck\Controller;
|
|||||||
use OCA\Deck\Db\Acl;
|
use OCA\Deck\Db\Acl;
|
||||||
use OCA\Deck\Db\Board;
|
use OCA\Deck\Db\Board;
|
||||||
use OCA\Deck\Service\BoardService;
|
use OCA\Deck\Service\BoardService;
|
||||||
use OCA\Deck\Service\Importer\BoardImportService;
|
|
||||||
use OCA\Deck\Service\PermissionService;
|
use OCA\Deck\Service\PermissionService;
|
||||||
use OCP\AppFramework\ApiController;
|
use OCP\AppFramework\ApiController;
|
||||||
use OCP\AppFramework\Http;
|
use OCP\AppFramework\Http;
|
||||||
use OCP\AppFramework\Http\DataResponse;
|
use OCP\AppFramework\Http\DataResponse;
|
||||||
use OCP\IL10N;
|
|
||||||
use OCP\IRequest;
|
use OCP\IRequest;
|
||||||
|
|
||||||
class BoardController extends ApiController {
|
class BoardController extends ApiController {
|
||||||
@@ -24,8 +22,6 @@ class BoardController extends ApiController {
|
|||||||
IRequest $request,
|
IRequest $request,
|
||||||
private BoardService $boardService,
|
private BoardService $boardService,
|
||||||
private PermissionService $permissionService,
|
private PermissionService $permissionService,
|
||||||
private BoardImportService $boardImportService,
|
|
||||||
private IL10N $l10n,
|
|
||||||
private $userId,
|
private $userId,
|
||||||
) {
|
) {
|
||||||
parent::__construct($appName, $request);
|
parent::__construct($appName, $request);
|
||||||
@@ -167,62 +163,4 @@ class BoardController extends ApiController {
|
|||||||
public function export($boardId) {
|
public function export($boardId) {
|
||||||
return $this->boardService->export($boardId);
|
return $this->boardService->export($boardId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @NoAdminRequired
|
|
||||||
*/
|
|
||||||
public function import(): DataResponse {
|
|
||||||
$file = $this->request->getUploadedFile('file');
|
|
||||||
$error = null;
|
|
||||||
$phpFileUploadErrors = [
|
|
||||||
UPLOAD_ERR_OK => $this->l10n->t('The file was uploaded'),
|
|
||||||
UPLOAD_ERR_INI_SIZE => $this->l10n->t('The uploaded file exceeds the upload_max_filesize directive in php.ini'),
|
|
||||||
UPLOAD_ERR_FORM_SIZE => $this->l10n->t('The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form'),
|
|
||||||
UPLOAD_ERR_PARTIAL => $this->l10n->t('The file was only partially uploaded'),
|
|
||||||
UPLOAD_ERR_NO_FILE => $this->l10n->t('No file was uploaded'),
|
|
||||||
UPLOAD_ERR_NO_TMP_DIR => $this->l10n->t('Missing a temporary folder'),
|
|
||||||
UPLOAD_ERR_CANT_WRITE => $this->l10n->t('Could not write file to disk'),
|
|
||||||
UPLOAD_ERR_EXTENSION => $this->l10n->t('A PHP extension stopped the file upload'),
|
|
||||||
];
|
|
||||||
|
|
||||||
if (empty($file)) {
|
|
||||||
$error = $this->l10n->t('No file uploaded or file size exceeds maximum of %s', [\OCP\Util::humanFileSize(\OCP\Util::uploadLimit())]);
|
|
||||||
}
|
|
||||||
if (!empty($file) && array_key_exists('error', $file) && $file['error'] !== UPLOAD_ERR_OK) {
|
|
||||||
$error = $phpFileUploadErrors[$file['error']];
|
|
||||||
}
|
|
||||||
if (!empty($file) && $file['error'] === UPLOAD_ERR_OK && !in_array($file['type'], ['application/json', 'text/plain'])) {
|
|
||||||
$error = $this->l10n->t('Invalid file type. Only JSON files are allowed.');
|
|
||||||
}
|
|
||||||
if ($error !== null) {
|
|
||||||
return new DataResponse([
|
|
||||||
'status' => 'error',
|
|
||||||
'message' => $error,
|
|
||||||
], Http::STATUS_BAD_REQUEST);
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
$fileContent = file_get_contents($file['tmp_name']);
|
|
||||||
$this->boardImportService->setSystem('DeckJson');
|
|
||||||
$config = new \stdClass();
|
|
||||||
$config->owner = $this->userId;
|
|
||||||
$this->boardImportService->setConfigInstance($config);
|
|
||||||
$this->boardImportService->setData(json_decode($fileContent));
|
|
||||||
$this->boardImportService->import();
|
|
||||||
$importedBoard = $this->boardImportService->getBoard();
|
|
||||||
$board = $this->boardService->find($importedBoard->getId());
|
|
||||||
|
|
||||||
return new DataResponse($board, Http::STATUS_OK);
|
|
||||||
} catch (\TypeError $e) {
|
|
||||||
return new DataResponse([
|
|
||||||
'status' => 'error',
|
|
||||||
'message' => $this->l10n->t('Invalid JSON data'),
|
|
||||||
], Http::STATUS_BAD_REQUEST);
|
|
||||||
} catch (\Exception $e) {
|
|
||||||
return new DataResponse([
|
|
||||||
'status' => 'error',
|
|
||||||
'message' => $this->l10n->t('Failed to import board'),
|
|
||||||
], Http::STATUS_BAD_REQUEST);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -185,7 +185,7 @@ class CardApiController extends ApiController {
|
|||||||
* Reorder cards
|
* Reorder cards
|
||||||
*/
|
*/
|
||||||
public function reorder($stackId, $order) {
|
public function reorder($stackId, $order) {
|
||||||
$card = $this->cardService->reorder($this->request->getParam('cardId'), $stackId, $order);
|
$card = $this->cardService->reorder((int)$this->request->getParam('cardId'), (int)$stackId, (int)$order);
|
||||||
return new DataResponse($card, HTTP::STATUS_OK);
|
return new DataResponse($card, HTTP::STATUS_OK);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -77,33 +77,18 @@ class AssignmentMapper extends DeckMapper implements IPermissionMapper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function deleteByParticipantOnBoard(string $participant, int $boardId, $type = Assignment::TYPE_USER) {
|
public function deleteByParticipantOnBoard(string $participant, int $boardId, $type = Assignment::TYPE_USER) {
|
||||||
// Step 1: Get all card IDs for the board that have assignments for this participant
|
$qb = $this->db->getQueryBuilder();
|
||||||
// This avoids MySQL Error 1093 by separating the SELECT from the DELETE operation
|
|
||||||
$cardIdQuery = $this->db->getQueryBuilder();
|
$cardIdQuery = $this->db->getQueryBuilder();
|
||||||
$cardIdQuery->select('a.card_id')
|
$cardIdQuery->select('a.card_id')
|
||||||
->from('deck_assigned_users', 'a')
|
->from('deck_assigned_users', 'a')
|
||||||
->innerJoin('a', 'deck_cards', 'c', 'c.id = a.card_id')
|
->innerJoin('a', 'deck_cards', 'c', 'c.id = a.card_id')
|
||||||
->innerJoin('c', 'deck_stacks', 's', 's.id = c.stack_id')
|
->innerJoin('c', 'deck_stacks', 's', 's.id = c.stack_id')
|
||||||
->where($cardIdQuery->expr()->eq('a.participant', $cardIdQuery->createNamedParameter($participant, IQueryBuilder::PARAM_STR)))
|
->where($cardIdQuery->expr()->eq('a.participant', $qb->createNamedParameter($participant, IQueryBuilder::PARAM_STR)))
|
||||||
->andWhere($cardIdQuery->expr()->eq('s.board_id', $cardIdQuery->createNamedParameter($boardId, IQueryBuilder::PARAM_INT)))
|
->andWhere($cardIdQuery->expr()->eq('s.board_id', $qb->createNamedParameter($boardId, IQueryBuilder::PARAM_INT)))
|
||||||
->andWhere($cardIdQuery->expr()->eq('a.type', $cardIdQuery->createNamedParameter($type, IQueryBuilder::PARAM_INT)));
|
->andWhere($cardIdQuery->expr()->eq('a.type', $qb->createNamedParameter($type, IQueryBuilder::PARAM_INT)));
|
||||||
|
$qb->delete('deck_assigned_users')
|
||||||
$result = $cardIdQuery->executeQuery();
|
->where($qb->expr()->in('card_id', $qb->createFunction($cardIdQuery->getSQL()), IQueryBuilder::PARAM_INT_ARRAY));
|
||||||
$cardIds = [];
|
$qb->executeStatement();
|
||||||
while ($row = $result->fetch()) {
|
|
||||||
$cardIds[] = $row['card_id'];
|
|
||||||
}
|
|
||||||
$result->closeCursor();
|
|
||||||
|
|
||||||
// Step 2: If we have card IDs, delete the assignments
|
|
||||||
if (!empty($cardIds)) {
|
|
||||||
$deleteQuery = $this->db->getQueryBuilder();
|
|
||||||
$deleteQuery->delete('deck_assigned_users')
|
|
||||||
->where($deleteQuery->expr()->eq('participant', $deleteQuery->createNamedParameter($participant, IQueryBuilder::PARAM_STR)))
|
|
||||||
->andWhere($deleteQuery->expr()->eq('type', $deleteQuery->createNamedParameter($type, IQueryBuilder::PARAM_INT)))
|
|
||||||
->andWhere($deleteQuery->expr()->in('card_id', $deleteQuery->createNamedParameter($cardIds, IQueryBuilder::PARAM_INT_ARRAY)));
|
|
||||||
$deleteQuery->executeStatement();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -131,11 +131,7 @@ class CardMapper extends QBMapper implements IPermissionMapper {
|
|||||||
return $card;
|
return $card;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public function findAll($stackId, $limit = null, $offset = null, $since = -1) {
|
||||||
* @return Card[]
|
|
||||||
* @throws \OCP\DB\Exception
|
|
||||||
*/
|
|
||||||
public function findAll($stackId, ?int $limit = null, ?int $offset = null, int $since = -1) {
|
|
||||||
$qb = $this->db->getQueryBuilder();
|
$qb = $this->db->getQueryBuilder();
|
||||||
$qb->select('*')
|
$qb->select('*')
|
||||||
->from('deck_cards')
|
->from('deck_cards')
|
||||||
@@ -150,32 +146,6 @@ class CardMapper extends QBMapper implements IPermissionMapper {
|
|||||||
return $this->findEntities($qb);
|
return $this->findEntities($qb);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param int[] $stackIds
|
|
||||||
* @return array<int, null|Card[]>
|
|
||||||
* @throws \OCP\DB\Exception
|
|
||||||
*/
|
|
||||||
public function findAllForStacks(array $stackIds, ?int $limit = null, ?int $offset = null, int $since = -1): array {
|
|
||||||
$qb = $this->db->getQueryBuilder();
|
|
||||||
$qb->select('*')
|
|
||||||
->from('deck_cards')
|
|
||||||
->where($qb->expr()->in('stack_id', $qb->createNamedParameter($stackIds, IQueryBuilder::PARAM_INT_ARRAY)))
|
|
||||||
->andWhere($qb->expr()->eq('archived', $qb->createNamedParameter(false, IQueryBuilder::PARAM_BOOL)))
|
|
||||||
->andWhere($qb->expr()->eq('deleted_at', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT)))
|
|
||||||
->andWhere($qb->expr()->gt('last_modified', $qb->createNamedParameter($since, IQueryBuilder::PARAM_INT)))
|
|
||||||
->setMaxResults($limit)
|
|
||||||
->setFirstResult($offset)
|
|
||||||
->orderBy('order')
|
|
||||||
->addOrderBy('id');
|
|
||||||
|
|
||||||
$rawCards = $this->findEntities($qb);
|
|
||||||
$cards = array_fill_keys($stackIds, null);
|
|
||||||
foreach ($rawCards as $card) {
|
|
||||||
$cards[$card->getStackId()][] = $card;
|
|
||||||
}
|
|
||||||
return $cards;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function queryCardsByBoard(int $boardId): IQueryBuilder {
|
public function queryCardsByBoard(int $boardId): IQueryBuilder {
|
||||||
$qb = $this->db->getQueryBuilder();
|
$qb = $this->db->getQueryBuilder();
|
||||||
$qb->select('c.*')
|
$qb->select('c.*')
|
||||||
|
|||||||
@@ -15,7 +15,6 @@ use Sabre\VObject\Component\VCalendar;
|
|||||||
* @method int getDeletedAt()
|
* @method int getDeletedAt()
|
||||||
* @method int getLastModified()
|
* @method int getLastModified()
|
||||||
* @method int getOrder()
|
* @method int getOrder()
|
||||||
* @method Card[] getCards()
|
|
||||||
*/
|
*/
|
||||||
class Stack extends RelationalEntity {
|
class Stack extends RelationalEntity {
|
||||||
protected $title;
|
protected $title;
|
||||||
|
|||||||
@@ -77,10 +77,12 @@ class StackMapper extends DeckMapper implements IPermissionMapper {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @param numeric $boardId
|
* @param numeric $boardId
|
||||||
|
* @param int|null $limit
|
||||||
|
* @param int|null $offset
|
||||||
* @return Stack[]
|
* @return Stack[]
|
||||||
* @throws \OCP\DB\Exception
|
* @throws \OCP\DB\Exception
|
||||||
*/
|
*/
|
||||||
public function findAll($boardId, ?int $limit = null, ?int $offset = null): array {
|
public function findAll($boardId, $limit = null, $offset = null): array {
|
||||||
$qb = $this->db->getQueryBuilder();
|
$qb = $this->db->getQueryBuilder();
|
||||||
$qb->select('*')
|
$qb->select('*')
|
||||||
->from($this->getTableName())
|
->from($this->getTableName())
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ class DefaultBoardMiddleware extends Middleware {
|
|||||||
public function beforeController($controller, $methodName) {
|
public function beforeController($controller, $methodName) {
|
||||||
try {
|
try {
|
||||||
if ($this->userId !== null && $this->defaultBoardService->checkFirstRun($this->userId) && $this->permissionService->canCreate()) {
|
if ($this->userId !== null && $this->defaultBoardService->checkFirstRun($this->userId) && $this->permissionService->canCreate()) {
|
||||||
$this->defaultBoardService->createDefaultBoard($this->l10n->t('Welcome to Nextcloud Deck!'), $this->userId, 'bf678b');
|
$this->defaultBoardService->createDefaultBoard($this->l10n->t('Personal'), $this->userId, '0087C5');
|
||||||
}
|
}
|
||||||
} catch (\Throwable $e) {
|
} catch (\Throwable $e) {
|
||||||
$this->logger->error('Could not create default board', ['exception' => $e]);
|
$this->logger->error('Could not create default board', ['exception' => $e]);
|
||||||
|
|||||||
@@ -1,78 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
/**
|
|
||||||
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
|
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
*/
|
|
||||||
namespace OCA\Deck\Migration;
|
|
||||||
|
|
||||||
use OCP\IDBConnection;
|
|
||||||
use OCP\Migration\IOutput;
|
|
||||||
use OCP\Migration\IRepairStep;
|
|
||||||
|
|
||||||
class LabelMismatchCleanup implements IRepairStep {
|
|
||||||
|
|
||||||
public function __construct(
|
|
||||||
private IDBConnection $db,
|
|
||||||
) {
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getName() {
|
|
||||||
return 'Migrate labels with wrong board mapping';
|
|
||||||
}
|
|
||||||
|
|
||||||
public function run(IOutput $output) {
|
|
||||||
// Find assingments where a label of another (wrong) board is used
|
|
||||||
$qb = $this->db->getQueryBuilder();
|
|
||||||
$qb->select('al.id', 'al.label_id', 'al.card_id', 's.board_id as actual_board_id', 'l.board_id as wrong_id', 'l.color', 'l.title')
|
|
||||||
->from('deck_assigned_labels', 'al')
|
|
||||||
->innerJoin('al', 'deck_cards', 'c', 'c.id = al.card_id')
|
|
||||||
->innerJoin('c', 'deck_stacks', 's', 'c.stack_id = s.id')
|
|
||||||
->innerJoin('al', 'deck_labels', 'l', 'l.id = al.label_id')
|
|
||||||
->where($qb->expr()->neq('l.board_id', 's.board_id'));
|
|
||||||
|
|
||||||
$labels = $qb->executeQUery()->fetchAll();
|
|
||||||
if (count($labels) === 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$output->info('Found ' . count($labels) . ' labels with wrong board mapping');
|
|
||||||
|
|
||||||
foreach ($labels as $label) {
|
|
||||||
// Select existing label on the correct board
|
|
||||||
$qb = $this->db->getQueryBuilder();
|
|
||||||
$qb->select('id')
|
|
||||||
->from('deck_labels')
|
|
||||||
->where($qb->expr()->eq('title', $qb->createNamedParameter($label['title'])))
|
|
||||||
->andWhere($qb->expr()->eq('color', $qb->createNamedParameter($label['color'])))
|
|
||||||
->andWhere($qb->expr()->eq('board_id', $qb->createNamedParameter($label['actual_board_id'])));
|
|
||||||
$result = $qb->executeQuery();
|
|
||||||
$newLabel = $result->fetchOne();
|
|
||||||
$result->closeCursor();
|
|
||||||
|
|
||||||
if (!$newLabel) {
|
|
||||||
// Create a new label with the same title and color on the correct board
|
|
||||||
$qb = $this->db->getQueryBuilder();
|
|
||||||
$qb->insert('deck_labels')
|
|
||||||
->values([
|
|
||||||
'title' => $qb->createNamedParameter($label['title']),
|
|
||||||
'color' => $qb->createNamedParameter($label['color']),
|
|
||||||
'board_id' => $qb->createNamedParameter($label['actual_board_id']),
|
|
||||||
]);
|
|
||||||
$qb->executeStatement();
|
|
||||||
$newLabel = $qb->getLastInsertId();
|
|
||||||
$output->debug('Created new label ' . $label['title'] . ' on board ' . $label['actual_board_id']);
|
|
||||||
} else {
|
|
||||||
$output->debug('Found existing label ' . $label['title'] . ' on board ' . $label['actual_board_id']);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Update the assignment to use the new label
|
|
||||||
$qb = $this->db->getQueryBuilder();
|
|
||||||
$qb->update('deck_assigned_labels')
|
|
||||||
->set('label_id', $qb->createNamedParameter($newLabel))
|
|
||||||
->where($qb->expr()->eq('id', $qb->createNamedParameter($label['id'])));
|
|
||||||
$qb->executeStatement();
|
|
||||||
$output->debug('Updated label assignment ' . $label['id'] . ' to use label ' . $newLabel);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -77,7 +77,7 @@ class Notifier implements INotifier {
|
|||||||
*/
|
*/
|
||||||
public function prepare(INotification $notification, string $languageCode): INotification {
|
public function prepare(INotification $notification, string $languageCode): INotification {
|
||||||
$l = $this->l10nFactory->get('deck', $languageCode);
|
$l = $this->l10nFactory->get('deck', $languageCode);
|
||||||
if ($notification->getApp() !== 'deck') {
|
if ($notification->getApp() !== 'deck' || $notification->getObjectType() === 'activity_notification') {
|
||||||
throw new UnknownNotificationException();
|
throw new UnknownNotificationException();
|
||||||
}
|
}
|
||||||
$notification->setIcon($this->url->getAbsoluteURL($this->url->imagePath('deck', 'deck-dark.svg')));
|
$notification->setIcon($this->url->getAbsoluteURL($this->url->imagePath('deck', 'deck-dark.svg')));
|
||||||
|
|||||||
@@ -64,7 +64,6 @@ class BoardReferenceProvider implements IReferenceProvider {
|
|||||||
$reference = new Reference($referenceText);
|
$reference = new Reference($referenceText);
|
||||||
$reference->setTitle($this->l10n->t('Deck board') . ': ' . $board['title']);
|
$reference->setTitle($this->l10n->t('Deck board') . ': ' . $board['title']);
|
||||||
$ownerDisplayName = $board['owner']['displayname'] ?? $board['owner']['uid'] ?? '???';
|
$ownerDisplayName = $board['owner']['displayname'] ?? $board['owner']['uid'] ?? '???';
|
||||||
// TRANSLATORS Owned by {boardOwnerName}
|
|
||||||
$reference->setDescription($this->l10n->t('Owned by %1$s', [$ownerDisplayName]));
|
$reference->setDescription($this->l10n->t('Owned by %1$s', [$ownerDisplayName]));
|
||||||
$imageUrl = $this->urlGenerator->getAbsoluteURL(
|
$imageUrl = $this->urlGenerator->getAbsoluteURL(
|
||||||
$this->urlGenerator->imagePath(Application::APP_ID, 'deck-dark.svg')
|
$this->urlGenerator->imagePath(Application::APP_ID, 'deck-dark.svg')
|
||||||
|
|||||||
@@ -90,7 +90,6 @@ class CommentReferenceProvider implements IReferenceProvider {
|
|||||||
$reference->setTitle($comment['message']);
|
$reference->setTitle($comment['message']);
|
||||||
$boardOwnerDisplayName = $board['owner']['displayname'] ?? $board['owner']['uid'] ?? '???';
|
$boardOwnerDisplayName = $board['owner']['displayname'] ?? $board['owner']['uid'] ?? '???';
|
||||||
$reference->setDescription(
|
$reference->setDescription(
|
||||||
// TRANSLATORS From {userName}, in {boardTitle}/{stackTitle}, owned by {boardOwnerName}
|
|
||||||
$this->l10n->t('From %1$s, in %2$s/%3$s, owned by %4$s', [
|
$this->l10n->t('From %1$s, in %2$s/%3$s, owned by %4$s', [
|
||||||
$comment['actorDisplayName'],
|
$comment['actorDisplayName'],
|
||||||
$board['title'],
|
$board['title'],
|
||||||
|
|||||||
@@ -762,8 +762,6 @@ class BoardService {
|
|||||||
$fullCards = [];
|
$fullCards = [];
|
||||||
foreach ($cards as $card) {
|
foreach ($cards as $card) {
|
||||||
$fullCard = $this->cardMapper->find($card->getId());
|
$fullCard = $this->cardMapper->find($card->getId());
|
||||||
$assignedUsers = $this->assignedUsersMapper->findAll($card->getId());
|
|
||||||
$fullCard->setAssignedUsers($assignedUsers);
|
|
||||||
array_push($fullCards, $fullCard);
|
array_push($fullCards, $fullCard);
|
||||||
}
|
}
|
||||||
$stack->setCards($fullCards);
|
$stack->setCards($fullCards);
|
||||||
|
|||||||
@@ -356,7 +356,7 @@ class CardService {
|
|||||||
if ($resetDuedateNotification) {
|
if ($resetDuedateNotification) {
|
||||||
$this->notificationHelper->markDuedateAsRead($card);
|
$this->notificationHelper->markDuedateAsRead($card);
|
||||||
}
|
}
|
||||||
$this->changeHelper->cardChanged($card->getId());
|
$this->changeHelper->cardChanged($card->getId(), true);
|
||||||
|
|
||||||
$this->eventDispatcher->dispatchTyped(new CardUpdatedEvent($card, $changes->getBefore()));
|
$this->eventDispatcher->dispatchTyped(new CardUpdatedEvent($card, $changes->getBefore()));
|
||||||
|
|
||||||
@@ -418,12 +418,11 @@ class CardService {
|
|||||||
if ($card->getArchived()) {
|
if ($card->getArchived()) {
|
||||||
throw new StatusException('Operation not allowed. This card is archived.');
|
throw new StatusException('Operation not allowed. This card is archived.');
|
||||||
}
|
}
|
||||||
$changes = new ChangeSet($card);
|
|
||||||
$card->setTitle($title);
|
$card->setTitle($title);
|
||||||
$this->changeHelper->cardChanged($card->getId(), false);
|
$this->changeHelper->cardChanged($card->getId(), false);
|
||||||
$update = $this->cardMapper->update($card);
|
$update = $this->cardMapper->update($card);
|
||||||
|
|
||||||
$this->eventDispatcher->dispatchTyped(new CardUpdatedEvent($card, $changes->getBefore()));
|
$this->eventDispatcher->dispatchTyped(new CardUpdatedEvent($card));
|
||||||
|
|
||||||
return $update;
|
return $update;
|
||||||
}
|
}
|
||||||
@@ -439,9 +438,10 @@ class CardService {
|
|||||||
* @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException
|
* @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException
|
||||||
* @throws BadRequestException
|
* @throws BadRequestException
|
||||||
*/
|
*/
|
||||||
public function reorder($id, $stackId, $order) {
|
public function reorder(int $id, int $stackId, int $order) {
|
||||||
$this->cardServiceValidator->check(compact('id', 'stackId', 'order'));
|
$this->cardServiceValidator->check(compact('id', 'stackId', 'order'));
|
||||||
|
|
||||||
|
|
||||||
$this->permissionService->checkPermission($this->cardMapper, $id, Acl::PERMISSION_EDIT);
|
$this->permissionService->checkPermission($this->cardMapper, $id, Acl::PERMISSION_EDIT);
|
||||||
$this->permissionService->checkPermission($this->stackMapper, $stackId, Acl::PERMISSION_EDIT);
|
$this->permissionService->checkPermission($this->stackMapper, $stackId, Acl::PERMISSION_EDIT);
|
||||||
|
|
||||||
@@ -459,30 +459,30 @@ class CardService {
|
|||||||
$changes->setAfter($card);
|
$changes->setAfter($card);
|
||||||
$this->activityManager->triggerUpdateEvents(ActivityManager::DECK_OBJECT_CARD, $changes, ActivityManager::SUBJECT_CARD_UPDATE);
|
$this->activityManager->triggerUpdateEvents(ActivityManager::DECK_OBJECT_CARD, $changes, ActivityManager::SUBJECT_CARD_UPDATE);
|
||||||
|
|
||||||
$cardsToReorder = $this->cardMapper->findAll($stackId);
|
$cards = $this->cardMapper->findAll($stackId);
|
||||||
$result = [];
|
$result = [];
|
||||||
$i = 0;
|
$i = 0;
|
||||||
foreach ($cardsToReorder as $cardToReorder) {
|
foreach ($cards as $card) {
|
||||||
if ($cardToReorder->getArchived()) {
|
if ($card->getArchived()) {
|
||||||
throw new StatusException('Operation not allowed. This card is archived.');
|
throw new StatusException('Operation not allowed. This card is archived.');
|
||||||
}
|
}
|
||||||
if ($cardToReorder->id === $id) {
|
if ($card->id === $id) {
|
||||||
$cardToReorder->setOrder($order);
|
$card->setOrder($order);
|
||||||
$cardToReorder->setLastModified(time());
|
$card->setLastModified(time());
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($i === $order) {
|
if ($i === $order) {
|
||||||
$i++;
|
$i++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($cardToReorder->id !== $id) {
|
if ($card->id !== $id) {
|
||||||
$cardToReorder->setOrder($i++);
|
$card->setOrder($i++);
|
||||||
}
|
}
|
||||||
$this->cardMapper->update($cardToReorder);
|
$this->cardMapper->update($card);
|
||||||
$result[$cardToReorder->getOrder()] = $cardToReorder;
|
$result[$card->getOrder()] = $card;
|
||||||
}
|
}
|
||||||
$this->changeHelper->cardChanged($id, false);
|
$this->changeHelper->cardChanged($id, false);
|
||||||
$this->eventDispatcher->dispatchTyped(new CardUpdatedEvent($card, $changes->getBefore()));
|
$this->eventDispatcher->dispatchTyped(new CardUpdatedEvent($card));
|
||||||
|
|
||||||
return array_values($result);
|
return array_values($result);
|
||||||
}
|
}
|
||||||
@@ -499,19 +499,19 @@ class CardService {
|
|||||||
public function archive($id) {
|
public function archive($id) {
|
||||||
$this->cardServiceValidator->check(compact('id'));
|
$this->cardServiceValidator->check(compact('id'));
|
||||||
|
|
||||||
|
|
||||||
$this->permissionService->checkPermission($this->cardMapper, $id, Acl::PERMISSION_EDIT);
|
$this->permissionService->checkPermission($this->cardMapper, $id, Acl::PERMISSION_EDIT);
|
||||||
if ($this->boardService->isArchived($this->cardMapper, $id)) {
|
if ($this->boardService->isArchived($this->cardMapper, $id)) {
|
||||||
throw new StatusException('Operation not allowed. This board is archived.');
|
throw new StatusException('Operation not allowed. This board is archived.');
|
||||||
}
|
}
|
||||||
$card = $this->cardMapper->find($id);
|
$card = $this->cardMapper->find($id);
|
||||||
$changes = new ChangeSet($card);
|
|
||||||
$card->setArchived(true);
|
$card->setArchived(true);
|
||||||
$newCard = $this->cardMapper->update($card);
|
$newCard = $this->cardMapper->update($card);
|
||||||
$this->notificationHelper->markDuedateAsRead($card);
|
$this->notificationHelper->markDuedateAsRead($card);
|
||||||
$this->activityManager->triggerEvent(ActivityManager::DECK_OBJECT_CARD, $newCard, ActivityManager::SUBJECT_CARD_UPDATE_ARCHIVE);
|
$this->activityManager->triggerEvent(ActivityManager::DECK_OBJECT_CARD, $newCard, ActivityManager::SUBJECT_CARD_UPDATE_ARCHIVE);
|
||||||
$this->changeHelper->cardChanged($id, false);
|
$this->changeHelper->cardChanged($id, false);
|
||||||
|
|
||||||
$this->eventDispatcher->dispatchTyped(new CardUpdatedEvent($card, $changes->getBefore()));
|
$this->eventDispatcher->dispatchTyped(new CardUpdatedEvent($card));
|
||||||
|
|
||||||
return $newCard;
|
return $newCard;
|
||||||
}
|
}
|
||||||
@@ -534,13 +534,12 @@ class CardService {
|
|||||||
throw new StatusException('Operation not allowed. This board is archived.');
|
throw new StatusException('Operation not allowed. This board is archived.');
|
||||||
}
|
}
|
||||||
$card = $this->cardMapper->find($id);
|
$card = $this->cardMapper->find($id);
|
||||||
$changes = new ChangeSet($card);
|
|
||||||
$card->setArchived(false);
|
$card->setArchived(false);
|
||||||
$newCard = $this->cardMapper->update($card);
|
$newCard = $this->cardMapper->update($card);
|
||||||
$this->activityManager->triggerEvent(ActivityManager::DECK_OBJECT_CARD, $newCard, ActivityManager::SUBJECT_CARD_UPDATE_UNARCHIVE);
|
$this->activityManager->triggerEvent(ActivityManager::DECK_OBJECT_CARD, $newCard, ActivityManager::SUBJECT_CARD_UPDATE_UNARCHIVE);
|
||||||
$this->changeHelper->cardChanged($id, false);
|
$this->changeHelper->cardChanged($id, false);
|
||||||
|
|
||||||
$this->eventDispatcher->dispatchTyped(new CardUpdatedEvent($card, $changes->getBefore()));
|
$this->eventDispatcher->dispatchTyped(new CardUpdatedEvent($card));
|
||||||
|
|
||||||
return $newCard;
|
return $newCard;
|
||||||
}
|
}
|
||||||
@@ -560,14 +559,13 @@ class CardService {
|
|||||||
throw new StatusException('Operation not allowed. This board is archived.');
|
throw new StatusException('Operation not allowed. This board is archived.');
|
||||||
}
|
}
|
||||||
$card = $this->cardMapper->find($id);
|
$card = $this->cardMapper->find($id);
|
||||||
$changes = new ChangeSet($card);
|
|
||||||
$card->setDone(new \DateTime());
|
$card->setDone(new \DateTime());
|
||||||
$newCard = $this->cardMapper->update($card);
|
$newCard = $this->cardMapper->update($card);
|
||||||
$this->notificationHelper->markDuedateAsRead($card);
|
$this->notificationHelper->markDuedateAsRead($card);
|
||||||
$this->activityManager->triggerEvent(ActivityManager::DECK_OBJECT_CARD, $newCard, ActivityManager::SUBJECT_CARD_UPDATE_DONE);
|
$this->activityManager->triggerEvent(ActivityManager::DECK_OBJECT_CARD, $newCard, ActivityManager::SUBJECT_CARD_UPDATE_DONE);
|
||||||
$this->changeHelper->cardChanged($id, false);
|
$this->changeHelper->cardChanged($id, false);
|
||||||
|
|
||||||
$this->eventDispatcher->dispatchTyped(new CardUpdatedEvent($card, $changes->getBefore()));
|
$this->eventDispatcher->dispatchTyped(new CardUpdatedEvent($card));
|
||||||
|
|
||||||
return $newCard;
|
return $newCard;
|
||||||
}
|
}
|
||||||
@@ -587,13 +585,12 @@ class CardService {
|
|||||||
throw new StatusException('Operation not allowed. This board is archived.');
|
throw new StatusException('Operation not allowed. This board is archived.');
|
||||||
}
|
}
|
||||||
$card = $this->cardMapper->find($id);
|
$card = $this->cardMapper->find($id);
|
||||||
$changes = new ChangeSet($card);
|
|
||||||
$card->setDone(null);
|
$card->setDone(null);
|
||||||
$newCard = $this->cardMapper->update($card);
|
$newCard = $this->cardMapper->update($card);
|
||||||
$this->activityManager->triggerEvent(ActivityManager::DECK_OBJECT_CARD, $newCard, ActivityManager::SUBJECT_CARD_UPDATE_UNDONE);
|
$this->activityManager->triggerEvent(ActivityManager::DECK_OBJECT_CARD, $newCard, ActivityManager::SUBJECT_CARD_UPDATE_UNDONE);
|
||||||
$this->changeHelper->cardChanged($id, false);
|
$this->changeHelper->cardChanged($id, false);
|
||||||
|
|
||||||
$this->eventDispatcher->dispatchTyped(new CardUpdatedEvent($card, $changes->getBefore()));
|
$this->eventDispatcher->dispatchTyped(new CardUpdatedEvent($card));
|
||||||
|
|
||||||
return $newCard;
|
return $newCard;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ namespace OCA\Deck\Service;
|
|||||||
|
|
||||||
use OCA\Deck\AppInfo\Application;
|
use OCA\Deck\AppInfo\Application;
|
||||||
use OCA\Deck\BadRequestException;
|
use OCA\Deck\BadRequestException;
|
||||||
use OCA\Deck\Db\Board;
|
|
||||||
use OCA\Deck\Db\BoardMapper;
|
use OCA\Deck\Db\BoardMapper;
|
||||||
use OCP\IConfig;
|
use OCP\IConfig;
|
||||||
use OCP\IL10N;
|
use OCP\IL10N;
|
||||||
@@ -22,8 +21,6 @@ class DefaultBoardService {
|
|||||||
private $cardService;
|
private $cardService;
|
||||||
private $config;
|
private $config;
|
||||||
private $l10n;
|
private $l10n;
|
||||||
private LabelService $labelService;
|
|
||||||
private AttachmentService $attachmentService;
|
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
IL10N $l10n,
|
IL10N $l10n,
|
||||||
@@ -32,8 +29,6 @@ class DefaultBoardService {
|
|||||||
StackService $stackService,
|
StackService $stackService,
|
||||||
CardService $cardService,
|
CardService $cardService,
|
||||||
IConfig $config,
|
IConfig $config,
|
||||||
LabelService $labelService,
|
|
||||||
AttachmentService $attachmentService,
|
|
||||||
) {
|
) {
|
||||||
$this->boardService = $boardService;
|
$this->boardService = $boardService;
|
||||||
$this->stackService = $stackService;
|
$this->stackService = $stackService;
|
||||||
@@ -41,8 +36,6 @@ class DefaultBoardService {
|
|||||||
$this->config = $config;
|
$this->config = $config;
|
||||||
$this->boardMapper = $boardMapper;
|
$this->boardMapper = $boardMapper;
|
||||||
$this->l10n = $l10n;
|
$this->l10n = $l10n;
|
||||||
$this->labelService = $labelService;
|
|
||||||
$this->attachmentService = $attachmentService;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -66,13 +59,10 @@ class DefaultBoardService {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getDefaultBoardData(): array {
|
|
||||||
$defaultBoardDataJson = file_get_contents(__DIR__ . '/fixtures/default-board.json');
|
|
||||||
return json_decode($defaultBoardDataJson, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* @param $title
|
||||||
* @param $userId
|
* @param $userId
|
||||||
|
* @param $color
|
||||||
* @return \OCP\AppFramework\Db\Entity
|
* @return \OCP\AppFramework\Db\Entity
|
||||||
* @throws \OCA\Deck\NoPermissionException
|
* @throws \OCA\Deck\NoPermissionException
|
||||||
* @throws \OCA\Deck\StatusException
|
* @throws \OCA\Deck\StatusException
|
||||||
@@ -81,71 +71,19 @@ class DefaultBoardService {
|
|||||||
* @throws BadRequestException
|
* @throws BadRequestException
|
||||||
*/
|
*/
|
||||||
public function createDefaultBoard(string $title, string $userId, string $color) {
|
public function createDefaultBoard(string $title, string $userId, string $color) {
|
||||||
$boardData = $this->getDefaultBoardData();
|
$defaultBoard = $this->boardService->create($title, $userId, $color);
|
||||||
|
$defaultStacks = [];
|
||||||
|
$defaultCards = [];
|
||||||
|
|
||||||
/** @var Board $defaultBoard */
|
|
||||||
$defaultBoard = $this->boardService->create(
|
|
||||||
$boardData['title'] ?? $title,
|
|
||||||
$userId,
|
|
||||||
$boardData['color'] ?? $color,
|
|
||||||
);
|
|
||||||
$boardId = $defaultBoard->getId();
|
$boardId = $defaultBoard->getId();
|
||||||
$additionLabels = [];
|
|
||||||
$translatedLabelTitles = [
|
|
||||||
'Read more inside' => $this->l10n->t('Read more inside'),
|
|
||||||
];
|
|
||||||
$translatedStackTitles = [
|
|
||||||
'Custom lists - click to rename!' => $this->l10n->t('Custom lists - click to rename!'),
|
|
||||||
'To Do' => $this->l10n->t('To Do'),
|
|
||||||
'In Progress' => $this->l10n->t('In Progress'),
|
|
||||||
'Done' => $this->l10n->t('Done'),
|
|
||||||
];
|
|
||||||
$translatedCardTitles = [
|
|
||||||
'1. Open to learn more about boards and cards' => $this->l10n->t('1. Open to learn more about boards and cards'),
|
|
||||||
'2. Drag cards left and right, up and down' => $this->l10n->t('2. Drag cards left and right, up and down'),
|
|
||||||
'3. Apply rich formatting and link content' => $this->l10n->t('3. Apply rich formatting and link content'),
|
|
||||||
'4. Share, comment and collaborate!' => $this->l10n->t('4. Share, comment and collaborate!'),
|
|
||||||
'Create your first card!' => $this->l10n->t('Create your first card!'),
|
|
||||||
];
|
|
||||||
|
|
||||||
foreach ($boardData['addition_labels'] as $labelData) {
|
$defaultStacks[] = $this->stackService->create($this->l10n->t('To do'), $boardId, 1);
|
||||||
$additionLabels[] = $this->labelService->create(
|
$defaultStacks[] = $this->stackService->create($this->l10n->t('Doing'), $boardId, 1);
|
||||||
$translatedLabelTitles[$labelData['title']] ?? $labelData['title'],
|
$defaultStacks[] = $this->stackService->create($this->l10n->t('Done'), $boardId, 1);
|
||||||
$labelData['color'],
|
|
||||||
$boardId
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
$defaultLabels = array_merge($defaultBoard->getLabels() ?? [], $additionLabels);
|
$defaultCards[] = $this->cardService->create($this->l10n->t('Example Task 3'), $defaultStacks[0]->getId(), 'text', 0, $userId);
|
||||||
|
$defaultCards[] = $this->cardService->create($this->l10n->t('Example Task 2'), $defaultStacks[1]->getId(), 'text', 0, $userId);
|
||||||
foreach ($boardData['stacks'] as $stackData) {
|
$defaultCards[] = $this->cardService->create($this->l10n->t('Example Task 1'), $defaultStacks[2]->getId(), 'text', 0, $userId);
|
||||||
$stack = $this->stackService->create(
|
|
||||||
$translatedStackTitles[$stackData['title']] ?? $stackData['title'],
|
|
||||||
$boardId,
|
|
||||||
$stackData['order']
|
|
||||||
);
|
|
||||||
|
|
||||||
foreach ($stackData['cards'] as $cardData) {
|
|
||||||
$card = $this->cardService->create(
|
|
||||||
$translatedCardTitles[$cardData['title']] ?? $cardData['title'],
|
|
||||||
$stack->getId(),
|
|
||||||
$cardData['type'],
|
|
||||||
$cardData['order'],
|
|
||||||
$userId,
|
|
||||||
$cardData['description'],
|
|
||||||
);
|
|
||||||
|
|
||||||
foreach ($defaultLabels as $defaultLabel) {
|
|
||||||
if ($defaultLabel && in_array($defaultLabel->getTitle(), $cardData['labels'])) {
|
|
||||||
$this->cardService->assignLabel($card->getId(), $defaultLabel->getId());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!empty($cardData['has_example_attachment'])) {
|
|
||||||
$this->attachmentService->create($card->getId(), 'file', 'DEFAULT_SAMPLE_FILE');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $defaultBoard;
|
return $defaultBoard;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -162,15 +162,7 @@ class FilesAppService implements IAttachmentService, ICustomAttachmentService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function create(Attachment $attachment) {
|
public function create(Attachment $attachment) {
|
||||||
if ($attachment->getData() === 'DEFAULT_SAMPLE_FILE' && !$this->request->getUploadedFile('file')) {
|
$file = $this->getUploadedFile();
|
||||||
$file = [
|
|
||||||
'name' => 'Nextcloud sample image - add your image here!.jpg',
|
|
||||||
'tmp_name' => __DIR__ . '/../../img/sample-image.jpg',
|
|
||||||
];
|
|
||||||
} else {
|
|
||||||
$file = $this->getUploadedFile();
|
|
||||||
}
|
|
||||||
|
|
||||||
$fileName = $file['name'];
|
$fileName = $file['name'];
|
||||||
|
|
||||||
// get shares for current card
|
// get shares for current card
|
||||||
|
|||||||
@@ -75,22 +75,19 @@ class StackService {
|
|||||||
$this->stackServiceValidator = $stackServiceValidator;
|
$this->stackServiceValidator = $stackServiceValidator;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @param Stack[] $stacks */
|
private function enrichStackWithCards($stack, $since = -1) {
|
||||||
private function enrichStacksWithCards(array $stacks, $since = -1): void {
|
$cards = $this->cardMapper->findAll($stack->getId(), null, null, $since);
|
||||||
$cardsByStackId = $this->cardMapper->findAllForStacks(array_map(fn (Stack $stack) => $stack->getId(), $stacks), null, null, $since);
|
|
||||||
|
|
||||||
foreach ($cardsByStackId as $stackId => $cards) {
|
if (\count($cards) === 0) {
|
||||||
if (!$cards) {
|
return;
|
||||||
continue;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
$stack->setCards($this->cardService->enrichCards($cards));
|
||||||
|
}
|
||||||
|
|
||||||
foreach ($stacks as $stack) {
|
private function enrichStacksWithCards($stacks, $since = -1) {
|
||||||
if ($stack->getId() === $stackId) {
|
foreach ($stacks as $stack) {
|
||||||
$stack->setCards($this->cardService->enrichCards($cards));
|
$this->enrichStackWithCards($stack, $since);
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -127,9 +124,9 @@ class StackService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param mixed $boardId
|
* @param $boardId
|
||||||
*
|
*
|
||||||
* @return Stack[]
|
* @return array
|
||||||
* @throws \OCA\Deck\NoPermissionException
|
* @throws \OCA\Deck\NoPermissionException
|
||||||
* @throws BadRequestException
|
* @throws BadRequestException
|
||||||
*/
|
*/
|
||||||
@@ -250,7 +247,7 @@ class StackService {
|
|||||||
);
|
);
|
||||||
$this->changeHelper->boardChanged($stack->getBoardId());
|
$this->changeHelper->boardChanged($stack->getBoardId());
|
||||||
$this->eventDispatcher->dispatchTyped(new BoardUpdatedEvent($stack->getBoardId()));
|
$this->eventDispatcher->dispatchTyped(new BoardUpdatedEvent($stack->getBoardId()));
|
||||||
$this->enrichStacksWithCards([$stack]);
|
$this->enrichStackWithCards($stack);
|
||||||
|
|
||||||
return $stack;
|
return $stack;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,81 +0,0 @@
|
|||||||
{
|
|
||||||
"color": "bf678b",
|
|
||||||
"addition_labels": [
|
|
||||||
{
|
|
||||||
"title": "Read more inside",
|
|
||||||
"color": "CC317C"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"stacks": [
|
|
||||||
{
|
|
||||||
"title": "Custom lists - click to rename!",
|
|
||||||
"order": 0,
|
|
||||||
"cards": [
|
|
||||||
{
|
|
||||||
"title": "1. Open to learn more about boards and cards",
|
|
||||||
"description": "## Welcome to Nextcloud Deck!\n\nNextcloud Deck is a kanban style project management app that integrates seamlessly with the Nextcloud ecosystem. Here, you can create and manage boards to streamline your projects and organize project tasks visually using cards. A versatile tool, Nextcloud Deck will help you stay efficient in both personal and collaborative settings!\n\n### \ud83d\udccc How to set up a new board?\n\nAdd a new board via the \u201c+\u201d button or \u201cAdd board\u201d. Name your board and add a description to clarify its purpose if you wish.\n\nAdd task lists to your board via \u201cAdd List\u201d (e.g., \"To Do\"). Add cards to these lists to represent individual tasks or items. Organize your cards visually by assigning labels or colors.\n\nManage your board list: In the board menu next to the board name, you can edit, clone, archive and export your boards.\n\n### \ud83d\uddc2\ufe0f How to create and edit task cards?\n\nAdd cards via the \u201c+\u201d button on top of the list of your choice. Name your card and add a description using the available rich text formatting instruments.\n\nSet a due date to track deadlines and add responsible team members. Label your cards with tags for better navigation. You can create and manage tags in the sidebar, which is accessible via the toolbar button.\n\n### \ud83d\udca1Useful tips for Nextcloud Deck\n\n- Integrate Nextcloud Deck with Nextcloud Calendar and track the upcoming card deadlines.\n- Use comments to keep discussions around a task within its dedicated card.\n- Enable Nextcloud Deck notifications to always stay updated on changes to your boards.",
|
|
||||||
"labels": [
|
|
||||||
"Read more inside"
|
|
||||||
],
|
|
||||||
"type": "text",
|
|
||||||
"order": 0
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"title": "To Do",
|
|
||||||
"order": 1,
|
|
||||||
"cards": [
|
|
||||||
{
|
|
||||||
"title": "2. Drag cards left and right, up and down",
|
|
||||||
"description": "## \ud83d\udea6 Manage your boards and cards\n\nDrag your cards around the board to change position in the list or move them to other lists.\n\nArchive cards to remove them from the board without losing your content. You can always access archived cards and put them back by going to \"Show archived cards\" in the board menu.\n\nUse tags to assign types, statuses and other special attributes to your cards to aid visual navigation. Open the \"Tags\" tab in the sidebar of Nextcloud Deck to manage tags you can add to your cards.\n\n## \ud83d\udc53 Change how you view your boards\n\nTo navigate large boards easily, you can filter your cards by tags, team members, statuses and due dates. Open filter menu via Nextcloud Deck toolbar.\n\nEnable compact display mode in the Deck Board menu via the three dots menu in the toolbar. In the same menu, you can disable and enable cover images.",
|
|
||||||
"labels": [
|
|
||||||
"Read more inside"
|
|
||||||
],
|
|
||||||
"type": "text",
|
|
||||||
"order": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"title": "Create your first card!",
|
|
||||||
"description": "",
|
|
||||||
"labels": [
|
|
||||||
"Action needed"
|
|
||||||
],
|
|
||||||
"type": "text",
|
|
||||||
"order": 1
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"title": "In Progress",
|
|
||||||
"order": 2,
|
|
||||||
"cards": [
|
|
||||||
{
|
|
||||||
"title": "3. Apply rich formatting and link content",
|
|
||||||
"description": "## \ud83c\udfa8 Make use of rich formatting in card descriptions\n\nYou can use various instruments to make your content more structured and informative. Try all the instruments yourself - use this checklist!\n\n- [ ] Apply headings of different hierarchy (H1-H6).\n- [ ] Use **bold** *italic* __underline__ and ~~strikethrough~~ text formatting.\n- [ ] Create unordered, ordered and to-do lists.\n- [ ] Highlight code and blockquotes, add various illustrated callouts.\n- [ ] Create and format tables\n- [ ] Add details\n- [ ] Add links, for example to [the Nextcloud website](https:\/\/nextcloud.com\/)\n- [ ] Insert attachments\n- [ ] Add emojis \ud83d\udd76\ufe0f \n\n## \ud83d\udd17 Attach files to cards\n\nYou can upload any files from your machine or pick from your Nextcloud Files, such as documents, presentations, images, video clips and anything else. Add files via \"Attachments\" tab.\n\n## \ud83c\udf04 Illustrate cards with images\n\nAttach images to your cards - they will automatically work as card covers.",
|
|
||||||
"labels": [
|
|
||||||
"Read more inside"
|
|
||||||
],
|
|
||||||
"type": "text",
|
|
||||||
"order": 0,
|
|
||||||
"has_example_attachment": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"title": "Done",
|
|
||||||
"order": 3,
|
|
||||||
"cards": [
|
|
||||||
{
|
|
||||||
"title": "4. Share, comment and collaborate!",
|
|
||||||
"description": "## \ud83e\udd1d How to collaborate in your board?\n\nShare your cards and boards with others. In many Nextcloud apps, linked Nextcloud Deck items will appear as rich, interactive widgets. Once you assign someone to a card, they will receive a notification.\n\nEdit cards together, leave notes for your teammates, share task-related files by adding attachments and discuss your tasks using card comments.\n\n### ",
|
|
||||||
"labels": [
|
|
||||||
"Read more inside"
|
|
||||||
],
|
|
||||||
"type": "text",
|
|
||||||
"order": 0
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
1085
package-lock.json
generated
1085
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
27
package.json
27
package.json
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "deck",
|
"name": "deck",
|
||||||
"description": "",
|
"description": "",
|
||||||
"version": "2.0.0-dev.0",
|
"version": "1.15.3",
|
||||||
"authors": [
|
"authors": [
|
||||||
{
|
{
|
||||||
"name": "Julius Härtl",
|
"name": "Julius Härtl",
|
||||||
@@ -31,22 +31,22 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@babel/polyfill": "^7.12.1",
|
"@babel/polyfill": "^7.12.1",
|
||||||
"@babel/runtime": "^7.27.1",
|
"@babel/runtime": "^7.26.0",
|
||||||
"@nextcloud/auth": "^2.4.0",
|
"@nextcloud/auth": "^2.4.0",
|
||||||
"@nextcloud/axios": "^2.5.1",
|
"@nextcloud/axios": "^2.5.1",
|
||||||
"@nextcloud/capabilities": "^1.2.0",
|
"@nextcloud/capabilities": "^1.2.0",
|
||||||
"@nextcloud/dialogs": "^6.3.1",
|
"@nextcloud/dialogs": "^6.0.1",
|
||||||
"@nextcloud/event-bus": "^3.3.2",
|
"@nextcloud/event-bus": "^3.3.1",
|
||||||
"@nextcloud/files": "^3.10.1",
|
"@nextcloud/files": "^3.10.1",
|
||||||
"@nextcloud/initial-state": "^2.2.0",
|
"@nextcloud/initial-state": "^2.2.0",
|
||||||
"@nextcloud/l10n": "^3.1.0",
|
"@nextcloud/l10n": "^3.4.0",
|
||||||
"@nextcloud/moment": "^1.3.4",
|
"@nextcloud/moment": "^1.3.5",
|
||||||
"@nextcloud/notify_push": "^1.3.0",
|
"@nextcloud/notify_push": "^1.3.0",
|
||||||
"@nextcloud/router": "^3.0.1",
|
"@nextcloud/router": "^3.0.1",
|
||||||
"@nextcloud/vue": "^8.27.0",
|
"@nextcloud/vue": "^8.31.0",
|
||||||
"blueimp-md5": "^2.19.0",
|
"blueimp-md5": "^2.19.0",
|
||||||
"chroma-js": "^3.1.2",
|
"chroma-js": "^3.1.2",
|
||||||
"dompurify": "^3.2.5",
|
"dompurify": "^3.2.3",
|
||||||
"lodash": "^4.17.21",
|
"lodash": "^4.17.21",
|
||||||
"markdown-it": "^14.1.0",
|
"markdown-it": "^14.1.0",
|
||||||
"markdown-it-link-attributes": "^4.0.1",
|
"markdown-it-link-attributes": "^4.0.1",
|
||||||
@@ -59,6 +59,7 @@
|
|||||||
"vue-click-outside": "^1.1.0",
|
"vue-click-outside": "^1.1.0",
|
||||||
"vue-easymde": "^2.0.0",
|
"vue-easymde": "^2.0.0",
|
||||||
"vue-infinite-loading": "^2.4.5",
|
"vue-infinite-loading": "^2.4.5",
|
||||||
|
"vue-loader": "^15.11.1",
|
||||||
"vue-material-design-icons": "^5.3.1",
|
"vue-material-design-icons": "^5.3.1",
|
||||||
"vue-router": "^3.6.5",
|
"vue-router": "^3.6.5",
|
||||||
"vue-smooth-dnd": "^0.8.1",
|
"vue-smooth-dnd": "^0.8.1",
|
||||||
@@ -75,16 +76,16 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@nextcloud/babel-config": "^1.2.0",
|
"@nextcloud/babel-config": "^1.2.0",
|
||||||
"@nextcloud/browserslist-config": "^3.0.1",
|
"@nextcloud/browserslist-config": "^3.0.1",
|
||||||
"@nextcloud/cypress": "^1.0.0-beta.15",
|
"@nextcloud/cypress": "^1.0.0-beta.12",
|
||||||
"@nextcloud/eslint-config": "^8.4.2",
|
"@nextcloud/eslint-config": "^8.4.1",
|
||||||
"@nextcloud/stylelint-config": "^3.0.1",
|
"@nextcloud/stylelint-config": "^3.0.1",
|
||||||
"@nextcloud/webpack-vue-config": "^6.3.0",
|
"@nextcloud/webpack-vue-config": "^6.2.0",
|
||||||
"@relative-ci/agent": "^4.3.1",
|
"@relative-ci/agent": "^4.2.14",
|
||||||
"@vue/test-utils": "^2.4.6",
|
"@vue/test-utils": "^2.4.6",
|
||||||
"@vue/vue2-jest": "^29.2.6",
|
"@vue/vue2-jest": "^29.2.6",
|
||||||
"cypress": "^13.17.0",
|
"cypress": "^13.17.0",
|
||||||
"eslint-plugin-cypress": "^3.6.0",
|
"eslint-plugin-cypress": "^3.6.0",
|
||||||
"eslint-webpack-plugin": "^5.0.1",
|
"eslint-webpack-plugin": "^4.2.0",
|
||||||
"jest": "^29.7.0",
|
"jest": "^29.7.0",
|
||||||
"jest-serializer-vue": "^3.1.0",
|
"jest-serializer-vue": "^3.1.0",
|
||||||
"stylelint-webpack-plugin": "^5.0.1",
|
"stylelint-webpack-plugin": "^5.0.1",
|
||||||
|
|||||||
@@ -107,6 +107,10 @@ export default {
|
|||||||
this.$store.dispatch('loadSharees')
|
this.$store.dispatch('loadSharees')
|
||||||
},
|
},
|
||||||
mounted() {
|
mounted() {
|
||||||
|
// Redirect to cleaner URL (without /index.php) if RewriteBase is enabled
|
||||||
|
if (this.$route.path.startsWith('/index.php')) {
|
||||||
|
window.location.href = this.$route.fullPath.replace('/index.php', '')
|
||||||
|
}
|
||||||
// Set navigation to initial state and update in case it gets toggled
|
// Set navigation to initial state and update in case it gets toggled
|
||||||
emit('toggle-navigation', { open: !this.isMobile && this.navShown, _initial: true })
|
emit('toggle-navigation', { open: !this.isMobile && this.navShown, _initial: true })
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
|
|||||||
@@ -263,10 +263,10 @@ import { mapState, mapGetters } from 'vuex'
|
|||||||
import { subscribe, unsubscribe } from '@nextcloud/event-bus'
|
import { subscribe, unsubscribe } from '@nextcloud/event-bus'
|
||||||
import { NcActions, NcActionButton, NcAvatar, NcButton, NcPopover, NcModal } from '@nextcloud/vue'
|
import { NcActions, NcActionButton, NcAvatar, NcButton, NcPopover, NcModal } from '@nextcloud/vue'
|
||||||
import labelStyle from '../mixins/labelStyle.js'
|
import labelStyle from '../mixins/labelStyle.js'
|
||||||
import ArchiveIcon from 'vue-material-design-icons/ArchiveOutline.vue'
|
import ArchiveIcon from 'vue-material-design-icons/Archive.vue'
|
||||||
import ImageIcon from 'vue-material-design-icons/ImageMultipleOutline.vue'
|
import ImageIcon from 'vue-material-design-icons/ImageMultiple.vue'
|
||||||
import FilterIcon from 'vue-material-design-icons/FilterOutline.vue'
|
import FilterIcon from 'vue-material-design-icons/Filter.vue'
|
||||||
import FilterOffIcon from 'vue-material-design-icons/FilterOffOutline.vue'
|
import FilterOffIcon from 'vue-material-design-icons/FilterOff.vue'
|
||||||
import TableColumnPlusAfter from 'vue-material-design-icons/TableColumnPlusAfter.vue'
|
import TableColumnPlusAfter from 'vue-material-design-icons/TableColumnPlusAfter.vue'
|
||||||
import ArrowCollapseVerticalIcon from 'vue-material-design-icons/ArrowCollapseVertical.vue'
|
import ArrowCollapseVerticalIcon from 'vue-material-design-icons/ArrowCollapseVertical.vue'
|
||||||
import ArrowExpandVerticalIcon from 'vue-material-design-icons/ArrowExpandVertical.vue'
|
import ArrowExpandVerticalIcon from 'vue-material-design-icons/ArrowExpandVertical.vue'
|
||||||
|
|||||||
@@ -276,15 +276,18 @@ export default {
|
|||||||
position: relative;
|
position: relative;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
max-height: calc(100vh - 50px);
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
|
|
||||||
.board {
|
.board {
|
||||||
|
padding-left: $board-spacing;
|
||||||
position: relative;
|
position: relative;
|
||||||
|
max-height: calc(100% - var(--default-clickable-area));
|
||||||
|
overflow: hidden;
|
||||||
overflow-x: auto;
|
overflow-x: auto;
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
scrollbar-gutter: stable;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -294,15 +297,11 @@ export default {
|
|||||||
.smooth-dnd-container.horizontal {
|
.smooth-dnd-container.horizontal {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: stretch;
|
align-items: stretch;
|
||||||
gap: $board-gap;
|
|
||||||
padding: 0 $board-gap;
|
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
|
||||||
&:deep(.stack-draggable-wrapper.smooth-dnd-draggable-wrapper) {
|
&:deep(.stack-draggable-wrapper.smooth-dnd-draggable-wrapper) {
|
||||||
display: flex;
|
display: flex;
|
||||||
height: auto;
|
height: auto;
|
||||||
flex: 0 1 $card-max-width;
|
|
||||||
min-width: $card-min-width;
|
|
||||||
|
|
||||||
.stack {
|
.stack {
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -310,13 +309,16 @@ export default {
|
|||||||
position: relative;
|
position: relative;
|
||||||
|
|
||||||
.smooth-dnd-container.vertical {
|
.smooth-dnd-container.vertical {
|
||||||
$margin-x: calc($stack-gap * -1);
|
flex-grow: 1;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
gap: $stack-gap;
|
// Margin left instead of padidng to avoid jumps on dropping a card
|
||||||
padding: $stack-gap;
|
margin-left: $stack-spacing;
|
||||||
margin: 0 $margin-x;
|
padding-right: $stack-spacing;
|
||||||
|
overflow-x: hidden;
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
|
padding-top: 15px;
|
||||||
|
margin-top: -10px;
|
||||||
scrollbar-gutter: stable;
|
scrollbar-gutter: stable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -56,9 +56,9 @@ import DeletedTabSidebar from './DeletedTabSidebar.vue'
|
|||||||
import TimelineTabSidebar from './TimelineTabSidebar.vue'
|
import TimelineTabSidebar from './TimelineTabSidebar.vue'
|
||||||
import { NcAppSidebar, NcAppSidebarTab } from '@nextcloud/vue'
|
import { NcAppSidebar, NcAppSidebarTab } from '@nextcloud/vue'
|
||||||
import ActivityIcon from 'vue-material-design-icons/LightningBolt.vue'
|
import ActivityIcon from 'vue-material-design-icons/LightningBolt.vue'
|
||||||
import SharingIcon from 'vue-material-design-icons/ShareVariantOutline.vue'
|
import SharingIcon from 'vue-material-design-icons/ShareVariant.vue'
|
||||||
import TagsIcon from 'vue-material-design-icons/TagMultipleOutline.vue'
|
import TagsIcon from 'vue-material-design-icons/TagMultiple.vue'
|
||||||
import TrashIcon from 'vue-material-design-icons/TrashCanOutline.vue'
|
import TrashIcon from 'vue-material-design-icons/Delete.vue'
|
||||||
const capabilities = window.OC.getCapabilities()
|
const capabilities = window.OC.getCapabilities()
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
|||||||
@@ -14,10 +14,10 @@
|
|||||||
{{ stack.title }}
|
{{ stack.title }}
|
||||||
</h3>
|
</h3>
|
||||||
<h3 v-else-if="!editing"
|
<h3 v-else-if="!editing"
|
||||||
|
title="stack.title"
|
||||||
dir="auto"
|
dir="auto"
|
||||||
tabindex="0"
|
tabindex="0"
|
||||||
:aria-label="stack.title"
|
:aria-label="stack.title"
|
||||||
:title="stack.title"
|
|
||||||
class="stack__title"
|
class="stack__title"
|
||||||
@click="startEditing(stack)"
|
@click="startEditing(stack)"
|
||||||
@keydown.enter="startEditing(stack)">
|
@keydown.enter="startEditing(stack)">
|
||||||
@@ -108,7 +108,7 @@
|
|||||||
</Container>
|
</Container>
|
||||||
|
|
||||||
<transition name="slide-bottom" appear>
|
<transition name="slide-bottom" appear>
|
||||||
<div v-if="showAddCard" class="stack__card-add">
|
<div v-show="showAddCard" class="stack__card-add">
|
||||||
<form :class="{ 'icon-loading-small': stateCardCreating }"
|
<form :class="{ 'icon-loading-small': stateCardCreating }"
|
||||||
@submit.prevent.stop="clickAddCard()">
|
@submit.prevent.stop="clickAddCard()">
|
||||||
<label for="new-stack-input-main" class="hidden-visually">{{ t('deck', 'Add a new card') }}</label>
|
<label for="new-stack-input-main" class="hidden-visually">{{ t('deck', 'Add a new card') }}</label>
|
||||||
@@ -137,7 +137,7 @@
|
|||||||
import ClickOutside from 'vue-click-outside'
|
import ClickOutside from 'vue-click-outside'
|
||||||
import { mapGetters, mapState } from 'vuex'
|
import { mapGetters, mapState } from 'vuex'
|
||||||
import { Container, Draggable } from 'vue-smooth-dnd'
|
import { Container, Draggable } from 'vue-smooth-dnd'
|
||||||
import ArchiveIcon from 'vue-material-design-icons/ArchiveOutline.vue'
|
import ArchiveIcon from 'vue-material-design-icons/Archive.vue'
|
||||||
import CardPlusOutline from 'vue-material-design-icons/CardPlusOutline.vue'
|
import CardPlusOutline from 'vue-material-design-icons/CardPlusOutline.vue'
|
||||||
import { NcActions, NcActionButton, NcModal } from '@nextcloud/vue'
|
import { NcActions, NcActionButton, NcModal } from '@nextcloud/vue'
|
||||||
import { showError, showUndo } from '@nextcloud/dialogs'
|
import { showError, showUndo } from '@nextcloud/dialogs'
|
||||||
@@ -365,31 +365,37 @@ export default {
|
|||||||
@import './../../css/variables';
|
@import './../../css/variables';
|
||||||
|
|
||||||
.stack {
|
.stack {
|
||||||
width: 100%;
|
width: $stack-width + $stack-spacing * 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
.stack__header {
|
.stack__header {
|
||||||
display: flex;
|
display: flex;
|
||||||
position: sticky;
|
position: sticky;
|
||||||
top: 0;
|
top: 0;
|
||||||
height: var(--default-clickable-area);
|
|
||||||
z-index: 100;
|
z-index: 100;
|
||||||
|
padding-left: $card-spacing;
|
||||||
|
padding-right: $card-spacing;
|
||||||
|
margin: 6px;
|
||||||
margin-top: 0;
|
margin-top: 0;
|
||||||
cursor: grab;
|
cursor: grab;
|
||||||
background-color: var(--color-main-background);
|
background-color: var(--color-main-background);
|
||||||
|
|
||||||
// Smooth fade out of the cards at the top
|
// Smooth fade out of the cards at the top
|
||||||
&:before {
|
&:before {
|
||||||
content: '';
|
content: ' ';
|
||||||
display: block;
|
display: block;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
width: 100%;
|
width: calc(100% - 16px);
|
||||||
height: $stack-gap;
|
height: 20px;
|
||||||
bottom: 0;
|
top: 30px;
|
||||||
|
left: 0px;
|
||||||
z-index: 99;
|
z-index: 99;
|
||||||
transition: top var(--animation-slow);
|
transition: top var(--animation-slow);
|
||||||
background-image: linear-gradient(180deg, var(--color-main-background) 0%, transparent 100%);
|
|
||||||
transform: translateY(100%);
|
background-image: linear-gradient(180deg, var(--color-main-background) 3px, rgba(255, 255, 255, 0) 100%);
|
||||||
|
body.theme--dark & {
|
||||||
|
background-image: linear-gradient(180deg, var(--color-main-background) 3px, rgba(0, 0, 0, 0) 100%);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
& > * {
|
& > * {
|
||||||
@@ -398,10 +404,8 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
h3, form {
|
h3, form {
|
||||||
flex: 1 1 auto;
|
flex-grow: 1;
|
||||||
min-width: 0;
|
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
|
||||||
cursor: inherit;
|
cursor: inherit;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
|
|
||||||
@@ -414,8 +418,9 @@ export default {
|
|||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
|
max-width: calc($stack-width - 60px);
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
padding: $card-padding;
|
padding: 4px 4px;
|
||||||
font-size: var(--default-font-size);
|
font-size: var(--default-font-size);
|
||||||
|
|
||||||
&:focus-visible {
|
&:focus-visible {
|
||||||
@@ -425,6 +430,7 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
form {
|
form {
|
||||||
|
margin: -4px;
|
||||||
input {
|
input {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
padding: 0 6px;
|
padding: 0 6px;
|
||||||
@@ -447,25 +453,14 @@ export default {
|
|||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
z-index: 100;
|
z-index: 100;
|
||||||
display: flex;
|
display: flex;
|
||||||
padding-bottom: $stack-gap;
|
margin-bottom: 5px;
|
||||||
|
padding-top: var(--default-grid-baseline);
|
||||||
background-color: var(--color-main-background);
|
background-color: var(--color-main-background);
|
||||||
position: relative;
|
|
||||||
|
|
||||||
// Smooth fade out of the cards at the top
|
|
||||||
&:before {
|
|
||||||
content: '';
|
|
||||||
display: block;
|
|
||||||
position: absolute;
|
|
||||||
width: 100%;
|
|
||||||
height: $stack-gap;
|
|
||||||
z-index: 99;
|
|
||||||
transition: bottom var(--animation-slow);
|
|
||||||
background-image: linear-gradient(0deg, var(--color-main-background) 0%, transparent 100%);
|
|
||||||
transform: translateY(-100%);
|
|
||||||
}
|
|
||||||
|
|
||||||
form {
|
form {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
margin-left: $stack-spacing;
|
||||||
|
margin-right: $stack-spacing;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
border: 2px solid var(--color-border-maxcontrast);
|
border: 2px solid var(--color-border-maxcontrast);
|
||||||
border-radius: var(--border-radius-large);
|
border-radius: var(--border-radius-large);
|
||||||
@@ -486,6 +481,7 @@ export default {
|
|||||||
input {
|
input {
|
||||||
border: none;
|
border: none;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
|
padding: 4px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -44,7 +44,7 @@
|
|||||||
<script>
|
<script>
|
||||||
import { defineComponent } from 'vue'
|
import { defineComponent } from 'vue'
|
||||||
import { NcAvatar, NcSelect } from '@nextcloud/vue'
|
import { NcAvatar, NcSelect } from '@nextcloud/vue'
|
||||||
import AccountMultiple from 'vue-material-design-icons/AccountMultipleOutline.vue'
|
import AccountMultiple from 'vue-material-design-icons/AccountMultiple.vue'
|
||||||
|
|
||||||
export default defineComponent({
|
export default defineComponent({
|
||||||
name: 'AssignmentSelector',
|
name: 'AssignmentSelector',
|
||||||
|
|||||||
@@ -12,7 +12,6 @@
|
|||||||
:subtitle="subtitleTooltip"
|
:subtitle="subtitleTooltip"
|
||||||
:name-editable.sync="isEditingTitle"
|
:name-editable.sync="isEditingTitle"
|
||||||
@update:name="(value) => titleEditing = value"
|
@update:name="(value) => titleEditing = value"
|
||||||
@update:active="(value) => activeTabId = value"
|
|
||||||
@dismiss-editing="titleEditing = currentCard.title"
|
@dismiss-editing="titleEditing = currentCard.title"
|
||||||
@submit-name="handleSubmitTitle"
|
@submit-name="handleSubmitTitle"
|
||||||
@opened="focusHeader"
|
@opened="focusHeader"
|
||||||
@@ -38,8 +37,7 @@
|
|||||||
:name="t('deck', 'Details')">
|
:name="t('deck', 'Details')">
|
||||||
<CardSidebarTabDetails :card="currentCard" />
|
<CardSidebarTabDetails :card="currentCard" />
|
||||||
<template #icon>
|
<template #icon>
|
||||||
<HomeIcon v-if="activeTabId === 'details'" :size="20" />
|
<HomeIcon :size="20" />
|
||||||
<HomeOutlineIcon v-else :size="20" />
|
|
||||||
</template>
|
</template>
|
||||||
</NcAppSidebarTab>
|
</NcAppSidebarTab>
|
||||||
|
|
||||||
@@ -56,8 +54,7 @@
|
|||||||
:order="2"
|
:order="2"
|
||||||
:name="t('deck', 'Comments')">
|
:name="t('deck', 'Comments')">
|
||||||
<template #icon>
|
<template #icon>
|
||||||
<CommentIcon v-if="activeTabId === 'comments'" :size="20" />
|
<CommentIcon :size="20" />
|
||||||
<CommentOutlineIcon v-else :size="20" />
|
|
||||||
</template>
|
</template>
|
||||||
<CardSidebarTabComments :card="currentCard" :tab-query="tabQuery" />
|
<CardSidebarTabComments :card="currentCard" :tab-query="tabQuery" />
|
||||||
</NcAppSidebarTab>
|
</NcAppSidebarTab>
|
||||||
@@ -87,9 +84,7 @@ import relativeDate from '../../mixins/relativeDate.js'
|
|||||||
import moment from '@nextcloud/moment'
|
import moment from '@nextcloud/moment'
|
||||||
import AttachmentIcon from 'vue-material-design-icons/Paperclip.vue'
|
import AttachmentIcon from 'vue-material-design-icons/Paperclip.vue'
|
||||||
import HomeIcon from 'vue-material-design-icons/Home.vue'
|
import HomeIcon from 'vue-material-design-icons/Home.vue'
|
||||||
import HomeOutlineIcon from 'vue-material-design-icons/HomeOutline.vue'
|
|
||||||
import CommentIcon from 'vue-material-design-icons/Comment.vue'
|
import CommentIcon from 'vue-material-design-icons/Comment.vue'
|
||||||
import CommentOutlineIcon from 'vue-material-design-icons/CommentOutline.vue'
|
|
||||||
import ActivityIcon from 'vue-material-design-icons/LightningBolt.vue'
|
import ActivityIcon from 'vue-material-design-icons/LightningBolt.vue'
|
||||||
|
|
||||||
import { showError, showWarning } from '@nextcloud/dialogs'
|
import { showError, showWarning } from '@nextcloud/dialogs'
|
||||||
@@ -112,9 +107,7 @@ export default {
|
|||||||
ActivityIcon,
|
ActivityIcon,
|
||||||
AttachmentIcon,
|
AttachmentIcon,
|
||||||
CommentIcon,
|
CommentIcon,
|
||||||
CommentOutlineIcon,
|
|
||||||
HomeIcon,
|
HomeIcon,
|
||||||
HomeOutlineIcon,
|
|
||||||
CardMenuEntries,
|
CardMenuEntries,
|
||||||
},
|
},
|
||||||
mixins: [relativeDate],
|
mixins: [relativeDate],
|
||||||
@@ -140,7 +133,6 @@ export default {
|
|||||||
titleEditing: '',
|
titleEditing: '',
|
||||||
hasActivity: capabilities && capabilities.activity,
|
hasActivity: capabilities && capabilities.activity,
|
||||||
locale: getLocale(),
|
locale: getLocale(),
|
||||||
activeTabId: this.tabId || 'details',
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
@@ -178,16 +170,9 @@ export default {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
currentCard: {
|
currentCard(newCard, oldCard) {
|
||||||
handler(newCard, oldCard) {
|
if (newCard.id === oldCard.id) return
|
||||||
if (!newCard) {
|
this.focusHeader()
|
||||||
return
|
|
||||||
}
|
|
||||||
// Only refocus when actually switching cards, not during autosave updates
|
|
||||||
if (!oldCard?.id || newCard.id !== oldCard.id) {
|
|
||||||
this.focusHeader()
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
'currentCard.title': {
|
'currentCard.title': {
|
||||||
immediate: true,
|
immediate: true,
|
||||||
|
|||||||
@@ -125,7 +125,7 @@ export default {
|
|||||||
if (mention.attributes['data-at-embedded'].value === 'true') {
|
if (mention.attributes['data-at-embedded'].value === 'true') {
|
||||||
mentionValue = mention.parentNode.parentNode.querySelector('.user-bubble__wrapper').attributes['data-mention-id'].value
|
mentionValue = mention.parentNode.parentNode.querySelector('.user-bubble__wrapper').attributes['data-mention-id'].value
|
||||||
} else {
|
} else {
|
||||||
mentionValue = mention.firstChild.attributes['data-mention-id'].value
|
mentionValue = mention.firstElementChild.attributes['data-mention-id'].value
|
||||||
}
|
}
|
||||||
if (mentionValue.indexOf(' ') !== -1) {
|
if (mentionValue.indexOf(' ') !== -1) {
|
||||||
mention.replaceWith(' @"' + mentionValue + '" ')
|
mention.replaceWith(' @"' + mentionValue + '" ')
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ import CommentForm from './CommentForm.vue'
|
|||||||
import { getCurrentUser } from '@nextcloud/auth'
|
import { getCurrentUser } from '@nextcloud/auth'
|
||||||
import md5 from 'blueimp-md5'
|
import md5 from 'blueimp-md5'
|
||||||
import relativeDate from '../../mixins/relativeDate.js'
|
import relativeDate from '../../mixins/relativeDate.js'
|
||||||
import ReplyIcon from 'vue-material-design-icons/ReplyOutline.vue'
|
import ReplyIcon from 'vue-material-design-icons/Reply.vue'
|
||||||
import moment from 'moment'
|
import moment from 'moment'
|
||||||
|
|
||||||
const AtMention = {
|
const AtMention = {
|
||||||
|
|||||||
@@ -99,10 +99,10 @@ import {
|
|||||||
import readableDate from '../../mixins/readableDate.js'
|
import readableDate from '../../mixins/readableDate.js'
|
||||||
import { getDayNamesMin, getFirstDay, getMonthNamesShort } from '@nextcloud/l10n'
|
import { getDayNamesMin, getFirstDay, getMonthNamesShort } from '@nextcloud/l10n'
|
||||||
import moment from '@nextcloud/moment'
|
import moment from '@nextcloud/moment'
|
||||||
import ArchiveIcon from 'vue-material-design-icons/ArchiveOutline.vue'
|
import ArchiveIcon from 'vue-material-design-icons/Archive.vue'
|
||||||
import Plus from 'vue-material-design-icons/Plus.vue'
|
import Plus from 'vue-material-design-icons/Plus.vue'
|
||||||
import Calendar from 'vue-material-design-icons/CalendarOutline.vue'
|
import Calendar from 'vue-material-design-icons/Calendar.vue'
|
||||||
import CalendarCheck from 'vue-material-design-icons/CalendarCheckOutline.vue'
|
import CalendarCheck from 'vue-material-design-icons/CalendarCheck.vue'
|
||||||
import CheckIcon from 'vue-material-design-icons/Check.vue'
|
import CheckIcon from 'vue-material-design-icons/Check.vue'
|
||||||
import ClearIcon from 'vue-material-design-icons/Close.vue'
|
import ClearIcon from 'vue-material-design-icons/Close.vue'
|
||||||
import CardDetailEntry from './CardDetailEntry.vue'
|
import CardDetailEntry from './CardDetailEntry.vue'
|
||||||
|
|||||||
@@ -44,7 +44,7 @@
|
|||||||
<script>
|
<script>
|
||||||
import { NcSelect } from '@nextcloud/vue'
|
import { NcSelect } from '@nextcloud/vue'
|
||||||
import Color from '../../mixins/color.js'
|
import Color from '../../mixins/color.js'
|
||||||
import TagMultiple from 'vue-material-design-icons/TagMultipleOutline.vue'
|
import TagMultiple from 'vue-material-design-icons/TagMultiple.vue'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'TagSelector',
|
name: 'TagSelector',
|
||||||
|
|||||||
@@ -70,7 +70,7 @@
|
|||||||
<script>
|
<script>
|
||||||
import { NcAvatar, NcPopover } from '@nextcloud/vue'
|
import { NcAvatar, NcPopover } from '@nextcloud/vue'
|
||||||
import { generateUrl } from '@nextcloud/router'
|
import { generateUrl } from '@nextcloud/router'
|
||||||
import AccountMultiple from 'vue-material-design-icons/AccountMultipleOutline.vue'
|
import AccountMultiple from 'vue-material-design-icons/AccountMultiple.vue'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'AvatarList',
|
name: 'AvatarList',
|
||||||
|
|||||||
@@ -49,8 +49,8 @@ import CardId from './badges/CardId.vue'
|
|||||||
import TextIcon from 'vue-material-design-icons/Text.vue'
|
import TextIcon from 'vue-material-design-icons/Text.vue'
|
||||||
import AttachmentIcon from 'vue-material-design-icons/Paperclip.vue'
|
import AttachmentIcon from 'vue-material-design-icons/Paperclip.vue'
|
||||||
import CheckmarkIcon from 'vue-material-design-icons/CheckboxMarked.vue'
|
import CheckmarkIcon from 'vue-material-design-icons/CheckboxMarked.vue'
|
||||||
import CommentIcon from 'vue-material-design-icons/CommentOutline.vue'
|
import CommentIcon from 'vue-material-design-icons/Comment.vue'
|
||||||
import CommentUnreadIcon from 'vue-material-design-icons/CommentAccountOutline.vue'
|
import CommentUnreadIcon from 'vue-material-design-icons/CommentAccount.vue'
|
||||||
import DueDate from './badges/DueDate.vue'
|
import DueDate from './badges/DueDate.vue'
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@@ -101,8 +101,6 @@ export default {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
@import './../../css/variables';
|
|
||||||
|
|
||||||
.badges {
|
.badges {
|
||||||
display: flex;
|
display: flex;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
@@ -113,7 +111,6 @@ export default {
|
|||||||
.icon-badge {
|
.icon-badge {
|
||||||
color: var(--color-text-maxcontrast);
|
color: var(--color-text-maxcontrast);
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
|
||||||
margin-right: 2px;
|
margin-right: 2px;
|
||||||
|
|
||||||
span,
|
span,
|
||||||
@@ -128,7 +125,42 @@ export default {
|
|||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
gap: 3px;
|
gap: 3px;
|
||||||
height: var(--default-clickable-area);
|
}
|
||||||
|
|
||||||
|
.badges .icon.due {
|
||||||
|
background-position: 4px center;
|
||||||
|
border-radius: var(--border-radius);
|
||||||
|
padding: 4px;
|
||||||
|
font-size: 13px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
opacity: .5;
|
||||||
|
flex-shrink: 1;
|
||||||
|
|
||||||
|
.icon {
|
||||||
|
background-size: contain;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.overdue {
|
||||||
|
background-color: var(--color-error);
|
||||||
|
color: var(--color-primary-element-text);
|
||||||
|
opacity: .7;
|
||||||
|
}
|
||||||
|
&.now {
|
||||||
|
background-color: var(--color-warning);
|
||||||
|
opacity: .7;
|
||||||
|
}
|
||||||
|
&.next {
|
||||||
|
background-color: var(--color-background-dark);
|
||||||
|
opacity: .7;
|
||||||
|
}
|
||||||
|
|
||||||
|
span {
|
||||||
|
margin-left: 20px;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.badge-left, .badge-right {
|
.badge-left, .badge-right {
|
||||||
|
|||||||
@@ -4,10 +4,13 @@
|
|||||||
-->
|
-->
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div v-if="cardId && ( attachments.length > 0 )" class="card-cover">
|
<div v-if="referencePreview" class="card-cover">
|
||||||
<div v-for="attachment in attachments"
|
<div class="image-wrapper rounded-left rounded-right" :style="{ backgroundImage: `url(${referencePreview})`}" />
|
||||||
|
</div>
|
||||||
|
<div v-else-if="cardId && ( attachments.length > 0 )" class="card-cover">
|
||||||
|
<div v-for="(attachment, index) in attachments"
|
||||||
:key="attachment.id"
|
:key="attachment.id"
|
||||||
class="image-wrapper"
|
:class="['image-wrapper', { 'rounded-left': index === 0 }, { 'rounded-right': index === attachments.length - 1 }]"
|
||||||
:style="{ backgroundImage: `url(${attachmentPreview(attachment)})` }" />
|
:style="{ backgroundImage: `url(${attachmentPreview(attachment)})` }" />
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
@@ -74,7 +77,9 @@ export default {
|
|||||||
.card-cover {
|
.card-cover {
|
||||||
height: 90px;
|
height: 90px;
|
||||||
display: flex;
|
display: flex;
|
||||||
margin: $card-image-margin $card-image-margin 0;
|
margin-top: -4px;
|
||||||
|
margin-left: -4px;
|
||||||
|
margin-right: -4px;
|
||||||
|
|
||||||
.image-wrapper {
|
.image-wrapper {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
@@ -82,6 +87,12 @@ export default {
|
|||||||
background-size: cover;
|
background-size: cover;
|
||||||
background-repeat: no-repeat;
|
background-repeat: no-repeat;
|
||||||
background-position: center center;
|
background-position: center center;
|
||||||
|
&.rounded-left {
|
||||||
|
border-top-left-radius: calc(var(--border-radius-large) - 1px);
|
||||||
|
}
|
||||||
|
&.rounded-right {
|
||||||
|
border-top-right-radius: calc(var(--border-radius-large) - 1px);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<AttachmentDragAndDrop v-if="card" :card-id="card.id" class="drop-upload--card">
|
<AttachmentDragAndDrop v-if="card" :card-id="card.id" class="drop-upload--card">
|
||||||
<div :ref="`card${card.id}`"
|
<div :ref="`card${card.id}`"
|
||||||
:class="{'compact': compactMode, 'current-card': currentCard, 'no-labels': !hasLabels, 'card__editable': canEdit, 'card__archived': card.archived, 'card__highlight': highlight}"
|
:class="{'compact': compactMode, 'current-card': currentCard, 'has-labels': card.labels && card.labels.length > 0, 'card__editable': canEdit, 'card__archived': card.archived, 'card__highlight': highlight}"
|
||||||
tag="div"
|
tag="div"
|
||||||
:tabindex="0"
|
:tabindex="0"
|
||||||
class="card"
|
class="card"
|
||||||
@@ -331,17 +331,16 @@ export default {
|
|||||||
border-radius: var(--border-radius-large);
|
border-radius: var(--border-radius-large);
|
||||||
font-size: 100%;
|
font-size: 100%;
|
||||||
background-color: var(--color-main-background);
|
background-color: var(--color-main-background);
|
||||||
padding: $card-padding;
|
margin-bottom: $card-spacing;
|
||||||
|
padding: var(--default-grid-baseline) $card-padding;
|
||||||
border: 2px solid var(--color-border-dark);
|
border: 2px solid var(--color-border-dark);
|
||||||
width: 100%;
|
width: 100%;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
gap: $card-gap;
|
|
||||||
overflow: hidden;
|
|
||||||
|
|
||||||
&:deep(*) {
|
&:deep(*:not(.dragDisabled)) {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
&.current-card {
|
&.current-card {
|
||||||
border: 2px solid var(--color-primary-element);
|
border: 2px solid var(--color-primary-element);
|
||||||
@@ -360,10 +359,12 @@ export default {
|
|||||||
h4 {
|
h4 {
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
|
padding: var(--default-grid-baseline);
|
||||||
flex-grow: 1;
|
flex-grow: 1;
|
||||||
font-size: 100%;
|
font-size: 100%;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
word-wrap: break-word;
|
word-wrap: break-word;
|
||||||
|
padding-left: 4px;
|
||||||
align-self: center;
|
align-self: center;
|
||||||
|
|
||||||
:deep(a) {
|
:deep(a) {
|
||||||
@@ -373,6 +374,9 @@ export default {
|
|||||||
&.editable {
|
&.editable {
|
||||||
span {
|
span {
|
||||||
cursor: text;
|
cursor: text;
|
||||||
|
padding-right: 8px;
|
||||||
|
padding-top: 3px;
|
||||||
|
padding-bottom: 3px;
|
||||||
|
|
||||||
&:focus, &:focus-visible {
|
&:focus, &:focus-visible {
|
||||||
outline: none;
|
outline: none;
|
||||||
@@ -381,7 +385,6 @@ export default {
|
|||||||
|
|
||||||
&:focus-within {
|
&:focus-within {
|
||||||
outline: 2px solid var(--color-border-dark);
|
outline: 2px solid var(--color-border-dark);
|
||||||
outline-offset: 4px;
|
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -424,6 +427,8 @@ export default {
|
|||||||
.card-labels {
|
.card-labels {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: end;
|
align-items: end;
|
||||||
|
padding-left: var(--default-grid-baseline);
|
||||||
|
padding-top: var(--default-grid-baseline);
|
||||||
|
|
||||||
.labels {
|
.labels {
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
@@ -439,7 +444,7 @@ export default {
|
|||||||
|
|
||||||
.card-related {
|
.card-related {
|
||||||
display: flex;
|
display: flex;
|
||||||
padding: 4px;
|
padding: 12px;
|
||||||
padding-bottom: 0px;
|
padding-bottom: 0px;
|
||||||
color: var(--color-text-maxcontrast);
|
color: var(--color-text-maxcontrast);
|
||||||
|
|
||||||
@@ -464,8 +469,8 @@ export default {
|
|||||||
height: 32px;
|
height: 32px;
|
||||||
width: 32px;
|
width: 32px;
|
||||||
}
|
}
|
||||||
&.no-labels {
|
&.has-labels {
|
||||||
padding-bottom: var(--default-grid-baseline);
|
padding-bottom: $card-padding;
|
||||||
}
|
}
|
||||||
.labels {
|
.labels {
|
||||||
height: 6px;
|
height: 6px;
|
||||||
|
|||||||
@@ -63,9 +63,9 @@
|
|||||||
<script>
|
<script>
|
||||||
import { NcActionButton } from '@nextcloud/vue'
|
import { NcActionButton } from '@nextcloud/vue'
|
||||||
import { mapGetters, mapState } from 'vuex'
|
import { mapGetters, mapState } from 'vuex'
|
||||||
import ArchiveIcon from 'vue-material-design-icons/ArchiveOutline.vue'
|
import ArchiveIcon from 'vue-material-design-icons/Archive.vue'
|
||||||
import CardBulletedIcon from 'vue-material-design-icons/CardBulletedOutline.vue'
|
import CardBulletedIcon from 'vue-material-design-icons/CardBulleted.vue'
|
||||||
import PencilIcon from 'vue-material-design-icons/PencilOutline.vue'
|
import PencilIcon from 'vue-material-design-icons/Pencil.vue'
|
||||||
import { generateUrl } from '@nextcloud/router'
|
import { generateUrl } from '@nextcloud/router'
|
||||||
import { getCurrentUser } from '@nextcloud/auth'
|
import { getCurrentUser } from '@nextcloud/auth'
|
||||||
import { showUndo } from '@nextcloud/dialogs'
|
import { showUndo } from '@nextcloud/dialogs'
|
||||||
|
|||||||
@@ -95,16 +95,16 @@ export default {
|
|||||||
z-index: 2;
|
z-index: 2;
|
||||||
|
|
||||||
[data-due-state='Overdue'] & {
|
[data-due-state='Overdue'] & {
|
||||||
color: var(--color-element-error, var(--color-error-text));
|
color: var(--color-error-text);
|
||||||
background-color: rgba(var(--color-error-rgb), .5);
|
background-color: rgba(var(--color-error-rgb), .1);
|
||||||
}
|
}
|
||||||
[data-due-state='Now'] & {
|
[data-due-state='Now'] & {
|
||||||
color: var(--color-element-warning, var(--color-warning-text));
|
color: var(--color-warning-text);
|
||||||
background-color: rgba(var(--color-warning-rgb), .5);
|
background-color: rgba(var(--color-warning-rgb), .1);
|
||||||
}
|
}
|
||||||
[data-due-state='Done'] & {
|
[data-due-state='Done'] & {
|
||||||
color: var(--color-element-success, var(--color-success-text));
|
color: var(--color-success-text);
|
||||||
background-color: rgba(var(--color-success-rgb), .5);
|
background-color: rgba(var(--color-success-rgb), .1);
|
||||||
}
|
}
|
||||||
|
|
||||||
.due--label {
|
.due--label {
|
||||||
|
|||||||
@@ -10,8 +10,7 @@
|
|||||||
:exact="true"
|
:exact="true"
|
||||||
to="/">
|
to="/">
|
||||||
<template #icon>
|
<template #icon>
|
||||||
<CalendarIcon v-if="$route.path === '/'" :size="20" />
|
<CalendarIcon :size="20" />
|
||||||
<CalendarOutlineIcon v-else :size="20" />
|
|
||||||
</template>
|
</template>
|
||||||
</NcAppNavigationItem>
|
</NcAppNavigationItem>
|
||||||
<AppNavigationBoardCategory id="deck-navigation-all"
|
<AppNavigationBoardCategory id="deck-navigation-all"
|
||||||
@@ -30,8 +29,7 @@
|
|||||||
:text="t('deck', 'Archived boards')"
|
:text="t('deck', 'Archived boards')"
|
||||||
:boards="archivedBoards">
|
:boards="archivedBoards">
|
||||||
<template #icon>
|
<template #icon>
|
||||||
<ArchiveIcon v-if="$route.path === '/board/archived'" :size="20" decorative />
|
<ArchiveIcon :size="20" decorative />
|
||||||
<ArchiveOutlineIcon v-else :size="20" decorative />
|
|
||||||
</template>
|
</template>
|
||||||
</AppNavigationBoardCategory>
|
</AppNavigationBoardCategory>
|
||||||
<AppNavigationBoardCategory id="deck-navigation-shared"
|
<AppNavigationBoardCategory id="deck-navigation-shared"
|
||||||
@@ -44,7 +42,6 @@
|
|||||||
</template>
|
</template>
|
||||||
</AppNavigationBoardCategory>
|
</AppNavigationBoardCategory>
|
||||||
<AppNavigationAddBoard v-if="canCreate" />
|
<AppNavigationAddBoard v-if="canCreate" />
|
||||||
<AppNavigationImportBoard v-if="canCreate" />
|
|
||||||
</template>
|
</template>
|
||||||
<template #footer>
|
<template #footer>
|
||||||
<NcAppNavigationSettings :name="t('deck', 'Deck settings')">
|
<NcAppNavigationSettings :name="t('deck', 'Deck settings')">
|
||||||
@@ -114,14 +111,11 @@ import { loadState } from '@nextcloud/initial-state'
|
|||||||
import { generateOcsUrl } from '@nextcloud/router'
|
import { generateOcsUrl } from '@nextcloud/router'
|
||||||
import { getCurrentUser } from '@nextcloud/auth'
|
import { getCurrentUser } from '@nextcloud/auth'
|
||||||
import ArchiveIcon from 'vue-material-design-icons/Archive.vue'
|
import ArchiveIcon from 'vue-material-design-icons/Archive.vue'
|
||||||
import ArchiveOutlineIcon from 'vue-material-design-icons/ArchiveOutline.vue'
|
|
||||||
import CalendarIcon from 'vue-material-design-icons/Calendar.vue'
|
import CalendarIcon from 'vue-material-design-icons/Calendar.vue'
|
||||||
import CalendarOutlineIcon from 'vue-material-design-icons/CalendarOutline.vue'
|
|
||||||
import DeckIcon from './../icons/DeckIcon.vue'
|
import DeckIcon from './../icons/DeckIcon.vue'
|
||||||
import ShareVariantIcon from 'vue-material-design-icons/ShareOutline.vue'
|
import ShareVariantIcon from 'vue-material-design-icons/Share.vue'
|
||||||
import HelpModal from './../modals/HelpModal.vue'
|
import HelpModal from './../modals/HelpModal.vue'
|
||||||
import { subscribe } from '@nextcloud/event-bus'
|
import { subscribe } from '@nextcloud/event-bus'
|
||||||
import AppNavigationImportBoard from './AppNavigationImportBoard.vue'
|
|
||||||
|
|
||||||
const canCreateState = loadState('deck', 'canCreate')
|
const canCreateState = loadState('deck', 'canCreate')
|
||||||
|
|
||||||
@@ -133,13 +127,10 @@ export default {
|
|||||||
NcButton,
|
NcButton,
|
||||||
AppNavigationAddBoard,
|
AppNavigationAddBoard,
|
||||||
AppNavigationBoardCategory,
|
AppNavigationBoardCategory,
|
||||||
AppNavigationImportBoard,
|
|
||||||
NcSelect,
|
NcSelect,
|
||||||
NcAppNavigationItem,
|
NcAppNavigationItem,
|
||||||
ArchiveIcon,
|
ArchiveIcon,
|
||||||
ArchiveOutlineIcon,
|
|
||||||
CalendarIcon,
|
CalendarIcon,
|
||||||
CalendarOutlineIcon,
|
|
||||||
DeckIcon,
|
DeckIcon,
|
||||||
ShareVariantIcon,
|
ShareVariantIcon,
|
||||||
HelpModal,
|
HelpModal,
|
||||||
|
|||||||
@@ -15,10 +15,6 @@
|
|||||||
<template #icon>
|
<template #icon>
|
||||||
<NcAppNavigationIconBullet :color="board.color" />
|
<NcAppNavigationIconBullet :color="board.color" />
|
||||||
<BoardCloneModal v-if="cloneModalOpen" :board-title="board.title" @close="onCloseCloneModal" />
|
<BoardCloneModal v-if="cloneModalOpen" :board-title="board.title" @close="onCloseCloneModal" />
|
||||||
<BoardExportModal v-if="exportModalOpen"
|
|
||||||
:board-title="board.title"
|
|
||||||
@export="onExportBoard"
|
|
||||||
@close="onCloseExportBoard" />
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template #counter>
|
<template #counter>
|
||||||
@@ -154,9 +150,9 @@
|
|||||||
<script>
|
<script>
|
||||||
import { NcAppNavigationIconBullet, NcAppNavigationItem, NcColorPicker, NcButton, NcTextField, NcActionButton } from '@nextcloud/vue'
|
import { NcAppNavigationIconBullet, NcAppNavigationItem, NcColorPicker, NcButton, NcTextField, NcActionButton } from '@nextcloud/vue'
|
||||||
import ClickOutside from 'vue-click-outside'
|
import ClickOutside from 'vue-click-outside'
|
||||||
import ArchiveIcon from 'vue-material-design-icons/ArchiveOutline.vue'
|
import ArchiveIcon from 'vue-material-design-icons/Archive.vue'
|
||||||
import CloneIcon from 'vue-material-design-icons/ContentDuplicate.vue'
|
import CloneIcon from 'vue-material-design-icons/ContentDuplicate.vue'
|
||||||
import AccountIcon from 'vue-material-design-icons/AccountOutline.vue'
|
import AccountIcon from 'vue-material-design-icons/Account.vue'
|
||||||
import CloseIcon from 'vue-material-design-icons/Close.vue'
|
import CloseIcon from 'vue-material-design-icons/Close.vue'
|
||||||
import CheckIcon from 'vue-material-design-icons/Check.vue'
|
import CheckIcon from 'vue-material-design-icons/Check.vue'
|
||||||
|
|
||||||
@@ -165,8 +161,6 @@ import { emit } from '@nextcloud/event-bus'
|
|||||||
|
|
||||||
import isTouchDevice from '../../mixins/isTouchDevice.js'
|
import isTouchDevice from '../../mixins/isTouchDevice.js'
|
||||||
import BoardCloneModal from './BoardCloneModal.vue'
|
import BoardCloneModal from './BoardCloneModal.vue'
|
||||||
import BoardExportModal from './BoardExportModal.vue'
|
|
||||||
import { showLoading } from '@nextcloud/dialogs'
|
|
||||||
|
|
||||||
const canCreateState = loadState('deck', 'canCreate')
|
const canCreateState = loadState('deck', 'canCreate')
|
||||||
|
|
||||||
@@ -185,7 +179,6 @@ export default {
|
|||||||
CloseIcon,
|
CloseIcon,
|
||||||
CheckIcon,
|
CheckIcon,
|
||||||
BoardCloneModal,
|
BoardCloneModal,
|
||||||
BoardExportModal,
|
|
||||||
},
|
},
|
||||||
directives: {
|
directives: {
|
||||||
ClickOutside,
|
ClickOutside,
|
||||||
@@ -214,7 +207,6 @@ export default {
|
|||||||
updateDueSetting: null,
|
updateDueSetting: null,
|
||||||
canCreate: canCreateState,
|
canCreate: canCreateState,
|
||||||
cloneModalOpen: false,
|
cloneModalOpen: false,
|
||||||
exportModalOpen: false,
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
@@ -354,16 +346,7 @@ export default {
|
|||||||
this.updateDueSetting = null
|
this.updateDueSetting = null
|
||||||
},
|
},
|
||||||
actionExport() {
|
actionExport() {
|
||||||
this.exportModalOpen = true
|
this.boardApi.exportBoard(this.board)
|
||||||
},
|
|
||||||
async onExportBoard(format) {
|
|
||||||
this.exportModalOpen = false
|
|
||||||
const loadingToast = showLoading(t('deck', 'Exporting board...'))
|
|
||||||
await this.boardApi.exportBoard(this.board, format)
|
|
||||||
loadingToast.hideToast()
|
|
||||||
},
|
|
||||||
onCloseExportBoard() {
|
|
||||||
this.exportModalOpen = false
|
|
||||||
},
|
},
|
||||||
onNavigate() {
|
onNavigate() {
|
||||||
if (this.isTouchDevice) {
|
if (this.isTouchDevice) {
|
||||||
|
|||||||
@@ -1,55 +0,0 @@
|
|||||||
<!--
|
|
||||||
- SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors
|
|
||||||
- SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
-->
|
|
||||||
<template>
|
|
||||||
<div>
|
|
||||||
<NcAppNavigationItem :name="t('deck', 'Import board')" icon="icon-upload" @click.prevent.stop="startImportBoard" />
|
|
||||||
<input ref="fileInput"
|
|
||||||
type="file"
|
|
||||||
accept="application/json"
|
|
||||||
style="display: none;"
|
|
||||||
@change="doImportBoard">
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import { NcAppNavigationItem } from '@nextcloud/vue'
|
|
||||||
import { showError } from '../../helpers/errors.js'
|
|
||||||
import { showSuccess, showLoading } from '@nextcloud/dialogs'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'AppNavigationImportBoard',
|
|
||||||
components: { NcAppNavigationItem },
|
|
||||||
props: {
|
|
||||||
loading: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
value: '',
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
startImportBoard() {
|
|
||||||
this.$refs.fileInput.value = ''
|
|
||||||
this.$refs.fileInput.click()
|
|
||||||
},
|
|
||||||
async doImportBoard(event) {
|
|
||||||
const file = event.target.files[0]
|
|
||||||
if (file) {
|
|
||||||
const loadingToast = showLoading(t('deck', 'Importing board...'))
|
|
||||||
const result = await this.$store.dispatch('importBoard', file)
|
|
||||||
loadingToast.hideToast()
|
|
||||||
if (result?.message) {
|
|
||||||
showError(result)
|
|
||||||
} else {
|
|
||||||
showSuccess(t('deck', 'Board imported successfully'))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
@@ -1,78 +0,0 @@
|
|||||||
<!--
|
|
||||||
- SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors
|
|
||||||
- SPDX-License-Identifier: AGPL-3.0-or-later
|
|
||||||
-->
|
|
||||||
<template>
|
|
||||||
<NcDialog :name="t('deck', 'Export {boardTitle}', {boardTitle: boardTitle})" @update:open="close">
|
|
||||||
<div class="modal__content">
|
|
||||||
<NcCheckboxRadioSwitch :checked.sync="exportFormat"
|
|
||||||
value="json"
|
|
||||||
type="radio"
|
|
||||||
name="board_export_format">
|
|
||||||
{{ t('deck', 'Export as JSON') }}
|
|
||||||
</NcCheckboxRadioSwitch>
|
|
||||||
<NcCheckboxRadioSwitch :checked.sync="exportFormat"
|
|
||||||
value="csv"
|
|
||||||
type="radio"
|
|
||||||
name="board_export_format">
|
|
||||||
{{ t('deck', 'Export as CSV') }}
|
|
||||||
</NcCheckboxRadioSwitch>
|
|
||||||
|
|
||||||
<p class="note">
|
|
||||||
{{ t('deck', 'Note: Only the JSON format is supported for importing back into the Deck app.') }}
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<template #actions>
|
|
||||||
<NcButton @click="close">
|
|
||||||
{{ t('deck', 'Cancel') }}
|
|
||||||
</NcButton>
|
|
||||||
<NcButton type="primary" @click="exportBoard">
|
|
||||||
{{ t('deck', 'Export') }}
|
|
||||||
</NcButton>
|
|
||||||
</template>
|
|
||||||
</NcDialog>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import { NcButton, NcCheckboxRadioSwitch, NcDialog } from '@nextcloud/vue'
|
|
||||||
|
|
||||||
export default {
|
|
||||||
name: 'BoardExportModal',
|
|
||||||
components: {
|
|
||||||
NcDialog,
|
|
||||||
NcCheckboxRadioSwitch,
|
|
||||||
NcButton,
|
|
||||||
},
|
|
||||||
props: {
|
|
||||||
boardTitle: {
|
|
||||||
type: String,
|
|
||||||
default: 'Board',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
exportFormat: 'json',
|
|
||||||
}
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
exportBoard() {
|
|
||||||
this.$emit('export', this.exportFormat)
|
|
||||||
this.close()
|
|
||||||
},
|
|
||||||
close() {
|
|
||||||
this.$emit('close')
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
.modal__content {
|
|
||||||
margin: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
p.note {
|
|
||||||
margin-top: 10px;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@@ -14,25 +14,45 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div v-else-if="isValidFilter" class="overview">
|
<div v-else-if="isValidFilter" class="overview">
|
||||||
<div v-for="columnProps in columnPropsList" :key="columnProps.title" class="dashboard-column">
|
<div class="dashboard-column">
|
||||||
<div class="dashboard-column__header">
|
<h3>{{ t('deck', 'Overdue') }}</h3>
|
||||||
<h3 class="dashboard-column__header-title"
|
<div v-for="card in sortCards('overdue')" :key="card.id">
|
||||||
:title="columnProps.title"
|
<CardItem :id="card.id" />
|
||||||
:aria-label="columnProps.title">
|
|
||||||
{{ t('deck', columnProps.title) }}
|
|
||||||
</h3>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="dashboard-column__list">
|
</div>
|
||||||
<template v-if="columnProps.sort === false">
|
|
||||||
<CardItem v-for="card in filterCards(columnProps.filter)"
|
<div class="dashboard-column">
|
||||||
:id="card.id"
|
<h3>{{ t('deck', 'Today') }}</h3>
|
||||||
:key="card.id" />
|
<div v-for="card in sortCards('today')" :key="card.id">
|
||||||
</template>
|
<CardItem :id="card.id" />
|
||||||
<template v-else>
|
</div>
|
||||||
<CardItem v-for="card in sortCards(filterCards(columnProps.filter))"
|
</div>
|
||||||
:id="card.id"
|
|
||||||
:key="card.id" />
|
<div class="dashboard-column">
|
||||||
</template>
|
<h3>{{ t('deck', 'Tomorrow') }}</h3>
|
||||||
|
<div v-for="card in sortCards('tomorrow')" :key="card.id">
|
||||||
|
<CardItem :id="card.id" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="dashboard-column">
|
||||||
|
<h3>{{ t('deck', 'Next 7 days') }}</h3>
|
||||||
|
<div v-for="card in sortCards('nextSevenDays')" :key="card.id">
|
||||||
|
<CardItem :id="card.id" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="dashboard-column">
|
||||||
|
<h3>{{ t('deck', 'Later') }}</h3>
|
||||||
|
<div v-for="card in sortCards('later')" :key="card.id">
|
||||||
|
<CardItem :id="card.id" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="dashboard-column">
|
||||||
|
<h3>{{ t('deck', 'No due') }}</h3>
|
||||||
|
<div v-for="card in assignedCardsDashboard.nodue" :key="card.id">
|
||||||
|
<CardItem :id="card.id" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -53,34 +73,6 @@ const SUPPORTED_FILTERS = [
|
|||||||
FILTER_UPCOMING,
|
FILTER_UPCOMING,
|
||||||
]
|
]
|
||||||
|
|
||||||
const COLUMN_PROPS_LIST = [
|
|
||||||
{
|
|
||||||
title: 'Overdue',
|
|
||||||
filter: 'overdue',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: 'Today',
|
|
||||||
filter: 'today',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: 'Tomorrow',
|
|
||||||
filter: 'tomorrow',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: 'Next 7 days',
|
|
||||||
filter: 'nextSevenDays',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: 'Later',
|
|
||||||
filter: 'later',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: 'No due',
|
|
||||||
filter: 'nodue',
|
|
||||||
sort: false,
|
|
||||||
},
|
|
||||||
]
|
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'Overview',
|
name: 'Overview',
|
||||||
components: {
|
components: {
|
||||||
@@ -97,7 +89,6 @@ export default {
|
|||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
loading: true,
|
loading: true,
|
||||||
columnPropsList: COLUMN_PROPS_LIST,
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
@@ -134,16 +125,16 @@ export default {
|
|||||||
}
|
}
|
||||||
this.loading = false
|
this.loading = false
|
||||||
},
|
},
|
||||||
filterCards(when) {
|
sortCards(when) {
|
||||||
return this.assignedCardsDashboard[when]
|
const cards = this.assignedCardsDashboard[when]
|
||||||
},
|
|
||||||
sortCards(cards) {
|
|
||||||
if (!cards) {
|
if (!cards) {
|
||||||
return null
|
return null
|
||||||
} else {
|
} else {
|
||||||
return cards.toSorted((current, next) => {
|
return cards.toSorted((current, next) => {
|
||||||
const currentDueDate = new Date(current.duedate)
|
const currentDueDate = new Date(current.duedate)
|
||||||
const nextDueDate = new Date(next.duedate)
|
const nextDueDate = new Date(next.duedate)
|
||||||
|
|
||||||
return currentDueDate - nextDueDate
|
return currentDueDate - nextDueDate
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -160,75 +151,38 @@ export default {
|
|||||||
position: relative;
|
position: relative;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
max-height: calc(100vh - 50px);
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
|
|
||||||
.overview {
|
.overview {
|
||||||
position: relative;
|
position: relative;
|
||||||
overflow-x: auto;
|
height: calc(100% - var(--default-clickable-area));
|
||||||
flex-grow: 1;
|
overflow-x: scroll;
|
||||||
scrollbar-gutter: stable;
|
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: stretch;
|
align-items: stretch;
|
||||||
gap: $board-gap;
|
padding-left: $board-spacing;
|
||||||
padding: 0 $board-gap;
|
padding-right: $board-spacing;
|
||||||
|
|
||||||
.dashboard-column {
|
.dashboard-column {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
flex: 0 1 $card-max-width;
|
min-width: $stack-width;
|
||||||
min-width: $card-min-width;
|
width: $stack-width;
|
||||||
|
margin-left: $stack-spacing;
|
||||||
|
margin-right: $stack-spacing;
|
||||||
|
|
||||||
.dashboard-column__header {
|
h3 {
|
||||||
display: flex;
|
font-size: var(--default-font-size);
|
||||||
|
margin: -6px;
|
||||||
|
margin-bottom: 12px;
|
||||||
|
padding: 6px 13px;
|
||||||
position: sticky;
|
position: sticky;
|
||||||
top: 0;
|
top: 0;
|
||||||
height: var(--default-clickable-area);
|
|
||||||
z-index: 100;
|
z-index: 100;
|
||||||
margin-top: 0;
|
|
||||||
background-color: var(--color-main-background);
|
background-color: var(--color-main-background);
|
||||||
|
border: 1px solid var(--color-main-background);
|
||||||
// Smooth fade out of the cards at the top
|
|
||||||
&:before {
|
|
||||||
content: '';
|
|
||||||
display: block;
|
|
||||||
position: absolute;
|
|
||||||
width: 100%;
|
|
||||||
height: 20px;
|
|
||||||
top: 30px;
|
|
||||||
left: 0px;
|
|
||||||
z-index: 99;
|
|
||||||
transition: top var(--animation-slow);
|
|
||||||
background-image: linear-gradient(180deg, var(--color-main-background) 3px, rgba(255, 255, 255, 0) 100%);
|
|
||||||
|
|
||||||
body.theme--dark & {
|
|
||||||
background-image: linear-gradient(180deg, var(--color-main-background) 3px, rgba(0, 0, 0, 0) 100%);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.dashboard-column__header-title {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
height: var(--default-clickable-area);
|
|
||||||
margin: 0;
|
|
||||||
white-space: nowrap;
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
padding: $card-padding;
|
|
||||||
font-size: var(--default-font-size);
|
|
||||||
}
|
|
||||||
|
|
||||||
.dashboard-column__list {
|
|
||||||
$margin-x: calc($stack-gap * -1);
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
gap: $stack-gap;
|
|
||||||
padding: $stack-gap;
|
|
||||||
margin: 0 $margin-x;
|
|
||||||
overflow-y: auto;
|
|
||||||
scrollbar-gutter: stable;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,19 +4,16 @@
|
|||||||
-->
|
-->
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<section v-if="searchQuery!==''" class="global-search">
|
<div v-if="searchQuery!==''" class="global-search">
|
||||||
<header class="search-header">
|
<h2>
|
||||||
<h2>
|
<NcRichText :text="t('deck', 'Search for {searchQuery} in all boards')" :arguments="queryStringArgs" />
|
||||||
<NcRichText :text="$route.params.id ? t('deck', 'Search for {searchQuery} in other boards') : t('deck', 'Search for {searchQuery} in all boards')"
|
<div v-if="loading" class="icon-loading-small" />
|
||||||
:arguments="queryStringArgs" />
|
</h2>
|
||||||
<span v-if="loading" class="icon-loading-small" />
|
<NcActions>
|
||||||
</h2>
|
<NcActionButton icon="icon-close" @click="$store.commit('setSearchQuery', '')" />
|
||||||
<NcActions>
|
</NcActions>
|
||||||
<NcActionButton icon="icon-close" @click="$store.commit('setSearchQuery', '')" />
|
|
||||||
</NcActions>
|
|
||||||
</header>
|
|
||||||
<div class="search-wrapper">
|
<div class="search-wrapper">
|
||||||
<template v-if="loading || filteredResults.length > 0">
|
<div v-if="loading || filteredResults.length > 0" class="search-results">
|
||||||
<CardItem v-for="card in filteredResults"
|
<CardItem v-for="card in filteredResults"
|
||||||
:id="card.id"
|
:id="card.id"
|
||||||
:key="card.id"
|
:key="card.id"
|
||||||
@@ -29,12 +26,12 @@
|
|||||||
{{ t('deck', 'No results found') }}
|
{{ t('deck', 'No results found') }}
|
||||||
</div>
|
</div>
|
||||||
</InfiniteLoading>
|
</InfiniteLoading>
|
||||||
</template>
|
</div>
|
||||||
<template v-else>
|
<div v-else>
|
||||||
<p>{{ t('deck', 'No results found') }}</p>
|
<p>{{ t('deck', 'No results found') }}</p>
|
||||||
</template>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
@@ -162,7 +159,7 @@ export default {
|
|||||||
|
|
||||||
.global-search {
|
.global-search {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
padding: $board-gap;
|
padding: $board-spacing + $stack-spacing;
|
||||||
padding-bottom: 0;
|
padding-bottom: 0;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
min-height: 35vh;
|
min-height: 35vh;
|
||||||
@@ -172,24 +169,17 @@ export default {
|
|||||||
border-top: 1px solid var(--color-border);
|
border-top: 1px solid var(--color-border);
|
||||||
z-index: 1010;
|
z-index: 1010;
|
||||||
position: relative;
|
position: relative;
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
|
|
||||||
.action-item.icon-close {
|
.action-item.icon-close {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 10px;
|
top: 10px;
|
||||||
right: 10px;
|
right: 10px;
|
||||||
}
|
}
|
||||||
|
.search-wrapper {
|
||||||
.search-header {
|
overflow: scroll;
|
||||||
display: flex;
|
height: 100%;
|
||||||
align-items: flex-start;
|
position: relative;
|
||||||
justify-content: space-between;
|
padding: 10px;
|
||||||
}
|
|
||||||
|
|
||||||
h2 {
|
|
||||||
margin: 0;
|
|
||||||
padding: var(--default-grid-baseline) var(--default-grid-baseline) $board-gap;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
h2 > div {
|
h2 > div {
|
||||||
@@ -199,24 +189,23 @@ export default {
|
|||||||
margin-right: 20px;
|
margin-right: 20px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
h2:deep(span) {
|
h2:deep(span) {
|
||||||
background-color: var(--color-background-dark);
|
background-color: var(--color-background-dark);
|
||||||
padding: 3px;
|
padding: 3px;
|
||||||
border-radius: var(--border-radius);
|
border-radius: var(--border-radius);
|
||||||
}
|
}
|
||||||
|
|
||||||
.search-wrapper {
|
.search-results {
|
||||||
overflow: auto;
|
|
||||||
height: 100%;
|
|
||||||
position: relative;
|
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: $stack-gap;
|
flex-wrap: wrap;
|
||||||
|
|
||||||
& > .drop-upload--card {
|
& > div {
|
||||||
flex: 0 1 $card-max-width;
|
flex-grow: 0;
|
||||||
min-width: $card-min-width;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
&:deep(.card) {
|
||||||
|
width: $stack-width;
|
||||||
|
margin-right: $stack-spacing;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -62,13 +62,14 @@ export default {
|
|||||||
$clickable-area: var(--default-clickable-area);
|
$clickable-area: var(--default-clickable-area);
|
||||||
|
|
||||||
.card--placeholder {
|
.card--placeholder {
|
||||||
min-width: $card-min-width;
|
width: $stack-width;
|
||||||
max-width: $card-min-width;
|
margin-right: $stack-spacing;
|
||||||
padding: $card-padding;
|
padding: $card-padding;
|
||||||
transition: box-shadow 0.1s ease-in-out;
|
transition: box-shadow 0.1s ease-in-out;
|
||||||
box-shadow: 0 0 2px 0 var(--color-box-shadow);
|
box-shadow: 0 0 2px 0 var(--color-box-shadow);
|
||||||
border-radius: var(--border-radius-large);
|
border-radius: var(--border-radius-large);
|
||||||
font-size: 100%;
|
font-size: 100%;
|
||||||
|
margin-bottom: $card-spacing;
|
||||||
height: 100px;
|
height: 100px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,10 +2,8 @@
|
|||||||
* SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors
|
* SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors
|
||||||
* SPDX-License-Identifier: AGPL-3.0-or-later
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
||||||
*/
|
*/
|
||||||
$card-min-width: 216px;
|
$card-spacing: 8px;
|
||||||
$card-max-width: 300px;
|
$card-padding: 4px;
|
||||||
$card-padding: calc(var(--default-grid-baseline) * 2) calc(var(--default-grid-baseline) * 2) var(--default-grid-baseline);
|
$stack-spacing: 12px;
|
||||||
$card-gap: calc(var(--default-grid-baseline) * 3);
|
$stack-width: 280px;
|
||||||
$card-image-margin: calc(var(--default-grid-baseline) * -2);
|
$board-spacing: 16px;
|
||||||
$stack-gap: calc(var(--default-grid-baseline) * 3);
|
|
||||||
$board-gap: calc(var(--default-grid-baseline) * 4);
|
|
||||||
|
|||||||
@@ -139,30 +139,11 @@ export class BoardApi {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
exportBoard(board, format) {
|
exportBoard(board) {
|
||||||
return axios.get(this.url(`/boards/${board.id}/export`))
|
return axios.get(this.url(`/boards/${board.id}/export`))
|
||||||
.then(
|
.then(
|
||||||
(response) => {
|
(response) => {
|
||||||
if (format === 'json') {
|
const fields = { title: t('deck', 'Card title'), description: t('deck', 'Description'), stackId: t('deck', 'List name'), labels: t('deck', 'Tags'), duedate: t('deck', 'Due date'), createdAt: t('deck', 'Created'), lastModified: t('deck', 'Modified') }
|
||||||
const exportData = {
|
|
||||||
boards: [response.data],
|
|
||||||
}
|
|
||||||
const stacks = {}
|
|
||||||
for (const stack of response.data.stacks) {
|
|
||||||
stacks[stack.id] = stack
|
|
||||||
}
|
|
||||||
exportData.boards[0].stacks = stacks
|
|
||||||
const blob = new Blob([JSON.stringify(exportData, null, 2)], { type: 'application/json' })
|
|
||||||
const blobUrl = URL.createObjectURL(blob)
|
|
||||||
const a = document.createElement('a')
|
|
||||||
a.href = blobUrl
|
|
||||||
a.download = response.data.title + '.json'
|
|
||||||
a.click()
|
|
||||||
a.remove()
|
|
||||||
return Promise.resolve()
|
|
||||||
}
|
|
||||||
|
|
||||||
const fields = { title: t('deck', 'Card title'), description: t('deck', 'Description'), stackId: t('deck', 'List name'), labels: t('deck', 'Tags'), assignedUsers: t('deck', 'Assigned users'), duedate: t('deck', 'Due date'), createdAt: t('deck', 'Created'), lastModified: t('deck', 'Modified') }
|
|
||||||
let row = ''
|
let row = ''
|
||||||
Object.keys(fields).forEach(field => {
|
Object.keys(fields).forEach(field => {
|
||||||
row += '"' + fields[field] + '"' + '\t'
|
row += '"' + fields[field] + '"' + '\t'
|
||||||
@@ -179,27 +160,16 @@ export class BoardApi {
|
|||||||
const date = new Date(Number(card[field]) * 1000)
|
const date = new Date(Number(card[field]) * 1000)
|
||||||
row += '"' + date.toLocaleDateString() + '"' + '\t'
|
row += '"' + date.toLocaleDateString() + '"' + '\t'
|
||||||
} else if (field === 'stackId') {
|
} else if (field === 'stackId') {
|
||||||
row += '"' + stack.title.replaceAll('"', '""') + '"' + '\t'
|
row += '"' + stack.title + '"' + '\t'
|
||||||
} else if (field === 'labels') {
|
} else if (field === 'labels') {
|
||||||
row += '"'
|
row += '"'
|
||||||
card[field].forEach(label => {
|
card[field].forEach(label => {
|
||||||
row += label.title.replaceAll('"', '""') + ', '
|
row += label.title + ', '
|
||||||
})
|
})
|
||||||
if (card[field].length > 0) {
|
if (card[field].length > 0) {
|
||||||
row = row.slice(0, -1)
|
row = row.slice(0, -1)
|
||||||
}
|
}
|
||||||
row += '"' + '\t'
|
row += '"' + '\t'
|
||||||
} else if (field === 'assignedUsers') {
|
|
||||||
row += '"'
|
|
||||||
card[field].forEach(assignedUsers => {
|
|
||||||
row += assignedUsers.participant.displayname.replaceAll('"', '""') + ', '
|
|
||||||
})
|
|
||||||
if (card[field].length > 0) {
|
|
||||||
row = row.slice(0, -1)
|
|
||||||
}
|
|
||||||
row += '"' + '\t'
|
|
||||||
} else if (field === 'description' || field === 'title') {
|
|
||||||
row += '"' + card[field].replaceAll('"', '""') + '"' + '\t'
|
|
||||||
} else {
|
} else {
|
||||||
row += '"' + card[field] + '"' + '\t'
|
row += '"' + card[field] + '"' + '\t'
|
||||||
}
|
}
|
||||||
@@ -234,27 +204,6 @@ export class BoardApi {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
importBoard(file) {
|
|
||||||
const formData = new FormData()
|
|
||||||
formData.append('file', file)
|
|
||||||
return axios.post(this.url('/boards/import'), formData, {
|
|
||||||
headers: {
|
|
||||||
'Content-Type': 'multipart/form-data',
|
|
||||||
},
|
|
||||||
})
|
|
||||||
.then(
|
|
||||||
(response) => {
|
|
||||||
return Promise.resolve(response.data)
|
|
||||||
},
|
|
||||||
(err) => {
|
|
||||||
return Promise.reject(err)
|
|
||||||
},
|
|
||||||
)
|
|
||||||
.catch((err) => {
|
|
||||||
return Promise.reject(err)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// Label API Calls
|
// Label API Calls
|
||||||
deleteLabel(id) {
|
deleteLabel(id) {
|
||||||
return axios.delete(this.url(`/labels/${id}`))
|
return axios.delete(this.url(`/labels/${id}`))
|
||||||
|
|||||||
@@ -189,7 +189,7 @@ export default {
|
|||||||
card.assignedUsers = card.assignedUsers || []
|
card.assignedUsers = card.assignedUsers || []
|
||||||
const existingIndex = state.cards.findIndex(_card => _card.id === card.id)
|
const existingIndex = state.cards.findIndex(_card => _card.id === card.id)
|
||||||
if (existingIndex !== -1) {
|
if (existingIndex !== -1) {
|
||||||
const existingCard = state.cards[existingIndex]
|
const existingCard = state.cards.find(_card => _card.id === card.id)
|
||||||
Vue.set(state.cards, existingIndex, Object.assign({}, existingCard, card))
|
Vue.set(state.cards, existingIndex, Object.assign({}, existingCard, card))
|
||||||
} else {
|
} else {
|
||||||
state.cards.push(card)
|
state.cards.push(card)
|
||||||
|
|||||||
@@ -402,14 +402,6 @@ export default new Vuex.Store({
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
async importBoard({ commit }, file) {
|
|
||||||
try {
|
|
||||||
const board = await apiClient.importBoard(file)
|
|
||||||
commit('addBoard', board)
|
|
||||||
} catch (err) {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
},
|
|
||||||
async cloneBoard({ commit }, { boardData, settings }) {
|
async cloneBoard({ commit }, { boardData, settings }) {
|
||||||
const { withCards, withAssignments, withLabels, withDueDate, moveCardsToLeftStack, restoreArchivedCards } = settings
|
const { withCards, withAssignments, withLabels, withDueDate, moveCardsToLeftStack, restoreArchivedCards } = settings
|
||||||
|
|
||||||
|
|||||||
@@ -66,7 +66,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import CalendarBlankIcon from 'vue-material-design-icons/CalendarBlankOutline.vue'
|
import CalendarBlankIcon from 'vue-material-design-icons/CalendarBlank.vue'
|
||||||
import TextIcon from 'vue-material-design-icons/Text.vue'
|
import TextIcon from 'vue-material-design-icons/Text.vue'
|
||||||
import CardBulletedOutlineIcon from 'vue-material-design-icons/CardBulletedOutline.vue'
|
import CardBulletedOutlineIcon from 'vue-material-design-icons/CardBulletedOutline.vue'
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user