Compare commits

..

268 Commits

Author SHA1 Message Date
Luka Trovic
ba6902e470 Merge pull request #7281 from nextcloud/release/1.15.3
Release/1.15.3
2025-09-29 10:56:58 +02:00
Luka Trovic
5674887b61 release 1.15.3
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2025-09-29 09:48:16 +02:00
Nextcloud bot
3bc0ddcca2 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-28 00:31:39 +00:00
Nextcloud bot
48e904c37b fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-27 00:32:16 +00:00
Luka Trovic
44a5eadb73 Merge pull request #7275 from nextcloud/backport/7154/stable31
[stable31] fix: parse arguments to CardService.reorder correctly to int
2025-09-26 18:34:25 +02:00
Viktor Diezel
7b7221b3e1 fix: parse arguments to CardService.reorder correctly to int
Signed-off-by: Viktor Diezel <viktor.diezel@posteo.de>
2025-09-26 13:28:17 +00:00
Luka Trovic
b19872e56c Merge pull request #7274 from nextcloud/backport/7261/stable31
[stable31] fix: use text cursor for card title on dashboard
2025-09-26 12:02:27 +02:00
grnd-alt
cb1819cf10 fix: use text cursor for card title on dashboard
Signed-off-by: grnd-alt <github@belakkaf.net>

