Compare commits

...

174 Commits

Author SHA1 Message Date
Julius Härtl
9207f567b1 chore(webpack): Remove outdated config for hmr
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-05-22 08:05:01 +00:00
Julius Härtl
24d4d86aa4 chore(webpack): Move to shared code for entrypoints and use webpack serve public path
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-05-22 08:05:01 +00:00
Julius Härtl
c30bf3c936 chore(webpack): Add npm run serve command
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-05-22 08:05:01 +00:00
Nextcloud bot
e4e5c9a651 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2023-05-21 00:29:07 +00:00
Julius Härtl
9e813f322a Merge pull request #4713 from nextcloud/dependabot/npm_and_yarn/stable26/nextcloud/webpack-vue-config-5.5.1 2023-05-18 09:29:32 +02:00
Julius Härtl
70144b9061 Merge pull request #4709 from nextcloud/dependabot/npm_and_yarn/stable26/eslint-webpack-plugin-4.0.1 2023-05-18 09:29:12 +02:00
dependabot[bot]
27af65731e Merge pull request #4704 from nextcloud/dependabot/npm_and_yarn/stable26/cypress-12.12.0 2023-05-18 00:30:41 +00:00
dependabot[bot]
2778e5940c Merge pull request #4705 from nextcloud/dependabot/npm_and_yarn/stable26/nextcloud/event-bus-3.1.0 2023-05-18 00:30:25 +00:00
Nextcloud bot
e20f2eac97 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2023-05-18 00:29:44 +00:00
dependabot[bot]
a91262b153 Merge pull request #4711 from nextcloud/dependabot/npm_and_yarn/stable26/babel/runtime-7.21.5 2023-05-17 21:44:03 +00:00
dependabot[bot]
084c3649b2 Merge pull request #4708 from nextcloud/dependabot/npm_and_yarn/stable26/relative-ci/agent-4.1.4 2023-05-17 21:44:00 +00:00
dependabot[bot]
c6584b93f3 Merge pull request #4703 from nextcloud/dependabot/npm_and_yarn/stable26/nextcloud-vue-collections-0.11.1 2023-05-17 21:39:53 +00:00
dependabot[bot]
57ed57ce23 Merge pull request #4714 from nextcloud/dependabot/npm_and_yarn/stable26/vue/vue2-jest-29.2.4 2023-05-17 21:39:29 +00:00
dependabot[bot]
77a81d273a Merge pull request #4712 from nextcloud/dependabot/npm_and_yarn/stable26/stylelint-webpack-plugin-4.1.1 2023-05-17 21:39:20 +00:00
dependabot[bot]
b2e3d75b75 Merge pull request #4707 from nextcloud/dependabot/npm_and_yarn/stable26/jest-29.5.0 2023-05-17 21:39:07 +00:00
dependabot[bot]
4de693a402 Merge pull request #4706 from nextcloud/dependabot/npm_and_yarn/stable26/dompurify-3.0.3 2023-05-17 21:38:38 +00:00
dependabot[bot]
08febcb29a Chore(deps-dev): Bump @nextcloud/webpack-vue-config from 5.4.0 to 5.5.1
Bumps [@nextcloud/webpack-vue-config](https://github.com/nextcloud/webpack-vue-config) from 5.4.0 to 5.5.1.
- [Release notes](https://github.com/nextcloud/webpack-vue-config/releases)
- [Changelog](https://github.com/nextcloud/webpack-vue-config/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nextcloud/webpack-vue-config/compare/v5.4.0...v5.5.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-17 21:35:24 +00:00
dependabot[bot]
c1b6cc1149 Chore(deps): Bump @nextcloud/event-bus from 3.0.2 to 3.1.0
Bumps [@nextcloud/event-bus](https://github.com/nextcloud/nextcloud-event-bus) from 3.0.2 to 3.1.0.
- [Release notes](https://github.com/nextcloud/nextcloud-event-bus/releases)
- [Changelog](https://github.com/nextcloud/nextcloud-event-bus/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nextcloud/nextcloud-event-bus/compare/v3.0.2...v3.1.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-17 21:35:18 +00:00
dependabot[bot]
2f43aabb2e Chore(deps-dev): Bump cypress from 12.7.0 to 12.12.0
Bumps [cypress](https://github.com/cypress-io/cypress) from 12.7.0 to 12.12.0.
- [Release notes](https://github.com/cypress-io/cypress/releases)
- [Changelog](https://github.com/cypress-io/cypress/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/cypress-io/cypress/compare/v12.7.0...v12.12.0)

---
updated-dependencies:
- dependency-name: cypress
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-17 21:35:15 +00:00
dependabot[bot]
50293ffbb4 Merge pull request #4697 from nextcloud/dependabot/npm_and_yarn/stable26/nextcloud/vue-7.11.6 2023-05-17 21:34:40 +00:00
dependabot[bot]
a52bc5dc3f Merge pull request #4694 from nextcloud/dependabot/npm_and_yarn/stable26/vue/test-utils-1.3.5 2023-05-17 21:34:36 +00:00
dependabot[bot]
5acf52370a Merge pull request #4701 from nextcloud/dependabot/npm_and_yarn/stable26/eslint-plugin-cypress-2.13.3 2023-05-17 21:34:24 +00:00
dependabot[bot]
85e46f2513 Chore(deps-dev): Bump @vue/vue2-jest from 29.2.2 to 29.2.4
Bumps [@vue/vue2-jest](https://github.com/vuejs/vue-jest) from 29.2.2 to 29.2.4.
- [Release notes](https://github.com/vuejs/vue-jest/releases)
- [Commits](https://github.com/vuejs/vue-jest/compare/v29.2.2...v29.2.4)

---
updated-dependencies:
- dependency-name: "@vue/vue2-jest"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-17 18:14:18 +00:00
dependabot[bot]
db485aa713 Chore(deps-dev): Bump stylelint-webpack-plugin from 4.1.0 to 4.1.1
Bumps [stylelint-webpack-plugin](https://github.com/webpack-contrib/stylelint-webpack-plugin) from 4.1.0 to 4.1.1.
- [Release notes](https://github.com/webpack-contrib/stylelint-webpack-plugin/releases)
- [Changelog](https://github.com/webpack-contrib/stylelint-webpack-plugin/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webpack-contrib/stylelint-webpack-plugin/compare/v4.1.0...v4.1.1)

---
updated-dependencies:
- dependency-name: stylelint-webpack-plugin
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-17 18:13:51 +00:00
dependabot[bot]
e8aaa7c165 Chore(deps): Bump @babel/runtime from 7.21.0 to 7.21.5
Bumps [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.21.0 to 7.21.5.
- [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.21.5/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>
2023-05-17 18:13:40 +00:00
dependabot[bot]
281d6c2af7 Chore(deps-dev): Bump eslint-webpack-plugin from 4.0.0 to 4.0.1
Bumps [eslint-webpack-plugin](https://github.com/webpack-contrib/eslint-webpack-plugin) from 4.0.0 to 4.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.0.0...v4.0.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-17 18:13:14 +00:00
dependabot[bot]
c8714ec821 Chore(deps-dev): Bump @relative-ci/agent from 4.1.3 to 4.1.4
Bumps [@relative-ci/agent](https://github.com/relative-ci/agent) from 4.1.3 to 4.1.4.
- [Release notes](https://github.com/relative-ci/agent/releases)
- [Commits](https://github.com/relative-ci/agent/compare/v4.1.3...v4.1.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-17 18:13:05 +00:00
dependabot[bot]
84b2036374 Chore(deps-dev): Bump jest from 29.4.3 to 29.5.0
Bumps [jest](https://github.com/facebook/jest/tree/HEAD/packages/jest) from 29.4.3 to 29.5.0.
- [Release notes](https://github.com/facebook/jest/releases)
- [Changelog](https://github.com/jestjs/jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/jest/commits/v29.5.0/packages/jest)

---
updated-dependencies:
- dependency-name: jest
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-17 18:12:51 +00:00
dependabot[bot]
5c65bf9b00 Chore(deps): Bump dompurify from 3.0.0 to 3.0.3
Bumps [dompurify](https://github.com/cure53/DOMPurify) from 3.0.0 to 3.0.3.
- [Release notes](https://github.com/cure53/DOMPurify/releases)
- [Commits](https://github.com/cure53/DOMPurify/compare/3.0.0...3.0.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-17 18:12:33 +00:00
dependabot[bot]
237f832ad1 Chore(deps): Bump nextcloud-vue-collections from 0.11.0 to 0.11.1
Bumps [nextcloud-vue-collections](https://github.com/juliushaertl/nextcloud-vue-collections) from 0.11.0 to 0.11.1.
- [Release notes](https://github.com/juliushaertl/nextcloud-vue-collections/releases)
- [Commits](https://github.com/juliushaertl/nextcloud-vue-collections/compare/v0.11.0...v0.11.1)

---
updated-dependencies:
- dependency-name: nextcloud-vue-collections
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-17 18:11:53 +00:00
dependabot[bot]
d019d80efa Chore(deps-dev): Bump eslint-plugin-cypress from 2.12.1 to 2.13.3
Bumps [eslint-plugin-cypress](https://github.com/cypress-io/eslint-plugin-cypress) from 2.12.1 to 2.13.3.
- [Release notes](https://github.com/cypress-io/eslint-plugin-cypress/releases)
- [Commits](https://github.com/cypress-io/eslint-plugin-cypress/compare/v2.12.1...v2.13.3)

---
updated-dependencies:
- dependency-name: eslint-plugin-cypress
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-17 18:11:40 +00:00
dependabot[bot]
42a2ef39db Chore(deps): Bump @nextcloud/vue from 7.8.4 to 7.11.6
Bumps [@nextcloud/vue](https://github.com/nextcloud/nextcloud-vue) from 7.8.4 to 7.11.6.
- [Release notes](https://github.com/nextcloud/nextcloud-vue/releases)
- [Changelog](https://github.com/nextcloud/nextcloud-vue/blob/v7.11.6/CHANGELOG.md)
- [Commits](https://github.com/nextcloud/nextcloud-vue/compare/v7.8.4...v7.11.6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-17 18:11:28 +00:00
dependabot[bot]
ed7c9fbf05 Chore(deps-dev): Bump @vue/test-utils from 1.3.4 to 1.3.5
Bumps [@vue/test-utils](https://github.com/vuejs/test-utils) from 1.3.4 to 1.3.5.
- [Release notes](https://github.com/vuejs/test-utils/releases)
- [Commits](https://github.com/vuejs/test-utils/commits)

---
updated-dependencies:
- dependency-name: "@vue/test-utils"
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-05-17 18:11:10 +00:00
Julius Härtl
4f4627a600 Merge pull request #4680 from nextcloud/automated/noid/stable26-update-nextcloud-ocp 2023-05-15 08:25:30 +02:00
Julius Härtl
7900c73d90 Merge pull request #4682 from nextcloud/automated/noid/stable26-fix-npm-audit 2023-05-15 08:24:56 +02:00
nextcloud-command
0030b8c20c chore(deps): fix npm audit
Signed-off-by: GitHub <noreply@github.com>
2023-05-14 03:10:23 +00:00
nextcloud-command
fbc7d3135d chore(dev-deps): Bump nextcloud/ocp package
Signed-off-by: GitHub <noreply@github.com>
2023-05-14 02:55:23 +00:00
Nextcloud bot
7350ae2ef3 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2023-05-12 02:43:19 +00:00
Julius Härtl
9cebe7ac56 Bump version to 1.9.2
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-05-11 19:02:40 +02:00
Julius Härtl
bfe45c5af4 Merge pull request #4665 from nextcloud/backport/4664/stable26 2023-05-11 19:01:04 +02:00
Julius Härtl
c3c8faffea fix: Properly overwrite z-index of datepicker above modal
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-05-11 13:15:57 +00:00
Julius Härtl
96508580fd Bump version to 1.9.1
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-05-10 15:51:29 +02:00
Julius Härtl
ee7fcefd73 Merge pull request #4662 from nextcloud/backport/4660/stable26 2023-05-10 07:46:53 +02:00
Julius Härtl
ac31ff6efe fix: Bring back overdue column by removing faulty condition
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-05-10 05:36:30 +00:00
Julius Härtl
af6111b51e Merge pull request #4650 from nextcloud/backport/4586/stable26 2023-05-09 07:38:32 +02:00
Nextcloud bot
6700c903eb Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2023-05-08 02:40:20 +00:00
Julius Härtl
10e48aded1 fix: Move dashboard fetching to dedicated store module
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-05-05 12:42:32 +02:00
Julius Härtl
e80ba82d77 chore: Remove unused @nextcloud/vue-dashboard
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-05-05 12:42:31 +02:00
Julius Härtl
48202e6d98 Merge pull request #4644 from nextcloud/backport/4643/stable26
[stable26] fix: Append datetime picker to body to avoid cut off
2023-05-03 13:31:58 +02:00
Julius Härtl
e3ba870577 fix: z-index of datepicker in modal
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-05-03 13:10:23 +02:00
Julius Härtl
56fae37144 Merge pull request #4642 from nextcloud/automated/noid/stable26-fix-npm-audit
[stable26] Fix npm audit
2023-05-03 12:44:56 +02:00
Julius Härtl
af9177584c fix: Append datetime picker to body to avoid cut off
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-05-03 10:41:10 +00:00
nextcloud-command
d850c744cd chore(deps): fix npm audit
Signed-off-by: GitHub <noreply@github.com>
2023-05-03 08:13:44 +00:00
Nextcloud bot
cd60f4bf80 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2023-04-28 02:40:32 +00:00
Julius Härtl
eddb6fc460 Merge pull request #4625 from nextcloud/backport/4622/stable26 2023-04-27 08:57:33 +02:00
Bjoern Schiessle
6684023424 forbid changing the displayname or color of the calendar/deck when the user doesn't has the "manage" permissions
Signed-off-by: Bjoern Schiessle <bjoern@nextcloud.com>
2023-04-27 06:43:31 +00:00
Björn Schießle
43bec159ff Allow user to toggle visibility of the calendar of deck boards
The calendar object needs to be exposed with "write" properties in order to allow users to hide/show the corresponding calendar in the calendar app. It doesn't has any affects on the general permissions for the whole board or the tasks. As soon as you select a task you jump to the deck app where the normal deck permissions are applied.

fixes: https://github.com/nextcloud/deck/issues/4618

Signed-off-by: Björn Schießle <bjoern@nextcloud.com>
2023-04-27 06:43:30 +00:00
Nextcloud bot
27d960340e Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2023-04-27 02:40:48 +00:00
backportbot-nextcloud[bot]
3cda8eab77 fix: the issue of hidden text by menu bar (#4624)
Co-authored-by: Philip <65334274+pschopen@users.noreply.github.com>
2023-04-26 18:49:11 +02:00
Julius Härtl
aac5c1ff72 Merge pull request #4619 from nextcloud/backport/4604/stable26 2023-04-26 11:51:28 +02:00
Jérôme Herbinet
65c0fcfdc9 Following nimishavijay's suggestion
Signed-off-by: Jérôme Herbinet <33763786+Jerome-Herbinet@users.noreply.github.com>

Signed-off-by: Jérôme Herbinet <33763786+Jerome-Herbinet@users.noreply.github.com>
2023-04-25 08:13:31 +00:00
Jérôme Herbinet
c71d54a26e Better display of card dates
Signed-off-by: Jérôme Herbinet <33763786+Jerome-Herbinet@users.noreply.github.com>

Signed-off-by: Jérôme Herbinet <33763786+Jerome-Herbinet@users.noreply.github.com>
2023-04-25 08:13:31 +00:00
Nextcloud bot
0224da2127 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2023-04-23 02:40:54 +00:00
Nextcloud bot
3114e1a477 Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2023-04-19 02:40:47 +00:00
Nextcloud bot
375c78271d Fix(l10n): Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2023-04-16 02:39:50 +00:00
Julius Härtl
2b903ecf7f Merge pull request #4590 from nextcloud/automated/noid/stable26-update-nextcloud-ocp
[stable26] Update nextcloud/ocp dependency
2023-04-12 12:50:10 +02:00
nextcloud-command
9e256921ba chore(dev-deps): Bump nextcloud/ocp package
Signed-off-by: GitHub <noreply@github.com>
2023-04-09 02:54:25 +00:00
Nextcloud bot
d7e85ac4da Fix(l10n): 🔠 Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2023-04-09 02:42:11 +00:00
Nextcloud bot
4495fc3554 Fix(l10n): 🔠 Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2023-04-06 02:41:11 +00:00
Nextcloud bot
6996c862ce Fix(l10n): 🔠 Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2023-04-05 02:42:35 +00:00
Pytal
f81d98fb4b Merge pull request #4584 from nextcloud/backport/4559/stable26 2023-04-04 15:41:25 -07:00
Christopher Ng
cd942a1dfb Chore(deps): Bump @nextcloud/vue from 7.8.1 to 7.8.4
Signed-off-by: Christopher Ng <chrng8@gmail.com>
2023-04-04 15:34:10 -07:00
Julius Härtl
ddd15e7451 Merge pull request #4582 from nextcloud/automated/noid/stable26-update-nextcloud-ocp 2023-04-03 08:15:14 +02:00
nextcloud-command
21908ef534 chore(dev-deps): Bump nextcloud/ocp package
Signed-off-by: GitHub <noreply@github.com>
2023-04-02 03:02:13 +00:00
Jonas
426f1a33dd Merge pull request #4567 from nextcloud/backport/4566/stable26
[stable26] Gracefully handle not found card for a share
2023-03-29 11:13:33 +02:00
Jonas
713271d525 Gracefully handle not found card for a share
Fixes: #3464
Fixes: #4565

Signed-off-by: Jonas <jonas@freesources.org>
2023-03-29 09:00:24 +00:00
Nextcloud bot
a43efce576 Fix(l10n): 🔠 Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2023-03-28 02:31:37 +00:00
Julius Härtl
07f2fb7c28 Merge pull request #4562 from nextcloud/backport/4561/stable26 2023-03-27 12:08:47 +02:00
Julius Härtl
72563feaf0 fix: Adapt NcEmptyContent usages to new slots
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-03-27 08:52:01 +00:00
Julius Härtl
763a474d11 Merge pull request #4553 from nextcloud/automated/noid/stable26-update-nextcloud-ocp
[stable26] Update nextcloud/ocp dependency
2023-03-20 07:15:29 +01:00
nextcloud-command
3977d71892 chore(dev-deps): Bump nextcloud/ocp package
Signed-off-by: GitHub <noreply@github.com>
2023-03-19 03:09:01 +00:00
Nextcloud bot
25f3da3603 Fix(l10n): 🔠 Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2023-03-18 02:39:35 +00:00
Nextcloud bot
2920ca8c86 Fix(l10n): 🔠 Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2023-03-17 02:39:05 +00:00
Nextcloud bot
da7e075ee9 Fix(l10n): 🔠 Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2023-03-16 02:40:45 +00:00
Julius Härtl
c7341bed78 Merge pull request #4537 from nextcloud/backport/4535/stable26 2023-03-15 15:32:32 +01:00
Julius Härtl
d9014903ac Bump version to 1.9.0
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-03-15 14:57:12 +01:00
Jérôme Herbinet
5dad6bb0b0 Fix : Overlapping expiry dates on tags
Signed-off-by: Jérôme Herbinet <33763786+Jerome-Herbinet@users.noreply.github.com>

Signed-off-by: Jérôme Herbinet <33763786+Jerome-Herbinet@users.noreply.github.com>
2023-03-15 12:50:19 +00:00
Nextcloud bot
e7529e2d74 Fix(l10n): 🔠 Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2023-03-15 02:38:43 +00:00
Julius Härtl
c0e07dc202 Merge pull request #4530 from nextcloud/automated/noid/stable26-update-nextcloud-ocp 2023-03-12 15:22:56 +01:00
nextcloud-command
2619219618 chore(dev-deps): Bump nextcloud/ocp package
Signed-off-by: GitHub <noreply@github.com>
2023-03-12 03:16:40 +00:00
Julius Härtl
87a0a4ed4f Merge pull request #4525 from nextcloud/backport/4510/stable26 2023-03-10 08:54:08 +01:00
Julius Härtl
df01d8ef79 fix(sessions): Do not send close request without token
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-03-10 07:27:22 +00:00
Nextcloud bot
9f38e51d9b Fix(l10n): 🔠 Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2023-03-10 02:40:05 +00:00
Julius Härtl
3f2e343541 Merge pull request #4521 from nextcloud/backport/4512/stable26 2023-03-08 18:59:04 +01:00
Julius Härtl
ea6006bec0 fix(cards): Fix card sizing by limiting too wide style rules
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-03-08 17:41:03 +00:00
Joas Schilling
1e625d3955 Merge pull request #4519 from nextcloud/backport/4518/stable26
[stable26] fix(API): Fix board API details parameter to work as expected
2023-03-08 09:22:32 +01:00
Joas Schilling
4b0a27d6b5 fix(API): Fix board API details parameter to work as expected
Signed-off-by: Joas Schilling <coding@schilljs.com>
2023-03-08 07:43:46 +00:00
Marcel Klehr
9cc38000fd Merge pull request #4516 from nextcloud/backport/4514/stable26 2023-03-07 10:51:40 +01:00
Julius Härtl
3574abe0cb fix(references): Mute NoPermissionException as it is expected to happen for references
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-03-07 09:24:39 +00:00
Julius Härtl
fb5aed2143 chore(release): Bump version to 1.8.0-beta.2
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-03-06 07:14:34 +01:00
Julius Härtl
3506ac2a42 Merge pull request #4509 from nextcloud/automated/noid/stable26-update-nextcloud-ocp 2023-03-06 07:12:08 +01:00
Nextcloud bot
1f2f8fe001 Fix(l10n): 🔠 Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2023-03-06 02:39:11 +00:00
nextcloud-command
97d9c4cc2c chore(dev-deps): Bump nextcloud/ocp package
Signed-off-by: GitHub <noreply@github.com>
2023-03-05 03:18:56 +00:00
Julius Härtl
b169ecd0fe Merge pull request #4498 from nextcloud/update-stable26-target-versions 2023-03-04 11:55:03 +01:00
Nextcloud bot
912376a99d Fix(l10n): 🔠 Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2023-03-04 02:40:24 +00:00
Joas Schilling
3ec2ad99b1 chore(CI): Adjust testing matrix for Nextcloud 26 on stable26
Signed-off-by: Joas Schilling <coding@schilljs.com>
2023-03-03 13:25:30 +01:00
Julius Härtl
a4c7a65ffa Merge pull request #4459 from nextcloud/dependabot/npm_and_yarn/main/nextcloud/dialogs-4.0.1 2023-03-02 22:41:39 +01:00
Julius Härtl
8a67125503 Merge pull request #4457 from nextcloud/dependabot/npm_and_yarn/main/dompurify-3.0.0 2023-03-02 22:41:34 +01:00
dependabot[bot]
f7fc54e628 Chore(deps): Bump dompurify from 2.4.3 to 3.0.0
Bumps [dompurify](https://github.com/cure53/DOMPurify) from 2.4.3 to 3.0.0.
- [Release notes](https://github.com/cure53/DOMPurify/releases)
- [Commits](https://github.com/cure53/DOMPurify/compare/2.4.3...3.0.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-03-02 22:34:16 +01:00
dependabot[bot]
28ea6ed03e bump @nextcloud/dialogs from 3.2.0 to 4.0.1
---
updated-dependencies:
- dependency-name: "@nextcloud/dialogs"
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-03-02 22:33:51 +01:00
Julius Härtl
6c4a12707d Merge pull request #4490 from nextcloud/fix/4484
fix: Use proper z-index for text menubar
2023-03-01 22:13:22 +01:00
Marcel Klehr
8fb7bb83a9 Merge pull request #4493 from nextcloud/bugfix/noid/duplicate-boards 2023-03-01 18:47:20 +01:00
Julius Härtl
fbb410667a fix: Always return sorted index array to make sure a json array is the result
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-03-01 17:28:13 +01:00
Julius Härtl
f69868ae26 Merge pull request #4492 from nextcloud/fix/undefined-array-index-dashboard 2023-03-01 15:59:33 +01:00
Marcel Klehr
e41627d763 fix(dashboard): Fix undefined array index
fixes #4491

Signed-off-by: Marcel Klehr <mklehr@gmx.net>
2023-03-01 15:43:26 +01:00
Marcel Klehr
4a89db6d67 Merge pull request #4487 from nextcloud/bugfix/3358
fix: Use passed userid when getting attachment folder
2023-02-28 13:28:10 +01:00
Julius Härtl
a2ffdb41af Merge pull request #4488 from nextcloud/bugfix/4483 2023-02-28 09:22:47 +01:00
Julius Härtl
9fe79ed135 fix: Use proper z-index for text menubar
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-02-27 23:46:29 +01:00
Julius Härtl
a198a4eef4 fix: Avoid mutating the due date when calculating days
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-02-27 23:13:06 +01:00
Julius Härtl
62752f8b72 fix: Use passed userid when getting attachment folder
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-02-27 22:56:28 +01:00
Joas Schilling
2c96108b2e Merge pull request #4485 from nextcloud/fix/permission-userid
fix: Pass user id along to properly check permissions in background jobs
2023-02-27 12:48:15 +01:00
Julius Härtl
1beff8945b fix: Pass user id along to properly check permissions in background jobs
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-02-27 11:25:45 +01:00
Julius Härtl
ff2ad61b6d Merge pull request #4471 from nextcloud/dependabot/composer/vimeo/psalm-5.7.7 2023-02-27 09:29:51 +01:00
Julius Härtl
05941396c0 Merge pull request #4478 from nextcloud/dependabot/npm_and_yarn/main/nextcloud/l10n-2.1.0 2023-02-27 09:23:04 +01:00
Julius Härtl
6d037e7d94 Merge pull request #4477 from nextcloud/dependabot/npm_and_yarn/main/stylelint-webpack-plugin-4.1.0 2023-02-27 09:06:32 +01:00
Julius Härtl
0768955559 Merge pull request #4479 from nextcloud/dependabot/npm_and_yarn/main/cypress-12.7.0 2023-02-27 09:06:17 +01:00
Julius Härtl
faf35a98a3 Merge pull request #4472 from nextcloud/dependabot/github_actions/actions/github-script-6 2023-02-27 08:39:27 +01:00
Julius Härtl
815cc605a8 Merge pull request #4474 from nextcloud/dependabot/github_actions/svenstaro/upload-release-action-2.5.0 2023-02-27 08:39:20 +01:00
Julius Härtl
3d7410c30c Merge pull request #4481 from nextcloud/dependabot/npm_and_yarn/main/nextcloud/vue-7.7.1
bump @nextcloud/vue from 7.5.0 to 7.7.1
2023-02-27 08:38:41 +01:00
Julius Härtl
3921bd7f60 Merge pull request #4480 from nextcloud/dependabot/npm_and_yarn/main/babel/runtime-7.21.0
bump @babel/runtime from 7.20.13 to 7.21.0
2023-02-27 08:38:09 +01:00
dependabot[bot]
91ae931461 bump @nextcloud/vue from 7.5.0 to 7.7.1
---
updated-dependencies:
- dependency-name: "@nextcloud/vue"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-25 04:24:11 +00:00
dependabot[bot]
fc4ccf4010 bump @babel/runtime from 7.20.13 to 7.21.0
---
updated-dependencies:
- dependency-name: "@babel/runtime"
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-25 04:01:01 +00:00
dependabot[bot]
b3cc1da02d chore(deps-dev): bump cypress from 12.5.1 to 12.7.0
Bumps [cypress](https://github.com/cypress-io/cypress) from 12.5.1 to 12.7.0.
- [Release notes](https://github.com/cypress-io/cypress/releases)
- [Changelog](https://github.com/cypress-io/cypress/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/cypress-io/cypress/compare/v12.5.1...v12.7.0)

---
updated-dependencies:
- dependency-name: cypress
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-25 02:59:05 +00:00
dependabot[bot]
e4bd1efe00 chore(deps): bump @nextcloud/l10n from 2.0.1 to 2.1.0
Bumps [@nextcloud/l10n](https://github.com/nextcloud/nextcloud-l10n) from 2.0.1 to 2.1.0.
- [Release notes](https://github.com/nextcloud/nextcloud-l10n/releases)
- [Changelog](https://github.com/nextcloud/nextcloud-l10n/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nextcloud/nextcloud-l10n/compare/v2.0.1...v2.1.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-25 02:58:33 +00:00
dependabot[bot]
45f3a64ae4 chore(deps-dev): bump stylelint-webpack-plugin from 4.0.0 to 4.1.0
Bumps [stylelint-webpack-plugin](https://github.com/webpack-contrib/stylelint-webpack-plugin) from 4.0.0 to 4.1.0.
- [Release notes](https://github.com/webpack-contrib/stylelint-webpack-plugin/releases)
- [Changelog](https://github.com/webpack-contrib/stylelint-webpack-plugin/blob/master/CHANGELOG.md)
- [Commits](https://github.com/webpack-contrib/stylelint-webpack-plugin/compare/v4.0.0...v4.1.0)

---
updated-dependencies:
- dependency-name: stylelint-webpack-plugin
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-25 02:58:04 +00:00
dependabot[bot]
52940ed4a1 chore(deps): bump svenstaro/upload-release-action from 2.4.1 to 2.5.0
Bumps [svenstaro/upload-release-action](https://github.com/svenstaro/upload-release-action) from 2.4.1 to 2.5.0.
- [Release notes](https://github.com/svenstaro/upload-release-action/releases)
- [Changelog](https://github.com/svenstaro/upload-release-action/blob/master/CHANGELOG.md)
- [Commits](cc92c9093e...7319e4733e)

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

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-25 02:57:50 +00:00
dependabot[bot]
2ba1412ae1 chore(deps): bump actions/github-script from 5 to 6
Bumps [actions/github-script](https://github.com/actions/github-script) from 5 to 6.
- [Release notes](https://github.com/actions/github-script/releases)
- [Commits](https://github.com/actions/github-script/compare/v5...v6)

---
updated-dependencies:
- dependency-name: actions/github-script
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-25 02:57:45 +00:00
dependabot[bot]
b42ff90e0c chore(deps-dev): bump vimeo/psalm from 5.6.0 to 5.7.7
Bumps [vimeo/psalm](https://github.com/vimeo/psalm) from 5.6.0 to 5.7.7.
- [Release notes](https://github.com/vimeo/psalm/releases)
- [Commits](https://github.com/vimeo/psalm/compare/5.6.0...5.7.7)

---
updated-dependencies:
- dependency-name: vimeo/psalm
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-25 02:56:28 +00:00
Nextcloud bot
de66f47ac9 Fix(l10n): 🔠 Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2023-02-24 02:42:08 +00:00
Julius Härtl
f5b1e89a9c release: Bump version to 1.9.0-beta.1
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-02-22 17:39:58 +01:00
Nextcloud bot
4e9a00c3a2 Fix(l10n): 🔠 Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2023-02-22 02:34:17 +00:00
Julius Härtl
0af2fd45e7 Merge pull request #4273 from alangecker/live-updates
live updates 🎉
2023-02-21 22:18:45 +01:00
chandi Langecker
b4eece879d test(unit): fix tests, mostly due to missing boardId's, which are now required for event emitting
Signed-off-by: chandi Langecker <git@chandi.it>
2023-02-21 21:53:22 +01:00
chandi Langecker
c03d067464 style(sessionlist): less incisive borders
Signed-off-by: chandi Langecker <git@chandi.it>
2023-02-21 21:53:22 +01:00
chandi Langecker
437f5c9ab5 chore(psalm): adding missing events for annotation
Signed-off-by: chandi Langecker <git@chandi.it>
2023-02-21 21:53:22 +01:00
chandi Langecker
2e6b20d71d live updates: remove deleted cards with loadStacks() and not just append them
Signed-off-by: chandi Langecker <git@chandi.it>
2023-02-21 21:53:22 +01:00
chandi Langecker
41d8867bdd live updates: listen for stack and board changes
Signed-off-by: chandi Langecker <git@chandi.it>
2023-02-21 21:53:22 +01:00
chandi Langecker
322ee92573 live updates for boards
Signed-off-by: chandi Langecker <git@chandi.it>
2023-02-21 21:53:20 +01:00
Nextcloud bot
9674c344ea Fix(l10n): 🔠 Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2023-02-21 02:33:43 +00:00
Julius Härtl
33912454ae Merge pull request #4460 from nextcloud/dependabot/npm_and_yarn/main/nextcloud-vue-collections-0.11.0
bump nextcloud-vue-collections from 0.10.0 to 0.11.0
2023-02-20 19:03:21 +01:00
Julius Härtl
15c1c9ddc4 Merge pull request #4452 from nextcloud/enh/perf 2023-02-20 16:46:02 +01:00
Nextcloud bot
8bb106b327 Fix(l10n): 🔠 Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2023-02-19 02:34:25 +00:00
dependabot[bot]
43c1a3bbc7 bump nextcloud-vue-collections from 0.10.0 to 0.11.0
---
updated-dependencies:
- dependency-name: nextcloud-vue-collections
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-02-18 04:39:07 +00:00
Nextcloud bot
5e1b6d248c Fix(l10n): 🔠 Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2023-02-18 02:34:45 +00:00
Julius Härtl
28a9c66143 ci: Use faster password hashing for CI
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-02-17 09:23:29 +01:00
Julius Härtl
b4de6a8f96 fix: Chunk in-queries to 1000 items
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-02-17 09:16:43 +01:00
Julius Härtl
46df19a3a6 fix: Fix tests
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-02-17 09:16:28 +01:00
Julius Härtl
b19b7794bc perf: Cache full/partial board data differently
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-02-17 09:16:27 +01:00
Julius Härtl
29d21e05e8 chore: Remove some unused methods
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-02-17 09:16:27 +01:00
Julius Härtl
afcd226be8 refactor: Unify board enrichment
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-02-17 09:16:27 +01:00
Julius Härtl
4b319d8d23 perf: Avoid extra round trips when checking permissions
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-02-17 09:16:27 +01:00
Julius Härtl
8ec8a91cab perf: Group queries for fetching overview cards
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-02-17 09:16:27 +01:00
Julius Härtl
96d1e14390 perf: Cache stacks per request
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-02-17 09:16:27 +01:00
Julius Härtl
c01e542044 perf: remove duplicate fetching of assignments
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-02-17 09:16:27 +01:00
Julius Härtl
133e3f3140 tests: Adapt tests
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-02-17 09:16:27 +01:00
Julius Härtl
c1e29ab8cb fix: Fix missing getBoardId method on AclEvent
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-02-17 09:16:27 +01:00
Julius Härtl
af21282468 style: php-cs-fixer
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-02-17 09:16:26 +01:00
Julius Härtl
ba3cab1036 perf: Combine fetching acls for boards
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-02-17 09:16:26 +01:00
Julius Härtl
81c0d96357 perf: Make fetching user details lazy
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-02-17 09:16:26 +01:00
Julius Härtl
ea8b7999f7 perf: No need to fetch boards every middleware call
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-02-17 09:16:26 +01:00
Julius Härtl
7bfbbee6e8 perf: Enrich calls in combined sql queries
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-02-17 09:16:26 +01:00
Julius Härtl
23813b7a03 perf: Add mapper methods to get multiple labels/assignments for cards
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-02-17 09:16:26 +01:00
Julius Härtl
2542b6ed16 ci: Add query count for integration tests
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2023-02-17 09:16:26 +01:00
Nextcloud bot
0878adb124 Fix(l10n): 🔠 Update translations from Transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2023-02-17 02:33:42 +00:00
134 changed files with 34345 additions and 32878 deletions

View File

@@ -148,7 +148,7 @@ jobs:
tar -zcvf ${{ env.APP_NAME }}.tar.gz ${{ env.APP_NAME }}
- name: Attach tarball to github release
uses: svenstaro/upload-release-action@cc92c9093e5f785e23a3d654fe2671640b851b5f # v2
uses: svenstaro/upload-release-action@7319e4733ec7a184d739a6f412c40ffc339b69c7 # v2
id: attach_to_release
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -23,7 +23,7 @@ jobs:
# containers: [1, 2, 3]
php-versions: [ '8.0' ]
databases: [ 'sqlite' ]
server-versions: [ 'master' ]
server-versions: [ 'stable26' ]
steps:
- name: Use Node.js ${{ matrix.node-version }}

View File

@@ -28,7 +28,7 @@ jobs:
matrix:
php-versions: ['8.1']
databases: ['sqlite', 'mysql', 'pgsql']
server-versions: ['master']
server-versions: ['stable26']
name: php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }}
@@ -74,11 +74,12 @@ jobs:
uses: shivammathur/setup-php@2.24.0
with:
php-version: ${{ matrix.php-versions }}
tools: phpunit
extensions: mbstring, iconv, fileinfo, intl, sqlite, pdo_sqlite, mysql, pdo_mysql, pgsql, pdo_pgsql,
extensions: mbstring, iconv, fileinfo, intl, sqlite, pdo_sqlite, mysql, pdo_mysql, pgsql, pdo_pgsql, apcu
ini-values:
apc.enable_cli=on
coverage: none
- name: Set up PHPUnit
- name: Set up dependencies
working-directory: apps/${{ env.APP_NAME }}
run: composer i --no-dev
@@ -91,11 +92,63 @@ jobs:
fi
mkdir data
./occ maintenance:install --verbose --database=${{ matrix.databases }} --database-name=nextcloud --database-host=127.0.0.1 --database-port=$DB_PORT --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass admin
./occ config:system:set hashing_default_password --value=true --type=boolean
./occ config:system:set memcache.local --value="\\OC\\Memcache\\APCu"
./occ config:system:set memcache.distributed --value="\\OC\\Memcache\\APCu"
cat config/config.php
./occ user:list
./occ app:enable --force ${{ env.APP_NAME }}
./occ config:system:set query_log_file --value '/home/runner/work/${{ env.APP_NAME }}/${{ env.APP_NAME }}/query.log'
php -S localhost:8080 &
- name: Run behat
working-directory: apps/${{ env.APP_NAME }}/tests/integration
run: ./run.sh
- name: Query count
if: ${{ matrix.databases == 'mysql' }}
uses: actions/github-script@v6
with:
github-token: ${{secrets.GITHUB_TOKEN}}
script: |
let myOutput = ''
let myError = ''
const options = {}
options.listeners = {
stdout: (data) => {
myOutput += data.toString()
},
stderr: (data) => {
myError += data.toString()
}
}
await exec.exec(`/bin/bash -c "cat /home/runner/work/${{ env.APP_NAME }}/${{ env.APP_NAME }}/query.log | wc -l"`, [], options)
msg = myOutput
const queryCount = parseInt(myOutput, 10)
myOutput = ''
await exec.exec('cat', ['/home/runner/work/${{ env.APP_NAME }}/${{ env.APP_NAME }}/apps/${{ env.APP_NAME }}/tests/integration/base-query-count.txt'], options)
const baseCount = parseInt(myOutput, 10)
const absoluteIncrease = queryCount - baseCount
const relativeIncrease = baseCount <= 0 ? 100 : (parseInt((absoluteIncrease / baseCount * 10000), 10) / 100)
if (absoluteIncrease >= 100 || relativeIncrease > 5) {
const comment = `🐢 Performance warning.\nIt looks like the query count of the integration tests increased with this PR.\nDatabase query count is now ` + queryCount + ' was ' + baseCount + ' (+' + relativeIncrease + '%)\nPlease check your code again. If you added a new test this can be expected and the base value in tests/integration/base-query-count.txt can be increased.'
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: comment
})
}
if (queryCount < 100) {
const comment = `🐈 Performance messuring seems broken. Failed to get query count.`
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: comment
})
}

View File

@@ -26,9 +26,9 @@ jobs:
strategy:
fail-fast: false
matrix:
php-versions: ['8.0', '8.1']
php-versions: ['8.0', '8.1', '8.2']
databases: ['sqlite', 'mysql', 'pgsql']
server-versions: ['master']
server-versions: ['stable26']
name: php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }}

View File

@@ -1,6 +1,63 @@
# Changelog
All notable changes to this project will be documented in this file.
## 1.9.2
### Fixed
- fix: Properly overwrite z-index of datepicker above modal [#4665](https://github.com/nextcloud/deck/pull/4665)
## 1.9.1
### Fixed
- Gracefully handle not found card for a share [#4567](https://github.com/nextcloud/deck/pull/4567)
- fix: Adapt NcEmptyContent usages to new slots [#4562](https://github.com/nextcloud/deck/pull/4562)
- allow user to toggle visibility of the calendar for a deck board [#4625](https://github.com/nextcloud/deck/pull/4625)
- fix: Append datetime picker to body to avoid cut off [#4644](https://github.com/nextcloud/deck/pull/4644)
- chore: Remove unused @nextcloud/vue-dashboard @juliushaertl [#4650](https://github.com/nextcloud/deck/pull/4650)
- fix: Bring back overdue column by removing faulty condition [#4662](https://github.com/nextcloud/deck/pull/4662)
- Fix : Overlapping expiry dates on tags [#4537](https://github.com/nextcloud/deck/pull/4537)
- Better display of card dates (creation and change dates) [#4619](https://github.com/nextcloud/deck/pull/4619)
- Update dependencies
## 1.9.0
### Added
- Live updates on board collaboration using notify_push @alangecker [#4273](https://github.com/nextcloud/deck/pull/4273)
- Basic notify_push usage with session handling @alangecker [#3876](https://github.com/nextcloud/deck/pull/3876)
- Use text as editor if available [#4399](https://github.com/nextcloud/deck/pull/4399)
- Improve reference provider and add reference widgets @julien-nc [#4422](https://github.com/nextcloud/deck/pull/4422)
- Tag creation from card view @juliushaertl [#4344](https://github.com/nextcloud/deck/pull/4344)
- Optimize query performance with larger board or card count @[#4452](https://github.com/nextcloud/deck/pull/4452)
- Export Board as CSV @david-loe [#3065](https://github.com/nextcloud/deck/pull/3065)
### Fixed
- fix(cards): Fix card sizing by limiting too wide style rules [#4521](https://github.com/nextcloud/deck/pull/4521)
- fix(references): Mute NoPermissionException as it is expected to happen for references [#4516](https://github.com/nextcloud/deck/pull/4516)
- fix(API): Fix board API details parameter to work as expected [#4519](https://github.com/nextcloud/deck/pull/4519)
- fix(sessions): Do not send close request without token [#4525](https://github.com/nextcloud/deck/pull/4525)
- fix: Avoid mutating the due date when calculating days @juliushaertl [#4488](https://github.com/nextcloud/deck/pull/4488)
- fix: Pass user id along to properly check permissions in background jobs @juliushaertl [#4485](https://github.com/nextcloud/deck/pull/4485)
- fix: Use passed userid when getting attachment folder @juliushaertl [#4487](https://github.com/nextcloud/deck/pull/4487)
- fix: Use proper z-index for text menubar @juliushaertl [#4490](https://github.com/nextcloud/deck/pull/4490)
- fix(dashboard): Fix undefined array index @marcelklehr [#4492](https://github.com/nextcloud/deck/pull/4492)
- fix: Always return sorted index array to make sure a json array is the result @juliushaertl [#4493](https://github.com/nextcloud/deck/pull/4493)
- Fix component renaming so that acl works on shares again @small1 [#4315](https://github.com/nextcloud/deck/pull/4315)
- fix(Sidebar): Only close sidebar on v-click-outside for specific targets @juliushaertl [#4350](https://github.com/nextcloud/deck/pull/4350)
- add basic e2e tests for stack title @shoetten [#4206](https://github.com/nextcloud/deck/pull/4206)
- App metadata: add links to user and developer documentation @p-bo [#4356](https://github.com/nextcloud/deck/pull/4356)
- Update signature of Entity::markFieldUpdated @nickvergessen [#4398](https://github.com/nextcloud/deck/pull/4398)
- Remove updated nightly information @xf- [#4419](https://github.com/nextcloud/deck/pull/4419)
- perf: Register notifier and resource listener lazy @juliushaertl [#4439](https://github.com/nextcloud/deck/pull/4439)
- perf: Lazy load dashboard components @juliushaertl [#4440](https://github.com/nextcloud/deck/pull/4440)
- Optimise upcomming overview creation @Raudius [#3793](https://github.com/nextcloud/deck/pull/3793)
## 1.8.0-beta.1
### Enhancements

View File

@@ -16,7 +16,7 @@
- 🚀 Get your project organized
</description>
<version>1.9.0-beta.1</version>
<version>1.9.2</version>
<licence>agpl</licence>
<author>Julius Härtl</author>
<documentation>

View File

@@ -19,7 +19,7 @@
"symfony/event-dispatcher": "^4.0",
"vimeo/psalm": "^5.4",
"php-parallel-lint/php-parallel-lint": "^1.2",
"nextcloud/ocp": "dev-master"
"nextcloud/ocp": "dev-stable26"
},
"config": {
"optimize-autoloader": true,

114
composer.lock generated
View File

@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "22d201a4569de6d4fafbc13277ae91a6",
"content-hash": "7f234626b3fd062832a6387b9434427c",
"packages": [
{
"name": "cogpowered/finediff",
@@ -952,16 +952,16 @@
},
{
"name": "fidry/cpu-core-counter",
"version": "0.4.1",
"version": "0.5.1",
"source": {
"type": "git",
"url": "https://github.com/theofidry/cpu-core-counter.git",
"reference": "79261cc280aded96d098e1b0e0ba0c4881b432c2"
"reference": "b58e5a3933e541dc286cc91fc4f3898bbc6f1623"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/79261cc280aded96d098e1b0e0ba0c4881b432c2",
"reference": "79261cc280aded96d098e1b0e0ba0c4881b432c2",
"url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/b58e5a3933e541dc286cc91fc4f3898bbc6f1623",
"reference": "b58e5a3933e541dc286cc91fc4f3898bbc6f1623",
"shasum": ""
},
"require": {
@@ -1001,7 +1001,7 @@
],
"support": {
"issues": "https://github.com/theofidry/cpu-core-counter/issues",
"source": "https://github.com/theofidry/cpu-core-counter/tree/0.4.1"
"source": "https://github.com/theofidry/cpu-core-counter/tree/0.5.1"
},
"funding": [
{
@@ -1009,7 +1009,7 @@
"type": "github"
}
],
"time": "2022-12-16T22:01:02+00:00"
"time": "2022-12-24T12:35:10+00:00"
},
{
"name": "friendsofphp/php-cs-fixer",
@@ -1253,26 +1253,24 @@
},
{
"name": "nextcloud/ocp",
"version": "dev-master",
"version": "dev-stable26",
"source": {
"type": "git",
"url": "https://github.com/nextcloud-deps/ocp.git",
"reference": "5636b942e35ee391b1103150261d83d3d753d657"
"reference": "37923c381f59247ae6a4049561454f5d3cc2fa01"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/nextcloud-deps/ocp/zipball/5636b942e35ee391b1103150261d83d3d753d657",
"reference": "5636b942e35ee391b1103150261d83d3d753d657",
"url": "https://api.github.com/repos/nextcloud-deps/ocp/zipball/37923c381f59247ae6a4049561454f5d3cc2fa01",
"reference": "37923c381f59247ae6a4049561454f5d3cc2fa01",
"shasum": ""
},
"require": {
"php": "^7.4 || ~8.0 || ~8.1",
"psr/clock": "^1.0",
"psr/container": "^1.1.1",
"psr/event-dispatcher": "^1.0",
"psr/log": "^1.1"
},
"default-branch": true,
"type": "library",
"extra": {
"branch-alias": {
@@ -1292,9 +1290,9 @@
"description": "Composer package containing Nextcloud's public API (classes, interfaces)",
"support": {
"issues": "https://github.com/nextcloud-deps/ocp/issues",
"source": "https://github.com/nextcloud-deps/ocp/tree/master"
"source": "https://github.com/nextcloud-deps/ocp/tree/stable26"
},
"time": "2023-02-08T00:37:37+00:00"
"time": "2023-05-05T00:32:37+00:00"
},
{
"name": "nikic/php-parser",
@@ -2206,54 +2204,6 @@
},
"time": "2021-02-03T23:26:27+00:00"
},
{
"name": "psr/clock",
"version": "1.0.0",
"source": {
"type": "git",
"url": "https://github.com/php-fig/clock.git",
"reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/clock/zipball/e41a24703d4560fd0acb709162f73b8adfc3aa0d",
"reference": "e41a24703d4560fd0acb709162f73b8adfc3aa0d",
"shasum": ""
},
"require": {
"php": "^7.0 || ^8.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Psr\\Clock\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "PHP-FIG",
"homepage": "https://www.php-fig.org/"
}
],
"description": "Common interface for reading the clock.",
"homepage": "https://github.com/php-fig/clock",
"keywords": [
"clock",
"now",
"psr",
"psr-20",
"time"
],
"support": {
"issues": "https://github.com/php-fig/clock/issues",
"source": "https://github.com/php-fig/clock/tree/1.0.0"
},
"time": "2022-11-25T14:36:26+00:00"
},
{
"name": "psr/container",
"version": "1.1.2",
@@ -3800,26 +3750,25 @@
},
{
"name": "spatie/array-to-xml",
"version": "2.17.1",
"version": "3.1.5",
"source": {
"type": "git",
"url": "https://github.com/spatie/array-to-xml.git",
"reference": "5cbec9c6ab17e320c58a259f0cebe88bde4a7c46"
"reference": "13f76acef5362d15c71ae1ac6350cc3df5e25e43"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/spatie/array-to-xml/zipball/5cbec9c6ab17e320c58a259f0cebe88bde4a7c46",
"reference": "5cbec9c6ab17e320c58a259f0cebe88bde4a7c46",
"url": "https://api.github.com/repos/spatie/array-to-xml/zipball/13f76acef5362d15c71ae1ac6350cc3df5e25e43",
"reference": "13f76acef5362d15c71ae1ac6350cc3df5e25e43",
"shasum": ""
},
"require": {
"ext-dom": "*",
"php": "^7.4|^8.0"
"php": "^8.0"
},
"require-dev": {
"mockery/mockery": "^1.2",
"pestphp/pest": "^1.21",
"phpunit/phpunit": "^9.0",
"spatie/pest-plugin-snapshots": "^1.1"
},
"type": "library",
@@ -3848,7 +3797,7 @@
"xml"
],
"support": {
"source": "https://github.com/spatie/array-to-xml/tree/2.17.1"
"source": "https://github.com/spatie/array-to-xml/tree/3.1.5"
},
"funding": [
{
@@ -3860,7 +3809,7 @@
"type": "github"
}
],
"time": "2022-12-26T08:22:07+00:00"
"time": "2022-12-24T13:43:51+00:00"
},
{
"name": "symfony/console",
@@ -5303,16 +5252,16 @@
},
{
"name": "vimeo/psalm",
"version": "5.6.0",
"version": "5.7.7",
"source": {
"type": "git",
"url": "https://github.com/vimeo/psalm.git",
"reference": "e784128902dfe01d489c4123d69918a9f3c1eac5"
"reference": "e028ba46ba0d7f9a78bc3201c251e137383e145f"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/vimeo/psalm/zipball/e784128902dfe01d489c4123d69918a9f3c1eac5",
"reference": "e784128902dfe01d489c4123d69918a9f3c1eac5",
"url": "https://api.github.com/repos/vimeo/psalm/zipball/e028ba46ba0d7f9a78bc3201c251e137383e145f",
"reference": "e028ba46ba0d7f9a78bc3201c251e137383e145f",
"shasum": ""
},
"require": {
@@ -5331,12 +5280,12 @@
"ext-tokenizer": "*",
"felixfbecker/advanced-json-rpc": "^3.1",
"felixfbecker/language-server-protocol": "^1.5.2",
"fidry/cpu-core-counter": "^0.4.0",
"fidry/cpu-core-counter": "^0.4.1 || ^0.5.1",
"netresearch/jsonmapper": "^1.0 || ^2.0 || ^3.0 || ^4.0",
"nikic/php-parser": "^4.13",
"php": "^7.4 || ~8.0.0 || ~8.1.0 || ~8.2.0",
"sebastian/diff": "^4.0 || ^5.0",
"spatie/array-to-xml": "^2.17.0",
"spatie/array-to-xml": "^2.17.0 || ^3.0",
"symfony/console": "^4.1.6 || ^5.0 || ^6.0",
"symfony/filesystem": "^5.4 || ^6.0"
},
@@ -5345,13 +5294,13 @@
},
"require-dev": {
"bamarni/composer-bin-plugin": "^1.4",
"brianium/paratest": "^6.0",
"brianium/paratest": "^6.9",
"ext-curl": "*",
"mockery/mockery": "^1.5",
"nunomaduro/mock-final-classes": "^1.1",
"php-parallel-lint/php-parallel-lint": "^1.2",
"phpstan/phpdoc-parser": "^1.6",
"phpunit/phpunit": "^9.5",
"phpunit/phpunit": "^9.6",
"psalm/plugin-mockery": "^1.1",
"psalm/plugin-phpunit": "^0.18",
"slevomat/coding-standard": "^8.4",
@@ -5397,13 +5346,14 @@
"keywords": [
"code",
"inspection",
"php"
"php",
"static analysis"
],
"support": {
"issues": "https://github.com/vimeo/psalm/issues",
"source": "https://github.com/vimeo/psalm/tree/5.6.0"
"source": "https://github.com/vimeo/psalm/tree/5.7.7"
},
"time": "2023-01-23T20:32:47+00:00"
"time": "2023-02-25T01:05:07+00:00"
},
{
"name": "webmozart/assert",

View File

@@ -1,50 +0,0 @@
OC.L10N.register(
"deck",
{
"Deck" : "Deck",
"Personal" : "Personal",
"%s on %s" : "%s en %s",
"Finished" : "Finó",
"Action needed" : "Precísase aición",
"Later" : "Más sero",
"Done" : "Fecho",
"The file was uploaded" : "Xubióse'l ficheru",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "El ficheru xubíu perpasa la direutiva de xuba upload_max_filesize en php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "El ficheru xubíu perpasa la direutiva \"MAX_FILE_SIZE\" especificada nel formulariu HTML",
"No file was uploaded" : "Nun se xubieron fichjeros",
"Missing a temporary folder" : "Falta un direutoriu temporal",
"Could not write file to disk" : "Nun pudo escribise nel discu'l ficheru",
"A PHP extension stopped the file upload" : "Una estensión de PHP paró la xuba de ficheros",
"Invalid date, date format must be YYYY-MM-DD" : "Data non válida, el formatu ha ser AAAA-MM-DD",
"Cancel" : "Encaboxar",
"Close" : "Zarrar",
"File already exists" : "Yá esiste'l ficheru",
"Show archived cards" : "Amosar tarxetes archivaes",
"Details" : "Detalles",
"Sharing" : "Compartiendo",
"Tags" : "Etiquetes",
"Undo" : "Desfacer",
"Can edit" : "Can edit",
"Can share" : "Can share",
"Owner" : "Owner",
"Delete" : "Desaniciar",
"Edit" : "Editar",
"Members" : "Miembros",
"Download" : "Baxar",
"Attachments" : "Axuntos",
"Comments" : "Comentarios",
"Modified" : "Modificóse'l",
"Created" : "Creóse",
"Today" : "Güei",
"Tomorrow" : "Mañana",
"Save" : "Guardar",
"Reply" : "Rempuesta",
"Update" : "Anovar",
"Description" : "Descripción",
"(group)" : "(grupu)",
"seconds ago" : "hai segundos",
"Shared with you" : "Shared with you",
"No notifications" : "Ensin avisos",
"Share" : "Share"
},
"nplurals=2; plural=(n != 1);");

View File

@@ -1,48 +0,0 @@
{ "translations": {
"Deck" : "Deck",
"Personal" : "Personal",
"%s on %s" : "%s en %s",
"Finished" : "Finó",
"Action needed" : "Precísase aición",
"Later" : "Más sero",
"Done" : "Fecho",
"The file was uploaded" : "Xubióse'l ficheru",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "El ficheru xubíu perpasa la direutiva de xuba upload_max_filesize en php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "El ficheru xubíu perpasa la direutiva \"MAX_FILE_SIZE\" especificada nel formulariu HTML",
"No file was uploaded" : "Nun se xubieron fichjeros",
"Missing a temporary folder" : "Falta un direutoriu temporal",
"Could not write file to disk" : "Nun pudo escribise nel discu'l ficheru",
"A PHP extension stopped the file upload" : "Una estensión de PHP paró la xuba de ficheros",
"Invalid date, date format must be YYYY-MM-DD" : "Data non válida, el formatu ha ser AAAA-MM-DD",
"Cancel" : "Encaboxar",
"Close" : "Zarrar",
"File already exists" : "Yá esiste'l ficheru",
"Show archived cards" : "Amosar tarxetes archivaes",
"Details" : "Detalles",
"Sharing" : "Compartiendo",
"Tags" : "Etiquetes",
"Undo" : "Desfacer",
"Can edit" : "Can edit",
"Can share" : "Can share",
"Owner" : "Owner",
"Delete" : "Desaniciar",
"Edit" : "Editar",
"Members" : "Miembros",
"Download" : "Baxar",
"Attachments" : "Axuntos",
"Comments" : "Comentarios",
"Modified" : "Modificóse'l",
"Created" : "Creóse",
"Today" : "Güei",
"Tomorrow" : "Mañana",
"Save" : "Guardar",
"Reply" : "Rempuesta",
"Update" : "Anovar",
"Description" : "Descripción",
"(group)" : "(grupu)",
"seconds ago" : "hai segundos",
"Shared with you" : "Shared with you",
"No notifications" : "Ensin avisos",
"Share" : "Share"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
}

View File

@@ -79,8 +79,12 @@ OC.L10N.register(
"The board \"%s\" has been shared with you by %s." : "Таблото \"%s\" е споделено с вас от%s.",
"{user} has shared {deck-board} with you." : "{user} сподели {deck-board} с Вас.",
"Deck board" : "Deck табло",
"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",
"Card comments" : "Коментари на карти",
"%s on %s" : "%s на %s",
"Deck boards and cards" : "Табла и карти",
"No data was provided to create an attachment." : "Не бяха предоставени данни за създаване на прикачен файл.",
"Finished" : "Готово",
"To review" : "За преглед",
@@ -291,6 +295,7 @@ OC.L10N.register(
"No due" : "Не се дължи",
"Search for {searchQuery} in all boards" : "Търсене на {searchQuery} във всички табла",
"No results found" : "Няма намерени резултати",
"Deck board {name}\n* Last modified on {lastMod}" : "Табло {name}\n* Последна промяна на {lastMod}",
"{stack} in {board}" : "{stack} в {board}",
"Click to expand description" : "Кликване за разширяване на описанието",
"* Created on {created}\n* Last modified on {lastMod}\n* {nbAttachments} attachments\n* {nbComments} comments" : "* Създаден на {created}\n* Последна промяна на {lastMod} \n* {nbAttachments} прикачени файлове \n* {nbComments} коментара",
@@ -298,6 +303,7 @@ OC.L10N.register(
"Click to expand comment" : "Кликване за разширяване на коментара",
"No upcoming cards" : "Няма предстоящи карти",
"upcoming cards" : "предстоящи карти",
"New card" : "Нова карта",
"Due on {date}" : "Краен срок до {date}",
"Link to a board" : "Линк към табло",
"Link to a card" : "Линк към карта",

View File

@@ -77,8 +77,12 @@
"The board \"%s\" has been shared with you by %s." : "Таблото \"%s\" е споделено с вас от%s.",
"{user} has shared {deck-board} with you." : "{user} сподели {deck-board} с Вас.",
"Deck board" : "Deck табло",
"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",
"Card comments" : "Коментари на карти",
"%s on %s" : "%s на %s",
"Deck boards and cards" : "Табла и карти",
"No data was provided to create an attachment." : "Не бяха предоставени данни за създаване на прикачен файл.",
"Finished" : "Готово",
"To review" : "За преглед",
@@ -289,6 +293,7 @@
"No due" : "Не се дължи",
"Search for {searchQuery} in all boards" : "Търсене на {searchQuery} във всички табла",
"No results found" : "Няма намерени резултати",
"Deck board {name}\n* Last modified on {lastMod}" : "Табло {name}\n* Последна промяна на {lastMod}",
"{stack} in {board}" : "{stack} в {board}",
"Click to expand description" : "Кликване за разширяване на описанието",
"* Created on {created}\n* Last modified on {lastMod}\n* {nbAttachments} attachments\n* {nbComments} comments" : "* Създаден на {created}\n* Последна промяна на {lastMod} \n* {nbAttachments} прикачени файлове \n* {nbComments} коментара",
@@ -296,6 +301,7 @@
"Click to expand comment" : "Кликване за разширяване на коментара",
"No upcoming cards" : "Няма предстоящи карти",
"upcoming cards" : "предстоящи карти",
"New card" : "Нова карта",
"Due on {date}" : "Краен срок до {date}",
"Link to a board" : "Линк към табло",
"Link to a card" : "Линк към карта",

View File

@@ -79,8 +79,12 @@ OC.L10N.register(
"The board \"%s\" has been shared with you by %s." : "El tauler \"%s\" se us ha compartit per %s.",
"{user} has shared {deck-board} with you." : "{user} us ha compartit {board}.",
"Deck board" : "Tauler de Deck",
"Owned by %1$s" : "Propietat de %1$s",
"Deck boards, cards and comments" : "Taulers, targetes i comentaris",
"From %1$s, in %2$s/%3$s, owned by %4$s" : "De %1$s, a %2$s/%3$s, propietat de %4$s",
"Card comments" : "Comentaris de la targeta",
"%s on %s" : "%s a %s",
"Deck boards and cards" : "Taulers de piles i targetes",
"No data was provided to create an attachment." : "No sha proporcionat cap dada per crear un fitxer adjunt.",
"Finished" : "Acabat",
"To review" : "Per revisar",
@@ -153,6 +157,7 @@ OC.L10N.register(
"Toggle compact mode" : "Commuta el mode compacte",
"Open details" : "Obre els detalls",
"Details" : "Detalls",
"Currently present people" : "Persones presents actuals",
"Loading board" : "S'està carregant el tauler",
"No lists available" : "No hi ha cap llista disponible",
"Create a new list to add cards to this board" : "Crea una llista nova per afegir targetes a aquest tauler",
@@ -181,6 +186,7 @@ OC.L10N.register(
"Transfer" : "Transferència",
"The board has been transferred to {user}" : "El tauler s'ha transferit a {user}",
"Failed to transfer the board to {user}" : "No s'ha pogut transferir el tauler a {user}",
"Edit list title" : "Edita el títol de la llista",
"Archive all cards" : "Arxiva totes les targetes",
"Unarchive all cards" : "Desarxivar totes les targetes",
"Delete list" : "Suprimeix la llista",
@@ -271,6 +277,7 @@ OC.L10N.register(
"Clone board" : "Clonar tauler",
"Unarchive board" : "Desarxiva el tauler",
"Archive board" : "Arxiva el tauler",
"Export board" : "Exportació de tauler",
"Turn on due date reminders" : "Activa els recordatoris de data de venciment",
"Turn off due date reminders" : "Desactiva els recordatoris de data de venciment",
"Due date reminders" : "Recordatoris de data de venciment",
@@ -288,12 +295,15 @@ OC.L10N.register(
"No due" : "Sense venciment",
"Search for {searchQuery} in all boards" : "Busca {searchQuery} a tots els taulers",
"No results found" : "No s'han trobat resultats",
"Deck board {name}\n* Last modified on {lastMod}" : "Tauler de piles {name}\n* Última modificació el dia {lastMod}",
"{stack} in {board}" : "{stack} a {board}",
"Click to expand description" : "Feu clic per ampliar la descripció",
"* Created on {created}\n* Last modified on {lastMod}\n* {nbAttachments} attachments\n* {nbComments} comments" : "* Creat el {created}\n* Última modificació el dia {lastMod}\n* {nbAttachments} fitxers adjunts\n* {nbComments} comentaris",
"{nbCards} cards" : "{nbCards} targetes",
"Click to expand comment" : "Feu clic per ampliar el comentari",
"No upcoming cards" : "No hi ha pròximes targetes",
"upcoming cards" : "pròximes targetes",
"New card" : "Nova targeta",
"Due on {date}" : "Venciment el dia {date}",
"Link to a board" : "Enllaça a un tauler",
"Link to a card" : "Enllaç una targeta",

View File

@@ -77,8 +77,12 @@
"The board \"%s\" has been shared with you by %s." : "El tauler \"%s\" se us ha compartit per %s.",
"{user} has shared {deck-board} with you." : "{user} us ha compartit {board}.",
"Deck board" : "Tauler de Deck",
"Owned by %1$s" : "Propietat de %1$s",
"Deck boards, cards and comments" : "Taulers, targetes i comentaris",
"From %1$s, in %2$s/%3$s, owned by %4$s" : "De %1$s, a %2$s/%3$s, propietat de %4$s",
"Card comments" : "Comentaris de la targeta",
"%s on %s" : "%s a %s",
"Deck boards and cards" : "Taulers de piles i targetes",
"No data was provided to create an attachment." : "No sha proporcionat cap dada per crear un fitxer adjunt.",
"Finished" : "Acabat",
"To review" : "Per revisar",
@@ -151,6 +155,7 @@
"Toggle compact mode" : "Commuta el mode compacte",
"Open details" : "Obre els detalls",
"Details" : "Detalls",
"Currently present people" : "Persones presents actuals",
"Loading board" : "S'està carregant el tauler",
"No lists available" : "No hi ha cap llista disponible",
"Create a new list to add cards to this board" : "Crea una llista nova per afegir targetes a aquest tauler",
@@ -179,6 +184,7 @@
"Transfer" : "Transferència",
"The board has been transferred to {user}" : "El tauler s'ha transferit a {user}",
"Failed to transfer the board to {user}" : "No s'ha pogut transferir el tauler a {user}",
"Edit list title" : "Edita el títol de la llista",
"Archive all cards" : "Arxiva totes les targetes",
"Unarchive all cards" : "Desarxivar totes les targetes",
"Delete list" : "Suprimeix la llista",
@@ -269,6 +275,7 @@
"Clone board" : "Clonar tauler",
"Unarchive board" : "Desarxiva el tauler",
"Archive board" : "Arxiva el tauler",
"Export board" : "Exportació de tauler",
"Turn on due date reminders" : "Activa els recordatoris de data de venciment",
"Turn off due date reminders" : "Desactiva els recordatoris de data de venciment",
"Due date reminders" : "Recordatoris de data de venciment",
@@ -286,12 +293,15 @@
"No due" : "Sense venciment",
"Search for {searchQuery} in all boards" : "Busca {searchQuery} a tots els taulers",
"No results found" : "No s'han trobat resultats",
"Deck board {name}\n* Last modified on {lastMod}" : "Tauler de piles {name}\n* Última modificació el dia {lastMod}",
"{stack} in {board}" : "{stack} a {board}",
"Click to expand description" : "Feu clic per ampliar la descripció",
"* Created on {created}\n* Last modified on {lastMod}\n* {nbAttachments} attachments\n* {nbComments} comments" : "* Creat el {created}\n* Última modificació el dia {lastMod}\n* {nbAttachments} fitxers adjunts\n* {nbComments} comentaris",
"{nbCards} cards" : "{nbCards} targetes",
"Click to expand comment" : "Feu clic per ampliar el comentari",
"No upcoming cards" : "No hi ha pròximes targetes",
"upcoming cards" : "pròximes targetes",
"New card" : "Nova targeta",
"Due on {date}" : "Venciment el dia {date}",
"Link to a board" : "Enllaça a un tauler",
"Link to a card" : "Enllaç una targeta",

View File

@@ -303,6 +303,7 @@ OC.L10N.register(
"Click to expand comment" : "Komentář rozbalíte kliknutím",
"No upcoming cards" : "Žádné nadcházející karty",
"upcoming cards" : "nadcházející karty",
"New card" : "Nová karta",
"Due on {date}" : "Termín {date}",
"Link to a board" : "Propojit s tabulí",
"Link to a card" : "Propojit s kartou",

View File

@@ -301,6 +301,7 @@
"Click to expand comment" : "Komentář rozbalíte kliknutím",
"No upcoming cards" : "Žádné nadcházející karty",
"upcoming cards" : "nadcházející karty",
"New card" : "Nová karta",
"Due on {date}" : "Termín {date}",
"Link to a board" : "Propojit s tabulí",
"Link to a card" : "Propojit s kartou",

View File

@@ -303,6 +303,7 @@ OC.L10N.register(
"Click to expand comment" : "Klicken, um den Kommentar zu erweitern",
"No upcoming cards" : "Keine anstehenden Karten",
"upcoming cards" : "Anstehende Karten",
"New card" : "Neue Karte",
"Due on {date}" : "Fällig am {date}",
"Link to a board" : "Mit einem Board verknüpfen",
"Link to a card" : "Mit einer Karte verknüpfen",

View File

@@ -301,6 +301,7 @@
"Click to expand comment" : "Klicken, um den Kommentar zu erweitern",
"No upcoming cards" : "Keine anstehenden Karten",
"upcoming cards" : "Anstehende Karten",
"New card" : "Neue Karte",
"Due on {date}" : "Fällig am {date}",
"Link to a board" : "Mit einem Board verknüpfen",
"Link to a card" : "Mit einer Karte verknüpfen",

View File

@@ -303,6 +303,7 @@ OC.L10N.register(
"Click to expand comment" : "Klicken, um den Kommentar zu erweitern",
"No upcoming cards" : "Keine anstehenden Karten",
"upcoming cards" : "Anstehende Karten",
"New card" : "Neue Karte",
"Due on {date}" : "Fällig am {date}",
"Link to a board" : "Mit einem Board verknüpfen",
"Link to a card" : "Mit einer Karte verknüpfen",

View File

@@ -301,6 +301,7 @@
"Click to expand comment" : "Klicken, um den Kommentar zu erweitern",
"No upcoming cards" : "Keine anstehenden Karten",
"upcoming cards" : "Anstehende Karten",
"New card" : "Neue Karte",
"Due on {date}" : "Fällig am {date}",
"Link to a board" : "Mit einem Board verknüpfen",
"Link to a card" : "Mit einer Karte verknüpfen",

View File

@@ -79,8 +79,11 @@ OC.L10N.register(
"The board \"%s\" has been shared with you by %s." : "Ο πίνακας \"%s\" είναι σε κοινή χρήση μαζί σας από %s.",
"{user} has shared {deck-board} with you." : "Ο/Η διαμοιράστηκε μαζί σας το {deck-board}",
"Deck board" : "Πίνακας του Deck",
"Owned by %1$s" : "Ανήκει στον/στην %1$s",
"Deck boards, cards and comments" : "Πίνακες, κάρτες και σχόλια Deck",
"Card comments" : "Σχόλια καρτέλας",
"%s on %s" : "%s στο %s",
"Deck boards and cards" : "Πίνακες και κάρτες Deck",
"No data was provided to create an attachment." : "Δεν δόθηκαν στοιχεία για δημιουργία συνημμένου.",
"Finished" : "Ολοκληρώθηκε",
"To review" : "Προς επισκόπηση",
@@ -136,6 +139,7 @@ OC.L10N.register(
"Archived cards" : "Αρχειοθετημένες καρτέλες",
"Add list" : "Προσθήκη λίστας",
"List name" : "Όνομα λίστας",
"Active filters" : "Ενεργά φίλτρα",
"Apply filter" : "Εφαρμογή φίλτρου",
"Filter by tag" : "Φίλτρο ανά ετικέτα",
"Filter by assigned user" : "Φίλτρο ανά χρήστη",
@@ -152,6 +156,7 @@ OC.L10N.register(
"Toggle compact mode" : "Εναλλαγή λειτουργίας μικρού μεγέθους",
"Open details" : "Άνοιγμα λεπτομερειών",
"Details" : "Λεπτομέρειες",
"Currently present people" : "Παρόντες αυτή τη στιγμή",
"Loading board" : "Φόρτωση πίνακα",
"No lists available" : "Δεν υπάρχουν διαθέσιμες λίστες",
"Create a new list to add cards to this board" : "Δημιουργήστε νέα λίστα για να προσθέσετε καρτέλες σε αυτό τον πίνακα.",
@@ -175,10 +180,17 @@ OC.L10N.register(
"Owner" : "Κάτοχος",
"Delete" : "Διαγραφή",
"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}",
"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" : "Όνομα καρτέλας",
"List deleted" : "Η λίστα διαγράφηκε",
@@ -236,7 +248,9 @@ OC.L10N.register(
"Write a description …" : "Γράψτε μια περιγραφή…",
"Choose attachment" : "Επιλογή συνημμένου",
"(group)" : "(ομάδα)",
"Todo items" : "Στοιχεία todo",
"{count} comments, {unread} unread" : "{count} σχόλια, {unread} μη αναγνωσμένα",
"Edit card title" : "Επεξεργασία τίτλου κάρτας",
"Assign to me" : "Ανάθεση σε εμένα",
"Unassign myself" : "Αποδέσμευσή μου",
"Move card" : "Μετακίνηση καρτέλας",
@@ -251,6 +265,7 @@ OC.L10N.register(
"All boards" : "Όλοι οι πίνακες",
"Archived boards" : "Αρχειοθέτηση πινάκων ",
"Shared with you" : "Διαμοιρασμένα μαζί σας",
"Deck settings" : "Ρυθμίσεις Deck",
"Use bigger card view" : "Χρησιμοποιήστε μεγαλύτερη προβολή καρτέλας",
"Show boards in calendar/tasks" : "Εμφάνιση πινάκων στο ημερολόγιο / εργασίες",
"Limit deck usage of groups" : "Περιορίστε τη χρήση της εφαρμογής deck σε ομάδες",
@@ -260,6 +275,7 @@ OC.L10N.register(
"Clone board" : "Κλώνος πίνακα",
"Unarchive board" : "Κατάργηση αρχειοθέτησης πίνακα",
"Archive board" : "Αρχειοθέτηση πίνακα",
"Export board" : "Εξαγωγή πίνακα",
"Turn on due date reminders" : "Ενεργοποιήστε τις υπενθυμίσεις ημερομηνίας προθεσμίας",
"Turn off due date reminders" : "Απενεργοποιήστε τις υπενθυμίσεις ημερομηνίας προθεσμίας",
"Due date reminders" : "Υπενθυμίσεις ημερομηνίας προθεσμίας",
@@ -271,14 +287,21 @@ OC.L10N.register(
"Only assigned cards" : "Μόνο καρτέλες που έχουν ανατεθεί",
"No reminder" : "Δεν υπάρχει υπενθύμιση",
"An error occurred" : "Παρουσιάστηκε σφάλμα",
"Are you sure you want to delete the board {title}? This will delete all the data of this board including archived cards." : "Είστε βέβαιοι ότι θέλετε να διαγράψετε τον πίνακα {title}; Αυτό θα διαγράψει όλα τα δεδομένα του πίνακα συμπεριλαμβανομένων και των αρχειοθετημένων καρτών.",
"Delete the board?" : "Διαγραφή του πίνακα;",
"Loading filtered view" : "Φόρτωση εμφάνισης με βάση το φίλτρο",
"No due" : "Χωρίς λήξη",
"Search for {searchQuery} in all boards" : "Αναζήτηση για {searchQuery} σε όλους τους πίνακες",
"No results found" : "Δεν βρέθηκαν αποτελέσματα",
"Deck board {name}\n* Last modified on {lastMod}" : "Πίνακας Deck {name}\n* Τελευταία τροποποίηση στις {lastMod}",
"{stack} in {board}" : "{stack} στο {board}",
"Click to expand description" : "Κλικ για επέκταση περιγραφής",
"* Created on {created}\n* Last modified on {lastMod}\n* {nbAttachments} attachments\n* {nbComments} comments" : "* Δημιουργήθηκε στις {created}\n* Τροποποιήθηκε στις {lastMod}\n* {nbAttachments} συνημμένα\n* {nbComments} σχόλια",
"{nbCards} cards" : "{nbCards} κάρτες",
"Click to expand comment" : "Κλικ για επέκταση σχολίου",
"No upcoming cards" : "Δεν υπάρχουν επερχόμενες καρτέλες",
"upcoming cards" : "επερχόμενες καρτέλες",
"Due on {date}" : "Προθεσμία στις {date}",
"Link to a board" : "Σύνδεσμος στον πίνακα",
"Link to a card" : "Σύνδεσμος σε καρτέλα",
"Create a card" : "Δημιουργία καρτέλας",
@@ -291,6 +314,8 @@ OC.L10N.register(
"Share {file} with a Deck card" : "Μοιραστείτε το {file} με μια καρτέλα Deck",
"Share" : "Μοιραστείτε",
"Are you sure you want to transfer the board {title} for {user}?" : "Είστε σίγουροι ότι θέλετε να μεταφέρετε τον πίνακα {title} για {user}? ",
"Transfer the board for {user} successfully" : "Επιτυχής μεταφορά του πίνακα για τον χρήστη {user}",
"Failed to transfer the board for {user}" : "Απέτυχε η μεταφορά του πίνακα για τον χρήστη {user}",
"Add a new list" : "Προσθήκη νέας λίστας",
"Are you sure you want to delete the board {title}? This will delete all the data of this board." : "Είστε βέβαιοι ότι θέλετε να διαγράψετε τον πίνακα {title}; Θα διαγραφούν όλα τα δεδομένα."
},

View File

@@ -77,8 +77,11 @@
"The board \"%s\" has been shared with you by %s." : "Ο πίνακας \"%s\" είναι σε κοινή χρήση μαζί σας από %s.",
"{user} has shared {deck-board} with you." : "Ο/Η διαμοιράστηκε μαζί σας το {deck-board}",
"Deck board" : "Πίνακας του Deck",
"Owned by %1$s" : "Ανήκει στον/στην %1$s",
"Deck boards, cards and comments" : "Πίνακες, κάρτες και σχόλια Deck",
"Card comments" : "Σχόλια καρτέλας",
"%s on %s" : "%s στο %s",
"Deck boards and cards" : "Πίνακες και κάρτες Deck",
"No data was provided to create an attachment." : "Δεν δόθηκαν στοιχεία για δημιουργία συνημμένου.",
"Finished" : "Ολοκληρώθηκε",
"To review" : "Προς επισκόπηση",
@@ -134,6 +137,7 @@
"Archived cards" : "Αρχειοθετημένες καρτέλες",
"Add list" : "Προσθήκη λίστας",
"List name" : "Όνομα λίστας",
"Active filters" : "Ενεργά φίλτρα",
"Apply filter" : "Εφαρμογή φίλτρου",
"Filter by tag" : "Φίλτρο ανά ετικέτα",
"Filter by assigned user" : "Φίλτρο ανά χρήστη",
@@ -150,6 +154,7 @@
"Toggle compact mode" : "Εναλλαγή λειτουργίας μικρού μεγέθους",
"Open details" : "Άνοιγμα λεπτομερειών",
"Details" : "Λεπτομέρειες",
"Currently present people" : "Παρόντες αυτή τη στιγμή",
"Loading board" : "Φόρτωση πίνακα",
"No lists available" : "Δεν υπάρχουν διαθέσιμες λίστες",
"Create a new list to add cards to this board" : "Δημιουργήστε νέα λίστα για να προσθέσετε καρτέλες σε αυτό τον πίνακα.",
@@ -173,10 +178,17 @@
"Owner" : "Κάτοχος",
"Delete" : "Διαγραφή",
"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}",
"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" : "Όνομα καρτέλας",
"List deleted" : "Η λίστα διαγράφηκε",
@@ -234,7 +246,9 @@
"Write a description …" : "Γράψτε μια περιγραφή…",
"Choose attachment" : "Επιλογή συνημμένου",
"(group)" : "(ομάδα)",
"Todo items" : "Στοιχεία todo",
"{count} comments, {unread} unread" : "{count} σχόλια, {unread} μη αναγνωσμένα",
"Edit card title" : "Επεξεργασία τίτλου κάρτας",
"Assign to me" : "Ανάθεση σε εμένα",
"Unassign myself" : "Αποδέσμευσή μου",
"Move card" : "Μετακίνηση καρτέλας",
@@ -249,6 +263,7 @@
"All boards" : "Όλοι οι πίνακες",
"Archived boards" : "Αρχειοθέτηση πινάκων ",
"Shared with you" : "Διαμοιρασμένα μαζί σας",
"Deck settings" : "Ρυθμίσεις Deck",
"Use bigger card view" : "Χρησιμοποιήστε μεγαλύτερη προβολή καρτέλας",
"Show boards in calendar/tasks" : "Εμφάνιση πινάκων στο ημερολόγιο / εργασίες",
"Limit deck usage of groups" : "Περιορίστε τη χρήση της εφαρμογής deck σε ομάδες",
@@ -258,6 +273,7 @@
"Clone board" : "Κλώνος πίνακα",
"Unarchive board" : "Κατάργηση αρχειοθέτησης πίνακα",
"Archive board" : "Αρχειοθέτηση πίνακα",
"Export board" : "Εξαγωγή πίνακα",
"Turn on due date reminders" : "Ενεργοποιήστε τις υπενθυμίσεις ημερομηνίας προθεσμίας",
"Turn off due date reminders" : "Απενεργοποιήστε τις υπενθυμίσεις ημερομηνίας προθεσμίας",
"Due date reminders" : "Υπενθυμίσεις ημερομηνίας προθεσμίας",
@@ -269,14 +285,21 @@
"Only assigned cards" : "Μόνο καρτέλες που έχουν ανατεθεί",
"No reminder" : "Δεν υπάρχει υπενθύμιση",
"An error occurred" : "Παρουσιάστηκε σφάλμα",
"Are you sure you want to delete the board {title}? This will delete all the data of this board including archived cards." : "Είστε βέβαιοι ότι θέλετε να διαγράψετε τον πίνακα {title}; Αυτό θα διαγράψει όλα τα δεδομένα του πίνακα συμπεριλαμβανομένων και των αρχειοθετημένων καρτών.",
"Delete the board?" : "Διαγραφή του πίνακα;",
"Loading filtered view" : "Φόρτωση εμφάνισης με βάση το φίλτρο",
"No due" : "Χωρίς λήξη",
"Search for {searchQuery} in all boards" : "Αναζήτηση για {searchQuery} σε όλους τους πίνακες",
"No results found" : "Δεν βρέθηκαν αποτελέσματα",
"Deck board {name}\n* Last modified on {lastMod}" : "Πίνακας Deck {name}\n* Τελευταία τροποποίηση στις {lastMod}",
"{stack} in {board}" : "{stack} στο {board}",
"Click to expand description" : "Κλικ για επέκταση περιγραφής",
"* Created on {created}\n* Last modified on {lastMod}\n* {nbAttachments} attachments\n* {nbComments} comments" : "* Δημιουργήθηκε στις {created}\n* Τροποποιήθηκε στις {lastMod}\n* {nbAttachments} συνημμένα\n* {nbComments} σχόλια",
"{nbCards} cards" : "{nbCards} κάρτες",
"Click to expand comment" : "Κλικ για επέκταση σχολίου",
"No upcoming cards" : "Δεν υπάρχουν επερχόμενες καρτέλες",
"upcoming cards" : "επερχόμενες καρτέλες",
"Due on {date}" : "Προθεσμία στις {date}",
"Link to a board" : "Σύνδεσμος στον πίνακα",
"Link to a card" : "Σύνδεσμος σε καρτέλα",
"Create a card" : "Δημιουργία καρτέλας",
@@ -289,6 +312,8 @@
"Share {file} with a Deck card" : "Μοιραστείτε το {file} με μια καρτέλα Deck",
"Share" : "Μοιραστείτε",
"Are you sure you want to transfer the board {title} for {user}?" : "Είστε σίγουροι ότι θέλετε να μεταφέρετε τον πίνακα {title} για {user}? ",
"Transfer the board for {user} successfully" : "Επιτυχής μεταφορά του πίνακα για τον χρήστη {user}",
"Failed to transfer the board for {user}" : "Απέτυχε η μεταφορά του πίνακα για τον χρήστη {user}",
"Add a new list" : "Προσθήκη νέας λίστας",
"Are you sure you want to delete the board {title}? This will delete all the data of this board." : "Είστε βέβαιοι ότι θέλετε να διαγράψετε τον πίνακα {title}; Θα διαγραφούν όλα τα δεδομένα."
},"pluralForm" :"nplurals=2; plural=(n != 1);"

View File

@@ -303,6 +303,7 @@ OC.L10N.register(
"Click to expand comment" : "Click to expand comment",
"No upcoming cards" : "No upcoming cards",
"upcoming cards" : "upcoming cards",
"New card" : "New card",
"Due on {date}" : "Due on {date}",
"Link to a board" : "Link to a board",
"Link to a card" : "Link to a card",

View File

@@ -301,6 +301,7 @@
"Click to expand comment" : "Click to expand comment",
"No upcoming cards" : "No upcoming cards",
"upcoming cards" : "upcoming cards",
"New card" : "New card",
"Due on {date}" : "Due on {date}",
"Link to a board" : "Link to a board",
"Link to a card" : "Link to a card",

View File

@@ -303,6 +303,7 @@ OC.L10N.register(
"Click to expand comment" : "Pulse para expandir el comentario",
"No upcoming cards" : "No hay tarjetas próximas",
"upcoming cards" : "próximas tarjetas",
"New card" : "Nueva tarjeta",
"Due on {date}" : "Vence en {date}",
"Link to a board" : "Enlace a un tablero",
"Link to a card" : "Enlace a una tarjeta",

View File

@@ -301,6 +301,7 @@
"Click to expand comment" : "Pulse para expandir el comentario",
"No upcoming cards" : "No hay tarjetas próximas",
"upcoming cards" : "próximas tarjetas",
"New card" : "Nueva tarjeta",
"Due on {date}" : "Vence en {date}",
"Link to a board" : "Enlace a un tablero",
"Link to a card" : "Enlace a una tarjeta",

View File

@@ -303,6 +303,7 @@ OC.L10N.register(
"Click to expand comment" : "Egin klik iruzkina handitzeko",
"No upcoming cards" : "Ez dago hurrengo txartelik",
"upcoming cards" : "hurrengo txartelak",
"New card" : "Txartel berria",
"Due on {date}" : "Iraungitze-data {date}",
"Link to a board" : "Estekatu taula batera",
"Link to a card" : "Estekatu txartel batera",

View File

@@ -301,6 +301,7 @@
"Click to expand comment" : "Egin klik iruzkina handitzeko",
"No upcoming cards" : "Ez dago hurrengo txartelik",
"upcoming cards" : "hurrengo txartelak",
"New card" : "Txartel berria",
"Due on {date}" : "Iraungitze-data {date}",
"Link to a board" : "Estekatu taula batera",
"Link to a card" : "Estekatu txartel batera",

View File

@@ -81,6 +81,7 @@ OC.L10N.register(
"Deck board" : "Tableau",
"Owned by %1$s" : "Assignée à %1$s",
"Deck boards, cards and comments" : "Tableaux, cartes et commentaires",
"From %1$s, in %2$s/%3$s, owned by %4$s" : "De %1$s, dans %2$s / %3$s, appartenant à %4$s",
"Card comments" : "Commentaires de la carte",
"%s on %s" : "%s sur %s",
"Deck boards and cards" : "Tableaux et cartes",
@@ -124,7 +125,7 @@ OC.L10N.register(
"Card \"{card}\" was added to \"{board}\"" : "La carte \"{card}\" a été ajoutée au tableau \"{board}\"",
"Open card" : "Ouvrir la carte",
"Close" : "Fermer",
"Create card" : "Créer une carte",
"Create card" : "Créer la carte",
"Select a card" : "Sélectionnez une carte",
"Select the card to link to a project" : "Sélectionner la carte à relier à un projet",
"Link to card" : "Relier à une carte",
@@ -211,7 +212,7 @@ OC.L10N.register(
"File to share" : "Fichier à partager",
"Invalid path selected" : "Chemin sélectionné non valide",
"Open in sidebar view" : "Ouvrir dans le panneau latéral",
"Open in bigger view" : "Ouvrir dans la vue principale",
"Open in bigger view" : "Ouvrir dans la vue large",
"Attachments" : "Pièces jointes",
"Comments" : "Commentaires",
"Modified" : "Modifiée",
@@ -302,6 +303,7 @@ OC.L10N.register(
"Click to expand comment" : "Cliquer pour déplier le commentaire",
"No upcoming cards" : "Pas de cartes à venir",
"upcoming cards" : "cartes à venir",
"New card" : "Nouvelle carte",
"Due on {date}" : "Échéance le {date}",
"Link to a board" : "Relier à un tableau",
"Link to a card" : "Relier à une carte",

View File

@@ -79,6 +79,7 @@
"Deck board" : "Tableau",
"Owned by %1$s" : "Assignée à %1$s",
"Deck boards, cards and comments" : "Tableaux, cartes et commentaires",
"From %1$s, in %2$s/%3$s, owned by %4$s" : "De %1$s, dans %2$s / %3$s, appartenant à %4$s",
"Card comments" : "Commentaires de la carte",
"%s on %s" : "%s sur %s",
"Deck boards and cards" : "Tableaux et cartes",
@@ -122,7 +123,7 @@
"Card \"{card}\" was added to \"{board}\"" : "La carte \"{card}\" a été ajoutée au tableau \"{board}\"",
"Open card" : "Ouvrir la carte",
"Close" : "Fermer",
"Create card" : "Créer une carte",
"Create card" : "Créer la carte",
"Select a card" : "Sélectionnez une carte",
"Select the card to link to a project" : "Sélectionner la carte à relier à un projet",
"Link to card" : "Relier à une carte",
@@ -209,7 +210,7 @@
"File to share" : "Fichier à partager",
"Invalid path selected" : "Chemin sélectionné non valide",
"Open in sidebar view" : "Ouvrir dans le panneau latéral",
"Open in bigger view" : "Ouvrir dans la vue principale",
"Open in bigger view" : "Ouvrir dans la vue large",
"Attachments" : "Pièces jointes",
"Comments" : "Commentaires",
"Modified" : "Modifiée",
@@ -300,6 +301,7 @@
"Click to expand comment" : "Cliquer pour déplier le commentaire",
"No upcoming cards" : "Pas de cartes à venir",
"upcoming cards" : "cartes à venir",
"New card" : "Nouvelle carte",
"Due on {date}" : "Échéance le {date}",
"Link to a board" : "Relier à un tableau",
"Link to a card" : "Relier à une carte",

View File

@@ -220,7 +220,7 @@ OC.L10N.register(
"Formatting help" : "Axuda de formatado",
"Edit description" : "Editar a descrición",
"View description" : "Ver a descrición",
"Add Attachment" : "Engadir o anexo",
"Add Attachment" : "Engadir un anexo",
"Write a description …" : "Escriba unha descrición…",
"Choose attachment" : "Escoller o anexo",
"(group)" : "(grupo)",

View File

@@ -218,7 +218,7 @@
"Formatting help" : "Axuda de formatado",
"Edit description" : "Editar a descrición",
"View description" : "Ver a descrición",
"Add Attachment" : "Engadir o anexo",
"Add Attachment" : "Engadir un anexo",
"Write a description …" : "Escriba unha descrición…",
"Choose attachment" : "Escoller o anexo",
"(group)" : "(grupo)",

View File

@@ -79,8 +79,12 @@ OC.L10N.register(
"The board \"%s\" has been shared with you by %s." : "A(z) „%s” táblát %s osztotta meg Önnel.",
"{user} has shared {deck-board} with you." : "{user} megosztotta Önnel a(z) {deck-board} táblát.",
"Deck board" : "Kártyatábla",
"Owned by %1$s" : "Tulajdonos: %1$s",
"Deck boards, cards and comments" : "Kártyatáblák, kártyák és megjegyzések",
"From %1$s, in %2$s/%3$s, owned by %4$s" : "A következőtől: %1$s, ebben: %2$s/%3$s, tulajdonos: %4$s",
"Card comments" : "Kártya hozzászólásai",
"%s on %s" : "%s ezen: %s",
"Deck boards and cards" : "Kártyatáblák és kártyák",
"No data was provided to create an attachment." : "Nincsenek megadva adatok a melléklet létrehozásához.",
"Finished" : "Kész",
"To review" : "Áttekintendő",
@@ -291,6 +295,7 @@ OC.L10N.register(
"No due" : "Nincs határidő",
"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}",
"{stack} in {board}" : "{stack} itt: {board}",
"Click to expand description" : "Kattintson a leírás kibontásához",
"* Created on {created}\n* Last modified on {lastMod}\n* {nbAttachments} attachments\n* {nbComments} comments" : "* Létrehozva: {created}\n* Utoljára módosítva: {lastMod}\n* {nbAttachments} melléklet\n* {nbComments} megjegyzés",
@@ -298,6 +303,7 @@ OC.L10N.register(
"Click to expand comment" : "Kattintson a megjegyzés kibontásához",
"No upcoming cards" : "Nincsenek közelgő kártyák",
"upcoming cards" : "közelgő kártyák",
"New card" : "Új kártya",
"Due on {date}" : "Határidő: {date}",
"Link to a board" : "Hivatkozás egy táblához",
"Link to a card" : "Hivatkozás egy kártyához",

View File

@@ -77,8 +77,12 @@
"The board \"%s\" has been shared with you by %s." : "A(z) „%s” táblát %s osztotta meg Önnel.",
"{user} has shared {deck-board} with you." : "{user} megosztotta Önnel a(z) {deck-board} táblát.",
"Deck board" : "Kártyatábla",
"Owned by %1$s" : "Tulajdonos: %1$s",
"Deck boards, cards and comments" : "Kártyatáblák, kártyák és megjegyzések",
"From %1$s, in %2$s/%3$s, owned by %4$s" : "A következőtől: %1$s, ebben: %2$s/%3$s, tulajdonos: %4$s",
"Card comments" : "Kártya hozzászólásai",
"%s on %s" : "%s ezen: %s",
"Deck boards and cards" : "Kártyatáblák és kártyák",
"No data was provided to create an attachment." : "Nincsenek megadva adatok a melléklet létrehozásához.",
"Finished" : "Kész",
"To review" : "Áttekintendő",
@@ -289,6 +293,7 @@
"No due" : "Nincs határidő",
"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}",
"{stack} in {board}" : "{stack} itt: {board}",
"Click to expand description" : "Kattintson a leírás kibontásához",
"* Created on {created}\n* Last modified on {lastMod}\n* {nbAttachments} attachments\n* {nbComments} comments" : "* Létrehozva: {created}\n* Utoljára módosítva: {lastMod}\n* {nbAttachments} melléklet\n* {nbComments} megjegyzés",
@@ -296,6 +301,7 @@
"Click to expand comment" : "Kattintson a megjegyzés kibontásához",
"No upcoming cards" : "Nincsenek közelgő kártyák",
"upcoming cards" : "közelgő kártyák",
"New card" : "Új kártya",
"Due on {date}" : "Határidő: {date}",
"Link to a board" : "Hivatkozás egy táblához",
"Link to a card" : "Hivatkozás egy kártyához",

View File

@@ -3,6 +3,14 @@ OC.L10N.register(
{
"Personal" : "Անձնական",
"Done" : "Done",
"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 ձևաթղթում",
"The file was only partially uploaded" : "Նիշքի մի մասն է վերբեռնված",
"No file was uploaded" : "Ոչ մի նիշք չի վերնբեռնվել",
"Missing a temporary folder" : "Բացակայում է ժամանակավոր պանակը",
"Could not write file to disk" : "Չհաջողվեց գրառել նիշքը սկավառակի վրա",
"A PHP extension stopped the file upload" : "PHP֊ի ընդլայնումն կանգնեցրեց նիշքի վերբեռնումը",
"Cancel" : "ընդհատել",
"Close" : "Փակել",
"Details" : "Մանրամասներ",

View File

@@ -1,6 +1,14 @@
{ "translations": {
"Personal" : "Անձնական",
"Done" : "Done",
"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 ձևաթղթում",
"The file was only partially uploaded" : "Նիշքի մի մասն է վերբեռնված",
"No file was uploaded" : "Ոչ մի նիշք չի վերնբեռնվել",
"Missing a temporary folder" : "Բացակայում է ժամանակավոր պանակը",
"Could not write file to disk" : "Չհաջողվեց գրառել նիշքը սկավառակի վրա",
"A PHP extension stopped the file upload" : "PHP֊ի ընդլայնումն կանգնեցրեց նիշքի վերբեռնումը",
"Cancel" : "ընդհատել",
"Close" : "Փակել",
"Details" : "Մանրամասներ",

View File

@@ -67,6 +67,7 @@ OC.L10N.register(
"Deck" : "Longgok",
"Changes in the <strong>Deck app</strong>" : "Perubahan pada <strong>aplikasi Longgok</strong>",
"A <strong>comment</strong> was created on a card" : "<strong>Komentar</strong> telah dibuat pada suatu kartu",
"Upcoming cards" : "Kartu berikut",
"Personal" : "Personal",
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "Kartu \"%s\" pada \"%s\" telah ditugaskan kepada Anda oleh %s.",
"The card \"%s\" on \"%s\" has reached its due date." : "Kartu \"%s\" pada \"%s\" telah melampaui tenggat.",
@@ -93,6 +94,7 @@ OC.L10N.register(
"Could not write file to disk" : "Tidak dapat menulis berkas ke diska",
"A PHP extension stopped the file upload" : "Ekstensi PHP menghentikan proses unggah berkas",
"No file uploaded or file size exceeds maximum of %s" : "Gagal unggah berkas atau ukuran melampaui batas maksimum %s",
"Card not found" : "Kartu tidak ditemukan",
"Invalid date, date format must be YYYY-MM-DD" : "Tanggal salah, format tanggal harus TTTT-BB-HH",
"Personal planning and team project organization" : "Perencanaan pribadi dan pengelolaan proyek tim",
"Add board" : "Tambah papan",
@@ -115,10 +117,12 @@ OC.L10N.register(
"Drop your files to upload" : "Lepas berkas Anda untuk mengunggah",
"Add card" : "Tambah kartu",
"Archived cards" : "Arsip kartu",
"Add list" : "Tambahkan daftar",
"List name" : "Nama daftar",
"Apply filter" : "Terapkan filter",
"Filter by tag" : "Filter dengan tag",
"Filter by assigned user" : "Filter dengan pengguna",
"Unassigned" : "Belum ditugaskan",
"Filter by due date" : "Filter dengan tenggat",
"Overdue" : "Lewat tenggat",
"Next 24 hours" : "Jangka 24 jam",
@@ -208,11 +212,14 @@ OC.L10N.register(
"Clone board" : "Pengklonaan papan",
"Unarchive board" : "Memulihkan papan",
"Archive board" : "Mengarsipkan papan",
"No notifications" : "Tidak ada notifikasi.",
"No notifications" : "Tidak ada notifikasi",
"Delete board" : "Hapus papan",
"Board {0} deleted" : "{0} papan terhapus",
"An error occurred" : "Terjadi kesalahan",
"Delete the board?" : "Hapus papan?",
"Click to expand comment" : "Klik untuk membuka komentar",
"No upcoming cards" : "Tidak ada kartu berikut",
"upcoming cards" : "kartu berikut",
"Link to a board" : "Tautan ke papan",
"Link to a card" : "Tautan ke kartu",
"Something went wrong" : "Ada yang salah",

View File

@@ -65,6 +65,7 @@
"Deck" : "Longgok",
"Changes in the <strong>Deck app</strong>" : "Perubahan pada <strong>aplikasi Longgok</strong>",
"A <strong>comment</strong> was created on a card" : "<strong>Komentar</strong> telah dibuat pada suatu kartu",
"Upcoming cards" : "Kartu berikut",
"Personal" : "Personal",
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "Kartu \"%s\" pada \"%s\" telah ditugaskan kepada Anda oleh %s.",
"The card \"%s\" on \"%s\" has reached its due date." : "Kartu \"%s\" pada \"%s\" telah melampaui tenggat.",
@@ -91,6 +92,7 @@
"Could not write file to disk" : "Tidak dapat menulis berkas ke diska",
"A PHP extension stopped the file upload" : "Ekstensi PHP menghentikan proses unggah berkas",
"No file uploaded or file size exceeds maximum of %s" : "Gagal unggah berkas atau ukuran melampaui batas maksimum %s",
"Card not found" : "Kartu tidak ditemukan",
"Invalid date, date format must be YYYY-MM-DD" : "Tanggal salah, format tanggal harus TTTT-BB-HH",
"Personal planning and team project organization" : "Perencanaan pribadi dan pengelolaan proyek tim",
"Add board" : "Tambah papan",
@@ -113,10 +115,12 @@
"Drop your files to upload" : "Lepas berkas Anda untuk mengunggah",
"Add card" : "Tambah kartu",
"Archived cards" : "Arsip kartu",
"Add list" : "Tambahkan daftar",
"List name" : "Nama daftar",
"Apply filter" : "Terapkan filter",
"Filter by tag" : "Filter dengan tag",
"Filter by assigned user" : "Filter dengan pengguna",
"Unassigned" : "Belum ditugaskan",
"Filter by due date" : "Filter dengan tenggat",
"Overdue" : "Lewat tenggat",
"Next 24 hours" : "Jangka 24 jam",
@@ -206,11 +210,14 @@
"Clone board" : "Pengklonaan papan",
"Unarchive board" : "Memulihkan papan",
"Archive board" : "Mengarsipkan papan",
"No notifications" : "Tidak ada notifikasi.",
"No notifications" : "Tidak ada notifikasi",
"Delete board" : "Hapus papan",
"Board {0} deleted" : "{0} papan terhapus",
"An error occurred" : "Terjadi kesalahan",
"Delete the board?" : "Hapus papan?",
"Click to expand comment" : "Klik untuk membuka komentar",
"No upcoming cards" : "Tidak ada kartu berikut",
"upcoming cards" : "kartu berikut",
"Link to a board" : "Tautan ke papan",
"Link to a card" : "Tautan ke kartu",
"Something went wrong" : "Ada yang salah",

View File

@@ -175,6 +175,7 @@ OC.L10N.register(
"Owner" : "Proprietario",
"Delete" : "Elimina",
"Failed to create share with {displayName}" : "Creazione della condivisione con {displayName} non riuscita",
"Transfer the board." : "Trasferisci la bacheca.",
"Transfer" : "Trasferisci",
"Archive all cards" : "Archivia tutte le schede",
"Delete list" : "Elimina elenco",
@@ -290,6 +291,8 @@ OC.L10N.register(
"Share with a Deck card" : "Condividi con una scheda di Deck",
"Share {file} with a Deck card" : "Condividi {file} con una scheda di Deck",
"Share" : "Condividi",
"Transfer the board for {user} successfully" : "Trasferimento della bacheca per {user} avvenuta con successo.",
"Failed to transfer the board for {user}" : "Trasferimento della bacheca per {user} fallito",
"Add a new list" : "Aggiungi un nuovo elenco",
"Are you sure you want to delete the board {title}? This will delete all the data of this board." : "Sei sicuro di voler eliminare la lavagna {title}? Questo eliminerà tutti i dati di questa lavagna?"
},

View File

@@ -173,6 +173,7 @@
"Owner" : "Proprietario",
"Delete" : "Elimina",
"Failed to create share with {displayName}" : "Creazione della condivisione con {displayName} non riuscita",
"Transfer the board." : "Trasferisci la bacheca.",
"Transfer" : "Trasferisci",
"Archive all cards" : "Archivia tutte le schede",
"Delete list" : "Elimina elenco",
@@ -288,6 +289,8 @@
"Share with a Deck card" : "Condividi con una scheda di Deck",
"Share {file} with a Deck card" : "Condividi {file} con una scheda di Deck",
"Share" : "Condividi",
"Transfer the board for {user} successfully" : "Trasferimento della bacheca per {user} avvenuta con successo.",
"Failed to transfer the board for {user}" : "Trasferimento della bacheca per {user} fallito",
"Add a new list" : "Aggiungi un nuovo elenco",
"Are you sure you want to delete the board {title}? This will delete all the data of this board." : "Sei sicuro di voler eliminare la lavagna {title}? Questo eliminerà tutti i dati di questa lavagna?"
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"

View File

@@ -30,6 +30,8 @@ OC.L10N.register(
"Created" : "Үүсгэсэн",
"Today" : "өнөөдөр",
"Tomorrow" : "маргааш",
"Next week" : "Дараа 7 хоног",
"Next month" : "Дараа сар",
"Save" : "Хадгалах",
"Reply" : "хариулт",
"Update" : "Шинэчлэх",

View File

@@ -28,6 +28,8 @@
"Created" : "Үүсгэсэн",
"Today" : "өнөөдөр",
"Tomorrow" : "маргааш",
"Next week" : "Дараа 7 хоног",
"Next month" : "Дараа сар",
"Save" : "Хадгалах",
"Reply" : "хариулт",
"Update" : "Шинэчлэх",

View File

@@ -78,9 +78,13 @@ OC.L10N.register(
"{user} has mentioned you in a comment on {deck-card}." : "{user} har nevnt deg i en kommentar på {deck-card}.",
"The board \"%s\" has been shared with you by %s." : "Brettet \"%s\" har blitt delt med deg av %s.",
"{user} has shared {deck-board} with you." : "{user} har delt brettet {deck-board} med deg.",
"Deck board" : "Deck tavle",
"Deck board" : "Stokktavle",
"Owned by %1$s" : "Eid av %1$s",
"Deck boards, cards and comments" : "Stokktavler, kort og kommentarer",
"From %1$s, in %2$s/%3$s, owned by %4$s" : "Fra %1$s, under %2$s/%3$s, eid av %4$s",
"Card comments" : "Kommentarer på kortet",
"%s on %s" : "%s på %s",
"Deck boards and cards" : "Stokktavler og kort",
"No data was provided to create an attachment." : "Ingen data for å opprette vedlegg.",
"Finished" : "Fullført",
"To review" : "Til gjennomlesning",
@@ -153,6 +157,7 @@ OC.L10N.register(
"Toggle compact mode" : "Endre kompakt modus",
"Open details" : "Åpne detaljer",
"Details" : "Detaljer",
"Currently present people" : "Tilstedeværende personer for øyeblikket",
"Loading board" : "Laster tavle",
"No lists available" : "Ingen stabler tilgjengelig",
"Create a new list to add cards to this board" : "Lag en ny stabel for å legge til kort til denne tavlen",
@@ -181,9 +186,12 @@ OC.L10N.register(
"Transfer" : "Overfør",
"The board has been transferred to {user}" : "Tavlen har blitt overført til {user}",
"Failed to transfer the board to {user}" : "Klarte ikke overføre tavlen til {user}",
"Edit list title" : "Rediger listetittel",
"Archive all cards" : "Arkiver alle kort",
"Unarchive all cards" : "Fjern alle kort fra arkiv",
"Delete list" : "Slett listen",
"Archive all cards in this list" : "Arkiver alle kort i en stabel",
"Unarchive all cards in this list" : "Fjern alle kortene i denne listen fra arkiv",
"Add a new card" : "Legg til nytt kort",
"Card name" : "Navn på kort",
"List deleted" : "Stabel slettet",
@@ -260,6 +268,7 @@ OC.L10N.register(
"Shared with you" : "Delt med deg",
"Deck settings" : "Innstillinger for Stokk",
"Use bigger card view" : "Bruk større visning på kort",
"Show card ID badge" : "Vis ID-merke til kort",
"Show boards in calendar/tasks" : "Vis tavler i kalender/oppgaver",
"Limit deck usage of groups" : "Begrens stokk-bruk til grupper",
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Begrensning av tavler vil hindre tilgang til de brukere som ikke er medlem av en gruppe fra å lage egne tavler. Bruker kan arbeide på de tavler som er delt med dem.",
@@ -268,6 +277,7 @@ OC.L10N.register(
"Clone board" : "Klon tavle",
"Unarchive board" : "Aktiver tavle",
"Archive board" : "Arkiver tavle",
"Export board" : "Eksporter tavle",
"Turn on due date reminders" : "Skru på påminnelser for forfallsdato",
"Turn off due date reminders" : "Skru av påminnelser for forfallsdato",
"Due date reminders" : "Påminnelser for forfallsdato",
@@ -278,17 +288,19 @@ OC.L10N.register(
"Board {0} deleted" : "Tavle {0} slettet",
"Only assigned cards" : "Kun tildelte kort",
"No reminder" : "Ingen varsel",
"An error occurred" : "En feil oppstod",
"An error occurred" : "En feil oppsto",
"Are you sure you want to delete the board {title}? This will delete all the data of this board including archived cards." : "Are du sikker på sletting av tavlen {title}? Handlingen vil slette all data i denne tavlen, inkludert arkiverte kort.",
"Delete the board?" : "Slett tavlen?",
"Loading filtered view" : "Laster filtrert visning",
"No due" : "Ingen forfall",
"Search for {searchQuery} in all boards" : "Søk etter {searchQuery} i alle tavler",
"No results found" : "Ingen resultater funnet",
"Deck board {name}\n* Last modified on {lastMod}" : "Stokktavle {name}\n* Sist endret {lastMod}",
"{stack} in {board}" : "{stack} i {board}",
"Click to expand description" : "Klikk for å utvide beskrivelsen",
"* Created on {created}\n* Last modified on {lastMod}\n* {nbAttachments} attachments\n* {nbComments} comments" : "* Opprettet {created}\n* Sist endret {lastMod}\n* {nbAttachments} vedlegg\n* {nbComments} kommentarer",
"{nbCards} cards" : "{nbCards} kort",
"Click to expand comment" : "Klikk for å utvide kommentaren",
"No upcoming cards" : "Ingen kommende kort",
"upcoming cards" : "kommende kort",
"Due on {date}" : "Utløper {date}",

View File

@@ -76,9 +76,13 @@
"{user} has mentioned you in a comment on {deck-card}." : "{user} har nevnt deg i en kommentar på {deck-card}.",
"The board \"%s\" has been shared with you by %s." : "Brettet \"%s\" har blitt delt med deg av %s.",
"{user} has shared {deck-board} with you." : "{user} har delt brettet {deck-board} med deg.",
"Deck board" : "Deck tavle",
"Deck board" : "Stokktavle",
"Owned by %1$s" : "Eid av %1$s",
"Deck boards, cards and comments" : "Stokktavler, kort og kommentarer",
"From %1$s, in %2$s/%3$s, owned by %4$s" : "Fra %1$s, under %2$s/%3$s, eid av %4$s",
"Card comments" : "Kommentarer på kortet",
"%s on %s" : "%s på %s",
"Deck boards and cards" : "Stokktavler og kort",
"No data was provided to create an attachment." : "Ingen data for å opprette vedlegg.",
"Finished" : "Fullført",
"To review" : "Til gjennomlesning",
@@ -151,6 +155,7 @@
"Toggle compact mode" : "Endre kompakt modus",
"Open details" : "Åpne detaljer",
"Details" : "Detaljer",
"Currently present people" : "Tilstedeværende personer for øyeblikket",
"Loading board" : "Laster tavle",
"No lists available" : "Ingen stabler tilgjengelig",
"Create a new list to add cards to this board" : "Lag en ny stabel for å legge til kort til denne tavlen",
@@ -179,9 +184,12 @@
"Transfer" : "Overfør",
"The board has been transferred to {user}" : "Tavlen har blitt overført til {user}",
"Failed to transfer the board to {user}" : "Klarte ikke overføre tavlen til {user}",
"Edit list title" : "Rediger listetittel",
"Archive all cards" : "Arkiver alle kort",
"Unarchive all cards" : "Fjern alle kort fra arkiv",
"Delete list" : "Slett listen",
"Archive all cards in this list" : "Arkiver alle kort i en stabel",
"Unarchive all cards in this list" : "Fjern alle kortene i denne listen fra arkiv",
"Add a new card" : "Legg til nytt kort",
"Card name" : "Navn på kort",
"List deleted" : "Stabel slettet",
@@ -258,6 +266,7 @@
"Shared with you" : "Delt med deg",
"Deck settings" : "Innstillinger for Stokk",
"Use bigger card view" : "Bruk større visning på kort",
"Show card ID badge" : "Vis ID-merke til kort",
"Show boards in calendar/tasks" : "Vis tavler i kalender/oppgaver",
"Limit deck usage of groups" : "Begrens stokk-bruk til grupper",
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Begrensning av tavler vil hindre tilgang til de brukere som ikke er medlem av en gruppe fra å lage egne tavler. Bruker kan arbeide på de tavler som er delt med dem.",
@@ -266,6 +275,7 @@
"Clone board" : "Klon tavle",
"Unarchive board" : "Aktiver tavle",
"Archive board" : "Arkiver tavle",
"Export board" : "Eksporter tavle",
"Turn on due date reminders" : "Skru på påminnelser for forfallsdato",
"Turn off due date reminders" : "Skru av påminnelser for forfallsdato",
"Due date reminders" : "Påminnelser for forfallsdato",
@@ -276,17 +286,19 @@
"Board {0} deleted" : "Tavle {0} slettet",
"Only assigned cards" : "Kun tildelte kort",
"No reminder" : "Ingen varsel",
"An error occurred" : "En feil oppstod",
"An error occurred" : "En feil oppsto",
"Are you sure you want to delete the board {title}? This will delete all the data of this board including archived cards." : "Are du sikker på sletting av tavlen {title}? Handlingen vil slette all data i denne tavlen, inkludert arkiverte kort.",
"Delete the board?" : "Slett tavlen?",
"Loading filtered view" : "Laster filtrert visning",
"No due" : "Ingen forfall",
"Search for {searchQuery} in all boards" : "Søk etter {searchQuery} i alle tavler",
"No results found" : "Ingen resultater funnet",
"Deck board {name}\n* Last modified on {lastMod}" : "Stokktavle {name}\n* Sist endret {lastMod}",
"{stack} in {board}" : "{stack} i {board}",
"Click to expand description" : "Klikk for å utvide beskrivelsen",
"* Created on {created}\n* Last modified on {lastMod}\n* {nbAttachments} attachments\n* {nbComments} comments" : "* Opprettet {created}\n* Sist endret {lastMod}\n* {nbAttachments} vedlegg\n* {nbComments} kommentarer",
"{nbCards} cards" : "{nbCards} kort",
"Click to expand comment" : "Klikk for å utvide kommentaren",
"No upcoming cards" : "Ingen kommende kort",
"upcoming cards" : "kommende kort",
"Due on {date}" : "Utløper {date}",

View File

@@ -79,8 +79,12 @@ OC.L10N.register(
"The board \"%s\" has been shared with you by %s." : "Tablica \"%s\" została Tobie udostępniona przez %s.",
"{user} has shared {deck-board} with you." : "{user} udostępnił Tobie {deck-board}.",
"Deck board" : "Tablica Deck",
"Owned by %1$s" : "Właścicielem jest %1$s",
"Deck boards, cards and comments" : "Tablice, karty i komentarze",
"From %1$s, in %2$s/%3$s, owned by %4$s" : "Od %1$s, w %2$s/%3$s, posiadane przez %4$s",
"Card comments" : "Komentarze karty",
"%s on %s" : "%s na %s",
"Deck boards and cards" : "Tablice i karty",
"No data was provided to create an attachment." : "Nie podano żadnych danych do utworzenia załącznika.",
"Finished" : "Ukończone",
"To review" : "Do sprawdzenia",
@@ -291,6 +295,7 @@ OC.L10N.register(
"No due" : "Bez ważności",
"Search for {searchQuery} in all boards" : "Wyszukaj dla {searchQuery} na wszystkich tablicach",
"No results found" : "Nie znaleziono wyników",
"Deck board {name}\n* Last modified on {lastMod}" : "Tablica {name}\n* Ostatnia modyfikacja w dniu {lastMod}",
"{stack} in {board}" : "{stack} na {board}",
"Click to expand description" : "Kliknij, aby rozwinąć opis",
"* Created on {created}\n* Last modified on {lastMod}\n* {nbAttachments} attachments\n* {nbComments} comments" : "* Utworzono {created}\n* Ostatnia modyfikacja {lastMod}\n* Załączniki {nbAttachments}\n* Komentarze {nbComments}",
@@ -298,6 +303,7 @@ OC.L10N.register(
"Click to expand comment" : "Kliknij, aby rozwinąć komentarz",
"No upcoming cards" : "Brak nadchodzących kart",
"upcoming cards" : "nadchodzące karty",
"New card" : "Nowa karta",
"Due on {date}" : "Termin {date}",
"Link to a board" : "Link do tablicy",
"Link to a card" : "Link do karty",

View File

@@ -77,8 +77,12 @@
"The board \"%s\" has been shared with you by %s." : "Tablica \"%s\" została Tobie udostępniona przez %s.",
"{user} has shared {deck-board} with you." : "{user} udostępnił Tobie {deck-board}.",
"Deck board" : "Tablica Deck",
"Owned by %1$s" : "Właścicielem jest %1$s",
"Deck boards, cards and comments" : "Tablice, karty i komentarze",
"From %1$s, in %2$s/%3$s, owned by %4$s" : "Od %1$s, w %2$s/%3$s, posiadane przez %4$s",
"Card comments" : "Komentarze karty",
"%s on %s" : "%s na %s",
"Deck boards and cards" : "Tablice i karty",
"No data was provided to create an attachment." : "Nie podano żadnych danych do utworzenia załącznika.",
"Finished" : "Ukończone",
"To review" : "Do sprawdzenia",
@@ -289,6 +293,7 @@
"No due" : "Bez ważności",
"Search for {searchQuery} in all boards" : "Wyszukaj dla {searchQuery} na wszystkich tablicach",
"No results found" : "Nie znaleziono wyników",
"Deck board {name}\n* Last modified on {lastMod}" : "Tablica {name}\n* Ostatnia modyfikacja w dniu {lastMod}",
"{stack} in {board}" : "{stack} na {board}",
"Click to expand description" : "Kliknij, aby rozwinąć opis",
"* Created on {created}\n* Last modified on {lastMod}\n* {nbAttachments} attachments\n* {nbComments} comments" : "* Utworzono {created}\n* Ostatnia modyfikacja {lastMod}\n* Załączniki {nbAttachments}\n* Komentarze {nbComments}",
@@ -296,6 +301,7 @@
"Click to expand comment" : "Kliknij, aby rozwinąć komentarz",
"No upcoming cards" : "Brak nadchodzących kart",
"upcoming cards" : "nadchodzące karty",
"New card" : "Nowa karta",
"Due on {date}" : "Termin {date}",
"Link to a board" : "Link do tablicy",
"Link to a card" : "Link do karty",

View File

@@ -303,6 +303,7 @@ OC.L10N.register(
"Click to expand comment" : "Clique para expandir o comentário",
"No upcoming cards" : "Não há mais cartões",
"upcoming cards" : "próximos cartões",
"New card" : "New card",
"Due on {date}" : "Vencimento em {date}",
"Link to a board" : "Vincular a um painel",
"Link to a card" : "Vincular a um cartão",

View File

@@ -301,6 +301,7 @@
"Click to expand comment" : "Clique para expandir o comentário",
"No upcoming cards" : "Não há mais cartões",
"upcoming cards" : "próximos cartões",
"New card" : "New card",
"Due on {date}" : "Vencimento em {date}",
"Link to a board" : "Vincular a um painel",
"Link to a card" : "Vincular a um cartão",

View File

@@ -79,8 +79,12 @@ OC.L10N.register(
"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",
"Card comments" : "Комментарии карточки",
"%s on %s" : "%s на %s",
"Deck boards and cards" : "Доски и карточки",
"No data was provided to create an attachment." : "Отсутствуют данные для создания вложения.",
"Finished" : "Завершено",
"To review" : "Проверить",
@@ -153,6 +157,7 @@ OC.L10N.register(
"Toggle compact mode" : "Выбор компактного или обычного режима просмотра",
"Open details" : "Открыть подробности",
"Details" : "Свойства",
"Currently present people" : "Присутствующие в настоящее время люди",
"Loading board" : "Загрузка доски",
"No lists available" : "Нет ни одного списка",
"Create a new list to add cards to this board" : "Создайте список чтобы добавить карточки на эту доску",
@@ -181,6 +186,7 @@ OC.L10N.register(
"Transfer" : "Передача",
"The board has been transferred to {user}" : "Доска была передана пользователю {user}",
"Failed to transfer the board to {user}" : "Не удалось передать доску пользователю {user}",
"Edit list title" : "Изменить название списка",
"Archive all cards" : "Переместить все карточки в архив",
"Unarchive all cards" : "Восстановить все карточки из архива",
"Delete list" : "Удалить список",
@@ -271,6 +277,7 @@ OC.L10N.register(
"Clone board" : "Скопировать доску",
"Unarchive board" : "Восстановить доску из архива",
"Archive board" : "Переместить доску в архив",
"Export board" : "Экспортировать доску",
"Turn on due date reminders" : "Включить напоминания о сроке выполнения",
"Turn off due date reminders" : "Отключить напоминания о сроке выполнения",
"Due date reminders" : "Напоминания о сроке выполнения",
@@ -288,11 +295,16 @@ OC.L10N.register(
"No due" : "Без назначенной даты",
"Search for {searchQuery} in all boards" : "Искать {searchQuery} на всех досках",
"No results found" : "Результаты отсутствуют",
"Deck board {name}\n* Last modified on {lastMod}" : "Доска «{name}»\n* Последнее изменение: {lastMod}",
"{stack} in {board}" : "«{stack}» с доски «{board}»",
"Click to expand description" : "Нажмите, чтобы развернуть поле описания",
"* Created on {created}\n* Last modified on {lastMod}\n* {nbAttachments} attachments\n* {nbComments} comments" : "* Создано {created}\n* Последнее изменение {lastMod}\n* {nbAttachments} вложений\n* {nbComments} комментариев",
"{nbCards} cards" : "карточек: {nbCards}",
"Click to expand comment" : "Нажмите, чтобы развернуть комментарии",
"No upcoming cards" : "Отсутствуют карточки, ожидающие выполнения",
"upcoming cards" : "карточки, ожидающие выполнения",
"New card" : "Новая карточка",
"Due on {date}" : "Дата исполнения: {date}",
"Link to a board" : "Ссылка на доску",
"Link to a card" : "Ссылка на карточку",
"Create a card" : "Создать карточку",

View File

@@ -77,8 +77,12 @@
"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",
"Card comments" : "Комментарии карточки",
"%s on %s" : "%s на %s",
"Deck boards and cards" : "Доски и карточки",
"No data was provided to create an attachment." : "Отсутствуют данные для создания вложения.",
"Finished" : "Завершено",
"To review" : "Проверить",
@@ -151,6 +155,7 @@
"Toggle compact mode" : "Выбор компактного или обычного режима просмотра",
"Open details" : "Открыть подробности",
"Details" : "Свойства",
"Currently present people" : "Присутствующие в настоящее время люди",
"Loading board" : "Загрузка доски",
"No lists available" : "Нет ни одного списка",
"Create a new list to add cards to this board" : "Создайте список чтобы добавить карточки на эту доску",
@@ -179,6 +184,7 @@
"Transfer" : "Передача",
"The board has been transferred to {user}" : "Доска была передана пользователю {user}",
"Failed to transfer the board to {user}" : "Не удалось передать доску пользователю {user}",
"Edit list title" : "Изменить название списка",
"Archive all cards" : "Переместить все карточки в архив",
"Unarchive all cards" : "Восстановить все карточки из архива",
"Delete list" : "Удалить список",
@@ -269,6 +275,7 @@
"Clone board" : "Скопировать доску",
"Unarchive board" : "Восстановить доску из архива",
"Archive board" : "Переместить доску в архив",
"Export board" : "Экспортировать доску",
"Turn on due date reminders" : "Включить напоминания о сроке выполнения",
"Turn off due date reminders" : "Отключить напоминания о сроке выполнения",
"Due date reminders" : "Напоминания о сроке выполнения",
@@ -286,11 +293,16 @@
"No due" : "Без назначенной даты",
"Search for {searchQuery} in all boards" : "Искать {searchQuery} на всех досках",
"No results found" : "Результаты отсутствуют",
"Deck board {name}\n* Last modified on {lastMod}" : "Доска «{name}»\n* Последнее изменение: {lastMod}",
"{stack} in {board}" : "«{stack}» с доски «{board}»",
"Click to expand description" : "Нажмите, чтобы развернуть поле описания",
"* Created on {created}\n* Last modified on {lastMod}\n* {nbAttachments} attachments\n* {nbComments} comments" : "* Создано {created}\n* Последнее изменение {lastMod}\n* {nbAttachments} вложений\n* {nbComments} комментариев",
"{nbCards} cards" : "карточек: {nbCards}",
"Click to expand comment" : "Нажмите, чтобы развернуть комментарии",
"No upcoming cards" : "Отсутствуют карточки, ожидающие выполнения",
"upcoming cards" : "карточки, ожидающие выполнения",
"New card" : "Новая карточка",
"Due on {date}" : "Дата исполнения: {date}",
"Link to a board" : "Ссылка на доску",
"Link to a card" : "Ссылка на карточку",
"Create a card" : "Создать карточку",

View File

@@ -71,11 +71,20 @@ OC.L10N.register(
"Load more" : "Учитај још",
"Personal" : "Лично",
"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",
"Card comments" : "Коментари картица",
"%s on %s" : "%s на %s",
"Deck boards and cards" : "Табле шпилова и картице",
"No data was provided to create an attachment." : "Нису дати подаци за креирање прилога.",
"Finished" : "Завршено",
"To review" : "Треба прегледати",
@@ -97,16 +106,24 @@ 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",
"This comment has more than %s characters.\nAdded as an attachment to the card with name %s.\nAccessible on URL: %s." : "Овај коментар има више од %s карактера.\nДодат је као прилог картици под именом %s.\nДоступно је на URL адреси: %s.",
"Card not found" : "Картица није нађена",
"Path is already shared with this card" : "Путања се већ дели са овом картицом",
"Invalid date, date format must be YYYY-MM-DD" : "Неисправан датим, формат датума мора бити ГГГГ-ММ-ДД",
"Personal planning and team project organization" : "Лични планер и организатор тимског пројекта",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in Markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your Markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Шпил је организациони алат у канбан стилу који је намењен личном планирању и организацији пројекта у тимовима интегрисаним са Nextcloud.\n\n\n- 📥 Додајте своје задатке у картице и поређајте их по редоследу\n- 📄 Напишите додатне белешке употребом Markdown синтаксе\n- 🔖 Доделите ознаке у циљу још боље организације\n- 👥 Делите са својим тимом, пријатељима или породицом\n- 📎 Прикачите фајлове и уградите их у свој Markdown опис\n- 💬 Дискутујте са својим тимом користећи коментаре\n- ⚡ Пратите измене у току активности\n- 🚀 Организујте свој пројекат",
"Add board" : "Додај таблу",
"Select the board to link to a project" : "Одаберите таблу да је повежете са пројектом",
"Search by board title" : "Претражи по наслову табле",
"Select board" : "Одаберите таблу",
"Create a new card" : "Креирај нову картицу",
"Select a board" : "Изаберите таблу",
"Select a list" : "Одабери списак",
"Card title" : "Наслов картицњ",
"Cancel" : "Одустани",
"Creating the new card …" : "Креира се нова картица ...",
"Card \"{card}\" was added to \"{board}\"" : "Картица „{card}” је додта на „{board}",
"Open card" : "Отвори картицу",
"Close" : "Затвори",
"Create card" : "Направите картицу",
"Select a card" : "Изаберите картицу",
@@ -123,6 +140,7 @@ OC.L10N.register(
"Archived cards" : "Архивиране картице",
"Add list" : "Додај списак",
"List name" : "Назив листе",
"Active filters" : "Активни филтери",
"Apply filter" : "Примени филтер",
"Filter by tag" : "Филтрирај по ознаци",
"Filter by assigned user" : "Филтрирај по додељеном кориснику",
@@ -139,6 +157,7 @@ OC.L10N.register(
"Toggle compact mode" : "Укључи/искључи компактни режим",
"Open details" : "Отвори детаље",
"Details" : "Детаљи",
"Currently present people" : "Тренутно присутне особе",
"Loading board" : "Учитавам таблу",
"No lists available" : "Нема доступних спискова",
"Create a new list to add cards to this board" : "Направите нови списак да додате картице на ову таблу",
@@ -151,6 +170,7 @@ OC.L10N.register(
"Undo" : "Опозови",
"Deleted cards" : "Обрисане картице",
"Share board with a user, group or circle …" : "Подели таблу са корисником, групом или кругом…",
"Searching for users, groups and circles …" : "Претрага корисника, група и кругова ...",
"No participants found" : "Нема нађених учесника",
"Board owner" : "Власник табле",
"(Group)" : "(група)",
@@ -161,10 +181,17 @@ OC.L10N.register(
"Owner" : "Власник",
"Delete" : "Избриши",
"Failed to create share with {displayName}" : "Грешка у прављењу дељења са {displayName}",
"Are you sure you want to transfer the board {title} to {user}?" : "Да ли сте сигурни да кориснику {user} пренесете таблу {title}?",
"Transfer the board." : "Пренос табле.",
"Transfer" : "Пренеси",
"The board has been transferred to {user}" : "Табла је пренета кориснику {user}",
"Failed to transfer the board to {user}" : "Није успео пренос табле кориснику {user}",
"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" : "Име картице",
"List deleted" : "Листа обрисана",
@@ -173,8 +200,13 @@ OC.L10N.register(
"title and color value must be provided" : "морају се дати вредности за наслов и боју",
"Board name" : "Име табле",
"Members" : "Чланови",
"Upload new files" : "Отпреми нове фајлове",
"Share from Files" : "Подели из Фајлова",
"Pending share" : "Дељење на чекању",
"Add this attachment" : "Додај овај прилог",
"Show in Files" : "Прикажи у Фајловима",
"Download" : "Преузми",
"Remove attachment" : "Уклони прилог",
"Delete Attachment" : "Обриши прилог",
"Restore Attachment" : "Поврати прилог",
"File to share" : "Фајл за дељење",
@@ -187,6 +219,7 @@ OC.L10N.register(
"Created" : "Направљен",
"The title cannot be empty." : "Наслов не може бити празан.",
"No comments yet. Begin the discussion!" : "Нема још коментара. Започните дискусију!",
"Failed to load comments" : "Није успело учитавање коментара",
"Assign a tag to this card…" : "Додели ознаку овој картици…",
"Assign to users" : "Додели корисницима",
"Assign to users/groups/circles" : "Додели корисницима/групама/круговима",
@@ -197,10 +230,13 @@ OC.L10N.register(
"Select Date" : "Одаберите датум",
"Today" : "Данас",
"Tomorrow" : "сутра",
"Next week" : "Наредне недеље",
"Next month" : "Наредног месеца",
"Save" : "Сачувај",
"The comment cannot be empty." : "Коментар не може да буде празан.",
"The comment cannot be longer than 1000 characters." : "Коментар не може да има преко 1000 карактера.",
"In reply to" : "Као одговор на",
"Cancel reply" : "Откажи одговор",
"Reply" : "Одговори",
"Update" : "Ажурирај",
"Description" : "Опис",
@@ -210,8 +246,12 @@ OC.L10N.register(
"Edit description" : "Измени опис",
"View description" : "Погледај опис",
"Add Attachment" : "Додај прилог",
"Write a description …" : "Напишите опис ...",
"Choose attachment" : "Одабери прилог",
"(group)" : "(група)",
"Todo items" : "Ставке обавеза",
"{count} comments, {unread} unread" : "{count} коментара, {unread} није прочитано",
"Edit card title" : "Уреди наслов картице",
"Assign to me" : "Додели мени",
"Unassign myself" : "Склони са мене",
"Move card" : "Премести картицу",
@@ -226,6 +266,9 @@ OC.L10N.register(
"All boards" : "Све табле",
"Archived boards" : "Архивиране табле",
"Shared with you" : "Дељено са Вама",
"Deck settings" : "Поставке Шпила",
"Use bigger card view" : "Користи већи приказ картице",
"Show card ID badge" : "Прикажи беџ ID картице",
"Show boards in calendar/tasks" : "Прикажи табле у календару/задацима",
"Limit deck usage of groups" : "Ограничи употребу шпила на групе",
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Ограничавање Deck апликације ће блокирати кориснике који нису део одабраних група да креирају своје табле. Корисници ће и даље моћи да раде на таблама које су подељене са њима.",
@@ -234,22 +277,48 @@ OC.L10N.register(
"Clone board" : "Клонирај таблу",
"Unarchive board" : "Врати таблу из архиве",
"Archive board" : "Архивирај таблу",
"Export board" : "Извези таблу",
"Turn on due date reminders" : "Укључи подсетнике о року",
"Turn off due date reminders" : "Искључи подсетнике о року",
"Due date reminders" : "Подсетници о року",
"All cards" : "Све картице",
"Assigned cards" : "Додељене картице",
"No notifications" : "Нема обавештења",
"Delete board" : "Избриши таблу",
"Board {0} deleted" : "Табла {0} обрисана",
"Only assigned cards" : "Само додељене картице",
"No reminder" : "Нема подсетника",
"An error occurred" : "Догодила се грешка",
"Are you sure you want to delete the board {title}? This will delete all the data of this board including archived cards." : "Да ли сте сигурни да желите да обришете таблу {title}? Ово ће да обрише све податке на овој табли, укључијући и архивиране картице.",
"Delete the board?" : "Обрисати таблу?",
"Loading filtered view" : "Учитам филтрирани преглед",
"No due" : "Нема рокова",
"Search for {searchQuery} in all boards" : "Тражи се {searchQuery} у свим таблама",
"No results found" : "Нема пронађених резултата",
"Deck board {name}\n* Last modified on {lastMod}" : "Шпил табла {name}\n* Последњи пут измењена дана {lastMod}",
"{stack} in {board}" : "{stack} у {board}",
"Click to expand description" : "Кликните да проширите опис",
"* Created on {created}\n* Last modified on {lastMod}\n* {nbAttachments} attachments\n* {nbComments} comments" : "* Креирано дана {created}\n* Последњи пут измењено дана {lastMod}\n* {nbAttachments} прилога\n* {nbComments} коментара",
"{nbCards} cards" : "{nbCards} картица",
"Click to expand comment" : "Кликните да проширите коментар",
"No upcoming cards" : "Нема предстојећих картица",
"upcoming cards" : "предстојеће картице",
"New card" : "Нова картица",
"Due on {date}" : "Рок је {date}",
"Link to a board" : "Веза ка табли",
"Link to a card" : "Веза ка картици",
"Create a card" : "Креирај картицу",
"Message from {author} in {conversationName}" : "Порука од {author} у {conversationName}",
"Something went wrong" : "Нешто је пошло наопако",
"Failed to upload {name}" : "Није успело отпремање {name}",
"Maximum file size of {size} exceeded" : "Премашена максимална величина фајла од {size}",
"Error creating the share" : "Грешка при прављењу дељења",
"Share with a Deck card" : "Дели са Шпил картицом",
"Share {file} with a Deck card" : "Дели {file} са Шпил картицом",
"Share" : "Подели",
"Are you sure you want to transfer the board {title} for {user}?" : "Да ли сте сигурни да желите пренети таблу {title} за {user}?",
"Transfer the board for {user} successfully" : "Пренос табле за {user} је успео",
"Failed to transfer the board for {user}" : "Пренос табле за {user} није успео",
"Add a new list" : "Додај нови списак",
"Are you sure you want to delete the board {title}? This will delete all the data of this board." : "Да ли стварно желите да обришете таблу {title}? Овим ћете обрисати све податке са табле."
},

View File

@@ -69,11 +69,20 @@
"Load more" : "Учитај још",
"Personal" : "Лично",
"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",
"Card comments" : "Коментари картица",
"%s on %s" : "%s на %s",
"Deck boards and cards" : "Табле шпилова и картице",
"No data was provided to create an attachment." : "Нису дати подаци за креирање прилога.",
"Finished" : "Завршено",
"To review" : "Треба прегледати",
@@ -95,16 +104,24 @@
"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",
"This comment has more than %s characters.\nAdded as an attachment to the card with name %s.\nAccessible on URL: %s." : "Овај коментар има више од %s карактера.\nДодат је као прилог картици под именом %s.\nДоступно је на URL адреси: %s.",
"Card not found" : "Картица није нађена",
"Path is already shared with this card" : "Путања се већ дели са овом картицом",
"Invalid date, date format must be YYYY-MM-DD" : "Неисправан датим, формат датума мора бити ГГГГ-ММ-ДД",
"Personal planning and team project organization" : "Лични планер и организатор тимског пројекта",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in Markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your Markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Шпил је организациони алат у канбан стилу који је намењен личном планирању и организацији пројекта у тимовима интегрисаним са Nextcloud.\n\n\n- 📥 Додајте своје задатке у картице и поређајте их по редоследу\n- 📄 Напишите додатне белешке употребом Markdown синтаксе\n- 🔖 Доделите ознаке у циљу још боље организације\n- 👥 Делите са својим тимом, пријатељима или породицом\n- 📎 Прикачите фајлове и уградите их у свој Markdown опис\n- 💬 Дискутујте са својим тимом користећи коментаре\n- ⚡ Пратите измене у току активности\n- 🚀 Организујте свој пројекат",
"Add board" : "Додај таблу",
"Select the board to link to a project" : "Одаберите таблу да је повежете са пројектом",
"Search by board title" : "Претражи по наслову табле",
"Select board" : "Одаберите таблу",
"Create a new card" : "Креирај нову картицу",
"Select a board" : "Изаберите таблу",
"Select a list" : "Одабери списак",
"Card title" : "Наслов картицњ",
"Cancel" : "Одустани",
"Creating the new card …" : "Креира се нова картица ...",
"Card \"{card}\" was added to \"{board}\"" : "Картица „{card}” је додта на „{board}",
"Open card" : "Отвори картицу",
"Close" : "Затвори",
"Create card" : "Направите картицу",
"Select a card" : "Изаберите картицу",
@@ -121,6 +138,7 @@
"Archived cards" : "Архивиране картице",
"Add list" : "Додај списак",
"List name" : "Назив листе",
"Active filters" : "Активни филтери",
"Apply filter" : "Примени филтер",
"Filter by tag" : "Филтрирај по ознаци",
"Filter by assigned user" : "Филтрирај по додељеном кориснику",
@@ -137,6 +155,7 @@
"Toggle compact mode" : "Укључи/искључи компактни режим",
"Open details" : "Отвори детаље",
"Details" : "Детаљи",
"Currently present people" : "Тренутно присутне особе",
"Loading board" : "Учитавам таблу",
"No lists available" : "Нема доступних спискова",
"Create a new list to add cards to this board" : "Направите нови списак да додате картице на ову таблу",
@@ -149,6 +168,7 @@
"Undo" : "Опозови",
"Deleted cards" : "Обрисане картице",
"Share board with a user, group or circle …" : "Подели таблу са корисником, групом или кругом…",
"Searching for users, groups and circles …" : "Претрага корисника, група и кругова ...",
"No participants found" : "Нема нађених учесника",
"Board owner" : "Власник табле",
"(Group)" : "(група)",
@@ -159,10 +179,17 @@
"Owner" : "Власник",
"Delete" : "Избриши",
"Failed to create share with {displayName}" : "Грешка у прављењу дељења са {displayName}",
"Are you sure you want to transfer the board {title} to {user}?" : "Да ли сте сигурни да кориснику {user} пренесете таблу {title}?",
"Transfer the board." : "Пренос табле.",
"Transfer" : "Пренеси",
"The board has been transferred to {user}" : "Табла је пренета кориснику {user}",
"Failed to transfer the board to {user}" : "Није успео пренос табле кориснику {user}",
"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" : "Име картице",
"List deleted" : "Листа обрисана",
@@ -171,8 +198,13 @@
"title and color value must be provided" : "морају се дати вредности за наслов и боју",
"Board name" : "Име табле",
"Members" : "Чланови",
"Upload new files" : "Отпреми нове фајлове",
"Share from Files" : "Подели из Фајлова",
"Pending share" : "Дељење на чекању",
"Add this attachment" : "Додај овај прилог",
"Show in Files" : "Прикажи у Фајловима",
"Download" : "Преузми",
"Remove attachment" : "Уклони прилог",
"Delete Attachment" : "Обриши прилог",
"Restore Attachment" : "Поврати прилог",
"File to share" : "Фајл за дељење",
@@ -185,6 +217,7 @@
"Created" : "Направљен",
"The title cannot be empty." : "Наслов не може бити празан.",
"No comments yet. Begin the discussion!" : "Нема још коментара. Започните дискусију!",
"Failed to load comments" : "Није успело учитавање коментара",
"Assign a tag to this card…" : "Додели ознаку овој картици…",
"Assign to users" : "Додели корисницима",
"Assign to users/groups/circles" : "Додели корисницима/групама/круговима",
@@ -195,10 +228,13 @@
"Select Date" : "Одаберите датум",
"Today" : "Данас",
"Tomorrow" : "сутра",
"Next week" : "Наредне недеље",
"Next month" : "Наредног месеца",
"Save" : "Сачувај",
"The comment cannot be empty." : "Коментар не може да буде празан.",
"The comment cannot be longer than 1000 characters." : "Коментар не може да има преко 1000 карактера.",
"In reply to" : "Као одговор на",
"Cancel reply" : "Откажи одговор",
"Reply" : "Одговори",
"Update" : "Ажурирај",
"Description" : "Опис",
@@ -208,8 +244,12 @@
"Edit description" : "Измени опис",
"View description" : "Погледај опис",
"Add Attachment" : "Додај прилог",
"Write a description …" : "Напишите опис ...",
"Choose attachment" : "Одабери прилог",
"(group)" : "(група)",
"Todo items" : "Ставке обавеза",
"{count} comments, {unread} unread" : "{count} коментара, {unread} није прочитано",
"Edit card title" : "Уреди наслов картице",
"Assign to me" : "Додели мени",
"Unassign myself" : "Склони са мене",
"Move card" : "Премести картицу",
@@ -224,6 +264,9 @@
"All boards" : "Све табле",
"Archived boards" : "Архивиране табле",
"Shared with you" : "Дељено са Вама",
"Deck settings" : "Поставке Шпила",
"Use bigger card view" : "Користи већи приказ картице",
"Show card ID badge" : "Прикажи беџ ID картице",
"Show boards in calendar/tasks" : "Прикажи табле у календару/задацима",
"Limit deck usage of groups" : "Ограничи употребу шпила на групе",
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Ограничавање Deck апликације ће блокирати кориснике који нису део одабраних група да креирају своје табле. Корисници ће и даље моћи да раде на таблама које су подељене са њима.",
@@ -232,22 +275,48 @@
"Clone board" : "Клонирај таблу",
"Unarchive board" : "Врати таблу из архиве",
"Archive board" : "Архивирај таблу",
"Export board" : "Извези таблу",
"Turn on due date reminders" : "Укључи подсетнике о року",
"Turn off due date reminders" : "Искључи подсетнике о року",
"Due date reminders" : "Подсетници о року",
"All cards" : "Све картице",
"Assigned cards" : "Додељене картице",
"No notifications" : "Нема обавештења",
"Delete board" : "Избриши таблу",
"Board {0} deleted" : "Табла {0} обрисана",
"Only assigned cards" : "Само додељене картице",
"No reminder" : "Нема подсетника",
"An error occurred" : "Догодила се грешка",
"Are you sure you want to delete the board {title}? This will delete all the data of this board including archived cards." : "Да ли сте сигурни да желите да обришете таблу {title}? Ово ће да обрише све податке на овој табли, укључијући и архивиране картице.",
"Delete the board?" : "Обрисати таблу?",
"Loading filtered view" : "Учитам филтрирани преглед",
"No due" : "Нема рокова",
"Search for {searchQuery} in all boards" : "Тражи се {searchQuery} у свим таблама",
"No results found" : "Нема пронађених резултата",
"Deck board {name}\n* Last modified on {lastMod}" : "Шпил табла {name}\n* Последњи пут измењена дана {lastMod}",
"{stack} in {board}" : "{stack} у {board}",
"Click to expand description" : "Кликните да проширите опис",
"* Created on {created}\n* Last modified on {lastMod}\n* {nbAttachments} attachments\n* {nbComments} comments" : "* Креирано дана {created}\n* Последњи пут измењено дана {lastMod}\n* {nbAttachments} прилога\n* {nbComments} коментара",
"{nbCards} cards" : "{nbCards} картица",
"Click to expand comment" : "Кликните да проширите коментар",
"No upcoming cards" : "Нема предстојећих картица",
"upcoming cards" : "предстојеће картице",
"New card" : "Нова картица",
"Due on {date}" : "Рок је {date}",
"Link to a board" : "Веза ка табли",
"Link to a card" : "Веза ка картици",
"Create a card" : "Креирај картицу",
"Message from {author} in {conversationName}" : "Порука од {author} у {conversationName}",
"Something went wrong" : "Нешто је пошло наопако",
"Failed to upload {name}" : "Није успело отпремање {name}",
"Maximum file size of {size} exceeded" : "Премашена максимална величина фајла од {size}",
"Error creating the share" : "Грешка при прављењу дељења",
"Share with a Deck card" : "Дели са Шпил картицом",
"Share {file} with a Deck card" : "Дели {file} са Шпил картицом",
"Share" : "Подели",
"Are you sure you want to transfer the board {title} for {user}?" : "Да ли сте сигурни да желите пренети таблу {title} за {user}?",
"Transfer the board for {user} successfully" : "Пренос табле за {user} је успео",
"Failed to transfer the board for {user}" : "Пренос табле за {user} није успео",
"Add a new list" : "Додај нови списак",
"Are you sure you want to delete the board {title}? This will delete all the data of this board." : "Да ли стварно желите да обришете таблу {title}? Овим ћете обрисати све податке са табле."
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"

View File

@@ -78,7 +78,7 @@ OC.L10N.register(
"{user} has mentioned you in a comment on {deck-card}." : "{user} har nämnt dig i en kommentar i {deck-card}.",
"The board \"%s\" has been shared with you by %s." : "Tavlan \"%s\" har delats med dig av %s.",
"{user} has shared {deck-board} with you." : "{user} har delat {deck-board} med dig.",
"Deck board" : "Deck-plank",
"Deck board" : "Deck-tavla",
"Owned by %1$s" : "Ägd av %1$s",
"Deck boards, cards and comments" : "Deck tavlor, kort och kommentarer",
"From %1$s, in %2$s/%3$s, owned by %4$s" : "Från %1$s, i %2$s/%3$s, ägd av %4$s",
@@ -92,7 +92,7 @@ OC.L10N.register(
"Later" : "Senare",
"copy" : "kopiera",
"To do" : "Att göra",
"Doing" : "Gör",
"Doing" : "Pågående",
"Done" : "Klart",
"Example Task 3" : "Exempeluppgift 3",
"Example Task 2" : "Exempeluppgift 2",
@@ -249,7 +249,7 @@ OC.L10N.register(
"Write a description …" : "Ange en beskrivning ...",
"Choose attachment" : "Välj bilaga",
"(group)" : " (grupp)",
"Todo items" : "Todo saker",
"Todo items" : "Att göra saker",
"{count} comments, {unread} unread" : "{count} kommentarer, {unread} olästa",
"Edit card title" : "Ändra korttitel",
"Assign to me" : "Tilldela till mig",
@@ -289,7 +289,7 @@ OC.L10N.register(
"Only assigned cards" : "Bara tilldelade kort",
"No reminder" : "Ingen påminnelse",
"An error occurred" : "Ett fel uppstod",
"Are you sure you want to delete the board {title}? This will delete all the data of this board including archived cards." : "Är du säker på att du vill radera brädet {title}? Detta kommer radera all data som tillhör brädet inklusive arkiverade kort.",
"Are you sure you want to delete the board {title}? This will delete all the data of this board including archived cards." : "Är du säker på att du vill radera tavla {title}? Detta kommer radera all data som tillhör tavlan inklusive arkiverade kort.",
"Delete the board?" : "Ta bort tavlan?",
"Loading filtered view" : "Laddar filtrerad vy",
"No due" : "Inget slut",
@@ -303,6 +303,7 @@ OC.L10N.register(
"Click to expand comment" : "Klicka för att utöka kommentaren",
"No upcoming cards" : "Inga kommande kort",
"upcoming cards" : "kommande kort",
"New card" : "Nytt kort",
"Due on {date}" : "Går ut {date}",
"Link to a board" : "Länka till en tavla",
"Link to a card" : "Länka till ett kort",
@@ -315,9 +316,9 @@ OC.L10N.register(
"Share with a Deck card" : "Dela med ett Deck-kort",
"Share {file} with a Deck card" : "Dela {file} med ett Deck-kort",
"Share" : "Dela",
"Are you sure you want to transfer the board {title} for {user}?" : "Är du säker på att du vill överföra brädet {title} för {user}?",
"Transfer the board for {user} successfully" : "Överförde brädet för {user}",
"Failed to transfer the board for {user}" : "Misslyckades med att överföra brädet för {user}",
"Are you sure you want to transfer the board {title} for {user}?" : "Är du säker på att du vill överföra tavla {title} för {user}?",
"Transfer the board for {user} successfully" : "Överförde tavlan för {user}",
"Failed to transfer the board for {user}" : "Misslyckades med att överföra tavlan för {user}",
"Add a new list" : "Lägg till en ny lista",
"Are you sure you want to delete the board {title}? This will delete all the data of this board." : "Är du säker på att du vill radera tavla {title}? Detta kommer att radera all information från denna tavla."
},

View File

@@ -76,7 +76,7 @@
"{user} has mentioned you in a comment on {deck-card}." : "{user} har nämnt dig i en kommentar i {deck-card}.",
"The board \"%s\" has been shared with you by %s." : "Tavlan \"%s\" har delats med dig av %s.",
"{user} has shared {deck-board} with you." : "{user} har delat {deck-board} med dig.",
"Deck board" : "Deck-plank",
"Deck board" : "Deck-tavla",
"Owned by %1$s" : "Ägd av %1$s",
"Deck boards, cards and comments" : "Deck tavlor, kort och kommentarer",
"From %1$s, in %2$s/%3$s, owned by %4$s" : "Från %1$s, i %2$s/%3$s, ägd av %4$s",
@@ -90,7 +90,7 @@
"Later" : "Senare",
"copy" : "kopiera",
"To do" : "Att göra",
"Doing" : "Gör",
"Doing" : "Pågående",
"Done" : "Klart",
"Example Task 3" : "Exempeluppgift 3",
"Example Task 2" : "Exempeluppgift 2",
@@ -247,7 +247,7 @@
"Write a description …" : "Ange en beskrivning ...",
"Choose attachment" : "Välj bilaga",
"(group)" : " (grupp)",
"Todo items" : "Todo saker",
"Todo items" : "Att göra saker",
"{count} comments, {unread} unread" : "{count} kommentarer, {unread} olästa",
"Edit card title" : "Ändra korttitel",
"Assign to me" : "Tilldela till mig",
@@ -287,7 +287,7 @@
"Only assigned cards" : "Bara tilldelade kort",
"No reminder" : "Ingen påminnelse",
"An error occurred" : "Ett fel uppstod",
"Are you sure you want to delete the board {title}? This will delete all the data of this board including archived cards." : "Är du säker på att du vill radera brädet {title}? Detta kommer radera all data som tillhör brädet inklusive arkiverade kort.",
"Are you sure you want to delete the board {title}? This will delete all the data of this board including archived cards." : "Är du säker på att du vill radera tavla {title}? Detta kommer radera all data som tillhör tavlan inklusive arkiverade kort.",
"Delete the board?" : "Ta bort tavlan?",
"Loading filtered view" : "Laddar filtrerad vy",
"No due" : "Inget slut",
@@ -301,6 +301,7 @@
"Click to expand comment" : "Klicka för att utöka kommentaren",
"No upcoming cards" : "Inga kommande kort",
"upcoming cards" : "kommande kort",
"New card" : "Nytt kort",
"Due on {date}" : "Går ut {date}",
"Link to a board" : "Länka till en tavla",
"Link to a card" : "Länka till ett kort",
@@ -313,9 +314,9 @@
"Share with a Deck card" : "Dela med ett Deck-kort",
"Share {file} with a Deck card" : "Dela {file} med ett Deck-kort",
"Share" : "Dela",
"Are you sure you want to transfer the board {title} for {user}?" : "Är du säker på att du vill överföra brädet {title} för {user}?",
"Transfer the board for {user} successfully" : "Överförde brädet för {user}",
"Failed to transfer the board for {user}" : "Misslyckades med att överföra brädet för {user}",
"Are you sure you want to transfer the board {title} for {user}?" : "Är du säker på att du vill överföra tavla {title} för {user}?",
"Transfer the board for {user} successfully" : "Överförde tavlan för {user}",
"Failed to transfer the board for {user}" : "Misslyckades med att överföra tavlan för {user}",
"Add a new list" : "Lägg till en ny lista",
"Are you sure you want to delete the board {title}? This will delete all the data of this board." : "Är du säker på att du vill radera tavla {title}? Detta kommer att radera all information från denna tavla."
},"pluralForm" :"nplurals=2; plural=(n != 1);"

View File

@@ -63,10 +63,10 @@ OC.L10N.register(
"{user} has restored the attachment {attachment} to card {card}" : "{user}, {card} kartındaki {attachment} dosyasını geri yükledi",
"You have commented on card {card}" : "{card} kartı hakkında yorum yaptınız",
"{user} has commented on card {card}" : "{user}, {card} kartı hakkında yorum yaptı",
"A <strong>card description</strong> inside the Deck app has been changed" : "Tahta uygulamasında bir <strong>kart açıklaması</strong> değiştirildi",
"A <strong>card description</strong> inside the Deck app has been changed" : "Tahta uygulamasında bir <strong>kart açıklaması</strong> değiştirildiğinde",
"Deck" : "Tahta",
"Changes in the <strong>Deck app</strong>" : "<strong>Tahta uygulamasındaki</strong> değişiklikler",
"A <strong>comment</strong> was created on a card" : "Bir kart için bir <strong>yorum</strong> yapıldı",
"Changes in the <strong>Deck app</strong>" : "<strong>Tahta uygulamasında</strong> değişiklik yapıldığında",
"A <strong>comment</strong> was created on a card" : "Bir kart için bir <strong>yorum</strong> yapıldığında",
"Upcoming cards" : "Yaklaşan kartlar",
"Load more" : "Diğerlerini yükle",
"Personal" : "Kişisel",
@@ -128,7 +128,7 @@ OC.L10N.register(
"Create card" : "Kart ekle",
"Select a card" : "Bir kart seçin",
"Select the card to link to a project" : "Bir proje ile ilişkilendirilecek kart bağlantısını seçin",
"Link to card" : "Kart ile ilişkilendir",
"Link to card" : "Kart bağlantısı",
"File already exists" : "Dosya zaten var",
"A file with the name {filename} already exists." : "{filename} adlı bir dosya zaten var.",
"Do you want to overwrite it?" : "Üzerine yazmak ister misiniz?",
@@ -293,7 +293,7 @@ OC.L10N.register(
"Delete the board?" : "Pano silinsin mi?",
"Loading filtered view" : "Süzülmüş görünüm yükleniyor",
"No due" : "Bitiş yok",
"Search for {searchQuery} in all boards" : "Tüm panolarda {searchQuery} için sonuçlar",
"Search for {searchQuery} in all boards" : "Tüm panolarda {searchQuery} araması için sonuçlar",
"No results found" : "Herhangi bir sonuç bulunamadı",
"Deck board {name}\n* Last modified on {lastMod}" : "{name} tahta panosu\n* Son değişiklik: {lastMod}",
"{stack} in {board}" : "{stack} {board} panosunda",
@@ -303,9 +303,10 @@ OC.L10N.register(
"Click to expand comment" : "Yorumu genişletmek için tıklayın",
"No upcoming cards" : "Yaklaşan bir kart yok",
"upcoming cards" : "yaklaşan kartlar",
"New card" : "Kart ekle",
"Due on {date}" : "{date} tarihinde bitecek",
"Link to a board" : "Bir pano ile ilişkilendir",
"Link to a card" : "Bir kart ile ilişkilendir",
"Link to a board" : "Bir pano bağlantısı",
"Link to a card" : "Bir kart bağlantısı",
"Create a card" : "Bir kart ekle",
"Message from {author} in {conversationName}" : "{conversationName} görüşmesinde {author} iletisi",
"Something went wrong" : "Bir şeyler ters gitti",

View File

@@ -61,10 +61,10 @@
"{user} has restored the attachment {attachment} to card {card}" : "{user}, {card} kartındaki {attachment} dosyasını geri yükledi",
"You have commented on card {card}" : "{card} kartı hakkında yorum yaptınız",
"{user} has commented on card {card}" : "{user}, {card} kartı hakkında yorum yaptı",
"A <strong>card description</strong> inside the Deck app has been changed" : "Tahta uygulamasında bir <strong>kart açıklaması</strong> değiştirildi",
"A <strong>card description</strong> inside the Deck app has been changed" : "Tahta uygulamasında bir <strong>kart açıklaması</strong> değiştirildiğinde",
"Deck" : "Tahta",
"Changes in the <strong>Deck app</strong>" : "<strong>Tahta uygulamasındaki</strong> değişiklikler",
"A <strong>comment</strong> was created on a card" : "Bir kart için bir <strong>yorum</strong> yapıldı",
"Changes in the <strong>Deck app</strong>" : "<strong>Tahta uygulamasında</strong> değişiklik yapıldığında",
"A <strong>comment</strong> was created on a card" : "Bir kart için bir <strong>yorum</strong> yapıldığında",
"Upcoming cards" : "Yaklaşan kartlar",
"Load more" : "Diğerlerini yükle",
"Personal" : "Kişisel",
@@ -126,7 +126,7 @@
"Create card" : "Kart ekle",
"Select a card" : "Bir kart seçin",
"Select the card to link to a project" : "Bir proje ile ilişkilendirilecek kart bağlantısını seçin",
"Link to card" : "Kart ile ilişkilendir",
"Link to card" : "Kart bağlantısı",
"File already exists" : "Dosya zaten var",
"A file with the name {filename} already exists." : "{filename} adlı bir dosya zaten var.",
"Do you want to overwrite it?" : "Üzerine yazmak ister misiniz?",
@@ -291,7 +291,7 @@
"Delete the board?" : "Pano silinsin mi?",
"Loading filtered view" : "Süzülmüş görünüm yükleniyor",
"No due" : "Bitiş yok",
"Search for {searchQuery} in all boards" : "Tüm panolarda {searchQuery} için sonuçlar",
"Search for {searchQuery} in all boards" : "Tüm panolarda {searchQuery} araması için sonuçlar",
"No results found" : "Herhangi bir sonuç bulunamadı",
"Deck board {name}\n* Last modified on {lastMod}" : "{name} tahta panosu\n* Son değişiklik: {lastMod}",
"{stack} in {board}" : "{stack} {board} panosunda",
@@ -301,9 +301,10 @@
"Click to expand comment" : "Yorumu genişletmek için tıklayın",
"No upcoming cards" : "Yaklaşan bir kart yok",
"upcoming cards" : "yaklaşan kartlar",
"New card" : "Kart ekle",
"Due on {date}" : "{date} tarihinde bitecek",
"Link to a board" : "Bir pano ile ilişkilendir",
"Link to a card" : "Bir kart ile ilişkilendir",
"Link to a board" : "Bir pano bağlantısı",
"Link to a card" : "Bir kart bağlantısı",
"Create a card" : "Bir kart ekle",
"Message from {author} in {conversationName}" : "{conversationName} görüşmesinde {author} iletisi",
"Something went wrong" : "Bir şeyler ters gitti",

View File

@@ -34,6 +34,7 @@ OC.L10N.register(
"You have updated the description of card {card} in list {stack} on board {board}" : "Ви оновили опис картки {card} у списку {stack} на дошці {board}",
"Deck" : "Колода",
"Changes in the <strong>Deck app</strong>" : "Зміни у застосунку <strong>Колода</strong>",
"Upcoming cards" : "Очікують на виконання",
"Load more" : "Більше",
"Personal" : "Особисте",
"Deck board" : "Дошка Deck",
@@ -64,8 +65,10 @@ OC.L10N.register(
"Select the board to link to a project" : "Виберіть дошку для прив'зки до проєкту",
"Search by board title" : "Шукати за назвою дошки",
"Select board" : "Вибрати дошку",
"Create a new card" : "Створити нову картку",
"Select a board" : "Вибрати дошку",
"Select a list" : "Виберіть список",
"Card title" : "Заголовок картки",
"Cancel" : "Скасувати",
"Close" : "закрити",
"Select a card" : "Вибрати картку",
@@ -97,6 +100,7 @@ OC.L10N.register(
"Toggle compact mode" : "Перемкнути компактний вигляд",
"Details" : "Деталі",
"Loading board" : "Завантаження дошки",
"Create a new list to add cards to this board" : "Створіть список щоб додати картки на цю дошку",
"Board not found" : "Дошку не знайдено",
"Sharing" : "Поділитися",
"Tags" : "Теги",
@@ -120,6 +124,7 @@ OC.L10N.register(
"Edit" : "Редагувати",
"Add a new tag" : "Додати нову позначку",
"title and color value must be provided" : "потрібно зазначити назву та колір",
"Board name" : "Назва дошки",
"Members" : "Учасники",
"Upload new files" : "Додати файл",
"Share from Files" : "Відкрити Файли",
@@ -133,6 +138,7 @@ OC.L10N.register(
"Comments" : "Коментарі",
"Modified" : "Змінено",
"Created" : "Створено",
"No comments yet. Begin the discussion!" : "Коментарів немає, почніть обговорення!",
"Assign a tag to this card…" : "Додати позначку до цієї картки",
"Assign to users" : "Призначити користувачам",
"Assign to users/groups/circles" : "Призначити користувачам/групам/колам",
@@ -153,13 +159,15 @@ OC.L10N.register(
"Description" : "Опис",
"(Unsaved)" : "(Не збережено)",
"(Saving…)" : "(Зберігання...)",
"Formatting help" : "Форматування довідки",
"Formatting help" : "Допомога",
"Edit description" : "Редагувати опис",
"View description" : "Переглянути опис",
"Add Attachment" : "Долучити вкладення",
"Write a description …" : "Додайте опис ...",
"Choose attachment" : "Вибрати вкладення",
"(group)" : "(група)",
"Todo items" : "Пункти завдань",
"Edit card title" : "Редагувати заголовок картки",
"Assign to me" : "Призначити мені",
"Move card" : "Пересунути картку",
"Card details" : "Деталі картки",
@@ -171,13 +179,19 @@ OC.L10N.register(
"All boards" : "Усі дошки",
"Archived boards" : "Архівні дошки",
"Shared with you" : "Вам надано доступ",
"Deck settings" : "Налаштування колоди",
"Use bigger card view" : "Режим перегляду зі збільшеними картками",
"Show boards in calendar/tasks" : "Показувати дошки в календарі та завданнях",
"Limit deck usage of groups" : "Обмежити доступ до колоди для груп",
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Створення власних робочих дощок користувачам, які не входять у задані групи, буде заблоковано. Проте, такі користувачі зможуть продовжити працювати зі спільними дошками, до яких у них є доступ.",
"Board details" : "Деталі дошки",
"Edit board" : "Редагувати дошку",
"Clone board" : "Копіювати дошку",
"Unarchive board" : "Розархівувати дошку",
"Archive board" : "Архівувати дошку",
"Turn on due date reminders" : "Нагадування про термін виконання",
"Turn off due date reminders" : "Вимкнути нагадування про терміни виконання",
"Due date reminders" : "Нагадування про терміни виконання",
"No notifications" : "Немає сповіщень",
"Delete board" : "Вилучити дошку",
"Board {0} deleted" : "Дошку {0} вилучено",
@@ -185,6 +199,10 @@ OC.L10N.register(
"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?" : "Вилучити дошку?",
"No due" : "Без призначеної дати",
"No upcoming cards" : "Немає майбутніх завдань",
"upcoming cards" : "очікують на виконання",
"Due on {date}" : "До {date}",
"Link to a board" : "Прив'язати до дошки",
"Link to a card" : "Прив'язати до картки",
"Message from {author} in {conversationName}" : "Повідомлення від {author} у {conversationName}",

View File

@@ -32,6 +32,7 @@
"You have updated the description of card {card} in list {stack} on board {board}" : "Ви оновили опис картки {card} у списку {stack} на дошці {board}",
"Deck" : "Колода",
"Changes in the <strong>Deck app</strong>" : "Зміни у застосунку <strong>Колода</strong>",
"Upcoming cards" : "Очікують на виконання",
"Load more" : "Більше",
"Personal" : "Особисте",
"Deck board" : "Дошка Deck",
@@ -62,8 +63,10 @@
"Select the board to link to a project" : "Виберіть дошку для прив'зки до проєкту",
"Search by board title" : "Шукати за назвою дошки",
"Select board" : "Вибрати дошку",
"Create a new card" : "Створити нову картку",
"Select a board" : "Вибрати дошку",
"Select a list" : "Виберіть список",
"Card title" : "Заголовок картки",
"Cancel" : "Скасувати",
"Close" : "закрити",
"Select a card" : "Вибрати картку",
@@ -95,6 +98,7 @@
"Toggle compact mode" : "Перемкнути компактний вигляд",
"Details" : "Деталі",
"Loading board" : "Завантаження дошки",
"Create a new list to add cards to this board" : "Створіть список щоб додати картки на цю дошку",
"Board not found" : "Дошку не знайдено",
"Sharing" : "Поділитися",
"Tags" : "Теги",
@@ -118,6 +122,7 @@
"Edit" : "Редагувати",
"Add a new tag" : "Додати нову позначку",
"title and color value must be provided" : "потрібно зазначити назву та колір",
"Board name" : "Назва дошки",
"Members" : "Учасники",
"Upload new files" : "Додати файл",
"Share from Files" : "Відкрити Файли",
@@ -131,6 +136,7 @@
"Comments" : "Коментарі",
"Modified" : "Змінено",
"Created" : "Створено",
"No comments yet. Begin the discussion!" : "Коментарів немає, почніть обговорення!",
"Assign a tag to this card…" : "Додати позначку до цієї картки",
"Assign to users" : "Призначити користувачам",
"Assign to users/groups/circles" : "Призначити користувачам/групам/колам",
@@ -151,13 +157,15 @@
"Description" : "Опис",
"(Unsaved)" : "(Не збережено)",
"(Saving…)" : "(Зберігання...)",
"Formatting help" : "Форматування довідки",
"Formatting help" : "Допомога",
"Edit description" : "Редагувати опис",
"View description" : "Переглянути опис",
"Add Attachment" : "Долучити вкладення",
"Write a description …" : "Додайте опис ...",
"Choose attachment" : "Вибрати вкладення",
"(group)" : "(група)",
"Todo items" : "Пункти завдань",
"Edit card title" : "Редагувати заголовок картки",
"Assign to me" : "Призначити мені",
"Move card" : "Пересунути картку",
"Card details" : "Деталі картки",
@@ -169,13 +177,19 @@
"All boards" : "Усі дошки",
"Archived boards" : "Архівні дошки",
"Shared with you" : "Вам надано доступ",
"Deck settings" : "Налаштування колоди",
"Use bigger card view" : "Режим перегляду зі збільшеними картками",
"Show boards in calendar/tasks" : "Показувати дошки в календарі та завданнях",
"Limit deck usage of groups" : "Обмежити доступ до колоди для груп",
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Створення власних робочих дощок користувачам, які не входять у задані групи, буде заблоковано. Проте, такі користувачі зможуть продовжити працювати зі спільними дошками, до яких у них є доступ.",
"Board details" : "Деталі дошки",
"Edit board" : "Редагувати дошку",
"Clone board" : "Копіювати дошку",
"Unarchive board" : "Розархівувати дошку",
"Archive board" : "Архівувати дошку",
"Turn on due date reminders" : "Нагадування про термін виконання",
"Turn off due date reminders" : "Вимкнути нагадування про терміни виконання",
"Due date reminders" : "Нагадування про терміни виконання",
"No notifications" : "Немає сповіщень",
"Delete board" : "Вилучити дошку",
"Board {0} deleted" : "Дошку {0} вилучено",
@@ -183,6 +197,10 @@
"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?" : "Вилучити дошку?",
"No due" : "Без призначеної дати",
"No upcoming cards" : "Немає майбутніх завдань",
"upcoming cards" : "очікують на виконання",
"Due on {date}" : "До {date}",
"Link to a board" : "Прив'язати до дошки",
"Link to a card" : "Прив'язати до картки",
"Message from {author} in {conversationName}" : "Повідомлення від {author} у {conversationName}",

View File

@@ -173,7 +173,7 @@ OC.L10N.register(
"Can manage" : "可以管理",
"Owner" : "所有者",
"Delete" : "删除",
"Failed to create share with {displayName}" : "用 {displayName} 创建分享失败",
"Failed to create share with {displayName}" : "用{displayName}创建分享失败",
"Transfer" : "传输",
"Archive all cards" : "归档所有卡片",
"Delete list" : "删除列表",
@@ -285,7 +285,7 @@ OC.L10N.register(
"Create a card" : "创建一张卡片",
"Message from {author} in {conversationName}" : "{conversationName} 会话中来自 {author} 的消息",
"Something went wrong" : "发生了错误",
"Failed to upload {name}" : "未能上传 {name}",
"Failed to upload {name}" : "未能上传{name}",
"Maximum file size of {size} exceeded" : "文件容量已超过 {size} 的上限",
"Error creating the share" : "创建分享出错",
"Share with a Deck card" : "分享给一张看板卡片",

View File

@@ -171,7 +171,7 @@
"Can manage" : "可以管理",
"Owner" : "所有者",
"Delete" : "删除",
"Failed to create share with {displayName}" : "用 {displayName} 创建分享失败",
"Failed to create share with {displayName}" : "用{displayName}创建分享失败",
"Transfer" : "传输",
"Archive all cards" : "归档所有卡片",
"Delete list" : "删除列表",
@@ -283,7 +283,7 @@
"Create a card" : "创建一张卡片",
"Message from {author} in {conversationName}" : "{conversationName} 会话中来自 {author} 的消息",
"Something went wrong" : "发生了错误",
"Failed to upload {name}" : "未能上传 {name}",
"Failed to upload {name}" : "未能上传{name}",
"Maximum file size of {size} exceeded" : "文件容量已超过 {size} 的上限",
"Error creating the share" : "创建分享出错",
"Share with a Deck card" : "分享给一张看板卡片",

View File

@@ -303,6 +303,7 @@ OC.L10N.register(
"Click to expand comment" : "點擊展開評論",
"No upcoming cards" : "沒有快將到期的卡片",
"upcoming cards" : "快將到期的卡片",
"New card" : "新卡片",
"Due on {date}" : "於 {date} 到期",
"Link to a board" : "連結到面板",
"Link to a card" : "連結到卡片",

View File

@@ -301,6 +301,7 @@
"Click to expand comment" : "點擊展開評論",
"No upcoming cards" : "沒有快將到期的卡片",
"upcoming cards" : "快將到期的卡片",
"New card" : "新卡片",
"Due on {date}" : "於 {date} 到期",
"Link to a board" : "連結到面板",
"Link to a card" : "連結到卡片",

View File

@@ -78,7 +78,7 @@ OC.L10N.register(
"{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" : "看板佈告欄",
"Deck board" : "Deck 佈告欄",
"Owned by %1$s" : "由 %1$s 擁有",
"Deck boards, cards and comments" : "Deck 看板、卡片與評論",
"From %1$s, in %2$s/%3$s, owned by %4$s" : "來自 %1$s在 %2$s/%3$s由 %4$s 擁有",
@@ -303,6 +303,7 @@ OC.L10N.register(
"Click to expand comment" : "點擊展開留言",
"No upcoming cards" : "無接下來的卡片",
"upcoming cards" : "接下來的卡片",
"New card" : "新卡片",
"Due on {date}" : "於 {date} 到期",
"Link to a board" : "連結到佈告欄",
"Link to a card" : "連結到卡片",

View File

@@ -76,7 +76,7 @@
"{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" : "看板佈告欄",
"Deck board" : "Deck 佈告欄",
"Owned by %1$s" : "由 %1$s 擁有",
"Deck boards, cards and comments" : "Deck 看板、卡片與評論",
"From %1$s, in %2$s/%3$s, owned by %4$s" : "來自 %1$s在 %2$s/%3$s由 %4$s 擁有",
@@ -301,6 +301,7 @@
"Click to expand comment" : "點擊展開留言",
"No upcoming cards" : "無接下來的卡片",
"upcoming cards" : "接下來的卡片",
"New card" : "新卡片",
"Due on {date}" : "於 {date} 到期",
"Link to a board" : "連結到佈告欄",
"Link to a card" : "連結到卡片",

View File

@@ -36,6 +36,7 @@ use OCA\Deck\Db\CardMapper;
use OCA\Deck\Event\AclCreatedEvent;
use OCA\Deck\Event\AclDeletedEvent;
use OCA\Deck\Event\AclUpdatedEvent;
use OCA\Deck\Event\BoardUpdatedEvent;
use OCA\Deck\Event\CardCreatedEvent;
use OCA\Deck\Event\CardDeletedEvent;
use OCA\Deck\Event\CardUpdatedEvent;
@@ -154,6 +155,13 @@ class Application extends App implements IBootstrap {
// Event listening for realtime updates via notify_push
$context->registerEventListener(SessionCreatedEvent::class, LiveUpdateListener::class);
$context->registerEventListener(SessionClosedEvent::class, LiveUpdateListener::class);
$context->registerEventListener(BoardUpdatedEvent::class, LiveUpdateListener::class);
$context->registerEventListener(CardCreatedEvent::class, LiveUpdateListener::class);
$context->registerEventListener(CardUpdatedEvent::class, LiveUpdateListener::class);
$context->registerEventListener(CardDeletedEvent::class, LiveUpdateListener::class);
$context->registerEventListener(AclCreatedEvent::class, LiveUpdateListener::class);
$context->registerEventListener(AclUpdatedEvent::class, LiveUpdateListener::class);
$context->registerEventListener(AclDeletedEvent::class, LiveUpdateListener::class);
$context->registerNotifierService(Notifier::class);
$context->registerEventListener(LoadAdditionalScriptsEvent::class, ResourceAdditionalScriptsListener::class);

View File

@@ -60,12 +60,14 @@ class BoardApiController extends ApiController {
* @NoCSRFRequired
*
* Return all of the boards that the current user has access to.
*
* @param bool $details
* @throws StatusException
*/
public function index($details = null) {
public function index(bool $details = false) {
$modified = $this->request->getHeader('If-Modified-Since');
if ($modified === null || $modified === '') {
$boards = $this->boardService->findAll(0, $details);
$boards = $this->boardService->findAll(0, $details === true);
} else {
$date = Util::parseHTTPDate($modified);
if (!$date) {

View File

@@ -59,20 +59,21 @@ class Calendar extends ExternalCalendar {
}
public function getACL() {
// the calendar should always have the read and the write-properties permissions
// write-properties is needed to allow the user to toggle the visibility of shared deck calendars
$acl = [
[
'privilege' => '{DAV:}read',
'principal' => $this->getOwner(),
'protected' => true,
]
];
if ($this->backend->checkBoardPermission($this->board->getId(), Acl::PERMISSION_MANAGE)) {
$acl[] = [
],
[
'privilege' => '{DAV:}write-properties',
'principal' => $this->getOwner(),
'protected' => true,
];
}
]
];
return $acl;
}
@@ -187,12 +188,18 @@ class Calendar extends ExternalCalendar {
foreach ($properties as $key => $value) {
switch ($key) {
case '{DAV:}displayname':
if (!$this->backend->checkBoardPermission($this->board->getId(), Acl::PERMISSION_MANAGE)) {
throw new Forbidden('no permission to change the displayname');
}
if (mb_strpos($value, 'Deck: ') === 0) {
$value = mb_substr($value, strlen('Deck: '));
}
$this->board->setTitle($value);
break;
case '{http://apple.com/ns/ical/}calendar-color':
if (!$this->backend->checkBoardPermission($this->board->getId(), Acl::PERMISSION_MANAGE)) {
throw new Forbidden('no permission to change the calendar color');
}
$color = substr($value, 1, 6);
if (!preg_match('/[a-f0-9]{6}/i', $color)) {
throw new InvalidDataException('No valid color provided');

View File

@@ -59,7 +59,7 @@ class DeckCalendarBackend {
}
public function getBoards(): array {
return $this->boardService->findAll(-1, null, false);
return $this->boardService->findAll(-1, false, false);
}
public function getBoard(int $id): Board {

View File

@@ -117,7 +117,7 @@ class DeckWidget implements IAPIWidget, IButtonWidget, IIconWidget {
$nowTimestamp = (new Datetime())->getTimestamp();
$sinceTimestamp = $since !== null ? (new Datetime($since))->getTimestamp() : null;
$upcomingCards = array_filter($upcomingCards, static function (array $card) use ($nowTimestamp, $sinceTimestamp) {
if ($card['duedate']) {
if (isset($card['duedate'])) {
$ts = (new Datetime($card['duedate']))->getTimestamp();
return $ts > $nowTimestamp && ($sinceTimestamp === null || $ts > $sinceTimestamp);
}

View File

@@ -52,6 +52,20 @@ class AclMapper extends DeckMapper implements IPermissionMapper {
return $this->findEntities($qb);
}
public function findIn(array $boardIds, ?int $limit = null, ?int $offset = null): array {
$qb = $this->db->getQueryBuilder();
$qb->select('id', 'board_id', 'type', 'participant', 'permission_edit', 'permission_share', 'permission_manage')
->from('deck_board_acl')
->where($qb->expr()->in('board_id', $qb->createParameter('boardIds')))
->setMaxResults($limit)
->setFirstResult($offset);
return iterator_to_array($this->chunkQuery($boardIds, function (array $ids) use ($qb) {
$qb->setParameter('boardIds', $ids, IQueryBuilder::PARAM_INT_ARRAY);
return $this->findEntities($qb);
}));
}
/**
* @param numeric $userId
* @param numeric $id

View File

@@ -28,15 +28,13 @@ namespace OCA\Deck\Db;
use OCA\Deck\NotFoundException;
use OCA\Deck\Service\CirclesService;
use OCP\AppFramework\Db\Entity;
use OCP\AppFramework\Db\QBMapper;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\IDBConnection;
use OCP\IGroupManager;
use OCP\IUserManager;
use PDO;
/** @template-extends QBMapper<Assignment> */
class AssignmentMapper extends QBMapper implements IPermissionMapper {
/** @template-extends DeckMapper<Assignment> */
class AssignmentMapper extends DeckMapper implements IPermissionMapper {
/** @var CardMapper */
private $cardMapper;
@@ -60,7 +58,7 @@ class AssignmentMapper extends QBMapper implements IPermissionMapper {
$qb = $this->db->getQueryBuilder();
$qb->select('*')
->from('deck_assigned_users')
->where($qb->expr()->eq('card_id', $qb->createNamedParameter($cardId, PDO::PARAM_INT)));
->where($qb->expr()->eq('card_id', $qb->createNamedParameter($cardId, IQueryBuilder::PARAM_INT)));
$users = $this->findEntities($qb);
foreach ($users as $user) {
$this->mapParticipant($user);
@@ -68,12 +66,29 @@ class AssignmentMapper extends QBMapper implements IPermissionMapper {
return $users;
}
public function findIn(array $cardIds): array {
$qb = $this->db->getQueryBuilder();
$qb->select('*')
->from('deck_assigned_users')
->where($qb->expr()->in('card_id', $qb->createParameter('cardIds')));
$users = iterator_to_array($this->chunkQuery($cardIds, function (array $ids) use ($qb) {
$qb->setParameter('cardIds', $ids, IQueryBuilder::PARAM_INT_ARRAY);
return $this->findEntities($qb);
}));
foreach ($users as $user) {
$this->mapParticipant($user);
}
return $users;
}
public function findByParticipant(string $participant, $type = Assignment::TYPE_USER): array {
$qb = $this->db->getQueryBuilder();
$qb->select('*')
->from('deck_assigned_users')
->where($qb->expr()->eq('participant', $qb->createNamedParameter($participant, PDO::PARAM_STR)))
->andWhere($qb->expr()->eq('type', $qb->createNamedParameter($type, PDO::PARAM_INT)));
->where($qb->expr()->eq('participant', $qb->createNamedParameter($participant, IQueryBuilder::PARAM_STR)))
->andWhere($qb->expr()->eq('type', $qb->createNamedParameter($type, IQueryBuilder::PARAM_INT)));
return $this->findEntities($qb);
}
@@ -132,8 +147,8 @@ class AssignmentMapper extends QBMapper implements IPermissionMapper {
private function getOrigin(Assignment $assignment) {
if ($assignment->getType() === Assignment::TYPE_USER) {
$origin = $this->userManager->get($assignment->getParticipant());
return $origin ? new User($origin) : null;
$origin = $this->userManager->userExists($assignment->getParticipant());
return $origin ? new User($assignment->getParticipant(), $this->userManager) : null;
}
if ($assignment->getType() === Assignment::TYPE_GROUP) {
$origin = $this->groupManager->get($assignment->getParticipant());

View File

@@ -90,9 +90,6 @@ class BoardMapper extends QBMapper implements IPermissionMapper {
$this->boardCache[$id] = $this->findEntity($qb);
}
// FIXME is this necessary? it was NOT done with the old mapper
// $this->mapOwner($board);
// Add labels
if ($withLabels && $this->boardCache[$id]->getLabels() === null) {
$labels = $this->labelMapper->findAll($id);
@@ -159,7 +156,21 @@ class BoardMapper extends QBMapper implements IPermissionMapper {
$userBoards = $this->findAllByUser($userId, null, null, $since, $includeArchived, $before, $term);
$groupBoards = $this->findAllByGroups($userId, $groups, null, null, $since, $includeArchived, $before, $term);
$circleBoards = $this->findAllByCircles($userId, null, null, $since, $includeArchived, $before, $term);
$allBoards = array_unique(array_merge($userBoards, $groupBoards, $circleBoards));
$allBoards = array_values(array_unique(array_merge($userBoards, $groupBoards, $circleBoards)));
// Could be moved outside
$acls = $this->aclMapper->findIn(array_map(function ($board) {
return $board->getId();
}, $allBoards));
/* @var Board $entry */
foreach ($allBoards as $entry) {
$boardAcls = array_values(array_filter($acls, function ($acl) use ($entry) {
return $acl->getBoardId() === $entry->getId();
}));
$entry->setAcl($boardAcls);
}
foreach ($allBoards as $board) {
$this->boardCache[$board->getId()] = $board;
}
@@ -259,11 +270,7 @@ class BoardMapper extends QBMapper implements IPermissionMapper {
$entry->setShared(1);
}
$entries = array_merge($entries, $sharedEntries);
/* @var Board $entry */
foreach ($entries as $entry) {
$acl = $this->aclMapper->findAll($entry->id);
$entry->setAcl($acl);
}
return $entries;
}
@@ -336,11 +343,6 @@ class BoardMapper extends QBMapper implements IPermissionMapper {
foreach ($entries as $entry) {
$entry->setShared(2);
}
/* @var Board $entry */
foreach ($entries as $entry) {
$acl = $this->aclMapper->findAll($entry->id);
$entry->setAcl($acl);
}
return $entries;
}
@@ -397,11 +399,6 @@ class BoardMapper extends QBMapper implements IPermissionMapper {
foreach ($entries as $entry) {
$entry->setShared(2);
}
/* @var Board $entry */
foreach ($entries as $entry) {
$acl = $this->aclMapper->findAll($entry->id);
$entry->setAcl($acl);
}
return $entries;
}
@@ -455,13 +452,11 @@ class BoardMapper extends QBMapper implements IPermissionMapper {
}
public function mapAcl(Acl &$acl) {
$userManager = $this->userManager;
$groupManager = $this->groupManager;
$acl->resolveRelation('participant', function ($participant) use (&$acl, &$userManager, &$groupManager) {
if ($acl->getType() === Acl::PERMISSION_TYPE_USER) {
$user = $userManager->get($participant);
if ($user !== null) {
return new User($user);
if ($this->userManager->userExists($acl->getParticipant())) {
return new User($acl->getParticipant(), $this->userManager);
}
$this->logger->debug('User ' . $acl->getId() . ' not found when mapping acl ' . $acl->getParticipant());
return null;
@@ -499,9 +494,8 @@ class BoardMapper extends QBMapper implements IPermissionMapper {
public function mapOwner(Board &$board) {
$userManager = $this->userManager;
$board->resolveRelation('owner', function ($owner) use (&$userManager) {
$user = $userManager->get($owner);
if ($user !== null) {
return new User($user);
if ($this->userManager->userExists($owner)) {
return new User($owner, $userManager);
}
return null;
});

View File

@@ -159,16 +159,17 @@ class Card extends RelationalEntity {
}
public function getDaysUntilDue(): ?int {
$today = new DateTime();
$match_date = $this->getDuedate();
if ($match_date === null) {
if ($this->getDuedate() === null) {
return null;
}
$today = new DateTime();
$today->setTime(0, 0);
$match_date->setTime(0, 0);
$diff = $today->diff($match_date);
$matchDate = DateTime::createFromInterface($this->getDuedate());
$matchDate->setTime(0, 0);
$diff = $today->diff($matchDate);
return (int) $diff->format('%R%a'); // Extract days count in interval
}

View File

@@ -254,13 +254,13 @@ class CardMapper extends QBMapper implements IPermissionMapper {
return $this->findEntities($qb);
}
public function findAllWithDue($boardId) {
public function findAllWithDue(array $boardIds) {
$qb = $this->db->getQueryBuilder();
$qb->select('c.*')
->from('deck_cards', 'c')
->innerJoin('c', 'deck_stacks', 's', 's.id = c.stack_id')
->innerJoin('s', 'deck_boards', 'b', 'b.id = s.board_id')
->where($qb->expr()->eq('s.board_id', $qb->createNamedParameter($boardId, IQueryBuilder::PARAM_INT)))
->where($qb->expr()->in('s.board_id', $qb->createNamedParameter($boardIds, IQueryBuilder::PARAM_INT_ARRAY)))
->andWhere($qb->expr()->isNotNull('c.duedate'))
->andWhere($qb->expr()->eq('c.archived', $qb->createNamedParameter(false, IQueryBuilder::PARAM_BOOL)))
->andWhere($qb->expr()->eq('c.deleted_at', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT)))
@@ -270,14 +270,14 @@ class CardMapper extends QBMapper implements IPermissionMapper {
return $this->findEntities($qb);
}
public function findToMeOrNotAssignedCards($boardId, $username) {
public function findToMeOrNotAssignedCards(array $boardIds, string $username) {
$qb = $this->db->getQueryBuilder();
$qb->select('c.*')
->from('deck_cards', 'c')
->innerJoin('c', 'deck_stacks', 's', 's.id = c.stack_id')
->innerJoin('s', 'deck_boards', 'b', 'b.id = s.board_id')
->leftJoin('c', 'deck_assigned_users', 'u', 'c.id = u.card_id')
->where($qb->expr()->eq('s.board_id', $qb->createNamedParameter($boardId, IQueryBuilder::PARAM_INT)))
->where($qb->expr()->in('s.board_id', $qb->createNamedParameter($boardIds, IQueryBuilder::PARAM_INT_ARRAY)))
->andWhere($qb->expr()->orX(
$qb->expr()->eq('u.participant', $qb->createNamedParameter($username, IQueryBuilder::PARAM_STR)),
$qb->expr()->isNull('u.participant'))
@@ -607,9 +607,8 @@ class CardMapper extends QBMapper implements IPermissionMapper {
public function mapOwner(Card &$card) {
$userManager = $this->userManager;
$card->resolveRelation('owner', function ($owner) use (&$userManager) {
$user = $userManager->get($owner);
if ($user !== null) {
return new User($user);
if ($userManager->userExists($owner)) {
return new User($owner, $this->userManager);
}
return null;
});

View File

@@ -23,6 +23,7 @@
namespace OCA\Deck\Db;
use Generator;
use OCP\AppFramework\Db\Entity;
use OCP\AppFramework\Db\QBMapper;
use OCP\DB\QueryBuilder\IQueryBuilder;
@@ -35,7 +36,7 @@ abstract class DeckMapper extends QBMapper {
/**
* @param $id
* @return \OCP\AppFramework\Db\Entity if not found
* @return T
* @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException
* @throws \OCP\AppFramework\Db\DoesNotExistException
*/
@@ -47,4 +48,21 @@ abstract class DeckMapper extends QBMapper {
return $this->findEntity($qb);
}
/**
* Helper function to split passed array into chunks of 1000 elements and
* call a given callback for fetching query results
*
* Can be useful to limit to 1000 results per query for oracle compatiblity
* but still iterate over all results
*/
public function chunkQuery(array $ids, callable $callback): Generator {
$limit = 1000;
while (!empty($ids)) {
$slice = array_splice($ids, 0, $limit);
foreach ($callback($slice) as $item) {
yield $item;
}
}
}
}

View File

@@ -79,6 +79,19 @@ class LabelMapper extends DeckMapper implements IPermissionMapper {
return $this->findEntities($qb);
}
public function findAssignedLabelsForCards($cardIds, $limit = null, $offset = null): array {
$qb = $this->db->getQueryBuilder();
$qb->select('l.*', 'card_id')
->from($this->getTableName(), 'l')
->innerJoin('l', 'deck_assigned_labels', 'al', 'l.id = al.label_id')
->where($qb->expr()->in('card_id', $qb->createNamedParameter($cardIds, IQueryBuilder::PARAM_INT_ARRAY)))
->orderBy('l.id')
->setMaxResults($limit)
->setFirstResult($offset);
return $this->findEntities($qb);
}
/**
* @param numeric $boardId
* @param int|null $limit

View File

@@ -33,7 +33,7 @@ class RelationalObject implements JsonSerializable {
* RelationalObject constructor.
*
* @param $primaryKey string
* @param $object
* @param callable|mixed $object
*/
public function __construct($primaryKey, $object) {
$this->primaryKey = $primaryKey;
@@ -47,16 +47,24 @@ class RelationalObject implements JsonSerializable {
);
}
public function getObject() {
if (is_callable($this->object)) {
$this->object = call_user_func($this->object, $this);
}
return $this->object;
}
/**
* This method should be overwritten if object doesn't implement \JsonSerializable
*
* @throws \Exception
*/
public function getObjectSerialization() {
if ($this->object instanceof JsonSerializable) {
return $this->object->jsonSerialize();
if ($this->getObject() instanceof JsonSerializable) {
return $this->getObject()->jsonSerialize();
} else {
throw new \Exception('jsonSerialize is not implemented on ' . get_class($this));
throw new \Exception('jsonSerialize is not implemented on ' . get_class($this->getObject()));
}
}

View File

@@ -26,16 +26,27 @@ namespace OCA\Deck\Db;
use OCP\AppFramework\Db\DoesNotExistException;
use OCP\AppFramework\Db\Entity;
use OCP\AppFramework\Db\MultipleObjectsReturnedException;
use OCP\Cache\CappedMemoryCache;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\IDBConnection;
use OCP\ICache;
use OCP\ICacheFactory;
/** @template-extends DeckMapper<Stack> */
class StackMapper extends DeckMapper implements IPermissionMapper {
private $cardMapper;
private CappedMemoryCache $stackCache;
private CardMapper $cardMapper;
private ICache $cache;
public function __construct(IDBConnection $db, CardMapper $cardMapper) {
public function __construct(
IDBConnection $db,
CardMapper $cardMapper,
ICacheFactory $cacheFactory
) {
parent::__construct($db, 'deck_stacks', Stack::class);
$this->cardMapper = $cardMapper;
$this->stackCache = new CappedMemoryCache();
$this->cache = $cacheFactory->createDistributed('deck-stackMapper');
}
@@ -47,12 +58,17 @@ class StackMapper extends DeckMapper implements IPermissionMapper {
* @throws \OCP\DB\Exception
*/
public function find($id): Stack {
if (isset($this->stackCache[(string)$id])) {
return $this->stackCache[(string)$id];
}
$qb = $this->db->getQueryBuilder();
$qb->select('*')
->from($this->getTableName())
->where($qb->expr()->eq('id', $qb->createNamedParameter($id, IQueryBuilder::PARAM_INT)));
return $this->findEntity($qb);
$this->stackCache[(string)$id] = $this->findEntity($qb);
return $this->stackCache[(string)$id];
}
/**
@@ -113,9 +129,16 @@ class StackMapper extends DeckMapper implements IPermissionMapper {
return $this->findEntities($qb);
}
public function update(Entity $entity): Entity {
$result = parent::update($entity);
$this->stackCache[(string)$entity->getId()] = $result;
return $result;
}
public function delete(Entity $entity): Entity {
// delete cards on stack
$this->cardMapper->deleteByStack($entity->getId());
unset($this->stackCache[(string)$entity->getId()]);
return parent::delete($entity);
}
@@ -142,12 +165,19 @@ class StackMapper extends DeckMapper implements IPermissionMapper {
* @throws \OCP\DB\Exception
*/
public function findBoardId($id): ?int {
$result = $this->cache->get('findBoardId:' . $id);
if ($result !== null) {
return $result !== false ? $result : null;
}
try {
$entity = $this->find($id);
return $entity->getBoardId();
$result = $entity->getBoardId();
} catch (DoesNotExistException $e) {
$result = false;
} catch (MultipleObjectsReturnedException $e) {
}
return null;
$this->cache->set('findBoardId:' . $id, $result);
return $result !== false ? $result : null;
}
}

View File

@@ -23,27 +23,30 @@
namespace OCA\Deck\Db;
use OCP\IUser;
use OCP\IUserManager;
class User extends RelationalObject {
public function __construct(IUser $user) {
$primaryKey = $user->getUID();
parent::__construct($primaryKey, $user);
private IUserManager $userManager;
public function __construct($uid, IUserManager $userManager) {
$this->userManager = $userManager;
parent::__construct($uid, function ($object) {
return $this->userManager->get($object->getPrimaryKey());
});
}
public function getObjectSerialization() {
return [
'uid' => $this->object->getUID(),
'displayname' => $this->object->getDisplayName(),
'type' => 0
'uid' => $this->getObject()->getUID(),
'displayname' => $this->getObject()->getDisplayName(),
'type' => Acl::PERMISSION_TYPE_USER
];
}
public function getUID() {
return $this->object->getUID();
return $this->getPrimaryKey();
}
public function getDisplayName() {
return $this->object->getDisplayName();
return $this->userManager->getDisplayName($this->getPrimaryKey());
}
}

View File

@@ -31,7 +31,7 @@ use OCP\EventDispatcher\Event;
abstract class AAclEvent extends Event {
private $acl;
public function __construct(Acl $acl) {
parent::__construct();
@@ -41,4 +41,8 @@ abstract class AAclEvent extends Event {
public function getAcl(): Acl {
return $this->acl;
}
public function getBoardId(): int {
return $this->acl->getBoardId();
}
}

View File

@@ -0,0 +1,43 @@
<?php
/*
* @copyright Copyright (c) 2022 chandi Langecker <git@chandi.it>
*
* @author chandi Langecker <git@chandi.it>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
declare(strict_types=1);
namespace OCA\Deck\Event;
use OCP\EventDispatcher\Event;
class BoardUpdatedEvent extends Event {
private $boardId;
public function __construct(int $boardId) {
parent::__construct();
$this->boardId = $boardId;
}
public function getBoardId(): int {
return $this->boardId;
}
}

View File

@@ -26,5 +26,17 @@ declare(strict_types=1);
namespace OCA\Deck\Event;
use OCA\Deck\Db\Card;
class CardUpdatedEvent extends ACardEvent {
private $cardBefore;
public function __construct(Card $card, Card $before = null) {
parent::__construct($card);
$this->cardBefore = $before;
}
public function getCardBefore() {
return $this->cardBefore;
}
}

View File

@@ -26,7 +26,12 @@ declare(strict_types=1);
namespace OCA\Deck\Listeners;
use OCA\Deck\Db\StackMapper;
use OCA\Deck\NotifyPushEvents;
use OCA\Deck\Event\AAclEvent;
use OCA\Deck\Event\ACardEvent;
use OCA\Deck\Event\BoardUpdatedEvent;
use OCA\Deck\Event\CardUpdatedEvent;
use OCA\Deck\Event\SessionClosedEvent;
use OCA\Deck\Event\SessionCreatedEvent;
use OCA\Deck\Service\SessionService;
@@ -37,18 +42,20 @@ use OCP\IRequest;
use Psr\Container\ContainerInterface;
use Psr\Log\LoggerInterface;
/** @template-implements IEventListener<Event|SessionCreatedEvent|SessionClosedEvent> */
/** @template-implements IEventListener<Event|SessionCreatedEvent|SessionClosedEvent|AAclEvent|ACardEvent|CardUpdatedEvent|BoardUpdatedEvent> */
class LiveUpdateListener implements IEventListener {
private LoggerInterface $logger;
private SessionService $sessionService;
private IRequest $request;
private StackMapper $stackMapper;
private $queue;
public function __construct(
ContainerInterface $container,
IRequest $request,
LoggerInterface $logger,
SessionService $sessionService
SessionService $sessionService,
StackMapper $stackMapper
) {
try {
$this->queue = $container->get(IQueue::class);
@@ -59,6 +66,7 @@ class LiveUpdateListener implements IEventListener {
$this->logger = $logger;
$this->sessionService = $sessionService;
$this->request = $request;
$this->stackMapper = $stackMapper;
}
public function handle(Event $event): void {
@@ -68,17 +76,37 @@ class LiveUpdateListener implements IEventListener {
}
try {
// the web frontend is adding the Session-ID as a header on every request
// the web frontend is adding the Session-ID as a header
// TODO: verify the token! this currently allows to spoof a token from someone
// else, preventing this person from getting any live updates
// else, preventing this person from getting updates
$causingSessionToken = $this->request->getHeader('x-nc-deck-session');
if (
$event instanceof SessionCreatedEvent ||
$event instanceof SessionClosedEvent
$event instanceof SessionClosedEvent ||
$event instanceof BoardUpdatedEvent ||
$event instanceof AAclEvent
) {
$this->sessionService->notifyAllSessions($this->queue, $event->getBoardId(), NotifyPushEvents::DeckBoardUpdate, [
'id' => $event->getBoardId()
], $causingSessionToken);
} elseif ($event instanceof ACardEvent) {
$boardId = $this->stackMapper->findBoardId($event->getCard()->getStackId());
$this->sessionService->notifyAllSessions($this->queue, $boardId, NotifyPushEvents::DeckCardUpdate, [
'boardId' => $boardId,
'cardId' => $event->getCard()->getId()
], $causingSessionToken);
// if card got moved to a diferent board, we should notify
// also sessions active on the previous board
if ($event instanceof CardUpdatedEvent && $event->getCardBefore()) {
$previousBoardId = $this->stackMapper->findBoardId($event->getCardBefore()->getStackId());
if ($boardId !== $previousBoardId) {
$this->sessionService->notifyAllSessions($this->queue, $previousBoardId, NotifyPushEvents::DeckCardUpdate, [
'boardId' => $boardId,
'cardId' => $event->getCard()->getId()
], $causingSessionToken);
}
}
}
} catch (\Exception $e) {
$this->logger->error('Error when handling live update event', ['exception' => $e]);

View File

@@ -26,4 +26,5 @@ namespace OCA\Deck;
class NotifyPushEvents {
public const DeckBoardUpdate = 'deck_board_update';
public const DeckCardUpdate = 'deck_card_update';
}

View File

@@ -23,6 +23,7 @@
namespace OCA\Deck\Reference;
use OCA\Deck\AppInfo\Application;
use OCA\Deck\NoPermissionException;
use OCA\Deck\Service\BoardService;
use OCP\Collaboration\Reference\IReference;
use OCP\Collaboration\Reference\IReferenceProvider;
@@ -67,7 +68,12 @@ class BoardReferenceProvider implements IReferenceProvider {
if ($this->matchReference($referenceText)) {
$boardId = $this->getBoardId($referenceText);
if ($boardId !== null) {
$board = $this->boardService->find($boardId)->jsonSerialize();
try {
$board = $this->boardService->find($boardId)->jsonSerialize();
} catch (NoPermissionException $e) {
// Skip throwing if user has no permissions
return null;
}
$board = $this->sanitizeSerializedBoard($board);
/** @var IReference $reference */
$reference = new Reference($referenceText);

View File

@@ -27,6 +27,7 @@ use OCA\Deck\Db\Assignment;
use OCA\Deck\Db\Attachment;
use OCA\Deck\Db\Label;
use OCA\Deck\Model\CardDetails;
use OCA\Deck\NoPermissionException;
use OCA\Deck\Service\BoardService;
use OCA\Deck\Service\CardService;
use OCA\Deck\Service\StackService;
@@ -121,9 +122,15 @@ class CardReferenceProvider extends ADiscoverableReferenceProvider implements IS
$ids = $this->getBoardCardId($referenceText);
if ($ids !== null) {
[$boardId, $cardId] = $ids;
$card = $this->cardService->find((int) $cardId)->jsonSerialize();
$board = $this->boardService->find((int) $boardId)->jsonSerialize();
$stack = $this->stackService->find((int) $card['stackId'])->jsonSerialize();
try {
$card = $this->cardService->find((int) $cardId)->jsonSerialize();
$board = $this->boardService->find((int) $boardId)->jsonSerialize();
$stack = $this->stackService->find((int) $card['stackId'])->jsonSerialize();
} catch (NoPermissionException $e) {
// Skip throwing if user has no permissions
return null;
}
$card = $this->sanitizeSerializedCard($card);
$board = $this->sanitizeSerializedBoard($board);

View File

@@ -27,6 +27,7 @@ use OCA\Deck\Db\Assignment;
use OCA\Deck\Db\Attachment;
use OCA\Deck\Db\Label;
use OCA\Deck\Model\CardDetails;
use OCA\Deck\NoPermissionException;
use OCA\Deck\Service\BoardService;
use OCA\Deck\Service\CardService;
use OCA\Deck\Service\CommentService;
@@ -85,9 +86,14 @@ class CommentReferenceProvider implements IReferenceProvider {
if ($ids !== null) {
[$boardId, $cardId, $commentId] = $ids;
$card = $this->cardService->find($cardId)->jsonSerialize();
$board = $this->boardService->find($boardId)->jsonSerialize();
$stack = $this->stackService->find((int) $card['stackId'])->jsonSerialize();
try {
$card = $this->cardService->find($cardId)->jsonSerialize();
$board = $this->boardService->find($boardId)->jsonSerialize();
$stack = $this->stackService->find((int) $card['stackId'])->jsonSerialize();
} catch (NoPermissionException $e) {
// Skip throwing if user has no permissions
return null;
}
$card = $this->sanitizeSerializedCard($card);
$board = $this->sanitizeSerializedBoard($board);
$stack = $this->sanitizeSerializedStack($stack);

View File

@@ -56,6 +56,7 @@ use OCA\Deck\Db\BoardMapper;
use OCA\Deck\Db\LabelMapper;
use OCP\IUserManager;
use OCA\Deck\BadRequestException;
use OCA\Deck\Event\BoardUpdatedEvent;
use OCA\Deck\Validators\BoardServiceValidator;
use OCP\IURLGenerator;
use OCP\Server;
@@ -79,7 +80,8 @@ class BoardService {
private IEventDispatcher $eventDispatcher;
private ChangeHelper $changeHelper;
private CardMapper $cardMapper;
private ?array $boardsCache = null;
private ?array $boardsCacheFull = null;
private ?array $boardsCachePartial = null;
private IURLGenerator $urlGenerator;
private IDBConnection $connection;
private BoardServiceValidator $boardServiceValidator;
@@ -147,96 +149,45 @@ class BoardService {
}
/**
* @return array
* @return Board[]
*/
public function findAll($since = -1, $details = null, $includeArchived = true) {
if ($this->boardsCache) {
return $this->boardsCache;
public function findAll(int $since = -1, bool $fullDetails = false, bool $includeArchived = true): array {
if ($this->boardsCacheFull && $fullDetails) {
return $this->boardsCacheFull;
}
if ($this->boardsCachePartial && !$fullDetails) {
return $this->boardsCachePartial;
}
$complete = $this->getUserBoards($since, $includeArchived);
$result = [];
/** @var Board $item */
foreach ($complete as &$item) {
$this->boardMapper->mapOwner($item);
if ($item->getAcl() !== null) {
foreach ($item->getAcl() as &$acl) {
$this->boardMapper->mapAcl($acl);
}
}
if ($details !== null) {
$this->enrichWithStacks($item);
$this->enrichWithLabels($item);
$this->enrichWithUsers($item);
}
$permissions = $this->permissionService->matchPermissions($item);
$item->setPermissions([
'PERMISSION_READ' => $permissions[Acl::PERMISSION_READ] ?? false,
'PERMISSION_EDIT' => $permissions[Acl::PERMISSION_EDIT] ?? false,
'PERMISSION_MANAGE' => $permissions[Acl::PERMISSION_MANAGE] ?? false,
'PERMISSION_SHARE' => $permissions[Acl::PERMISSION_SHARE] ?? false
]);
$this->enrichWithBoardSettings($item);
$result[$item->getId()] = $item;
}
$this->boardsCache = $result;
return array_values($result);
return $this->enrichBoards($complete, $fullDetails);
}
/**
* @param $boardId
* @return Board
* @throws DoesNotExistException
* @throws \OCA\Deck\NoPermissionException
* @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException
* @throws BadRequestException
*/
public function find($boardId) {
public function find(int $boardId, bool $fullDetails = true): Board {
$this->boardServiceValidator->check(compact('boardId'));
if ($this->boardsCache && isset($this->boardsCache[$boardId])) {
return $this->boardsCache[$boardId];
if (isset($this->boardsCacheFull[$boardId]) && $fullDetails) {
return $this->boardsCacheFull[$boardId];
}
if (is_numeric($boardId) === false) {
throw new BadRequestException('board id must be a number');
if (isset($this->boardsCachePartial[$boardId]) && !$fullDetails) {
return $this->boardsCachePartial[$boardId];
}
$this->permissionService->checkPermission($this->boardMapper, $boardId, Acl::PERMISSION_READ);
/** @var Board $board */
$board = $this->boardMapper->find($boardId, true, true);
$this->boardMapper->mapOwner($board);
if ($board->getAcl() !== null) {
foreach ($board->getAcl() as $acl) {
if ($acl !== null) {
$this->boardMapper->mapAcl($acl);
}
}
}
$permissions = $this->permissionService->matchPermissions($board);
$board->setPermissions([
'PERMISSION_READ' => $permissions[Acl::PERMISSION_READ] ?? false,
'PERMISSION_EDIT' => $permissions[Acl::PERMISSION_EDIT] ?? false,
'PERMISSION_MANAGE' => $permissions[Acl::PERMISSION_MANAGE] ?? false,
'PERMISSION_SHARE' => $permissions[Acl::PERMISSION_SHARE] ?? false
]);
$this->enrichWithUsers($board);
$this->enrichWithBoardSettings($board);
$this->enrichWithActiveSessions($board);
$this->boardsCache[$board->getId()] = $board;
[$board] = $this->enrichBoards([$board], $fullDetails);
return $board;
}
/**
* @return array
*/
private function getBoardPrerequisites() {
$groups = $this->groupManager->getUserGroupIds(
$this->userManager->get($this->userId)
);
return [
'user' => $this->userId,
'groups' => $groups
];
}
/**
* @param $mapper
* @param $id
@@ -429,6 +380,7 @@ class BoardService {
$this->boardMapper->mapOwner($board);
$this->activityManager->triggerUpdateEvents(ActivityManager::DECK_OBJECT_BOARD, $changes, ActivityManager::SUBJECT_BOARD_UPDATE);
$this->changeHelper->boardChanged($board->getId());
$this->eventDispatcher->dispatchTyped(new BoardUpdatedEvent($board->getId()));
return $board;
}
@@ -456,7 +408,7 @@ class BoardService {
public function enrichWithActiveSessions(Board $board) {
$sessions = $this->sessionMapper->findAllActive($board->getId());
$board->setActiveSessions(array_values(
array_unique(
array_map(function (Session $session) {
@@ -691,6 +643,45 @@ class BoardService {
return $board;
}
/** @param Board[] $boards */
private function enrichBoards(array $boards, bool $fullDetails = true): array {
$result = [];
foreach ($boards as $board) {
// FIXME The enrichment in here could make use of combined queries
$this->boardMapper->mapOwner($board);
if ($board->getAcl() !== null) {
foreach ($board->getAcl() as &$acl) {
$this->boardMapper->mapAcl($acl);
}
}
$permissions = $this->permissionService->matchPermissions($board);
$board->setPermissions([
'PERMISSION_READ' => $permissions[Acl::PERMISSION_READ] ?? false,
'PERMISSION_EDIT' => $permissions[Acl::PERMISSION_EDIT] ?? false,
'PERMISSION_MANAGE' => $permissions[Acl::PERMISSION_MANAGE] ?? false,
'PERMISSION_SHARE' => $permissions[Acl::PERMISSION_SHARE] ?? false
]);
if ($fullDetails) {
$this->enrichWithStacks($board);
$this->enrichWithLabels($board);
$this->enrichWithUsers($board);
$this->enrichWithBoardSettings($board);
$this->enrichWithActiveSessions($board);
}
// Cache for further usage
if ($fullDetails) {
$this->boardsCacheFull[$board->getId()] = $board;
} else {
$this->boardsCachePartial[$board->getId()] = $board;
}
}
return $boards;
}
private function enrichWithStacks($board, $since = -1) {
$stacks = $this->stackMapper->findAll($board->getId(), null, null, $since);
@@ -713,7 +704,7 @@ class BoardService {
private function enrichWithUsers($board, $since = -1) {
$boardUsers = $this->permissionService->findUsers($board->getId());
if (\count($boardUsers) === 0) {
if ($boardUsers === null || \count($boardUsers) === 0) {
return;
}
$board->setUsers(array_values($boardUsers));
@@ -723,10 +714,6 @@ class BoardService {
return $this->urlGenerator->linkToRouteAbsolute('deck.page.index') . '#' . $endpoint;
}
private function clearBoardsCache() {
$this->boardsCache = null;
}
/**
* Clean a given board data from the Cache
*/
@@ -735,7 +722,8 @@ class BoardService {
$boardOwnerId = $board->getOwner();
$this->boardMapper->flushCache($boardId, $boardOwnerId);
unset($this->boardsCache[$boardId]);
unset($this->boardsCacheFull[$boardId]);
unset($this->boardsCachePartial[$boardId]);
}
private function enrichWithCards($board) {

View File

@@ -28,11 +28,13 @@ namespace OCA\Deck\Service;
use OCA\Deck\Activity\ActivityManager;
use OCA\Deck\Activity\ChangeSet;
use OCA\Deck\Db\Assignment;
use OCA\Deck\Db\AssignmentMapper;
use OCA\Deck\Db\Card;
use OCA\Deck\Db\CardMapper;
use OCA\Deck\Db\Acl;
use OCA\Deck\Db\ChangeHelper;
use OCA\Deck\Db\Label;
use OCA\Deck\Db\StackMapper;
use OCA\Deck\Event\CardCreatedEvent;
use OCA\Deck\Event\CardDeletedEvent;
@@ -114,32 +116,52 @@ class CardService {
$this->cardServiceValidator = $cardServiceValidator;
}
public function enrich($card) {
$cardId = $card->getId();
$this->cardMapper->mapOwner($card);
$card->setAssignedUsers($this->assignedUsersMapper->findAll($cardId));
$card->setLabels($this->labelMapper->findAssignedLabelsForCard($cardId));
$card->setAttachmentCount($this->attachmentService->count($cardId));
public function enrichCards($cards) {
$user = $this->userManager->get($this->currentUser);
$lastRead = $this->commentsManager->getReadMark('deckCard', (string)$card->getId(), $user);
$countUnreadComments = $this->commentsManager->getNumberOfCommentsForObject('deckCard', (string)$card->getId(), $lastRead);
$countComments = $this->commentsManager->getNumberOfCommentsForObject('deckCard', (string)$card->getId());
$card->setCommentsUnread($countUnreadComments);
$card->setCommentsCount($countComments);
$stack = $this->stackMapper->find($card->getStackId());
$board = $this->boardService->find($stack->getBoardId());
$card->setRelatedStack($stack);
$card->setRelatedBoard($board);
$cardIds = array_map(function (Card $card) use ($user) {
// Everything done in here might be heavy as it is executed for every card
$cardId = $card->getId();
$this->cardMapper->mapOwner($card);
$card->setAttachmentCount($this->attachmentService->count($cardId));
// TODO We should find a better way just to get the comment count so we can save 1-3 queries per card here
$countComments = $this->commentsManager->getNumberOfCommentsForObject('deckCard', (string)$card->getId());
$lastRead = $countComments > 0 ? $this->commentsManager->getReadMark('deckCard', (string)$card->getId(), $user) : null;
$countUnreadComments = $lastRead ? $this->commentsManager->getNumberOfCommentsForObject('deckCard', (string)$card->getId(), $lastRead) : 0;
$card->setCommentsUnread($countUnreadComments);
$card->setCommentsCount($countComments);
$stack = $this->stackMapper->find($card->getStackId());
$board = $this->boardService->find($stack->getBoardId(), false);
$card->setRelatedStack($stack);
$card->setRelatedBoard($board);
return $card->getId();
}, $cards);
$assignedLabels = $this->labelMapper->findAssignedLabelsForCards($cardIds);
$assignedUsers = $this->assignedUsersMapper->findIn($cardIds);
foreach ($cards as $card) {
$cardLabels = array_values(array_filter($assignedLabels, function (Label $label) use ($card) {
return $label->getCardId() === $card->getId();
}));
$cardAssignedUsers = array_values(array_filter($assignedUsers, function (Assignment $assignment) use ($card) {
return $assignment->getCardId() === $card->getId();
}));
$card->setLabels($cardLabels);
$card->setAssignedUsers($cardAssignedUsers);
}
return $cards;
}
public function fetchDeleted($boardId) {
$this->cardServiceValidator->check(compact('boardId'));
$this->permissionService->checkPermission($this->boardMapper, $boardId, Acl::PERMISSION_READ);
$cards = $this->cardMapper->findDeleted($boardId);
foreach ($cards as $card) {
$this->enrich($card);
}
$this->enrichCards($cards);
return $cards;
}
@@ -153,16 +175,17 @@ class CardService {
public function find(int $cardId) {
$this->permissionService->checkPermission($this->cardMapper, $cardId, Acl::PERMISSION_READ);
$card = $this->cardMapper->find($cardId);
$assignedUsers = $this->assignedUsersMapper->findAll($card->getId());
[$card] = $this->enrichCards([$card]);
// Attachments are only enriched on individual card fetching
$attachments = $this->attachmentService->findAll($cardId, true);
if ($this->request->getParam('apiVersion') === '1.0') {
$attachments = array_filter($attachments, function ($attachment) {
return $attachment->getType() === 'deck_file';
});
}
$card->setAssignedUsers($assignedUsers);
$card->setAttachments($attachments);
$this->enrich($card);
return $card;
}
@@ -174,9 +197,7 @@ class CardService {
return [];
}
$cards = $this->cardMapper->findCalendarEntries($boardId);
foreach ($cards as $card) {
$this->enrich($card);
}
$this->enrichCards($cards);
return $cards;
}
@@ -332,7 +353,7 @@ class CardService {
}
$this->changeHelper->cardChanged($card->getId(), true);
$this->eventDispatcher->dispatchTyped(new CardUpdatedEvent($card));
$this->eventDispatcher->dispatchTyped(new CardUpdatedEvent($card, $changes->getBefore()));
return $card;
}
@@ -422,6 +443,8 @@ class CardService {
$result[$card->getOrder()] = $card;
}
$this->changeHelper->cardChanged($id, false);
$this->eventDispatcher->dispatchTyped(new CardUpdatedEvent($card));
return array_values($result);
}

View File

@@ -224,7 +224,7 @@ class ConfigService {
}
public function getAttachmentFolder(string $userId = null): string {
if ($this->getUserId() === null) {
if ($userId === null && $this->getUserId() === null) {
throw new NoPermissionException('Must be logged in get the attachment folder');
}

View File

@@ -62,9 +62,8 @@ class DefaultBoardService {
*/
public function checkFirstRun($userId): bool {
$firstRun = $this->config->getUserValue($userId, Application::APP_ID, 'firstRun', 'yes');
$userBoards = $this->boardMapper->findAllByUser($userId);
if ($firstRun === 'yes' && count($userBoards) === 0) {
if ($firstRun === 'yes') {
try {
$this->config->setUserValue($userId, Application::APP_ID, 'firstRun', 'no');
} catch (PreConditionNotMetException $e) {

View File

@@ -28,7 +28,7 @@ declare(strict_types=1);
namespace OCA\Deck\Service;
use OCA\Deck\Db\AssignmentMapper;
use OCA\Deck\Db\Card;
use OCA\Deck\Db\Board;
use OCA\Deck\Db\CardMapper;
use OCA\Deck\Model\CardDetails;
use OCP\Comments\ICommentsManager;
@@ -37,6 +37,7 @@ use OCA\Deck\Db\LabelMapper;
use OCP\IUserManager;
class OverviewService {
private CardService $cardService;
private BoardMapper $boardMapper;
private LabelMapper $labelMapper;
private CardMapper $cardMapper;
@@ -46,6 +47,7 @@ class OverviewService {
private AttachmentService $attachmentService;
public function __construct(
CardService $cardService,
BoardMapper $boardMapper,
LabelMapper $labelMapper,
CardMapper $cardMapper,
@@ -54,6 +56,7 @@ class OverviewService {
ICommentsManager $commentsManager,
AttachmentService $attachmentService
) {
$this->cardService = $cardService;
$this->boardMapper = $boardMapper;
$this->labelMapper = $labelMapper;
$this->cardMapper = $cardMapper;
@@ -63,66 +66,43 @@ class OverviewService {
$this->attachmentService = $attachmentService;
}
public function enrich(Card $card, string $userId): void {
$cardId = $card->getId();
$this->cardMapper->mapOwner($card);
$card->setAssignedUsers($this->assignedUsersMapper->findAll($cardId));
$card->setLabels($this->labelMapper->findAssignedLabelsForCard($cardId));
$card->setAttachmentCount($this->attachmentService->count($cardId));
$user = $this->userManager->get($userId);
if ($user !== null) {
$lastRead = $this->commentsManager->getReadMark('deckCard', (string)$card->getId(), $user);
$count = $this->commentsManager->getNumberOfCommentsForObject('deckCard', (string)$card->getId(), $lastRead);
$card->setCommentsUnread($count);
}
}
public function findAllWithDue(string $userId): array {
$userBoards = $this->boardMapper->findAllForUser($userId);
$allDueCards = [];
foreach ($userBoards as $userBoard) {
$allDueCards[] = array_map(function ($card) use ($userBoard, $userId) {
$this->enrich($card, $userId);
return (new CardDetails($card, $userBoard))->jsonSerialize();
}, $this->cardMapper->findAllWithDue($userBoard->getId()));
}
return array_merge(...$allDueCards);
}
public function findUpcomingCards(string $userId): array {
$userBoards = $this->boardMapper->findAllForUser($userId);
$boardOwnerIds = array_filter(array_map(function (Board $board) {
return count($board->getAcl()) === 0 ? $board->getId() : null;
}, $userBoards));
$boardSharedIds = array_filter(array_map(function (Board $board) {
return count($board->getAcl()) > 0 ? $board->getId() : null;
}, $userBoards));
$foundCards = array_merge(
// private board: get cards with due date
$this->cardMapper->findAllWithDue($boardOwnerIds),
// shared board: get all my assigned or unassigned cards
$this->cardMapper->findToMeOrNotAssignedCards($boardSharedIds, $userId)
);
$this->cardService->enrichCards($foundCards);
$overview = [];
foreach ($userBoards as $userBoard) {
if (count($userBoard->getAcl()) === 0) {
// private board: get cards with due date
$cards = $this->cardMapper->findAllWithDue($userBoard->getId());
} else {
// shared board: get all my assigned or unassigned cards
$cards = $this->cardMapper->findToMeOrNotAssignedCards($userBoard->getId(), $userId);
foreach ($foundCards as $card) {
$diffDays = $card->getDaysUntilDue();
$key = 'later';
if ($diffDays === null) {
$key = 'nodue';
} elseif ($diffDays < 0) {
$key = 'overdue';
} elseif ($diffDays === 0) {
$key = 'today';
} elseif ($diffDays === 1) {
$key = 'tomorrow';
} elseif ($diffDays <= 7) {
$key = 'nextSevenDays';
}
foreach ($cards as $card) {
$this->enrich($card, $userId);
$diffDays = $card->getDaysUntilDue();
$key = 'later';
if ($diffDays === null) {
$key = 'nodue';
} elseif ($diffDays < 0) {
$key = 'overdue';
} elseif ($diffDays === 0) {
$key = 'today';
} elseif ($diffDays === 1) {
$key = 'tomorrow';
} elseif ($diffDays <= 7) {
$key = 'nextSevenDays';
}
$card = (new CardDetails($card, $userBoard));
$overview[$key][] = $card->jsonSerialize();
}
$card = (new CardDetails($card, $card->getRelatedBoard()));
$overview[$key][] = $card->jsonSerialize();
}
return $overview;
}

View File

@@ -97,21 +97,26 @@ class PermissionService {
* @param $boardId
* @return bool|array
*/
public function getPermissions($boardId) {
if ($cached = $this->permissionCache->get($boardId)) {
public function getPermissions($boardId, ?string $userId = null) {
if ($userId === null) {
$userId = $this->userId;
}
$cacheKey = $boardId . '-' . $userId;
if ($cached = $this->permissionCache->get($cacheKey)) {
return $cached;
}
$owner = $this->userIsBoardOwner($boardId);
$owner = $this->userIsBoardOwner($boardId, $userId);
$acls = $this->aclMapper->findAll($boardId);
$permissions = [
Acl::PERMISSION_READ => $owner || $this->userCan($acls, Acl::PERMISSION_READ),
Acl::PERMISSION_EDIT => $owner || $this->userCan($acls, Acl::PERMISSION_EDIT),
Acl::PERMISSION_MANAGE => $owner || $this->userCan($acls, Acl::PERMISSION_MANAGE),
Acl::PERMISSION_SHARE => ($owner || $this->userCan($acls, Acl::PERMISSION_SHARE))
&& (!$this->shareManager->sharingDisabledForUser($this->userId))
Acl::PERMISSION_READ => $owner || $this->userCan($acls, Acl::PERMISSION_READ, $userId),
Acl::PERMISSION_EDIT => $owner || $this->userCan($acls, Acl::PERMISSION_EDIT, $userId),
Acl::PERMISSION_MANAGE => $owner || $this->userCan($acls, Acl::PERMISSION_MANAGE, $userId),
Acl::PERMISSION_SHARE => ($owner || $this->userCan($acls, Acl::PERMISSION_SHARE, $userId))
&& (!$this->shareManager->sharingDisabledForUser($userId))
];
$this->permissionCache->set($boardId, $permissions);
$this->permissionCache->set($cacheKey, $permissions);
return $permissions;
}
@@ -143,7 +148,7 @@ class PermissionService {
* @return bool
* @throws NoPermissionException
*/
public function checkPermission($mapper, $id, $permission, $userId = null) {
public function checkPermission($mapper, $id, $permission, $userId = null): bool {
$boardId = $id;
if ($mapper instanceof IPermissionMapper && !($mapper instanceof BoardMapper)) {
$boardId = $mapper->findBoardId($id);
@@ -153,23 +158,11 @@ class PermissionService {
throw new NoPermissionException('Permission denied');
}
if ($permission === Acl::PERMISSION_SHARE && $this->shareManager->sharingDisabledForUser($this->userId)) {
throw new NoPermissionException('Permission denied');
}
if ($this->userIsBoardOwner($boardId, $userId)) {
$permissions = $this->getPermissions($boardId, $userId);
if ($permissions[$permission] === true) {
return true;
}
try {
$acls = $this->getBoard($boardId)->getAcl() ?? [];
$result = $this->userCan($acls, $permission, $userId);
if ($result) {
return true;
}
} catch (DoesNotExistException | MultipleObjectsReturnedException $e) {
}
// Throw NoPermission to not leak information about existing entries
throw new NoPermissionException('Permission denied');
}
@@ -260,22 +253,20 @@ class PermissionService {
}
$users = [];
$owner = $this->userManager->get($board->getOwner());
if ($owner === null) {
if (!$this->userManager->userExists($board->getOwner())) {
$this->logger->info('No owner found for board ' . $board->getId());
} else {
$users[$owner->getUID()] = new User($owner);
$users[$board->getOwner()] = new User($board->getOwner(), $this->userManager);
}
$acls = $this->aclMapper->findAll($boardId);
/** @var Acl $acl */
foreach ($acls as $acl) {
if ($acl->getType() === Acl::PERMISSION_TYPE_USER) {
$user = $this->userManager->get($acl->getParticipant());
if ($user === null) {
if (!$this->userManager->userExists($acl->getParticipant())) {
$this->logger->info('No user found for acl rule ' . $acl->getId());
continue;
}
$users[$user->getUID()] = new User($user);
$users[$acl->getParticipant()] = new User($acl->getParticipant(), $this->userManager);
}
if ($acl->getType() === Acl::PERMISSION_TYPE_GROUP) {
$group = $this->groupManager->get($acl->getParticipant());
@@ -284,7 +275,7 @@ class PermissionService {
continue;
}
foreach ($group->getUsers() as $user) {
$users[$user->getUID()] = new User($user);
$users[$user->getUID()] = new User($user->getUID(), $this->userManager);
}
}
@@ -305,7 +296,7 @@ class PermissionService {
if ($user === null) {
$this->logger->info('No user found for circle member ' . $member->getUserId());
} else {
$users[$member->getUserId()] = new User($user);
$users[$member->getUserId()] = new User($member->getUserId(), $this->userManager);
}
}
} catch (\Exception $e) {

View File

@@ -82,11 +82,7 @@ class SearchService {
}, $boards);
$matchedCards = $this->cardMapper->search($boardIds, $this->filterStringParser->parse($term), $limit, $cursor);
$self = $this;
return array_map(function (Card $card) use ($self) {
$self->cardService->enrich($card);
return $card;
}, $matchedCards);
return $this->cardService->enrichCards($matchedCards);
}
public function searchBoards(string $term, ?int $limit, ?int $cursor): array {
@@ -117,7 +113,8 @@ class SearchService {
$comment = $this->commentsManager->get($cardRow['comment_id']);
unset($cardRow['comment_id']);
$card = Card::fromRow($cardRow);
$self->cardService->enrich($card);
// TODO: Only perform one enrich call here
$self->cardService->enrichCards([$card]);
$user = $this->userManager->get($comment->getActorId());
$displayName = $user ? $user->getDisplayName() : '';
return new CommentSearchResultEntry($comment->getId(), $comment->getMessage(), $displayName, $card, $this->urlGenerator, $this->l10n);

View File

@@ -36,10 +36,12 @@ use OCA\Deck\Db\ChangeHelper;
use OCA\Deck\Db\LabelMapper;
use OCA\Deck\Db\Stack;
use OCA\Deck\Db\StackMapper;
use OCA\Deck\Event\BoardUpdatedEvent;
use OCA\Deck\Model\CardDetails;
use OCA\Deck\NoPermissionException;
use OCA\Deck\StatusException;
use OCA\Deck\Validators\StackServiceValidator;
use OCP\EventDispatcher\IEventDispatcher;
use Psr\Log\LoggerInterface;
class StackService {
@@ -55,6 +57,7 @@ class StackService {
private ActivityManager $activityManager;
private ChangeHelper $changeHelper;
private LoggerInterface $logger;
private IEventDispatcher $eventDispatcher;
private StackServiceValidator $stackServiceValidator;
public function __construct(
@@ -70,6 +73,7 @@ class StackService {
ActivityManager $activityManager,
ChangeHelper $changeHelper,
LoggerInterface $logger,
IEventDispatcher $eventDispatcher,
StackServiceValidator $stackServiceValidator
) {
$this->stackMapper = $stackMapper;
@@ -84,6 +88,7 @@ class StackService {
$this->activityManager = $activityManager;
$this->changeHelper = $changeHelper;
$this->logger = $logger;
$this->eventDispatcher = $eventDispatcher;
$this->stackServiceValidator = $stackServiceValidator;
}
@@ -94,9 +99,9 @@ class StackService {
return;
}
$this->cardService->enrichCards($cards);
$cards = array_map(
function (Card $card): CardDetails {
$this->cardService->enrich($card);
return new CardDetails($card);
},
$cards
@@ -237,6 +242,7 @@ class StackService {
ActivityManager::DECK_OBJECT_BOARD, $stack, ActivityManager::SUBJECT_STACK_CREATE
);
$this->changeHelper->boardChanged($boardId);
$this->eventDispatcher->dispatchTyped(new BoardUpdatedEvent($boardId));
return $stack;
}
@@ -265,6 +271,7 @@ class StackService {
ActivityManager::DECK_OBJECT_BOARD, $stack, ActivityManager::SUBJECT_STACK_DELETE
);
$this->changeHelper->boardChanged($stack->getBoardId());
$this->eventDispatcher->dispatchTyped(new BoardUpdatedEvent($stack->getBoardId()));
$this->enrichStackWithCards($stack);
return $stack;
@@ -306,6 +313,7 @@ class StackService {
ActivityManager::DECK_OBJECT_BOARD, $changes, ActivityManager::SUBJECT_STACK_UPDATE
);
$this->changeHelper->boardChanged($stack->getBoardId());
$this->eventDispatcher->dispatchTyped(new BoardUpdatedEvent($stack->getBoardId()));
return $stack;
}
@@ -345,6 +353,7 @@ class StackService {
$result[$stack->getOrder()] = $stack;
}
$this->changeHelper->boardChanged($stackToSort->getBoardId());
$this->eventDispatcher->dispatchTyped(new BoardUpdatedEvent($stackToSort->getBoardId()));
return $result;
}

View File

@@ -30,8 +30,10 @@ use OCA\Deck\Db\Acl;
use OCA\Deck\Db\CardMapper;
use OCA\Deck\NoPermissionException;
use OCA\Deck\Service\PermissionService;
use OCP\AppFramework\Db\DoesNotExistException;
use OCP\AppFramework\OCS\OCSNotFoundException;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\Files\NotFoundException;
use OCP\IL10N;
use OCP\IURLGenerator;
use OCP\Share\IShare;
@@ -53,7 +55,11 @@ class ShareAPIHelper {
public function formatShare(IShare $share): array {
$result = [];
$card = $this->cardMapper->find($share->getSharedWith());
try {
$card = $this->cardMapper->find($share->getSharedWith());
} catch (DoesNotExistException $e) {
throw new NotFoundException($e->getMessage());
}
$boardId = $this->cardMapper->findBoardId($card->getId());
$result['share_with'] = $share->getSharedWith();
$result['share_with_displayname'] = $card->getTitle();

65006
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,109 +1,109 @@
{
"name": "deck",
"description": "",
"version": "1.9.0-beta.1",
"authors": [
{
"name": "Julius Härtl",
"email": "jus@bitgrid.net",
"role": "Developer"
},
{
"name": "Michael Weimann",
"email": "mail@michael-weimann.eu",
"role": "Developer"
}
],
"license": "agpl",
"private": true,
"scripts": {
"build": "NODE_ENV=production webpack --progress --config webpack.js",
"dev": "NODE_ENV=development webpack --progress --config webpack.js",
"watch": "NODE_ENV=development webpack --progress --watch --config webpack.js",
"lint": "eslint --ext .js,.vue src",
"lint:fix": "eslint --ext .js,.vue src --fix",
"lint:cypress": "eslint --ext .js cypress",
"stylelint": "stylelint src",
"stylelint:fix": "stylelint src --fix",
"test": "jest",
"test:coverage": "jest --coverage"
},
"dependencies": {
"@babel/polyfill": "^7.12.1",
"@babel/runtime": "^7.20.13",
"@nextcloud/auth": "^2.0.0",
"@nextcloud/axios": "^2.3.0",
"@nextcloud/dialogs": "^3.2.0",
"@nextcloud/event-bus": "^3.0.2",
"@nextcloud/files": "^2.1.0",
"@nextcloud/initial-state": "^2.0.0",
"@nextcloud/l10n": "^2.0.1",
"@nextcloud/moment": "^1.2.1",
"@nextcloud/notify_push": "^1.1.3",
"@nextcloud/router": "^2.0.1",
"@nextcloud/vue": "^7.5.0",
"@nextcloud/vue-dashboard": "^2.0.1",
"@nextcloud/vue-richtext": "^2.0.4",
"blueimp-md5": "^2.19.0",
"dompurify": "^2.4.3",
"lodash": "^4.17.21",
"markdown-it": "^13.0.1",
"markdown-it-link-attributes": "^4.0.1",
"markdown-it-task-checkbox": "^1.0.6",
"moment": "^2.29.4",
"nextcloud-vue-collections": "^0.10.0",
"p-queue": "^7.3.4",
"url-search-params-polyfill": "^8.1.1",
"vue": "^2.7.14",
"vue-at": "^2.5.1",
"vue-click-outside": "^1.1.0",
"vue-easymde": "^2.0.0",
"vue-infinite-loading": "^2.4.5",
"vue-material-design-icons": "^5.2.0",
"vue-router": "^3.6.5",
"vue-smooth-dnd": "^0.8.1",
"vuex": "^3.6.2",
"vuex-router-sync": "^5.0.0"
},
"browserslist": [
"extends @nextcloud/browserslist-config"
],
"engines": {
"node": "^16.0.0",
"npm": "^7.0.0 || ^8.0.0"
},
"devDependencies": {
"@nextcloud/babel-config": "^1.0.0",
"@nextcloud/browserslist-config": "^2.3.0",
"@nextcloud/cypress": "^1.0.0-beta.2",
"@nextcloud/eslint-config": "^8.2.1",
"@nextcloud/stylelint-config": "^2.3.0",
"@nextcloud/webpack-vue-config": "^5.4.0",
"@relative-ci/agent": "^4.1.3",
"@vue/test-utils": "^1.3.4",
"@vue/vue2-jest": "^29.2.2",
"cypress": "^12.5.1",
"eslint-plugin-cypress": "^2.12.1",
"eslint-webpack-plugin": "^4.0.0",
"jest": "^29.4.3",
"jest-serializer-vue": "^3.1.0",
"stylelint-webpack-plugin": "^4.0.0",
"vue-template-compiler": "^2.7.14"
},
"jest": {
"moduleFileExtensions": [
"js",
"vue"
],
"moduleNameMapper": {
"^@/(.*)$": "<rootDir>/src/$1"
},
"transform": {
"^.+\\.js$": "<rootDir>/node_modules/babel-jest",
".*\\.(vue)$": "<rootDir>/node_modules/vue-jest"
},
"snapshotSerializers": [
"<rootDir>/node_modules/jest-serializer-vue"
]
}
}
"name": "deck",
"description": "",
"version": "1.9.2",
"authors": [
{
"name": "Julius Härtl",
"email": "jus@bitgrid.net",
"role": "Developer"
},
{
"name": "Michael Weimann",
"email": "mail@michael-weimann.eu",
"role": "Developer"
}
],
"license": "agpl",
"private": true,
"scripts": {
"build": "NODE_ENV=production webpack --progress --config webpack.js",
"dev": "NODE_ENV=development webpack --progress --config webpack.js",
"watch": "NODE_ENV=development webpack --progress --watch --config webpack.js",
"serve": "webpack serve --node-env development --allowed-hosts all --config webpack.js",
"lint": "eslint --ext .js,.vue src",
"lint:fix": "eslint --ext .js,.vue src --fix",
"lint:cypress": "eslint --ext .js cypress",
"stylelint": "stylelint src",
"stylelint:fix": "stylelint src --fix",
"test": "jest",
"test:coverage": "jest --coverage"
},
"dependencies": {
"@babel/polyfill": "^7.12.1",
"@babel/runtime": "^7.21.0",
"@nextcloud/auth": "^2.0.0",
"@nextcloud/axios": "^2.3.0",
"@nextcloud/dialogs": "^4.0.1",
"@nextcloud/event-bus": "^3.0.2",
"@nextcloud/files": "^2.1.0",
"@nextcloud/initial-state": "^2.0.0",
"@nextcloud/l10n": "^2.1.0",
"@nextcloud/moment": "^1.2.1",
"@nextcloud/notify_push": "^1.1.3",
"@nextcloud/router": "^2.0.1",
"@nextcloud/vue": "^7.8.4",
"@nextcloud/vue-richtext": "^2.0.4",
"blueimp-md5": "^2.19.0",
"dompurify": "^3.0.0",
"lodash": "^4.17.21",
"markdown-it": "^13.0.1",
"markdown-it-link-attributes": "^4.0.1",
"markdown-it-task-checkbox": "^1.0.6",
"moment": "^2.29.4",
"nextcloud-vue-collections": "^0.11.0",
"p-queue": "^7.3.4",
"url-search-params-polyfill": "^8.1.1",
"vue": "^2.7.14",
"vue-at": "^2.5.1",
"vue-click-outside": "^1.1.0",
"vue-easymde": "^2.0.0",
"vue-infinite-loading": "^2.4.5",
"vue-material-design-icons": "^5.2.0",
"vue-router": "^3.6.5",
"vue-smooth-dnd": "^0.8.1",
"vuex": "^3.6.2",
"vuex-router-sync": "^5.0.0"
},
"browserslist": [
"extends @nextcloud/browserslist-config"
],
"engines": {
"node": "^16.0.0",
"npm": "^7.0.0 || ^8.0.0"
},
"devDependencies": {
"@nextcloud/babel-config": "^1.0.0",
"@nextcloud/browserslist-config": "^2.3.0",
"@nextcloud/cypress": "^1.0.0-beta.2",
"@nextcloud/eslint-config": "^8.2.1",
"@nextcloud/stylelint-config": "^2.3.0",
"@nextcloud/webpack-vue-config": "^5.4.0",
"@relative-ci/agent": "^4.1.3",
"@vue/test-utils": "^1.3.4",
"@vue/vue2-jest": "^29.2.2",
"cypress": "^12.7.0",
"eslint-plugin-cypress": "^2.12.1",
"eslint-webpack-plugin": "^4.0.0",
"jest": "^29.4.3",
"jest-serializer-vue": "^3.1.0",
"stylelint-webpack-plugin": "^4.1.0",
"vue-template-compiler": "^2.7.14"
},
"jest": {
"moduleFileExtensions": [
"js",
"vue"
],
"moduleNameMapper": {
"^@/(.*)$": "<rootDir>/src/$1"
},
"transform": {
"^.+\\.js$": "<rootDir>/node_modules/babel-jest",
".*\\.(vue)$": "<rootDir>/node_modules/vue-jest"
},
"snapshotSerializers": [
"<rootDir>/node_modules/jest-serializer-vue"
]
}
}

View File

@@ -71,12 +71,22 @@
</div>
</div>
<div v-else id="modal-inner">
<NcEmptyContent v-if="creating" icon="icon-loading">
{{ t('deck', 'Creating the new card ') }}
<NcEmptyContent v-if="creating">
<template #icon>
<NcLoadingIcon />
</template>
<template #title>
{{ t('deck', 'Creating the new card …') }}
</template>
</NcEmptyContent>
<NcEmptyContent v-else-if="created" icon="icon-checkmark">
{{ t('deck', 'Card "{card}" was added to "{board}"', { card: pendingTitle, board: selectedBoard.title }) }}
<template #desc>
<NcEmptyContent v-else-if="created">
<template #icon>
<CardPlusOutline />
</template>
<template #title>
{{ t('deck', 'Card "{card}" was added to "{board}"', { card: pendingTitle, board: selectedBoard.title }) }}
</template>
<template #action>
<button class="primary" @click="openNewCard">
{{ t('deck', 'Open card') }}
</button>
@@ -92,7 +102,8 @@
<script>
import { generateUrl } from '@nextcloud/router'
import { NcModal, NcMultiselect, NcEmptyContent } from '@nextcloud/vue'
import { NcModal, NcMultiselect, NcEmptyContent, NcLoadingIcon } from '@nextcloud/vue'
import CardPlusOutline from 'vue-material-design-icons/CardPlusOutline.vue'
import axios from '@nextcloud/axios'
import { CardApi } from './services/CardApi.js'
@@ -104,6 +115,8 @@ export default {
NcEmptyContent,
NcModal,
NcMultiselect,
NcLoadingIcon,
CardPlusOutline,
},
props: {
title: {
@@ -203,6 +216,7 @@ export default {
max-width: 400px;
padding: 10px;
min-height: 200px;
margin: auto;
}
.multiselect-board, .multiselect-list, input, textarea {

View File

@@ -95,8 +95,7 @@ export default {
.avatar-wrapper {
background-color: #b9b9b9;
border-radius: 50%;
border-width: 2px;
border-style: solid;
border: 1px solid var(--color-border-dark);
width: var(--size);
height: var(--size);
text-align: center;

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