Compare commits

..

400 Commits

Author SHA1 Message Date
grnd-alt
c37f6f92c4 fix: do not show dragged over state when no data in drag event
Signed-off-by: grnd-alt <github@belakkaf.net>
2025-09-24 15:30:13 +02:00
Nextcloud bot
4abf895d22 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-24 00:31:53 +00:00
Nextcloud bot
d216e56dac fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-23 00:31:50 +00:00
Luka Trovic
15514162f3 Merge pull request #7256 from nextcloud/bump-nextcloud-vue-8.31.0
Chore(deps): Bump @nextcloud/vue from 8.27.0 to 8.31.0
2025-09-22 21:34:25 +02:00
Luka Trovic
b3bb29157c Chore(deps): Bump @nextcloud/vue from 8.27.0 to 8.31.0
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2025-09-22 20:45:52 +02:00
Nextcloud bot
12b656dd8c fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-22 00:31:30 +00:00
github-actions[bot]
661eea3018 Merge pull request #7250 from nextcloud/automated/noid/main-update-nextcloud-ocp
[main] Update nextcloud/ocp dependency
2025-09-21 03:31:25 +00:00
nextcloud-command
ecd3cb42de chore(dev-deps): Bump nextcloud/ocp package
Signed-off-by: GitHub <noreply@github.com>
2025-09-21 02:40:50 +00:00
github-actions[bot]
f49c8f6ee4 Merge pull request #7231 from nextcloud/automated/noid/main-update-nextcloud-ocp
[main] Update nextcloud/ocp dependency
2025-09-19 17:09:19 +00:00
nextcloud-command
96b56a2447 chore(dev-deps): Bump nextcloud/ocp package
Signed-off-by: GitHub <noreply@github.com>
2025-09-19 19:03:21 +02:00
Nextcloud bot
26badb58dd fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-19 00:32:01 +00:00
Nextcloud bot
04d9433bdd fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-18 00:31:43 +00:00
Nextcloud bot
a69eb654fd fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-17 00:31:43 +00:00
Elizabeth Danzberger
ab5ccb7bc1 Merge pull request #7238 from nextcloud/bugfix/noid/activity-icons
fix(darkmode): Fix activity icon colors
2025-09-16 14:57:18 -04:00
Luka Trovic
f054cc2fbd Merge pull request #7225 from ABartelt/fix/mysql-error-1093-user-deletion
fix: resolve MySQL Error 1093 when deleting users from boards
2025-09-16 20:43:16 +02:00
Luka Trovic
1afc5cdbcc Merge pull request #7237 from nextcloud/bugfix/7207/fix-colors
fix: Fix colors from due dates and done
2025-09-16 20:16:18 +02:00
Joas Schilling
1a6e5929b2 fix(darkmode): Fix activity icon colors
Signed-off-by: Joas Schilling <coding@schilljs.com>
2025-09-16 15:17:54 +02:00
Joas Schilling
74a3ab5008 fix: Fix colors from due dates and done
Signed-off-by: Joas Schilling <coding@schilljs.com>
2025-09-16 14:42:54 +02:00
Luka Trovic
0ebd05e649 Merge pull request #7210 from nextcloud/style/noid/deleteMaterialSymbolOutline
Migrate delete icon to Material Symbol outline variant
2025-09-16 13:43:08 +02:00
Luka Trovic
3611c8f8ac Merge pull request #7159 from Somebodyisnobody/patch-1
Docs: Updating docs for API endpoints for uploading attachments
2025-09-16 10:31:31 +02:00
Luka Trovic
da3b857ab0 Merge pull request #7165 from nextcloud/get-cards-at-once
perf(cards): fetch all cards at once
2025-09-16 10:31:00 +02:00
Nextcloud bot
199b698cb7 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-16 00:31:49 +00:00
Nextcloud bot
fb1132652a fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-15 00:31:00 +00:00
Nextcloud bot
f78c3d42df fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-14 00:30:54 +00:00
Nextcloud bot
4a879ab1fb fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-13 00:31:23 +00:00
Nextcloud bot
b4e9dd39cc fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-12 00:31:48 +00:00
Nextcloud bot
9035a23af8 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-11 00:31:52 +00:00
Arne Bartelt
bffa4d0925 fix: resolve MySQL Error 1093 when deleting users from boards
Fixes #7125 and #7069 by implementing a two-step deletion process
that avoids MySQL's restriction on deleting from a table while
selecting from it in a subquery.

The fix separates the SELECT and DELETE operations:
1. First query: Get card IDs for assignments to delete
2. Second query: Delete assignments using the collected IDs

This approach works on all supported database systems (MySQL 5.7+,
MySQL 8.0+, MariaDB 10.x+) and follows MySQL's official best practices
for handling Error 1093: 'You can't specify target table for update in FROM clause'.

The issue occurred because the original deleteByParticipantOnBoard method
used a subquery that referenced the same table being deleted from,
which MySQL prohibits but MariaDB allows (explaining why it worked
in development but failed in production).