[skip ci]
2025-09-26 05:42:21 +00:00
Nextcloud bot
7d6d41a5d1 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-26 00:32:20 +00:00
Luka Trovic
aa6c488845 Merge pull request #7272 from nextcloud/31-bump-nextcloud-vue-8.31.0
Chore(deps): Bump @nextcloud/vue from 8.22.0 to 8.31.0
2025-09-25 22:56:04 +02:00
Luka Trovic
a14aa1b5d4 Chore(deps): Bump @nextcloud/vue from 8.22.0 to 8.31.0
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2025-09-25 18:41:58 +02:00
Luka Trovic
e2e14d88be Merge pull request #7269 from nextcloud/backport/7255/stable31
[stable31] fix: missing push notifications
2025-09-25 12:23:24 +02:00
Luka Trovic
2546ff981d fix: update base query count
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2025-09-25 11:47:21 +02:00
Luka Trovic
a2e5e9fe5b chore: update base query count
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2025-09-25 09:16:39 +00:00
Luka Trovic
985eaa0133 fix: missing push notifications
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2025-09-25 09:16:39 +00:00
Luka Trovic
db48deb4f8 Merge pull request #7267 from nextcloud/backport/7266/stable31
[stable31] fix: redirect to cleaner URL if RewriteBase is enabled
2025-09-25 08:35:52 +02:00
Nextcloud bot
173ec28c6d fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-25 00:31:44 +00:00
Luka Trovic
9d18b08325 fix: redirect to cleaner URL if RewriteBase is enabled
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2025-09-24 18:28:28 +00:00
Nextcloud bot
7775ddd9f7 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-24 00:31:56 +00:00
Nextcloud bot
d5fb6cb4b0 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-23 00:31:54 +00:00
Nextcloud bot
a5245b41ac fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-22 00:31:34 +00:00
Luka Trovic
e34f4f081c Merge pull request #7198 from nextcloud/backport/7128/stable31
[stable31] fix: make comments with mention editable
2025-09-19 20:09:31 +02:00
grnd-alt
0292b0307e fix: make comments with mention editable
Signed-off-by: grnd-alt <github@belakkaf.net>
2025-09-19 19:10:33 +02:00
Nextcloud bot
913a2fac8f fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-19 00:32:05 +00:00
Nextcloud bot
aac7f0c943 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-18 00:31:47 +00:00
Nextcloud bot
5f0a55b5cd fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-17 00:31:47 +00:00
Luka Trovic
95958e5465 Merge pull request #7240 from nextcloud/backport/7238/stable31
[stable31] fix(darkmode): Fix activity icon colors
2025-09-16 21:40:49 +02:00
Joas Schilling
19bb3aba97 fix(darkmode): Fix activity icon colors
Signed-off-by: Joas Schilling <coding@schilljs.com>
2025-09-16 18:57:23 +00:00
Nextcloud bot
1345b9cfee fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-16 00:31:53 +00:00
Nextcloud bot
646cf7f0c6 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-15 00:31:04 +00:00
Nextcloud bot
6d29ef0607 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-14 00:30:57 +00:00
Nextcloud bot
c27bc874eb fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-13 00:31:27 +00:00
Nextcloud bot
bdb8f1845b fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-12 00:31:52 +00:00
Nextcloud bot
75f6af1e6b fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-11 00:31:57 +00:00
Nextcloud bot
81bd239dec fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-09 00:33:43 +00:00
Nextcloud bot
4d4fbd8fc9 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-08 00:32:16 +00:00
Nextcloud bot
d46b554576 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-07 00:33:34 +00:00
Nextcloud bot
3dc52816eb fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-06 00:31:30 +00:00
Nextcloud bot
2799bc3bb8 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-05 00:32:06 +00:00
Nextcloud bot
f275dcc5be fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-04 00:30:33 +00:00
Nextcloud bot
19ef846692 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-03 00:29:41 +00:00
Nextcloud bot
75542efab4 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-02 00:30:26 +00:00
Luka Trovic
b41a7eac8b Merge pull request #7135 from nextcloud/automated/noid/stable31-update-nextcloud-ocp
[stable31] Update nextcloud/ocp dependency
2025-09-01 11:54:46 +02:00
Luka Trovic
9e07995011 Merge pull request #7055 from nextcloud/dependabot/npm_and_yarn/stable31/babel/runtime-7.27.6
Chore(deps): Bump @babel/runtime from 7.27.1 to 7.27.6
2025-09-01 11:52:55 +02:00
nextcloud-command
348e10bb6c chore(dev-deps): Bump nextcloud/ocp package
Signed-off-by: GitHub <noreply@github.com>
2025-08-31 02:40:43 +00:00
Nextcloud bot
ff5db11e9c fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-30 00:29:24 +00:00
Nextcloud bot
b30e742114 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-29 00:29:36 +00:00
Nextcloud bot
aefdcb70e9 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-28 00:29:35 +00:00
Nextcloud bot
dbc350cd4b fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-27 00:29:30 +00:00
Nextcloud bot
7e2fb648b0 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-26 00:30:40 +00:00
Luka Trovic
2773208eb5 Merge pull request #7180 from nextcloud/backport/7177/stable31
[stable31] Clean attachment sharing records after permanent deleted
2025-08-25 11:39:53 +02:00
Luka Trovic
d1559ac674 fix: clean attachment sharing records after permanent deleted
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2025-08-25 08:52:49 +00:00
Nextcloud bot
eafd6eeff0 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-23 00:29:03 +00:00
Nextcloud bot
b0a77ac025 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-22 00:28:54 +00:00
Nextcloud bot
9744ae04d6 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-20 00:28:47 +00:00
Nextcloud bot
d0e177bb41 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-19 00:31:14 +00:00
grnd-alt
7478e5c1d6 Merge pull request #7173 from nextcloud/backport/7162/stable31
[stable31] fix: do not change focus when card id stays the same
2025-08-18 11:16:41 +02:00
grnd-alt
0bce7f0ea9 fix: do not change focus when card id stays the same
Signed-off-by: grnd-alt <github@belakkaf.net>
2025-08-18 09:15:35 +00:00
Nextcloud bot
8bed62debc fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-14 00:29:49 +00:00
Nextcloud bot
1b9ddf9ebc fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-13 00:30:23 +00:00
Nextcloud bot
1770e8ee7e fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-12 00:29:20 +00:00
Nextcloud bot
fe0c4361f3 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-10 00:28:22 +00:00
Nextcloud bot
6a3553404b fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-09 00:28:49 +00:00
Nextcloud bot
5b494738fd fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-04 00:31:08 +00:00
Nextcloud bot
79db1d3275 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-03 00:28:39 +00:00
Nextcloud bot
d91c53669f fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-02 00:29:07 +00:00
Nextcloud bot
cbb67b30b6 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-01 00:28:50 +00:00
grnd-alt
39f00e0e68 Merge pull request #7148 from nextcloud/backport/7071/stable31
[stable31]fix: ensure correct type when filtering events
2025-07-31 11:10:04 +02:00
grnd-alt
a0e9494ff1 fix: ensure correct type when filtering events
Signed-off-by: grnd-alt <github@belakkaf.net>
2025-07-31 10:40:54 +02:00
Nextcloud bot
8658c7dfca fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-07-30 00:29:01 +00:00
grnd-alt
427fe4e87d Merge pull request #7144 from nextcloud/backport/7139/stable31
[stable31] fix:  Use getId() method for card ID retrieval
2025-07-29 11:14:39 +02:00
grnd-alt
e38e7bb027 fix: make labels in dialog deletable
Signed-off-by: grnd-alt <github@belakkaf.net>
2025-07-29 09:00:11 +00:00
grnd-alt
6993fc906f fix: dont add labels without id
Signed-off-by: grnd-alt <github@belakkaf.net>
2025-07-29 09:00:11 +00:00
Enjeck C.
6685341d9c fix: Use getId() method for card ID retrieval
Signed-off-by: Enjeck C. <patrathewhiz@gmail.com>
2025-07-29 09:00:11 +00:00
Nextcloud bot
05733dad96 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-07-29 00:28:42 +00:00
grnd-alt
dbdfe16e9f Merge pull request #7140 from nextcloud/release/1.15.2
Release/1.15.2
2025-07-28 14:52:11 +02:00
Nextcloud bot
bf40a4b23b fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-07-28 00:28:50 +00:00
Luka Trovic
42d52c519d Merge pull request #7132 from nextcloud/backport/7131/stable31
[stable31] fix: acl check when delete, update board acl
2025-07-25 18:17:28 +02:00
Luka Trovic
1c3c7c730a fix: acl check when delete, update board acl
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2025-07-25 15:51:05 +00:00
Luka Trovic
ccb6fb3187 Merge pull request #7130 from nextcloud/backport/7127/stable31
[stable31] fix:allow foreign label deletion
2025-07-25 13:21:22 +02:00
grnd-alt
ef3db3eec0 fix:allow foreign label deletion
Signed-off-by: grnd-alt <github@belakkaf.net>
2025-07-25 10:27:14 +00:00
Nextcloud bot
59e003df21 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-07-25 00:29:32 +00:00
Nextcloud bot
5847735557 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-07-24 00:30:27 +00:00
Nextcloud bot
e2cc6918cb fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-07-23 00:33:43 +00:00
Nextcloud bot
61a5b4b331 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-07-22 00:29:07 +00:00
dependabot[bot]
9bd00803d8 Merge pull request #6990 from nextcloud/dependabot/npm_and_yarn/stable31/nextcloud/cypress-1.0.0-beta.15 2025-07-15 18:35:38 +00:00
dependabot[bot]
59a2dff228 Chore(deps-dev): Bump @nextcloud/cypress
Bumps [@nextcloud/cypress](https://github.com/nextcloud/nextcloud-cypress) from 1.0.0-beta.14 to 1.0.0-beta.15.
- [Release notes](https://github.com/nextcloud/nextcloud-cypress/releases)
- [Commits](https://github.com/nextcloud/nextcloud-cypress/compare/v1.0.0-beta.14...v1.0.0-beta.15)

---
updated-dependencies:
- dependency-name: "@nextcloud/cypress"
  dependency-version: 1.0.0-beta.15
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-15 20:34:04 +02:00
Luka Trovic
c0f4c94d30 Merge pull request #7075 from nextcloud/automated/noid/stable31-update-nextcloud-ocp
[stable31] Update nextcloud/ocp dependency
2025-07-15 11:26:13 +02:00
Luka Trovic
d414de4012 chore: update query count
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2025-07-15 11:16:12 +02:00
Luka Trovic
8dc9240681 Merge pull request #7113 from nextcloud/backport/7107/stable31
[stable31] fix: styling for new stack input field
2025-07-14 15:43:17 +02:00
Luka Trovic
8a27a799cb fix: styling for new stack input field
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2025-07-14 13:17:34 +00:00
Nextcloud bot
eb994fea12 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-07-14 00:27:52 +00:00
nextcloud-command
4e1f65b10d chore(dev-deps): Bump nextcloud/ocp package
Signed-off-by: GitHub <noreply@github.com>
2025-07-13 03:44:55 +00:00
Nextcloud bot
97aa84f03d fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-07-10 00:28:46 +00:00
Nextcloud bot
04511acef2 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-07-09 00:29:06 +00:00
Nextcloud bot
9be47f6d5d fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-07-08 00:29:05 +00:00
Nextcloud bot
46f723cc98 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-07-06 00:28:15 +00:00
Nextcloud bot
a242d5551a fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-07-05 00:28:25 +00:00
Nextcloud bot
0cdd972722 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-07-04 00:28:40 +00:00
Luka Trovic
84c1d828da Merge pull request #7091 from nextcloud/backport/7070/stable31
[stable31] fix: add retry and show warning on description saving error
2025-07-03 17:32:41 +02:00
Luka Trovic
5df6b1caf4 fix: add retry and show warning on description saving error
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2025-07-03 09:47:50 +00:00
Nextcloud bot
74342d7581 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-07-03 00:28:53 +00:00
Nextcloud bot
4beba4f7d3 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-07-02 00:29:14 +00:00
Nextcloud bot
73d57e3ee1 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-07-01 00:28:30 +00:00
Nextcloud bot
530774c9e6 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-30 00:27:44 +00:00
Nextcloud bot
149d273c35 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-29 00:27:42 +00:00
Nextcloud bot
d3fa2b018f fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-28 00:29:08 +00:00
Nextcloud bot
1e132bb1fa fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-28 00:28:06 +00:00
Nextcloud bot
730a6c89ea fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-27 00:43:52 +00:00
Nextcloud bot
78819da98d fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-26 00:43:00 +00:00
Nextcloud bot
b8898e7f96 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-25 00:43:16 +00:00
Nextcloud bot
f32df15d90 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-24 00:43:14 +00:00
Nextcloud bot
e147939157 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-20 00:42:31 +00:00
Nextcloud bot
26b98d726f fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-19 00:42:36 +00:00
Luka Trovic
50d029e50e Merge pull request #7068 from nextcloud/automated/noid/stable31-fix-npm-audit
[stable31] Fix npm audit
2025-06-18 17:14:32 +02:00
Julius Knorr
31634ab57e Merge pull request #6698 from nextcloud/automated/noid/stable31-update-nextcloud-ocp 2025-06-18 08:35:01 +02:00
Nextcloud bot
2bff37c3b4 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-17 00:40:29 +00:00
Luka Trovic
482555ac6d Merge pull request #7063 from nextcloud/backport/7030/stable31
[stable31] fix: unstable cypress test
2025-06-16 21:43:25 +02:00
Nextcloud bot
3d3b8d72bf fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-16 00:40:41 +00:00
nextcloud-command
367a20e7af fix(deps): Fix npm audit
Signed-off-by: GitHub <noreply@github.com>
2025-06-15 03:46:47 +00:00
nextcloud-command
376bd46de7 chore(dev-deps): Bump nextcloud/ocp package
Signed-off-by: GitHub <noreply@github.com>
2025-06-15 03:34:34 +00:00
Nextcloud bot
fe30fa95aa fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-14 00:40:04 +00:00
dependabot[bot]
1b40ad9797 Chore(deps): Bump @babel/runtime from 7.27.1 to 7.27.6
Bumps [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.27.1 to 7.27.6.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.27.6/packages/babel-runtime)

---
updated-dependencies:
- dependency-name: "@babel/runtime"
  dependency-version: 7.27.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-13 21:33:00 +00:00
Luka Trovic
5bb3a21b80 fix: unstable cypress test
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2025-06-12 16:27:40 +00:00
Luka Trovic
c55b980d96 Merge pull request #7061 from nextcloud/backport/7059/stable31
[stable31] fix: not show Share with a Deck card for unauthorized users
2025-06-11 15:04:05 +02:00
Luka Trovic
c93b4a09cb fix: not show Share with a Deck card for unauthorized users
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2025-06-11 12:40:47 +00:00
Nextcloud bot
0bc8a0f3ba fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-11 00:44:36 +00:00
Luka Trovic
6368d965ec Merge pull request #7029 from nextcloud/backport/7027/stable31
[stable31] fix: update DeleteCron to remove deleted lists
2025-06-10 08:58:05 +02:00
Nextcloud bot
591a894b7e fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-10 00:40:12 +00:00
Luka Trovic
c5e5715a0c fix: update DeleteCron to remove deleted lists
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2025-06-05 20:17:59 +02:00
Luka Trovic
80828f7674 Merge pull request #7046 from nextcloud/s31-fix-integration-test
Fix integration test
2025-06-05 19:08:24 +02:00
Luka Trovic
1acdf9e716 fix: integration test
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2025-06-05 18:41:44 +02:00
Nextcloud bot
0fd7dd9d68 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-01 00:40:02 +00:00
Nextcloud bot
e670ede7b4 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-31 00:40:57 +00:00
Nextcloud bot
d0eb16c242 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-28 00:41:39 +00:00
Nextcloud bot
50c43aed6d fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-26 00:41:10 +00:00
Nextcloud bot
d2ad7bdc29 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-23 00:40:39 +00:00
Nextcloud bot
8e7e9d85ac fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-22 00:41:22 +00:00
Luka Trovic
53f5fbdadd Merge pull request #7009 from nextcloud/dependabot/npm_and_yarn/stable31/nextcloud/auth-2.5.1
Chore(deps): Bump @nextcloud/auth from 2.4.0 to 2.5.1
2025-05-21 13:48:32 +02:00
Luka Trovic
fbccabceaf Merge pull request #7008 from nextcloud/dependabot/npm_and_yarn/stable31/nextcloud/dialogs-6.3.0
Chore(deps): Bump @nextcloud/dialogs from 6.2.0 to 6.3.0
2025-05-21 13:48:12 +02:00
Nextcloud bot
d33305b77c fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-21 00:45:43 +00:00
dependabot[bot]
dba232041d Chore(deps): Bump @nextcloud/dialogs from 6.2.0 to 6.3.0
Bumps [@nextcloud/dialogs](https://github.com/nextcloud-libraries/nextcloud-dialogs) from 6.2.0 to 6.3.0.
- [Release notes](https://github.com/nextcloud-libraries/nextcloud-dialogs/releases)
- [Changelog](https://github.com/nextcloud-libraries/nextcloud-dialogs/blob/v6.3.0/CHANGELOG.md)
- [Commits](https://github.com/nextcloud-libraries/nextcloud-dialogs/compare/v6.2.0...v6.3.0)

---
updated-dependencies:
- dependency-name: "@nextcloud/dialogs"
  dependency-version: 6.3.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-20 08:14:31 +02:00
dependabot[bot]
2b17403129 Chore(deps): Bump @nextcloud/auth from 2.4.0 to 2.5.1
Bumps [@nextcloud/auth](https://github.com/nextcloud/nextcloud-auth) from 2.4.0 to 2.5.1.
- [Release notes](https://github.com/nextcloud/nextcloud-auth/releases)
- [Changelog](https://github.com/nextcloud-libraries/nextcloud-auth/blob/main/CHANGELOG.md)
- [Commits](https://github.com/nextcloud/nextcloud-auth/compare/v2.4.0...v2.5.1)

---
updated-dependencies:
- dependency-name: "@nextcloud/auth"
  dependency-version: 2.5.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-19 16:00:25 +02:00
Nextcloud bot
5cfc3a7a3a fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-18 00:41:54 +00:00
Nextcloud bot
60f250d69a fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-17 00:44:03 +00:00
Nextcloud bot
bb60f7f57b fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-15 00:44:23 +00:00
Nextcloud bot
1219d52b02 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-14 00:41:39 +00:00
Nextcloud bot
5c769aa82d fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-13 00:42:49 +00:00
Nextcloud bot
7c615f2607 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-12 00:41:54 +00:00
Nextcloud bot
64d3a69f28 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-11 00:41:46 +00:00
Nextcloud bot
26494eee86 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-10 00:44:00 +00:00
dependabot[bot]
336b6f3348 Merge pull request #6968 from nextcloud/dependabot/npm_and_yarn/stable31/nextcloud/dialogs-6.2.0 2025-05-08 15:18:38 +00:00
dependabot[bot]
380184af50 Chore(deps): Bump @nextcloud/dialogs from 6.1.1 to 6.2.0
Bumps [@nextcloud/dialogs](https://github.com/nextcloud-libraries/nextcloud-dialogs) from 6.1.1 to 6.2.0.
- [Release notes](https://github.com/nextcloud-libraries/nextcloud-dialogs/releases)
- [Changelog](https://github.com/nextcloud-libraries/nextcloud-dialogs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/nextcloud-libraries/nextcloud-dialogs/compare/v6.1.1...v6.2.0)

---
updated-dependencies:
- dependency-name: "@nextcloud/dialogs"
  dependency-version: 6.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-08 17:16:40 +02:00
dependabot[bot]
16aa9c954b Merge pull request #6969 from nextcloud/dependabot/npm_and_yarn/stable31/relative-ci/agent-4.3.1 2025-05-08 15:05:09 +00:00
dependabot[bot]
01842c7f92 Chore(deps-dev): Bump @relative-ci/agent from 4.3.0 to 4.3.1
Bumps [@relative-ci/agent](https://github.com/relative-ci/agent) from 4.3.0 to 4.3.1.
- [Release notes](https://github.com/relative-ci/agent/releases)
- [Commits](https://github.com/relative-ci/agent/compare/v4.3.0...v4.3.1)

---
updated-dependencies:
- dependency-name: "@relative-ci/agent"
  dependency-version: 4.3.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-08 17:03:32 +02:00
dependabot[bot]
1c38638ee8 Merge pull request #6970 from nextcloud/dependabot/npm_and_yarn/stable31/babel/runtime-7.27.1 2025-05-08 15:00:07 +00:00
dependabot[bot]
dd534fbea1 Chore(deps): Bump @babel/runtime from 7.27.0 to 7.27.1
Bumps [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.27.0 to 7.27.1.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.27.1/packages/babel-runtime)

---
updated-dependencies:
- dependency-name: "@babel/runtime"
  dependency-version: 7.27.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-08 16:58:22 +02:00
Nextcloud bot
b7cb1f7d05 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-08 00:43:33 +00:00
Nextcloud bot
c9d45f4a96 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-07 00:43:34 +00:00
Nextcloud bot
dfc61453c4 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-06 00:43:40 +00:00
Nextcloud bot
4dd48d18c7 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-05 01:11:36 +00:00
Nextcloud bot
ee51cb8e3c fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-04 00:41:45 +00:00
Nextcloud bot
4aaaca52c6 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-03 00:42:57 +00:00
dependabot[bot]
ee67476581 Merge pull request #6838 from nextcloud/dependabot/npm_and_yarn/stable31/relative-ci/agent-4.3.0 2025-05-02 16:43:37 +00:00
dependabot[bot]
1f82d386e0 Chore(deps-dev): Bump @relative-ci/agent from 4.2.14 to 4.3.0
Bumps [@relative-ci/agent](https://github.com/relative-ci/agent) from 4.2.14 to 4.3.0.
- [Release notes](https://github.com/relative-ci/agent/releases)
- [Commits](https://github.com/relative-ci/agent/compare/v4.2.14...v4.3.0)

---
updated-dependencies:
- dependency-name: "@relative-ci/agent"
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-02 18:38:20 +02:00
dependabot[bot]
d7d6009070 Merge pull request #6867 from nextcloud/dependabot/npm_and_yarn/stable31/babel/runtime-7.27.0 2025-05-02 16:36:10 +00:00
dependabot[bot]
263f9c8bbe Merge pull request #6884 from nextcloud/dependabot/npm_and_yarn/stable31/dompurify-3.2.5 2025-05-02 16:27:48 +00:00
dependabot[bot]
92b641c52d Chore(deps): Bump @babel/runtime from 7.26.7 to 7.27.0
Bumps [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.26.7 to 7.27.0.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.27.0/packages/babel-runtime)

---
updated-dependencies:
- dependency-name: "@babel/runtime"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-02 18:14:57 +02:00
dependabot[bot]
26da5a17a6 Chore(deps): Bump dompurify from 3.2.4 to 3.2.5
Bumps [dompurify](https://github.com/cure53/DOMPurify) from 3.2.4 to 3.2.5.
- [Release notes](https://github.com/cure53/DOMPurify/releases)
- [Commits](https://github.com/cure53/DOMPurify/compare/3.2.4...3.2.5)

---
updated-dependencies:
- dependency-name: dompurify
  dependency-version: 3.2.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-02 18:14:03 +02:00
dependabot[bot]
e6a3e1a7bf Merge pull request #6904 from nextcloud/dependabot/npm_and_yarn/stable31/nextcloud/webpack-vue-config-6.3.0 2025-05-02 16:00:24 +00:00
dependabot[bot]
339c13447a Chore(deps-dev): Bump @nextcloud/webpack-vue-config from 6.2.0 to 6.3.0
Bumps [@nextcloud/webpack-vue-config](https://github.com/nextcloud-libraries/webpack-vue-config) from 6.2.0 to 6.3.0.
- [Release notes](https://github.com/nextcloud-libraries/webpack-vue-config/releases)
- [Changelog](https://github.com/nextcloud-libraries/webpack-vue-config/blob/main/CHANGELOG.md)
- [Commits](https://github.com/nextcloud-libraries/webpack-vue-config/compare/v6.2.0...v6.3.0)

---
updated-dependencies:
- dependency-name: "@nextcloud/webpack-vue-config"
  dependency-version: 6.3.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-02 17:55:07 +02:00
Nextcloud bot
3e674381ca fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-02 00:43:02 +00:00
Nextcloud bot
5479bc16af fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-01 00:42:10 +00:00
Luka Trovic
96fdacc46d Merge pull request #6963 from nextcloud/backport/6778/stable31
[stable31] fix: cypress issue
2025-04-29 16:15:32 +02:00
Luka Trovic
a1a5aa9bd2 fix: cypress issue
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2025-04-29 14:12:24 +00:00
Luka Trovic
e7a4eec911 Merge pull request #6959 from nextcloud/backport/6916/stable31
[stable31] perf: don't enrich cards when finding calendar entries
2025-04-29 16:11:12 +02:00
Richard Steinmetz
0191d54369 perf: don't enrich cards when finding calendar entries
Signed-off-by: Richard Steinmetz <richard@steinmetz.cloud>
2025-04-29 12:07:35 +00:00
grnd-alt
3e69070e8c release/1.15.1 (#6956)
Signed-off-by: grnd-alt <github@belakkaf.net>
2025-04-29 10:32:07 +02:00
dependabot[bot]
240ea42a51 Chore(deps): Bump @nextcloud/vue from 8.22.0 to 8.26.0 (#6940)
Bumps [@nextcloud/vue](https://github.com/nextcloud-libraries/nextcloud-vue) from 8.22.0 to 8.26.0.
- [Release notes](https://github.com/nextcloud-libraries/nextcloud-vue/releases)
- [Changelog](https://github.com/nextcloud-libraries/nextcloud-vue/blob/main/CHANGELOG.md)
- [Commits](https://github.com/nextcloud-libraries/nextcloud-vue/compare/v8.22.0...v8.26.0)

---
updated-dependencies:
- dependency-name: "@nextcloud/vue"
  dependency-version: 8.26.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-29 09:24:08 +02:00
grnd-alt
15e019fd03 fix: only delete assignments on unshared board (#6934)
Signed-off-by: grnd-alt <github@belakkaf.net>
2025-04-29 09:09:41 +02:00
Nextcloud bot
ca9bf74434 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-04-29 00:42:25 +00:00
backportbot[bot]
c3362a8584 [stable31] fix: Limit label actions to labels of the cards board (#6954)
* fix: Limit label actions to labels of the cards board

Signed-off-by: Julius Härtl <jus@bitgrid.net>

* tests: Fix unit test mocking around label checks

Signed-off-by: Julius Knorr <jus@bitgrid.net>

---------

Signed-off-by: Julius Härtl <jus@bitgrid.net>
Signed-off-by: Julius Knorr <jus@bitgrid.net>
Co-authored-by: Julius Härtl <jus@bitgrid.net>
2025-04-28 13:02:34 +02:00
Julius Knorr
6764873d66 Merge pull request #6951 from nextcloud/backport/6898/stable31
[stable31] fix: Use strings as rich object ids
2025-04-28 10:40:18 +02:00
Julius Knorr
a692b8c512 fix: Use strings as rich object ids
Signed-off-by: Julius Knorr <jus@bitgrid.net>
2025-04-28 06:51:23 +00:00
Nextcloud bot
0d23cc0951 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-04-28 00:42:38 +00:00
Nextcloud bot
b7f5648e63 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-04-27 00:42:07 +00:00
Nextcloud bot
ec292df849 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-04-25 00:42:00 +00:00
Nextcloud bot
63e39bcc51 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-04-24 00:42:55 +00:00
backportbot[bot]
878f9caf87 [stable31] chore: update workflows from templates (#6922)
* chore: update workflows from templates

Signed-off-by: grnd-alt <github@belakkaf.net>

* chore: set minimum phpVersion for psalm

Signed-off-by: grnd-alt <github@belakkaf.net>

---------

Signed-off-by: grnd-alt <github@belakkaf.net>
Co-authored-by: grnd-alt <github@belakkaf.net>
2025-04-23 18:08:48 +02:00
Nextcloud bot
1156688517 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-04-23 00:42:09 +00:00
Julius Knorr
8d2e018b9c Merge pull request #6915 from nextcloud/backport/6902/stable31
[stable31] Clear selected stack when selected board changed
2025-04-22 16:47:21 +02:00
Nextcloud bot
b66d6c5b46 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-04-18 00:43:13 +00:00
Nextcloud bot
8dbfd37fe0 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-04-17 00:42:40 +00:00
Nextcloud bot
04e16e003d fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-04-16 00:43:54 +00:00
Luka Trovic
91b9b8804e fix: clear selected stack when selected board changed
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2025-04-15 16:36:19 +00:00
Nextcloud bot
0a415b97df Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-04-12 00:44:03 +00:00
Nextcloud bot
9e36a9ebe2 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-04-11 00:43:41 +00:00
Nextcloud bot
c70d089ca7 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-04-10 00:42:54 +00:00
Julius Knorr
53acec7372 Merge pull request #6894 from nextcloud/backport/6893/stable31 2025-04-09 20:15:12 +02:00
Julius Knorr
5ca18b1d32 perf: Skip doing a query just to check if a board is deleted
Signed-off-by: Julius Knorr <jus@bitgrid.net>
2025-04-08 21:00:09 +00:00
Nextcloud bot
3a454b75e0 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-04-06 00:44:07 +00:00
Nextcloud bot
79ab6a16af Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-04-04 00:42:54 +00:00
Nextcloud bot
62dd2e29cd Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-04-02 00:43:21 +00:00
Nextcloud bot
00a63e59ae Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-03-30 00:44:12 +00:00
Nextcloud bot
4b6540880c Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-03-29 00:43:40 +00:00
Nextcloud bot
a735d85c25 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-03-28 00:44:53 +00:00
Nextcloud bot
b93bb93895 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-03-27 00:44:47 +00:00
Nextcloud bot
77d4126aa9 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-03-25 00:43:44 +00:00
Nextcloud bot
647b9dece2 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-03-24 00:43:04 +00:00
Nextcloud bot
a931433475 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-03-23 00:43:34 +00:00
Nextcloud bot
726e62527a Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-03-20 00:45:36 +00:00
Nextcloud bot
24bb353a74 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-03-18 00:45:12 +00:00
Nextcloud bot
fba3b030ac Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-03-16 00:43:45 +00:00
Nextcloud bot
a868425dd3 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-03-15 00:45:25 +00:00
Nextcloud bot
3033cb4d8c Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-03-12 00:44:27 +00:00
Julius Knorr
c4ea019eee Merge pull request #6701 from nextcloud/backport/6671/stable31
[stable31] fix: Properly show attachment extension
2025-03-10 12:03:00 +01:00
Nextcloud bot
6a19934ace Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-03-03 00:42:23 +00:00
Nextcloud bot
2fd7586902 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-03-01 01:05:11 +00:00
Nextcloud bot
77b0602833 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-27 00:44:26 +00:00
Luka Trovic
715b8fc6aa Merge pull request #6789 from nextcloud/dependabot/npm_and_yarn/stable31/nextcloud/cypress-1.0.0-beta.14
chore(deps-dev): bump @nextcloud/cypress from 1.0.0-beta.13 to 1.0.0-beta.14
2025-02-26 10:01:35 +01:00
dependabot[bot]
f1d3631d22 chore(deps-dev): bump @nextcloud/cypress
Bumps [@nextcloud/cypress](https://github.com/nextcloud/nextcloud-cypress) from 1.0.0-beta.13 to 1.0.0-beta.14.
- [Release notes](https://github.com/nextcloud/nextcloud-cypress/releases)
- [Commits](https://github.com/nextcloud/nextcloud-cypress/compare/v1.0.0-beta.13...v1.0.0-beta.14)

---
updated-dependencies:
- dependency-name: "@nextcloud/cypress"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-26 09:46:55 +01:00
Nextcloud bot
3e05e88a6b Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-25 00:45:13 +00:00
Luka Trovic
238f5674ab Merge pull request #6788 from nextcloud/dependabot/npm_and_yarn/stable31/nextcloud/eslint-config-8.4.2
chore(deps-dev): bump @nextcloud/eslint-config from 8.4.1 to 8.4.2
2025-02-24 15:26:17 +01:00
Nextcloud bot
0ddefff9c1 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-24 00:41:56 +00:00
dependabot[bot]
91aaf3d6b0 chore(deps-dev): bump @nextcloud/eslint-config from 8.4.1 to 8.4.2
Bumps [@nextcloud/eslint-config](https://github.com/nextcloud-libraries/eslint-config) from 8.4.1 to 8.4.2.
- [Release notes](https://github.com/nextcloud-libraries/eslint-config/releases)
- [Changelog](https://github.com/nextcloud-libraries/eslint-config/blob/v8.4.2/CHANGELOG.md)
- [Commits](https://github.com/nextcloud-libraries/eslint-config/compare/v8.4.1...v8.4.2)

---
updated-dependencies:
- dependency-name: "@nextcloud/eslint-config"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-22 03:39:31 +00:00
Nextcloud bot
48b25da3ea Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-22 00:41:55 +00:00
Luka Trovic
4059042a9c Merge pull request #6781 from nextcloud/release/1.15.0
chore(release): bump version to 1.15.0
2025-02-21 19:06:34 +01:00
Luka Trovic
e6b29b7cb1 bump version to 1.15.0
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2025-02-21 17:04:44 +01:00
Nextcloud bot
d934867381 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-21 00:41:23 +00:00
Nextcloud bot
f130baff43 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-20 00:43:28 +00:00
Nextcloud bot
6f8baba8c5 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-19 00:42:13 +00:00
Nextcloud bot
3badc5c90c Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-18 00:42:07 +00:00
Nextcloud bot
c6b04b9abf Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-17 00:41:31 +00:00
Nextcloud bot
3ec8ff3d1f Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-16 01:06:42 +00:00
Nextcloud bot
a721fe27a6 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-15 00:41:55 +00:00
Nextcloud bot
1d848e0fc4 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-14 00:42:26 +00:00
Luka Trovic
9e8c1e982f Merge pull request #6734 from nextcloud/dependabot/npm_and_yarn/stable31/nextcloud/cypress-1.0.0-beta.13
bump @nextcloud/cypress from 1.0.0-beta.12 to 1.0.0-beta.13
2025-02-13 18:07:48 +01:00
Nextcloud bot
11276ea5e1 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-13 00:42:11 +00:00
Julius Knorr
f0840641ba Merge pull request #6743 from nextcloud/backport/6649/stable31
[stable31] fix: Adapt URLs generated in the backend to new routes
2025-02-12 22:53:24 +01:00
Julius Knorr
f53de9a269 ci: Update query count
Signed-off-by: Julius Knorr <jus@bitgrid.net>
2025-02-12 21:32:18 +00:00
Julius Knorr
9b5bdc3d02 fix: Use dynamic base URL for vue router to make routing work in all cases
Signed-off-by: Julius Knorr <jus@bitgrid.net>
2025-02-12 21:32:18 +00:00
Julius Knorr
e9e5234925 tests: Fix url generation mocks and cleanup some phpunit code
Signed-off-by: Julius Knorr <jus@bitgrid.net>
2025-02-12 21:32:18 +00:00
Julius Knorr
81c8aad66f fix: Adapt URLs generated in the backend to new routes
Signed-off-by: Julius Knorr <jus@bitgrid.net>
2025-02-12 21:32:18 +00:00
Nextcloud bot
7cc43c706b Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-12 00:43:12 +00:00
Nextcloud bot
19b0d60b21 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-11 00:41:50 +00:00
Nextcloud bot
b1b38e05eb Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-09 00:41:46 +00:00
dependabot[bot]
687414a7a2 bump @nextcloud/cypress from 1.0.0-beta.12 to 1.0.0-beta.13
---
updated-dependencies:
- dependency-name: "@nextcloud/cypress"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-08 03:26:21 +00:00
Luka Trovic
35a6c4d783 Merge pull request #6719 from nextcloud/automated/noid/stable31-fix-npm-audit
[stable31] Fix npm audit
2025-02-07 10:18:39 +01:00
Nextcloud bot
c863c78623 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-07 00:41:28 +00:00
Nextcloud bot
affcbf7287 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-05 00:43:22 +00:00
Elizabeth Danzberger
aab45b764d Merge pull request #6723 from nextcloud/backport/6692/stable31
[stable31] fix: skip exporting a deleted card
2025-02-04 14:10:20 -05:00
Elizabeth Danzberger
3288e0e002 fix: skip exporting a deleted card
Signed-off-by: Elizabeth Danzberger <lizzy7128@tutanota.de>
2025-02-04 18:28:19 +00:00
Luka Trovic
cca9cc08f0 Merge pull request #6693 from nextcloud/dependabot/npm_and_yarn/stable31/babel/runtime-7.26.7
chore(deps): bump @babel/runtime from 7.26.0 to 7.26.7
2025-02-03 09:21:47 +01:00
dependabot[bot]
508dddc7cd chore(deps): bump @babel/runtime from 7.26.0 to 7.26.7
Bumps [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.26.0 to 7.26.7.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.26.7/packages/babel-runtime)

---
updated-dependencies:
- dependency-name: "@babel/runtime"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-03 06:19:47 +01:00
Nextcloud bot
fd75f66624 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-03 01:02:35 +00:00
nextcloud-command
7635cde5cd fix(deps): Fix npm audit
Signed-off-by: GitHub <noreply@github.com>
2025-02-02 03:22:14 +00:00
Nextcloud bot
5b48075bc2 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-02 00:42:32 +00:00
dependabot[bot]
fb0096b113 Merge pull request #6710 from nextcloud/dependabot/npm_and_yarn/stable31/dompurify-3.2.4 2025-02-01 02:37:11 +00:00
dependabot[bot]
d9ce467c98 chore(deps): bump dompurify from 3.2.3 to 3.2.4
Bumps [dompurify](https://github.com/cure53/DOMPurify) from 3.2.3 to 3.2.4.
- [Release notes](https://github.com/cure53/DOMPurify/releases)
- [Commits](https://github.com/cure53/DOMPurify/compare/3.2.3...3.2.4)

---
updated-dependencies:
- dependency-name: dompurify
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-01 02:20:53 +00:00
Julius Knorr
ccd10248f7 chore(release): Bump version to 1.15.0-beta.2
Signed-off-by: Julius Knorr <jus@bitgrid.net>
2025-01-30 11:04:51 +01:00
Julius Knorr
2473117892 ci: Test for separate extension
Signed-off-by: Julius Knorr <jus@bitgrid.net>
2025-01-29 18:17:06 +01:00
Julius Härtl
e729bdcd04 fix: Properly show attachment extension
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2025-01-29 18:17:06 +01:00
Julius Knorr
58de28909f Merge pull request #6705 from nextcloud/cypress-for-stable31 2025-01-29 17:20:45 +01:00
grnd-alt
eda6bca538 fix: set cypress ci server version to stable31
Signed-off-by: grnd-alt <git@belakkaf.net>
2025-01-29 13:10:35 +01:00
Nextcloud bot
aa90c0b2d4 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-01-28 00:41:17 +00:00
Nextcloud bot
5a08e57de8 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-01-27 00:40:22 +00:00
Nextcloud bot
75067a0695 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-01-25 01:01:24 +00:00
Nextcloud bot
00d63692c8 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-01-24 00:41:36 +00:00
96 changed files with 1045 additions and 1790 deletions

View File

@@ -13,40 +13,6 @@ updates:
- juliushaertl
- 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
target-branch: stable30
versioning-strategy: lockfile-only
@@ -54,7 +20,41 @@ updates:
schedule:
interval: weekly
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
ignore:
- dependency-name: "*"
@@ -69,7 +69,7 @@ updates:
schedule:
interval: weekly
day: saturday
time: "03:45"
time: "03:00"
timezone: Europe/Paris
open-pull-requests-limit: 10
reviewers:
@@ -81,7 +81,7 @@ updates:
schedule:
interval: weekly
day: saturday
time: "04:00"
time: "03:00"
timezone: Europe/Paris
open-pull-requests-limit: 10
reviewers:
@@ -93,7 +93,7 @@ updates:
schedule:
interval: weekly
day: saturday
time: "04:15"
time: "03:00"
timezone: Europe/Paris
open-pull-requests-limit: 10
reviewers:

View File

@@ -18,13 +18,13 @@ jobs:
steps:
- uses: actions/checkout@v4.2.2
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4.4.0
uses: actions/setup-node@v4.1.0
with:
node-version: ${{ matrix.node-version }}
- name: Set up npm7
run: npm i -g npm@7
- name: Setup PHP
uses: shivammathur/setup-php@2.34.1
uses: shivammathur/setup-php@2.31.1
with:
php-version: '7.4'
tools: composer

View File

@@ -71,7 +71,7 @@ jobs:
- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
# Skip if no package.json
if: ${{ steps.versions.outputs.nodeVersion }}
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.1.0
uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0
with:
node-version: ${{ steps.versions.outputs.nodeVersion }}
@@ -87,7 +87,7 @@ jobs:
filename: ${{ env.APP_NAME }}/appinfo/info.xml
- 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:
php-version: ${{ steps.php-versions.outputs.php-min }}
coverage: none
@@ -173,7 +173,7 @@ jobs:
tar -zcvf ${{ env.APP_NAME }}.tar.gz ${{ env.APP_NAME }}
- name: Attach tarball to github release
uses: svenstaro/upload-release-action@81c65b7cd4de9b2570615ce3aad67a41de5b1a13 # v2
uses: svenstaro/upload-release-action@04733e069f2d7f7f0b4aebc4fbdbce8613b03ccd # v2
id: attach_to_release
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -22,7 +22,7 @@ jobs:
node-version: [20.x]
# containers: [1, 2, 3]
php-versions: [ '8.2' ]
server-versions: [ 'master' ]
server-versions: [ 'stable31' ]
env:
extensions: mbstring, iconv, fileinfo, intl, sqlite, pdo_sqlite, zip, gd, apcu
@@ -41,7 +41,7 @@ jobs:
steps:
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4.4.0
uses: actions/setup-node@v4.1.0
with:
node-version: ${{ matrix.node-version }}
@@ -91,7 +91,7 @@ jobs:
restore-keys: ${{ steps.extcache.outputs.key }}
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@2.34.1
uses: shivammathur/setup-php@2.31.1
with:
php-version: ${{ matrix.php-versions }}
extensions: ${{ env.extensions }}

View File

@@ -78,7 +78,7 @@ jobs:
path: apps/activity
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@2.34.1
uses: shivammathur/setup-php@2.31.1
with:
php-version: ${{ matrix.php-versions }}
extensions: mbstring, iconv, fileinfo, intl, sqlite, pdo_sqlite, mysql, pdo_mysql, pgsql, pdo_pgsql, apcu, gd

View File

@@ -68,7 +68,7 @@ jobs:
fallbackNpm: '^10'
- 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:
node-version: ${{ steps.versions.outputs.nodeVersion }}

View File

@@ -33,8 +33,8 @@ jobs:
id: versions
uses: icewind1991/nextcloud-version-matrix@58becf3b4bb6dc6cef677b15e2fd8e7d48c0908f # v1.3.1
- name: Set up php${{ steps.versions.outputs.php-min }}
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e # v2.34.1
- name: Set up php${{ steps.versions.outputs.php-available }}
uses: shivammathur/setup-php@c541c155eee45413f5b09a52248675b1a2575231 # v2.31.1
with:
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

View File

@@ -48,7 +48,7 @@ jobs:
persist-credentials: false
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e # v2.34.1
uses: shivammathur/setup-php@c541c155eee45413f5b09a52248675b1a2575231 # v2.31.1
with:
php-version: ${{ matrix.php-versions }}
extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite

View File

@@ -37,7 +37,7 @@ jobs:
fallbackNpm: '^10'
- 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:
node-version: ${{ steps.versions.outputs.nodeVersion }}

View File

@@ -14,7 +14,7 @@ jobs:
steps:
- uses: actions/checkout@v4.2.2
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4.4.0
uses: actions/setup-node@v4.1.0
with:
node-version: ${{ matrix.node-version }}
- name: Set up npm7

View File

@@ -14,9 +14,6 @@ on:
# At 2:30 on Sundays
- cron: '30 2 * * 0'
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
@@ -24,18 +21,15 @@ jobs:
strategy:
fail-fast: false
matrix:
branches: ['main', 'master', 'stable32', 'stable31', 'stable30']
branches: ['main', 'master', 'stable30', 'stable29', 'stable28']
name: npm-audit-fix-${{ matrix.branches }}
steps:
- name: Checkout
id: checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
with:
persist-credentials: false
ref: ${{ matrix.branches }}
continue-on-error: true
- name: Read package.json node and npm engines version
uses: skjnldsv/read-package-engines-version-actions@06d6baf7d8f41934ab630e97d9e6c0bc9c9ac5e4 # v3
@@ -45,7 +39,7 @@ jobs:
fallbackNpm: '^10'
- 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:
node-version: ${{ steps.versions.outputs.nodeVersion }}
@@ -54,10 +48,10 @@ jobs:
- name: Fix 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
if: steps.checkout.outcome == 'success'
if: always()
env:
CYPRESS_INSTALL_BINARY: 0
run: |
@@ -65,8 +59,8 @@ jobs:
npm run build --if-present
- name: Create Pull Request
if: steps.checkout.outcome == 'success'
uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8
if: always()
uses: peter-evans/create-pull-request@5e914681df9dc83aa4e4905692ca88beb2f9e91f # v7.0.5
with:
token: ${{ secrets.COMMAND_BOT_PAT }}
commit-message: 'fix(deps): Fix npm audit'

View File

@@ -103,7 +103,7 @@ jobs:
path: apps/${{ env.APP_NAME }}
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e # v2.34.1
uses: shivammathur/setup-php@c541c155eee45413f5b09a52248675b1a2575231 # v2.31.1
with:
php-version: ${{ matrix.php-versions }}
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation

View File

@@ -106,7 +106,7 @@ jobs:
path: apps/${{ env.APP_NAME }}
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e # v2.34.1
uses: shivammathur/setup-php@c541c155eee45413f5b09a52248675b1a2575231 # v2.31.1
with:
php-version: ${{ matrix.php-versions }}
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation

View File

@@ -95,7 +95,7 @@ jobs:
path: apps/${{ env.APP_NAME }}
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e # v2.34.1
uses: shivammathur/setup-php@c541c155eee45413f5b09a52248675b1a2575231 # v2.31.1
with:
php-version: ${{ matrix.php-versions }}
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation

View File

@@ -15,13 +15,8 @@ on:
schedule:
- cron: '30 1 * * *'
permissions:
contents: read
pull-requests: write
jobs:
pr-feedback:
if: ${{ github.repository_owner == 'nextcloud' }}
runs-on: ubuntu-latest
steps:
- name: The get-github-handles-from-website action

View File

@@ -35,8 +35,8 @@ jobs:
- 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
- name: Set up php${{ steps.versions.outputs.php-min }}
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e # v2.34.1
- name: Set up php${{ steps.versions.outputs.php-available }}
uses: shivammathur/setup-php@c541c155eee45413f5b09a52248675b1a2575231 # v2.31.1
with:
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

View File

@@ -16,7 +16,7 @@ permissions:
jobs:
reuse-compliance-check:
runs-on: ubuntu-latest-low
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2

View File

@@ -23,7 +23,7 @@ jobs:
strategy:
fail-fast: false
matrix:
branches: ['main', 'master', 'stable32', 'stable31', 'stable30']
branches: ['main', 'master', 'stable30', 'stable29', 'stable28']
name: update-nextcloud-ocp-${{ matrix.branches }}
@@ -38,7 +38,7 @@ jobs:
- name: Set up php8.2
if: steps.checkout.outcome == 'success'
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e # v2.34.1
uses: shivammathur/setup-php@c541c155eee45413f5b09a52248675b1a2575231 # v2.31.1
with:
php-version: 8.2
# 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
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:
token: ${{ secrets.COMMAND_BOT_PAT }}
commit-message: 'chore(dev-deps): Bump nextcloud/ocp package'

View File

@@ -6,7 +6,6 @@
- Adrian Missy <adrian.missy@onewavestudios.com>
- Alexandru Puiu <alexpuiu20@yahoo.com>
- Arne Bartelt <arne.bartelt@gmail.com>
- Chandi Langecker <git@chandi.it>
- Christoph Wurst <christoph@winzerhof-wurst.at>
- Gary Kim <gary@garykim.dev>

View File

@@ -5,16 +5,64 @@
# Changelog
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
- 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
- CSV export fixes @gidan80 [#6800](https://github.com/nextcloud/deck/pull/6800)
- feat: Implement reference resolving for cards that have a link in the title @juliusknorr [#6286](https://github.com/nextcloud/deck/pull/6286)
### 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
### Fixed

View File

@@ -12,7 +12,7 @@ SPDX-FileCopyrightText = "none"
SPDX-License-Identifier = "CC0-1.0"
[[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"
SPDX-FileCopyrightText = "2019 Nextcloud GmbH and Nextcloud contributors"
SPDX-License-Identifier = "AGPL-3.0-or-later"

View File

@@ -20,7 +20,7 @@
- 🚀 Get your project organized
</description>
<version>2.0.0-dev.0</version>
<version>1.15.3</version>
<licence>agpl</licence>
<author>Julius Härtl</author>
<namespace>Deck</namespace>
@@ -42,7 +42,7 @@
<database min-version="9.4">pgsql</database>
<database>sqlite</database>
<database min-version="8.0">mysql</database>
<nextcloud min-version="33" max-version="33"/>
<nextcloud min-version="31" max-version="31"/>
</dependencies>
<background-jobs>
<job>OCA\Deck\Cron\DeleteCron</job>
@@ -54,15 +54,11 @@
<live-migration>
<step>OCA\Deck\Migration\DeletedCircleCleanup</step>
</live-migration>
<post-migration>
<step>OCA\Deck\Migration\LabelMismatchCleanup</step>
</post-migration>
</repair-steps>
<commands>
<command>OCA\Deck\Command\UserExport</command>
<command>OCA\Deck\Command\BoardImport</command>
<command>OCA\Deck\Command\TransferOwnership</command>
<command>OCA\Deck\Command\CalendarToggle</command>
</commands>
<activity>
<settings>

View File

@@ -29,7 +29,6 @@ return [
['name' => 'board#clone', 'url' => '/boards/{boardId}/clone', 'verb' => 'POST'],
['name' => 'board#transferOwner', 'url' => '/boards/{boardId}/transferOwner', 'verb' => 'PUT'],
['name' => 'board#export', 'url' => '/boards/{boardId}/export', 'verb' => 'GET'],
['name' => 'board#import', 'url' => '/boards/import', 'verb' => 'POST'],
// stacks
['name' => 'stack#index', 'url' => '/stacks/{boardId}', 'verb' => 'GET'],

View File

@@ -15,7 +15,7 @@
"roave/security-advisories": "dev-master",
"phpunit/phpunit": "^9",
"nextcloud/coding-standard": "^1.1",
"nextcloud/ocp": "dev-master",
"nextcloud/ocp": "dev-stable31",
"psalm/phar": "^5.13"
},
"config": {

161
composer.lock generated
View File

@@ -4,34 +4,146 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "6950663d9d213151028e780637480220",
"content-hash": "c89537a172cee5c19093b4ea0cb5365c",
"packages": [
{
"name": "justinrainbow/json-schema",
"version": "6.4.2",
"name": "icecave/parity",
"version": "1.0.0",
"source": {
"type": "git",
"url": "https://github.com/jsonrainbow/json-schema.git",
"reference": "ce1fd2d47799bb60668643bc6220f6278a4c1d02"
"url": "https://github.com/icecave/parity.git",
"reference": "0109fef58b3230d23b20b2ac52ecdf477218d300"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/ce1fd2d47799bb60668643bc6220f6278a4c1d02",
"reference": "ce1fd2d47799bb60668643bc6220f6278a4c1d02",
"url": "https://api.github.com/repos/icecave/parity/zipball/0109fef58b3230d23b20b2ac52ecdf477218d300",
"reference": "0109fef58b3230d23b20b2ac52ecdf477218d300",
"shasum": ""
},
"require": {
"ext-json": "*",
"marc-mabe/php-enum": "^4.0",
"php": "^7.2 || ^8.0"
"icecave/repr": "~1",
"php": ">=5.3"
},
"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",
"marc-mabe/php-enum-phpstan": "^2.0",
"phpspec/prophecy": "^1.19",
"phpstan/phpstan": "^1.12",
"phpunit/phpunit": "^8.5"
"phpunit/phpunit": "^4.8.35"
},
"bin": [
"bin/validate-json"
@@ -77,9 +189,9 @@
],
"support": {
"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",
@@ -376,16 +488,16 @@
},
{
"name": "nextcloud/ocp",
"version": "dev-master",
"version": "dev-stable31",
"source": {
"type": "git",
"url": "https://github.com/nextcloud-deps/ocp.git",
"reference": "d927392a2a368c372ef80096171139d4287b2339"
"reference": "abd32429d794ede1d92b7b0a88a1070371c907b5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/nextcloud-deps/ocp/zipball/d927392a2a368c372ef80096171139d4287b2339",
"reference": "d927392a2a368c372ef80096171139d4287b2339",
"url": "https://api.github.com/repos/nextcloud-deps/ocp/zipball/abd32429d794ede1d92b7b0a88a1070371c907b5",
"reference": "abd32429d794ede1d92b7b0a88a1070371c907b5",
"shasum": ""
},
"require": {
@@ -395,11 +507,10 @@
"psr/event-dispatcher": "^1.0",
"psr/log": "^3.0.2"
},
"default-branch": true,
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "33.0.0-dev"
"dev-stable31": "31.0.0-dev"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -419,9 +530,9 @@
"description": "Composer package containing Nextcloud's public OCP API and the unstable NCU API",
"support": {
"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",

View File

@@ -14,7 +14,6 @@
input[type=submit].icon-confirm {
border-color: var(--color-border-maxcontrast) !important;
border-style: solid;
border-left: none;
}

View File

@@ -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')
})
})

View File

@@ -302,9 +302,6 @@ describe('Card', function () {
.first().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('.vs__dropdown-menu .tag:contains("Action needed")').should('be.visible').click()
cy.get('.vs__dropdown-menu .tag:contains("Later")').should('be.visible').click()

View File

@@ -22,10 +22,10 @@ describe('Deck dashboard', function() {
.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')
const defaultBoard = 'Welcome to Nextcloud Deck!'
const defaultBoard = 'Personal'
cy.get('.app-navigation-entry-wrapper[icon=icon-deck]')
.find('ul.app-navigation-entry__children .app-navigation-entry:contains(' + defaultBoard + ')')

View File

@@ -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"
}
]
}

View File

@@ -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.get('[aria-label="Open details"]').click()
cy.get('.app-sidebar').should('be.visible')
// Add delay to ensure the events are bound
cy.wait(1000)
cy.get('.select input').click().type(`${query}`)
cy.get('.select input').type(`${query}`)
cy.wait('@fetchRecipients', { timeout: 7000 })
cy.get('.vs__dropdown-menu .option').first().contains(query)

View File

@@ -6,7 +6,7 @@ The REST API provides access for authenticated users to their data inside the De
# 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
- 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 |
| --------- | ------- | --------------------------------------- |
| labelId | Integer | The label id to assign to the card |
#### Response
##### 200 Success
@@ -998,12 +997,10 @@ The request can fail with a bad request response for the following reasons:
#### Request data
The request is performed as `multipart/form-data`.
| Parameter | Type | Description |
| --------- | ------- | ----------------------------------------------------------------------------------------------- |
| 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. |
| Parameter | Type | Description |
| --------- | ------- | --------------------------------------------- |
| type | String | The type of the attachement |
| file | Binary | File data to add as an attachment |
- 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
@@ -1025,13 +1022,12 @@ The request is performed as `multipart/form-data`.
#### Request data
The request is performed as `multipart/form-data`.
| Parameter | Type | Description |
| --------- | ------- | ----------------------------------------------------------------------------------------------- |
| 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. |
| Parameter | Type | Description |
| --------- | ------- | --------------------------------------------- |
| type | String | The type of the attachement |
| file | Binary | File data to add as an attachment |
For now only `deck_file` is supported as an attachment type.
#### Response

Binary file not shown.

Before

Width:  |  Height:  |  Size: 188 KiB

View File

@@ -57,6 +57,7 @@ OC.L10N.register(
"Set due date for this weekend" : "Задаць дату выканання на гэты ўік-энд",
"Next week {timeLocale}" : "На наступным тыдні {timeLocale}",
"Set due date for next week" : "Задаць дату выканання на наступны тыдзень",
"Create a new tag:" : "Стварыць новы тэг:",
"(group)" : "(група)",
"Open link" : "Адкрыць спасылку",
"Edit title" : "Рэдагаваць загаловак",
@@ -78,6 +79,7 @@ OC.L10N.register(
"Message from {author} in {conversationName}" : "Паведамленне ад {author} у {conversationName}",
"Failed to upload {name}" : "Не ўдалося запампаваць {name}",
"Share" : "Абагуліць",
"Personal" : "Асабістыя",
"Today" : "Сёння",
"Tomorrow" : "Заўтра"
},

View File

@@ -55,6 +55,7 @@
"Set due date for this weekend" : "Задаць дату выканання на гэты ўік-энд",
"Next week {timeLocale}" : "На наступным тыдні {timeLocale}",
"Set due date for next week" : "Задаць дату выканання на наступны тыдзень",
"Create a new tag:" : "Стварыць новы тэг:",
"(group)" : "(група)",
"Open link" : "Адкрыць спасылку",
"Edit title" : "Рэдагаваць загаловак",
@@ -76,6 +77,7 @@
"Message from {author} in {conversationName}" : "Паведамленне ад {author} у {conversationName}",
"Failed to upload {name}" : "Не ўдалося запампаваць {name}",
"Share" : "Абагуліць",
"Personal" : "Асабістыя",
"Today" : "Сёння",
"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);"

View File

@@ -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.",
"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.",
"%s has mentioned you in a comment on \"%s\"." : " %s har nævnt 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}.",
"%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 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.",
"{user} has shared {deck-board} with you." : "{user} har delt {deck-board} med dig.",
"Deck board" : "Opslagstavle",

View File

@@ -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.",
"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.",
"%s has mentioned you in a comment on \"%s\"." : " %s har nævnt 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}.",
"%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 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.",
"{user} has shared {deck-board} with you." : "{user} har delt {deck-board} med dig.",
"Deck board" : "Opslagstavle",

View File

@@ -6,16 +6,19 @@ OC.L10N.register(
"No file was uploaded" : "Ulac afaylu i d-yettwasulin",
"Missing a temporary folder" : "Ixuṣ ukaram akudan",
"Finished" : "Immed",
"copy" : "nɣel",
"Done" : "Immed",
"Attachments" : "Ticeqqufin",
"File" : "Afaylu",
"Cancel" : "Sefsex",
"Open" : "Ldi",
"Completed" : "Yemmed",
"Open details" : "Ldi talqayt",
"Details" : "Talqayt",
"Sharing" : "Beṭṭu",
"Tags" : "Tibzimin",
"Activity" : "Armud",
"Transfer" : "Seḍfeṛ",
"Owner" : "Bab",
"Delete" : "Kkes",
"Edit" : "Ẓreg",
@@ -26,6 +29,9 @@ OC.L10N.register(
"Save" : "Sekles",
"Cancel reply" : "Semmet tiririt.",
"Reply" : "Err",
"Description" : "Aglam",
"Open link" : "Nɣel aseɣwen",
"Keyboard shortcuts" : "Inegzumen n unasiw",
"Ctrl" : "Ctrl",
"Search" : "Nadi",
"Cancel edit" : "Sefsex aseẓreg",

View File

@@ -4,16 +4,19 @@
"No file was uploaded" : "Ulac afaylu i d-yettwasulin",
"Missing a temporary folder" : "Ixuṣ ukaram akudan",
"Finished" : "Immed",
"copy" : "nɣel",
"Done" : "Immed",
"Attachments" : "Ticeqqufin",
"File" : "Afaylu",
"Cancel" : "Sefsex",
"Open" : "Ldi",
"Completed" : "Yemmed",
"Open details" : "Ldi talqayt",
"Details" : "Talqayt",
"Sharing" : "Beṭṭu",
"Tags" : "Tibzimin",
"Activity" : "Armud",
"Transfer" : "Seḍfeṛ",
"Owner" : "Bab",
"Delete" : "Kkes",
"Edit" : "Ẓreg",
@@ -24,6 +27,9 @@
"Save" : "Sekles",
"Cancel reply" : "Semmet tiririt.",
"Reply" : "Err",
"Description" : "Aglam",
"Open link" : "Nɣel aseɣwen",
"Keyboard shortcuts" : "Inegzumen n unasiw",
"Ctrl" : "Ctrl",
"Search" : "Nadi",
"Cancel edit" : "Sefsex aseẓreg",

View File

@@ -12,7 +12,7 @@ OC.L10N.register(
"You have removed {acl} from the board {board}" : "Го избришавте {acl} од таблата {board}",
"{user} has removed {acl} from the board {board}" : "{user} го избриша {acl} од таблата {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}",
"{user} has archived the board {before}" : "{user} ја архивирање таблата {before}",
"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}",
"{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}",
"{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}",
"{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}",
@@ -28,7 +28,7 @@ OC.L10N.register(
"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}",
"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}",
"{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}",
@@ -37,6 +37,10 @@ OC.L10N.register(
"{user} has archived card {card} in list {stack} on board {board}" : "{user} ја архивираше картицата {card} во листата {stack} на таблата {board}",
"You have unarchived card {card} in list {stack} on board {board}" : "Ја вративте од архива картицата {card} во листата {stack} на таблата {board}",
"{user} has unarchived card {card} in list {stack} on board {board}" : "{user} ја врати од архива картицата {card} во листата {stack} на таблата {board}",
"You have marked the card {card} as done in list {stack} on board {board}" : "Ја означивте картицата {card} како завршена во листата {stack} на таблата {board}",
"{user} has marked card {card} as done in list {stack} on board {board}" : "{user} ја означи картичката {card} како завршена во листата {stack} на таблата {board}",
"You have marked the card {card} as undone in list {stack} on board {board}" : "Ја означивте картицата {card} како не-завршена во листата {stack} на таблата {board}",
"{user} has marked the card {card} as undone in list {stack} on board {board}" : "{user} ја означи картичката {card} како не-завршена во листата {stack} на таблата {board}",
"You have removed the due date of card {card}" : "Го избришавте датумот на истекување на картицата {card}",
"{user} has removed the due date of card {card}" : "{user} го избриша датумот на истекување на картицата {card}",
"You have set the due date of card {card} to {after}" : "Поставивте датум на истекување на картицата {card}",
@@ -65,7 +69,9 @@ OC.L10N.register(
"{user} has commented on card {card}" : "{user} коментирање на картицата {card}",
"Deck" : "Deck",
"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>card description</strong> has been changed" : "Променет е <strong>опис на картица</strong> ",
"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 MAX_FILE_SIZE directive that was specified in the HTML form" : "Големината на датотеката ја надминува MAX_FILE_SIZE директивата која беше специфицирана во HTML формата",
@@ -75,35 +81,56 @@ OC.L10N.register(
"Could not write file to disk" : "Неможе да се запишува на дискот",
"A PHP extension stopped the file upload" : "PHP додаток го стопираше прикачувањето на датотеката",
"No file uploaded or file size exceeds maximum of %s" : "Нема прикачена дадотека или големината го надмминува максимумот од %s",
"Cards due today" : "Картици со рок до денес",
"Cards due tomorrow" : "Картици со рок до утре",
"Upcoming cards" : "Престојни картици",
"Load more" : "Вчитај повеќе",
"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 {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\".",
"{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.",
"{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." : "Нема податоци за креирање на прилог.",
"Finished" : "Завршено",
"To review" : "На ревизија",
"Action needed" : "Потребна е акција",
"Later" : "Покасно",
"copy" : "копирај",
"Read more inside" : "Прочитај повеќе",
"To Do" : "За правење",
"In Progress" : "Во тек",
"Done" : "Готово",
"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" : "Прилози",
"File" : "Датотека",
"date" : "датум",
"Card not found" : "Картицата не е пронајдена",
"Path is already shared with this card" : "Патеката веќе е споделена со оваа картица",
"Invalid date, date format must be YYYY-MM-DD" : "Невалиден датум, форматот мора да биде ГГГГ-ММ-ДД",
"Personal planning and team project organization" : "Персонален планер и тимски проект организер",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in Markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your Markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck е алатка за организација во стил на kanban, наменета за лични планови и организација на проекти за тимови интегрирани со Nextcloud.\n\n\n📥 Додај ги задачите на картички и подреди ги\n📄 Запиши дополнителни белешки во Markdown\n🔖 Додели етикети за уште подобра организација\n👥 Сподели со твојот тим, пријатели или семејство\n📎 Прикачи датотеки и вметни ги во Markdown описот\n💬 Дискутирај со твојот тим преку коментари\n⚡ Следи ги промените во активностите\n🚀 Организирај го твојот проект",
"Add board" : "Додади табла",
"Card details" : "Детали за картица",
"Select the board to link to a project" : "Избери табла за поврзување со проект",
"Search by board title" : "Барај по име на табла",
"Select board" : "Избери табла",
"Move/copy card" : "Премести/копирај картица",
"Select a board" : "Избери табла",
"No lists available" : "Нема достапни листи",
"Select a list" : "Избери листа",
"Move card" : "Премести картица",
"Copy card" : "Копирај картица",
"Select the card to link to a project" : "Избери картица за поврзување со проект",
"Link to card" : "Линк до картица",
"Select a card" : "Избери картица",
@@ -124,6 +151,7 @@ OC.L10N.register(
"Filter by tag" : "Филтрирај по ознака",
"Filter by assigned user" : "Филтрирај по назначени корисници",
"Unassigned" : "Неназначени",
"Filter by status" : "Филтрирај по статус",
"Open" : "Отвори",
"Completed" : "Завршено",
"Filter by due date" : "Филтрирај по краен рок",
@@ -133,12 +161,17 @@ OC.L10N.register(
"Next 30 days" : "Следни 30 дена",
"No due date" : "Нема краен рок",
"Clear filter" : "Исчисти филтри",
"View Modes" : "Режими на приказ",
"Toggle View Modes" : "Промени режими на приказ",
"Hide archived cards" : "Сокриј ги архивираните картици",
"Show archived cards" : "Прикажи ги архивираните картици",
"Toggle compact mode" : "Вклучи компактен мод",
"Hide card cover images" : "Сокриј насловни слики на картици",
"Show card cover images" : "Прикажи насловни слики на картици",
"Open details" : "Отвори детали",
"Details" : "Детали",
"Loading board" : "Вчирување на табла",
"Currently present people" : "Моментално приситни корисници",
"Loading board" : "Вчитување на табла",
"Board not found" : "Таблата не е пронајдена",
"Create a new list to add cards to this board" : "Додадете нова листа за да додадете картици на таблата",
"Sharing" : "Споделување",
@@ -149,19 +182,29 @@ OC.L10N.register(
"Undo" : "Врати",
"Deleted cards" : "Избришани картици",
"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" : "Трансфер",
"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" : "Не се пронајдени учесници",
"Board owner" : "Сопственик на таблата",
"(Group)" : "(Група)",
"(Team)" : "(Тим)",
"Can edit" : "Може да се уредува",
"Can share" : "Can share",
"Can manage" : "Може да ја менаџира",
"Owner" : "Сопственик",
"Delete" : "Избриши",
"List deleted" : "Листата е избришана",
"Edit list title" : "Удери наслов на листата",
"Archive all cards" : "Архивирај ги сите картици",
"Unarchive all cards" : "Врати ги од архива сите картици",
"Delete list" : "Избриши листа",
"Archive all cards in this list" : "Архивирај ги сите картици во листата",
"Unarchive all cards in this list" : "Врати ги од архива сите картици во оваа листа",
"Add a new card" : "Додади нова картица",
"Card name" : "Име на картицата",
"title and color value must be provided" : "Мора да се внесе наслов и боја",
@@ -169,32 +212,39 @@ OC.L10N.register(
"Add a new tag" : "Додади нова ознака",
"Board name" : "Име на табла",
"Members" : "Членови",
"Assign to users/groups/team" : "Додели на корисници/групи/тимови",
"Assign a user to this card…" : "Додели корисник на оваа картица...",
"Select a user to assign to this card…" : "Избери на кого да се додели оваа картица…",
"File to share" : "Датотека за споделување",
"Invalid path selected" : "Избрана невалидна патека",
"Upload new files" : "Прикачи нови датотеки",
"Share from Files" : "Сподели од датотеките",
"Pending share" : "Споделување на чекање",
"Add this attachment" : "Додади го овој прилог",
"Show in Files" : "Прикажи во датотеките",
"Download" : "Преземи",
"Remove attachment" : "Отстрани прилог",
"Delete Attachment" : "Избриши прилог",
"Restore Attachment" : "Врати прилог",
"Modified" : "Изменето",
"Created" : "Креирано",
"The title cannot be empty." : "Насловот неможе да биде празен.",
"Cannot close unsaved card!" : "Неможе да се затвори незачувана картица!",
"Open in sidebar view" : "Отвори страничен поглед",
"Open in bigger view" : "Отвори на голем екран",
"Comments" : "Коментари",
"Failed to load comments" : "Неуспешно вчитување на коментари",
"No comments yet. Begin the discussion!" : "Сеуште нема коментари. Започни дискусија!",
"The comment cannot be empty." : "Коментарот неможе да биде празен.",
"The comment cannot be longer than 1000 characters." : "Коментарот неможе да биде поголем од 1000 карактери.",
"Save" : "Зачувај",
"Created:" : "Создадено:",
"In reply to" : "Како одговор на",
"Cancel reply" : "Откажи одговор",
"Reply" : "Одговор",
"Update" : "Ажурирај",
"Write a description …" : "Напиши опис ...",
"Could not save description" : "Неможе да се зачува описот",
"Description" : "Опис",
"(Unsaved)" : "(Незачувано)",
"(Saving…)" : "(Снимање…)",
@@ -205,67 +255,127 @@ OC.L10N.register(
"Choose attachment" : "Избери прилог",
"Select Date" : "Избери датум",
"Later today {timeLocale}" : "Денес покасно {timeLocale}",
"Set due date for later today" : "Постави краен рок за денес подоцна",
"Tomorrow {timeLocale}" : "Утре {timeLocale}",
"Set due date for tomorrow" : "Постави краен рок за утре",
"This weekend {timeLocale}" : "Овој викенд {timeLocale}",
"Set due date for this weekend" : "Постави рок за овој викенд",
"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" : "Постави краен рок",
"Add due date" : "Додади краен рок",
"Choose a date" : "Избери датум",
"Remove due date" : "Отстрани краен рок",
"Mark as done" : "Означи како готово",
"Due at:" : "Краен рок:",
"Not done" : "Не е завршено",
"Unarchive card" : "Врати картица од архива",
"Archive card" : "Архивирај картица",
"Assign a tag to this card…" : "Додади ознака на оваа картица...",
"Select or create a tag…" : "Избери или креирај ознака...",
"Create a new tag:" : "Направи нова ознака:",
"(group)" : "(group)",
"{count} comments, {unread} unread" : "{count} коментари, {unread} непрочитани",
"Todo items" : "Работи за правење",
"Edit card title" : "Измени наслов на картица",
"Open link" : "Отвори линк",
"Card deleted" : "Картицата е избришана",
"Edit title" : "Удери наслов",
"Assign to me" : "Доделени мене",
"Unassign myself" : "Откажи се",
"Mark as not done" : "Означи како не-готово",
"Delete card" : "Избриши картица",
"seconds ago" : "пред неколку секунди",
"Keyboard shortcuts" : "Кратенки преку тастатура",
"Boost your productivity using Deck with keyboard shortcuts." : "Зголеми ја продуктивноста со користење на кратенки преку тастатура.",
"Board actions" : "Акции за табла",
"Keyboard shortcut" : "Кратенка преку тастатура",
"Action" : "Акција",
"Shift" : "Shift",
"Scroll" : "Scroll",
"Navigate between cards" : "Навигација помеѓу картиците",
"Close card details" : "Затвори детали на картица",
"Ctrl" : "Ctrl",
"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" : "Празно место",
"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" : "Сите табли",
"Archived boards" : "Архивирани табли",
"Shared with you" : "Споделено со тебе",
"Deck settings" : "Deck параметри",
"Use bigger card view" : "Користи поголем преглед на картици",
"Show card ID badge" : "Прикажи ID на картиците",
"Show boards in calendar/tasks" : "Прикажи ги таблите во календарнот",
"Limit board creation to some groups" : "Ограничи го креирањето на нови табли само на овие групи",
"Users outside of those groups will not be able to create their own boards, but will still be able to work on boards that have been shared with them." : "Корисниците кој што не се во овие групи нема да можат да прават нови таби, но ќе можат да работат на таблите кој ќе бидат споделени со нив.",
"Cancel edit" : "Откажи ажурирање",
"Save board" : "Зачувај табла",
"Board {0} deleted" : "Таблата {0} е избришана",
"All cards" : "Сите картици",
"Only assigned cards" : "Само доделени картици",
"No reminder" : "Нема потсетник",
"An error occurred" : "Настана грешка",
"Are you sure you want to delete the board {title}? This will delete all the data of this board including archived cards." : "Дали сте сигурени дека сакате да ја избришете оваа табла {title}? Ова ќе ги избрише и сите податоци во таблата и архивираните картици.",
"Delete the board?" : "Бришење на таблата?",
"Exporting board..." : "Извоз на табла...",
"Board details" : "Детали за таблата",
"Edit board" : "Измени табла",
"Clone board" : "Клонирај табла",
"Unarchive board" : "Врати табла од архива",
"Archive board" : "Архивирај табла",
"Export board" : "Извези табла",
"Turn on due date reminders" : "Вклучи потсетници за крајните рокови",
"Turn off due date reminders" : "Исклучи потсетници за крајните рокови",
"Due date reminders" : "Потсетници за крајните рокови",
"Assigned cards" : "Доделени картици",
"No notifications" : "Нема известувања",
"Delete board" : "Избриши табла",
"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" : "Извези",
"Loading filtered view" : "Вчитување на филтриран поглед",
"Search for {searchQuery} in other boards" : "Барај {searchQuery} во други табли",
"Search for {searchQuery} in all boards" : "Барај {searchQuery} во сите табли",
"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}",
"Click to expand description" : "Кликнни за проширување на опис",
"Click to expand comment" : "Кликнни за проширување на коментарот",
"Create card" : "Креирајте картица",
"Create a new card" : "Креирајте нова картица",
"Card title" : "Наслов на картицата",
"Creating the new card …" : "Креирање нова картица ...",
"Card \"{card}\" was added to \"{board}\"" : "Картицата \"{card}\" е додадена во \"{board}\"",
"Open card" : "Отвори картица",
"Close" : "Затвори",
"No upcoming cards" : "Нема престојни картици",
"upcoming cards today" : "престојни картици за денес",
"upcoming cards tomorrow" : "престојни картици за утре",
"upcoming cards" : "престојни картици",
"New card" : "Нова картица",
"Link to a board" : "Линк до табла",
"Link to a card" : "Линк до картица",
"Create a card" : "Креирајте картица",
@@ -273,6 +383,7 @@ OC.L10N.register(
"Something went wrong" : "Нешто не е во ред",
"Failed to upload {name}" : "Неуспешно прикачување {name}",
"Maximum file size of {size} exceeded" : "Максималната големина на датотека од {size} е достигната",
"Assigned users" : "Доделени корисници",
"Due date" : "До датум",
"Error creating the share" : "Грешка при креирање на споделување",
"Share with a Deck card" : "Споделено со Deck картица",

View File

@@ -10,7 +10,7 @@
"You have removed {acl} from the board {board}" : "Го избришавте {acl} од таблата {board}",
"{user} has removed {acl} from the board {board}" : "{user} го избриша {acl} од таблата {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}",
"{user} has archived the board {before}" : "{user} ја архивирање таблата {before}",
"You have unarchived the board {board}" : "Ја вративте од архива таблата {board}",
@@ -18,7 +18,7 @@
"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}",
"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}",
"{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}",
@@ -26,7 +26,7 @@
"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}",
"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}",
"{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}",
@@ -35,6 +35,10 @@
"{user} has archived card {card} in list {stack} on board {board}" : "{user} ја архивираше картицата {card} во листата {stack} на таблата {board}",
"You have unarchived card {card} in list {stack} on board {board}" : "Ја вративте од архива картицата {card} во листата {stack} на таблата {board}",
"{user} has unarchived card {card} in list {stack} on board {board}" : "{user} ја врати од архива картицата {card} во листата {stack} на таблата {board}",
"You have marked the card {card} as done in list {stack} on board {board}" : "Ја означивте картицата {card} како завршена во листата {stack} на таблата {board}",
"{user} has marked card {card} as done in list {stack} on board {board}" : "{user} ја означи картичката {card} како завршена во листата {stack} на таблата {board}",
"You have marked the card {card} as undone in list {stack} on board {board}" : "Ја означивте картицата {card} како не-завршена во листата {stack} на таблата {board}",
"{user} has marked the card {card} as undone in list {stack} on board {board}" : "{user} ја означи картичката {card} како не-завршена во листата {stack} на таблата {board}",
"You have removed the due date of card {card}" : "Го избришавте датумот на истекување на картицата {card}",
"{user} has removed the due date of card {card}" : "{user} го избриша датумот на истекување на картицата {card}",
"You have set the due date of card {card} to {after}" : "Поставивте датум на истекување на картицата {card}",
@@ -63,7 +67,9 @@
"{user} has commented on card {card}" : "{user} коментирање на картицата {card}",
"Deck" : "Deck",
"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>card description</strong> has been changed" : "Променет е <strong>опис на картица</strong> ",
"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 MAX_FILE_SIZE directive that was specified in the HTML form" : "Големината на датотеката ја надминува MAX_FILE_SIZE директивата која беше специфицирана во HTML формата",
@@ -73,35 +79,56 @@
"Could not write file to disk" : "Неможе да се запишува на дискот",
"A PHP extension stopped the file upload" : "PHP додаток го стопираше прикачувањето на датотеката",
"No file uploaded or file size exceeds maximum of %s" : "Нема прикачена дадотека или големината го надмминува максимумот од %s",
"Cards due today" : "Картици со рок до денес",
"Cards due tomorrow" : "Картици со рок до утре",
"Upcoming cards" : "Престојни картици",
"Load more" : "Вчитај повеќе",
"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 {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\".",
"{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.",
"{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." : "Нема податоци за креирање на прилог.",
"Finished" : "Завршено",
"To review" : "На ревизија",
"Action needed" : "Потребна е акција",
"Later" : "Покасно",
"copy" : "копирај",
"Read more inside" : "Прочитај повеќе",
"To Do" : "За правење",
"In Progress" : "Во тек",
"Done" : "Готово",
"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" : "Прилози",
"File" : "Датотека",
"date" : "датум",
"Card not found" : "Картицата не е пронајдена",
"Path is already shared with this card" : "Патеката веќе е споделена со оваа картица",
"Invalid date, date format must be YYYY-MM-DD" : "Невалиден датум, форматот мора да биде ГГГГ-ММ-ДД",
"Personal planning and team project organization" : "Персонален планер и тимски проект организер",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in Markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your Markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck е алатка за организација во стил на kanban, наменета за лични планови и организација на проекти за тимови интегрирани со Nextcloud.\n\n\n📥 Додај ги задачите на картички и подреди ги\n📄 Запиши дополнителни белешки во Markdown\n🔖 Додели етикети за уште подобра организација\n👥 Сподели со твојот тим, пријатели или семејство\n📎 Прикачи датотеки и вметни ги во Markdown описот\n💬 Дискутирај со твојот тим преку коментари\n⚡ Следи ги промените во активностите\n🚀 Организирај го твојот проект",
"Add board" : "Додади табла",
"Card details" : "Детали за картица",
"Select the board to link to a project" : "Избери табла за поврзување со проект",
"Search by board title" : "Барај по име на табла",
"Select board" : "Избери табла",
"Move/copy card" : "Премести/копирај картица",
"Select a board" : "Избери табла",
"No lists available" : "Нема достапни листи",
"Select a list" : "Избери листа",
"Move card" : "Премести картица",
"Copy card" : "Копирај картица",
"Select the card to link to a project" : "Избери картица за поврзување со проект",
"Link to card" : "Линк до картица",
"Select a card" : "Избери картица",
@@ -122,6 +149,7 @@
"Filter by tag" : "Филтрирај по ознака",
"Filter by assigned user" : "Филтрирај по назначени корисници",
"Unassigned" : "Неназначени",
"Filter by status" : "Филтрирај по статус",
"Open" : "Отвори",
"Completed" : "Завршено",
"Filter by due date" : "Филтрирај по краен рок",
@@ -131,12 +159,17 @@
"Next 30 days" : "Следни 30 дена",
"No due date" : "Нема краен рок",
"Clear filter" : "Исчисти филтри",
"View Modes" : "Режими на приказ",
"Toggle View Modes" : "Промени режими на приказ",
"Hide archived cards" : "Сокриј ги архивираните картици",
"Show archived cards" : "Прикажи ги архивираните картици",
"Toggle compact mode" : "Вклучи компактен мод",
"Hide card cover images" : "Сокриј насловни слики на картици",
"Show card cover images" : "Прикажи насловни слики на картици",
"Open details" : "Отвори детали",
"Details" : "Детали",
"Loading board" : "Вчирување на табла",
"Currently present people" : "Моментално приситни корисници",
"Loading board" : "Вчитување на табла",
"Board not found" : "Таблата не е пронајдена",
"Create a new list to add cards to this board" : "Додадете нова листа за да додадете картици на таблата",
"Sharing" : "Споделување",
@@ -147,19 +180,29 @@
"Undo" : "Врати",
"Deleted cards" : "Избришани картици",
"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" : "Трансфер",
"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" : "Не се пронајдени учесници",
"Board owner" : "Сопственик на таблата",
"(Group)" : "(Група)",
"(Team)" : "(Тим)",
"Can edit" : "Може да се уредува",
"Can share" : "Can share",
"Can manage" : "Може да ја менаџира",
"Owner" : "Сопственик",
"Delete" : "Избриши",
"List deleted" : "Листата е избришана",
"Edit list title" : "Удери наслов на листата",
"Archive all cards" : "Архивирај ги сите картици",
"Unarchive all cards" : "Врати ги од архива сите картици",
"Delete list" : "Избриши листа",
"Archive all cards in this list" : "Архивирај ги сите картици во листата",
"Unarchive all cards in this list" : "Врати ги од архива сите картици во оваа листа",
"Add a new card" : "Додади нова картица",
"Card name" : "Име на картицата",
"title and color value must be provided" : "Мора да се внесе наслов и боја",
@@ -167,32 +210,39 @@
"Add a new tag" : "Додади нова ознака",
"Board name" : "Име на табла",
"Members" : "Членови",
"Assign to users/groups/team" : "Додели на корисници/групи/тимови",
"Assign a user to this card…" : "Додели корисник на оваа картица...",
"Select a user to assign to this card…" : "Избери на кого да се додели оваа картица…",
"File to share" : "Датотека за споделување",
"Invalid path selected" : "Избрана невалидна патека",
"Upload new files" : "Прикачи нови датотеки",
"Share from Files" : "Сподели од датотеките",
"Pending share" : "Споделување на чекање",
"Add this attachment" : "Додади го овој прилог",
"Show in Files" : "Прикажи во датотеките",
"Download" : "Преземи",
"Remove attachment" : "Отстрани прилог",
"Delete Attachment" : "Избриши прилог",
"Restore Attachment" : "Врати прилог",
"Modified" : "Изменето",
"Created" : "Креирано",
"The title cannot be empty." : "Насловот неможе да биде празен.",
"Cannot close unsaved card!" : "Неможе да се затвори незачувана картица!",
"Open in sidebar view" : "Отвори страничен поглед",
"Open in bigger view" : "Отвори на голем екран",
"Comments" : "Коментари",
"Failed to load comments" : "Неуспешно вчитување на коментари",
"No comments yet. Begin the discussion!" : "Сеуште нема коментари. Започни дискусија!",
"The comment cannot be empty." : "Коментарот неможе да биде празен.",
"The comment cannot be longer than 1000 characters." : "Коментарот неможе да биде поголем од 1000 карактери.",
"Save" : "Зачувај",
"Created:" : "Создадено:",
"In reply to" : "Како одговор на",
"Cancel reply" : "Откажи одговор",
"Reply" : "Одговор",
"Update" : "Ажурирај",
"Write a description …" : "Напиши опис ...",
"Could not save description" : "Неможе да се зачува описот",
"Description" : "Опис",
"(Unsaved)" : "(Незачувано)",
"(Saving…)" : "(Снимање…)",
@@ -203,67 +253,127 @@
"Choose attachment" : "Избери прилог",
"Select Date" : "Избери датум",
"Later today {timeLocale}" : "Денес покасно {timeLocale}",
"Set due date for later today" : "Постави краен рок за денес подоцна",
"Tomorrow {timeLocale}" : "Утре {timeLocale}",
"Set due date for tomorrow" : "Постави краен рок за утре",
"This weekend {timeLocale}" : "Овој викенд {timeLocale}",
"Set due date for this weekend" : "Постави рок за овој викенд",
"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" : "Постави краен рок",
"Add due date" : "Додади краен рок",
"Choose a date" : "Избери датум",
"Remove due date" : "Отстрани краен рок",
"Mark as done" : "Означи како готово",
"Due at:" : "Краен рок:",
"Not done" : "Не е завршено",
"Unarchive card" : "Врати картица од архива",
"Archive card" : "Архивирај картица",
"Assign a tag to this card…" : "Додади ознака на оваа картица...",
"Select or create a tag…" : "Избери или креирај ознака...",
"Create a new tag:" : "Направи нова ознака:",
"(group)" : "(group)",
"{count} comments, {unread} unread" : "{count} коментари, {unread} непрочитани",
"Todo items" : "Работи за правење",
"Edit card title" : "Измени наслов на картица",
"Open link" : "Отвори линк",
"Card deleted" : "Картицата е избришана",
"Edit title" : "Удери наслов",
"Assign to me" : "Доделени мене",
"Unassign myself" : "Откажи се",
"Mark as not done" : "Означи како не-готово",
"Delete card" : "Избриши картица",
"seconds ago" : "пред неколку секунди",
"Keyboard shortcuts" : "Кратенки преку тастатура",
"Boost your productivity using Deck with keyboard shortcuts." : "Зголеми ја продуктивноста со користење на кратенки преку тастатура.",
"Board actions" : "Акции за табла",
"Keyboard shortcut" : "Кратенка преку тастатура",
"Action" : "Акција",
"Shift" : "Shift",
"Scroll" : "Scroll",
"Navigate between cards" : "Навигација помеѓу картиците",
"Close card details" : "Затвори детали на картица",
"Ctrl" : "Ctrl",
"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" : "Празно место",
"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" : "Сите табли",
"Archived boards" : "Архивирани табли",
"Shared with you" : "Споделено со тебе",
"Deck settings" : "Deck параметри",
"Use bigger card view" : "Користи поголем преглед на картици",
"Show card ID badge" : "Прикажи ID на картиците",
"Show boards in calendar/tasks" : "Прикажи ги таблите во календарнот",
"Limit board creation to some groups" : "Ограничи го креирањето на нови табли само на овие групи",
"Users outside of those groups will not be able to create their own boards, but will still be able to work on boards that have been shared with them." : "Корисниците кој што не се во овие групи нема да можат да прават нови таби, но ќе можат да работат на таблите кој ќе бидат споделени со нив.",
"Cancel edit" : "Откажи ажурирање",
"Save board" : "Зачувај табла",
"Board {0} deleted" : "Таблата {0} е избришана",
"All cards" : "Сите картици",
"Only assigned cards" : "Само доделени картици",
"No reminder" : "Нема потсетник",
"An error occurred" : "Настана грешка",
"Are you sure you want to delete the board {title}? This will delete all the data of this board including archived cards." : "Дали сте сигурени дека сакате да ја избришете оваа табла {title}? Ова ќе ги избрише и сите податоци во таблата и архивираните картици.",
"Delete the board?" : "Бришење на таблата?",
"Exporting board..." : "Извоз на табла...",
"Board details" : "Детали за таблата",
"Edit board" : "Измени табла",
"Clone board" : "Клонирај табла",
"Unarchive board" : "Врати табла од архива",
"Archive board" : "Архивирај табла",
"Export board" : "Извези табла",
"Turn on due date reminders" : "Вклучи потсетници за крајните рокови",
"Turn off due date reminders" : "Исклучи потсетници за крајните рокови",
"Due date reminders" : "Потсетници за крајните рокови",
"Assigned cards" : "Доделени картици",
"No notifications" : "Нема известувања",
"Delete board" : "Избриши табла",
"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" : "Извези",
"Loading filtered view" : "Вчитување на филтриран поглед",
"Search for {searchQuery} in other boards" : "Барај {searchQuery} во други табли",
"Search for {searchQuery} in all boards" : "Барај {searchQuery} во сите табли",
"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}",
"Click to expand description" : "Кликнни за проширување на опис",
"Click to expand comment" : "Кликнни за проширување на коментарот",
"Create card" : "Креирајте картица",
"Create a new card" : "Креирајте нова картица",
"Card title" : "Наслов на картицата",
"Creating the new card …" : "Креирање нова картица ...",
"Card \"{card}\" was added to \"{board}\"" : "Картицата \"{card}\" е додадена во \"{board}\"",
"Open card" : "Отвори картица",
"Close" : "Затвори",
"No upcoming cards" : "Нема престојни картици",
"upcoming cards today" : "престојни картици за денес",
"upcoming cards tomorrow" : "престојни картици за утре",
"upcoming cards" : "престојни картици",
"New card" : "Нова картица",
"Link to a board" : "Линк до табла",
"Link to a card" : "Линк до картица",
"Create a card" : "Креирајте картица",
@@ -271,6 +381,7 @@
"Something went wrong" : "Нешто не е во ред",
"Failed to upload {name}" : "Неуспешно прикачување {name}",
"Maximum file size of {size} exceeded" : "Максималната големина на датотека од {size} е достигната",
"Assigned users" : "Доделени корисници",
"Due date" : "До датум",
"Error creating the share" : "Грешка при креирање на споделување",
"Share with a Deck card" : "Споделено со Deck картица",

View File

@@ -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;
}
}

View File

@@ -10,12 +10,10 @@ namespace OCA\Deck\Controller;
use OCA\Deck\Db\Acl;
use OCA\Deck\Db\Board;
use OCA\Deck\Service\BoardService;
use OCA\Deck\Service\Importer\BoardImportService;
use OCA\Deck\Service\PermissionService;
use OCP\AppFramework\ApiController;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\DataResponse;
use OCP\IL10N;
use OCP\IRequest;
class BoardController extends ApiController {
@@ -24,8 +22,6 @@ class BoardController extends ApiController {
IRequest $request,
private BoardService $boardService,
private PermissionService $permissionService,
private BoardImportService $boardImportService,
private IL10N $l10n,
private $userId,
) {
parent::__construct($appName, $request);
@@ -167,62 +163,4 @@ class BoardController extends ApiController {
public function 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);
}
}
}

View File

@@ -185,7 +185,7 @@ class CardApiController extends ApiController {
* Reorder cards
*/
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);
}
}

View File

@@ -77,33 +77,18 @@ class AssignmentMapper extends DeckMapper implements IPermissionMapper {
}
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
// This avoids MySQL Error 1093 by separating the SELECT from the DELETE operation
$qb = $this->db->getQueryBuilder();
$cardIdQuery = $this->db->getQueryBuilder();
$cardIdQuery->select('a.card_id')
->from('deck_assigned_users', 'a')
->innerJoin('a', 'deck_cards', 'c', 'c.id = a.card_id')
->innerJoin('c', 'deck_stacks', 's', 's.id = c.stack_id')
->where($cardIdQuery->expr()->eq('a.participant', $cardIdQuery->createNamedParameter($participant, IQueryBuilder::PARAM_STR)))
->andWhere($cardIdQuery->expr()->eq('s.board_id', $cardIdQuery->createNamedParameter($boardId, IQueryBuilder::PARAM_INT)))
->andWhere($cardIdQuery->expr()->eq('a.type', $cardIdQuery->createNamedParameter($type, IQueryBuilder::PARAM_INT)));
$result = $cardIdQuery->executeQuery();
$cardIds = [];
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();
}
->where($cardIdQuery->expr()->eq('a.participant', $qb->createNamedParameter($participant, IQueryBuilder::PARAM_STR)))
->andWhere($cardIdQuery->expr()->eq('s.board_id', $qb->createNamedParameter($boardId, IQueryBuilder::PARAM_INT)))
->andWhere($cardIdQuery->expr()->eq('a.type', $qb->createNamedParameter($type, IQueryBuilder::PARAM_INT)));
$qb->delete('deck_assigned_users')
->where($qb->expr()->in('card_id', $qb->createFunction($cardIdQuery->getSQL()), IQueryBuilder::PARAM_INT_ARRAY));
$qb->executeStatement();
}

View File

@@ -131,11 +131,7 @@ class CardMapper extends QBMapper implements IPermissionMapper {
return $card;
}
/**
* @return Card[]
* @throws \OCP\DB\Exception
*/
public function findAll($stackId, ?int $limit = null, ?int $offset = null, int $since = -1) {
public function findAll($stackId, $limit = null, $offset = null, $since = -1) {
$qb = $this->db->getQueryBuilder();
$qb->select('*')
->from('deck_cards')
@@ -150,32 +146,6 @@ class CardMapper extends QBMapper implements IPermissionMapper {
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 {
$qb = $this->db->getQueryBuilder();
$qb->select('c.*')

View File

@@ -15,7 +15,6 @@ use Sabre\VObject\Component\VCalendar;
* @method int getDeletedAt()
* @method int getLastModified()
* @method int getOrder()
* @method Card[] getCards()
*/
class Stack extends RelationalEntity {
protected $title;

View File

@@ -77,10 +77,12 @@ class StackMapper extends DeckMapper implements IPermissionMapper {
/**
* @param numeric $boardId
* @param int|null $limit
* @param int|null $offset
* @return Stack[]
* @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->select('*')
->from($this->getTableName())

View File

@@ -27,7 +27,7 @@ class DefaultBoardMiddleware extends Middleware {
public function beforeController($controller, $methodName) {
try {
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) {
$this->logger->error('Could not create default board', ['exception' => $e]);

View File

@@ -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);
}
}
}

View File

@@ -77,7 +77,7 @@ class Notifier implements INotifier {
*/
public function prepare(INotification $notification, string $languageCode): INotification {
$l = $this->l10nFactory->get('deck', $languageCode);
if ($notification->getApp() !== 'deck') {
if ($notification->getApp() !== 'deck' || $notification->getObjectType() === 'activity_notification') {
throw new UnknownNotificationException();
}
$notification->setIcon($this->url->getAbsoluteURL($this->url->imagePath('deck', 'deck-dark.svg')));
@@ -136,7 +136,7 @@ class Notifier implements INotifier {
}
$notification->setParsedSubject(
$l->t('The card "%1$s" on "%2$s" has reached its due date.', $params)
$l->t('The card "%s" on "%s" has reached its due date.', $params)
);
$notification->setRichSubject(
$l->t('The card {deck-card} on {deck-board} has reached its due date.'),

View File

@@ -64,7 +64,6 @@ class BoardReferenceProvider implements IReferenceProvider {
$reference = new Reference($referenceText);
$reference->setTitle($this->l10n->t('Deck board') . ': ' . $board['title']);
$ownerDisplayName = $board['owner']['displayname'] ?? $board['owner']['uid'] ?? '???';
// TRANSLATORS Owned by {boardOwnerName}
$reference->setDescription($this->l10n->t('Owned by %1$s', [$ownerDisplayName]));
$imageUrl = $this->urlGenerator->getAbsoluteURL(
$this->urlGenerator->imagePath(Application::APP_ID, 'deck-dark.svg')

View File

@@ -90,7 +90,6 @@ class CommentReferenceProvider implements IReferenceProvider {
$reference->setTitle($comment['message']);
$boardOwnerDisplayName = $board['owner']['displayname'] ?? $board['owner']['uid'] ?? '???';
$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', [
$comment['actorDisplayName'],
$board['title'],

View File

@@ -762,8 +762,6 @@ class BoardService {
$fullCards = [];
foreach ($cards as $card) {
$fullCard = $this->cardMapper->find($card->getId());
$assignedUsers = $this->assignedUsersMapper->findAll($card->getId());
$fullCard->setAssignedUsers($assignedUsers);
array_push($fullCards, $fullCard);
}
$stack->setCards($fullCards);

View File

@@ -356,7 +356,7 @@ class CardService {
if ($resetDuedateNotification) {
$this->notificationHelper->markDuedateAsRead($card);
}
$this->changeHelper->cardChanged($card->getId());
$this->changeHelper->cardChanged($card->getId(), true);
$this->eventDispatcher->dispatchTyped(new CardUpdatedEvent($card, $changes->getBefore()));
@@ -418,12 +418,11 @@ class CardService {
if ($card->getArchived()) {
throw new StatusException('Operation not allowed. This card is archived.');
}
$changes = new ChangeSet($card);
$card->setTitle($title);
$this->changeHelper->cardChanged($card->getId(), false);
$update = $this->cardMapper->update($card);
$this->eventDispatcher->dispatchTyped(new CardUpdatedEvent($card, $changes->getBefore()));
$this->eventDispatcher->dispatchTyped(new CardUpdatedEvent($card));
return $update;
}
@@ -439,9 +438,10 @@ class CardService {
* @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException
* @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->permissionService->checkPermission($this->cardMapper, $id, Acl::PERMISSION_EDIT);
$this->permissionService->checkPermission($this->stackMapper, $stackId, Acl::PERMISSION_EDIT);
@@ -459,30 +459,30 @@ class CardService {
$changes->setAfter($card);
$this->activityManager->triggerUpdateEvents(ActivityManager::DECK_OBJECT_CARD, $changes, ActivityManager::SUBJECT_CARD_UPDATE);
$cardsToReorder = $this->cardMapper->findAll($stackId);
$cards = $this->cardMapper->findAll($stackId);
$result = [];
$i = 0;
foreach ($cardsToReorder as $cardToReorder) {
if ($cardToReorder->getArchived()) {
foreach ($cards as $card) {
if ($card->getArchived()) {
throw new StatusException('Operation not allowed. This card is archived.');
}
if ($cardToReorder->id === $id) {
$cardToReorder->setOrder($order);
$cardToReorder->setLastModified(time());
if ($card->id === $id) {
$card->setOrder($order);
$card->setLastModified(time());
}
if ($i === $order) {
$i++;
}
if ($cardToReorder->id !== $id) {
$cardToReorder->setOrder($i++);
if ($card->id !== $id) {
$card->setOrder($i++);
}
$this->cardMapper->update($cardToReorder);
$result[$cardToReorder->getOrder()] = $cardToReorder;
$this->cardMapper->update($card);
$result[$card->getOrder()] = $card;
}
$this->changeHelper->cardChanged($id, false);
$this->eventDispatcher->dispatchTyped(new CardUpdatedEvent($card, $changes->getBefore()));
$this->eventDispatcher->dispatchTyped(new CardUpdatedEvent($card));
return array_values($result);
}
@@ -499,19 +499,19 @@ class CardService {
public function archive($id) {
$this->cardServiceValidator->check(compact('id'));
$this->permissionService->checkPermission($this->cardMapper, $id, Acl::PERMISSION_EDIT);
if ($this->boardService->isArchived($this->cardMapper, $id)) {
throw new StatusException('Operation not allowed. This board is archived.');
}
$card = $this->cardMapper->find($id);
$changes = new ChangeSet($card);
$card->setArchived(true);
$newCard = $this->cardMapper->update($card);
$this->notificationHelper->markDuedateAsRead($card);
$this->activityManager->triggerEvent(ActivityManager::DECK_OBJECT_CARD, $newCard, ActivityManager::SUBJECT_CARD_UPDATE_ARCHIVE);
$this->changeHelper->cardChanged($id, false);
$this->eventDispatcher->dispatchTyped(new CardUpdatedEvent($card, $changes->getBefore()));
$this->eventDispatcher->dispatchTyped(new CardUpdatedEvent($card));
return $newCard;
}
@@ -534,13 +534,12 @@ class CardService {
throw new StatusException('Operation not allowed. This board is archived.');
}
$card = $this->cardMapper->find($id);
$changes = new ChangeSet($card);
$card->setArchived(false);
$newCard = $this->cardMapper->update($card);
$this->activityManager->triggerEvent(ActivityManager::DECK_OBJECT_CARD, $newCard, ActivityManager::SUBJECT_CARD_UPDATE_UNARCHIVE);
$this->changeHelper->cardChanged($id, false);
$this->eventDispatcher->dispatchTyped(new CardUpdatedEvent($card, $changes->getBefore()));
$this->eventDispatcher->dispatchTyped(new CardUpdatedEvent($card));
return $newCard;
}
@@ -560,14 +559,13 @@ class CardService {
throw new StatusException('Operation not allowed. This board is archived.');
}
$card = $this->cardMapper->find($id);
$changes = new ChangeSet($card);
$card->setDone(new \DateTime());
$newCard = $this->cardMapper->update($card);
$this->notificationHelper->markDuedateAsRead($card);
$this->activityManager->triggerEvent(ActivityManager::DECK_OBJECT_CARD, $newCard, ActivityManager::SUBJECT_CARD_UPDATE_DONE);
$this->changeHelper->cardChanged($id, false);
$this->eventDispatcher->dispatchTyped(new CardUpdatedEvent($card, $changes->getBefore()));
$this->eventDispatcher->dispatchTyped(new CardUpdatedEvent($card));
return $newCard;
}
@@ -587,13 +585,12 @@ class CardService {
throw new StatusException('Operation not allowed. This board is archived.');
}
$card = $this->cardMapper->find($id);
$changes = new ChangeSet($card);
$card->setDone(null);
$newCard = $this->cardMapper->update($card);
$this->activityManager->triggerEvent(ActivityManager::DECK_OBJECT_CARD, $newCard, ActivityManager::SUBJECT_CARD_UPDATE_UNDONE);
$this->changeHelper->cardChanged($id, false);
$this->eventDispatcher->dispatchTyped(new CardUpdatedEvent($card, $changes->getBefore()));
$this->eventDispatcher->dispatchTyped(new CardUpdatedEvent($card));
return $newCard;
}

View File

@@ -9,7 +9,6 @@ namespace OCA\Deck\Service;
use OCA\Deck\AppInfo\Application;
use OCA\Deck\BadRequestException;
use OCA\Deck\Db\Board;
use OCA\Deck\Db\BoardMapper;
use OCP\IConfig;
use OCP\IL10N;
@@ -22,8 +21,6 @@ class DefaultBoardService {
private $cardService;
private $config;
private $l10n;
private LabelService $labelService;
private AttachmentService $attachmentService;
public function __construct(
IL10N $l10n,
@@ -32,8 +29,6 @@ class DefaultBoardService {
StackService $stackService,
CardService $cardService,
IConfig $config,
LabelService $labelService,
AttachmentService $attachmentService,
) {
$this->boardService = $boardService;
$this->stackService = $stackService;
@@ -41,8 +36,6 @@ class DefaultBoardService {
$this->config = $config;
$this->boardMapper = $boardMapper;
$this->l10n = $l10n;
$this->labelService = $labelService;
$this->attachmentService = $attachmentService;
}
/**
@@ -66,13 +59,10 @@ class DefaultBoardService {
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 $color
* @return \OCP\AppFramework\Db\Entity
* @throws \OCA\Deck\NoPermissionException
* @throws \OCA\Deck\StatusException
@@ -81,71 +71,19 @@ class DefaultBoardService {
* @throws BadRequestException
*/
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();
$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) {
$additionLabels[] = $this->labelService->create(
$translatedLabelTitles[$labelData['title']] ?? $labelData['title'],
$labelData['color'],
$boardId
);
}
$defaultStacks[] = $this->stackService->create($this->l10n->t('To do'), $boardId, 1);
$defaultStacks[] = $this->stackService->create($this->l10n->t('Doing'), $boardId, 1);
$defaultStacks[] = $this->stackService->create($this->l10n->t('Done'), $boardId, 1);
$defaultLabels = array_merge($defaultBoard->getLabels() ?? [], $additionLabels);
foreach ($boardData['stacks'] as $stackData) {
$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');
}
}
}
$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);
$defaultCards[] = $this->cardService->create($this->l10n->t('Example Task 1'), $defaultStacks[2]->getId(), 'text', 0, $userId);
return $defaultBoard;
}

View File

@@ -162,15 +162,7 @@ class FilesAppService implements IAttachmentService, ICustomAttachmentService {
}
public function create(Attachment $attachment) {
if ($attachment->getData() === 'DEFAULT_SAMPLE_FILE' && !$this->request->getUploadedFile('file')) {
$file = [
'name' => 'Nextcloud sample image - add your image here!.jpg',
'tmp_name' => __DIR__ . '/../../img/sample-image.jpg',
];
} else {
$file = $this->getUploadedFile();
}
$file = $this->getUploadedFile();
$fileName = $file['name'];
// get shares for current card

View File

@@ -75,22 +75,19 @@ class StackService {
$this->stackServiceValidator = $stackServiceValidator;
}
/** @param Stack[] $stacks */
private function enrichStacksWithCards(array $stacks, $since = -1): void {
$cardsByStackId = $this->cardMapper->findAllForStacks(array_map(fn (Stack $stack) => $stack->getId(), $stacks), null, null, $since);
private function enrichStackWithCards($stack, $since = -1) {
$cards = $this->cardMapper->findAll($stack->getId(), null, null, $since);
foreach ($cardsByStackId as $stackId => $cards) {
if (!$cards) {
continue;
}
if (\count($cards) === 0) {
return;
}
$stack->setCards($this->cardService->enrichCards($cards));
}
foreach ($stacks as $stack) {
if ($stack->getId() === $stackId) {
$stack->setCards($this->cardService->enrichCards($cards));
break;
}
}
private function enrichStacksWithCards($stacks, $since = -1) {
foreach ($stacks as $stack) {
$this->enrichStackWithCards($stack, $since);
}
}
@@ -127,9 +124,9 @@ class StackService {
}
/**
* @param mixed $boardId
* @param $boardId
*
* @return Stack[]
* @return array
* @throws \OCA\Deck\NoPermissionException
* @throws BadRequestException
*/
@@ -250,7 +247,7 @@ class StackService {
);
$this->changeHelper->boardChanged($stack->getBoardId());
$this->eventDispatcher->dispatchTyped(new BoardUpdatedEvent($stack->getBoardId()));
$this->enrichStacksWithCards([$stack]);
$this->enrichStackWithCards($stack);
return $stack;
}

View File

@@ -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
}
]
}
]
}

583
package-lock.json generated
View File

@@ -1,21 +1,21 @@
{
"name": "deck",
"version": "2.0.0-dev.0",
"version": "1.15.3",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "deck",
"version": "2.0.0-dev.0",
"version": "1.15.3",
"license": "agpl",
"dependencies": {
"@babel/polyfill": "^7.12.1",
"@babel/runtime": "^7.27.1",
"@babel/runtime": "^7.26.0",
"@nextcloud/auth": "^2.4.0",
"@nextcloud/axios": "^2.5.1",
"@nextcloud/capabilities": "^1.2.0",
"@nextcloud/dialogs": "^6.3.1",
"@nextcloud/event-bus": "^3.3.2",
"@nextcloud/dialogs": "^6.0.1",
"@nextcloud/event-bus": "^3.3.1",
"@nextcloud/files": "^3.10.1",
"@nextcloud/initial-state": "^2.2.0",
"@nextcloud/l10n": "^3.4.0",
@@ -25,7 +25,7 @@
"@nextcloud/vue": "^8.31.0",
"blueimp-md5": "^2.19.0",
"chroma-js": "^3.1.2",
"dompurify": "^3.2.5",
"dompurify": "^3.2.3",
"lodash": "^4.17.21",
"markdown-it": "^14.1.0",
"markdown-it-link-attributes": "^4.0.1",
@@ -48,16 +48,16 @@
"devDependencies": {
"@nextcloud/babel-config": "^1.2.0",
"@nextcloud/browserslist-config": "^3.0.1",
"@nextcloud/cypress": "^1.0.0-beta.15",
"@nextcloud/eslint-config": "^8.4.2",
"@nextcloud/cypress": "^1.0.0-beta.12",
"@nextcloud/eslint-config": "^8.4.1",
"@nextcloud/stylelint-config": "^3.0.1",
"@nextcloud/webpack-vue-config": "^6.3.0",
"@relative-ci/agent": "^4.3.1",
"@nextcloud/webpack-vue-config": "^6.2.0",
"@relative-ci/agent": "^4.2.14",
"@vue/test-utils": "^2.4.6",
"@vue/vue2-jest": "^29.2.6",
"cypress": "^13.17.0",
"eslint-plugin-cypress": "^3.6.0",
"eslint-webpack-plugin": "^5.0.1",
"eslint-webpack-plugin": "^4.2.0",
"jest": "^29.7.0",
"jest-serializer-vue": "^3.1.0",
"stylelint-webpack-plugin": "^5.0.1",
@@ -105,15 +105,15 @@
}
},
"node_modules/@babel/code-frame": {
"version": "7.26.2",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
"integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
"integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-validator-identifier": "^7.25.9",
"@babel/helper-validator-identifier": "^7.27.1",
"js-tokens": "^4.0.0",
"picocolors": "^1.0.0"
"picocolors": "^1.1.1"
},
"engines": {
"node": ">=6.9.0"
@@ -536,18 +536,18 @@
}
},
"node_modules/@babel/helper-string-parser": {
"version": "7.25.9",
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
"integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
"integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-identifier": {
"version": "7.25.9",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
"integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
"integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@@ -579,26 +579,26 @@
}
},
"node_modules/@babel/helpers": {
"version": "7.27.0",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz",
"integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==",
"version": "7.27.6",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz",
"integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/template": "^7.27.0",
"@babel/types": "^7.27.0"
"@babel/template": "^7.27.2",
"@babel/types": "^7.27.6"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/parser": {
"version": "7.27.0",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz",
"integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==",
"version": "7.27.5",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz",
"integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==",
"license": "MIT",
"dependencies": {
"@babel/types": "^7.27.0"
"@babel/types": "^7.27.3"
},
"bin": {
"parser": "bin/babel-parser.js"
@@ -1919,24 +1919,24 @@
"peer": true
},
"node_modules/@babel/runtime": {
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz",
"integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==",
"version": "7.27.6",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz",
"integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/template": {
"version": "7.27.0",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz",
"integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==",
"version": "7.27.2",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz",
"integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.26.2",
"@babel/parser": "^7.27.0",
"@babel/types": "^7.27.0"
"@babel/code-frame": "^7.27.1",
"@babel/parser": "^7.27.2",
"@babel/types": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -1962,13 +1962,13 @@
}
},
"node_modules/@babel/types": {
"version": "7.27.0",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz",
"integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==",
"version": "7.27.6",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz",
"integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==",
"license": "MIT",
"dependencies": {
"@babel/helper-string-parser": "^7.25.9",
"@babel/helper-validator-identifier": "^7.25.9"
"@babel/helper-string-parser": "^7.27.1",
"@babel/helper-validator-identifier": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -2377,9 +2377,9 @@
"license": "MIT"
},
"node_modules/@grpc/grpc-js": {
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.13.2.tgz",
"integrity": "sha512-nnR5nmL6lxF8YBqb6gWvEgLdLh/Fn+kvAdX5hUOnt48sNSb0riz/93ASd2E5gvanPA41X6Yp25bIfGRp1SMb2g==",
"version": "1.13.4",
"resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.13.4.tgz",
"integrity": "sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -2391,9 +2391,9 @@
}
},
"node_modules/@grpc/proto-loader": {
"version": "0.7.13",
"resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz",
"integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==",
"version": "0.7.15",
"resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz",
"integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -4886,11 +4886,10 @@
"integrity": "sha512-qZ72SFTgUAZ5a7Tj6kf2SHLetiH5S6f8G5frB2SPQ3EyF02kxdyBFf4Tz4banE3xCgGnKgWLt//a6VuYHKYJTg=="
},
"node_modules/@types/eslint": {
"version": "9.6.1",
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz",
"integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==",
"version": "8.56.10",
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz",
"integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/estree": "*",
"@types/json-schema": "*"
@@ -4965,10 +4964,11 @@
"peer": true
},
"node_modules/@types/http-proxy": {
"version": "1.17.15",
"resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz",
"integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==",
"version": "1.17.16",
"resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz",
"integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@types/node": "*"
@@ -5107,9 +5107,9 @@
"peer": true
},
"node_modules/@types/semver": {
"version": "7.5.8",
"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz",
"integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==",
"version": "7.7.0",
"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.0.tgz",
"integrity": "sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==",
"license": "MIT"
},
"node_modules/@types/send": {
@@ -5402,10 +5402,11 @@
}
},
"node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"balanced-match": "^1.0.0"
@@ -6408,15 +6409,11 @@
}
},
"node_modules/available-typed-arrays": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
"integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
"integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"possible-typed-array-names": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
},
@@ -6440,9 +6437,9 @@
"dev": true
},
"node_modules/axios": {
"version": "1.8.2",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.8.2.tgz",
"integrity": "sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==",
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz",
"integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==",
"license": "MIT",
"dependencies": {
"follow-redirects": "^1.15.6",
@@ -6899,7 +6896,9 @@
"peer": true
},
"node_modules/brace-expansion": {
"version": "1.1.11",
"version": "1.1.12",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
"integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -7262,48 +7261,16 @@
}
},
"node_modules/call-bind": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
"integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
"integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.0",
"es-define-property": "^1.0.0",
"get-intrinsic": "^1.2.4",
"set-function-length": "^1.2.2"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/call-bind-apply-helpers": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
"integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
"function-bind": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/call-bound": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
"integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"call-bind-apply-helpers": "^1.0.2",
"get-intrinsic": "^1.3.0"
"function-bind": "^1.1.2",
"get-intrinsic": "^1.2.4",
"set-function-length": "^1.2.1"
},
"engines": {
"node": ">= 0.4"
@@ -8873,9 +8840,9 @@
}
},
"node_modules/dockerode": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/dockerode/-/dockerode-4.0.5.tgz",
"integrity": "sha512-ZPmKSr1k1571Mrh7oIBS/j0AqAccoecY2yH420ni5j1KyNMgnoTh4Nu4FWunh0HZIJmRSmSysJjBIpa/zyWUEA==",
"version": "4.0.7",
"resolved": "https://registry.npmjs.org/dockerode/-/dockerode-4.0.7.tgz",
"integrity": "sha512-R+rgrSRTRdU5mH14PZTCPZtW/zw3HDWNTS/1ZAQpL/5Upe/ye5K9WQkIysu4wBoiMwKynsz0a8qWuGsHgEvSAA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -9011,21 +8978,6 @@
"url": "https://dotenvx.com"
}
},
"node_modules/dunder-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
"integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.1",
"es-errors": "^1.3.0",
"gopd": "^1.2.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/eastasianwidth": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
@@ -9084,10 +9036,11 @@
}
},
"node_modules/editorconfig/node_modules/brace-expansion": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
}
@@ -9360,11 +9313,13 @@
}
},
"node_modules/es-define-property": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
"integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
"integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"get-intrinsic": "^1.2.4"
},
"engines": {
"node": ">= 0.4"
}
@@ -9384,19 +9339,6 @@
"integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==",
"peer": true
},
"node_modules/es-object-atoms": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
"integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
"dev": true,
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/es-set-tostringtag": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz",
@@ -9927,20 +9869,19 @@
}
},
"node_modules/eslint-webpack-plugin": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-5.0.1.tgz",
"integrity": "sha512-Ur100Vi+z0uP7j4Z8Ccah0pXmNHhl3f7P2hCYZj3mZCOSc33G5c1R/vZ4KCapwWikPgRyD4dkangx6JW3KaVFQ==",
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-4.2.0.tgz",
"integrity": "sha512-rsfpFQ01AWQbqtjgPRr2usVRxhWDuG0YDYcG8DJOteD3EFnpeuYuOwk0PQiN7PRBTqS6ElNdtPZPggj8If9WnA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/eslint": "^9.6.1",
"@types/eslint": "^8.56.10",
"jest-worker": "^29.7.0",
"micromatch": "^4.0.8",
"micromatch": "^4.0.5",
"normalize-path": "^3.0.0",
"schema-utils": "^4.3.0"
"schema-utils": "^4.2.0"
},
"engines": {
"node": ">= 18.12.0"
"node": ">= 14.15.0"
},
"funding": {
"type": "opencollective",
@@ -9952,16 +9893,15 @@
}
},
"node_modules/eslint-webpack-plugin/node_modules/ajv": {
"version": "8.17.1",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
"integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
"version": "8.12.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
"integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
"dev": true,
"license": "MIT",
"dependencies": {
"fast-deep-equal": "^3.1.3",
"fast-uri": "^3.0.1",
"fast-deep-equal": "^3.1.1",
"json-schema-traverse": "^1.0.0",
"require-from-string": "^2.0.2"
"require-from-string": "^2.0.2",
"uri-js": "^4.2.2"
},
"funding": {
"type": "github",
@@ -9973,7 +9913,6 @@
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
"integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
"dev": true,
"license": "MIT",
"dependencies": {
"fast-deep-equal": "^3.1.3"
},
@@ -10009,15 +9948,13 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
"dev": true,
"license": "MIT"
"dev": true
},
"node_modules/eslint-webpack-plugin/node_modules/schema-utils": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz",
"integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==",
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz",
"integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/json-schema": "^7.0.9",
"ajv": "^8.9.0",
@@ -10025,7 +9962,7 @@
"ajv-keywords": "^5.1.0"
},
"engines": {
"node": ">= 10.13.0"
"node": ">= 12.13.0"
},
"funding": {
"type": "opencollective",
@@ -10366,6 +10303,7 @@
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
"integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
"dev": true,
"license": "MIT",
"peer": true
},
"node_modules/events": {
@@ -10617,7 +10555,8 @@
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.2.tgz",
"integrity": "sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row==",
"dev": true
"dev": true,
"peer": true
},
"node_modules/fast-xml-parser": {
"version": "4.5.3",
@@ -10872,20 +10811,13 @@
}
},
"node_modules/for-each": {
"version": "0.3.5",
"resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
"integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
"version": "0.3.3",
"resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
"integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"is-callable": "^1.2.7"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
"is-callable": "^1.1.3"
}
},
"node_modules/foreground-child": {
@@ -11086,22 +11018,16 @@
}
},
"node_modules/get-intrinsic": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
"integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
"integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.2",
"es-define-property": "^1.0.1",
"es-errors": "^1.3.0",
"es-object-atoms": "^1.1.1",
"function-bind": "^1.1.2",
"get-proto": "^1.0.1",
"gopd": "^1.2.0",
"has-symbols": "^1.1.0",
"hasown": "^2.0.2",
"math-intrinsics": "^1.1.0"
"has-proto": "^1.0.1",
"has-symbols": "^1.0.3",
"hasown": "^2.0.0"
},
"engines": {
"node": ">= 0.4"
@@ -11119,20 +11045,6 @@
"node": ">=8.0.0"
}
},
"node_modules/get-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
"integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
"dev": true,
"license": "MIT",
"dependencies": {
"dunder-proto": "^1.0.1",
"es-object-atoms": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/get-stream": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
@@ -11343,13 +11255,12 @@
"peer": true
},
"node_modules/gopd": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
"integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
"integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
"dependencies": {
"get-intrinsic": "^1.1.3"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -11420,7 +11331,6 @@
"resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
"integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
"dev": true,
"peer": true,
"engines": {
"node": ">= 0.4"
},
@@ -11429,11 +11339,10 @@
}
},
"node_modules/has-symbols": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
"integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
@@ -11442,14 +11351,13 @@
}
},
"node_modules/has-tostringtag": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
"integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
"integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"has-symbols": "^1.0.3"
"has-symbols": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
@@ -11725,6 +11633,7 @@
"resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
"integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"eventemitter3": "^4.0.0",
@@ -11766,6 +11675,7 @@
"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
"integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
"dev": true,
"license": "MIT",
"peer": true,
"engines": {
"node": ">=10"
@@ -12459,14 +12369,13 @@
}
},
"node_modules/is-typed-array": {
"version": "1.1.15",
"resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
"integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
"version": "1.1.12",
"resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz",
"integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"which-typed-array": "^1.1.16"
"which-typed-array": "^1.1.11"
},
"engines": {
"node": ">= 0.4"
@@ -14387,10 +14296,11 @@
}
},
"node_modules/js-beautify/node_modules/brace-expansion": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
}
@@ -14950,9 +14860,9 @@
}
},
"node_modules/long": {
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/long/-/long-5.3.1.tgz",
"integrity": "sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng==",
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz",
"integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==",
"dev": true,
"license": "Apache-2.0"
},
@@ -15057,16 +14967,6 @@
"version": "1.2.6",
"license": "ISC"
},
"node_modules/math-intrinsics": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
"integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
},
"node_modules/mathml-tag-names": {
"version": "2.1.3",
"dev": true,
@@ -16687,83 +16587,22 @@
}
},
"node_modules/pbkdf2": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.3.tgz",
"integrity": "sha512-wfRLBZ0feWRhCIkoMB6ete7czJcnNnqRpcoWQBLqatqXXmelSRqfdDK4F3u9T2s2cXas/hQJcryI/4lAL+XTlA==",
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz",
"integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"create-hash": "~1.1.3",
"create-hmac": "^1.1.7",
"ripemd160": "=2.0.1",
"safe-buffer": "^5.2.1",
"sha.js": "^2.4.11",
"to-buffer": "^1.2.0"
"create-hash": "^1.1.2",
"create-hmac": "^1.1.4",
"ripemd160": "^2.0.1",
"safe-buffer": "^5.0.1",
"sha.js": "^2.4.8"
},
"engines": {
"node": ">=0.12"
}
},
"node_modules/pbkdf2/node_modules/create-hash": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz",
"integrity": "sha512-snRpch/kwQhcdlnZKYanNF1m0RDlrCdSKQaH87w1FCFPVPNCQ/Il9QJKAX2jVBZddRdaHBMC+zXa9Gw9tmkNUA==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"cipher-base": "^1.0.1",
"inherits": "^2.0.1",
"ripemd160": "^2.0.0",
"sha.js": "^2.4.0"
}
},
"node_modules/pbkdf2/node_modules/hash-base": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz",
"integrity": "sha512-0TROgQ1/SxE6KmxWSvXHvRj90/Xo1JvZShofnYF+f6ZsGtR4eES7WfrQzPalmyagfKZCXpVnitiRebZulWsbiw==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"inherits": "^2.0.1"
}
},
"node_modules/pbkdf2/node_modules/ripemd160": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz",
"integrity": "sha512-J7f4wutN8mdbV08MJnXibYpCOPHR+yzy+iQ/AsjMv2j8cLavQ8VGagDFUwwTAdF8FmRKVeNpbTTEwNHCW1g94w==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"hash-base": "^2.0.0",
"inherits": "^2.0.1"
}
},
"node_modules/pbkdf2/node_modules/safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT",
"peer": true
},
"node_modules/pend": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
@@ -16879,17 +16718,6 @@
"node": ">=6"
}
},
"node_modules/possible-typed-array-names": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz",
"integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==",
"dev": true,
"license": "MIT",
"peer": true,
"engines": {
"node": ">= 0.4"
}
},
"node_modules/postcss": {
"version": "8.4.38",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz",
@@ -17206,9 +17034,9 @@
"dev": true
},
"node_modules/protobufjs": {
"version": "7.4.0",
"resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz",
"integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==",
"version": "7.5.3",
"resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.3.tgz",
"integrity": "sha512-sildjKwVqOI2kmFDiXQ6aEB0fjYTafpEvIBs8tOR8qI4spuL9OPROLVu2qZqi/xgCfsHIwVqlaF8JBjWFHnKbw==",
"dev": true,
"hasInstallScript": true,
"license": "BSD-3-Clause",
@@ -19900,52 +19728,6 @@
"integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
"dev": true
},
"node_modules/to-buffer": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.1.tgz",
"integrity": "sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"isarray": "^2.0.5",
"safe-buffer": "^5.2.1",
"typed-array-buffer": "^1.0.3"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/to-buffer/node_modules/isarray": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
"integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
"dev": true,
"license": "MIT",
"peer": true
},
"node_modules/to-buffer/node_modules/safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT",
"peer": true
},
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -20268,16 +20050,15 @@
}
},
"node_modules/typed-array-buffer": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
"integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==",
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz",
"integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"call-bound": "^1.0.3",
"es-errors": "^1.3.0",
"is-typed-array": "^1.1.14"
"call-bind": "^1.0.2",
"get-intrinsic": "^1.2.1",
"is-typed-array": "^1.1.10"
},
"engines": {
"node": ">= 0.4"
@@ -21174,17 +20955,18 @@
}
},
"node_modules/webdav/node_modules/brace-expansion": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
}
},
"node_modules/webdav/node_modules/entities": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz",
"integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==",
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-6.0.0.tgz",
"integrity": "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==",
"license": "BSD-2-Clause",
"engines": {
"node": ">=0.12"
@@ -21678,20 +21460,17 @@
}
},
"node_modules/which-typed-array": {
"version": "1.1.19",
"resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz",
"integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==",
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz",
"integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"available-typed-arrays": "^1.0.7",
"call-bind": "^1.0.8",
"call-bound": "^1.0.4",
"for-each": "^0.3.5",
"get-proto": "^1.0.1",
"gopd": "^1.2.0",
"has-tostringtag": "^1.0.2"
"available-typed-arrays": "^1.0.5",
"call-bind": "^1.0.2",
"for-each": "^0.3.3",
"gopd": "^1.0.1",
"has-tostringtag": "^1.0.0"
},
"engines": {
"node": ">= 0.4"

View File

@@ -1,7 +1,7 @@
{
"name": "deck",
"description": "",
"version": "2.0.0-dev.0",
"version": "1.15.3",
"authors": [
{
"name": "Julius Härtl",
@@ -31,12 +31,12 @@
},
"dependencies": {
"@babel/polyfill": "^7.12.1",
"@babel/runtime": "^7.27.1",
"@babel/runtime": "^7.26.0",
"@nextcloud/auth": "^2.4.0",
"@nextcloud/axios": "^2.5.1",
"@nextcloud/capabilities": "^1.2.0",
"@nextcloud/dialogs": "^6.3.1",
"@nextcloud/event-bus": "^3.3.2",
"@nextcloud/dialogs": "^6.0.1",
"@nextcloud/event-bus": "^3.3.1",
"@nextcloud/files": "^3.10.1",
"@nextcloud/initial-state": "^2.2.0",
"@nextcloud/l10n": "^3.4.0",
@@ -46,7 +46,7 @@
"@nextcloud/vue": "^8.31.0",
"blueimp-md5": "^2.19.0",
"chroma-js": "^3.1.2",
"dompurify": "^3.2.5",
"dompurify": "^3.2.3",
"lodash": "^4.17.21",
"markdown-it": "^14.1.0",
"markdown-it-link-attributes": "^4.0.1",
@@ -76,16 +76,16 @@
"devDependencies": {
"@nextcloud/babel-config": "^1.2.0",
"@nextcloud/browserslist-config": "^3.0.1",
"@nextcloud/cypress": "^1.0.0-beta.15",
"@nextcloud/eslint-config": "^8.4.2",
"@nextcloud/cypress": "^1.0.0-beta.12",
"@nextcloud/eslint-config": "^8.4.1",
"@nextcloud/stylelint-config": "^3.0.1",
"@nextcloud/webpack-vue-config": "^6.3.0",
"@relative-ci/agent": "^4.3.1",
"@nextcloud/webpack-vue-config": "^6.2.0",
"@relative-ci/agent": "^4.2.14",
"@vue/test-utils": "^2.4.6",
"@vue/vue2-jest": "^29.2.6",
"cypress": "^13.17.0",
"eslint-plugin-cypress": "^3.6.0",
"eslint-webpack-plugin": "^5.0.1",
"eslint-webpack-plugin": "^4.2.0",
"jest": "^29.7.0",
"jest-serializer-vue": "^3.1.0",
"stylelint-webpack-plugin": "^5.0.1",

View File

@@ -107,6 +107,10 @@ export default {
this.$store.dispatch('loadSharees')
},
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
emit('toggle-navigation', { open: !this.isMobile && this.navShown, _initial: true })
this.$nextTick(() => {

View File

@@ -263,10 +263,10 @@ import { mapState, mapGetters } from 'vuex'
import { subscribe, unsubscribe } from '@nextcloud/event-bus'
import { NcActions, NcActionButton, NcAvatar, NcButton, NcPopover, NcModal } from '@nextcloud/vue'
import labelStyle from '../mixins/labelStyle.js'
import ArchiveIcon from 'vue-material-design-icons/ArchiveOutline.vue'
import ImageIcon from 'vue-material-design-icons/ImageMultipleOutline.vue'
import FilterIcon from 'vue-material-design-icons/FilterOutline.vue'
import FilterOffIcon from 'vue-material-design-icons/FilterOffOutline.vue'
import ArchiveIcon from 'vue-material-design-icons/Archive.vue'
import ImageIcon from 'vue-material-design-icons/ImageMultiple.vue'
import FilterIcon from 'vue-material-design-icons/Filter.vue'
import FilterOffIcon from 'vue-material-design-icons/FilterOff.vue'
import TableColumnPlusAfter from 'vue-material-design-icons/TableColumnPlusAfter.vue'
import ArrowCollapseVerticalIcon from 'vue-material-design-icons/ArrowCollapseVertical.vue'
import ArrowExpandVerticalIcon from 'vue-material-design-icons/ArrowExpandVertical.vue'

View File

@@ -276,15 +276,18 @@ export default {
position: relative;
width: 100%;
height: 100%;
max-height: calc(100vh - 50px);
display: flex;
flex-direction: column;
}
.board {
padding-left: $board-spacing;
position: relative;
max-height: calc(100% - var(--default-clickable-area));
overflow: hidden;
overflow-x: auto;
flex-grow: 1;
scrollbar-gutter: stable;
}
/**
@@ -294,15 +297,11 @@ export default {
.smooth-dnd-container.horizontal {
display: flex;
align-items: stretch;
gap: $board-gap;
padding: 0 $board-gap;
height: 100%;
&:deep(.stack-draggable-wrapper.smooth-dnd-draggable-wrapper) {
display: flex;
height: auto;
flex: 0 1 $card-max-width;
min-width: $card-min-width;
.stack {
display: flex;
@@ -310,13 +309,16 @@ export default {
position: relative;
.smooth-dnd-container.vertical {
$margin-x: calc($stack-gap * -1);
flex-grow: 1;
display: flex;
flex-direction: column;
gap: $stack-gap;
padding: $stack-gap;
margin: 0 $margin-x;
// Margin left instead of padidng to avoid jumps on dropping a card
margin-left: $stack-spacing;
padding-right: $stack-spacing;
overflow-x: hidden;
overflow-y: auto;
padding-top: 15px;
margin-top: -10px;
scrollbar-gutter: stable;
}

View File

@@ -56,9 +56,9 @@ import DeletedTabSidebar from './DeletedTabSidebar.vue'
import TimelineTabSidebar from './TimelineTabSidebar.vue'
import { NcAppSidebar, NcAppSidebarTab } from '@nextcloud/vue'
import ActivityIcon from 'vue-material-design-icons/LightningBolt.vue'
import SharingIcon from 'vue-material-design-icons/ShareVariantOutline.vue'
import TagsIcon from 'vue-material-design-icons/TagMultipleOutline.vue'
import TrashIcon from 'vue-material-design-icons/TrashCanOutline.vue'
import SharingIcon from 'vue-material-design-icons/ShareVariant.vue'
import TagsIcon from 'vue-material-design-icons/TagMultiple.vue'
import TrashIcon from 'vue-material-design-icons/Delete.vue'
const capabilities = window.OC.getCapabilities()
export default {

View File

@@ -14,10 +14,10 @@
{{ stack.title }}
</h3>
<h3 v-else-if="!editing"
title="stack.title"
dir="auto"
tabindex="0"
:aria-label="stack.title"
:title="stack.title"
class="stack__title"
@click="startEditing(stack)"
@keydown.enter="startEditing(stack)">
@@ -108,7 +108,7 @@
</Container>
<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 }"
@submit.prevent.stop="clickAddCard()">
<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 { mapGetters, mapState } from 'vuex'
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 { NcActions, NcActionButton, NcModal } from '@nextcloud/vue'
import { showError, showUndo } from '@nextcloud/dialogs'
@@ -365,31 +365,37 @@ export default {
@import './../../css/variables';
.stack {
width: 100%;
width: $stack-width + $stack-spacing * 3;
}
.stack__header {
display: flex;
position: sticky;
top: 0;
height: var(--default-clickable-area);
z-index: 100;
padding-left: $card-spacing;
padding-right: $card-spacing;
margin: 6px;
margin-top: 0;
cursor: grab;
background-color: var(--color-main-background);
// Smooth fade out of the cards at the top
&:before {
content: '';
content: ' ';
display: block;
position: absolute;
width: 100%;
height: $stack-gap;
bottom: 0;
width: calc(100% - 16px);
height: 20px;
top: 30px;
left: 0px;
z-index: 99;
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 {
flex: 1 1 auto;
min-width: 0;
flex-grow: 1;
display: flex;
align-items: center;
cursor: inherit;
margin: 0;
@@ -414,8 +418,9 @@ export default {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: calc($stack-width - 60px);
border-radius: 3px;
padding: $card-padding;
padding: 4px 4px;
font-size: var(--default-font-size);
&:focus-visible {
@@ -425,6 +430,7 @@ export default {
}
form {
margin: -4px;
input {
font-weight: bold;
padding: 0 6px;
@@ -447,25 +453,14 @@ export default {
flex-shrink: 0;
z-index: 100;
display: flex;
padding-bottom: $stack-gap;
margin-bottom: 5px;
padding-top: var(--default-grid-baseline);
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 {
display: flex;
margin-left: $stack-spacing;
margin-right: $stack-spacing;
width: 100%;
border: 2px solid var(--color-border-maxcontrast);
border-radius: var(--border-radius-large);
@@ -486,6 +481,7 @@ export default {
input {
border: none;
margin: 0;
padding: 4px;
}
}

View File

@@ -44,7 +44,7 @@
<script>
import { defineComponent } from '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({
name: 'AssignmentSelector',

View File

@@ -12,7 +12,6 @@
:subtitle="subtitleTooltip"
:name-editable.sync="isEditingTitle"
@update:name="(value) => titleEditing = value"
@update:active="(value) => activeTabId = value"
@dismiss-editing="titleEditing = currentCard.title"
@submit-name="handleSubmitTitle"
@opened="focusHeader"
@@ -38,8 +37,7 @@
:name="t('deck', 'Details')">
<CardSidebarTabDetails :card="currentCard" />
<template #icon>
<HomeIcon v-if="activeTabId === 'details'" :size="20" />
<HomeOutlineIcon v-else :size="20" />
<HomeIcon :size="20" />
</template>
</NcAppSidebarTab>
@@ -56,8 +54,7 @@
:order="2"
:name="t('deck', 'Comments')">
<template #icon>
<CommentIcon v-if="activeTabId === 'comments'" :size="20" />
<CommentOutlineIcon v-else :size="20" />
<CommentIcon :size="20" />
</template>
<CardSidebarTabComments :card="currentCard" :tab-query="tabQuery" />
</NcAppSidebarTab>
@@ -87,9 +84,7 @@ import relativeDate from '../../mixins/relativeDate.js'
import moment from '@nextcloud/moment'
import AttachmentIcon from 'vue-material-design-icons/Paperclip.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 CommentOutlineIcon from 'vue-material-design-icons/CommentOutline.vue'
import ActivityIcon from 'vue-material-design-icons/LightningBolt.vue'
import { showError, showWarning } from '@nextcloud/dialogs'
@@ -112,9 +107,7 @@ export default {
ActivityIcon,
AttachmentIcon,
CommentIcon,
CommentOutlineIcon,
HomeIcon,
HomeOutlineIcon,
CardMenuEntries,
},
mixins: [relativeDate],
@@ -140,7 +133,6 @@ export default {
titleEditing: '',
hasActivity: capabilities && capabilities.activity,
locale: getLocale(),
activeTabId: this.tabId || 'details',
}
},
computed: {

View File

@@ -82,7 +82,7 @@ import CommentForm from './CommentForm.vue'
import { getCurrentUser } from '@nextcloud/auth'
import md5 from 'blueimp-md5'
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'
const AtMention = {

View File

@@ -99,10 +99,10 @@ import {
import readableDate from '../../mixins/readableDate.js'
import { getDayNamesMin, getFirstDay, getMonthNamesShort } from '@nextcloud/l10n'
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 Calendar from 'vue-material-design-icons/CalendarOutline.vue'
import CalendarCheck from 'vue-material-design-icons/CalendarCheckOutline.vue'
import Calendar from 'vue-material-design-icons/Calendar.vue'
import CalendarCheck from 'vue-material-design-icons/CalendarCheck.vue'
import CheckIcon from 'vue-material-design-icons/Check.vue'
import ClearIcon from 'vue-material-design-icons/Close.vue'
import CardDetailEntry from './CardDetailEntry.vue'

View File

@@ -44,7 +44,7 @@
<script>
import { NcSelect } from '@nextcloud/vue'
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 {
name: 'TagSelector',

View File

@@ -70,7 +70,7 @@
<script>
import { NcAvatar, NcPopover } from '@nextcloud/vue'
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 {
name: 'AvatarList',

View File

@@ -49,8 +49,8 @@ import CardId from './badges/CardId.vue'
import TextIcon from 'vue-material-design-icons/Text.vue'
import AttachmentIcon from 'vue-material-design-icons/Paperclip.vue'
import CheckmarkIcon from 'vue-material-design-icons/CheckboxMarked.vue'
import CommentIcon from 'vue-material-design-icons/CommentOutline.vue'
import CommentUnreadIcon from 'vue-material-design-icons/CommentAccountOutline.vue'
import CommentIcon from 'vue-material-design-icons/Comment.vue'
import CommentUnreadIcon from 'vue-material-design-icons/CommentAccount.vue'
import DueDate from './badges/DueDate.vue'
export default {
@@ -101,8 +101,6 @@ export default {
</script>
<style lang="scss" scoped>
@import './../../css/variables';
.badges {
display: flex;
width: 100%;
@@ -113,7 +111,6 @@ export default {
.icon-badge {
color: var(--color-text-maxcontrast);
display: flex;
align-items: center;
margin-right: 2px;
span,
@@ -128,7 +125,42 @@ export default {
flex-direction: row;
flex-wrap: wrap;
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 {

View File

@@ -4,10 +4,13 @@
-->
<template>
<div v-if="cardId && ( attachments.length > 0 )" class="card-cover">
<div v-for="attachment in attachments"
<div v-if="referencePreview" class="card-cover">
<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"
class="image-wrapper"
:class="['image-wrapper', { 'rounded-left': index === 0 }, { 'rounded-right': index === attachments.length - 1 }]"
:style="{ backgroundImage: `url(${attachmentPreview(attachment)})` }" />
</div>
</template>
@@ -74,7 +77,9 @@ export default {
.card-cover {
height: 90px;
display: flex;
margin: $card-image-margin $card-image-margin 0;
margin-top: -4px;
margin-left: -4px;
margin-right: -4px;
.image-wrapper {
flex: 1;
@@ -82,6 +87,12 @@ export default {
background-size: cover;
background-repeat: no-repeat;
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>

View File

@@ -6,7 +6,7 @@
<template>
<AttachmentDragAndDrop v-if="card" :card-id="card.id" class="drop-upload--card">
<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"
:tabindex="0"
class="card"
@@ -331,17 +331,16 @@ export default {
border-radius: var(--border-radius-large);
font-size: 100%;
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);
width: 100%;
display: flex;
flex-direction: column;
gap: $card-gap;
overflow: hidden;
&:deep(*) {
cursor: pointer;
}
&:deep(*:not(.dragDisabled)) {
cursor: pointer;
}
&.current-card {
border: 2px solid var(--color-primary-element);
@@ -360,10 +359,12 @@ export default {
h4 {
font-weight: normal;
margin: 0;
padding: var(--default-grid-baseline);
flex-grow: 1;
font-size: 100%;
overflow: hidden;
word-wrap: break-word;
padding-left: 4px;
align-self: center;
:deep(a) {
@@ -373,6 +374,9 @@ export default {
&.editable {
span {
cursor: text;
padding-right: 8px;
padding-top: 3px;
padding-bottom: 3px;
&:focus, &:focus-visible {
outline: none;
@@ -381,7 +385,6 @@ export default {
&:focus-within {
outline: 2px solid var(--color-border-dark);
outline-offset: 4px;
border-radius: 3px;
}
}
@@ -424,6 +427,8 @@ export default {
.card-labels {
display: flex;
align-items: end;
padding-left: var(--default-grid-baseline);
padding-top: var(--default-grid-baseline);
.labels {
flex-wrap: wrap;
@@ -439,7 +444,7 @@ export default {
.card-related {
display: flex;
padding: 4px;
padding: 12px;
padding-bottom: 0px;
color: var(--color-text-maxcontrast);
@@ -464,8 +469,8 @@ export default {
height: 32px;
width: 32px;
}
&.no-labels {
padding-bottom: var(--default-grid-baseline);
&.has-labels {
padding-bottom: $card-padding;
}
.labels {
height: 6px;

View File

@@ -63,9 +63,9 @@
<script>
import { NcActionButton } from '@nextcloud/vue'
import { mapGetters, mapState } from 'vuex'
import ArchiveIcon from 'vue-material-design-icons/ArchiveOutline.vue'
import CardBulletedIcon from 'vue-material-design-icons/CardBulletedOutline.vue'
import PencilIcon from 'vue-material-design-icons/PencilOutline.vue'
import ArchiveIcon from 'vue-material-design-icons/Archive.vue'
import CardBulletedIcon from 'vue-material-design-icons/CardBulleted.vue'
import PencilIcon from 'vue-material-design-icons/Pencil.vue'
import { generateUrl } from '@nextcloud/router'
import { getCurrentUser } from '@nextcloud/auth'
import { showUndo } from '@nextcloud/dialogs'

View File

@@ -95,16 +95,16 @@ export default {
z-index: 2;
[data-due-state='Overdue'] & {
color: var(--color-element-error, var(--color-error-text));
background-color: rgba(var(--color-error-rgb), .5);
color: var(--color-error-text);
background-color: rgba(var(--color-error-rgb), .1);
}
[data-due-state='Now'] & {
color: var(--color-element-warning, var(--color-warning-text));
background-color: rgba(var(--color-warning-rgb), .5);
color: var(--color-warning-text);
background-color: rgba(var(--color-warning-rgb), .1);
}
[data-due-state='Done'] & {
color: var(--color-element-success, var(--color-success-text));
background-color: rgba(var(--color-success-rgb), .5);
color: var(--color-success-text);
background-color: rgba(var(--color-success-rgb), .1);
}
.due--label {

View File

@@ -10,8 +10,7 @@
:exact="true"
to="/">
<template #icon>
<CalendarIcon v-if="$route.path === '/'" :size="20" />
<CalendarOutlineIcon v-else :size="20" />
<CalendarIcon :size="20" />
</template>
</NcAppNavigationItem>
<AppNavigationBoardCategory id="deck-navigation-all"
@@ -30,8 +29,7 @@
:text="t('deck', 'Archived boards')"
:boards="archivedBoards">
<template #icon>
<ArchiveIcon v-if="$route.path === '/board/archived'" :size="20" decorative />
<ArchiveOutlineIcon v-else :size="20" decorative />
<ArchiveIcon :size="20" decorative />
</template>
</AppNavigationBoardCategory>
<AppNavigationBoardCategory id="deck-navigation-shared"
@@ -44,7 +42,6 @@
</template>
</AppNavigationBoardCategory>
<AppNavigationAddBoard v-if="canCreate" />
<AppNavigationImportBoard v-if="canCreate" />
</template>
<template #footer>
<NcAppNavigationSettings :name="t('deck', 'Deck settings')">
@@ -114,14 +111,11 @@ import { loadState } from '@nextcloud/initial-state'
import { generateOcsUrl } from '@nextcloud/router'
import { getCurrentUser } from '@nextcloud/auth'
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 CalendarOutlineIcon from 'vue-material-design-icons/CalendarOutline.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 { subscribe } from '@nextcloud/event-bus'
import AppNavigationImportBoard from './AppNavigationImportBoard.vue'
const canCreateState = loadState('deck', 'canCreate')
@@ -133,13 +127,10 @@ export default {
NcButton,
AppNavigationAddBoard,
AppNavigationBoardCategory,
AppNavigationImportBoard,
NcSelect,
NcAppNavigationItem,
ArchiveIcon,
ArchiveOutlineIcon,
CalendarIcon,
CalendarOutlineIcon,
DeckIcon,
ShareVariantIcon,
HelpModal,

View File

@@ -15,10 +15,6 @@
<template #icon>
<NcAppNavigationIconBullet :color="board.color" />
<BoardCloneModal v-if="cloneModalOpen" :board-title="board.title" @close="onCloseCloneModal" />
<BoardExportModal v-if="exportModalOpen"
:board-title="board.title"
@export="onExportBoard"
@close="onCloseExportBoard" />
</template>
<template #counter>
@@ -154,9 +150,9 @@
<script>
import { NcAppNavigationIconBullet, NcAppNavigationItem, NcColorPicker, NcButton, NcTextField, NcActionButton } from '@nextcloud/vue'
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 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 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 BoardCloneModal from './BoardCloneModal.vue'
import BoardExportModal from './BoardExportModal.vue'
import { showLoading } from '@nextcloud/dialogs'
const canCreateState = loadState('deck', 'canCreate')
@@ -185,7 +179,6 @@ export default {
CloseIcon,
CheckIcon,
BoardCloneModal,
BoardExportModal,
},
directives: {
ClickOutside,
@@ -214,7 +207,6 @@ export default {
updateDueSetting: null,
canCreate: canCreateState,
cloneModalOpen: false,
exportModalOpen: false,
}
},
computed: {
@@ -354,16 +346,7 @@ export default {
this.updateDueSetting = null
},
actionExport() {
this.exportModalOpen = true
},
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
this.boardApi.exportBoard(this.board)
},
onNavigate() {
if (this.isTouchDevice) {

View File

@@ -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>

View File

@@ -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>

View File

@@ -14,25 +14,45 @@
</div>
<div v-else-if="isValidFilter" class="overview">
<div v-for="columnProps in columnPropsList" :key="columnProps.title" class="dashboard-column">
<div class="dashboard-column__header">
<h3 class="dashboard-column__header-title"
:title="columnProps.title"
:aria-label="columnProps.title">
{{ t('deck', columnProps.title) }}
</h3>
<div class="dashboard-column">
<h3>{{ t('deck', 'Overdue') }}</h3>
<div v-for="card in sortCards('overdue')" :key="card.id">
<CardItem :id="card.id" />
</div>
<div class="dashboard-column__list">
<template v-if="columnProps.sort === false">
<CardItem v-for="card in filterCards(columnProps.filter)"
:id="card.id"
:key="card.id" />
</template>
<template v-else>
<CardItem v-for="card in sortCards(filterCards(columnProps.filter))"
:id="card.id"
:key="card.id" />
</template>
</div>
<div class="dashboard-column">
<h3>{{ t('deck', 'Today') }}</h3>
<div v-for="card in sortCards('today')" :key="card.id">
<CardItem :id="card.id" />
</div>
</div>
<div class="dashboard-column">
<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>
@@ -53,34 +73,6 @@ const SUPPORTED_FILTERS = [
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 {
name: 'Overview',
components: {
@@ -97,7 +89,6 @@ export default {
data() {
return {
loading: true,
columnPropsList: COLUMN_PROPS_LIST,
}
},
computed: {
@@ -134,16 +125,16 @@ export default {
}
this.loading = false
},
filterCards(when) {
return this.assignedCardsDashboard[when]
},
sortCards(cards) {
sortCards(when) {
const cards = this.assignedCardsDashboard[when]
if (!cards) {
return null
} else {
return cards.toSorted((current, next) => {
const currentDueDate = new Date(current.duedate)
const nextDueDate = new Date(next.duedate)
return currentDueDate - nextDueDate
})
}
@@ -160,75 +151,38 @@ export default {
position: relative;
width: 100%;
height: 100%;
max-height: calc(100vh - 50px);
display: flex;
flex-direction: column;
}
.overview {
position: relative;
overflow-x: auto;
flex-grow: 1;
scrollbar-gutter: stable;
height: calc(100% - var(--default-clickable-area));
overflow-x: scroll;
display: flex;
align-items: stretch;
gap: $board-gap;
padding: 0 $board-gap;
padding-left: $board-spacing;
padding-right: $board-spacing;
.dashboard-column {
display: flex;
flex-direction: column;
flex: 0 1 $card-max-width;
min-width: $card-min-width;
min-width: $stack-width;
width: $stack-width;
margin-left: $stack-spacing;
margin-right: $stack-spacing;
.dashboard-column__header {
display: flex;
h3 {
font-size: var(--default-font-size);
margin: -6px;
margin-bottom: 12px;
padding: 6px 13px;
position: sticky;
top: 0;
height: var(--default-clickable-area);
z-index: 100;
margin-top: 0;
background-color: 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;
border: 1px solid var(--color-main-background);
}
}
}

View File

@@ -4,19 +4,16 @@
-->
<template>
<section v-if="searchQuery!==''" class="global-search">
<header class="search-header">
<h2>
<NcRichText :text="$route.params.id ? t('deck', 'Search for {searchQuery} in other boards') : t('deck', 'Search for {searchQuery} in all boards')"
:arguments="queryStringArgs" />
<span v-if="loading" class="icon-loading-small" />
</h2>
<NcActions>
<NcActionButton icon="icon-close" @click="$store.commit('setSearchQuery', '')" />
</NcActions>
</header>
<div v-if="searchQuery!==''" class="global-search">
<h2>
<NcRichText :text="t('deck', 'Search for {searchQuery} in all boards')" :arguments="queryStringArgs" />
<div v-if="loading" class="icon-loading-small" />
</h2>
<NcActions>
<NcActionButton icon="icon-close" @click="$store.commit('setSearchQuery', '')" />
</NcActions>
<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"
:id="card.id"
:key="card.id"
@@ -29,12 +26,12 @@
{{ t('deck', 'No results found') }}
</div>
</InfiniteLoading>
</template>
<template v-else>
</div>
<div v-else>
<p>{{ t('deck', 'No results found') }}</p>
</template>
</div>
</div>
</section>
</div>
</template>
<script>
@@ -162,7 +159,7 @@ export default {
.global-search {
width: 100%;
padding: $board-gap;
padding: $board-spacing + $stack-spacing;
padding-bottom: 0;
overflow: hidden;
min-height: 35vh;
@@ -172,24 +169,17 @@ export default {
border-top: 1px solid var(--color-border);
z-index: 1010;
position: relative;
display: flex;
flex-direction: column;
.action-item.icon-close {
position: absolute;
top: 10px;
right: 10px;
}
.search-header {
display: flex;
align-items: flex-start;
justify-content: space-between;
}
h2 {
margin: 0;
padding: var(--default-grid-baseline) var(--default-grid-baseline) $board-gap;
.search-wrapper {
overflow: scroll;
height: 100%;
position: relative;
padding: 10px;
}
h2 > div {
@@ -199,24 +189,23 @@ export default {
margin-right: 20px;
}
}
h2:deep(span) {
background-color: var(--color-background-dark);
padding: 3px;
border-radius: var(--border-radius);
}
.search-wrapper {
overflow: auto;
height: 100%;
position: relative;
.search-results {
display: flex;
gap: $stack-gap;
flex-wrap: wrap;
& > .drop-upload--card {
flex: 0 1 $card-max-width;
min-width: $card-min-width;
& > div {
flex-grow: 0;
}
}
&:deep(.card) {
width: $stack-width;
margin-right: $stack-spacing;
}
}
</style>

View File

@@ -62,13 +62,14 @@ export default {
$clickable-area: var(--default-clickable-area);
.card--placeholder {
min-width: $card-min-width;
max-width: $card-min-width;
width: $stack-width;
margin-right: $stack-spacing;
padding: $card-padding;
transition: box-shadow 0.1s ease-in-out;
box-shadow: 0 0 2px 0 var(--color-box-shadow);
border-radius: var(--border-radius-large);
font-size: 100%;
margin-bottom: $card-spacing;
height: 100px;
}

View File

@@ -2,10 +2,8 @@
* SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
$card-min-width: 216px;
$card-max-width: 300px;
$card-padding: calc(var(--default-grid-baseline) * 2) calc(var(--default-grid-baseline) * 2) var(--default-grid-baseline);
$card-gap: calc(var(--default-grid-baseline) * 3);
$card-image-margin: calc(var(--default-grid-baseline) * -2);
$stack-gap: calc(var(--default-grid-baseline) * 3);
$board-gap: calc(var(--default-grid-baseline) * 4);
$card-spacing: 8px;
$card-padding: 4px;
$stack-spacing: 12px;
$stack-width: 280px;
$board-spacing: 16px;

View File

@@ -139,30 +139,11 @@ export class BoardApi {
}
}
exportBoard(board, format) {
exportBoard(board) {
return axios.get(this.url(`/boards/${board.id}/export`))
.then(
(response) => {
if (format === 'json') {
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') }
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') }
let row = ''
Object.keys(fields).forEach(field => {
row += '"' + fields[field] + '"' + '\t'
@@ -179,27 +160,16 @@ export class BoardApi {
const date = new Date(Number(card[field]) * 1000)
row += '"' + date.toLocaleDateString() + '"' + '\t'
} else if (field === 'stackId') {
row += '"' + stack.title.replaceAll('"', '""') + '"' + '\t'
row += '"' + stack.title + '"' + '\t'
} else if (field === 'labels') {
row += '"'
card[field].forEach(label => {
row += label.title.replaceAll('"', '""') + ', '
row += label.title + ', '
})
if (card[field].length > 0) {
row = row.slice(0, -1)
}
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 {
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
deleteLabel(id) {
return axios.delete(this.url(`/labels/${id}`))

View File

@@ -189,7 +189,7 @@ export default {
card.assignedUsers = card.assignedUsers || []
const existingIndex = state.cards.findIndex(_card => _card.id === card.id)
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))
} else {
state.cards.push(card)

View File

@@ -402,14 +402,6 @@ export default new Vuex.Store({
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 }) {
const { withCards, withAssignments, withLabels, withDueDate, moveCardsToLeftStack, restoreArchivedCards } = settings

View File

@@ -66,7 +66,7 @@
</template>
<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 CardBulletedOutlineIcon from 'vue-material-design-icons/CardBulletedOutline.vue'

View File

@@ -78,7 +78,7 @@
</template>
<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 CardBulletedOutlineIcon from 'vue-material-design-icons/CardBulletedOutline.vue'
import CommentProcessingOutlineIcon from 'vue-material-design-icons/CommentProcessingOutline.vue'

View File

@@ -1 +1 @@
81373
73820

View File

@@ -1,7 +1,8 @@
{
"require-dev": {
"phpunit/phpunit": "~9",
"behat/behat": "~3.23.0",
"behat/behat": "~3.15.0",
"behat/gherkin": "4.11.0",
"guzzlehttp/guzzle": "7.9.2",
"jarnaiz/behat-junit-formatter": "^1.3",
"sabre/dav": "4.7.0",

View File

@@ -29,7 +29,6 @@ use OCA\Deck\Controller\PageController;
use OCA\Deck\NoPermissionException;
use OCA\Deck\NotFoundException;
use OCA\Deck\Service\BoardService;
use OCA\Deck\Service\Importer\BoardImportService;
use OCA\Deck\Service\PermissionService;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\JSONResponse;
@@ -87,15 +86,7 @@ class ExceptionMiddlewareTest extends \Test\TestCase {
public function testAfterExceptionFail() {
$this->request->expects($this->any())->method('getId')->willReturn('abc123');
// BoardService $boardService, PermissionService $permissionService, $userId
$boardController = new BoardController(
'deck',
$this->createMock(IRequest::class),
$this->createMock(BoardService::class),
$this->createMock(PermissionService::class),
$this->createMock(BoardImportService::class),
$this->createMock(\OCP\IL10N::class),
'admin'
);
$boardController = new BoardController('deck', $this->createMock(IRequest::class), $this->createMock(BoardService::class), $this->createMock(PermissionService::class), 'admin');
$result = $this->exceptionMiddleware->afterException($boardController, 'bar', new \Exception('other exception message'));
$this->assertEquals('Internal server error: Please contact the server administrator if this error reappears multiple times, please include the request ID "abc123" below in your report.', $result->getData()['message']);
$this->assertEquals(500, $result->getData()['status']);

View File

@@ -46,12 +46,6 @@ class DefaultBoardServiceTest extends TestCase {
/** @var CardService */
private $cardService;
/** @var LabelService */
private $labelService;
/** @var AttachmentService */
private $attachmentService;
/** @var BoardMapper */
private $boardMapper;
@@ -68,8 +62,6 @@ class DefaultBoardServiceTest extends TestCase {
$this->boardService = $this->createMock(BoardService::class);
$this->stackService = $this->createMock(StackService::class);
$this->cardService = $this->createMock(CardService::class);
$this->labelService = $this->createMock(LabelService::class);
$this->attachmentService = $this->createMock(AttachmentService::class);
$this->config = $this->createMock(IConfig::class);
$this->l10n = $this->createMock(IL10N::class);
$this->userId = 'admin';
@@ -80,9 +72,7 @@ class DefaultBoardServiceTest extends TestCase {
$this->boardService,
$this->stackService,
$this->cardService,
$this->config,
$this->labelService,
$this->attachmentService,
$this->config
);
}
@@ -119,8 +109,8 @@ class DefaultBoardServiceTest extends TestCase {
}
public function testCreateDefaultBoard() {
$title = 'Welcome to Nextcloud Deck!';
$color = 'bf678b';
$title = 'Personal';
$color = '317CCC';
$boardId = 5;
$board = new Board();
@@ -138,70 +128,34 @@ class DefaultBoardServiceTest extends TestCase {
return $text;
});
$stackCustomId = '122';
$stackCustom = $this->assembleTestStack('Custom lists - click to rename!', $stackCustomId, $boardId);
$stackToDoId = '123';
$stackToDo = $this->assembleTestStack('To Do', $stackToDoId, $boardId);
$stackToDo = $this->assembleTestStack('To do', $stackToDoId, $boardId);
$stackDoingId = '124';
$stackDoing = $this->assembleTestStack('In Progress', $stackDoingId, $boardId);
$stackDoing = $this->assembleTestStack('Doing', $stackDoingId, $boardId);
$stackDoneId = '125';
$stackDone = $this->assembleTestStack('Done', $stackDoneId, $boardId);
$this->stackService->expects($this->exactly(4))
$this->stackService->expects($this->exactly(3))
->method('create')
->withConsecutive(
[$this->l10n->t('Custom lists - click to rename!'), $boardId, 0],
[$this->l10n->t('To Do'), $boardId, 1],
[$this->l10n->t('In Progress'), $boardId, 2],
[$this->l10n->t('Done'), $boardId, 3]
[$this->l10n->t('To do'), $boardId, 1],
[$this->l10n->t('Doing'), $boardId, 1],
[$this->l10n->t('Done'), $boardId, 1]
)
->willReturnOnConsecutiveCalls($stackCustom, $stackToDo, $stackDoing, $stackDone);
->willReturnOnConsecutiveCalls($stackToDo, $stackDoing, $stackDone);
$cardExampleTask1 = $this->assembleTestCard(
'1. Open to learn more about boards and cards',
$stackCustomId,
$this->userId
);
$cardExampleTask2 = $this->assembleTestCard(
'2. Drag cards left and right, up and down',
$stackToDoId,
$this->userId
);
$cardExampleTask3 = $this->assembleTestCard(
'Create your first card!',
$stackToDoId,
$this->userId
);
$cardExampleTask4 = $this->assembleTestCard(
'3. Apply rich formatting and link content',
$stackDoingId,
$this->userId
);
$cardExampleTask5 = $this->assembleTestCard(
'4. Share, comment and collaborate!',
$stackDoneId,
$this->userId
);
$this->cardService->expects($this->exactly(5))
$cardExampleTask3 = $this->assembleTestCard('Example Task 3', $stackToDoId, $this->userId);
$cardExampleTask2 = $this->assembleTestCard('Example Task 2', $stackDoingId, $this->userId);
$cardExampleTask1 = $this->assembleTestCard('Example Task 1', $stackDoneId, $this->userId);
$this->cardService->expects($this->exactly(3))
->method('create')
->withConsecutive(
['1. Open to learn more about boards and cards', $stackCustomId, 'text', 0, $this->userId],
['2. Drag cards left and right, up and down', $stackToDoId, 'text', 0, $this->userId],
['Create your first card!', $stackToDoId, 'text', 1, $this->userId],
['3. Apply rich formatting and link content', $stackDoingId, 'text', 0, $this->userId],
['4. Share, comment and collaborate!', $stackDoneId, 'text', 0, $this->userId]
['Example Task 3', $stackToDoId, 'text', 0, $this->userId],
['Example Task 2', $stackDoingId, 'text', 0, $this->userId],
['Example Task 1', $stackDoneId, 'text', 0, $this->userId]
)
->willReturnonConsecutiveCalls(
$cardExampleTask1,
$cardExampleTask2,
$cardExampleTask3,
$cardExampleTask4,
$cardExampleTask5
);
->willReturnonConsecutiveCalls($cardExampleTask3, $cardExampleTask2, $cardExampleTask1);
$result = $this->service->createDefaultBoard($title, $this->userId, $color);

View File

@@ -129,17 +129,12 @@ class StackServiceTest extends TestCase {
}
)
);
$this->cardMapper->expects($this->any())->method('findAllForStacks')->willReturnCallback(function (array $stackIds) {
$r = [];
foreach ($stackIds as $stackId) {
$r[$stackId] = $this->getCards(222);
}
return $r;
});
$this->cardMapper->expects($this->any())->method('findAll')->willReturn($this->getCards(222));
$actual = $this->stackService->findAll(123);
for ($stackId = 0; $stackId < 3; $stackId++) {
for ($cardId = 0; $cardId < 10; $cardId++) {
for ($cardId = 0;$cardId < 10;$cardId++) {
$this->assertEquals($actual[0]->getCards()[$cardId]->getId(), $cardId);
$this->assertEquals($actual[0]->getCards()[$cardId]->getStackId(), 222);
$this->assertEquals($actual[0]->getCards()[$cardId]->getLabels(), $this->getLabels()[$cardId]);
@@ -216,7 +211,7 @@ class StackServiceTest extends TestCase {
$stackToBeDeleted->setBoardId(1);
$this->stackMapper->expects($this->once())->method('find')->willReturn($stackToBeDeleted);
$this->stackMapper->expects($this->once())->method('update')->willReturn($stackToBeDeleted);
$this->cardMapper->expects($this->once())->method('findAllForStacks')->willReturn([]);
$this->cardMapper->expects($this->once())->method('findAll')->willReturn([]);
$this->stackService->delete(123);
$this->assertTrue($stackToBeDeleted->getDeletedAt() <= time(), 'deletedAt is in the past');
$this->assertTrue($stackToBeDeleted->getDeletedAt() > 0, 'deletedAt is set');

View File

@@ -36,7 +36,6 @@ class BoardControllerTest extends \Test\TestCase {
private $groupManager;
private $boardService;
private $permissionService;
private $boardImportService;
private $userId = 'user';
public function setUp(): void {
@@ -64,10 +63,6 @@ class BoardControllerTest extends \Test\TestCase {
'\OCA\Deck\Service\PermissionService')
->disableOriginalConstructor()
->getMock();
$this->boardImportService = $this->getMockBuilder(
'\OCA\Deck\Service\Importer\BoardImportService')
->disableOriginalConstructor()
->getMock();
$user = $this->createMock(IUser::class);
$this->groupManager->method('getUserGroupIds')
@@ -81,8 +76,6 @@ class BoardControllerTest extends \Test\TestCase {
$this->request,
$this->boardService,
$this->permissionService,
$this->boardImportService,
$this->l10n,
$this->userId
);
}