Signed-off-by: Arne Bartelt <arne.bartelt@gmail.com>
Signed-off-by: Arne Bartelt <Arne.Bartelt@gmail.com>
2025-09-10 16:39:51 +02:00
Luka Trovic
516294ee23 Merge pull request #6640 from ludij/feature/3331-dynamic-column-width
Feature/3331 dynamic column width
2025-09-10 09:50:07 +02:00
Luutzen Dijkstra
5a39996357 feature(3331): aligned stack children spacing and fixed linting issues
Signed-off-by: Luutzen Dijkstra <luutzen.dijkstra@gmail.com>
2025-09-10 09:44:36 +02:00
Luutzen Dijkstra
569a0961fd feature(3331): card image refactor
Signed-off-by: Luutzen Dijkstra <luutzen.dijkstra@gmail.com>
2025-09-10 09:44:36 +02:00
Luutzen Dijkstra
376f46b7ba feature(3331): scroll column instead of page for board and overview
Signed-off-by: Luutzen Dijkstra <luutzen.dijkstra@gmail.com>
2025-09-10 09:44:36 +02:00
Luutzen Dijkstra
447dc60f37 feature(3331): removed duplicate flex-grow property from GlobalSearchResults
Signed-off-by: Luutzen Dijkstra <luutzen.dijkstra@gmail.com>
2025-09-10 09:44:36 +02:00
Luutzen Dijkstra
480af39d56 feature(3331): specify phrasing for search results depending on view
Signed-off-by: Luutzen Dijkstra <luutzen.dijkstra@gmail.com>
2025-09-10 09:44:36 +02:00
Luutzen Dijkstra
7d18f3a48b feature(3331): improve accessibility attributes for overview column titles
Signed-off-by: Luutzen Dijkstra <luutzen.dijkstra@gmail.com>
2025-09-10 09:44:36 +02:00
Luutzen Dijkstra
51f5b8f023 fix(3331): bind title attribute on h3 in stack
Signed-off-by: Luutzen Dijkstra <luutzen.dijkstra@gmail.com>
2025-09-10 09:44:36 +02:00
Luutzen Dijkstra
1e68e1ff03 feature(3331): use existingIndex to define existingCard
Signed-off-by: Luutzen Dijkstra <luutzen.dijkstra@gmail.com>
2025-09-10 09:44:36 +02:00
Luutzen Dijkstra
a13619690e fix(3331): fixed border around add list form in boards
Signed-off-by: Luutzen Dijkstra <luutzen.dijkstra@gmail.com>
2025-09-10 09:44:36 +02:00
Luutzen Dijkstra
3115363c28 feature(3331): made board, overview, stack and search result cards width behave more dynamic
Signed-off-by: Luutzen Dijkstra <luutzen.dijkstra@gmail.com>
2025-09-10 09:44:36 +02:00
rakekniven
6ace1867e1 Merge pull request #7222 from nextcloud/fix/4466/refproviders-translator-comments 2025-09-09 14:02:53 +02:00
Julien Veyssier
af4a610a25 feat(reference): add translators comments in reference providers
Signed-off-by: Julien Veyssier <julien-nc@posteo.net>
2025-09-09 12:57:14 +02:00
Nextcloud bot
d40661a985 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-09 00:33:39 +00:00
Nextcloud bot
0a14a0dfd8 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-08 00:32:13 +00:00
github-actions[bot]
72d3cfa771 Merge pull request #7215 from nextcloud/automated/noid/main-update-nextcloud-ocp
[main] Update nextcloud/ocp dependency
2025-09-07 03:02:50 +00:00
nextcloud-command
411c0d9d46 chore(dev-deps): Bump nextcloud/ocp package
Signed-off-by: GitHub <noreply@github.com>
2025-09-07 02:39:28 +00:00
Nextcloud bot
ec33c26fe4 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-07 00:33:30 +00:00
Nextcloud bot
8fcb4a47ae fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-06 00:31:26 +00:00
Andy Scherzinger
44d244f9aa style(icon): Migrate delete icon to Material Symbol outline variant
Signed-off-by: Andy Scherzinger <info@andy-scherzinger.de>
2025-09-05 18:26:28 +02:00
Nextcloud bot
3ed1fbcc40 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-05 00:32:02 +00:00
Luka Trovic
7394cb2d48 Merge pull request #7204 from nextcloud/update-main-version
feat(deps): Add Nextcloud 33 support on main
2025-09-04 21:24:36 +02:00
Joas Schilling
4f39328d59 feat(deps): Add Nextcloud 33 support on main
Signed-off-by: Joas Schilling <coding@schilljs.com>
2025-09-04 12:22:14 +02:00
Nextcloud bot
b877c58343 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-04 00:30:31 +00:00
Nextcloud bot
6334b36666 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-03 00:29:39 +00:00
Luka Trovic
f08eeec3a8 Merge pull request #7199 from nextcloud/release/1.16.0-beta.1
Release/1.16.0-beta.1
2025-09-02 19:16:43 +02:00
Nextcloud bot
eec2ccd9ed fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-09-02 00:30:24 +00:00
Luka Trovic
3c8728c9ee release 1.16.0-beta.1
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2025-09-01 15:59:41 +02:00
dependabot[bot]
684cf519ce Merge pull request #7065 from nextcloud/dependabot/npm_and_yarn/main/nextcloud/dialogs-6.3.1 2025-09-01 10:00:34 +00:00
Luka Trovic
215a4637b0 Merge pull request #7146 from nextcloud/dependabot/npm_and_yarn/linkifyjs-4.3.2
Chore(deps): Bump linkifyjs from 4.1.3 to 4.3.2
2025-09-01 11:55:25 +02:00
Luka Trovic
cab45170e5 Merge pull request #7128 from nextcloud/fix/comments-with-mention-editable
fix: make comments with mention editable
2025-09-01 11:54:16 +02:00
dependabot[bot]
cd50becc49 Chore(deps): Bump @nextcloud/dialogs from 6.1.1 to 6.3.1
Bumps [@nextcloud/dialogs](https://github.com/nextcloud-libraries/nextcloud-dialogs) from 6.1.1 to 6.3.1.
- [Release notes](https://github.com/nextcloud-libraries/nextcloud-dialogs/releases)
- [Changelog](https://github.com/nextcloud-libraries/nextcloud-dialogs/blob/v6.3.1/CHANGELOG.md)
- [Commits](https://github.com/nextcloud-libraries/nextcloud-dialogs/compare/v6.1.1...v6.3.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-01 11:53:42 +02:00
github-actions[bot]
d778a48afb Merge pull request #7195 from nextcloud/automated/noid/main-update-nextcloud-ocp
[main] Update nextcloud/ocp dependency
2025-08-31 03:02:41 +00:00
nextcloud-command
0a1ed8e0c2 chore(dev-deps): Bump nextcloud/ocp package
Signed-off-by: GitHub <noreply@github.com>
2025-08-31 02:41:12 +00:00
Nextcloud bot
a200afa168 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-30 00:29:22 +00:00
Nextcloud bot
3277de5cb4 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-29 00:29:34 +00:00
Nextcloud bot
34effdc00e fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-28 00:29:33 +00:00
Nextcloud bot
014372a21a fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-27 00:29:28 +00:00
Nextcloud bot
7674a85f68 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-26 00:30:38 +00:00
github-actions[bot]
357c6c1c5a Merge pull request #7178 from nextcloud/automated/noid/main-update-nextcloud-ocp
[main] Update nextcloud/ocp dependency
2025-08-24 03:08:30 +00:00
nextcloud-command
23be704099 chore(dev-deps): Bump nextcloud/ocp package
Signed-off-by: GitHub <noreply@github.com>
2025-08-24 02:44:14 +00:00
Nextcloud bot
2571d48290 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-23 00:29:01 +00:00
Luka Trovic
c513b1d5b5 Merge pull request #7177 from nextcloud/clear-deleted-attachment-sharing-records
Clean attachment sharing records after permanent deleted
2025-08-22 20:47:38 +02:00
Luka Trovic
b80e0d9297 fix: clean attachment sharing records after permanent deleted
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2025-08-22 11:09:53 +02:00
Nextcloud bot
382c05ed8d fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-22 00:28:52 +00:00
Nextcloud bot
1283b8d78a fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-20 00:28:46 +00:00
Nextcloud bot
465f24f2f1 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-19 00:31:12 +00:00
github-actions[bot]
ba0d211720 Merge pull request #7171 from nextcloud/automated/noid/main-update-nextcloud-ocp
[main] Update nextcloud/ocp dependency
2025-08-17 03:49:14 +00:00
nextcloud-command
23f56be988 chore(dev-deps): Bump nextcloud/ocp package
Signed-off-by: GitHub <noreply@github.com>
2025-08-17 03:37:30 +00:00
Luka Trovic
87f2d65a96 Merge pull request #7162 from nextcloud/fix/6528-loosing-focus-when-editing-the-description-in-a-card
fix: do not change focus when card id stays the same
2025-08-14 20:52:50 +02:00
Nextcloud bot
c95b3b746d fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-14 00:29:47 +00:00
Carl Schwan
a3fa72341d perf(cards): fetch all cards at once
Instead of one by one

Signed-off-by: Carl Schwan <carl.schwan@nextclound.com>
2025-08-13 16:01:52 +02:00
grnd-alt
da850b18ae fix: do not change focus when card id stays the same
Signed-off-by: grnd-alt <github@belakkaf.net>
2025-08-13 12:55:22 +02:00
Nextcloud bot
771cf93cf6 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-13 00:30:21 +00:00
Nextcloud bot
0ed8b21b3c fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-12 00:29:18 +00:00
github-actions[bot]
6f4f59a976 Merge pull request #7161 from nextcloud/automated/noid/main-update-nextcloud-ocp
[main] Update nextcloud/ocp dependency
2025-08-10 04:05:05 +00:00
nextcloud-command
f80d7a5e79 chore(dev-deps): Bump nextcloud/ocp package
Signed-off-by: GitHub <noreply@github.com>
2025-08-10 03:47:48 +00:00
Nextcloud bot
e3843f9808 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-10 00:28:20 +00:00
Nextcloud bot
1ec7f1a971 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-09 00:28:47 +00:00
Somebodyisnobody
152181ff67 docs: Update API docs
Clarifying documentation for the attachment upload endpoints.

Signed-off-by: Somebodyisnobody <35230554+Somebodyisnobody@users.noreply.github.com>
2025-08-07 11:43:42 +02:00
Nextcloud bot
18eea3584e fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-04 00:31:06 +00:00
github-actions[bot]
844d492c8d Merge pull request #7153 from nextcloud/automated/noid/main-update-nextcloud-ocp
[main] Update nextcloud/ocp dependency
2025-08-03 04:40:26 +00:00
nextcloud-command
840e9f309f chore(dev-deps): Bump nextcloud/ocp package
Signed-off-by: GitHub <noreply@github.com>
2025-08-03 03:56:02 +00:00
Nextcloud bot
fe53440ee4 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-03 00:28:38 +00:00
Nextcloud bot
162dbf25dd fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-02 00:29:05 +00:00
Nextcloud bot
17de153ec8 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-08-01 00:28:49 +00:00
grnd-alt
58027c8294 Merge pull request #7124 from stpronk/patch-1
[main] Add `$changes->getBefore()` to event in reorder
2025-07-31 10:40:35 +02:00
StPronk
79eba77b49 Updated all functionalities within cardService to include a before state where possible
Signed-off-by: StPronk <stpronk@gmail.com>
2025-07-31 08:14:00 +02:00
Nextcloud bot
0efdfab232 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-07-30 00:28:59 +00:00
dependabot[bot]
ba9d2a4514 Chore(deps): Bump linkifyjs from 4.1.3 to 4.3.2
Bumps [linkifyjs](https://github.com/nfrasser/linkifyjs/tree/HEAD/packages/linkifyjs) from 4.1.3 to 4.3.2.
- [Release notes](https://github.com/nfrasser/linkifyjs/releases)
- [Changelog](https://github.com/nfrasser/linkifyjs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/nfrasser/linkifyjs/commits/v4.3.2/packages/linkifyjs)

---
updated-dependencies:
- dependency-name: linkifyjs
  dependency-version: 4.3.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-29 19:10:40 +00:00
grnd-alt
5744944957 Merge pull request #7139 from nextcloud/fix/6739
fix:  Use getId() method for card ID retrieval
2025-07-29 10:58:11 +02:00
grnd-alt
1c1e3e944e fix: make labels in dialog deletable
Signed-off-by: grnd-alt <github@belakkaf.net>
2025-07-29 10:39:39 +02:00
grnd-alt
85bb603103 fix: dont add labels without id
Signed-off-by: grnd-alt <github@belakkaf.net>
2025-07-29 10:37:19 +02:00
Nextcloud bot
90f10190ac fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-07-29 00:28:40 +00:00
Enjeck C.
ab3b2aa23c fix: Use getId() method for card ID retrieval
Signed-off-by: Enjeck C. <patrathewhiz@gmail.com>
2025-07-28 09:03:43 +01:00
Nextcloud bot
b9c0d454d5 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-07-28 00:28:48 +00:00
github-actions[bot]
438825530c Merge pull request #7134 from nextcloud/automated/noid/main-update-nextcloud-ocp
[main] Update nextcloud/ocp dependency
2025-07-27 04:09:50 +00:00
nextcloud-command
c346c3cdf8 chore(dev-deps): Bump nextcloud/ocp package
Signed-off-by: GitHub <noreply@github.com>
2025-07-27 03:50:55 +00:00
Luka Trovic
f1da8b30a4 Merge pull request #7131 from nextcloud/fix-board-acl-check
fix: acl check when delete, update board acl
2025-07-25 17:51:00 +02:00
Luka Trovic
8229d40981 fix: acl check when delete, update board acl
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2025-07-25 16:21:10 +02:00
Luka Trovic
244d61c783 Merge pull request #7127 from nextcloud/fix/allow-foreign-label-deletion
fix:allow foreign label deletion
2025-07-25 12:26:54 +02:00
Nextcloud bot
879e59c003 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-07-25 00:29:30 +00:00
grnd-alt
10dc1fe9c1 fix: make comments with mention editable
Signed-off-by: grnd-alt <github@belakkaf.net>
2025-07-24 15:45:15 +02:00
grnd-alt
4741817594 fix:allow foreign label deletion
Signed-off-by: grnd-alt <github@belakkaf.net>
2025-07-24 12:02:30 +02:00
grnd-alt
af99211d6b Merge pull request #7114 from nextcloud/use-outline-icons
feat: use outline icons
2025-07-24 10:50:40 +02:00
Nextcloud bot
b120ce868d fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-07-24 00:30:25 +00:00
Luka Trovic
f0ea3f3ce5 Merge pull request #7126 from nextcloud/update-workflows
chore: update workflows to skip stable29
2025-07-23 20:41:36 +02:00
dependabot[bot]
2f0caac403 Merge pull request #7118 from nextcloud/dependabot/composer/tests/integration/behat/behat-approx-3.23.0 2025-07-23 15:53:24 +00:00
dependabot[bot]
cc93386da6 Chore(deps-dev): Update behat/behat requirement in /tests/integration
Updates the requirements on [behat/behat](https://github.com/Behat/Behat) to permit the latest version.
- [Release notes](https://github.com/Behat/Behat/releases)
- [Changelog](https://github.com/Behat/Behat/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Behat/Behat/compare/v3.22.0...v3.23.0)

---
updated-dependencies:
- dependency-name: behat/behat
  dependency-version: 3.23.0
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-23 17:47:59 +02:00
Luka Trovic
5573a8bb1a chore: update workflows to skip stable29
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2025-07-23 17:46:16 +02:00
Nextcloud bot
c2e2e73b88 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-07-23 00:33:41 +00:00
Nextcloud bot
e509ac77d4 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-07-22 00:29:05 +00:00
Luka Trovic
909af7e1bb Merge pull request #7080 from Fledermaus-20/main
Add OCC commands for global calendar feature opt-in and opt-out in Deck
2025-07-21 13:58:09 +02:00
github-actions[bot]
6828144815 Merge pull request #7120 from nextcloud/automated/noid/main-update-nextcloud-ocp
[main] Update nextcloud/ocp dependency
2025-07-20 04:29:44 +00:00
nextcloud-command
1d9382429e chore(dev-deps): Bump nextcloud/ocp package
Signed-off-by: GitHub <noreply@github.com>
2025-07-20 03:49:47 +00:00
Fledermaus-20
f68f7b54d6 Merge branch 'main' into main 2025-07-18 19:40:01 +02:00
Luka Trovic
dd4da2dd34 Merge pull request #7110 from nextcloud/dependabot/github_actions/svenstaro/upload-release-action-2.11.2
Chore(deps): Bump svenstaro/upload-release-action from 2.9.0 to 2.11.2
2025-07-16 09:30:11 +02:00
Luka Trovic
327bfff315 feat: use outline icons
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2025-07-15 20:57:36 +02:00
dependabot[bot]
0b6c492c75 Chore(deps): Bump svenstaro/upload-release-action from 2.9.0 to 2.11.2
Bumps [svenstaro/upload-release-action](https://github.com/svenstaro/upload-release-action) from 2.9.0 to 2.11.2.
- [Release notes](https://github.com/svenstaro/upload-release-action/releases)
- [Changelog](https://github.com/svenstaro/upload-release-action/blob/master/CHANGELOG.md)
- [Commits](04733e069f...81c65b7cd4)

---
updated-dependencies:
- dependency-name: svenstaro/upload-release-action
  dependency-version: 2.11.2
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-15 18:57:33 +00:00
Luka Trovic
bbe1b37dfe Merge pull request #7084 from nextcloud/dependabot/github_actions/svenstaro/upload-release-action-2.10.0
Chore(deps): Bump svenstaro/upload-release-action from 2.9.0 to 2.10.0
2025-07-15 20:56:20 +02:00
Luka Trovic
3b5bf56049 Merge pull request #7053 from nextcloud/dependabot/composer/justinrainbow/json-schema-6.4.2
Chore(deps): Bump justinrainbow/json-schema from 6.4.1 to 6.4.2
2025-07-15 20:56:12 +02:00
dependabot[bot]
97ab42ad5c Chore(deps): Bump svenstaro/upload-release-action from 2.9.0 to 2.10.0
Bumps [svenstaro/upload-release-action](https://github.com/svenstaro/upload-release-action) from 2.9.0 to 2.10.0.
- [Release notes](https://github.com/svenstaro/upload-release-action/releases)
- [Changelog](https://github.com/svenstaro/upload-release-action/blob/master/CHANGELOG.md)
- [Commits](04733e069f...ebd922b779)

---
updated-dependencies:
- dependency-name: svenstaro/upload-release-action
  dependency-version: 2.10.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-15 20:51:00 +02:00
dependabot[bot]
42d3e54841 Chore(deps): Bump justinrainbow/json-schema from 6.4.1 to 6.4.2
Bumps [justinrainbow/json-schema](https://github.com/jsonrainbow/json-schema) from 6.4.1 to 6.4.2.
- [Release notes](https://github.com/jsonrainbow/json-schema/releases)
- [Changelog](https://github.com/jsonrainbow/json-schema/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jsonrainbow/json-schema/compare/6.4.1...6.4.2)

---
updated-dependencies:
- dependency-name: justinrainbow/json-schema
  dependency-version: 6.4.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-15 20:50:25 +02:00
dependabot[bot]
8dd62dd8d9 Merge pull request #7047 from nextcloud/dependabot/npm_and_yarn/webpack-dev-server-5.2.2 2025-07-15 18:49:03 +00:00
dependabot[bot]
160900f2bb Chore(deps-dev): Bump webpack-dev-server from 5.1.0 to 5.2.2
Bumps [webpack-dev-server](https://github.com/webpack/webpack-dev-server) from 5.1.0 to 5.2.2.
- [Release notes](https://github.com/webpack/webpack-dev-server/releases)
- [Changelog](https://github.com/webpack/webpack-dev-server/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webpack/webpack-dev-server/compare/v5.1.0...v5.2.2)

---
updated-dependencies:
- dependency-name: webpack-dev-server
  dependency-version: 5.2.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-15 20:42:21 +02:00
Luka Trovic
020107d3f4 Merge pull request #7036 from nextcloud/dependabot/npm_and_yarn/main/nextcloud/vue-8.27.0
Chore(deps): Bump @nextcloud/vue from 8.26.0 to 8.27.0
2025-07-15 20:42:10 +02:00
dependabot[bot]
68fb689df9 Merge pull request #6989 from nextcloud/dependabot/composer/tests/integration/behat/behat-approx-3.22.0 2025-07-15 18:38:53 +00:00
dependabot[bot]
97d8018cd1 Chore(deps): Bump @nextcloud/vue from 8.26.0 to 8.27.0
Bumps [@nextcloud/vue](https://github.com/nextcloud-libraries/nextcloud-vue) from 8.26.0 to 8.27.0.
- [Release notes](https://github.com/nextcloud-libraries/nextcloud-vue/releases)
- [Changelog](https://github.com/nextcloud-libraries/nextcloud-vue/blob/v8.27.0/CHANGELOG.md)
- [Commits](https://github.com/nextcloud-libraries/nextcloud-vue/compare/v8.26.0...v8.27.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-15 20:36:31 +02:00
dependabot[bot]
d666cba097 Chore(deps-dev): Update behat/behat requirement in /tests/integration
Updates the requirements on [behat/behat](https://github.com/Behat/Behat) to permit the latest version.
- [Release notes](https://github.com/Behat/Behat/releases)
- [Changelog](https://github.com/Behat/Behat/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Behat/Behat/compare/v3.21.1...v3.22.0)

---
updated-dependencies:
- dependency-name: behat/behat
  dependency-version: 3.22.0
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-15 20:33:37 +02:00
dependabot[bot]
a8c337eb07 Merge pull request #6984 from nextcloud/dependabot/npm_and_yarn/main/nextcloud/moment-1.3.4 2025-07-15 18:23:20 +00:00
dependabot[bot]
a3a46012a4 Chore(deps): Bump @nextcloud/moment from 1.3.2 to 1.3.4
Bumps [@nextcloud/moment](https://github.com/nextcloud-libraries/nextcloud-moment) from 1.3.2 to 1.3.4.
- [Release notes](https://github.com/nextcloud-libraries/nextcloud-moment/releases)
- [Changelog](https://github.com/nextcloud-libraries/nextcloud-moment/blob/main/CHANGELOG.md)
- [Commits](https://github.com/nextcloud-libraries/nextcloud-moment/compare/v1.3.2...v1.3.4)

---
updated-dependencies:
- dependency-name: "@nextcloud/moment"
  dependency-version: 1.3.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-07-15 20:18:00 +02:00
dependabot[bot]
1aa7105ceb Merge pull request #6983 from nextcloud/dependabot/npm_and_yarn/main/nextcloud/cypress-1.0.0-beta.15 2025-07-15 17:34:35 +00:00
dependabot[bot]
a042a4b076 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.15.
- [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.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 19:28:33 +02:00
dependabot[bot]
d0f992ecbb Merge pull request #6973 from nextcloud/dependabot/npm_and_yarn/main/babel/runtime-7.27.1 2025-07-15 17:25:51 +00:00
dependabot[bot]
fc245759a3 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-07-15 19:19:41 +02:00
Luka Trovic
60bba3332b Merge pull request #7104 from nextcloud/fix-unstable-cypress
fix: unstable cypress
2025-07-15 16:47:08 +02:00
Luka Trovic
c93e07e0bd Merge pull request #7074 from nextcloud/automated/noid/main-update-nextcloud-ocp
[main] Update nextcloud/ocp dependency
2025-07-15 11:19:49 +02:00
Luka Trovic
9e6975b22b chore: update query count
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2025-07-15 11:11:37 +02:00
nextcloud-command
979f9b2c53 chore(dev-deps): Bump nextcloud/ocp package
Signed-off-by: GitHub <noreply@github.com>
2025-07-15 11:11:37 +02:00
Luka Trovic
307bdf5e68 Merge pull request #7078 from nextcloud/dependabot/npm_and_yarn/pbkdf2-3.1.3
Chore(deps-dev): Bump pbkdf2 from 3.1.2 to 3.1.3
2025-07-15 10:52:09 +02:00
Luka Trovic
4380533a66 Merge pull request #7107 from nextcloud/fix-new-stack-input-field
fix: styling for new stack input field
2025-07-14 15:13:32 +02:00
Nextcloud bot
3a1fbb90c3 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-07-14 00:27:50 +00:00
Luka Trovic
dd64e0c73d fix: styling for new stack input field
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2025-07-11 18:59:52 +02:00
Fledermaus-20
8a9751ac6b Merge branch 'main' into main 2025-07-11 12:54:25 +02:00
Luka Trovic
c16f26d8d2 fix: unstable cypress
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2025-07-10 16:53:03 +02:00
Fledermaus-20
c7edec8f6e updated composer.json
Signed-off-by: Fledermaus-20 <benno.traub@icloud.com>
2025-07-10 11:37:57 +02:00
Nextcloud bot
a6de59fe9c fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-07-10 00:28:44 +00:00
Nextcloud bot
81e2c4768b fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-07-09 00:29:04 +00:00
Luka Trovic
3c917f3b2d Merge pull request #7083 from nextcloud/feat/workflow-auto-update-reuse.yml
ci: update reuse.yml workflow from template
2025-07-08 10:51:19 +02:00
Nextcloud bot
6fd24ffa45 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-07-08 00:29:03 +00:00
Fledermaus-20
8c891c7f57 Merge branch 'main' into main
Signed-off-by: Fledermaus-20 <139645999+Fledermaus-20@users.noreply.github.com>
2025-07-06 12:55:53 +02:00
Fledermaus-20
b73c2becda Add toggle for calendar feature with OCC
Signed-off-by: Fledermaus-20 <benno.traub@icloud.com>
2025-07-06 12:52:58 +02:00
Nextcloud bot
a9235e00c7 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-07-06 00:28:13 +00:00
Nextcloud bot
f8ad05b55b fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-07-05 00:28:23 +00:00
Nextcloud bot
be497a741c fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-07-04 00:28:38 +00:00
Luka Trovic
62a9ce3131 fix: add retry and show warning on description saving error (#7070)
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2025-07-03 11:47:28 +02:00
grnd-alt
7799854df4 fix: ensure correct type when filtering events (#7071)
Signed-off-by: grnd-alt <github@belakkaf.net>
2025-07-03 10:45:42 +02:00
Nextcloud bot
bf961c3de4 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-07-03 00:28:51 +00:00
Nextcloud bot
5f73d97e4e fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-07-02 00:29:11 +00:00
Nextcloud bot
32f0852a23 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-07-01 00:28:28 +00:00
Nextcloud bot
d80c9b3eec fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-30 00:27:42 +00:00
Nextcloud bot
002bac60b1 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-29 00:27:40 +00:00
Nextcloud bot
08756b6c5d fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-28 00:29:06 +00:00
Nextcloud bot
71bb838964 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-28 00:28:03 +00:00
Nextcloud bot
6c55e3cd70 ci: update reuse.yml workflow from template
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-27 10:14:06 +00:00
Nextcloud bot
8391d843d5 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-27 00:43:49 +00:00
Luka Trovic
7cb9f8b966 Merge pull request #7066 from nextcloud/dependabot/github_actions/shivammathur/setup-php-2.34.1
Chore(deps): Bump shivammathur/setup-php from 2.33.0 to 2.34.1
2025-06-26 11:13:34 +02:00
Nextcloud bot
1dfbec4278 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-26 00:42:57 +00:00
dependabot[bot]
26861c890d Chore(deps-dev): Bump pbkdf2 from 3.1.2 to 3.1.3
Bumps [pbkdf2](https://github.com/crypto-browserify/pbkdf2) from 3.1.2 to 3.1.3.
- [Changelog](https://github.com/browserify/pbkdf2/blob/master/CHANGELOG.md)
- [Commits](https://github.com/crypto-browserify/pbkdf2/compare/v3.1.2...v3.1.3)

---
updated-dependencies:
- dependency-name: pbkdf2
  dependency-version: 3.1.3
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-25 21:26:44 +02:00
Nextcloud bot
6841d4c068 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-25 00:43:14 +00:00
Nextcloud bot
4e70286629 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-24 00:43:11 +00:00
Nextcloud bot
54a5a1ecb2 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-20 00:42:28 +00:00
Nextcloud bot
4139f8b94a fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-19 00:42:34 +00:00
Julius Knorr
5c21cd2cf5 Merge pull request #7000 from nextcloud/automated/noid/main-update-nextcloud-ocp 2025-06-18 08:34:43 +02:00
Nextcloud bot
af253270aa fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-17 00:40:26 +00:00
Nextcloud bot
6a64b4fc75 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-16 00:40:38 +00:00
nextcloud-command
4b260a047c chore(dev-deps): Bump nextcloud/ocp package
Signed-off-by: GitHub <noreply@github.com>
2025-06-15 03:34:29 +00:00
dependabot[bot]
8d41f9730f Chore(deps): Bump shivammathur/setup-php from 2.33.0 to 2.34.1
Bumps [shivammathur/setup-php](https://github.com/shivammathur/setup-php) from 2.33.0 to 2.34.1.
- [Release notes](https://github.com/shivammathur/setup-php/releases)
- [Commits](https://github.com/shivammathur/setup-php/compare/2.33.0...2.34.1)

---
updated-dependencies:
- dependency-name: shivammathur/setup-php
  dependency-version: 2.34.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-14 02:25:16 +00:00
Nextcloud bot
2adacaa39e fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-14 00:40:02 +00:00
Luka Trovic
69fcd9bfdf Merge pull request #7030 from nextcloud/fix-cypress
fix: unstable cypress test
2025-06-12 18:14:49 +02:00
Luka Trovic
c0b3775232 fix: unstable cypress test
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2025-06-12 16:17:02 +02:00
Nextcloud bot
df0e909be4 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-11 00:44:33 +00:00
Julius Knorr
96905c891c Merge pull request #7059 from nextcloud/fix-file-sharing-picker 2025-06-10 17:11:51 +02:00
Nextcloud bot
58c8dd5221 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-10 00:40:10 +00:00
Luka Trovic
e21c82b38e fix: not show Share with a Deck card for unauthorized users
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2025-06-09 12:25:51 +02:00
Julius Knorr
02afc218ff Merge pull request #7043 from nextcloud/dependabot/npm_and_yarn/tar-fs-2.1.3
Chore(deps-dev): Bump tar-fs from 2.1.2 to 2.1.3
2025-06-03 14:41:17 +02:00
dependabot[bot]
50d199dd08 Chore(deps-dev): Bump tar-fs from 2.1.2 to 2.1.3
Bumps [tar-fs](https://github.com/mafintosh/tar-fs) from 2.1.2 to 2.1.3.
- [Commits](https://github.com/mafintosh/tar-fs/commits)

---
updated-dependencies:
- dependency-name: tar-fs
  dependency-version: 2.1.3
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-06-03 09:16:36 +00:00
Nextcloud bot
ff74bfbf13 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-06-01 00:39:59 +00:00
Nextcloud bot
a64bec0ecd fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-31 00:40:55 +00:00
Luka Trovic
d66e6408b1 Merge pull request #7027 from nextcloud/purge-deleted-lists
fix: update DeleteCron to remove deleted lists
2025-05-28 17:58:59 +02:00
Luka Trovic
324eb05598 fix: update DeleteCron to remove deleted lists
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2025-05-28 12:03:06 +02:00
Nextcloud bot
9938a6d57f fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-28 00:41:37 +00:00
Nextcloud bot
c2e4165bf7 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-26 00:41:08 +00:00
Nextcloud bot
7de0d6f1c4 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-23 00:40:37 +00:00
Nextcloud bot
5631741b6b fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-22 00:41:20 +00:00
Luka Trovic
724ad74c47 Merge pull request #7012 from nextcloud/update-dependabot
chore: update dependabot.yml
2025-05-21 20:22:13 +02:00
Nextcloud bot
c8897477a7 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-21 00:45:40 +00:00
Luka Trovic
7ac93d311c chore: update dependabot.yml
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2025-05-19 15:48:12 +02:00
Nextcloud bot
be8806102a fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-18 00:41:52 +00:00
Nextcloud bot
f6a5877b85 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-17 00:44:01 +00:00
Nextcloud bot
9360a49d50 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-15 00:44:21 +00:00
Nextcloud bot
3aee848221 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-14 00:41:37 +00:00
Nextcloud bot
2f53f8a1d6 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-13 00:42:47 +00:00
Nextcloud bot
d63764fa78 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-12 00:41:52 +00:00
Nextcloud bot
d06ec0ad98 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-11 00:41:44 +00:00
Nextcloud bot
4bf086b55e fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-10 00:43:58 +00:00
dependabot[bot]
99e2912d7c Merge pull request #6972 from nextcloud/dependabot/npm_and_yarn/main/relative-ci/agent-4.3.1 2025-05-08 14:45:00 +00:00
dependabot[bot]
10aed3660c Chore(deps-dev): Bump @relative-ci/agent from 4.2.14 to 4.3.1
Bumps [@relative-ci/agent](https://github.com/relative-ci/agent) from 4.2.14 to 4.3.1.
- [Release notes](https://github.com/relative-ci/agent/releases)
- [Commits](https://github.com/relative-ci/agent/compare/v4.2.14...v4.3.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-08 16:39:31 +02:00
Nextcloud bot
6628c42eca fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-08 00:43:26 +00:00
Nextcloud bot
dbe1ced6b0 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-07 00:43:32 +00:00
Nextcloud bot
04b4da39c9 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-06 00:43:38 +00:00
Nextcloud bot
530a695e6f fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-05 01:11:34 +00:00
github-actions[bot]
02d7dd469e Merge pull request #6979 from nextcloud/automated/noid/main-update-nextcloud-ocp
[main] Update nextcloud/ocp dependency
2025-05-04 04:36:55 +00:00
nextcloud-command
71340b1217 chore(dev-deps): Bump nextcloud/ocp package
Signed-off-by: GitHub <noreply@github.com>
2025-05-04 03:20:39 +00:00
Nextcloud bot
153a9d2b7d fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-04 00:41:43 +00:00
Nextcloud bot
e18f73a333 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-03 00:42:55 +00:00
dependabot[bot]
127f1b2d40 Merge pull request #6861 from nextcloud/dependabot/npm_and_yarn/main/babel/runtime-7.27.0 2025-05-02 16:21:14 +00:00
dependabot[bot]
fe4c8df97e Chore(deps): Bump @babel/runtime from 7.26.10 to 7.27.0
Bumps [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.26.10 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:16:03 +02:00
dependabot[bot]
d5582535d6 Merge pull request #6926 from nextcloud/dependabot/github_actions/shivammathur/setup-php-2.33.0 2025-05-02 15:59:19 +00:00
dependabot[bot]
7ec112ae1d Chore(deps): Bump shivammathur/setup-php from 2.32.0 to 2.33.0
Bumps [shivammathur/setup-php](https://github.com/shivammathur/setup-php) from 2.32.0 to 2.33.0.
- [Release notes](https://github.com/shivammathur/setup-php/releases)
- [Commits](https://github.com/shivammathur/setup-php/compare/2.32.0...2.33.0)

---
updated-dependencies:
- dependency-name: shivammathur/setup-php
  dependency-version: 2.33.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-02 17:54:08 +02:00
dependabot[bot]
aa747d7d62 Merge pull request #6938 from nextcloud/dependabot/composer/tests/integration/behat/behat-approx-3.21.1 2025-05-02 15:08:12 +00:00
dependabot[bot]
d97f6c1a5f Chore(deps-dev): Update behat/behat requirement in /tests/integration
Updates the requirements on [behat/behat](https://github.com/Behat/Behat) to permit the latest version.
- [Release notes](https://github.com/Behat/Behat/releases)
- [Changelog](https://github.com/Behat/Behat/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Behat/Behat/compare/v3.18.1...v3.21.1)

---
updated-dependencies:
- dependency-name: behat/behat
  dependency-version: 3.21.1
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-05-02 17:00:07 +02:00
Nextcloud bot
8e0b585662 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-02 00:43:00 +00:00
Nextcloud bot
c0f7e16463 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-05-01 00:42:07 +00:00
Luka Trovic
71b4700a07 Merge pull request #6872 from nextcloud/board-import-export
feat: add board import and export
2025-04-30 22:41:09 +02:00
Luka Trovic
688649f5a8 Merge pull request #6916 from nextcloud/perf/dont-enrich-calendar-entries
perf: don't enrich cards when finding calendar entries
2025-04-29 13:39:08 +02:00
Luka Trovic
03cdc47540 feat: add board import and export
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2025-04-29 09:53:49 +02:00
Nextcloud bot
9f06a43d4b fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-04-29 00:42:23 +00:00
grnd-alt
d31e31735d Merge pull request #6933 from nextcloud/fix/label-card-limit
fix: Ensure consistent label mappings
2025-04-28 10:43:20 +02:00
Julius Knorr
4a05762c0a Merge pull request #6950 from nextcloud/automated/noid/main-fix-npm-audit
[main] Fix npm audit
2025-04-28 08:52:07 +02:00
Julius Knorr
a72f48f9ce Merge pull request #6898 from nextcloud/fix/log-spam
fix: Use strings as rich object ids
2025-04-28 08:51:15 +02:00
Nextcloud bot
7e6f23fa82 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-04-28 00:42:35 +00:00
github-actions[bot]
a72f4e3aa3 Merge pull request #6947 from nextcloud/automated/noid/main-update-nextcloud-ocp
[main] Update nextcloud/ocp dependency
2025-04-27 04:29:11 +00:00
nextcloud-command
ec8945bb54 fix(deps): Fix npm audit
Signed-off-by: GitHub <noreply@github.com>
2025-04-27 03:53:25 +00:00
nextcloud-command
760f771e11 chore(dev-deps): Bump nextcloud/ocp package
Signed-off-by: GitHub <noreply@github.com>
2025-04-27 03:15:52 +00:00
Nextcloud bot
f0a443cbb6 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-04-27 00:42:04 +00:00
Nextcloud bot
69b9c09a14 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-04-25 00:41:58 +00:00
Nextcloud bot
7c93108172 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-04-24 00:42:52 +00:00
grnd-alt
899d8a6531 fix: only delete assignments on unshared board (#6932)
Signed-off-by: grnd-alt <github@belakkaf.net>
2025-04-23 11:37:17 +02:00
Julius Knorr
60b34d190a tests: Fix unit test mocking around label checks
Signed-off-by: Julius Knorr <jus@bitgrid.net>
2025-04-23 09:48:02 +02:00
Julius Knorr
438a149304 chore: Add migration step for wrong label mapping
Signed-off-by: Julius Knorr <jus@bitgrid.net>
2025-04-23 09:47:37 +02:00
Nextcloud bot
9a2fcf6925 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-04-23 00:42:06 +00:00
dependabot[bot]
e3c802c0f3 Merge pull request #6925 from nextcloud/dependabot/github_actions/actions/setup-node-4.4.0 2025-04-22 17:22:42 +00:00
Julius Knorr
ea84743864 fix: Use strings as rich object ids
Signed-off-by: Julius Knorr <jus@bitgrid.net>
2025-04-22 17:01:56 +02:00
Julius Knorr
abd38e0c15 Merge pull request #6928 from nextcloud/dependabot/npm_and_yarn/main/nextcloud/vue-8.25.1
Chore(deps): Bump @nextcloud/vue from 8.24.0 to 8.25.1
2025-04-22 16:43:56 +02:00
Julius Knorr
0ec1f7151c Merge pull request #6843 from nextcloud/automated/noid/main-update-nextcloud-ocp
[main] Update nextcloud/ocp dependency
2025-04-22 16:43:20 +02:00
Julius Knorr
a27cbf8bad Merge pull request #6773 from nextcloud/automated/noid/main-fix-npm-audit
[main] Fix npm audit
2025-04-22 16:42:51 +02:00
Luka Trovic
f4a1424e90 Merge pull request #6930 from nextcloud/dependabot/npm_and_yarn/main/eslint-webpack-plugin-5.0.1
Chore(deps-dev): Bump eslint-webpack-plugin from 4.2.0 to 5.0.1
2025-04-22 15:57:04 +02:00
Julius Härtl
a92dc282a8 fix: Limit label actions to labels of the cards board
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2025-04-22 15:41:39 +02:00
nextcloud-command
e3ffbf73c3 fix(deps): Fix npm audit
Signed-off-by: GitHub <noreply@github.com>
2025-04-20 03:32:19 +00:00
nextcloud-command
c6e075af92 chore(dev-deps): Bump nextcloud/ocp package
Signed-off-by: GitHub <noreply@github.com>
2025-04-20 03:12:21 +00:00
dependabot[bot]
144f293231 Chore(deps-dev): Bump eslint-webpack-plugin from 4.2.0 to 5.0.1
Bumps [eslint-webpack-plugin](https://github.com/webpack-contrib/eslint-webpack-plugin) from 4.2.0 to 5.0.1.
- [Release notes](https://github.com/webpack-contrib/eslint-webpack-plugin/releases)
- [Changelog](https://github.com/webpack-contrib/eslint-webpack-plugin/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webpack-contrib/eslint-webpack-plugin/compare/v4.2.0...v5.0.1)

---
updated-dependencies:
- dependency-name: eslint-webpack-plugin
  dependency-version: 5.0.1
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-19 01:50:17 +00:00
dependabot[bot]
6d78bc70f3 Chore(deps): Bump @nextcloud/vue from 8.24.0 to 8.25.1
Bumps [@nextcloud/vue](https://github.com/nextcloud-libraries/nextcloud-vue) from 8.24.0 to 8.25.1.
- [Release notes](https://github.com/nextcloud-libraries/nextcloud-vue/releases)
- [Changelog](https://github.com/nextcloud-libraries/nextcloud-vue/blob/v8.25.1/CHANGELOG.md)
- [Commits](https://github.com/nextcloud-libraries/nextcloud-vue/compare/v8.24.0...v8.25.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-19 01:49:37 +00:00
dependabot[bot]
bf15865957 Chore(deps): Bump actions/setup-node from 4.3.0 to 4.4.0
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 4.3.0 to 4.4.0.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v4.3.0...v4.4.0)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: 4.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-19 01:35:47 +00:00
Nextcloud bot
d2e5c0c515 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-04-18 00:43:11 +00:00
Nextcloud bot
933f2515db fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-04-17 00:42:38 +00:00
dependabot[bot]
17bf361767 Merge pull request #6917 from nextcloud/dependabot/npm_and_yarn/http-proxy-middleware-2.0.9 2025-04-16 18:31:25 +00:00
dependabot[bot]
1df731396f Merge pull request #6874 from nextcloud/dependabot/npm_and_yarn/main/nextcloud/vue-8.24.0 2025-04-16 18:27:55 +00:00
dependabot[bot]
968ea30fd4 Chore(deps): Bump @nextcloud/vue from 8.22.0 to 8.24.0
Bumps [@nextcloud/vue](https://github.com/nextcloud-libraries/nextcloud-vue) from 8.22.0 to 8.24.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.24.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-16 18:22:48 +00:00
dependabot[bot]
8f75c7f92d Chore(deps-dev): Bump http-proxy-middleware from 2.0.7 to 2.0.9
Bumps [http-proxy-middleware](https://github.com/chimurai/http-proxy-middleware) from 2.0.7 to 2.0.9.
- [Release notes](https://github.com/chimurai/http-proxy-middleware/releases)
- [Changelog](https://github.com/chimurai/http-proxy-middleware/blob/v2.0.9/CHANGELOG.md)
- [Commits](https://github.com/chimurai/http-proxy-middleware/compare/v2.0.7...v2.0.9)

---
updated-dependencies:
- dependency-name: http-proxy-middleware
  dependency-version: 2.0.9
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-16 18:22:26 +00:00
Luka Trovic
234be011cc Merge pull request #6879 from nextcloud/dependabot/npm_and_yarn/multi-b29f0fd473
Chore(deps): Bump tar-fs and dockerode
2025-04-16 20:21:06 +02:00
Richard Steinmetz
fa2f5bcab8 perf: don't enrich cards when finding calendar entries
Signed-off-by: Richard Steinmetz <richard@steinmetz.cloud>
2025-04-16 13:49:58 +02:00
Nextcloud bot
685014ec48 fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-04-16 00:43:52 +00:00
Luka Trovic
1cd6c55d30 Merge pull request #6902 from nextcloud/update-card-move-dialog
Clear selected stack when selected board changed
2025-04-15 18:33:07 +02:00
Luka Trovic
6dbcf5d17b fix: clear selected stack when selected board changed
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2025-04-14 20:28:52 +02:00
dependabot[bot]
f84d7c372b Merge pull request #6885 from nextcloud/dependabot/composer/justinrainbow/json-schema-6.4.1 2025-04-14 14:50:36 +00:00
dependabot[bot]
8be8647f6d Merge pull request #6910 from nextcloud/dependabot/github_actions/nextcloud-libraries/npm-audit-action-0.2.0 2025-04-12 02:12:00 +00:00
dependabot[bot]
eb878055ae Merge pull request #6908 from nextcloud/dependabot/npm_and_yarn/main/nextcloud/webpack-vue-config-6.3.0 2025-04-12 02:04:52 +00:00
dependabot[bot]
00b334d3d9 Chore(deps): Bump nextcloud-libraries/npm-audit-action
Bumps [nextcloud-libraries/npm-audit-action](https://github.com/nextcloud-libraries/npm-audit-action) from 0.1.0 to 0.2.0.
- [Release notes](https://github.com/nextcloud-libraries/npm-audit-action/releases)
- [Commits](2a60bd2e79...1b1728b2b4)

---
updated-dependencies:
- dependency-name: nextcloud-libraries/npm-audit-action
  dependency-version: 0.2.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-12 01:54:09 +00:00
dependabot[bot]
5905154fe0 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-04-12 01:39:42 +00:00
Nextcloud bot
8280f0796f Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-04-12 00:44:01 +00:00
Nextcloud bot
18ea2f9a7e Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-04-11 00:43:38 +00:00
Nextcloud bot
3cbddae6bc Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-04-10 00:42:51 +00:00
Julius Knorr
aac11e96b5 Merge pull request #6893 from nextcloud/perf/deck-share-deleted-cards 2025-04-08 22:59:39 +02:00
Julius Knorr
2e62a9c82a perf: Skip doing a query just to check if a board is deleted
Signed-off-by: Julius Knorr <jus@bitgrid.net>
2025-04-08 22:13:11 +02:00
Nextcloud bot
ec18ec758b Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-04-06 00:44:05 +00:00
dependabot[bot]
8f3e2ae1d9 Chore(deps): Bump justinrainbow/json-schema from 6.0.0 to 6.4.1
Bumps [justinrainbow/json-schema](https://github.com/jsonrainbow/json-schema) from 6.0.0 to 6.4.1.
- [Release notes](https://github.com/jsonrainbow/json-schema/releases)
- [Changelog](https://github.com/jsonrainbow/json-schema/blob/master/CHANGELOG.md)
- [Commits](https://github.com/jsonrainbow/json-schema/compare/6.0.0...6.4.1)

---
updated-dependencies:
- dependency-name: justinrainbow/json-schema
  dependency-version: 6.4.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-05 01:46:07 +00:00
dependabot[bot]
7f00601007 Chore(deps): Bump tar-fs and dockerode
Bumps [tar-fs](https://github.com/mafintosh/tar-fs) and [dockerode](https://github.com/apocas/dockerode). These dependencies needed to be updated together.

Updates `tar-fs` from 2.0.1 to 2.1.2
- [Commits](https://github.com/mafintosh/tar-fs/compare/v2.0.1...v2.1.2)

Updates `dockerode` from 4.0.2 to 4.0.5
- [Release notes](https://github.com/apocas/dockerode/releases)
- [Commits](https://github.com/apocas/dockerode/compare/v4.0.2...v4.0.5)

---
updated-dependencies:
- dependency-name: tar-fs
  dependency-version: 2.1.2
  dependency-type: indirect
- dependency-name: dockerode
  dependency-version: 4.0.5
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-05 01:17:26 +00:00
dependabot[bot]
175c10c146 Merge pull request #6873 from nextcloud/dependabot/npm_and_yarn/main/dompurify-3.2.5 2025-04-05 01:16:25 +00:00
dependabot[bot]
8dc0933c47 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-04-05 01:11:29 +00:00
Nextcloud bot
8c52b9bad9 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-04-04 00:42:52 +00:00
Nextcloud bot
a1c9396946 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-04-02 00:43:19 +00:00
Luka Trovic
b0fbb386b8 Merge pull request #6800 from gidan80/main
CSV export fixes
2025-03-31 13:56:15 +02:00
Ronni Dal Lago
e77a2fcd79 Merge branch 'main' of https://github.com/gidan80/deck 2025-03-31 12:19:51 +02:00
Ronni Dal Lago
89152325be Increased query count
Signed-off-by: Ronni Dal Lago <blackjacksuper@hotmail.it>
2025-03-31 12:19:36 +02:00
Ronni Dal Lago
03cb9e2bc5 CSV export fixes
Signed-off-by: Ronni Dal Lago <blackjacksuper@hotmail.it>
2025-03-31 09:53:36 +02:00
Nextcloud bot
3c6f8ec419 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-03-30 00:44:10 +00:00
dependabot[bot]
3cfb1f6bfe Merge pull request #6860 from nextcloud/dependabot/github_actions/actions/setup-node-4.3.0 2025-03-29 02:15:46 +00:00
dependabot[bot]
96ad191ce2 Chore(deps): Bump actions/setup-node from 4.1.0 to 4.3.0
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 4.1.0 to 4.3.0.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v4.1.0...v4.3.0)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-29 02:06:40 +00:00
Nextcloud bot
52d4039dc8 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-03-29 00:43:37 +00:00
Nextcloud bot
73b3517840 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-03-28 00:44:51 +00:00
Nextcloud bot
3d78802446 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-03-27 00:44:45 +00:00
Julius Knorr
8a99e6d539 Merge pull request #6853 from nextcloud/ci/update-workflows
chore: update workflows from templates
2025-03-25 15:17:08 +01:00
grnd-alt
0e08ad16e1 chore: set minimum phpVersion for psalm
Signed-off-by: grnd-alt <github@belakkaf.net>
2025-03-25 14:05:17 +01:00
Nextcloud bot
d04ab25315 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-03-25 00:43:41 +00:00
grnd-alt
19d35c65a0 chore: update workflows from templates
Signed-off-by: grnd-alt <github@belakkaf.net>
2025-03-24 15:41:10 +01:00
Nextcloud bot
1783914d3a Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-03-24 00:43:02 +00:00
Nextcloud bot
c837dd4db6 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-03-23 00:43:32 +00:00
dependabot[bot]
db22052729 Merge pull request #6850 from nextcloud/dependabot/github_actions/actions/setup-node-4.3.0 2025-03-22 02:22:09 +00:00
dependabot[bot]
116babcaaf Chore(deps): Bump actions/setup-node from 4.2.0 to 4.3.0
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 4.2.0 to 4.3.0.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v4.2.0...v4.3.0)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-22 02:16:47 +00:00
Ronni Dal Lago
94da732bfb CSV export fixes
Signed-off-by: Ronni Dal Lago <blackjacksuper@hotmail.it>
2025-03-21 18:20:37 +01:00
Nextcloud bot
86d42b7060 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-03-20 00:45:34 +00:00
Nextcloud bot
122387a195 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-03-18 00:45:10 +00:00
Nextcloud bot
028f26a969 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-03-16 00:43:43 +00:00
dependabot[bot]
13c13b8dde Merge pull request #6831 from nextcloud/dependabot/npm_and_yarn/main/babel/runtime-7.26.10 2025-03-15 02:14:25 +00:00
dependabot[bot]
5df4a49ff5 Chore(deps): Bump @babel/runtime from 7.26.7 to 7.26.10
Bumps [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.26.7 to 7.26.10.
- [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.10/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-03-15 02:05:59 +00:00
Nextcloud bot
97902d2f6a Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-03-15 00:45:23 +00:00
Nextcloud bot
db6221d1c9 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-03-12 00:44:24 +00:00
github-actions[bot]
0223dd9a3a Merge pull request #6825 from nextcloud/automated/noid/main-update-nextcloud-ocp
[main] Update nextcloud/ocp dependency
2025-03-09 03:34:50 +00:00
nextcloud-command
974a4c979a chore(dev-deps): Bump nextcloud/ocp package
Signed-off-by: GitHub <noreply@github.com>
2025-03-09 02:36:44 +00:00
dependabot[bot]
51ba51fe33 Merge pull request #6822 from nextcloud/dependabot/npm_and_yarn/axios-1.8.2 2025-03-08 04:06:48 +00:00
dependabot[bot]
4d5c69f250 Chore(deps): Bump axios from 1.7.7 to 1.8.2
Bumps [axios](https://github.com/axios/axios) from 1.7.7 to 1.8.2.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.7.7...v1.8.2)

---
updated-dependencies:
- dependency-name: axios
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-08 04:01:11 +00:00
dependabot[bot]
9bddab4928 Merge pull request #6821 from nextcloud/dependabot/github_actions/peter-evans/create-pull-request-7.0.8 2025-03-08 03:59:58 +00:00
dependabot[bot]
6dcb1d4b8b bump peter-evans/create-pull-request from 7.0.7 to 7.0.8
---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-08 03:54:25 +00:00
Nextcloud bot
9ed384fa20 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-03-03 00:42:20 +00:00
github-actions[bot]
7cdc79a9ef Merge pull request #6812 from nextcloud/automated/noid/main-update-nextcloud-ocp
[main] Update nextcloud/ocp dependency
2025-03-02 03:46:38 +00:00
nextcloud-command
852770c574 chore(dev-deps): Bump nextcloud/ocp package
Signed-off-by: GitHub <noreply@github.com>
2025-03-02 03:01:01 +00:00
dependabot[bot]
74afeb85d0 Merge pull request #6811 from nextcloud/dependabot/github_actions/peter-evans/create-pull-request-7.0.7 2025-03-01 03:44:08 +00:00
dependabot[bot]
12a494720b chore(deps): bump peter-evans/create-pull-request from 7.0.6 to 7.0.7
Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 7.0.6 to 7.0.7.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](67ccf781d6...dd2324fc52)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-01 03:02:53 +00:00
dependabot[bot]
b3261e0b56 Merge pull request #6805 from nextcloud/dependabot/npm_and_yarn/main/nextcloud/event-bus-3.3.2 2025-03-01 02:22:07 +00:00
dependabot[bot]
88dbb010d0 chore(deps): bump @nextcloud/event-bus from 3.3.1 to 3.3.2
Bumps [@nextcloud/event-bus](https://github.com/nextcloud/nextcloud-event-bus) from 3.3.1 to 3.3.2.
- [Release notes](https://github.com/nextcloud/nextcloud-event-bus/releases)
- [Changelog](https://github.com/nextcloud-libraries/nextcloud-event-bus/blob/main/CHANGELOG.md)
- [Commits](https://github.com/nextcloud/nextcloud-event-bus/compare/v3.3.1...v3.3.2)

---
updated-dependencies:
- dependency-name: "@nextcloud/event-bus"
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-03-01 02:05:52 +00:00
Nextcloud bot
d8adaf5fe6 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-03-01 01:05:09 +00:00
Nextcloud bot
2a36b45072 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-27 00:44:24 +00:00
Nextcloud bot
4e6474fa99 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-25 00:45:11 +00:00
github-actions[bot]
dbe7536339 Merge pull request #6770 from nextcloud/automated/noid/main-update-nextcloud-ocp
[main] Update nextcloud/ocp dependency
2025-02-24 14:51:38 +00:00
nextcloud-command
b5e08110ab chore(dev-deps): Bump nextcloud/ocp package
Signed-off-by: GitHub <noreply@github.com>
2025-02-24 15:46:05 +01:00
dependabot[bot]
a7f2558aab Merge pull request #6787 from nextcloud/dependabot/npm_and_yarn/main/nextcloud/eslint-config-8.4.2 2025-02-24 14:37:30 +00:00
dependabot[bot]
3c3e6fa7d2 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-24 15:26:51 +01:00
Nextcloud bot
6a2b092ad6 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-24 00:41:53 +00:00
Nextcloud bot
5f2c300b21 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-22 00:41:52 +00:00
Luka Trovic
439e44128a Merge pull request #6778 from nextcloud/fix-cypress-main
fix: cypress issue
2025-02-21 10:58:05 +01:00
Nextcloud bot
55056e27f1 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-21 00:41:20 +00:00
Luka Trovic
22c36a0d77 fix: cypress issue
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2025-02-20 16:24:45 +01:00
Nextcloud bot
1ebaa0c41f Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-20 00:43:26 +00:00
Luka Trovic
a2dbb94179 Merge pull request #6724 from nextcloud/feat/workflow-auto-update-pr-feedback.yml
chore(CI): Updating pr-feedback.yml workflow from template
2025-02-19 13:43:07 +01:00
Nextcloud bot
6f6f54965c Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-19 00:42:11 +00:00
Nextcloud bot
5a833ec367 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-18 00:42:04 +00:00
Nextcloud bot
f1161be49f Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-17 00:41:29 +00:00
Nextcloud bot
c0731ce142 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-16 01:06:39 +00:00
Nextcloud bot
4534ad5a92 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-15 00:41:52 +00:00
Luka Trovic
6788210c27 Merge pull request #6740 from nextcloud/update-default-content
feat: update default content
2025-02-14 13:32:26 +01:00
Luka Trovic
1051dea281 Merge pull request #6745 from nextcloud/dependabot/npm_and_yarn/elliptic-6.6.1
chore(deps-dev): bump elliptic from 6.6.0 to 6.6.1
2025-02-14 08:42:28 +01:00
Nextcloud bot
eb9fce2e5f Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-14 00:42:23 +00:00
dependabot[bot]
955a16f1c5 chore(deps-dev): bump elliptic from 6.6.0 to 6.6.1
Bumps [elliptic](https://github.com/indutny/elliptic) from 6.6.0 to 6.6.1.
- [Commits](https://github.com/indutny/elliptic/compare/v6.6.0...v6.6.1)

---
updated-dependencies:
- dependency-name: elliptic
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-13 17:43:42 +00:00
Luka Trovic
f38773473b Merge pull request #6736 from nextcloud/automated/noid/main-update-nextcloud-ocp
[main] Update nextcloud/ocp dependency
2025-02-13 18:41:01 +01:00
Luka Trovic
b15254f1ed feat: update default content
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2025-02-13 14:18:47 +01:00
Nextcloud bot
6dd623f796 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-13 00:42:08 +00:00
Julius Knorr
41e97d7281 Merge pull request #6649 from nextcloud/fix/redirect-no-rewrite
fix: Adapt URLs generated in the backend to new routes
2025-02-12 22:32:04 +01:00
Julius Knorr
1b2a352df1 ci: Update query count
Signed-off-by: Julius Knorr <jus@bitgrid.net>
2025-02-12 21:56:34 +01:00
Julius Knorr
7fcad2425d 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:56:06 +01:00
Julius Knorr
5fb43086b6 tests: Fix url generation mocks and cleanup some phpunit code
Signed-off-by: Julius Knorr <jus@bitgrid.net>
2025-02-12 21:56:06 +01:00
Julius Knorr
7b4586a43a fix: Adapt URLs generated in the backend to new routes
Signed-off-by: Julius Knorr <jus@bitgrid.net>
2025-02-12 21:56:06 +01:00
Nextcloud bot
aaa76f7bd0 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-12 00:43:09 +00:00
Nextcloud bot
8260296d64 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-11 00:41:47 +00:00
nextcloud-command
b02bc530f1 chore(dev-deps): Bump nextcloud/ocp package
Signed-off-by: GitHub <noreply@github.com>
2025-02-09 02:54:36 +00:00
Nextcloud bot
1b4e859431 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-09 00:41:43 +00:00
dependabot[bot]
acc61ad584 Merge pull request #6729 from nextcloud/dependabot/npm_and_yarn/main/nextcloud/cypress-1.0.0-beta.13 2025-02-08 02:26:34 +00:00
dependabot[bot]
cb1d5c49e0 chore(deps-dev): bump @nextcloud/cypress
Bumps [@nextcloud/cypress](https://github.com/nextcloud/nextcloud-cypress) from 1.0.0-beta.12 to 1.0.0-beta.13.
- [Release notes](https://github.com/nextcloud/nextcloud-cypress/releases)
- [Commits](https://github.com/nextcloud/nextcloud-cypress/compare/v1.0.0-beta.12...v1.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 02:10:29 +00:00
Luka Trovic
0c7b1c4731 Merge pull request #6707 from nextcloud/feat/workflow-auto-update-npm-audit-fix.yml
chore(CI): Updating npm-audit-fix.yml workflow from template
2025-02-07 16:36:10 +01:00
Nextcloud bot
629ef85d64 chore(CI): Updating npm-audit-fix.yml workflow from template
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-07 16:22:02 +01:00
Luka Trovic
914f1d76ac Merge pull request #6720 from nextcloud/automated/noid/main-fix-npm-audit
[main] Fix npm audit
2025-02-07 10:18:15 +01:00
Nextcloud bot
0923070c45 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-07 00:41:26 +00:00
Nextcloud bot
bbf51952e0 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-05 00:43:20 +00:00
Nextcloud bot
1d1c2df8f3 chore(CI): Updating pr-feedback.yml workflow from template
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-04 18:42:46 +00:00
Elizabeth Danzberger
0780b10170 Merge pull request #6692 from nextcloud/fix/6446
fix: skip exporting a deleted card
2025-02-04 13:27:54 -05:00
Luka Trovic
fd6ef9b6eb Merge pull request #6712 from nextcloud/dependabot/npm_and_yarn/main/dompurify-3.2.4
chore(deps): bump dompurify from 3.2.3 to 3.2.4
2025-02-04 13:09:57 +01:00
Luka Trovic
da4a54900c Merge pull request #6711 from nextcloud/dependabot/github_actions/actions/setup-node-4.2.0
chore(deps): bump actions/setup-node from 4.1.0 to 4.2.0
2025-02-04 13:09:35 +01:00
Luka Trovic
53bd32d6b6 Merge pull request #6695 from nextcloud/dependabot/npm_and_yarn/main/babel/runtime-7.26.7
chore(deps): bump @babel/runtime from 7.26.0 to 7.26.7
2025-02-04 13:05:56 +01:00
Elizabeth Danzberger
f7fa419105 fix: skip exporting a deleted card
Signed-off-by: Elizabeth Danzberger <lizzy7128@tutanota.de>
2025-02-04 09:49:39 +01:00
dependabot[bot]
023ab01e93 Merge pull request #6668 from nextcloud/dependabot/composer/tests/integration/behat/behat-approx-3.18.1 2025-02-04 07:24:15 +00:00
dependabot[bot]
615d5ef871 chore(deps-dev): update behat/behat requirement in /tests/integration
Updates the requirements on [behat/behat](https://github.com/Behat/Behat) to permit the latest version.
- [Release notes](https://github.com/Behat/Behat/releases)
- [Changelog](https://github.com/Behat/Behat/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Behat/Behat/compare/v3.15.0...v3.18.1)

---
updated-dependencies:
- dependency-name: behat/behat
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-04 08:18:49 +01:00
Luka Trovic
a52b7b9742 Merge pull request #6665 from nextcloud/dependabot/github_actions/shivammathur/setup-php-2.32.0
chore(deps): bump shivammathur/setup-php from 2.31.1 to 2.32.0
2025-02-04 08:18:00 +01:00
Luka Trovic
dcbc6bc604 Merge pull request #6666 from nextcloud/dependabot/github_actions/peter-evans/create-pull-request-7.0.6
chore(deps): bump peter-evans/create-pull-request from 7.0.5 to 7.0.6
2025-02-04 08:12:07 +01:00
Nextcloud bot
ce13d89e07 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-03 01:02:33 +00:00
nextcloud-command
7114b10871 fix(deps): Fix npm audit
Signed-off-by: GitHub <noreply@github.com>
2025-02-02 03:25:51 +00:00
Nextcloud bot
100404d25f Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-02-02 00:42:30 +00:00
dependabot[bot]
60bfc192d3 chore(deps): bump actions/setup-node from 4.1.0 to 4.2.0
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 4.1.0 to 4.2.0.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v4.1.0...v4.2.0)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-01 19:38:35 +01:00
dependabot[bot]
fd090c7749 chore(deps): bump peter-evans/create-pull-request from 7.0.5 to 7.0.6
Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 7.0.5 to 7.0.6.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](5e914681df...67ccf781d6)

---
updated-dependencies:
- dependency-name: peter-evans/create-pull-request
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-01 19:14:56 +01:00
dependabot[bot]
d735308bd3 chore(deps): bump shivammathur/setup-php from 2.31.1 to 2.32.0
Bumps [shivammathur/setup-php](https://github.com/shivammathur/setup-php) from 2.31.1 to 2.32.0.
- [Release notes](https://github.com/shivammathur/setup-php/releases)
- [Commits](https://github.com/shivammathur/setup-php/compare/2.31.1...2.32.0)

---
updated-dependencies:
- dependency-name: shivammathur/setup-php
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-02-01 19:13:02 +01:00
github-actions[bot]
4ec068ca62 Merge pull request #6670 from nextcloud/automated/noid/main-update-nextcloud-ocp
[main] Update nextcloud/ocp dependency
2025-02-01 16:53:40 +00:00
nextcloud-command
f5e3e5e0f8 chore(dev-deps): Bump nextcloud/ocp package
Signed-off-by: GitHub <noreply@github.com>
2025-02-01 17:48:09 +01:00
dependabot[bot]
94aee3e07a 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:33:07 +00:00
Nextcloud bot
b1f7c623a1 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-01-28 00:41:14 +00:00
Julius Knorr
afa95d3c50 Merge pull request #6671 from nextcloud/fix/attachment-extension
fix: Properly show attachment extension
2025-01-27 08:43:31 +01:00
Nextcloud bot
ba8e77abfe Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-01-27 00:40:20 +00:00
dependabot[bot]
8c09047203 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-01-25 02:29:31 +00:00
Nextcloud bot
baa85e8947 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-01-25 01:01:22 +00:00
Nextcloud bot
f1e5acc52e Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2025-01-24 00:41:33 +00:00
Elizabeth Danzberger
d76b7a4667 Merge pull request #6682 from nextcloud/update-main-version
feat(deps): Add Nextcloud 32 support on main
2025-01-23 14:08:15 -05:00
Joas Schilling
df32a3ee34 feat(deps): Add Nextcloud 32 support on main
Signed-off-by: Joas Schilling <coding@schilljs.com>
2025-01-23 10:57:25 +01:00
Julius Knorr
2fa74662db ci: Test for separate extension
Signed-off-by: Julius Knorr <jus@bitgrid.net>
2025-01-23 09:28:09 +01:00
Julius Härtl
d5fd80d116 fix: Properly show attachment extension
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2025-01-23 09:28:09 +01:00
101 changed files with 1799 additions and 1111 deletions

View File

@@ -13,6 +13,40 @@ 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
@@ -20,41 +54,7 @@ updates:
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: 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"
time: "03:30"
timezone: Europe/Paris
ignore:
- dependency-name: "*"
@@ -69,7 +69,7 @@ updates:
schedule:
interval: weekly
day: saturday
time: "03:00"
time: "03:45"
timezone: Europe/Paris
open-pull-requests-limit: 10
reviewers:
@@ -81,7 +81,7 @@ updates:
schedule:
interval: weekly
day: saturday
time: "03:00"
time: "04:00"
timezone: Europe/Paris
open-pull-requests-limit: 10
reviewers:
@@ -93,7 +93,7 @@ updates:
schedule:
interval: weekly
day: saturday
time: "03:00"
time: "04:15"
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.1.0
uses: actions/setup-node@v4.4.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.31.1
uses: shivammathur/setup-php@2.34.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@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # 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@c541c155eee45413f5b09a52248675b1a2575231 # v2.31.1
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e # v2.34.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@04733e069f2d7f7f0b4aebc4fbdbce8613b03ccd # v2
uses: svenstaro/upload-release-action@81c65b7cd4de9b2570615ce3aad67a41de5b1a13 # 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: [ 'stable31' ]
server-versions: [ 'master' ]
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.1.0
uses: actions/setup-node@v4.4.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.31.1
uses: shivammathur/setup-php@2.34.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.31.1
uses: shivammathur/setup-php@2.34.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@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # 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-available }}
uses: shivammathur/setup-php@c541c155eee45413f5b09a52248675b1a2575231 # v2.31.1
- name: Set up php${{ steps.versions.outputs.php-min }}
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e # v2.34.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@c541c155eee45413f5b09a52248675b1a2575231 # v2.31.1
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e # v2.34.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@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # 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.1.0
uses: actions/setup-node@v4.4.0
with:
node-version: ${{ matrix.node-version }}
- name: Set up npm7

View File

@@ -14,6 +14,9 @@ on:
# At 2:30 on Sundays
- cron: '30 2 * * 0'
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
@@ -21,15 +24,18 @@ jobs:
strategy:
fail-fast: false
matrix:
branches: ['main', 'master', 'stable30', 'stable29', 'stable28']
branches: ['main', 'master', 'stable32', 'stable31', 'stable30']
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
@@ -39,7 +45,7 @@ jobs:
fallbackNpm: '^10'
- name: Set up node ${{ steps.versions.outputs.nodeVersion }}
uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.1.0
with:
node-version: ${{ steps.versions.outputs.nodeVersion }}
@@ -48,10 +54,10 @@ jobs:
- name: Fix npm audit
id: npm-audit
uses: nextcloud-libraries/npm-audit-action@2a60bd2e79cc77f2cc4d9a3fe40f1a69896f3a87 # v0.1.0
uses: nextcloud-libraries/npm-audit-action@1b1728b2b4a7a78d69de65608efcf4db0e3e42d0 # v0.2.0
- name: Run npm ci and npm run build
if: always()
if: steps.checkout.outcome == 'success'
env:
CYPRESS_INSTALL_BINARY: 0
run: |
@@ -59,8 +65,8 @@ jobs:
npm run build --if-present
- name: Create Pull Request
if: always()
uses: peter-evans/create-pull-request@5e914681df9dc83aa4e4905692ca88beb2f9e91f # v7.0.5
if: steps.checkout.outcome == 'success'
uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8
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@c541c155eee45413f5b09a52248675b1a2575231 # v2.31.1
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e # v2.34.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@c541c155eee45413f5b09a52248675b1a2575231 # v2.31.1
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e # v2.34.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@c541c155eee45413f5b09a52248675b1a2575231 # v2.31.1
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e # v2.34.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,8 +15,13 @@ 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-available }}
uses: shivammathur/setup-php@c541c155eee45413f5b09a52248675b1a2575231 # v2.31.1
- name: Set up php${{ steps.versions.outputs.php-min }}
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e # v2.34.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
runs-on: ubuntu-latest-low
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', 'stable30', 'stable29', 'stable28']
branches: ['main', 'master', 'stable32', 'stable31', 'stable30']
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@c541c155eee45413f5b09a52248675b1a2575231 # v2.31.1
uses: shivammathur/setup-php@0f7f1d08e3e32076e51cae65eb0b0c871405b16e # v2.34.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@5e914681df9dc83aa4e4905692ca88beb2f9e91f # v7.0.5
uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8
with:
token: ${{ secrets.COMMAND_BOT_PAT }}
commit-message: 'chore(dev-deps): Bump nextcloud/ocp package'

View File

@@ -6,6 +6,7 @@
- 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,64 +5,16 @@
# Changelog
All notable changes to this project will be documented in this file.
# 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
## 1.16.0-beta.1
### 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)
- 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)
### Fixed
- CSV export fixes @gidan80 [#6800](https://github.com/nextcloud/deck/pull/6800)
## 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", "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"]
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"]
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>1.15.3</version>
<version>2.0.0-dev.0</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="31" max-version="31"/>
<nextcloud min-version="33" max-version="33"/>
</dependencies>
<background-jobs>
<job>OCA\Deck\Cron\DeleteCron</job>
@@ -54,11 +54,15 @@
<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,6 +29,7 @@ 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-stable31",
"nextcloud/ocp": "dev-master",
"psalm/phar": "^5.13"
},
"config": {

157
composer.lock generated
View File

@@ -4,146 +4,34 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "c89537a172cee5c19093b4ea0cb5365c",
"content-hash": "6950663d9d213151028e780637480220",
"packages": [
{
"name": "icecave/parity",
"version": "1.0.0",
"source": {
"type": "git",
"url": "https://github.com/icecave/parity.git",
"reference": "0109fef58b3230d23b20b2ac52ecdf477218d300"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/icecave/parity/zipball/0109fef58b3230d23b20b2ac52ecdf477218d300",
"reference": "0109fef58b3230d23b20b2ac52ecdf477218d300",
"shasum": ""
},
"require": {
"icecave/repr": "~1",
"php": ">=5.3"
},
"require-dev": {
"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",
"version": "6.4.2",
"source": {
"type": "git",
"url": "https://github.com/jsonrainbow/json-schema.git",
"reference": "a38c6198d53b09c0702f440585a4f4a5d9137bd9"
"reference": "ce1fd2d47799bb60668643bc6220f6278a4c1d02"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/a38c6198d53b09c0702f440585a4f4a5d9137bd9",
"reference": "a38c6198d53b09c0702f440585a4f4a5d9137bd9",
"url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/ce1fd2d47799bb60668643bc6220f6278a4c1d02",
"reference": "ce1fd2d47799bb60668643bc6220f6278a4c1d02",
"shasum": ""
},
"require": {
"icecave/parity": "1.0.0",
"marc-mabe/php-enum": "^2.0 || ^3.0 || ^4.0",
"php": ">=5.3.3"
"ext-json": "*",
"marc-mabe/php-enum": "^4.0",
"php": "^7.2 || ^8.0"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "~2.2.20 || ~2.19.0",
"friendsofphp/php-cs-fixer": "3.3.0",
"json-schema/json-schema-test-suite": "1.2.0",
"phpunit/phpunit": "^4.8.35"
"marc-mabe/php-enum-phpstan": "^2.0",
"phpspec/prophecy": "^1.19",
"phpstan/phpstan": "^1.12",
"phpunit/phpunit": "^8.5"
},
"bin": [
"bin/validate-json"
@@ -189,9 +77,9 @@
],
"support": {
"issues": "https://github.com/jsonrainbow/json-schema/issues",
"source": "https://github.com/jsonrainbow/json-schema/tree/6.0.0"
"source": "https://github.com/jsonrainbow/json-schema/tree/6.4.2"
},
"time": "2024-07-30T17:49:21+00:00"
"time": "2025-06-03T18:27:04+00:00"
},
{
"name": "marc-mabe/php-enum",
@@ -488,16 +376,16 @@
},
{
"name": "nextcloud/ocp",
"version": "dev-stable31",
"version": "dev-master",
"source": {
"type": "git",
"url": "https://github.com/nextcloud-deps/ocp.git",
"reference": "abd32429d794ede1d92b7b0a88a1070371c907b5"
"reference": "d927392a2a368c372ef80096171139d4287b2339"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/nextcloud-deps/ocp/zipball/abd32429d794ede1d92b7b0a88a1070371c907b5",
"reference": "abd32429d794ede1d92b7b0a88a1070371c907b5",
"url": "https://api.github.com/repos/nextcloud-deps/ocp/zipball/d927392a2a368c372ef80096171139d4287b2339",
"reference": "d927392a2a368c372ef80096171139d4287b2339",
"shasum": ""
},
"require": {
@@ -507,10 +395,11 @@
"psr/event-dispatcher": "^1.0",
"psr/log": "^3.0.2"
},
"default-branch": true,
"type": "library",
"extra": {
"branch-alias": {
"dev-stable31": "31.0.0-dev"
"dev-master": "33.0.0-dev"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -530,9 +419,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/stable31"
"source": "https://github.com/nextcloud-deps/ocp/tree/master"
},
"time": "2025-07-31T00:57:37+00:00"
"time": "2025-09-16T00:45:42+00:00"
},
{
"name": "nikic/php-parser",

View File

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

View File

@@ -129,3 +129,81 @@ 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,6 +302,9 @@ 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 "Personal Board" created for user by default', function() {
it('Can see the default "Welcome Board" created for user by default', function() {
cy.visit('/apps/deck')
const defaultBoard = 'Personal'
const defaultBoard = 'Welcome to Nextcloud Deck!'
cy.get('.app-navigation-entry-wrapper[icon=icon-deck]')
.find('ul.app-navigation-entry__children .app-navigation-entry:contains(' + defaultBoard + ')')

View File

@@ -0,0 +1,102 @@
{
"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,7 +102,11 @@ 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')
cy.get('.select input').type(`${query}`)
// Add delay to ensure the events are bound
cy.wait(1000)
cy.get('.select input').click().type(`${query}`)
cy.wait('@fetchRecipients', { timeout: 7000 })
cy.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`.
- 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`.
- The API is located at https://nextcloud.local/index.php/apps/deck/api/v1.0
- All request parameters are required, unless otherwise specified
@@ -733,6 +733,7 @@ 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
@@ -997,10 +998,12 @@ The request can fail with a bad request response for the following reasons:
#### Request data
| Parameter | Type | Description |
| --------- | ------- | --------------------------------------------- |
| type | String | The type of the attachement |
| file | Binary | File data to add as an attachment |
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. |
- 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
@@ -1022,12 +1025,13 @@ The request can fail with a bad request response for the following reasons:
#### Request data
| Parameter | Type | Description |
| --------- | ------- | --------------------------------------------- |
| type | String | The type of the attachement |
| file | Binary | File data to add as an attachment |
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. |
For now only `deck_file` is supported as an attachment type.
#### Response

BIN
img/sample-image.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 188 KiB

View File

@@ -9,11 +9,9 @@ OC.L10N.register(
"Missing a temporary folder" : "Адсутнічае часовая папка",
"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",
"copy" : "копія",
"Done" : "Гатова",
"File" : "Файл",
"Invalid date, date format must be YYYY-MM-DD" : "Памылковая дата, дата павінна быць у фармаце ГГГГ-ММ-ДД",
"Cancel" : "Скасаваць",
"Drop your files to upload" : "Перацягніце файлы для запампоўвання",
"File already exists" : "Файл ужо існуе",
@@ -52,7 +50,6 @@ OC.L10N.register(
"Reply" : "Адказаць",
"Update" : "Абнавіць",
"Description" : "Апісанне",
"Formatting help" : "Даведка па фармаціраванні",
"Later today {timeLocale}" : "Пазней сёння {timeLocale}",
"Set due date for later today" : "Задаць дату выканання на пазней сёння",
"Tomorrow {timeLocale}" : "Заўтра {timeLocale}",
@@ -60,7 +57,6 @@ 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" : "Рэдагаваць загаловак",
@@ -69,7 +65,6 @@ OC.L10N.register(
"Keyboard shortcut" : "Спалучэнне клавіш",
"Action" : "Дзеянне",
"Shift" : "Shift",
"Ctrl" : "Ctrl",
"Search" : "Пошук",
"Enter" : "Enter",
"Shared with you" : "Абагулена з вамі",
@@ -84,9 +79,6 @@ OC.L10N.register(
"Failed to upload {name}" : "Не ўдалося запампаваць {name}",
"Share" : "Абагуліць",
"Personal" : "Асабістыя",
"Example Task 3" : "Прыклад задання 3",
"Example Task 2" : "Прыклад задання 2",
"Example Task 1" : "Прыклад задання 1",
"Today" : "Сёння",
"Tomorrow" : "Заўтра"
},

View File

@@ -7,11 +7,9 @@
"Missing a temporary folder" : "Адсутнічае часовая папка",
"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",
"copy" : "копія",
"Done" : "Гатова",
"File" : "Файл",
"Invalid date, date format must be YYYY-MM-DD" : "Памылковая дата, дата павінна быць у фармаце ГГГГ-ММ-ДД",
"Cancel" : "Скасаваць",
"Drop your files to upload" : "Перацягніце файлы для запампоўвання",
"File already exists" : "Файл ужо існуе",
@@ -50,7 +48,6 @@
"Reply" : "Адказаць",
"Update" : "Абнавіць",
"Description" : "Апісанне",
"Formatting help" : "Даведка па фармаціраванні",
"Later today {timeLocale}" : "Пазней сёння {timeLocale}",
"Set due date for later today" : "Задаць дату выканання на пазней сёння",
"Tomorrow {timeLocale}" : "Заўтра {timeLocale}",
@@ -58,7 +55,6 @@
"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" : "Рэдагаваць загаловак",
@@ -67,7 +63,6 @@
"Keyboard shortcut" : "Спалучэнне клавіш",
"Action" : "Дзеянне",
"Shift" : "Shift",
"Ctrl" : "Ctrl",
"Search" : "Пошук",
"Enter" : "Enter",
"Shared with you" : "Абагулена з вамі",
@@ -82,9 +77,6 @@
"Failed to upload {name}" : "Не ўдалося запампаваць {name}",
"Share" : "Абагуліць",
"Personal" : "Асабістыя",
"Example Task 3" : "Прыклад задання 3",
"Example Task 2" : "Прыклад задання 2",
"Example Task 1" : "Прыклад задання 1",
"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 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}.",
"%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}.",
"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",
@@ -188,10 +188,6 @@ OC.L10N.register(
"Add Attachment" : "Tilføj vedhæftning",
"Choose attachment" : "Vælg en vedhæftning",
"Select Date" : "Vælg dato",
"Later today {timeLocale}" : "Senere i dag {timeLocale}",
"Tomorrow {timeLocale}" : "I morgen {timeLocale}",
"This weekend {timeLocale}" : "Denne weekend {timeLocale}",
"Next week {timeLocale}" : "Næste uge {timeLocale}",
"Set a due date" : "Angiv en forfaldsdato",
"Remove due date" : "Fjern forfaldsdato",
"Mark as done" : "Marker som færdig",

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 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}.",
"%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}.",
"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",
@@ -186,10 +186,6 @@
"Add Attachment" : "Tilføj vedhæftning",
"Choose attachment" : "Vælg en vedhæftning",
"Select Date" : "Vælg dato",
"Later today {timeLocale}" : "Senere i dag {timeLocale}",
"Tomorrow {timeLocale}" : "I morgen {timeLocale}",
"This weekend {timeLocale}" : "Denne weekend {timeLocale}",
"Next week {timeLocale}" : "Næste uge {timeLocale}",
"Set a due date" : "Angiv en forfaldsdato",
"Remove due date" : "Fjern forfaldsdato",
"Mark as done" : "Marker som færdig",

View File

@@ -373,7 +373,6 @@ OC.L10N.register(
"Note: Only the JSON format is supported for importing back into the Deck app." : "Megjegyzés: Csak a JSON formátum támogatott a Kártyák alkalmazásba való importáláskor.",
"Export" : "Exportálás",
"Loading filtered view" : "Szűrt nézet betöltése",
"Search for {searchQuery} in other boards" : "Keresés a(z) {searchQuery} kifejezésre a többi táblában",
"Search for {searchQuery} in all boards" : "Keresés a(z) {searchQuery} kifejezésre az összes táblában",
"No results found" : "Nincs találat",
"Deck board {name}\n* Last modified on {lastMod}" : "{name} kártyatábla\n* Legutóbb módosítva: {lastMod}",

View File

@@ -371,7 +371,6 @@
"Note: Only the JSON format is supported for importing back into the Deck app." : "Megjegyzés: Csak a JSON formátum támogatott a Kártyák alkalmazásba való importáláskor.",
"Export" : "Exportálás",
"Loading filtered view" : "Szűrt nézet betöltése",
"Search for {searchQuery} in other boards" : "Keresés a(z) {searchQuery} kifejezésre a többi táblában",
"Search for {searchQuery} in all boards" : "Keresés a(z) {searchQuery} kifejezésre az összes táblában",
"No results found" : "Nincs találat",
"Deck board {name}\n* Last modified on {lastMod}" : "{name} kártyatábla\n* Legutóbb módosítva: {lastMod}",

View File

@@ -6,19 +6,16 @@ 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",
@@ -29,9 +26,6 @@ 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,19 +4,16 @@
"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",
@@ -27,9 +24,6 @@
"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,10 +37,6 @@ OC.L10N.register(
"{user} has archived card {card} in list {stack} on board {board}" : "{user} ја архивираше картицата {card} во листата {stack} на таблата {board}",
"You have unarchived card {card} in list {stack} on board {board}" : "Ја вративте од архива картицата {card} во листата {stack} на таблата {board}",
"{user} has unarchived card {card} in list {stack} on board {board}" : "{user} ја врати од архива картицата {card} во листата {stack} на таблата {board}",
"You have marked the card {card} as done in list {stack} on board {board}" : "Ја означивте картицата {card} како завршена во листата {stack} на таблата {board}",
"{user} has marked card {card} as done in list {stack} on board {board}" : "{user} ја означи картичката {card} како завршена во листата {stack} на таблата {board}",
"You have marked the card {card} as undone in list {stack} on board {board}" : "Ја означивте картицата {card} како не-завршена во листата {stack} на таблата {board}",
"{user} has marked the card {card} as undone in list {stack} on board {board}" : "{user} ја означи картичката {card} како не-завршена во листата {stack} на таблата {board}",
"You have removed the due date of card {card}" : "Го избришавте датумот на истекување на картицата {card}",
"{user} has removed the due date of card {card}" : "{user} го избриша датумот на истекување на картицата {card}",
"You have set the due date of card {card} to {after}" : "Поставивте датум на истекување на картицата {card}",
@@ -69,9 +65,7 @@ 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 формата",
@@ -81,66 +75,35 @@ 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",
"Invalid file type. Only JSON files are allowed." : "Невалиден тип на датотека. Дозволени се само JSON датотеки.",
"Invalid JSON data" : "Невалидни JSON податоци",
"Failed to import board" : "Неуспешен увоз на табла",
"Cards due today" : "Картици со рок до денес",
"Cards due tomorrow" : "Картици со рок до утре",
"Upcoming cards" : "Престојни картици",
"Load more" : "Вчитај повеќе",
"Welcome to Nextcloud Deck!" : "Добредојдовте во Nextcloud Deck!",
"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" : "Прочитај повеќе",
"Custom lists - click to rename!" : "Прилагодени листи кликнете за преименување!",
"To Do" : "За правење",
"In Progress" : "Во тек",
"Done" : "Готово",
"1. Open to learn more about boards and cards" : "1. Отворете за да дознаете повеќе за таблите и картичките",
"2. Drag cards left and right, up and down" : "2. Влечете ги картичките лево и десно, горе и долу",
"3. Apply rich formatting and link content" : "3. Применете богато форматирање и поврзете содржина",
"4. Share, comment and collaborate!" : "4. Споделувајте, коментирајте и соработувајте!",
"Create your first card!" : "Креирајте ја вашата прва картичка!",
"This comment has more than %s characters.\nAdded as an attachment to the card with name %s.\nAccessible on URL: %s." : "Коментарот има повеќе од %s карактери.\nДодаден е како пролог на картицата со име %s.\nДостапен е на линк: %s.",
"Attachments" : "Прилози",
"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" : "Избери картица",
@@ -161,8 +124,6 @@ OC.L10N.register(
"Filter by tag" : "Филтрирај по ознака",
"Filter by assigned user" : "Филтрирај по назначени корисници",
"Unassigned" : "Неназначени",
"Filter by status" : "Филтрирај по статус",
"Open and completed" : "Отворени и завршени",
"Open" : "Отвори",
"Completed" : "Завршено",
"Filter by due date" : "Филтрирај по краен рок",
@@ -172,17 +133,12 @@ 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" : "Детали",
"Currently present people" : "Моментално приситни корисници",
"Loading board" : "Вчитување на табла",
"Loading board" : "Вчирување на табла",
"Board not found" : "Таблата не е пронајдена",
"Create a new list to add cards to this board" : "Додадете нова листа за да додадете картици на таблата",
"Sharing" : "Споделување",
@@ -193,29 +149,19 @@ 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" : "Мора да се внесе наслов и боја",
@@ -223,39 +169,32 @@ 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…)" : "(Снимање…)",
@@ -266,135 +205,67 @@ 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" : "Постави краен рок за овој викенд",
"Next week {timeLocale}" : "Следна недела {timeLocale}",
"Set due date for next week" : "Постави краен рок за следната недела",
"Set due date for this weekend" : "Постави рок за овој викенд",
"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",
"Scroll sideways" : "Лизгај странично",
"Navigate between cards" : "Навигација помеѓу картиците",
"Esc" : "Esc",
"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" : "Избриши табла",
"Importing board..." : "Увезување табла...",
"Board imported successfully" : "Таблата е успешно увезена",
"Import 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 as JSON" : "Извези како JSON",
"Export as CSV" : "Извези како CSV",
"Note: Only the JSON format is supported for importing back into the Deck app." : "Забелешка: Поддржан е само JSON формат за увоз назад во апликацијата Deck.",
"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" : "Креирајте картица",
@@ -402,7 +273,6 @@ 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,10 +35,6 @@
"{user} has archived card {card} in list {stack} on board {board}" : "{user} ја архивираше картицата {card} во листата {stack} на таблата {board}",
"You have unarchived card {card} in list {stack} on board {board}" : "Ја вративте од архива картицата {card} во листата {stack} на таблата {board}",
"{user} has unarchived card {card} in list {stack} on board {board}" : "{user} ја врати од архива картицата {card} во листата {stack} на таблата {board}",
"You have marked the card {card} as done in list {stack} on board {board}" : "Ја означивте картицата {card} како завршена во листата {stack} на таблата {board}",
"{user} has marked card {card} as done in list {stack} on board {board}" : "{user} ја означи картичката {card} како завршена во листата {stack} на таблата {board}",
"You have marked the card {card} as undone in list {stack} on board {board}" : "Ја означивте картицата {card} како не-завршена во листата {stack} на таблата {board}",
"{user} has marked the card {card} as undone in list {stack} on board {board}" : "{user} ја означи картичката {card} како не-завршена во листата {stack} на таблата {board}",
"You have removed the due date of card {card}" : "Го избришавте датумот на истекување на картицата {card}",
"{user} has removed the due date of card {card}" : "{user} го избриша датумот на истекување на картицата {card}",
"You have set the due date of card {card} to {after}" : "Поставивте датум на истекување на картицата {card}",
@@ -67,9 +63,7 @@
"{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 формата",
@@ -79,66 +73,35 @@
"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",
"Invalid file type. Only JSON files are allowed." : "Невалиден тип на датотека. Дозволени се само JSON датотеки.",
"Invalid JSON data" : "Невалидни JSON податоци",
"Failed to import board" : "Неуспешен увоз на табла",
"Cards due today" : "Картици со рок до денес",
"Cards due tomorrow" : "Картици со рок до утре",
"Upcoming cards" : "Престојни картици",
"Load more" : "Вчитај повеќе",
"Welcome to Nextcloud Deck!" : "Добредојдовте во Nextcloud Deck!",
"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" : "Прочитај повеќе",
"Custom lists - click to rename!" : "Прилагодени листи кликнете за преименување!",
"To Do" : "За правење",
"In Progress" : "Во тек",
"Done" : "Готово",
"1. Open to learn more about boards and cards" : "1. Отворете за да дознаете повеќе за таблите и картичките",
"2. Drag cards left and right, up and down" : "2. Влечете ги картичките лево и десно, горе и долу",
"3. Apply rich formatting and link content" : "3. Применете богато форматирање и поврзете содржина",
"4. Share, comment and collaborate!" : "4. Споделувајте, коментирајте и соработувајте!",
"Create your first card!" : "Креирајте ја вашата прва картичка!",
"This comment has more than %s characters.\nAdded as an attachment to the card with name %s.\nAccessible on URL: %s." : "Коментарот има повеќе од %s карактери.\nДодаден е како пролог на картицата со име %s.\nДостапен е на линк: %s.",
"Attachments" : "Прилози",
"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" : "Избери картица",
@@ -159,8 +122,6 @@
"Filter by tag" : "Филтрирај по ознака",
"Filter by assigned user" : "Филтрирај по назначени корисници",
"Unassigned" : "Неназначени",
"Filter by status" : "Филтрирај по статус",
"Open and completed" : "Отворени и завршени",
"Open" : "Отвори",
"Completed" : "Завршено",
"Filter by due date" : "Филтрирај по краен рок",
@@ -170,17 +131,12 @@
"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" : "Детали",
"Currently present people" : "Моментално приситни корисници",
"Loading board" : "Вчитување на табла",
"Loading board" : "Вчирување на табла",
"Board not found" : "Таблата не е пронајдена",
"Create a new list to add cards to this board" : "Додадете нова листа за да додадете картици на таблата",
"Sharing" : "Споделување",
@@ -191,29 +147,19 @@
"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" : "Мора да се внесе наслов и боја",
@@ -221,39 +167,32 @@
"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…)" : "(Снимање…)",
@@ -264,135 +203,67 @@
"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" : "Постави краен рок за овој викенд",
"Next week {timeLocale}" : "Следна недела {timeLocale}",
"Set due date for next week" : "Постави краен рок за следната недела",
"Set due date for this weekend" : "Постави рок за овој викенд",
"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",
"Scroll sideways" : "Лизгај странично",
"Navigate between cards" : "Навигација помеѓу картиците",
"Esc" : "Esc",
"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" : "Избриши табла",
"Importing board..." : "Увезување табла...",
"Board imported successfully" : "Таблата е успешно увезена",
"Import 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 as JSON" : "Извези како JSON",
"Export as CSV" : "Извези како CSV",
"Note: Only the JSON format is supported for importing back into the Deck app." : "Забелешка: Поддржан е само JSON формат за увоз назад во апликацијата Deck.",
"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" : "Креирајте картица",
@@ -400,7 +271,6 @@
"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

@@ -266,7 +266,6 @@ OC.L10N.register(
"{count} comments, {unread} unread" : "{count} reacties, {unread} ongelezen",
"Todo items" : "Te doen onderwerpen",
"Edit card title" : "Wijzig de titel van de kaart",
"Open link" : "Open link",
"Card deleted" : "Kaart verwijderd",
"Edit title" : "Titel bewerken",
"Assign to me" : "Aan mij toewijzen",
@@ -280,7 +279,6 @@ OC.L10N.register(
"Shift" : "Shift",
"Ctrl" : "Ctrl",
"Search" : "Zoeken",
"Enter" : "Enter",
"All boards" : "Alle borden",
"Archived boards" : "Gearchiveerde borden",
"Shared with you" : "Deelde met jou",

View File

@@ -264,7 +264,6 @@
"{count} comments, {unread} unread" : "{count} reacties, {unread} ongelezen",
"Todo items" : "Te doen onderwerpen",
"Edit card title" : "Wijzig de titel van de kaart",
"Open link" : "Open link",
"Card deleted" : "Kaart verwijderd",
"Edit title" : "Titel bewerken",
"Assign to me" : "Aan mij toewijzen",
@@ -278,7 +277,6 @@
"Shift" : "Shift",
"Ctrl" : "Ctrl",
"Search" : "Zoeken",
"Enter" : "Enter",
"All boards" : "Alle borden",
"Archived boards" : "Gearchiveerde borden",
"Shared with you" : "Deelde met jou",

View File

@@ -0,0 +1,67 @@
<?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,10 +10,12 @@ 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 {
@@ -22,6 +24,8 @@ class BoardController extends ApiController {
IRequest $request,
private BoardService $boardService,
private PermissionService $permissionService,
private BoardImportService $boardImportService,
private IL10N $l10n,
private $userId,
) {
parent::__construct($appName, $request);
@@ -163,4 +167,62 @@ 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((int)$this->request->getParam('cardId'), (int)$stackId, (int)$order);
$card = $this->cardService->reorder($this->request->getParam('cardId'), $stackId, $order);
return new DataResponse($card, HTTP::STATUS_OK);
}
}

View File

@@ -77,18 +77,33 @@ class AssignmentMapper extends DeckMapper implements IPermissionMapper {
}
public function deleteByParticipantOnBoard(string $participant, int $boardId, $type = Assignment::TYPE_USER) {
$qb = $this->db->getQueryBuilder();
// 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
$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', $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();
->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();
}
}

View File

@@ -131,7 +131,11 @@ class CardMapper extends QBMapper implements IPermissionMapper {
return $card;
}
public function findAll($stackId, $limit = null, $offset = null, $since = -1) {
/**
* @return Card[]
* @throws \OCP\DB\Exception
*/
public function findAll($stackId, ?int $limit = null, ?int $offset = null, int $since = -1) {
$qb = $this->db->getQueryBuilder();
$qb->select('*')
->from('deck_cards')
@@ -146,6 +150,32 @@ 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,6 +15,7 @@ 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,12 +77,10 @@ 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, $limit = null, $offset = null): array {
public function findAll($boardId, ?int $limit = null, ?int $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('Personal'), $this->userId, '0087C5');
$this->defaultBoardService->createDefaultBoard($this->l10n->t('Welcome to Nextcloud Deck!'), $this->userId, 'bf678b');
}
} catch (\Throwable $e) {
$this->logger->error('Could not create default board', ['exception' => $e]);

View File

@@ -0,0 +1,78 @@
<?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' || $notification->getObjectType() === 'activity_notification') {
if ($notification->getApp() !== 'deck') {
throw new UnknownNotificationException();
}
$notification->setIcon($this->url->getAbsoluteURL($this->url->imagePath('deck', 'deck-dark.svg')));

View File

@@ -64,6 +64,7 @@ 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,6 +90,7 @@ 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,6 +762,8 @@ 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(), true);
$this->changeHelper->cardChanged($card->getId());
$this->eventDispatcher->dispatchTyped(new CardUpdatedEvent($card, $changes->getBefore()));
@@ -418,11 +418,12 @@ 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));
$this->eventDispatcher->dispatchTyped(new CardUpdatedEvent($card, $changes->getBefore()));
return $update;
}
@@ -438,10 +439,9 @@ class CardService {
* @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException
* @throws BadRequestException
*/
public function reorder(int $id, int $stackId, int $order) {
public function reorder($id, $stackId, $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);
$cards = $this->cardMapper->findAll($stackId);
$cardsToReorder = $this->cardMapper->findAll($stackId);
$result = [];
$i = 0;
foreach ($cards as $card) {
if ($card->getArchived()) {
foreach ($cardsToReorder as $cardToReorder) {
if ($cardToReorder->getArchived()) {
throw new StatusException('Operation not allowed. This card is archived.');
}
if ($card->id === $id) {
$card->setOrder($order);
$card->setLastModified(time());
if ($cardToReorder->id === $id) {
$cardToReorder->setOrder($order);
$cardToReorder->setLastModified(time());
}
if ($i === $order) {
$i++;
}
if ($card->id !== $id) {
$card->setOrder($i++);
if ($cardToReorder->id !== $id) {
$cardToReorder->setOrder($i++);
}
$this->cardMapper->update($card);
$result[$card->getOrder()] = $card;
$this->cardMapper->update($cardToReorder);
$result[$cardToReorder->getOrder()] = $cardToReorder;
}
$this->changeHelper->cardChanged($id, false);
$this->eventDispatcher->dispatchTyped(new CardUpdatedEvent($card));
$this->eventDispatcher->dispatchTyped(new CardUpdatedEvent($card, $changes->getBefore()));
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));
$this->eventDispatcher->dispatchTyped(new CardUpdatedEvent($card, $changes->getBefore()));
return $newCard;
}
@@ -534,12 +534,13 @@ 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));
$this->eventDispatcher->dispatchTyped(new CardUpdatedEvent($card, $changes->getBefore()));
return $newCard;
}
@@ -559,13 +560,14 @@ 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));
$this->eventDispatcher->dispatchTyped(new CardUpdatedEvent($card, $changes->getBefore()));
return $newCard;
}
@@ -585,12 +587,13 @@ 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));
$this->eventDispatcher->dispatchTyped(new CardUpdatedEvent($card, $changes->getBefore()));
return $newCard;
}

View File

@@ -9,6 +9,7 @@ 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;
@@ -21,6 +22,8 @@ class DefaultBoardService {
private $cardService;
private $config;
private $l10n;
private LabelService $labelService;
private AttachmentService $attachmentService;
public function __construct(
IL10N $l10n,
@@ -29,6 +32,8 @@ class DefaultBoardService {
StackService $stackService,
CardService $cardService,
IConfig $config,
LabelService $labelService,
AttachmentService $attachmentService,
) {
$this->boardService = $boardService;
$this->stackService = $stackService;
@@ -36,6 +41,8 @@ class DefaultBoardService {
$this->config = $config;
$this->boardMapper = $boardMapper;
$this->l10n = $l10n;
$this->labelService = $labelService;
$this->attachmentService = $attachmentService;
}
/**
@@ -59,10 +66,13 @@ 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
@@ -71,19 +81,71 @@ class DefaultBoardService {
* @throws BadRequestException
*/
public function createDefaultBoard(string $title, string $userId, string $color) {
$defaultBoard = $this->boardService->create($title, $userId, $color);
$defaultStacks = [];
$defaultCards = [];
$boardData = $this->getDefaultBoardData();
/** @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!'),
];
$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);
foreach ($boardData['addition_labels'] as $labelData) {
$additionLabels[] = $this->labelService->create(
$translatedLabelTitles[$labelData['title']] ?? $labelData['title'],
$labelData['color'],
$boardId
);
}
$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);
$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');
}
}
}
return $defaultBoard;
}

View File

@@ -162,7 +162,15 @@ class FilesAppService implements IAttachmentService, ICustomAttachmentService {
}
public function create(Attachment $attachment) {
$file = $this->getUploadedFile();
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();
}
$fileName = $file['name'];
// get shares for current card

View File

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

View File

@@ -0,0 +1,81 @@
{
"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": "1.15.3",
"version": "2.0.0-dev.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "deck",
"version": "1.15.3",
"version": "2.0.0-dev.0",
"license": "agpl",
"dependencies": {
"@babel/polyfill": "^7.12.1",
"@babel/runtime": "^7.26.0",
"@babel/runtime": "^7.27.1",
"@nextcloud/auth": "^2.4.0",
"@nextcloud/axios": "^2.5.1",
"@nextcloud/capabilities": "^1.2.0",
"@nextcloud/dialogs": "^6.0.1",
"@nextcloud/event-bus": "^3.3.1",
"@nextcloud/dialogs": "^6.3.1",
"@nextcloud/event-bus": "^3.3.2",
"@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.3",
"dompurify": "^3.2.5",
"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.12",
"@nextcloud/eslint-config": "^8.4.1",
"@nextcloud/cypress": "^1.0.0-beta.15",
"@nextcloud/eslint-config": "^8.4.2",
"@nextcloud/stylelint-config": "^3.0.1",
"@nextcloud/webpack-vue-config": "^6.2.0",
"@relative-ci/agent": "^4.2.14",
"@nextcloud/webpack-vue-config": "^6.3.0",
"@relative-ci/agent": "^4.3.1",
"@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": "^4.2.0",
"eslint-webpack-plugin": "^5.0.1",
"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.27.1",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
"integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
"version": "7.26.2",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
"integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-validator-identifier": "^7.27.1",
"@babel/helper-validator-identifier": "^7.25.9",
"js-tokens": "^4.0.0",
"picocolors": "^1.1.1"
"picocolors": "^1.0.0"
},
"engines": {
"node": ">=6.9.0"
@@ -536,18 +536,18 @@
}
},
"node_modules/@babel/helper-string-parser": {
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
"integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
"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==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-identifier": {
"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==",
"version": "7.25.9",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
"integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@@ -579,26 +579,26 @@
}
},
"node_modules/@babel/helpers": {
"version": "7.27.6",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz",
"integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==",
"version": "7.27.0",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz",
"integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/template": "^7.27.2",
"@babel/types": "^7.27.6"
"@babel/template": "^7.27.0",
"@babel/types": "^7.27.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/parser": {
"version": "7.27.5",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz",
"integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==",
"version": "7.27.0",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz",
"integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==",
"license": "MIT",
"dependencies": {
"@babel/types": "^7.27.3"
"@babel/types": "^7.27.0"
},
"bin": {
"parser": "bin/babel-parser.js"
@@ -1919,24 +1919,24 @@
"peer": true
},
"node_modules/@babel/runtime": {
"version": "7.27.6",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz",
"integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==",
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz",
"integrity": "sha512-1x3D2xEk2fRo3PAhwQwu5UubzgiVWSXTBfWpVd2Mx2AzRqJuDJCsgaDVZ7HB5iGzDW1Hl1sWN2mFyKjmR9uAog==",
"license": "MIT",
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/template": {
"version": "7.27.2",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz",
"integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
"version": "7.27.0",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz",
"integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.27.1",
"@babel/parser": "^7.27.2",
"@babel/types": "^7.27.1"
"@babel/code-frame": "^7.26.2",
"@babel/parser": "^7.27.0",
"@babel/types": "^7.27.0"
},
"engines": {
"node": ">=6.9.0"
@@ -1962,13 +1962,13 @@
}
},
"node_modules/@babel/types": {
"version": "7.27.6",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz",
"integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==",
"version": "7.27.0",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz",
"integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==",
"license": "MIT",
"dependencies": {
"@babel/helper-string-parser": "^7.27.1",
"@babel/helper-validator-identifier": "^7.27.1"
"@babel/helper-string-parser": "^7.25.9",
"@babel/helper-validator-identifier": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -2377,9 +2377,9 @@
"license": "MIT"
},
"node_modules/@grpc/grpc-js": {
"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==",
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.13.2.tgz",
"integrity": "sha512-nnR5nmL6lxF8YBqb6gWvEgLdLh/Fn+kvAdX5hUOnt48sNSb0riz/93ASd2E5gvanPA41X6Yp25bIfGRp1SMb2g==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -2391,9 +2391,9 @@
}
},
"node_modules/@grpc/proto-loader": {
"version": "0.7.15",
"resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz",
"integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==",
"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==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -4886,10 +4886,11 @@
"integrity": "sha512-qZ72SFTgUAZ5a7Tj6kf2SHLetiH5S6f8G5frB2SPQ3EyF02kxdyBFf4Tz4banE3xCgGnKgWLt//a6VuYHKYJTg=="
},
"node_modules/@types/eslint": {
"version": "8.56.10",
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz",
"integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==",
"version": "9.6.1",
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz",
"integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/estree": "*",
"@types/json-schema": "*"
@@ -4964,11 +4965,10 @@
"peer": true
},
"node_modules/@types/http-proxy": {
"version": "1.17.16",
"resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz",
"integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==",
"version": "1.17.15",
"resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz",
"integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"@types/node": "*"
@@ -5107,9 +5107,9 @@
"peer": true
},
"node_modules/@types/semver": {
"version": "7.7.0",
"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.0.tgz",
"integrity": "sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==",
"version": "7.5.8",
"resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz",
"integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==",
"license": "MIT"
},
"node_modules/@types/send": {
@@ -5402,11 +5402,10 @@
}
},
"node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"balanced-match": "^1.0.0"
@@ -6409,11 +6408,15 @@
}
},
"node_modules/available-typed-arrays": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
"integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
"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==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"possible-typed-array-names": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
},
@@ -6437,9 +6440,9 @@
"dev": true
},
"node_modules/axios": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz",
"integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==",
"version": "1.8.2",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.8.2.tgz",
"integrity": "sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==",
"license": "MIT",
"dependencies": {
"follow-redirects": "^1.15.6",
@@ -6896,9 +6899,7 @@
"peer": true
},
"node_modules/brace-expansion": {
"version": "1.1.12",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
"integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
"version": "1.1.11",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -7261,16 +7262,48 @@
}
},
"node_modules/call-bind": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
"integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz",
"integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==",
"dev": true,
"license": "MIT",
"dependencies": {
"call-bind-apply-helpers": "^1.0.0",
"es-define-property": "^1.0.0",
"es-errors": "^1.3.0",
"function-bind": "^1.1.2",
"get-intrinsic": "^1.2.4",
"set-function-length": "^1.2.1"
"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"
},
"engines": {
"node": ">= 0.4"
@@ -8840,9 +8873,9 @@
}
},
"node_modules/dockerode": {
"version": "4.0.7",
"resolved": "https://registry.npmjs.org/dockerode/-/dockerode-4.0.7.tgz",
"integrity": "sha512-R+rgrSRTRdU5mH14PZTCPZtW/zw3HDWNTS/1ZAQpL/5Upe/ye5K9WQkIysu4wBoiMwKynsz0a8qWuGsHgEvSAA==",
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/dockerode/-/dockerode-4.0.5.tgz",
"integrity": "sha512-ZPmKSr1k1571Mrh7oIBS/j0AqAccoecY2yH420ni5j1KyNMgnoTh4Nu4FWunh0HZIJmRSmSysJjBIpa/zyWUEA==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -8978,6 +9011,21 @@
"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",
@@ -9036,11 +9084,10 @@
}
},
"node_modules/editorconfig/node_modules/brace-expansion": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
"dev": true,
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
}
@@ -9313,13 +9360,11 @@
}
},
"node_modules/es-define-property": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
"integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
"integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
"dev": true,
"dependencies": {
"get-intrinsic": "^1.2.4"
},
"license": "MIT",
"engines": {
"node": ">= 0.4"
}
@@ -9339,6 +9384,19 @@
"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",
@@ -9869,19 +9927,20 @@
}
},
"node_modules/eslint-webpack-plugin": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-4.2.0.tgz",
"integrity": "sha512-rsfpFQ01AWQbqtjgPRr2usVRxhWDuG0YDYcG8DJOteD3EFnpeuYuOwk0PQiN7PRBTqS6ElNdtPZPggj8If9WnA==",
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-5.0.1.tgz",
"integrity": "sha512-Ur100Vi+z0uP7j4Z8Ccah0pXmNHhl3f7P2hCYZj3mZCOSc33G5c1R/vZ4KCapwWikPgRyD4dkangx6JW3KaVFQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/eslint": "^8.56.10",
"@types/eslint": "^9.6.1",
"jest-worker": "^29.7.0",
"micromatch": "^4.0.5",
"micromatch": "^4.0.8",
"normalize-path": "^3.0.0",
"schema-utils": "^4.2.0"
"schema-utils": "^4.3.0"
},
"engines": {
"node": ">= 14.15.0"
"node": ">= 18.12.0"
},
"funding": {
"type": "opencollective",
@@ -9893,15 +9952,16 @@
}
},
"node_modules/eslint-webpack-plugin/node_modules/ajv": {
"version": "8.12.0",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
"integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
"version": "8.17.1",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
"integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
"dev": true,
"license": "MIT",
"dependencies": {
"fast-deep-equal": "^3.1.1",
"fast-deep-equal": "^3.1.3",
"fast-uri": "^3.0.1",
"json-schema-traverse": "^1.0.0",
"require-from-string": "^2.0.2",
"uri-js": "^4.2.2"
"require-from-string": "^2.0.2"
},
"funding": {
"type": "github",
@@ -9913,6 +9973,7 @@
"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"
},
@@ -9948,13 +10009,15 @@
"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
"dev": true,
"license": "MIT"
},
"node_modules/eslint-webpack-plugin/node_modules/schema-utils": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz",
"integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==",
"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==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/json-schema": "^7.0.9",
"ajv": "^8.9.0",
@@ -9962,7 +10025,7 @@
"ajv-keywords": "^5.1.0"
},
"engines": {
"node": ">= 12.13.0"
"node": ">= 10.13.0"
},
"funding": {
"type": "opencollective",
@@ -10303,7 +10366,6 @@
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
"integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
"dev": true,
"license": "MIT",
"peer": true
},
"node_modules/events": {
@@ -10555,8 +10617,7 @@
"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,
"peer": true
"dev": true
},
"node_modules/fast-xml-parser": {
"version": "4.5.3",
@@ -10811,13 +10872,20 @@
}
},
"node_modules/for-each": {
"version": "0.3.3",
"resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
"integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
"version": "0.3.5",
"resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz",
"integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"is-callable": "^1.1.3"
"is-callable": "^1.2.7"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/foreground-child": {
@@ -11018,16 +11086,22 @@
}
},
"node_modules/get-intrinsic": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
"integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
"integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
"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",
"has-proto": "^1.0.1",
"has-symbols": "^1.0.3",
"hasown": "^2.0.0"
"get-proto": "^1.0.1",
"gopd": "^1.2.0",
"has-symbols": "^1.1.0",
"hasown": "^2.0.2",
"math-intrinsics": "^1.1.0"
},
"engines": {
"node": ">= 0.4"
@@ -11045,6 +11119,20 @@
"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",
@@ -11255,12 +11343,13 @@
"peer": true
},
"node_modules/gopd": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
"integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
"integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
"dev": true,
"dependencies": {
"get-intrinsic": "^1.1.3"
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -11331,6 +11420,7 @@
"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"
},
@@ -11339,10 +11429,11 @@
}
},
"node_modules/has-symbols": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
"integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
},
@@ -11351,13 +11442,14 @@
}
},
"node_modules/has-tostringtag": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
"integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
"integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"has-symbols": "^1.0.2"
"has-symbols": "^1.0.3"
},
"engines": {
"node": ">= 0.4"
@@ -11633,7 +11725,6 @@
"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",
@@ -11675,7 +11766,6 @@
"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"
@@ -12369,13 +12459,14 @@
}
},
"node_modules/is-typed-array": {
"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==",
"version": "1.1.15",
"resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
"integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"which-typed-array": "^1.1.11"
"which-typed-array": "^1.1.16"
},
"engines": {
"node": ">= 0.4"
@@ -14296,11 +14387,10 @@
}
},
"node_modules/js-beautify/node_modules/brace-expansion": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
"dev": true,
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0"
}
@@ -14860,9 +14950,9 @@
}
},
"node_modules/long": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz",
"integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==",
"version": "5.3.1",
"resolved": "https://registry.npmjs.org/long/-/long-5.3.1.tgz",
"integrity": "sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng==",
"dev": true,
"license": "Apache-2.0"
},
@@ -14967,6 +15057,16 @@
"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,
@@ -16587,22 +16687,83 @@
}
},
"node_modules/pbkdf2": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz",
"integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==",
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.3.tgz",
"integrity": "sha512-wfRLBZ0feWRhCIkoMB6ete7czJcnNnqRpcoWQBLqatqXXmelSRqfdDK4F3u9T2s2cXas/hQJcryI/4lAL+XTlA==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"create-hash": "^1.1.2",
"create-hmac": "^1.1.4",
"ripemd160": "^2.0.1",
"safe-buffer": "^5.0.1",
"sha.js": "^2.4.8"
"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"
},
"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",
@@ -16718,6 +16879,17 @@
"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",
@@ -17034,9 +17206,9 @@
"dev": true
},
"node_modules/protobufjs": {
"version": "7.5.3",
"resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.3.tgz",
"integrity": "sha512-sildjKwVqOI2kmFDiXQ6aEB0fjYTafpEvIBs8tOR8qI4spuL9OPROLVu2qZqi/xgCfsHIwVqlaF8JBjWFHnKbw==",
"version": "7.4.0",
"resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz",
"integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==",
"dev": true,
"hasInstallScript": true,
"license": "BSD-3-Clause",
@@ -19728,6 +19900,52 @@
"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",
@@ -20050,15 +20268,16 @@
}
},
"node_modules/typed-array-buffer": {
"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==",
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz",
"integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"call-bind": "^1.0.2",
"get-intrinsic": "^1.2.1",
"is-typed-array": "^1.1.10"
"call-bound": "^1.0.3",
"es-errors": "^1.3.0",
"is-typed-array": "^1.1.14"
},
"engines": {
"node": ">= 0.4"
@@ -20955,18 +21174,17 @@
}
},
"node_modules/webdav/node_modules/brace-expansion": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
"license": "MIT",
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
"dependencies": {
"balanced-match": "^1.0.0"
}
},
"node_modules/webdav/node_modules/entities": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-6.0.0.tgz",
"integrity": "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==",
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz",
"integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==",
"license": "BSD-2-Clause",
"engines": {
"node": ">=0.12"
@@ -21460,17 +21678,20 @@
}
},
"node_modules/which-typed-array": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz",
"integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==",
"version": "1.1.19",
"resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz",
"integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==",
"dev": true,
"license": "MIT",
"peer": true,
"dependencies": {
"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"
"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"
},
"engines": {
"node": ">= 0.4"

View File

@@ -1,7 +1,7 @@
{
"name": "deck",
"description": "",
"version": "1.15.3",
"version": "2.0.0-dev.0",
"authors": [
{
"name": "Julius Härtl",
@@ -31,12 +31,12 @@
},
"dependencies": {
"@babel/polyfill": "^7.12.1",
"@babel/runtime": "^7.26.0",
"@babel/runtime": "^7.27.1",
"@nextcloud/auth": "^2.4.0",
"@nextcloud/axios": "^2.5.1",
"@nextcloud/capabilities": "^1.2.0",
"@nextcloud/dialogs": "^6.0.1",
"@nextcloud/event-bus": "^3.3.1",
"@nextcloud/dialogs": "^6.3.1",
"@nextcloud/event-bus": "^3.3.2",
"@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.3",
"dompurify": "^3.2.5",
"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.12",
"@nextcloud/eslint-config": "^8.4.1",
"@nextcloud/cypress": "^1.0.0-beta.15",
"@nextcloud/eslint-config": "^8.4.2",
"@nextcloud/stylelint-config": "^3.0.1",
"@nextcloud/webpack-vue-config": "^6.2.0",
"@relative-ci/agent": "^4.2.14",
"@nextcloud/webpack-vue-config": "^6.3.0",
"@relative-ci/agent": "^4.3.1",
"@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": "^4.2.0",
"eslint-webpack-plugin": "^5.0.1",
"jest": "^29.7.0",
"jest-serializer-vue": "^3.1.0",
"stylelint-webpack-plugin": "^5.0.1",

View File

@@ -107,10 +107,6 @@ 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

@@ -5,7 +5,7 @@
<template>
<div class="attachments-drag-zone"
@dragover.prevent="!isDraggingOver && (isDraggingOver = true)"
@dragover.prevent="handleDragOver"
@dragleave.prevent="isDraggingOver && (isDraggingOver = false)"
@drop.prevent="handleDropFiles">
<slot />
@@ -83,6 +83,13 @@ export default {
},
},
methods: {
handleDragOver(event) {
if (!event.dataTransfer || event.dataTransfer.items?.length <= 0) {
return
}
!this.isDraggingOver && (this.isDraggingOver = true)
},
handleDropFiles(event) {
event.dataTransfer.dropEffect = 'copy'
this.isDraggingOver = false

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/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 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 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,18 +276,15 @@ 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;
}
/**
@@ -297,11 +294,15 @@ 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;
@@ -309,16 +310,13 @@ export default {
position: relative;
.smooth-dnd-container.vertical {
flex-grow: 1;
$margin-x: calc($stack-gap * -1);
display: flex;
flex-direction: column;
// Margin left instead of padidng to avoid jumps on dropping a card
margin-left: $stack-spacing;
padding-right: $stack-spacing;
overflow-x: hidden;
gap: $stack-gap;
padding: $stack-gap;
margin: 0 $margin-x;
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/ShareVariant.vue'
import TagsIcon from 'vue-material-design-icons/TagMultiple.vue'
import TrashIcon from 'vue-material-design-icons/Delete.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'
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-show="showAddCard" class="stack__card-add">
<div v-if="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/Archive.vue'
import ArchiveIcon from 'vue-material-design-icons/ArchiveOutline.vue'
import CardPlusOutline from 'vue-material-design-icons/CardPlusOutline.vue'
import { NcActions, NcActionButton, NcModal } from '@nextcloud/vue'
import { showError, showUndo } from '@nextcloud/dialogs'
@@ -365,37 +365,31 @@ export default {
@import './../../css/variables';
.stack {
width: $stack-width + $stack-spacing * 3;
width: 100%;
}
.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: calc(100% - 16px);
height: 20px;
top: 30px;
left: 0px;
width: 100%;
height: $stack-gap;
bottom: 0;
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%);
}
background-image: linear-gradient(180deg, var(--color-main-background) 0%, transparent 100%);
transform: translateY(100%);
}
& > * {
@@ -404,8 +398,10 @@ export default {
}
h3, form {
flex-grow: 1;
flex: 1 1 auto;
min-width: 0;
display: flex;
align-items: center;
cursor: inherit;
margin: 0;
@@ -418,9 +414,8 @@ export default {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: calc($stack-width - 60px);
border-radius: 3px;
padding: 4px 4px;
padding: $card-padding;
font-size: var(--default-font-size);
&:focus-visible {
@@ -430,7 +425,6 @@ export default {
}
form {
margin: -4px;
input {
font-weight: bold;
padding: 0 6px;
@@ -453,14 +447,25 @@ export default {
flex-shrink: 0;
z-index: 100;
display: flex;
margin-bottom: 5px;
padding-top: var(--default-grid-baseline);
padding-bottom: $stack-gap;
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);
@@ -481,7 +486,6 @@ 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/AccountMultiple.vue'
import AccountMultiple from 'vue-material-design-icons/AccountMultipleOutline.vue'
export default defineComponent({
name: 'AssignmentSelector',

View File

@@ -12,6 +12,7 @@
: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"
@@ -37,7 +38,8 @@
:name="t('deck', 'Details')">
<CardSidebarTabDetails :card="currentCard" />
<template #icon>
<HomeIcon :size="20" />
<HomeIcon v-if="activeTabId === 'details'" :size="20" />
<HomeOutlineIcon v-else :size="20" />
</template>
</NcAppSidebarTab>
@@ -54,7 +56,8 @@
:order="2"
:name="t('deck', 'Comments')">
<template #icon>
<CommentIcon :size="20" />
<CommentIcon v-if="activeTabId === 'comments'" :size="20" />
<CommentOutlineIcon v-else :size="20" />
</template>
<CardSidebarTabComments :card="currentCard" :tab-query="tabQuery" />
</NcAppSidebarTab>
@@ -84,7 +87,9 @@ 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'
@@ -107,7 +112,9 @@ export default {
ActivityIcon,
AttachmentIcon,
CommentIcon,
CommentOutlineIcon,
HomeIcon,
HomeOutlineIcon,
CardMenuEntries,
},
mixins: [relativeDate],
@@ -133,6 +140,7 @@ 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/Reply.vue'
import ReplyIcon from 'vue-material-design-icons/ReplyOutline.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/Archive.vue'
import ArchiveIcon from 'vue-material-design-icons/ArchiveOutline.vue'
import Plus from 'vue-material-design-icons/Plus.vue'
import Calendar from 'vue-material-design-icons/Calendar.vue'
import CalendarCheck from 'vue-material-design-icons/CalendarCheck.vue'
import Calendar from 'vue-material-design-icons/CalendarOutline.vue'
import CalendarCheck from 'vue-material-design-icons/CalendarCheckOutline.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/TagMultiple.vue'
import TagMultiple from 'vue-material-design-icons/TagMultipleOutline.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/AccountMultiple.vue'
import AccountMultiple from 'vue-material-design-icons/AccountMultipleOutline.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/Comment.vue'
import CommentUnreadIcon from 'vue-material-design-icons/CommentAccount.vue'
import CommentIcon from 'vue-material-design-icons/CommentOutline.vue'
import CommentUnreadIcon from 'vue-material-design-icons/CommentAccountOutline.vue'
import DueDate from './badges/DueDate.vue'
export default {
@@ -101,6 +101,8 @@ export default {
</script>
<style lang="scss" scoped>
@import './../../css/variables';
.badges {
display: flex;
width: 100%;
@@ -111,6 +113,7 @@ export default {
.icon-badge {
color: var(--color-text-maxcontrast);
display: flex;
align-items: center;
margin-right: 2px;
span,
@@ -125,42 +128,7 @@ export default {
flex-direction: row;
flex-wrap: wrap;
gap: 3px;
}
.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;
}
height: var(--default-clickable-area);
}
.badge-left, .badge-right {

View File

@@ -4,13 +4,10 @@
-->
<template>
<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"
<div v-if="cardId && ( attachments.length > 0 )" class="card-cover">
<div v-for="attachment in attachments"
:key="attachment.id"
:class="['image-wrapper', { 'rounded-left': index === 0 }, { 'rounded-right': index === attachments.length - 1 }]"
class="image-wrapper"
:style="{ backgroundImage: `url(${attachmentPreview(attachment)})` }" />
</div>
</template>
@@ -77,9 +74,7 @@ export default {
.card-cover {
height: 90px;
display: flex;
margin-top: -4px;
margin-left: -4px;
margin-right: -4px;
margin: $card-image-margin $card-image-margin 0;
.image-wrapper {
flex: 1;
@@ -87,12 +82,6 @@ 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, 'has-labels': card.labels && card.labels.length > 0, 'card__editable': canEdit, 'card__archived': card.archived, 'card__highlight': highlight}"
:class="{'compact': compactMode, 'current-card': currentCard, 'no-labels': !hasLabels, 'card__editable': canEdit, 'card__archived': card.archived, 'card__highlight': highlight}"
tag="div"
:tabindex="0"
class="card"
@@ -20,7 +20,7 @@
<CardCover v-if="showCardCover" :card-id="card.id" />
<div class="card-upper">
<h4 v-if="editingTitle === 0" key="title-view" dir="auto">
<span contenteditable="false">{{ displayTitle }}</span>
<span class="dragDisabled" contenteditable="false">{{ displayTitle }}</span>
</h4>
<h4 v-if="editingTitle >= 1"
key="title-edit"
@@ -331,16 +331,17 @@ export default {
border-radius: var(--border-radius-large);
font-size: 100%;
background-color: var(--color-main-background);
margin-bottom: $card-spacing;
padding: var(--default-grid-baseline) $card-padding;
padding: $card-padding;
border: 2px solid var(--color-border-dark);
width: 100%;
display: flex;
flex-direction: column;
gap: $card-gap;
overflow: hidden;
&:deep(*:not(.dragDisabled)) {
cursor: pointer;
}
&:deep(*) {
cursor: pointer;
}
&.current-card {
border: 2px solid var(--color-primary-element);
@@ -359,12 +360,10 @@ 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) {
@@ -374,9 +373,6 @@ export default {
&.editable {
span {
cursor: text;
padding-right: 8px;
padding-top: 3px;
padding-bottom: 3px;
&:focus, &:focus-visible {
outline: none;
@@ -385,6 +381,7 @@ export default {
&:focus-within {
outline: 2px solid var(--color-border-dark);
outline-offset: 4px;
border-radius: 3px;
}
}
@@ -427,8 +424,6 @@ 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;
@@ -444,7 +439,7 @@ export default {
.card-related {
display: flex;
padding: 12px;
padding: 4px;
padding-bottom: 0px;
color: var(--color-text-maxcontrast);
@@ -469,8 +464,8 @@ export default {
height: 32px;
width: 32px;
}
&.has-labels {
padding-bottom: $card-padding;
&.no-labels {
padding-bottom: var(--default-grid-baseline);
}
.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/Archive.vue'
import CardBulletedIcon from 'vue-material-design-icons/CardBulleted.vue'
import PencilIcon from 'vue-material-design-icons/Pencil.vue'
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 { 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-error-text);
background-color: rgba(var(--color-error-rgb), .1);
color: var(--color-element-error, var(--color-error-text));
background-color: rgba(var(--color-error-rgb), .5);
}
[data-due-state='Now'] & {
color: var(--color-warning-text);
background-color: rgba(var(--color-warning-rgb), .1);
color: var(--color-element-warning, var(--color-warning-text));
background-color: rgba(var(--color-warning-rgb), .5);
}
[data-due-state='Done'] & {
color: var(--color-success-text);
background-color: rgba(var(--color-success-rgb), .1);
color: var(--color-element-success, var(--color-success-text));
background-color: rgba(var(--color-success-rgb), .5);
}
.due--label {

View File

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

View File

@@ -15,6 +15,10 @@
<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>
@@ -150,9 +154,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/Archive.vue'
import ArchiveIcon from 'vue-material-design-icons/ArchiveOutline.vue'
import CloneIcon from 'vue-material-design-icons/ContentDuplicate.vue'
import AccountIcon from 'vue-material-design-icons/Account.vue'
import AccountIcon from 'vue-material-design-icons/AccountOutline.vue'
import CloseIcon from 'vue-material-design-icons/Close.vue'
import CheckIcon from 'vue-material-design-icons/Check.vue'
@@ -161,6 +165,8 @@ 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')
@@ -179,6 +185,7 @@ export default {
CloseIcon,
CheckIcon,
BoardCloneModal,
BoardExportModal,
},
directives: {
ClickOutside,
@@ -207,6 +214,7 @@ export default {
updateDueSetting: null,
canCreate: canCreateState,
cloneModalOpen: false,
exportModalOpen: false,
}
},
computed: {
@@ -346,7 +354,16 @@ export default {
this.updateDueSetting = null
},
actionExport() {
this.boardApi.exportBoard(this.board)
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
},
onNavigate() {
if (this.isTouchDevice) {

View File

@@ -0,0 +1,55 @@
<!--
- 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

@@ -0,0 +1,78 @@
<!--
- 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,45 +14,25 @@
</div>
<div v-else-if="isValidFilter" class="overview">
<div class="dashboard-column">
<h3>{{ t('deck', 'Overdue') }}</h3>
<div v-for="card in sortCards('overdue')" :key="card.id">
<CardItem :id="card.id" />
<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>
</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 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>
</div>
@@ -73,6 +53,34 @@ 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: {
@@ -89,6 +97,7 @@ export default {
data() {
return {
loading: true,
columnPropsList: COLUMN_PROPS_LIST,
}
},
computed: {
@@ -125,16 +134,16 @@ export default {
}
this.loading = false
},
sortCards(when) {
const cards = this.assignedCardsDashboard[when]
filterCards(when) {
return this.assignedCardsDashboard[when]
},
sortCards(cards) {
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
})
}
@@ -151,38 +160,75 @@ export default {
position: relative;
width: 100%;
height: 100%;
max-height: calc(100vh - 50px);
display: flex;
flex-direction: column;
}
.overview {
position: relative;
height: calc(100% - var(--default-clickable-area));
overflow-x: scroll;
overflow-x: auto;
flex-grow: 1;
scrollbar-gutter: stable;
display: flex;
align-items: stretch;
padding-left: $board-spacing;
padding-right: $board-spacing;
gap: $board-gap;
padding: 0 $board-gap;
.dashboard-column {
display: flex;
flex-direction: column;
min-width: $stack-width;
width: $stack-width;
margin-left: $stack-spacing;
margin-right: $stack-spacing;
flex: 0 1 $card-max-width;
min-width: $card-min-width;
h3 {
font-size: var(--default-font-size);
margin: -6px;
margin-bottom: 12px;
padding: 6px 13px;
.dashboard-column__header {
display: flex;
position: sticky;
top: 0;
height: var(--default-clickable-area);
z-index: 100;
margin-top: 0;
background-color: var(--color-main-background);
border: 1px solid var(--color-main-background);
// Smooth fade out of the cards at the top
&:before {
content: '';
display: block;
position: absolute;
width: 100%;
height: 20px;
top: 30px;
left: 0px;
z-index: 99;
transition: top var(--animation-slow);
background-image: linear-gradient(180deg, var(--color-main-background) 3px, rgba(255, 255, 255, 0) 100%);
body.theme--dark & {
background-image: linear-gradient(180deg, var(--color-main-background) 3px, rgba(0, 0, 0, 0) 100%);
}
}
}
.dashboard-column__header-title {
display: flex;
align-items: center;
height: var(--default-clickable-area);
margin: 0;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
padding: $card-padding;
font-size: var(--default-font-size);
}
.dashboard-column__list {
$margin-x: calc($stack-gap * -1);
display: flex;
flex-direction: column;
gap: $stack-gap;
padding: $stack-gap;
margin: 0 $margin-x;
overflow-y: auto;
scrollbar-gutter: stable;
}
}
}

View File

@@ -4,16 +4,19 @@
-->
<template>
<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>
<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 class="search-wrapper">
<div v-if="loading || filteredResults.length > 0" class="search-results">
<template v-if="loading || filteredResults.length > 0">
<CardItem v-for="card in filteredResults"
:id="card.id"
:key="card.id"
@@ -26,12 +29,12 @@
{{ t('deck', 'No results found') }}
</div>
</InfiniteLoading>
</div>
<div v-else>
</template>
<template v-else>
<p>{{ t('deck', 'No results found') }}</p>
</div>
</template>
</div>
</div>
</section>
</template>
<script>
@@ -159,7 +162,7 @@ export default {
.global-search {
width: 100%;
padding: $board-spacing + $stack-spacing;
padding: $board-gap;
padding-bottom: 0;
overflow: hidden;
min-height: 35vh;
@@ -169,17 +172,24 @@ 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-wrapper {
overflow: scroll;
height: 100%;
position: relative;
padding: 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;
}
h2 > div {
@@ -189,23 +199,24 @@ export default {
margin-right: 20px;
}
}
h2:deep(span) {
background-color: var(--color-background-dark);
padding: 3px;
border-radius: var(--border-radius);
}
.search-results {
.search-wrapper {
overflow: auto;
height: 100%;
position: relative;
display: flex;
flex-wrap: wrap;
gap: $stack-gap;
& > div {
flex-grow: 0;
& > .drop-upload--card {
flex: 0 1 $card-max-width;
min-width: $card-min-width;
}
}
&:deep(.card) {
width: $stack-width;
margin-right: $stack-spacing;
}
}
</style>

View File

@@ -62,14 +62,13 @@ export default {
$clickable-area: var(--default-clickable-area);
.card--placeholder {
width: $stack-width;
margin-right: $stack-spacing;
min-width: $card-min-width;
max-width: $card-min-width;
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,8 +2,10 @@
* SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
$card-spacing: 8px;
$card-padding: 4px;
$stack-spacing: 12px;
$stack-width: 280px;
$board-spacing: 16px;
$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);

View File

@@ -139,11 +139,30 @@ export class BoardApi {
}
}
exportBoard(board) {
exportBoard(board, format) {
return axios.get(this.url(`/boards/${board.id}/export`))
.then(
(response) => {
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') }
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') }
let row = ''
Object.keys(fields).forEach(field => {
row += '"' + fields[field] + '"' + '\t'
@@ -160,16 +179,27 @@ export class BoardApi {
const date = new Date(Number(card[field]) * 1000)
row += '"' + date.toLocaleDateString() + '"' + '\t'
} else if (field === 'stackId') {
row += '"' + stack.title + '"' + '\t'
row += '"' + stack.title.replaceAll('"', '""') + '"' + '\t'
} else if (field === 'labels') {
row += '"'
card[field].forEach(label => {
row += label.title + ', '
row += label.title.replaceAll('"', '""') + ', '
})
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'
}
@@ -204,6 +234,27 @@ 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.find(_card => _card.id === card.id)
const existingCard = state.cards[existingIndex]
Vue.set(state.cards, existingIndex, Object.assign({}, existingCard, card))
} else {
state.cards.push(card)

View File

@@ -402,6 +402,14 @@ 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/CalendarBlank.vue'
import CalendarBlankIcon from 'vue-material-design-icons/CalendarBlankOutline.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/CalendarBlank.vue'
import CalendarBlankIcon from 'vue-material-design-icons/CalendarBlankOutline.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 @@
73820
81373

View File

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

View File

@@ -29,6 +29,7 @@ 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;
@@ -86,7 +87,15 @@ 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), 'admin');
$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'
);
$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,6 +46,12 @@ class DefaultBoardServiceTest extends TestCase {
/** @var CardService */
private $cardService;
/** @var LabelService */
private $labelService;
/** @var AttachmentService */
private $attachmentService;
/** @var BoardMapper */
private $boardMapper;
@@ -62,6 +68,8 @@ 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';
@@ -72,7 +80,9 @@ class DefaultBoardServiceTest extends TestCase {
$this->boardService,
$this->stackService,
$this->cardService,
$this->config
$this->config,
$this->labelService,
$this->attachmentService,
);
}
@@ -109,8 +119,8 @@ class DefaultBoardServiceTest extends TestCase {
}
public function testCreateDefaultBoard() {
$title = 'Personal';
$color = '317CCC';
$title = 'Welcome to Nextcloud Deck!';
$color = 'bf678b';
$boardId = 5;
$board = new Board();
@@ -128,34 +138,70 @@ 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('Doing', $stackDoingId, $boardId);
$stackDoing = $this->assembleTestStack('In Progress', $stackDoingId, $boardId);
$stackDoneId = '125';
$stackDone = $this->assembleTestStack('Done', $stackDoneId, $boardId);
$this->stackService->expects($this->exactly(3))
->method('create')
->withConsecutive(
[$this->l10n->t('To do'), $boardId, 1],
[$this->l10n->t('Doing'), $boardId, 1],
[$this->l10n->t('Done'), $boardId, 1]
)
->willReturnOnConsecutiveCalls($stackToDo, $stackDoing, $stackDone);
$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))
$this->stackService->expects($this->exactly(4))
->method('create')
->withConsecutive(
['Example Task 3', $stackToDoId, 'text', 0, $this->userId],
['Example Task 2', $stackDoingId, 'text', 0, $this->userId],
['Example Task 1', $stackDoneId, 'text', 0, $this->userId]
[$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]
)
->willReturnonConsecutiveCalls($cardExampleTask3, $cardExampleTask2, $cardExampleTask1);
->willReturnOnConsecutiveCalls($stackCustom, $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))
->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]
)
->willReturnonConsecutiveCalls(
$cardExampleTask1,
$cardExampleTask2,
$cardExampleTask3,
$cardExampleTask4,
$cardExampleTask5
);
$result = $this->service->createDefaultBoard($title, $this->userId, $color);

View File

@@ -129,12 +129,17 @@ class StackServiceTest extends TestCase {
}
)
);
$this->cardMapper->expects($this->any())->method('findAll')->willReturn($this->getCards(222));
$this->cardMapper->expects($this->any())->method('findAllForStacks')->willReturnCallback(function (array $stackIds) {
$r = [];
foreach ($stackIds as $stackId) {
$r[$stackId] = $this->getCards(222);
}
return $r;
});
$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]);
@@ -211,7 +216,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('findAll')->willReturn([]);
$this->cardMapper->expects($this->once())->method('findAllForStacks')->willReturn([]);
$this->stackService->delete(123);
$this->assertTrue($stackToBeDeleted->getDeletedAt() <= time(), 'deletedAt is in the past');
$this->assertTrue($stackToBeDeleted->getDeletedAt() > 0, 'deletedAt is set');

Some files were not shown because too many files have changed in this diff Show More