Compare commits

..

533 Commits

Author SHA1 Message Date
Marcel Klehr
e5959fa8da Update Stack.vue
Signed-off-by: Marcel Klehr <mklehr@gmx.net>
2022-10-27 12:30:49 +02:00
Marcel Klehr
b47c7aca34 Merge branch 'master' into fix-archived-stack-button
Signed-off-by: Marcel Klehr <mklehr@gmx.net>
2022-10-27 12:19:53 +02:00
Nextcloud bot
ca91e7a2ed [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-10-27 02:21:14 +00:00
Julius Härtl
b92fddaf65 Merge pull request #4150 from nextcloud/automated/noid/master-update-nextcloud-ocp
[master] Update nextcloud/ocp dependency
2022-10-26 21:13:27 +02:00
dependabot[bot]
b7de565bac Merge pull request #4147 from nextcloud/dependabot/npm_and_yarn/master/jest-29.2.1 2022-10-26 11:50:52 +00:00
dependabot[bot]
9c8e1a9f6e Bump jest from 29.2.0 to 29.2.1
Bumps [jest](https://github.com/facebook/jest/tree/HEAD/packages/jest) from 29.2.0 to 29.2.1.
- [Release notes](https://github.com/facebook/jest/releases)
- [Changelog](https://github.com/facebook/jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/jest/commits/v29.2.1/packages/jest)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-26 13:45:00 +02:00
nextcloud-command
7e479b0505 Update psalm baseline
Signed-off-by: GitHub <noreply@github.com>
2022-10-25 21:21:52 +02:00
Julius Härtl
8f65ec2ede Merge pull request #4153 from nextcloud/bugfix/4152/fix-duedate-activity 2022-10-25 21:16:08 +02:00
Julius Härtl
6912ae09cf Fix integration test run script
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-10-25 21:07:21 +02:00
Nextcloud bot
eaa3315348 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-10-25 02:26:16 +00:00
Joas Schilling
5669bd73cc Fix Duedate activity
Signed-off-by: Joas Schilling <coding@schilljs.com>
2022-10-24 12:32:56 +02:00
Nextcloud bot
57989384fa [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-10-24 02:21:54 +00:00
Julius Härtl
74c04b2d71 Merge pull request #4148 from nextcloud/dependabot/github_actions/peter-evans/create-pull-request-4
Bump peter-evans/create-pull-request from 3 to 4
2022-10-22 11:03:42 +02:00
dependabot[bot]
74565debbb Merge pull request #4149 from nextcloud/dependabot/npm_and_yarn/master/nextcloud/vue-7.0.1 2022-10-22 02:49:33 +00:00
dependabot[bot]
a2744823c1 Bump @nextcloud/vue from 7.0.0 to 7.0.1
Bumps [@nextcloud/vue](https://github.com/nextcloud/nextcloud-vue) from 7.0.0 to 7.0.1.
- [Release notes](https://github.com/nextcloud/nextcloud-vue/releases)
- [Changelog](https://github.com/nextcloud/nextcloud-vue/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nextcloud/nextcloud-vue/compare/v7.0.0...v7.0.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-22 02:23:09 +00:00
dependabot[bot]
a918459105 Bump peter-evans/create-pull-request from 3 to 4
Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 3 to 4.
- [Release notes](https://github.com/peter-evans/create-pull-request/releases)
- [Commits](https://github.com/peter-evans/create-pull-request/compare/v3...v4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-22 01:06:06 +00:00
Julius Härtl
f9acf7778f Merge pull request #4091 from nextcloud/migrate-master-christophwurst-package 2022-10-21 18:00:04 +02:00
Joas Schilling
8537bd00c7 Migrate to nextcloud/OCP package in master
Signed-off-by: Joas Schilling <coding@schilljs.com>
2022-10-20 09:42:13 +02:00
Julius Härtl
4b62c34cc3 Merge pull request #4143 from TehThanos/lintMakeTarget
Added lint rule to Makefile
2022-10-20 08:29:15 +02:00
Thanos Kamber
94d84f2b16 Added lint rule to Makefile
Signed-off-by: Thanos Kamber <thanos.kamber@gmail.com>
2022-10-20 07:41:49 +03:00
Julius Härtl
14e7c33886 Merge pull request #4053 from nextcloud/dependabot/github_actions/actions/upload-artifact-3 2022-10-19 21:50:40 +02:00
Julius Härtl
60ee9f77ca Merge pull request #3774 from Ben-Ro/CTRL/CMD_+_ENTER_to_Save_Changes_on_Card_Description
feat: #3268 CTRL/CMD + ENTER to Save Changes on Card Description
2022-10-19 21:49:40 +02:00
Julius Härtl
3eaba6fe1a Merge pull request #4101 from mokkin/patch-1
disables autocomplete on card creation
2022-10-19 21:10:45 +02:00
Julius Härtl
cef14ed254 Merge pull request #4026 from nextcloud/dependabot/composer/tests/integration/guzzlehttp/guzzle-7.5.0 2022-10-19 21:10:25 +02:00
dependabot[bot]
0828ae6017 Update guzzlehttp/guzzle requirement in /tests/integration
Updates the requirements on [guzzlehttp/guzzle](https://github.com/guzzle/guzzle) to permit the latest version.
- [Release notes](https://github.com/guzzle/guzzle/releases)
- [Changelog](https://github.com/guzzle/guzzle/blob/master/CHANGELOG.md)
- [Commits](https://github.com/guzzle/guzzle/compare/7.4.5...7.5.0)

---
updated-dependencies:
- dependency-name: guzzlehttp/guzzle
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-19 21:04:09 +02:00
ben
3af54d7186 Use VueEasyMDE initialized event instead of setTimeout as proposed by @juliushaertl
Signed-off-by: ben <ben@ro.tt>
2022-10-19 21:02:35 +02:00
ben
f01a4433ed CTRL/CMD + ENTER to Save Changes on Card Description - fixes nextcloud/deck#3268
Signed-off-by: ben <ben@ro.tt>
2022-10-19 21:02:35 +02:00
mokkin
b64b29cf6e disables autocomplete on card creation
solves https://github.com/nextcloud/deck/issues/4083

Signed-off-by: mokkin <markus@haybach.com>
2022-10-19 20:57:49 +02:00
Julius Härtl
d93b431554 Merge pull request #4115 from nextcloud/bugfix/4112/fix-duedate-format 2022-10-19 20:56:27 +02:00
Julius Härtl
d00bd159d2 Avoid always setting the current time on card updates
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-10-19 20:03:22 +02:00
Marcel Klehr
816a8c08f0 Fix duedate tests
Signed-off-by: Marcel Klehr <mklehr@gmx.net>
2022-10-19 19:46:10 +02:00
Joas Schilling
2c3113334a Fix issue with duedate format
Signed-off-by: Joas Schilling <coding@schilljs.com>
2022-10-19 19:46:09 +02:00
Julius Härtl
857a0797b4 Pin postgres to 14
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-10-18 11:25:22 +02:00
Nextcloud bot
efc3511e15 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-10-18 02:21:38 +00:00
dependabot[bot]
aaccd2e7d2 Merge pull request #4025 from nextcloud/dependabot/npm_and_yarn/master/vue-at-2.5.1 2022-10-17 15:57:09 +00:00
dependabot[bot]
1921143bfd Bump vue-at from 2.5.0 to 2.5.1
Bumps [vue-at](https://github.com/fritx/vue-at) from 2.5.0 to 2.5.1.
- [Release notes](https://github.com/fritx/vue-at/releases)
- [Commits](https://github.com/fritx/vue-at/commits)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-17 14:38:58 +00:00
Julius Härtl
07b7df8e68 Merge pull request #4126 from nextcloud/dependabot/npm_and_yarn/master/vue-and-vue-template-compiler-2.7.13 2022-10-17 16:37:44 +02:00
Julius Härtl
c4804cfcb7 Merge pull request #4134 from DJE98/patch-2
Added nextcloud information in the  development description
2022-10-17 14:56:05 +02:00
Dennis Eisermann
6bc5f1df47 Added nextcloud information in the development description
Added more information about the nextcloud environment manually and with docker in the development description.

Signed-off-by: Dennis Eisermann <73851419+DJE98@users.noreply.github.com>
2022-10-17 14:46:45 +02:00
Julius Härtl
f8a8cc691c Merge pull request #4130 from DJE98/patch-1
Updated nodejs version requirement
2022-10-17 13:46:58 +02:00
Julius Härtl
a4b2a137e5 Merge pull request #4065 from nextcloud/perf/noid/circles-files 2022-10-17 11:39:21 +02:00
Dennis Eisermann
96b5c3da1d Updated nodejs version requirement
Updated nodejs version requirement from 14 to 16

Signed-off-by: Dennis Eisermann <73851419+DJE98@users.noreply.github.com>
2022-10-17 11:24:59 +02:00
Julius Härtl
a716c0968a Merge pull request #4127 from nextcloud/dependabot/composer/vimeo/psalm-4.29.0
Bump vimeo/psalm from 4.28.0 to 4.29.0
2022-10-15 10:38:19 +02:00
dependabot[bot]
48c8333ed1 Bump vue and vue-template-compiler
Bumps [vue](https://github.com/vuejs/core) and [vue-template-compiler](https://github.com/vuejs/vue). These dependencies needed to be updated together.

Updates `vue` from 2.7.9 to 2.7.13
- [Release notes](https://github.com/vuejs/core/releases)
- [Changelog](https://github.com/vuejs/core/blob/main/CHANGELOG.md)
- [Commits](https://github.com/vuejs/core/commits)

Updates `vue-template-compiler` from 2.7.9 to 2.7.13
- [Release notes](https://github.com/vuejs/vue/releases)
- [Changelog](https://github.com/vuejs/vue/blob/main/CHANGELOG.md)
- [Commits](https://github.com/vuejs/vue/compare/v2.7.9...v2.7.13)

---
updated-dependencies:
- dependency-name: vue
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: vue-template-compiler
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-15 08:13:16 +00:00
dependabot[bot]
8224ff13c3 Merge pull request #4124 from nextcloud/dependabot/npm_and_yarn/master/jest-29.2.0 2022-10-15 08:12:18 +00:00
dependabot[bot]
e150cd25e8 Merge pull request #4125 from nextcloud/dependabot/npm_and_yarn/master/babel/runtime-7.19.4 2022-10-15 04:49:59 +00:00
dependabot[bot]
6206a0cdd1 Bump jest from 29.1.2 to 29.2.0
Bumps [jest](https://github.com/facebook/jest/tree/HEAD/packages/jest) from 29.1.2 to 29.2.0.
- [Release notes](https://github.com/facebook/jest/releases)
- [Changelog](https://github.com/facebook/jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/jest/commits/v29.2.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>
2022-10-15 03:09:51 +00:00
dependabot[bot]
d66b54dd13 Merge pull request #4123 from nextcloud/dependabot/npm_and_yarn/master/cypress-10.10.0 2022-10-15 03:08:42 +00:00
dependabot[bot]
5491c9444e Merge pull request #4121 from nextcloud/dependabot/npm_and_yarn/master/nextcloud/vue-7.0.0 2022-10-15 02:29:16 +00:00
dependabot[bot]
0fc5708253 Bump vimeo/psalm from 4.28.0 to 4.29.0
Bumps [vimeo/psalm](https://github.com/vimeo/psalm) from 4.28.0 to 4.29.0.
- [Release notes](https://github.com/vimeo/psalm/releases)
- [Commits](https://github.com/vimeo/psalm/compare/4.28.0...4.29.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-15 02:09:47 +00:00
dependabot[bot]
918342eeb7 Bump @babel/runtime from 7.19.0 to 7.19.4
Bumps [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.19.0 to 7.19.4.
- [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.19.4/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>
2022-10-15 01:03:24 +00:00
dependabot[bot]
ec66e0f291 Bump cypress from 10.9.0 to 10.10.0
Bumps [cypress](https://github.com/cypress-io/cypress) from 10.9.0 to 10.10.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/v10.9.0...v10.10.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-15 01:02:49 +00:00
dependabot[bot]
d76a1f539b Bump @nextcloud/vue from 7.0.0-beta.7 to 7.0.0
Bumps [@nextcloud/vue](https://github.com/nextcloud/nextcloud-vue) from 7.0.0-beta.7 to 7.0.0.
- [Release notes](https://github.com/nextcloud/nextcloud-vue/releases)
- [Changelog](https://github.com/nextcloud/nextcloud-vue/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nextcloud/nextcloud-vue/compare/v7.0.0-beta.7...v7.0.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-15 01:02:19 +00:00
Julius Härtl
c81501c2ea Cache user membership for circles
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-10-14 23:11:19 +02:00
Julius Härtl
d62bd4e99a Merge pull request #3439 from nextcloud/bugfix/3431 2022-10-14 12:46:11 +02:00
Julius Härtl
863ce50a27 Activity: Set event link also for notifications that get emitted from activity
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-10-14 10:52:25 +02:00
Julius Härtl
a9c4e626ac Merge pull request #4113 from nextcloud/bugfix/noid/fix-sorting-stacks 2022-10-13 15:27:32 +02:00
Joas Schilling
982df96c3c Fix sorting stacks
Signed-off-by: Joas Schilling <coding@schilljs.com>
2022-10-13 14:07:59 +02:00
Julius Härtl
bc070cbeb9 Merge pull request #4114 from nextcloud/tests/drop-mapper-test-util 2022-10-13 14:07:45 +02:00
Julius Härtl
dbac5f82d3 Avoid using dropped Test\AppFramework\Db\MapperTestUtility
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-10-13 13:01:15 +02:00
Nextcloud bot
58c7786cf7 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-10-13 02:22:21 +00:00
Julius Härtl
14db941950 Merge pull request #4102 from nextcloud/fix/no-card-menu-without-description 2022-10-11 14:53:15 +02:00
dependabot[bot]
36a531c204 Merge pull request #4111 from nextcloud/dependabot/npm_and_yarn/master/nextcloud/axios-2.1.0 2022-10-08 08:13:54 +00:00
dependabot[bot]
0fa1f74699 Merge pull request #4110 from nextcloud/dependabot/npm_and_yarn/master/relative-ci/agent-4.1.1 2022-10-08 07:19:53 +00:00
dependabot[bot]
9189723970 Bump @nextcloud/axios from 2.0.0 to 2.1.0
Bumps [@nextcloud/axios](https://github.com/nextcloud/nextcloud-axios) from 2.0.0 to 2.1.0.
- [Release notes](https://github.com/nextcloud/nextcloud-axios/releases)
- [Changelog](https://github.com/nextcloud/nextcloud-axios/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nextcloud/nextcloud-axios/compare/v2.0.0...v2.1.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-08 04:12:54 +00:00
dependabot[bot]
d7bcdeb5a7 Merge pull request #4109 from nextcloud/dependabot/npm_and_yarn/master/nextcloud/vue-richtext-2.0.4 2022-10-08 04:11:54 +00:00
dependabot[bot]
4d9e81e22f Merge pull request #4108 from nextcloud/dependabot/composer/vimeo/psalm-4.28.0 2022-10-08 02:31:48 +00:00
dependabot[bot]
466c39d12a Bump @relative-ci/agent from 4.1.0 to 4.1.1
Bumps [@relative-ci/agent](https://github.com/relative-ci/agent) from 4.1.0 to 4.1.1.
- [Release notes](https://github.com/relative-ci/agent/releases)
- [Commits](https://github.com/relative-ci/agent/compare/v4.1.0...v4.1.1)

---
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>
2022-10-08 02:26:40 +00:00
Nextcloud bot
86e7d04c80 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-10-08 02:21:49 +00:00
dependabot[bot]
a6b5ae3fde Bump @nextcloud/vue-richtext from 2.0.3 to 2.0.4
Bumps [@nextcloud/vue-richtext](https://github.com/nextcloud/vue-richtext) from 2.0.3 to 2.0.4.
- [Release notes](https://github.com/nextcloud/vue-richtext/releases)
- [Changelog](https://github.com/nextcloud/vue-richtext/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nextcloud/vue-richtext/compare/v2.0.3...v2.0.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-08 02:12:43 +00:00
dependabot[bot]
bb3f41dd69 Bump vimeo/psalm from 4.27.0 to 4.28.0
Bumps [vimeo/psalm](https://github.com/vimeo/psalm) from 4.27.0 to 4.28.0.
- [Release notes](https://github.com/vimeo/psalm/releases)
- [Commits](https://github.com/vimeo/psalm/compare/4.27.0...4.28.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-08 01:01:00 +00:00
Marcel Klehr
b2bdf4a49d Fix Card menu not displaying when description is not set
Signed-off-by: Marcel Klehr <mklehr@gmx.net>
2022-10-07 11:36:09 +02:00
Nextcloud bot
91268cdd4c [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-10-06 02:26:14 +00:00
Nextcloud bot
6b621d2faa [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-10-05 02:21:21 +00:00
Julius Härtl
93db4fd2d8 Merge pull request #4096 from nextcloud/fix/remove-util-constant-uses 2022-10-02 14:17:55 +02:00
Côme Chilliet
f166552de0 Remove uses of Util:: loglevel constants removed from server
Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
2022-10-02 13:54:56 +02:00
Julius Härtl
aab3352624 Merge pull request #4084 from nextcloud/bugfix/noid/fix-missing-icon-for-activities 2022-10-01 14:49:19 +02:00
dependabot[bot]
26f33e5bc6 Merge pull request #4089 from nextcloud/dependabot/npm_and_yarn/master/cypress-10.9.0 2022-10-01 11:10:08 +00:00
dependabot[bot]
da4db42380 Bump cypress from 10.8.0 to 10.9.0
Bumps [cypress](https://github.com/cypress-io/cypress) from 10.8.0 to 10.9.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/v10.8.0...v10.9.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-01 07:38:30 +00:00
dependabot[bot]
aa46b49ab7 Merge pull request #4088 from nextcloud/dependabot/npm_and_yarn/master/jest-29.1.2 2022-10-01 07:37:32 +00:00
dependabot[bot]
b70e893364 Merge pull request #4087 from nextcloud/dependabot/npm_and_yarn/master/nextcloud/vue-richtext-2.0.3 2022-10-01 06:22:52 +00:00
Nextcloud bot
a6bb454df5 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-10-01 02:24:36 +00:00
Nextcloud bot
099e76aeab [tx-robot] Update transifex configuration
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-10-01 02:24:14 +00:00
dependabot[bot]
309b00f2d9 Bump jest from 29.0.1 to 29.1.2
Bumps [jest](https://github.com/facebook/jest/tree/HEAD/packages/jest) from 29.0.1 to 29.1.2.
- [Release notes](https://github.com/facebook/jest/releases)
- [Changelog](https://github.com/facebook/jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/jest/commits/v29.1.2/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>
2022-10-01 02:18:38 +00:00
dependabot[bot]
acd181133c Merge pull request #4085 from nextcloud/dependabot/composer/phpunit/phpunit-9.5.25 2022-10-01 02:12:08 +00:00
dependabot[bot]
86f8999d30 Bump @nextcloud/vue-richtext from 2.0.1 to 2.0.3
Bumps [@nextcloud/vue-richtext](https://github.com/nextcloud/vue-richtext) from 2.0.1 to 2.0.3.
- [Release notes](https://github.com/nextcloud/vue-richtext/releases)
- [Changelog](https://github.com/nextcloud/vue-richtext/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nextcloud/vue-richtext/compare/v2.0.1...v2.0.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-01 02:07:41 +00:00
dependabot[bot]
661a64656e Merge pull request #4086 from nextcloud/dependabot/npm_and_yarn/master/nextcloud/vue-7.0.0-beta.7 2022-10-01 02:06:43 +00:00
dependabot[bot]
3380103a8f Bump @nextcloud/vue from 7.0.0-beta.6 to 7.0.0-beta.7
Bumps [@nextcloud/vue](https://github.com/nextcloud/nextcloud-vue) from 7.0.0-beta.6 to 7.0.0-beta.7.
- [Release notes](https://github.com/nextcloud/nextcloud-vue/releases)
- [Changelog](https://github.com/nextcloud/nextcloud-vue/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nextcloud/nextcloud-vue/compare/v7.0.0-beta.6...v7.0.0-beta.7)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-01 01:03:39 +00:00
dependabot[bot]
7ebf6e4150 Bump phpunit/phpunit from 9.5.24 to 9.5.25
Bumps [phpunit/phpunit](https://github.com/sebastianbergmann/phpunit) from 9.5.24 to 9.5.25.
- [Release notes](https://github.com/sebastianbergmann/phpunit/releases)
- [Changelog](https://github.com/sebastianbergmann/phpunit/blob/main/ChangeLog-9.5.md)
- [Commits](https://github.com/sebastianbergmann/phpunit/compare/9.5.24...9.5.25)

---
updated-dependencies:
- dependency-name: phpunit/phpunit
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-10-01 01:02:13 +00:00
Joas Schilling
05fdd9765c Fix missing icon for activity rendering
Signed-off-by: Joas Schilling <coding@schilljs.com>
2022-09-30 09:57:02 +02:00
Nextcloud bot
72a8c4dd83 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-30 03:23:38 +00:00
Nextcloud bot
423630bea6 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-28 02:46:15 +00:00
Julius Härtl
2c9bcbae0b Merge pull request #4080 from nextcloud/dependabot/npm_and_yarn/master/nextcloud/vue-7.0.0-beta.6 2022-09-27 00:20:45 +02:00
dependabot[bot]
f70747ea15 Bump @nextcloud/vue from 7.0.0-beta.5 to 7.0.0-beta.6
Bumps [@nextcloud/vue](https://github.com/nextcloud/nextcloud-vue) from 7.0.0-beta.5 to 7.0.0-beta.6.
- [Release notes](https://github.com/nextcloud/nextcloud-vue/releases)
- [Changelog](https://github.com/nextcloud/nextcloud-vue/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nextcloud/nextcloud-vue/compare/v7.0.0-beta.5...v7.0.0-beta.6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-26 22:12:19 +00:00
Julien Veyssier
b4c1525958 Merge pull request #4077 from nextcloud/fix/noid/private-reference-class
use OCP\Collaboration\Reference\Reference
2022-09-26 19:48:36 +02:00
Julien Veyssier
ed5df26704 use OCP\Collaboration\Reference\Reference instead of the recently removed OC\Collaboration\Reference\Reference
Signed-off-by: Julien Veyssier <eneiluj@posteo.net>
2022-09-26 17:23:00 +02:00
Julius Härtl
d8253d41fd Merge pull request #4067 from Jerome-Herbinet/patch-1
Fix : Overlapping problem in the deletions tab
2022-09-26 10:36:56 +02:00
Jérôme Herbinet
4eb7988e2c Merge branch 'master' into patch-1 2022-09-26 09:03:14 +02:00
Nextcloud bot
4f68aed812 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-26 02:47:15 +00:00
Nextcloud bot
322d01d3e1 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-24 02:47:21 +00:00
dependabot[bot]
aa34a0cce3 Merge pull request #4073 from nextcloud/dependabot/npm_and_yarn/master/nextcloud/vue-7.0.0-beta.5 2022-09-24 02:42:20 +00:00
dependabot[bot]
93a988f8f1 Bump @nextcloud/vue from 7.0.0-beta.4 to 7.0.0-beta.5
Bumps [@nextcloud/vue](https://github.com/nextcloud/nextcloud-vue) from 7.0.0-beta.4 to 7.0.0-beta.5.
- [Release notes](https://github.com/nextcloud/nextcloud-vue/releases)
- [Changelog](https://github.com/nextcloud/nextcloud-vue/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nextcloud/nextcloud-vue/compare/v7.0.0-beta.4...v7.0.0-beta.5)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-24 01:02:59 +00:00
Julius Härtl
630fa5b07e Merge pull request #4071 from nextcloud/enh/import
Use global import for nextcloud-vue
2022-09-23 12:00:18 +02:00
Julius Härtl
77f623d261 Merge pull request #4066 from nextcloud/bugfix/delete_acl
Fix deleteAcl
2022-09-23 10:05:09 +02:00
Nextcloud bot
30a4e88cff [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-23 02:42:07 +00:00
Julius Härtl
01b897bd8b Fix imports
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-09-22 20:33:58 +02:00
Julius Härtl
be36e6de6a Use global import for nextcloud-vue
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-09-22 20:33:58 +02:00
Julius Härtl
96b7a7ccb3 Merge pull request #4069 from nextcloud/fix/noid/reference-widget-style 2022-09-22 20:28:56 +02:00
Julius Härtl
d8dd65d7ee Merge pull request #4070 from nextcloud/update-master-version 2022-09-22 20:28:20 +02:00
Julien Veyssier
aecdcb847d fix width issues
Signed-off-by: Julien Veyssier <eneiluj@posteo.net>
2022-09-22 17:05:53 +02:00
Joas Schilling
a383d389c4 Add Nextcloud 25 support on master
Signed-off-by: Joas Schilling <coding@schilljs.com>
2022-09-22 13:22:33 +02:00
Julien Veyssier
565b2edfdd use richtext component for description, adjust style to make it work in Text
Signed-off-by: Julien Veyssier <eneiluj@posteo.net>
2022-09-22 13:21:33 +02:00
Jérôme Herbinet
c1b4beeb64 Fix : Overlapping problem in the deletions tab
Overlapping problem in the deletions tab fix when titles are long and displayed on two lines 
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>
2022-09-22 11:09:15 +02:00
raul
9d489564d6 Fix psalm test
Signed-off-by: raul <raul@nextcloud.com>
2022-09-22 08:46:35 +02:00
raul
24a4260e55 Fix deleteAcl
Signed-off-by: raul <raul@nextcloud.com>
2022-09-22 08:46:35 +02:00
Nextcloud bot
af8e61ece6 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-22 02:45:46 +00:00
Julius Härtl
f9836d4dfb Merge pull request #4033 from nextcloud/enh/4032/implement-new-dashboard-widget-interfaces 2022-09-21 18:40:31 +02:00
Julius Härtl
982b867a04 Merge pull request #4000 from nextcloud/enh/related-resources 2022-09-21 18:38:11 +02:00
Christopher Ng
a6c9bd5c09 Add related resources panel to board sharing tab sidebar
Signed-off-by: Christopher Ng <chrng8@gmail.com>
2022-09-21 17:35:53 +02:00
Julius Härtl
8008b9d0cb Merge pull request #4056 from nextcloud/fix/4018/reference-card
Fix reference provider when caching
2022-09-21 17:29:59 +02:00
Julius Härtl
7f01db17d0 Merge pull request #4016 from nextcloud/dependencies/bump-nextcloud-vue
Bump @nextcloud/vue to 7.0.0-beta.0
2022-09-21 17:28:46 +02:00
Julius Härtl
9ec44bdadd Fix stylelint
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-09-21 09:01:51 +02:00
Julius Härtl
660290121c Fix some styling issues
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-09-21 09:01:51 +02:00
Julius Härtl
7dab7fad81 Bump @nextcloud/vue to 7.0.0-beta.0
Signed-off-by: Julius Härtl <jus@bitgrid.net>

Bump @nextcloud/vue to 7.0.0-beta.4

Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-09-21 09:01:49 +02:00
Nextcloud bot
7b0630143d [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-20 02:45:55 +00:00
Julius Härtl
17258783c2 Merge pull request #4064 from nextcloud/dependabot/npm_and_yarn/master/nextcloud/vue-richtext-2.0.1
Bump @nextcloud/vue-richtext from 2.0.0 to 2.0.1
2022-09-19 14:28:13 +02:00
Julius Härtl
9398d86fba Merge pull request #4062 from nextcloud/dependabot/npm_and_yarn/master/cypress-10.8.0
Bump cypress from 10.7.0 to 10.8.0
2022-09-19 09:57:40 +02:00
Julius Härtl
88ef90fce7 Merge pull request #4050 from nextcloud/dependabot/npm_and_yarn/node-forge-1.3.1
Bump node-forge from 0.10.0 to 1.3.1
2022-09-19 08:59:08 +02:00
Julius Härtl
4213ec0986 Merge pull request #4051 from nextcloud/dependabot/github_actions/actions/checkout-3
Bump actions/checkout from 2 to 3
2022-09-19 08:58:52 +02:00
Julius Härtl
f4b2563629 Merge pull request #4052 from nextcloud/dependabot/github_actions/actions/setup-node-3
Bump actions/setup-node from 1 to 3
2022-09-19 08:58:44 +02:00
Nextcloud bot
baf0e0c1f5 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-17 02:45:12 +00:00
dependabot[bot]
b888a65b8b Bump @nextcloud/vue-richtext from 2.0.0 to 2.0.1
Bumps [@nextcloud/vue-richtext](https://github.com/nextcloud/vue-richtext) from 2.0.0 to 2.0.1.
- [Release notes](https://github.com/nextcloud/vue-richtext/releases)
- [Changelog](https://github.com/nextcloud/vue-richtext/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nextcloud/vue-richtext/compare/v2.0.0...v2.0.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-17 02:12:09 +00:00
dependabot[bot]
a6eda5a0b8 Bump cypress from 10.7.0 to 10.8.0
Bumps [cypress](https://github.com/cypress-io/cypress) from 10.7.0 to 10.8.0.
- [Release notes](https://github.com/cypress-io/cypress/releases)
- [Changelog](https://github.com/cypress-io/cypress/blob/develop/.releaserc.base.js)
- [Commits](https://github.com/cypress-io/cypress/compare/v10.7.0...v10.8.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-17 02:10:49 +00:00
Julien Veyssier
6449082349 fix widget api buttons
Signed-off-by: Julien Veyssier <eneiluj@posteo.net>
2022-09-16 13:52:02 +02:00
Julien Veyssier
44127d4bf6 use since param to build widget item list
Signed-off-by: Julien Veyssier <eneiluj@posteo.net>
2022-09-16 13:35:22 +02:00
Julien Veyssier
0c95e7ca1e implement IButtonWidget and IIconWidget
Signed-off-by: Julien Veyssier <eneiluj@posteo.net>
2022-09-16 13:35:21 +02:00
Julien Veyssier
e29ac75f3d use @nc/vue button in dashboard widget, use material icon inside
Signed-off-by: Julien Veyssier <eneiluj@posteo.net>
2022-09-16 13:35:15 +02:00
Julien Veyssier
7dba89a03a implement IAPIWidget interface
Signed-off-by: Julien Veyssier <eneiluj@posteo.net>
2022-09-16 13:32:01 +02:00
Nextcloud bot
61d23ddc6f [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-16 02:39:35 +00:00
Nextcloud bot
fc921143d3 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-15 02:45:07 +00:00
Julien Veyssier
395c79b32a perform deep serialization/sanitizing of reference rich object to avoid caching issues
Signed-off-by: Julien Veyssier <eneiluj@posteo.net>
2022-09-14 12:00:30 +02:00
Nextcloud bot
7c683efce6 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-14 02:39:52 +00:00
Nextcloud bot
f07eb17dff [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-13 02:40:38 +00:00
Julien Veyssier
242906162f Merge pull request #4031 from nextcloud/enh/4018/reference-card
Implement card reference widget
2022-09-12 18:06:57 +02:00
Julien Veyssier
c423f6ecd8 adjust card reference style
Signed-off-by: Julien Veyssier <eneiluj@posteo.net>
2022-09-12 17:20:45 +02:00
Julien Veyssier
3c83320c20 implement card reference widget, fix DeckIcon.vue
bring back eslint and stylelint on compilation, fix almost all warnings, ignore some

Signed-off-by: Julien Veyssier <eneiluj@posteo.net>
2022-09-12 17:20:45 +02:00
Nextcloud bot
89068641ee [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-12 02:39:40 +00:00
dependabot[bot]
71e5c0d743 Bump actions/upload-artifact from 2 to 3
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 2 to 3.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](https://github.com/actions/upload-artifact/compare/v2...v3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-10 04:06:23 +00:00
dependabot[bot]
3e46fe777d Bump actions/setup-node from 1 to 3
Bumps [actions/setup-node](https://github.com/actions/setup-node) from 1 to 3.
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/v1...v3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-10 04:06:20 +00:00
dependabot[bot]
a73d790a95 Bump actions/checkout from 2 to 3
Bumps [actions/checkout](https://github.com/actions/checkout) from 2 to 3.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v2...v3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-10 04:06:17 +00:00
dependabot[bot]
40b8596275 Merge pull request #4047 from nextcloud/dependabot/npm_and_yarn/master/vue-router-3.6.5 2022-09-10 03:35:03 +00:00
dependabot[bot]
6487ed966f Merge pull request #4045 from nextcloud/dependabot/npm_and_yarn/master/nextcloud/event-bus-3.0.2 2022-09-10 02:33:51 +00:00
dependabot[bot]
c5cb8ed5a7 Bump node-forge from 0.10.0 to 1.3.1
Bumps [node-forge](https://github.com/digitalbazaar/forge) from 0.10.0 to 1.3.1.
- [Release notes](https://github.com/digitalbazaar/forge/releases)
- [Changelog](https://github.com/digitalbazaar/forge/blob/main/CHANGELOG.md)
- [Commits](https://github.com/digitalbazaar/forge/compare/0.10.0...v1.3.1)

---
updated-dependencies:
- dependency-name: node-forge
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-10 02:32:34 +00:00
dependabot[bot]
d7ee3b72a6 Merge pull request #4046 from nextcloud/dependabot/npm_and_yarn/master/babel/runtime-7.19.0 2022-09-10 02:31:46 +00:00
dependabot[bot]
36e2443267 Bump vue-router from 3.6.4 to 3.6.5
Bumps [vue-router](https://github.com/vuejs/router) from 3.6.4 to 3.6.5.
- [Release notes](https://github.com/vuejs/router/releases)
- [Commits](https://github.com/vuejs/router/commits)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-10 01:03:29 +00:00
dependabot[bot]
2c1b95a3cb Bump @babel/runtime from 7.18.9 to 7.19.0
Bumps [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.18.9 to 7.19.0.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.19.0/packages/babel-runtime)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-10 01:03:07 +00:00
dependabot[bot]
0628624edf Bump @nextcloud/event-bus from 3.0.0 to 3.0.2
Bumps [@nextcloud/event-bus](https://github.com/nextcloud/nextcloud-event-bus) from 3.0.0 to 3.0.2.
- [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.0...v3.0.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-10 01:02:46 +00:00
Nextcloud bot
2bd854ff18 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-09 02:40:38 +00:00
Nextcloud bot
18b6ed080c [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-08 02:40:30 +00:00
Julien Veyssier
5010f0e0e1 Merge pull request #4036 from nextcloud/fix/4035/show-attachment-creator-displayname
Fix attachment creator name: show display name
2022-09-07 18:05:27 +02:00
Julien Veyssier
82c7145163 fix tests
Signed-off-by: Julien Veyssier <eneiluj@posteo.net>
2022-09-07 17:41:51 +02:00
Julien Veyssier
cb60e70ae9 refs #4035 fix attachment creator name: show display name instead of user id
Signed-off-by: Julien Veyssier <eneiluj@posteo.net>
2022-09-07 16:53:51 +02:00
Nextcloud bot
f8a255a9f0 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-07 02:39:58 +00:00
Nextcloud bot
38040cc246 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-06 02:39:36 +00:00
Nextcloud bot
0961bf088f [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-05 02:38:57 +00:00
Nextcloud bot
76afb87624 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-04 02:37:59 +00:00
dependabot[bot]
8dc8513263 Merge pull request #4029 from nextcloud/dependabot/composer/phpunit/phpunit-9.5.24 2022-09-03 07:39:09 +00:00
dependabot[bot]
4d3f2bf1e4 Merge pull request #4028 from nextcloud/dependabot/composer/vimeo/psalm-4.27.0 2022-09-03 07:32:43 +00:00
dependabot[bot]
4c82154eb0 Merge pull request #4024 from nextcloud/dependabot/npm_and_yarn/master/relative-ci/agent-4.1.0 2022-09-03 05:42:10 +00:00
dependabot[bot]
858334cc64 Bump phpunit/phpunit from 9.5.23 to 9.5.24
Bumps [phpunit/phpunit](https://github.com/sebastianbergmann/phpunit) from 9.5.23 to 9.5.24.
- [Release notes](https://github.com/sebastianbergmann/phpunit/releases)
- [Changelog](https://github.com/sebastianbergmann/phpunit/blob/main/ChangeLog-9.5.md)
- [Commits](https://github.com/sebastianbergmann/phpunit/compare/9.5.23...9.5.24)

---
updated-dependencies:
- dependency-name: phpunit/phpunit
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-03 02:53:20 +00:00
dependabot[bot]
7bb02a9b63 Bump vimeo/psalm from 4.26.0 to 4.27.0
Bumps [vimeo/psalm](https://github.com/vimeo/psalm) from 4.26.0 to 4.27.0.
- [Release notes](https://github.com/vimeo/psalm/releases)
- [Commits](https://github.com/vimeo/psalm/compare/4.26.0...4.27.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-03 02:52:44 +00:00
Nextcloud bot
1551cdf517 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-03 02:44:33 +00:00
dependabot[bot]
8a8a1ac060 Bump @relative-ci/agent from 4.0.0 to 4.1.0
Bumps [@relative-ci/agent](https://github.com/relative-ci/agent) from 4.0.0 to 4.1.0.
- [Release notes](https://github.com/relative-ci/agent/releases)
- [Commits](https://github.com/relative-ci/agent/compare/v4.0.0...v4.1.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-03 02:05:54 +00:00
dependabot[bot]
123e43e626 Merge pull request #4021 from nextcloud/dependabot/npm_and_yarn/master/cypress-10.7.0 2022-09-03 02:04:54 +00:00
dependabot[bot]
03e54ffdff Bump cypress from 10.6.0 to 10.7.0
Bumps [cypress](https://github.com/cypress-io/cypress) from 10.6.0 to 10.7.0.
- [Release notes](https://github.com/cypress-io/cypress/releases)
- [Changelog](https://github.com/cypress-io/cypress/blob/develop/.releaserc.base.js)
- [Commits](https://github.com/cypress-io/cypress/compare/v10.6.0...v10.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>
2022-09-03 01:03:27 +00:00
Julius Härtl
c897074cb3 Clarify that board deletion also includes archived cards
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-09-02 14:59:06 +02:00
Julius Härtl
03fa4dc816 Merge pull request #4014 from nextcloud/create-no-stack 2022-09-02 13:12:21 +02:00
Nextcloud bot
3ea4c635d0 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-01 02:50:05 +00:00
Luka Trovic
78ed0852ea Merge pull request #4013 from nextcloud/release/1.8.0-beta.1
release/1.8.0-beta.1
2022-08-30 14:51:20 +02:00
Robin Appelman
89d46dcab4 disable Create card button while no stack is chosen
make the `isBoardAndStackChoosen` method do what it says

Signed-off-by: Robin Appelman <robin@icewind.nl>
2022-08-30 14:40:49 +02:00
Luka Trovic
411626c038 changes for 1.8.0-beta.1
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2022-08-30 14:34:02 +02:00
Julius Härtl
56e3215785 Merge pull request #3983 from nextcloud/perf/sharing
Simpify query for getting shared files
2022-08-29 11:02:09 +02:00
Julius Härtl
b81f55057a Fix phpunit install version
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-08-28 20:51:22 +02:00
Julius Härtl
e2dc1c2684 Simplify fetching boards during sharing
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-08-28 20:51:22 +02:00
Julius Härtl
e2c5367050 Avoid duplicate code
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-08-28 20:51:22 +02:00
dependabot[bot]
15c48b919d Merge pull request #4008 from nextcloud/dependabot/npm_and_yarn/master/dompurify-2.4.0 2022-08-28 17:43:57 +00:00
dependabot[bot]
7ad36b07b1 Merge pull request #3975 from nextcloud/dependabot/npm_and_yarn/master/nextcloud/stylelint-config-2.2.0 2022-08-28 17:43:33 +00:00
dependabot[bot]
85dbb18663 Bump @nextcloud/stylelint-config from 2.1.2 to 2.2.0
Bumps [@nextcloud/stylelint-config](https://github.com/nextcloud/stylelint-config) from 2.1.2 to 2.2.0.
- [Release notes](https://github.com/nextcloud/stylelint-config/releases)
- [Changelog](https://github.com/nextcloud/stylelint-config/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nextcloud/stylelint-config/compare/v2.1.2...v2.2.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-28 19:38:11 +02:00
dependabot[bot]
a712be416e Merge pull request #4006 from nextcloud/dependabot/npm_and_yarn/master/vue-router-3.6.4 2022-08-28 16:49:58 +00:00
Julius Härtl
2246e12a6a Merge pull request #4004 from nextcloud/dependabot/composer/phpunit/phpunit-9.5.23
Bump phpunit/phpunit from 9.5.21 to 9.5.23
2022-08-28 18:43:35 +02:00
dependabot[bot]
0975eb7d78 Bump vue-router from 3.5.4 to 3.6.4
Bumps [vue-router](https://github.com/vuejs/router) from 3.5.4 to 3.6.4.
- [Release notes](https://github.com/vuejs/router/releases)
- [Commits](https://github.com/vuejs/router/commits)

---
updated-dependencies:
- dependency-name: vue-router
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-28 18:43:06 +02:00
dependabot[bot]
f4610dc6eb Bump dompurify from 2.3.10 to 2.4.0
Bumps [dompurify](https://github.com/cure53/DOMPurify) from 2.3.10 to 2.4.0.
- [Release notes](https://github.com/cure53/DOMPurify/releases)
- [Commits](https://github.com/cure53/DOMPurify/compare/2.3.10...2.4.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-28 18:42:49 +02:00
dependabot[bot]
df5b2abf21 Merge pull request #3988 from nextcloud/dependabot/npm_and_yarn/master/cypress-10.6.0 2022-08-28 16:26:30 +00:00
dependabot[bot]
e865627158 Bump cypress from 10.4.0 to 10.6.0
Bumps [cypress](https://github.com/cypress-io/cypress) from 10.4.0 to 10.6.0.
- [Release notes](https://github.com/cypress-io/cypress/releases)
- [Changelog](https://github.com/cypress-io/cypress/blob/develop/.releaserc.base.js)
- [Commits](https://github.com/cypress-io/cypress/compare/v10.4.0...v10.6.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-28 16:19:18 +00:00
Julius Härtl
fdd6b78fa8 Merge pull request #4005 from nextcloud/dependabot/npm_and_yarn/master/jest-29.0.1
Bump jest from 28.1.3 to 29.0.1
2022-08-28 18:18:12 +02:00
Julius Härtl
58db7712ea Merge pull request #4007 from nextcloud/dependabot/npm_and_yarn/master/nextcloud/initial-state-2.0.0
Bump @nextcloud/initial-state from 1.2.1 to 2.0.0
2022-08-28 18:17:54 +02:00
dependabot[bot]
325ec9ae55 Bump jest from 28.1.3 to 29.0.1
Bumps [jest](https://github.com/facebook/jest/tree/HEAD/packages/jest) from 28.1.3 to 29.0.1.
- [Release notes](https://github.com/facebook/jest/releases)
- [Changelog](https://github.com/facebook/jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/jest/commits/v29.0.1/packages/jest)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-28 13:42:20 +00:00
dependabot[bot]
935a2a240d Bump @nextcloud/initial-state from 1.2.1 to 2.0.0
Bumps [@nextcloud/initial-state](https://github.com/nextcloud/nextcloud-initial-state) from 1.2.1 to 2.0.0.
- [Release notes](https://github.com/nextcloud/nextcloud-initial-state/releases)
- [Changelog](https://github.com/nextcloud/nextcloud-initial-state/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nextcloud/nextcloud-initial-state/commits)

---
updated-dependencies:
- dependency-name: "@nextcloud/initial-state"
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-28 13:42:04 +00:00
Julius Härtl
a0ca4f0a33 Merge pull request #3991 from nextcloud/depenendencies/nextcloud-vue-6 2022-08-28 14:45:31 +02:00
Julius Härtl
a0c47f8115 Some cypress test cleanup and fixes
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-08-28 14:37:11 +02:00
Nextcloud bot
957776871d [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-08-28 02:36:30 +00:00
Nextcloud bot
fe7d318f3d [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-08-27 02:36:42 +00:00
dependabot[bot]
b8155835b6 Bump phpunit/phpunit from 9.5.21 to 9.5.23
Bumps [phpunit/phpunit](https://github.com/sebastianbergmann/phpunit) from 9.5.21 to 9.5.23.
- [Release notes](https://github.com/sebastianbergmann/phpunit/releases)
- [Changelog](https://github.com/sebastianbergmann/phpunit/blob/main/ChangeLog-9.5.md)
- [Commits](https://github.com/sebastianbergmann/phpunit/compare/9.5.21...9.5.23)

---
updated-dependencies:
- dependency-name: phpunit/phpunit
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-27 01:00:52 +00:00
Julius Härtl
74d9e63888 Use proper type for size prop
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-08-26 12:45:46 +02:00
Julius Härtl
7c5601eed6 Bump to beta.4
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-08-26 12:42:07 +02:00
Julius Härtl
49acc1a88f Small styling fix for the controls bar
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-08-26 12:41:09 +02:00
Julius Härtl
f072b06b81 Update vue
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-08-26 12:41:09 +02:00
Julius Härtl
4be99a93c8 Bump to @nextcloud/vue@6.0.0-beta.3
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-08-26 12:41:08 +02:00
Nextcloud bot
e761c9aec9 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-08-24 02:39:39 +00:00
Julius Härtl
1032e8fb06 Merge pull request #3989 from nextcloud/dependabot/github_actions/shivammathur/setup-php-2.21.2 2022-08-22 17:51:09 +02:00
Nextcloud bot
36d9cd1c76 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-08-22 02:37:12 +00:00
Nextcloud bot
281dcf464e [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-08-21 02:36:33 +00:00
Nextcloud bot
90bed2da26 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-08-20 02:36:56 +00:00
dependabot[bot]
ba1f1a99ed Bump shivammathur/setup-php from 2.21.1 to 2.21.2
Bumps [shivammathur/setup-php](https://github.com/shivammathur/setup-php) from 2.21.1 to 2.21.2.
- [Release notes](https://github.com/shivammathur/setup-php/releases)
- [Commits](https://github.com/shivammathur/setup-php/compare/2.21.1...2.21.2)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-20 01:05:11 +00:00
Marcel Klehr
cdd838cffe Merge pull request #3986 from nextcloud/fix/a11y 2022-08-19 11:44:42 +02:00
Marcel Klehr
d1997c0f65 Add a11y label for sidebar button
Signed-off-by: Marcel Klehr <mklehr@gmx.net>
2022-08-19 11:35:12 +02:00
Julius Härtl
1cfc20365e Merge pull request #3984 from nextcloud/enh/hide-projects 2022-08-18 10:42:36 +02:00
Christopher Ng
ed8877ca6b Hide deprecated projects in sidebar and card details by default
Signed-off-by: Christopher Ng <chrng8@gmail.com>
2022-08-18 01:59:06 +00:00
Vincent Petry
de0dc2782f Merge pull request #3982 from nextcloud/performance/dav
Improve CalDAV integration performance
2022-08-17 16:13:27 +02:00
Julius Härtl
e33dd1527f Merge pull request #3980 from nextcloud/bugfix/noid/permission-cache 2022-08-17 12:12:09 +02:00
Julius Härtl
9171ffc88a Avoid fetching archived cards for calendars
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-08-17 11:33:27 +02:00
Julius Härtl
eb65468382 Avoid querying each card when getting the calendars only
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-08-17 11:28:24 +02:00
Julius Härtl
7c40172c40 Use capped memory cache for board permissions
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-08-16 16:06:40 +02:00
Julius Härtl
ab48cccefc Merge pull request #3972 from nextcloud/dependabot/npm_and_yarn/master/nextcloud/auth-2.0.0
Bump @nextcloud/auth from 1.3.0 to 2.0.0
2022-08-13 17:20:32 +02:00
dependabot[bot]
1b38ebe89e Bump @nextcloud/auth from 1.3.0 to 2.0.0
Bumps [@nextcloud/auth](https://github.com/nextcloud/nextcloud-auth) from 1.3.0 to 2.0.0.
- [Release notes](https://github.com/nextcloud/nextcloud-auth/releases)
- [Changelog](https://github.com/nextcloud/nextcloud-auth/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nextcloud/nextcloud-auth/compare/v1.3.0...v2.0.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-13 14:34:35 +00:00
Julius Härtl
c235f05340 Merge pull request #3967 from nextcloud/dependabot/npm_and_yarn/master/nextcloud/axios-2.0.0
Bump @nextcloud/axios from 1.10.0 to 2.0.0
2022-08-13 16:33:36 +02:00
dependabot[bot]
3a7219a94f Bump @nextcloud/axios from 1.10.0 to 2.0.0
Bumps [@nextcloud/axios](https://github.com/nextcloud/nextcloud-axios) from 1.10.0 to 2.0.0.
- [Release notes](https://github.com/nextcloud/nextcloud-axios/releases)
- [Changelog](https://github.com/nextcloud/nextcloud-axios/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nextcloud/nextcloud-axios/compare/v1.10.0...v2.0.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-13 12:38:39 +00:00
Julius Härtl
accff8c8b6 Merge pull request #3971 from nextcloud/dependabot/npm_and_yarn/master/nextcloud/event-bus-3.0.0 2022-08-13 14:37:42 +02:00
dependabot[bot]
9a9ac07ab2 Merge pull request #3973 from nextcloud/dependabot/npm_and_yarn/master/nextcloud/webpack-vue-config-5.3.0 2022-08-13 11:56:30 +00:00
dependabot[bot]
2d6433ab4d Merge pull request #3974 from nextcloud/dependabot/npm_and_yarn/master/vue-at-2.5.0 2022-08-13 06:45:35 +00:00
dependabot[bot]
937d93894a Bump @nextcloud/event-bus from 2.1.1 to 3.0.0
Bumps [@nextcloud/event-bus](https://github.com/nextcloud/nextcloud-event-bus) from 2.1.1 to 3.0.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/v2.1.1...v3.0.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-13 05:12:26 +00:00
dependabot[bot]
fc122027cb Merge pull request #3970 from nextcloud/dependabot/npm_and_yarn/master/nextcloud/dialogs-3.2.0 2022-08-13 05:11:28 +00:00
dependabot[bot]
1e790b7a20 Bump @nextcloud/webpack-vue-config from 5.2.1 to 5.3.0
Bumps [@nextcloud/webpack-vue-config](https://github.com/nextcloud/webpack-vue-config) from 5.2.1 to 5.3.0.
- [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.2.1...v5.3.0)

---
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>
2022-08-13 04:34:50 +00:00
dependabot[bot]
33dcef981a Merge pull request #3969 from nextcloud/dependabot/npm_and_yarn/master/nextcloud/browserslist-config-2.3.0 2022-08-13 04:33:31 +00:00
dependabot[bot]
1c59fd7ed3 Merge pull request #3968 from nextcloud/dependabot/npm_and_yarn/master/markdown-it-link-attributes-4.0.1 2022-08-13 03:51:36 +00:00
Nextcloud bot
4d559d4094 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-08-13 02:37:48 +00:00
dependabot[bot]
96b852a0e7 Bump vue-at from 2.5.0-beta.2 to 2.5.0
Bumps [vue-at](https://github.com/fritx/vue-at) from 2.5.0-beta.2 to 2.5.0.
- [Release notes](https://github.com/fritx/vue-at/releases)
- [Commits](https://github.com/fritx/vue-at/commits)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-13 02:14:26 +00:00
dependabot[bot]
aacf6b5d52 Bump @nextcloud/dialogs from 3.1.4 to 3.2.0
Bumps [@nextcloud/dialogs](https://github.com/nextcloud/nextcloud-dialogs) from 3.1.4 to 3.2.0.
- [Release notes](https://github.com/nextcloud/nextcloud-dialogs/releases)
- [Changelog](https://github.com/nextcloud/nextcloud-dialogs/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nextcloud/nextcloud-dialogs/compare/v3.1.4...v3.2.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-13 01:03:46 +00:00
dependabot[bot]
2573b5728c Bump @nextcloud/browserslist-config from 2.2.0 to 2.3.0
Bumps [@nextcloud/browserslist-config](https://github.com/nextcloud/browserslist-config) from 2.2.0 to 2.3.0.
- [Release notes](https://github.com/nextcloud/browserslist-config/releases)
- [Commits](https://github.com/nextcloud/browserslist-config/compare/v2.2.0...v2.3.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-13 01:03:30 +00:00
dependabot[bot]
9eb2c04a26 Bump markdown-it-link-attributes from 4.0.0 to 4.0.1
Bumps [markdown-it-link-attributes](https://github.com/crookedneighbor/markdown-it-link-attributes) from 4.0.0 to 4.0.1.
- [Release notes](https://github.com/crookedneighbor/markdown-it-link-attributes/releases)
- [Changelog](https://github.com/crookedneighbor/markdown-it-link-attributes/blob/main/CHANGELOG.md)
- [Commits](https://github.com/crookedneighbor/markdown-it-link-attributes/compare/v4.0.0...v4.0.1)

---
updated-dependencies:
- dependency-name: markdown-it-link-attributes
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-13 01:03:14 +00:00
Nextcloud bot
71b19be030 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-08-12 02:36:54 +00:00
Julius Härtl
48d28dc317 Merge branch 'master' into fix-archived-stack-button 2022-08-09 07:43:24 +02:00
Nextcloud bot
73c5127088 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-08-09 02:36:35 +00:00
dependabot[bot]
a8831b2c9e Merge pull request #3956 from nextcloud/dependabot/npm_and_yarn/master/nextcloud/vue-5.4.0 2022-08-08 04:55:20 +00:00
dependabot[bot]
d8a40611f8 Bump @nextcloud/vue from 5.3.1 to 5.4.0
Bumps [@nextcloud/vue](https://github.com/nextcloud/nextcloud-vue) from 5.3.1 to 5.4.0.
- [Release notes](https://github.com/nextcloud/nextcloud-vue/releases)
- [Changelog](https://github.com/nextcloud/nextcloud-vue/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nextcloud/nextcloud-vue/compare/v5.3.1...v5.4.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-07 19:17:54 +00:00
dependabot[bot]
762afcfc21 Merge pull request #3955 from nextcloud/dependabot/npm_and_yarn/master/cypress-10.4.0 2022-08-07 19:16:47 +00:00
dependabot[bot]
6b0e5ae392 Bump cypress from 10.3.1 to 10.4.0
Bumps [cypress](https://github.com/cypress-io/cypress) from 10.3.1 to 10.4.0.
- [Release notes](https://github.com/cypress-io/cypress/releases)
- [Changelog](https://github.com/cypress-io/cypress/blob/develop/.releaserc.base.js)
- [Commits](https://github.com/cypress-io/cypress/compare/v10.3.1...v10.4.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-07 19:11:58 +00:00
dependabot[bot]
660621bffb Merge pull request #3954 from nextcloud/dependabot/composer/vimeo/psalm-4.26.0 2022-08-07 19:04:06 +00:00
dependabot[bot]
ba64441619 Bump vimeo/psalm from 4.25.0 to 4.26.0
Bumps [vimeo/psalm](https://github.com/vimeo/psalm) from 4.25.0 to 4.26.0.
- [Release notes](https://github.com/vimeo/psalm/releases)
- [Commits](https://github.com/vimeo/psalm/compare/4.25.0...4.26.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-08-07 17:51:08 +00:00
max-nextcloud
d63234f385 Merge pull request #3957 from nextcloud/fix/cypress-login
cy: fix login submit selector for current server
2022-08-07 19:35:55 +02:00
Julius Härtl
bd4223c721 Merge pull request #3958 from nextcloud/feat/package-node-npm-engines-update
Update npm and node engines versions
2022-08-07 14:06:40 +02:00
Nextcloud bot
5cbdbc7520 Update npm and node engines versions
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-08-07 07:22:28 +00:00
Max
5c95b5ac98 cy: fix login submit selector for current server
Made the selector flexible enough to still work with the old.

Signed-off-by: Max <max@nextcloud.com>
2022-08-07 08:12:13 +02:00
Nextcloud bot
ef1800c50a [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-08-07 02:40:57 +00:00
Nextcloud bot
5c2a6d6f7c [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-08-06 02:37:33 +00:00
Julius Härtl
acdff604e4 Merge pull request #3952 from nextcloud/bugfix/noid/attachment-folder-cron
Fetch attachment folder for the correct user during cron job
2022-08-05 17:04:28 +02:00
Julius Härtl
0aff6c1561 Merge pull request #3953 from nextcloud/feat/workflow-auto-update-dependabot-approve-merge.yml
Updating dependabot-approve-merge.yml workflow from template
2022-08-05 17:03:26 +02:00
Nextcloud bot
6c556263c6 Updating dependabot-approve-merge.yml workflow from template
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-08-05 12:51:52 +00:00
Julius Härtl
e639456a82 Fetch attachment folder for the correct user during cron job
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-08-05 13:20:41 +02:00
Nextcloud bot
5dedf7bec3 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-08-05 02:13:40 +00:00
Nextcloud bot
cb8ef37c79 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-08-03 02:13:41 +00:00
Julius Härtl
ad007bd51a Merge branch 'master' into fix-archived-stack-button 2022-08-02 12:24:33 +02:00
Julius Härtl
ae499d513a Update README.md
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-08-02 12:11:59 +02:00
Julius Härtl
507c80afc7 Merge pull request #3946 from nextcloud/dependabot/npm_and_yarn/master/p-queue-7.3.0 2022-08-01 11:14:04 +02:00
Julius Härtl
3d02cacc4d Merge pull request #3945 from nextcloud/dependabot/npm_and_yarn/master/relative-ci/agent-4.0.0 2022-08-01 11:13:00 +02:00
Julius Härtl
f9e96922eb Merge pull request #3944 from nextcloud/dependabot/composer/vimeo/psalm-4.25.0 2022-07-30 10:24:23 +02:00
Julius Härtl
791239eabb Merge pull request #3947 from nextcloud/dependabot/github_actions/shivammathur/setup-php-2.21.1 2022-07-30 10:24:05 +02:00
dependabot[bot]
4c72f6d1fb Bump shivammathur/setup-php from 2.21.0 to 2.21.1
Bumps [shivammathur/setup-php](https://github.com/shivammathur/setup-php) from 2.21.0 to 2.21.1.
- [Release notes](https://github.com/shivammathur/setup-php/releases)
- [Commits](https://github.com/shivammathur/setup-php/compare/2.21.0...2.21.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-30 01:05:06 +00:00
dependabot[bot]
34e3310669 Bump p-queue from 7.2.0 to 7.3.0
Bumps [p-queue](https://github.com/sindresorhus/p-queue) from 7.2.0 to 7.3.0.
- [Release notes](https://github.com/sindresorhus/p-queue/releases)
- [Commits](https://github.com/sindresorhus/p-queue/compare/v7.2.0...v7.3.0)

---
updated-dependencies:
- dependency-name: p-queue
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-30 01:02:31 +00:00
dependabot[bot]
4bd45d1f5b Bump @relative-ci/agent from 3.1.3 to 4.0.0
Bumps [@relative-ci/agent](https://github.com/relative-ci/agent) from 3.1.3 to 4.0.0.
- [Release notes](https://github.com/relative-ci/agent/releases)
- [Commits](https://github.com/relative-ci/agent/compare/v3.1.3...v4.0.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-30 01:02:30 +00:00
dependabot[bot]
55d02d4955 Bump vimeo/psalm from 4.24.0 to 4.25.0
Bumps [vimeo/psalm](https://github.com/vimeo/psalm) from 4.24.0 to 4.25.0.
- [Release notes](https://github.com/vimeo/psalm/releases)
- [Commits](https://github.com/vimeo/psalm/compare/4.24.0...v4.25.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-30 01:01:14 +00:00
Julius Härtl
f5fd8c9fe5 Merge pull request #3942 from nextcloud/bugfix/noid/fix-share-provider
Fix share provider for master changes
2022-07-29 22:42:14 +02:00
Joas Schilling
ff39027869 Fix share provider for master changes
Signed-off-by: Joas Schilling <coding@schilljs.com>
2022-07-29 10:27:25 +02:00
Nextcloud bot
3b1bae3775 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-07-29 02:13:32 +00:00
Nextcloud bot
ef0dde23d0 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-07-28 02:13:38 +00:00
Julius Härtl
512537afe5 Merge pull request #3939 from nextcloud/bugfix/noid/icon-deck
Invert icons properly in dark mode
2022-07-27 13:27:11 +02:00
Nextcloud bot
e85782da4d [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-07-27 02:13:36 +00:00
dependabot[bot]
d86a10af32 Merge pull request #3936 from nextcloud/dependabot/github_actions/shivammathur/setup-php-2.21.0 2022-07-26 15:13:14 +00:00
Julius Härtl
ceab78e2d8 Merge pull request #3862 from mstolf/bugfix/3861/inserted-required-property-in-rename-list-field
Inserted required property in the rename list field, to prevent the l…
2022-07-26 16:59:30 +02:00
dependabot[bot]
11afab61d7 Bump shivammathur/setup-php from 2.20.1 to 2.21.0
Bumps [shivammathur/setup-php](https://github.com/shivammathur/setup-php) from 2.20.1 to 2.21.0.
- [Release notes](https://github.com/shivammathur/setup-php/releases)
- [Commits](https://github.com/shivammathur/setup-php/compare/2.20.1...2.21.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-26 16:55:13 +02:00
Julius Härtl
801e691011 Merge pull request #3927 from nextcloud/dependabot/npm_and_yarn/terser-5.14.2 2022-07-26 16:55:05 +02:00
Julius Härtl
b3f7c648db Merge pull request #3932 from nextcloud/dependabot/npm_and_yarn/master/babel/runtime-7.18.9 2022-07-26 16:54:59 +02:00
Julius Härtl
3842950309 Merge pull request #3937 from nextcloud/dependabot/npm_and_yarn/master/dompurify-2.3.10 2022-07-26 16:54:46 +02:00
Julius Härtl
57ef6f02bc Invert icons properly in dark mode
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-07-26 16:16:53 +02:00
Julius Härtl
ffb916a48a Merge pull request #3938 from nextcloud/tests/isimplefile 2022-07-26 16:16:41 +02:00
Julius Härtl
3f78ee72b4 Merge pull request #3803 from nextcloud/bugfix/noid/icon-css
SCSS cleanup
2022-07-25 19:51:01 +02:00
Julius Härtl
2d41ce0ae7 Fix tests running against 25 with adjusted ISimpleFile methods
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-07-25 19:48:27 +02:00
Julius Härtl
484a47e0fd Merge pull request #3933 from nextcloud/dependabot/npm_and_yarn/master/nextcloud/dialogs-3.1.4
Bump @nextcloud/dialogs from 3.1.2 to 3.1.4
2022-07-25 09:13:39 +02:00
dependabot[bot]
09d67f1c05 Bump dompurify from 2.3.9 to 2.3.10
Bumps [dompurify](https://github.com/cure53/DOMPurify) from 2.3.9 to 2.3.10.
- [Release notes](https://github.com/cure53/DOMPurify/releases)
- [Commits](https://github.com/cure53/DOMPurify/compare/2.3.9...2.3.10)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-25 09:13:23 +02:00
Julius Härtl
167ca9a595 Merge pull request #3935 from nextcloud/dependabot/npm_and_yarn/master/cypress-10.3.1
Bump cypress from 10.3.0 to 10.3.1
2022-07-25 07:53:49 +02:00
Julius Härtl
6d9df29a4e Merge pull request #3934 from nextcloud/dependabot/npm_and_yarn/master/vue-and-vue-template-compiler-2.7.8
Bump vue and vue-template-compiler
2022-07-25 07:51:00 +02:00
Nextcloud bot
5ef7ca7723 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-07-25 02:39:08 +00:00
Nextcloud bot
bac0313d7c [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-07-24 02:40:46 +00:00
Nextcloud bot
af64824733 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-07-23 02:38:33 +00:00
dependabot[bot]
ad490ce006 Bump cypress from 10.3.0 to 10.3.1
Bumps [cypress](https://github.com/cypress-io/cypress) from 10.3.0 to 10.3.1.
- [Release notes](https://github.com/cypress-io/cypress/releases)
- [Changelog](https://github.com/cypress-io/cypress/blob/develop/.releaserc.base.js)
- [Commits](https://github.com/cypress-io/cypress/compare/v10.3.0...v10.3.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-23 01:03:36 +00:00
dependabot[bot]
ff4de2c77b Bump vue and vue-template-compiler
Bumps [vue](https://github.com/vuejs/core) and [vue-template-compiler](https://github.com/vuejs/vue). These dependencies needed to be updated together.

Updates `vue` from 2.7.6 to 2.7.8
- [Release notes](https://github.com/vuejs/core/releases)
- [Changelog](https://github.com/vuejs/core/blob/main/CHANGELOG.md)
- [Commits](https://github.com/vuejs/core/commits)

Updates `vue-template-compiler` from 2.7.6 to 2.7.8
- [Release notes](https://github.com/vuejs/vue/releases)
- [Changelog](https://github.com/vuejs/vue/blob/main/CHANGELOG.md)
- [Commits](https://github.com/vuejs/vue/compare/v2.7.6...v2.7.8)

---
updated-dependencies:
- dependency-name: vue
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: vue-template-compiler
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-23 01:03:24 +00:00
dependabot[bot]
bc542aad12 Bump @nextcloud/dialogs from 3.1.2 to 3.1.4
Bumps [@nextcloud/dialogs](https://github.com/nextcloud/nextcloud-dialogs) from 3.1.2 to 3.1.4.
- [Release notes](https://github.com/nextcloud/nextcloud-dialogs/releases)
- [Changelog](https://github.com/nextcloud/nextcloud-dialogs/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nextcloud/nextcloud-dialogs/compare/v3.1.2...v3.1.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-23 01:03:23 +00:00
dependabot[bot]
1211077dc8 Bump @babel/runtime from 7.18.6 to 7.18.9
Bumps [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.18.6 to 7.18.9.
- [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.18.9/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>
2022-07-23 01:02:10 +00:00
Julius Härtl
9de6a61ea5 Move to vue-material-design-icons
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-07-22 11:39:16 +02:00
Julius Härtl
cc1f059950 Merge pull request #3928 from nextcloud/bugfix/server/32350/rename-settings
Rename settings to deck settings
2022-07-21 17:48:01 +02:00
Vincent Petry
ef3a754033 Rename settings to deck settings
Signed-off-by: Vincent Petry <vincent@nextcloud.com>
2022-07-21 15:22:18 +02:00
Nextcloud bot
e24bd88971 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-07-21 02:38:51 +00:00
dependabot[bot]
caf2193a0f Bump terser from 5.9.0 to 5.14.2
Bumps [terser](https://github.com/terser/terser) from 5.9.0 to 5.14.2.
- [Release notes](https://github.com/terser/terser/releases)
- [Changelog](https://github.com/terser/terser/blob/master/CHANGELOG.md)
- [Commits](https://github.com/terser/terser/commits)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-20 11:45:11 +00:00
Julius Härtl
cb27f36f66 Move global deck icon to plain css
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-07-20 08:58:48 +02:00
Nextcloud bot
6ec8e7ac3b [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-07-19 02:37:58 +00:00
Julius Härtl
dd566ee112 Merge pull request #3924 from nextcloud/bugfix/noid/skip-content
Set ids to skip to content/navigation
2022-07-18 11:10:05 +02:00
Julius Härtl
7f230f2999 Set ids to skip to content/navigation
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-07-18 09:48:02 +02:00
Nextcloud bot
48d8e2f453 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-07-18 02:37:14 +00:00
Julius Härtl
865842e5b8 Merge pull request #3923 from nextcloud/dependabot/npm_and_yarn/master/vue-and-vue-template-compiler-2.7.6
Bump vue and vue-template-compiler
2022-07-16 09:41:08 +02:00
Julius Härtl
fda26f521f Merge pull request #3921 from nextcloud/dependabot/npm_and_yarn/master/dompurify-2.3.9
Bump dompurify from 2.3.8 to 2.3.9
2022-07-16 09:40:48 +02:00
Julius Härtl
70e35f77bf Merge pull request #3922 from nextcloud/dependabot/npm_and_yarn/master/jest-28.1.3
Bump jest from 28.1.2 to 28.1.3
2022-07-16 09:40:39 +02:00
Julius Härtl
0af348fb02 Merge pull request #3813 from nextcloud/bugfix/noid/rename-accessibility
Make rename functions accessibly by keyboard navigation
2022-07-16 09:21:14 +02:00
dependabot[bot]
b67ae13f3c Bump vue and vue-template-compiler
Bumps [vue](https://github.com/vuejs/core) and [vue-template-compiler](https://github.com/vuejs/vue). These dependencies needed to be updated together.

Updates `vue` from 2.7.3 to 2.7.6
- [Release notes](https://github.com/vuejs/core/releases)
- [Changelog](https://github.com/vuejs/core/blob/main/CHANGELOG.md)
- [Commits](https://github.com/vuejs/core/commits)

Updates `vue-template-compiler` from 2.7.3 to 2.7.6
- [Release notes](https://github.com/vuejs/vue/releases)
- [Changelog](https://github.com/vuejs/vue/blob/main/CHANGELOG.md)
- [Commits](https://github.com/vuejs/vue/compare/v2.7.3...v2.7.6)

---
updated-dependencies:
- dependency-name: vue
  dependency-type: direct:production
  update-type: version-update:semver-patch
- dependency-name: vue-template-compiler
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-16 01:03:37 +00:00
dependabot[bot]
d9252e37b3 Bump jest from 28.1.2 to 28.1.3
Bumps [jest](https://github.com/facebook/jest/tree/HEAD/packages/jest) from 28.1.2 to 28.1.3.
- [Release notes](https://github.com/facebook/jest/releases)
- [Changelog](https://github.com/facebook/jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/jest/commits/v28.1.3/packages/jest)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-16 01:03:13 +00:00
dependabot[bot]
3b6e3d636d Bump dompurify from 2.3.8 to 2.3.9
Bumps [dompurify](https://github.com/cure53/DOMPurify) from 2.3.8 to 2.3.9.
- [Release notes](https://github.com/cure53/DOMPurify/releases)
- [Commits](https://github.com/cure53/DOMPurify/compare/2.3.8...2.3.9)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-16 01:03:04 +00:00
Nextcloud bot
0443ca3185 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-07-14 02:37:42 +00:00
Julius Härtl
01e2708233 Merge pull request #3916 from nextcloud/fix/2594/click-event-on-drag-end
Prevent opening card and applyLabelFilter on card drag end
2022-07-12 13:55:20 +02:00
Julien Veyssier
9d3f09fafa refs #2594 prevent opening card and applyLabelFilter on card drag end
Signed-off-by: Julien Veyssier <eneiluj@posteo.net>
2022-07-12 12:47:30 +02:00
Julius Härtl
22a208e505 Merge pull request #3910 from nextcloud/tests/php-paths
Limit php tests to certain fails on pull requests
2022-07-12 09:28:18 +02:00
dependabot[bot]
cbc26cd135 Merge pull request #3915 from nextcloud/dependabot/composer/tests/integration/behat/behat-approx-3.11.0 2022-07-09 04:32:39 +00:00
dependabot[bot]
8c5c7d13b8 Merge pull request #3914 from nextcloud/dependabot/github_actions/shivammathur/setup-php-2.20.1 2022-07-09 03:58:08 +00:00
dependabot[bot]
7e042c9dab Merge pull request #3913 from nextcloud/dependabot/npm_and_yarn/master/nextcloud/webpack-vue-config-5.2.1 2022-07-09 03:17:31 +00:00
dependabot[bot]
4a744bac5c Update behat/behat requirement in /tests/integration
Updates the requirements on [behat/behat](https://github.com/Behat/Behat) to permit the latest version.
- [Release notes](https://github.com/Behat/Behat/releases)
- [Changelog](https://github.com/Behat/Behat/blob/master/CHANGELOG.md)
- [Commits](https://github.com/Behat/Behat/compare/v3.10.0...v3.11.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-09 02:07:59 +00:00
dependabot[bot]
89c22acb95 Bump shivammathur/setup-php from 2.19.1 to 2.20.1
Bumps [shivammathur/setup-php](https://github.com/shivammathur/setup-php) from 2.19.1 to 2.20.1.
- [Release notes](https://github.com/shivammathur/setup-php/releases)
- [Commits](https://github.com/shivammathur/setup-php/compare/2.19.1...2.20.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-09 01:04:58 +00:00
dependabot[bot]
007ed35a66 Bump @nextcloud/webpack-vue-config from 5.1.0 to 5.2.1
Bumps [@nextcloud/webpack-vue-config](https://github.com/nextcloud/webpack-vue-config) from 5.1.0 to 5.2.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.1.0...v5.2.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>
2022-07-09 01:02:59 +00:00
Nextcloud bot
2bb0e268c8 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-07-08 02:37:14 +00:00
Julius Härtl
d6c7601a14 Merge pull request #3578 from nextcloud/dependabot/npm_and_yarn/master/p-queue-7.2.0
Bump p-queue from 6.6.2 to 7.2.0
2022-07-07 09:17:56 +02:00
dependabot[bot]
a79ec6c5ed Bump p-queue from 6.6.2 to 7.2.0
Bumps [p-queue](https://github.com/sindresorhus/p-queue) from 6.6.2 to 7.2.0.
- [Release notes](https://github.com/sindresorhus/p-queue/releases)
- [Commits](https://github.com/sindresorhus/p-queue/compare/v6.6.2...v7.2.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-07 09:05:55 +02:00
Julius Härtl
4eea383f74 Limit php tests to certain fails on pull requests
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-07-07 08:58:28 +02:00
Julius Härtl
45746fbf34 Merge pull request #3895 from nextcloud/dependabot/npm_and_yarn/master/cypress-10.3.0
build(deps-dev): Bump cypress from 9.7.0 to 10.3.0
2022-07-07 08:56:54 +02:00
Julius Härtl
7ac40d2d99 Bump cypress action
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-07-07 08:45:46 +02:00
Julius Härtl
bebd157586 Merge pull request #3818 from nextcloud/enh/collaboration-event
Move to OCP\Collaboration\Resources\LoadAdditionalScriptsEvent
2022-07-07 08:41:51 +02:00
dependabot[bot]
02a6fa7418 Merge pull request #3909 from nextcloud/dependabot/npm_and_yarn/moment-2.29.4 2022-07-06 21:58:10 +00:00
dependabot[bot]
bc16421b64 build(deps): Bump moment from 2.29.3 to 2.29.4
Bumps [moment](https://github.com/moment/moment) from 2.29.3 to 2.29.4.
- [Release notes](https://github.com/moment/moment/releases)
- [Changelog](https://github.com/moment/moment/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/moment/moment/compare/2.29.3...2.29.4)

---
updated-dependencies:
- dependency-name: moment
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-06 21:51:23 +00:00
dependabot[bot]
bcc4cf8b57 Merge pull request #3902 from nextcloud/dependabot/npm_and_yarn/master/vue-2.7.2 2022-07-06 21:50:45 +00:00
Julius Härtl
d7418c7ad1 Bump vue-template-compiler to 2.7.3
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-07-06 23:42:38 +02:00
Julius Härtl
c7fb25e3f8 Adapt cypress config and file names
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-07-06 23:37:39 +02:00
Julius Härtl
9e26af66bf Move to OCP\Collaboration\Resources\LoadAdditionalScriptsEvent
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-07-06 23:24:07 +02:00
Nextcloud bot
b741ea79e5 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-07-06 02:35:53 +00:00
dependabot[bot]
7d2f5065be Merge pull request #3891 from nextcloud/dependabot/composer/vimeo/psalm-4.24.0 2022-07-05 21:21:09 +00:00
dependabot[bot]
a9e7f94409 build(deps): Bump vue from 2.6.14 to 2.7.2
Bumps [vue](https://github.com/vuejs/core) from 2.6.14 to 2.7.2.
- [Release notes](https://github.com/vuejs/core/releases)
- [Changelog](https://github.com/vuejs/core/blob/main/CHANGELOG.md)
- [Commits](https://github.com/vuejs/core/commits)

---
updated-dependencies:
- dependency-name: vue
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-05 21:13:05 +00:00
dependabot[bot]
d3be13182d build(deps-dev): Bump cypress from 9.7.0 to 10.3.0
Bumps [cypress](https://github.com/cypress-io/cypress) from 9.7.0 to 10.3.0.
- [Release notes](https://github.com/cypress-io/cypress/releases)
- [Changelog](https://github.com/cypress-io/cypress/blob/develop/.releaserc.base.js)
- [Commits](https://github.com/cypress-io/cypress/compare/v9.7.0...v10.3.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-05 21:12:22 +00:00
dependabot[bot]
a4658be5b6 Merge pull request #3863 from nextcloud/dependabot/npm_and_yarn/master/jest-28.1.1 2022-07-05 21:10:34 +00:00
Julius Härtl
b3f252ee46 Make rename functions accessibly by keyboard navigation
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-07-05 22:48:38 +02:00
Julius Härtl
f98b5764ea Ensure that lists have a title
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-07-05 22:20:59 +02:00
dependabot[bot]
9f8fcec1ad build(deps-dev): Bump jest from 28.1.0 to 28.1.1
Bumps [jest](https://github.com/facebook/jest/tree/HEAD/packages/jest) from 28.1.0 to 28.1.1.
- [Release notes](https://github.com/facebook/jest/releases)
- [Changelog](https://github.com/facebook/jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/jest/commits/v28.1.1/packages/jest)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-05 20:16:29 +00:00
dependabot[bot]
deb4b71e7b build(deps-dev): Bump vimeo/psalm from 4.23.0 to 4.24.0
Bumps [vimeo/psalm](https://github.com/vimeo/psalm) from 4.23.0 to 4.24.0.
- [Release notes](https://github.com/vimeo/psalm/releases)
- [Commits](https://github.com/vimeo/psalm/compare/4.23.0...4.24.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-05 20:15:51 +00:00
Julius Härtl
90a2b07e5f Merge pull request #3868 from nextcloud/feat/workflow-auto-update-command-rebase.yml
Updating command-rebase.yml workflow from template
2022-07-05 22:15:10 +02:00
Julius Härtl
e69f909b61 Merge pull request #3872 from wiktor2200/patch-1
fix(docs): fix links to JSON schemas for Trello
2022-07-05 22:14:33 +02:00
Julius Härtl
0686575484 Merge pull request #3898 from q-wertz/master
Switch to 'markdown-it-task-checkbox' for rendering of task lists
2022-07-05 22:13:58 +02:00
q-wertz
c7cadedd21 Merge branch 'master' into master 2022-07-05 15:06:08 +02:00
q-wertz
78d41878e8 Update package-lock.json
Signed-off-by: q-wertz <clemens.sonnleitner@web.de>
2022-07-05 15:05:59 +02:00
Julius Härtl
a527ccd8ed Merge pull request #3894 from nextcloud/dependabot/npm_and_yarn/master/babel/runtime-7.18.6
build(deps): Bump @babel/runtime from 7.18.3 to 7.18.6
2022-07-05 14:40:27 +02:00
Julius Härtl
5f5f745892 Merge pull request #3832 from nextcloud/dependabot/npm_and_yarn/master/vue-router-3.5.4
build(deps): Bump vue-router from 3.5.3 to 3.5.4
2022-07-05 14:40:06 +02:00
wiktor2200
6160d67032 fix(docs): fix links to JSON schemas for Trello
Link in docs was wrong, missing dir: `Importer/`
2022-07-05 14:34:50 +02:00
q-wertz
641341d75d Switch to 'markdown-it-task-checkbox' for rendering of task lists
Signed-off-by: q-wertz <clemens.sonnleitner@web.de>
2022-07-05 12:42:55 +02:00
Julius Härtl
146af217a0 Merge pull request #3833 from flummer/master
Fix for issue #3637
2022-07-05 12:41:22 +02:00
dependabot[bot]
4a0410b609 Merge pull request #3896 from nextcloud/dependabot/composer/tests/integration/sabre/dav-4.4.0 2022-07-05 07:42:23 +00:00
dependabot[bot]
e858a42455 Merge pull request #3879 from nextcloud/dependabot/composer/phpunit/phpunit-9.5.21 2022-07-05 07:38:39 +00:00
dependabot[bot]
b037cb0e82 build(deps-dev): Update sabre/dav requirement in /tests/integration
Updates the requirements on [sabre/dav](https://github.com/sabre-io/dav) to permit the latest version.
- [Release notes](https://github.com/sabre-io/dav/releases)
- [Changelog](https://github.com/sabre-io/dav/blob/master/CHANGELOG.md)
- [Commits](https://github.com/sabre-io/dav/compare/4.3.1...4.4.0)

---
updated-dependencies:
- dependency-name: sabre/dav
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-05 07:30:25 +00:00
dependabot[bot]
5455b436f6 build(deps-dev): Bump phpunit/phpunit from 9.5.20 to 9.5.21
Bumps [phpunit/phpunit](https://github.com/sebastianbergmann/phpunit) from 9.5.20 to 9.5.21.
- [Release notes](https://github.com/sebastianbergmann/phpunit/releases)
- [Changelog](https://github.com/sebastianbergmann/phpunit/blob/main/ChangeLog-9.5.md)
- [Commits](https://github.com/sebastianbergmann/phpunit/compare/9.5.20...9.5.21)

---
updated-dependencies:
- dependency-name: phpunit/phpunit
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-05 07:30:05 +00:00
dependabot[bot]
786e13b0b7 Merge pull request #3881 from nextcloud/dependabot/composer/tests/integration/guzzlehttp/guzzle-7.4.5 2022-07-05 07:29:11 +00:00
dependabot[bot]
759fb1bcbc build(deps-dev): Update guzzlehttp/guzzle requirement
Updates the requirements on [guzzlehttp/guzzle](https://github.com/guzzle/guzzle) to permit the latest version.
- [Release notes](https://github.com/guzzle/guzzle/releases)
- [Changelog](https://github.com/guzzle/guzzle/blob/master/CHANGELOG.md)
- [Commits](https://github.com/guzzle/guzzle/compare/7.4.3...7.4.5)

---
updated-dependencies:
- dependency-name: guzzlehttp/guzzle
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-07-05 09:19:55 +02:00
Julius Härtl
227c962ec4 Merge pull request #3900 from nextcloud/tests/static-circles
Fix static analysis by stubbing more circle methods
2022-07-05 09:14:15 +02:00
Julius Härtl
f03ffd13a0 Fix static analysis by stubbing more circle methods
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-07-05 08:30:40 +02:00
Julius Härtl
00120a6b37 Merge pull request #3865 from nextcloud/dependabot/github_actions/shivammathur/setup-php-2.19.1
build(deps): Bump shivammathur/setup-php from 2.19.0 to 2.19.1
2022-07-04 17:05:36 +02:00
Nextcloud bot
884121bdae [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-07-04 02:35:47 +00:00
Nextcloud bot
48b92ce0b1 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-07-02 02:37:21 +00:00
dependabot[bot]
f8e1326837 build(deps): Bump @babel/runtime from 7.18.3 to 7.18.6
Bumps [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.18.3 to 7.18.6.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.18.6/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>
2022-07-02 02:08:46 +00:00
Raul Ferreira Fuentes
00cf15935b Merge pull request #3884 from nextcloud/enh/fix_sidebar
Fix z-index for deck sidebar
2022-06-28 14:39:40 +02:00
Raul
172ee5a228 Fix z-index for deck sidebar
The sidebar would previously render above the user menu (logout, settings, etc)

Signed-off-by: Raul <r.ferreira.fuentes@gmail.com>
2022-06-28 14:10:17 +02:00
Nextcloud bot
2f2a43e9c6 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-06-22 02:40:24 +00:00
Nextcloud bot
a9e32dfc99 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-06-14 02:41:50 +00:00
Nextcloud bot
5450b0fd0b [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-06-12 02:41:02 +00:00
Nextcloud bot
e09581aa78 Updating command-rebase.yml workflow from template
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-06-11 15:14:59 +00:00
dependabot[bot]
e08a8ff132 build(deps): Bump shivammathur/setup-php from 2.19.0 to 2.19.1
Bumps [shivammathur/setup-php](https://github.com/shivammathur/setup-php) from 2.19.0 to 2.19.1.
- [Release notes](https://github.com/shivammathur/setup-php/releases)
- [Commits](https://github.com/shivammathur/setup-php/compare/2.19.0...2.19.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-11 01:04:11 +00:00
Matheus Stolf
8ee0a0fad0 Inserted required property in the rename list field, to prevent the list from being unnamed 2022-06-10 08:24:01 -03:00
Nextcloud bot
4b3ed4f43d [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-06-09 02:45:30 +00:00
Nextcloud bot
6ed2e11730 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-06-07 02:44:05 +00:00
Julius Härtl
e784dafefe Merge pull request #3853 from nextcloud/dependabot/github_actions/shivammathur/setup-php-2.19.0
build(deps): Bump shivammathur/setup-php from 2.18.1 to 2.19.0
2022-06-04 14:25:07 +02:00
dependabot[bot]
6cdc6f7bdb build(deps): Bump shivammathur/setup-php from 2.18.1 to 2.19.0
Bumps [shivammathur/setup-php](https://github.com/shivammathur/setup-php) from 2.18.1 to 2.19.0.
- [Release notes](https://github.com/shivammathur/setup-php/releases)
- [Commits](https://github.com/shivammathur/setup-php/compare/2.18.1...2.19.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-04 01:10:29 +00:00
Nextcloud bot
60a7a7cf94 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-06-03 02:47:50 +00:00
Nextcloud bot
765c0ea17c [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-06-02 02:47:07 +00:00
Julius Härtl
de7de4cd8a Merge pull request #3839 from nextcloud/dependabot/composer/tests/integration/guzzlehttp/guzzle-7.4.3
build(deps-dev): Update guzzlehttp/guzzle requirement from 7.4.2 to 7.4.3 in /tests/integration
2022-05-30 19:23:43 +02:00
Julius Härtl
19473ddba9 Merge pull request #3841 from nextcloud/dependabot/npm_and_yarn/master/babel/runtime-7.18.3
build(deps): Bump @babel/runtime from 7.17.9 to 7.18.3
2022-05-30 19:23:33 +02:00
Julius Härtl
14421b533d Merge pull request #3840 from nextcloud/dependabot/npm_and_yarn/master/cypress-9.7.0
build(deps-dev): Bump cypress from 9.6.1 to 9.7.0
2022-05-30 19:23:26 +02:00
Nextcloud bot
21fc5d590f [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-05-29 02:46:51 +00:00
dependabot[bot]
24651db512 build(deps): Bump @babel/runtime from 7.17.9 to 7.18.3
Bumps [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.17.9 to 7.18.3.
- [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.18.3/packages/babel-runtime)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-28 03:33:11 +00:00
dependabot[bot]
27644bd032 build(deps-dev): Bump cypress from 9.6.1 to 9.7.0
Bumps [cypress](https://github.com/cypress-io/cypress) from 9.6.1 to 9.7.0.
- [Release notes](https://github.com/cypress-io/cypress/releases)
- [Changelog](https://github.com/cypress-io/cypress/blob/develop/.releaserc.base.js)
- [Commits](https://github.com/cypress-io/cypress/compare/v9.6.1...v9.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>
2022-05-28 03:00:55 +00:00
Nextcloud bot
0c2e7fae9f [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-05-28 02:43:22 +00:00
dependabot[bot]
9d4824bb23 build(deps-dev): Update guzzlehttp/guzzle requirement
Updates the requirements on [guzzlehttp/guzzle](https://github.com/guzzle/guzzle) to permit the latest version.
- [Release notes](https://github.com/guzzle/guzzle/releases)
- [Changelog](https://github.com/guzzle/guzzle/blob/master/CHANGELOG.md)
- [Commits](https://github.com/guzzle/guzzle/compare/7.4.2...7.4.3)

---
updated-dependencies:
- dependency-name: guzzlehttp/guzzle
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-28 02:35:17 +00:00
Nextcloud bot
3b19b4212b [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-05-26 02:44:15 +00:00
Nextcloud bot
69c2b3ffbb [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-05-24 02:47:10 +00:00
Nextcloud bot
92ca6261b8 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-05-23 02:43:43 +00:00
Thomas Flummer
9e5e160845 Fix for issue #3637
Added padding on nested ul, to compensate for the negative margin on the containing li

Signed-off-by: Thomas Flummer <tf@flummer.net>
2022-05-22 11:31:22 +02:00
Nextcloud bot
6a66e920fe [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-05-22 02:43:38 +00:00
Nextcloud bot
cab9f6ab4e [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-05-21 02:47:11 +00:00
dependabot[bot]
0395f01c33 build(deps): Bump vue-router from 3.5.3 to 3.5.4
Bumps [vue-router](https://github.com/vuejs/router) from 3.5.3 to 3.5.4.
- [Release notes](https://github.com/vuejs/router/releases)
- [Changelog](https://github.com/vuejs/router/blob/main/CHANGELOG.md)
- [Commits](https://github.com/vuejs/router/commits)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-21 01:05:05 +00:00
Nextcloud bot
de88f17a1a [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-05-20 02:46:25 +00:00
Julius Härtl
9db8f9c924 Merge pull request #3820 from nextcloud/bugfix/3819
Improve filter popover accessibility
2022-05-18 14:46:23 +02:00
Julius Härtl
7328a27524 Merge pull request #3826 from nextcloud/dependabot/npm_and_yarn/master/cypress-9.6.1
build(deps-dev): Bump cypress from 9.6.0 to 9.6.1
2022-05-16 16:54:20 +02:00
Julien Veyssier
8ee41e9608 Merge pull request #3830 from nextcloud/enh/noid/readme-performance-limitations
Add performance section in README
2022-05-16 13:43:34 +02:00
Julien Veyssier
0ed6403141 add performance section in README
Signed-off-by: Julien Veyssier <eneiluj@posteo.net>
2022-05-16 13:05:34 +02:00
dependabot[bot]
6980661a8e Merge pull request #3824 from nextcloud/dependabot/npm_and_yarn/master/dompurify-2.3.8 2022-05-14 02:45:08 +00:00
dependabot[bot]
4797313f9e Merge pull request #3825 from nextcloud/dependabot/npm_and_yarn/master/nextcloud/l10n-1.6.0 2022-05-14 02:28:44 +00:00
dependabot[bot]
b17774da6e build(deps-dev): Bump cypress from 9.6.0 to 9.6.1
Bumps [cypress](https://github.com/cypress-io/cypress) from 9.6.0 to 9.6.1.
- [Release notes](https://github.com/cypress-io/cypress/releases)
- [Changelog](https://github.com/cypress-io/cypress/blob/develop/.releaserc.base.js)
- [Commits](https://github.com/cypress-io/cypress/compare/v9.6.0...v9.6.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-14 01:02:55 +00:00
dependabot[bot]
a4bba21610 build(deps): Bump @nextcloud/l10n from 1.4.1 to 1.6.0
Bumps [@nextcloud/l10n](https://github.com/nextcloud/nextcloud-l10n) from 1.4.1 to 1.6.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/commits)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-14 01:01:53 +00:00
dependabot[bot]
7e1d522601 build(deps): Bump dompurify from 2.3.6 to 2.3.8
Bumps [dompurify](https://github.com/cure53/DOMPurify) from 2.3.6 to 2.3.8.
- [Release notes](https://github.com/cure53/DOMPurify/releases)
- [Commits](https://github.com/cure53/DOMPurify/compare/2.3.6...2.3.8)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-14 01:01:34 +00:00
Julius Härtl
cd2225bbc8 Merge pull request #3823 from nextcloud/feat/workflow-auto-update-command-rebase.yml
Updating command-rebase.yml workflow from template
2022-05-13 21:21:19 +02:00
Nextcloud bot
62af22c928 Updating command-rebase.yml workflow from template
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-05-13 18:39:33 +00:00
Julius Härtl
2b531c5302 Merge pull request #3801 from nextcloud/cleanup/server-di
Switch from OC::$server->get to OCP\Server::get
2022-05-13 12:58:46 +02:00
Julius Härtl
41ed0cee1d Improve filter popover accessibility
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-05-13 12:40:05 +02:00
Julius Härtl
ce7da62a88 Revert lazy use of userId in ConfigService
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-05-13 11:52:21 +02:00
Julius Härtl
f93772ebc9 Merge pull request #3814 from nextcloud/enh/editorconfig
Fix editor config
2022-05-13 09:33:25 +02:00
Nextcloud bot
f63b052864 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-05-13 02:41:45 +00:00
Julius Härtl
43dbdd049f Merge pull request #3811 from Ben-Ro/Card-View_Duedate_delete-Icon_not_aligned_properly
Align Duedate-delete icon properly - fixes nextcloud/deck#3791
2022-05-12 16:53:52 +02:00
Julius Härtl
6a489eaaf3 Fix editor config
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-05-12 16:48:21 +02:00
Julius Härtl
3a783a722a Use SymfonyAdapter for legacy event
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-05-12 10:55:37 +02:00
Carl Schwan
44481e1c2a Switch from OC::$server->get to OCP\Server::get
And add a bit more typing to some classes + psalm issues

Signed-off-by: Carl Schwan <carl@carlschwan.eu>
2022-05-12 10:55:36 +02:00
ben
e3d1970369 Align Duedate-delete icon properly - fixes nextcloud/deck#3791
Signed-off-by: ben <ben@ro.tt>
2022-05-12 10:28:24 +02:00
Julius Härtl
2c7708dab1 Merge pull request #3809 from nextcloud/bugfix/cs-fix
Fix php-cs-fixer failure
2022-05-11 23:40:50 +02:00
Julius Härtl
e156ff77f8 Merge pull request #3808 from nextcloud/bugfix/eslint-root
Make eslint stop reading configs at the root
2022-05-11 22:03:45 +02:00
Julius Härtl
5f5f22ee8c Fix php-cs-fixer failure
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-05-11 21:47:05 +02:00
Julius Härtl
011b60b3bf Make eslint stop reading configs at the root
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-05-11 21:42:44 +02:00
Julius Härtl
9bd8669cf4 Merge pull request #3682 from nextcloud/bug/increase-file-count-after-sharing
Increase file count after sharing
2022-05-11 16:40:42 +02:00
Julius Härtl
4b5a47f127 Merge pull request #3696 from nextcloud/feature/setup-cypress-test
Setup cypress test
2022-05-11 16:08:18 +02:00
Julius Härtl
db45e7907c Merge pull request #3796 from ylebre/master
set last modified when the card was found. Fixes #3763
2022-05-11 16:04:55 +02:00
Julius Härtl
03f400620e Move all caching to helper
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-05-11 16:04:12 +02:00
Luka Trovic
d938a528c3 fix: integrate feedback
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2022-05-11 11:20:01 +01:00
Luka Trovic
2309749d15 fix: solve cypress tests issues
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2022-05-11 11:20:01 +01:00
Luka Trovic
b37b8eaeaf fix: cypress error fix
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2022-05-11 11:20:01 +01:00
Luka Trovic
9c57243d5a fix: solve merge conflicts related to cypress setup
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2022-05-11 11:20:01 +01:00
Luka Trovic
6518cd464c fix: resolve merge conflicts
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2022-05-11 11:20:01 +01:00
Julius Härtl
7e32a16969 Adapt login command to server master change
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-05-11 11:20:01 +01:00
Julius Härtl
349c94ee23 Try with port
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-05-11 11:20:01 +01:00
Yvo Brevoort
167774e3b0 set last modified when the card was found instead of trying to change it on the -1 index. 2022-05-10 09:30:08 +02:00
Luka Trovic
f2ba1bd4ab fix: make cypress tests pass
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2022-05-09 12:07:33 +01:00
Luka Trovic
3ce8041a12 fix: resolve merge conflicts
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2022-05-09 12:07:02 +01:00
Luka Trovic
a4bbf8f233 fix: solve cypress baseURL for deck app
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2022-05-09 12:05:43 +01:00
Luka Trovic
1b813c4ea2 feat: add github action
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2022-05-09 12:05:43 +01:00
Luka Trovic
e6c2d85197 tests: add cypress tests for deck dashboard, boards, lists, cards
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2022-05-09 12:05:43 +01:00
Luka Trovic
23ae20efe7 fix: solve merge conflicts
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2022-05-09 12:04:34 +01:00
Luka Trovic
37b3f03809 fix: resolve merge conflicts
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2022-05-09 11:51:39 +01:00
dependabot[bot]
43540b008c Merge pull request #3786 from nextcloud/dependabot/npm_and_yarn/master/jest-28.1.0 2022-05-07 05:42:19 +00:00
dependabot[bot]
169ccbb47f build(deps-dev): Bump jest from 28.0.3 to 28.1.0
Bumps [jest](https://github.com/facebook/jest/tree/HEAD/packages/jest) from 28.0.3 to 28.1.0.
- [Release notes](https://github.com/facebook/jest/releases)
- [Changelog](https://github.com/facebook/jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/jest/commits/v28.1.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>
2022-05-07 05:33:20 +00:00
dependabot[bot]
0af35817a6 Merge pull request #3789 from nextcloud/dependabot/npm_and_yarn/master/relative-ci/agent-3.1.3 2022-05-07 04:40:04 +00:00
dependabot[bot]
c942542079 Merge pull request #3790 from nextcloud/dependabot/npm_and_yarn/master/nextcloud-vue-collections-0.10.0 2022-05-07 02:57:53 +00:00
dependabot[bot]
8a6d8e0549 Merge pull request #3787 from nextcloud/dependabot/npm_and_yarn/master/markdown-it-13.0.1 2022-05-07 02:25:10 +00:00
dependabot[bot]
0c4dbebaeb build(deps-dev): Bump @relative-ci/agent from 3.1.2 to 3.1.3
Bumps [@relative-ci/agent](https://github.com/relative-ci/agent) from 3.1.2 to 3.1.3.
- [Release notes](https://github.com/relative-ci/agent/releases)
- [Commits](https://github.com/relative-ci/agent/compare/v3.1.2...v3.1.3)

---
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>
2022-05-07 02:13:55 +00:00
dependabot[bot]
5995ec299c Merge pull request #3788 from nextcloud/dependabot/npm_and_yarn/master/nextcloud/webpack-vue-config-5.1.0 2022-05-07 02:12:59 +00:00
dependabot[bot]
e2c82fe3dc Merge pull request #3785 from nextcloud/dependabot/composer/vimeo/psalm-4.23.0 2022-05-07 02:09:06 +00:00
dependabot[bot]
39f6c12d33 build(deps): Bump nextcloud-vue-collections from 0.9.0 to 0.10.0
Bumps [nextcloud-vue-collections](https://github.com/juliushaertl/nextcloud-vue-collections) from 0.9.0 to 0.10.0.
- [Release notes](https://github.com/juliushaertl/nextcloud-vue-collections/releases)
- [Commits](https://github.com/juliushaertl/nextcloud-vue-collections/compare/v0.9.0...v0.10.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>
2022-05-07 01:04:35 +00:00
dependabot[bot]
ae24d9ef03 build(deps-dev): Bump @nextcloud/webpack-vue-config from 5.0.0 to 5.1.0
Bumps [@nextcloud/webpack-vue-config](https://github.com/nextcloud/webpack-vue-config) from 5.0.0 to 5.1.0.
- [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.0.0...v5.1.0)

---
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>
2022-05-07 01:04:05 +00:00
dependabot[bot]
5a1f5757c1 build(deps): Bump markdown-it from 13.0.0 to 13.0.1
Bumps [markdown-it](https://github.com/markdown-it/markdown-it) from 13.0.0 to 13.0.1.
- [Release notes](https://github.com/markdown-it/markdown-it/releases)
- [Changelog](https://github.com/markdown-it/markdown-it/blob/master/CHANGELOG.md)
- [Commits](https://github.com/markdown-it/markdown-it/compare/13.0.0...13.0.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-07 01:04:03 +00:00
dependabot[bot]
b194b88c49 build(deps-dev): Bump vimeo/psalm from 4.22.0 to 4.23.0
Bumps [vimeo/psalm](https://github.com/vimeo/psalm) from 4.22.0 to 4.23.0.
- [Release notes](https://github.com/vimeo/psalm/releases)
- [Commits](https://github.com/vimeo/psalm/compare/4.22.0...4.23.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-07 01:01:09 +00:00
Raul Ferreira Fuentes
b86fbb3cd8 Merge pull request #3782 from nextcloud/enh/backend_serialization_models
Add CardDetail serialization model
2022-05-06 12:47:33 +02:00
Raul
9fca104059 Pipeline and codestyle fixes
Signed-off-by: Raul <raul@nextcloud.com>
2022-05-06 11:29:13 +02:00
Raul
9369a697e3 Add getDueDateTime function to expose the duedate in datetime format.
Signed-off-by: Raul <raul@nextcloud.com>
2022-05-06 11:29:13 +02:00
Raul
ebbafbe55d Add board summary model
Signed-off-by: Raul <raul@nextcloud.com>
2022-05-06 11:29:13 +02:00
Raul
6bf9ba397e Add phpDoc typehints for magic methods
Signed-off-by: Raul <raul@nextcloud.com>
2022-05-06 11:29:13 +02:00
Raul
7b7af75802 Update Card serialization (jsonSerialize usages) to use CardDetails model
Signed-off-by: Raul <raul@nextcloud.com>
2022-05-06 11:29:13 +02:00
Raul
723ce6c893 Add CardDetails model
Signed-off-by: Raul <raul@nextcloud.com>
2022-05-06 11:29:13 +02:00
Luka Trovic
ed3be361b5 fix: move shares count cache logic to the DeckShareProvider
Signed-off-by: Luka Trovic <luka@nextcloud.com>

fix: conflicts

Signed-off-by: Luka Trovic <luka@nextcloud.com>

fix: conflicts and test issues

Signed-off-by: Luka Trovic <luka@nextcloud.com>
2022-05-06 10:25:48 +02:00
Luka Trovic
0b6990f828 fix: update attachments count when sharing
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2022-05-06 10:24:32 +02:00
Luka Trovic
2af94410f5 fix: increase file count after sharing
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2022-05-06 10:24:32 +02:00
Nextcloud bot
b348565449 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-05-06 02:41:13 +00:00
Niedermann IT-Dienstleistungen
aa06255e26 Merge pull request #3783 from nextcloud/bugfix/noid/stack-find
Fix entity creation for stack from card id
2022-05-05 11:59:01 +02:00
Julius Härtl
a0d967cdc7 Fix entity creation for stack from card id
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-05-05 08:25:07 +02:00
Nextcloud bot
494a72709d [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-05-05 02:41:03 +00:00
Julius Härtl
8947cebf04 Merge pull request #3777 from nextcloud/bugfix/noid/clone-full-data
Fetch full board data after cloning
2022-05-04 12:29:05 +02:00
Nextcloud bot
b51993db0c [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-05-04 02:42:54 +00:00
Nextcloud bot
5c8f80a907 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-05-03 02:41:21 +00:00
Julius Härtl
9fab40d12a Fetch full board data after cloning
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-05-02 17:48:25 +02:00
Julius Härtl
420a5fa782 Forward-port changlog from 1.7.0
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-05-02 16:44:40 +02:00
Julius Härtl
fe335ea865 Merge pull request #3773 from nextcloud/dependabot/github_actions/cirrus-actions/rebase-1.6
build(deps): Bump cirrus-actions/rebase from 1.5 to 1.6
2022-05-02 16:38:38 +02:00
Julius Härtl
ad04a483e3 Merge pull request #3771 from nextcloud/dependabot/npm_and_yarn/master/jest-28.0.3
build(deps-dev): Bump jest from 27.5.1 to 28.0.3
2022-05-02 16:38:28 +02:00
dependabot[bot]
b3228f1e27 build(deps-dev): Bump jest from 27.5.1 to 28.0.3
Bumps [jest](https://github.com/facebook/jest/tree/HEAD/packages/jest) from 27.5.1 to 28.0.3.
- [Release notes](https://github.com/facebook/jest/releases)
- [Changelog](https://github.com/facebook/jest/blob/main/CHANGELOG.md)
- [Commits](https://github.com/facebook/jest/commits/v28.0.3/packages/jest)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-30 05:02:09 +00:00
dependabot[bot]
249935fc66 Merge pull request #3772 from nextcloud/dependabot/npm_and_yarn/master/nextcloud/axios-1.10.0 2022-04-30 05:01:00 +00:00
dependabot[bot]
53c0ccfba8 build(deps): Bump cirrus-actions/rebase from 1.5 to 1.6
Bumps [cirrus-actions/rebase](https://github.com/cirrus-actions/rebase) from 1.5 to 1.6.
- [Release notes](https://github.com/cirrus-actions/rebase/releases)
- [Commits](https://github.com/cirrus-actions/rebase/compare/1.5...1.6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-30 04:09:31 +00:00
dependabot[bot]
4706adb0d5 build(deps): Bump @nextcloud/axios from 1.9.0 to 1.10.0
Bumps [@nextcloud/axios](https://github.com/nextcloud/nextcloud-axios) from 1.9.0 to 1.10.0.
- [Release notes](https://github.com/nextcloud/nextcloud-axios/releases)
- [Changelog](https://github.com/nextcloud/nextcloud-axios/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nextcloud/nextcloud-axios/compare/v1.9.0...v1.10.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-30 03:11:10 +00:00
Nextcloud bot
53b6bf0986 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-04-30 02:39:54 +00:00
Julius Härtl
65d9a75421 Merge pull request #3761 from nextcloud/bugfix/3711
Fix text selection in dark mode and modal view
2022-04-29 11:32:53 +02:00
Julius Härtl
c089192904 Fix text selection in dark mode and modal view
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-04-29 11:10:08 +02:00
Julius Härtl
a8af3310b4 Merge pull request #3762 from nextcloud/bugfix/3744
Adapt the card modal to upstream changes
2022-04-29 10:47:10 +02:00
Julius Härtl
58e6989307 Merge pull request #3746 from nextcloud/dependabot/npm_and_yarn/master/nextcloud/eslint-config-8.0.0
build(deps-dev): Bump @nextcloud/eslint-config from 6.1.2 to 8.0.0
2022-04-29 09:10:26 +02:00
Nextcloud bot
18f7ea2a7e [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-04-29 02:41:06 +00:00
dependabot[bot]
4e8219c6fa build(deps-dev): Bump @nextcloud/eslint-config from 6.1.2 to 8.0.0
Bumps [@nextcloud/eslint-config](https://github.com/nextcloud/eslint-config) from 6.1.2 to 8.0.0.
- [Release notes](https://github.com/nextcloud/eslint-config/releases)
- [Changelog](https://github.com/nextcloud/eslint-config/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nextcloud/eslint-config/compare/v6.1.2...v8.0.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-28 15:04:26 +02:00
Julius Härtl
24f7ef69c7 Adapt modal size to viewer upstream changes
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-04-28 13:48:25 +02:00
rakekniven
1578c13bf5 Merge pull request #3759 from nextcloud/rakekniven-patch-1
l10n: Improved grammar regarding board transfer
2022-04-28 13:05:47 +02:00
rakekniven
ca2aa5d7f7 l10n: Improved grammar regarding board transfer
Reported at Transifex.

Signed-off-by: rakekniven <2069590+rakekniven@users.noreply.github.com>
2022-04-28 12:58:06 +02:00
Nextcloud bot
4d43f83443 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-04-28 02:41:20 +00:00
Julius Härtl
319869bc6d Merge pull request #3747 from nextcloud/dependabot/npm_and_yarn/master/markdown-it-13.0.0
build(deps): Bump markdown-it from 12.3.2 to 13.0.0
2022-04-26 18:58:41 +02:00
Julius Härtl
405fb52cb2 Merge pull request #3753 from nextcloud/feat/workflow-auto-update-command-rebase.yml
Updating command-rebase.yml workflow from template
2022-04-26 18:57:55 +02:00
Julius Härtl
76a6fad4e2 Merge pull request #3745 from nextcloud/bugfix/noid/missing-indices
Add missing indices
2022-04-26 18:26:00 +02:00
Nextcloud bot
47be49253b Updating command-rebase.yml workflow from template
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-04-26 14:54:17 +00:00
Nextcloud bot
5177c793a7 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-04-24 02:41:14 +00:00
dependabot[bot]
bb06ac0c42 Merge pull request #3749 from nextcloud/dependabot/npm_and_yarn/master/nextcloud/moment-1.2.1 2022-04-23 03:23:43 +00:00
dependabot[bot]
20668bef9e build(deps): Bump markdown-it from 12.3.2 to 13.0.0
Bumps [markdown-it](https://github.com/markdown-it/markdown-it) from 12.3.2 to 13.0.0.
- [Release notes](https://github.com/markdown-it/markdown-it/releases)
- [Changelog](https://github.com/markdown-it/markdown-it/blob/master/CHANGELOG.md)
- [Commits](https://github.com/markdown-it/markdown-it/compare/12.3.2...13.0.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-23 02:52:19 +00:00
dependabot[bot]
747f8d4567 Merge pull request #3748 from nextcloud/dependabot/npm_and_yarn/master/moment-2.29.3 2022-04-23 02:51:24 +00:00
Nextcloud bot
501927c844 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-04-23 02:39:27 +00:00
dependabot[bot]
d03ae91d11 build(deps): Bump @nextcloud/moment from 1.2.0 to 1.2.1
Bumps [@nextcloud/moment](https://github.com/nextcloud/nextcloud-moment) from 1.2.0 to 1.2.1.
- [Release notes](https://github.com/nextcloud/nextcloud-moment/releases)
- [Changelog](https://github.com/nextcloud/nextcloud-moment/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nextcloud/nextcloud-moment/compare/v1.2.0...v1.2.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-23 01:05:27 +00:00
dependabot[bot]
cc2f45f764 build(deps): Bump moment from 2.29.2 to 2.29.3
Bumps [moment](https://github.com/moment/moment) from 2.29.2 to 2.29.3.
- [Release notes](https://github.com/moment/moment/releases)
- [Changelog](https://github.com/moment/moment/blob/2.29.3/CHANGELOG.md)
- [Commits](https://github.com/moment/moment/compare/2.29.2...2.29.3)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-23 01:03:09 +00:00
Julius Härtl
713dcd5d08 Add missing indices
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-04-22 12:41:08 +02:00
Nextcloud bot
8b69c90bf1 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-04-22 02:40:25 +00:00
Julius Härtl
5513122ca9 Merge pull request #3681 from nextcloud/bug/cards-disappear-after-moving-to-other-list
Show cards after moving into another list
2022-04-20 16:24:02 +02:00
Julius Härtl
7507ac31f7 Merge pull request #3692 from nextcloud/bug/fix-hidden-attachment-icon-on-archived-cards
Fix hidden attachment icon on archived cards
2022-04-20 16:22:01 +02:00
Julius Härtl
49e51675d3 Merge pull request #3720 from nextcloud/bugfix/deck_mapper/use_qb_mapper
Update `DeckMapper` to extend `QBMapper`
2022-04-20 16:21:18 +02:00
Luka Trovic
056d54d313 fix: feedback
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2022-04-19 12:22:18 +02:00
Luka Trovic
00eac849fe fix: show card after moving into another list
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2022-04-19 12:22:18 +02:00
Julius Härtl
75a17dae2c Merge pull request #3727 from nextcloud/dependabot/github_actions/cirrus-actions/rebase-1.6
build(deps): Bump cirrus-actions/rebase from 1.5 to 1.6
2022-04-19 12:20:54 +02:00
Julius Härtl
62c81ac785 Merge pull request #3724 from nextcloud/update-master-version
Update version on master
2022-04-19 10:50:29 +02:00
Nextcloud bot
15c5170195 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-04-17 02:38:07 +00:00
dependabot[bot]
4b302c0330 Merge pull request #3726 from nextcloud/dependabot/github_actions/shivammathur/setup-php-2.18.1 2022-04-16 02:49:49 +00:00
dependabot[bot]
7977fa40e7 Merge pull request #3728 from nextcloud/dependabot/npm_and_yarn/async-2.6.4 2022-04-16 02:35:21 +00:00
dependabot[bot]
45c4c507bc build(deps): Bump async from 2.6.3 to 2.6.4
Bumps [async](https://github.com/caolan/async) from 2.6.3 to 2.6.4.
- [Release notes](https://github.com/caolan/async/releases)
- [Changelog](https://github.com/caolan/async/blob/v2.6.4/CHANGELOG.md)
- [Commits](https://github.com/caolan/async/compare/v2.6.3...v2.6.4)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-16 02:19:19 +00:00
dependabot[bot]
33f2e03e13 Merge pull request #3725 from nextcloud/dependabot/composer/justinrainbow/json-schema-5.2.12 2022-04-16 02:18:34 +00:00
dependabot[bot]
56391021a4 build(deps): Bump cirrus-actions/rebase from 1.5 to 1.6
Bumps [cirrus-actions/rebase](https://github.com/cirrus-actions/rebase) from 1.5 to 1.6.
- [Release notes](https://github.com/cirrus-actions/rebase/releases)
- [Commits](https://github.com/cirrus-actions/rebase/compare/1.5...1.6)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-16 01:07:43 +00:00
dependabot[bot]
ab831c2604 build(deps): Bump shivammathur/setup-php from 2.18.0 to 2.18.1
Bumps [shivammathur/setup-php](https://github.com/shivammathur/setup-php) from 2.18.0 to 2.18.1.
- [Release notes](https://github.com/shivammathur/setup-php/releases)
- [Commits](https://github.com/shivammathur/setup-php/compare/2.18.0...2.18.1)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-16 01:07:39 +00:00
dependabot[bot]
11fc4d88aa build(deps): Bump justinrainbow/json-schema from 5.2.11 to 5.2.12
Bumps [justinrainbow/json-schema](https://github.com/justinrainbow/json-schema) from 5.2.11 to 5.2.12.
- [Release notes](https://github.com/justinrainbow/json-schema/releases)
- [Commits](https://github.com/justinrainbow/json-schema/compare/5.2.11...5.2.12)

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

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-16 01:01:32 +00:00
Joas Schilling
57dd1982a0 Update version on master
Signed-off-by: Joas Schilling <coding@schilljs.com>
2022-04-14 23:22:54 +02:00
Raul
3f754dc662 Update AttachmentMapper finder methods to use $this-getTableName() instead of explicitly naming the table on the FROM parameters.
Signed-off-by: Raul <raul@nextcloud.com>
2022-04-14 16:56:22 +02:00
Raul
0c5b1a88a6 Run cs:fix
Signed-off-by: Raul <raul@nextcloud.com>
2022-04-13 12:43:00 +02:00
Raul
1d5fdef4b4 Remove redundant is_array checks on return result from LabelMapper::findAll
Signed-off-by: Raul <raul@nextcloud.com>
2022-04-13 12:40:05 +02:00
Raul
815b8597d1 Use numeric typehint instead of int to allow for numeric strings to be passed to find methods. Fixes the psalm check.
Signed-off-by: Raul <raul@nextcloud.com>
2022-04-13 12:39:39 +02:00
Raul
53e3a7ae7f Removed redundant phpDoc block from constructors
Signed-off-by: Raul <raul@nextcloud.com>
2022-04-13 10:43:14 +02:00
Raul
04974d37d6 Replace rowCount() with explicit count primitive function. This is necessary due to sqlite driver always returning 0 on rowCount (this is documented behaviour: https://www.php.net/manual/en/pdostatement.rowcount.php)
Signed-off-by: Raul <raul@nextcloud.com>
2022-04-13 10:38:32 +02:00
Raul Ferreira Fuentes
8c1e53a8df Fix test case which relied on mapper->delete() returning a bool value
Signed-off-by: Raul Ferreira Fuentes <raul@nextcloud.com>
2022-04-11 20:04:16 +02:00
Raul Ferreira Fuentes
8399b00a10 Fix Entity class in AclMapper
Signed-off-by: Raul Ferreira Fuentes <raul@nextcloud.com>
2022-04-11 19:46:05 +02:00
Raul Ferreira Fuentes
9244adee30 Various small fixes in mapper queries
Signed-off-by: Raul Ferreira Fuentes <raul@nextcloud.com>
2022-04-11 18:44:27 +02:00
Raul Ferreira Fuentes
3265a9de7b Merge branch 'master' into bugfix/deck_mapper/use_qb_mapper 2022-04-11 18:27:52 +02:00
Raul Ferreira Fuentes
ec602f3e15 Update DeckMapper to extend QBMapper instead of deprecated Mapper
Signed-off-by: Raul Ferreira Fuentes <raul@nextcloud.com>
2022-04-11 18:24:41 +02:00
estromenko
6ed7f672fc Make it possible to unarchive all archived cards
Signed-off-by: Eduard Stromenko <estromenko@mail.ru>
2022-04-11 15:57:58 +02:00
Luka Trovic
c9bb49e0f7 fix: hidden attachment icon on archived cards
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2022-04-05 18:29:47 +02:00
168 changed files with 37740 additions and 35035 deletions

View File

@@ -3,7 +3,10 @@ root = true
[*]
charset = utf-8
end_of_line = lf
indent_size = tab
indent_style = tab
insert_final_newline = true
trim_trailing_whitespace = true
[*.{js,vue}]
indent_style = tab

View File

@@ -1,4 +1,5 @@
module.exports = {
root: true,
extends: [
'@nextcloud',
],
@@ -7,6 +8,7 @@ module.exports = {
'jsdoc/require-param-type': ['off'],
'jsdoc/check-param-names': ['off'],
'jsdoc/no-undefined-types': ['off'],
'jsdoc/require-property-description' : ['off']
'jsdoc/require-property-description': ['off'],
'import/no-named-as-default-member': ['off']
},
}

View File

@@ -1,7 +1,11 @@
name: Package build
on:
pull_request:
push:
branches:
- main
- master
- stable*
jobs:
build:
@@ -20,7 +24,7 @@ jobs:
- name: Set up npm7
run: npm i -g npm@7
- name: Setup PHP
uses: shivammathur/setup-php@2.18.0
uses: shivammathur/setup-php@2.21.2
with:
php-version: '7.4'
tools: composer

View File

@@ -66,7 +66,7 @@ jobs:
run: npm i -g npm@"${{ steps.versions.outputs.npmVersion }}"
- name: Set up php ${{ env.PHP_VERSION }}
uses: shivammathur/setup-php@2.18.0
uses: shivammathur/setup-php@2.21.2
with:
php-version: ${{ env.PHP_VERSION }}
coverage: none

View File

@@ -9,9 +9,14 @@ on:
issue_comment:
types: created
permissions:
contents: read
jobs:
rebase:
runs-on: ubuntu-latest
permissions:
contents: none
# On pull requests and if the comment starts with `/rebase`
if: github.event.issue.pull_request != '' && startsWith(github.event.comment.body, '/rebase')
@@ -32,7 +37,7 @@ jobs:
token: ${{ secrets.COMMAND_BOT_PAT }}
- name: Automatic Rebase
uses: cirrus-actions/rebase@1.5
uses: cirrus-actions/rebase@1.7
env:
GITHUB_TOKEN: ${{ secrets.COMMAND_BOT_PAT }}

112
.github/workflows/cypress.yml vendored Normal file
View File

@@ -0,0 +1,112 @@
name: Cypress
on:
pull_request:
push:
branches:
- master
- stable*
env:
APP_NAME: deck
CYPRESS_baseUrl: http://localhost:8081/index.php
jobs:
cypress:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
node-version: [14.x]
# containers: [1, 2, 3]
php-versions: [ '7.4' ]
databases: [ 'sqlite' ]
server-versions: [ 'master' ]
steps:
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
- name: Set up npm7
run: npm i -g npm@7
- name: Checkout server
uses: actions/checkout@v3
with:
repository: nextcloud/server
ref: ${{ matrix.server-versions }}
- name: Checkout submodules
shell: bash
run: |
auth_header="$(git config --local --get http.https://github.com/.extraheader)"
git submodule sync --recursive
git -c "http.extraheader=$auth_header" -c protocol.version=2 submodule update --init --force --recursive --depth=1
- name: Checkout ${{ env.APP_NAME }}
uses: actions/checkout@v3
with:
path: apps/${{ env.APP_NAME }}
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@2.21.2
with:
php-version: ${{ matrix.php-versions }}
extensions: mbstring, iconv, fileinfo, intl, sqlite, pdo_sqlite, zip, gd, apcu
ini-values:
apc.enable_cli=on
coverage: none
- name: Set up Nextcloud
env:
DB_PORT: 4444
PHP_CLI_SERVER_WORKERS: 10
run: |
mkdir data
php 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
php occ config:system:set memcache.local --value="\\OC\\Memcache\\APCu"
php occ config:system:set debug --value=true --type=boolean
php -f index.php
php -S 0.0.0.0:8081 &
export OC_PASS=1234561
php occ user:add --password-from-env user1
php occ user:add --password-from-env user2
php occ app:enable deck
php occ app:list
cd apps/deck
composer install --no-dev
npm ci
npm run build
cd ../../
curl -v http://localhost:8081/index.php/login
- name: Cypress run
uses: cypress-io/github-action@v4
with:
record: true
parallel: false
wait-on: '${{ env.CYPRESS_baseUrl }}'
working-directory: 'apps/${{ env.APP_NAME }}'
config: defaultCommandTimeout=10000,video=false
env:
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
npm_package_name: ${{ env.APP_NAME }}
- name: Upload test failure screenshots
uses: actions/upload-artifact@v3
if: failure()
with:
name: Upload screenshots
path: apps/${{ env.APP_NAME }}/cypress/screenshots/
retention-days: 5
- name: Upload nextcloud logs
uses: actions/upload-artifact@v3
if: failure()
with:
name: Upload nextcloud log
path: data/nextcloud.log
retention-days: 5

View File

@@ -8,13 +8,20 @@ name: Dependabot
on:
pull_request_target:
branches:
- main
- master
- stable*
permissions:
contents: read
jobs:
auto-approve-merge:
if: github.actor == 'dependabot[bot]'
runs-on: ubuntu-latest
permissions:
# for hmarr/auto-approve-action to approve PRs
pull-requests: write
steps:
# Github actions bot approve

View File

@@ -2,6 +2,14 @@ name: Integration tests
on:
pull_request:
paths:
- '.github/workflows/integration.yml'
- 'appinfo/**'
- 'lib/**'
- 'templates/**'
- 'tests/**'
- 'composer.json'
- 'composer.lock'
push:
branches:
- master
@@ -19,7 +27,7 @@ jobs:
matrix:
php-versions: ['7.4']
databases: ['sqlite', 'mysql', 'pgsql']
server-versions: ['stable24']
server-versions: ['master']
name: php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }}
@@ -54,7 +62,7 @@ jobs:
auth_header="$(git config --local --get http.https://github.com/.extraheader)"
git submodule sync --recursive
git -c "http.extraheader=$auth_header" -c protocol.version=2 submodule update --init --force --recursive --depth=1
cd build/integration && composer require --dev phpunit/phpunit:~8
cd build/integration && composer require --dev phpunit/phpunit:~9
- name: Checkout app
uses: actions/checkout@v3
@@ -62,7 +70,7 @@ jobs:
path: apps/${{ env.APP_NAME }}
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@2.18.0
uses: shivammathur/setup-php@2.21.2
with:
php-version: ${{ matrix.php-versions }}
tools: phpunit
@@ -71,7 +79,7 @@ jobs:
- name: Set up PHPUnit
working-directory: apps/${{ env.APP_NAME }}
run: composer i
run: composer i --no-dev
- name: Set up Nextcloud
run: |

View File

@@ -19,7 +19,7 @@ jobs:
steps:
- uses: actions/checkout@v3
- name: Set up php${{ matrix.php-versions }}
uses: shivammathur/setup-php@2.18.0
uses: shivammathur/setup-php@2.21.2
with:
php-version: ${{ matrix.php-versions }}
coverage: none
@@ -33,7 +33,7 @@ jobs:
- name: Checkout
uses: actions/checkout@v3
- name: Set up php
uses: shivammathur/setup-php@2.18.0
uses: shivammathur/setup-php@2.21.2
with:
php-version: 7.4
coverage: none

View File

@@ -25,7 +25,7 @@ jobs:
- name: Set up npm7
run: npm i -g npm@7
- name: Setup PHP
uses: shivammathur/setup-php@2.18.0
uses: shivammathur/setup-php@2.21.2
with:
php-version: '7.4'
tools: composer

View File

@@ -2,6 +2,14 @@ name: PHPUnit
on:
pull_request:
paths:
- '.github/workflows/phpunit.yml'
- 'appinfo/**'
- 'lib/**'
- 'templates/**'
- 'tests/**'
- 'composer.json'
- 'composer.lock'
push:
branches:
- master
@@ -20,7 +28,7 @@ jobs:
matrix:
php-versions: ['7.4', '8.0', '8.1']
databases: ['sqlite', 'mysql', 'pgsql']
server-versions: ['stable24']
server-versions: ['master']
name: php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }}
@@ -62,7 +70,7 @@ jobs:
path: apps/${{ env.APP_NAME }}
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@2.18.0
uses: shivammathur/setup-php@2.21.2
with:
php-version: ${{ matrix.php-versions }}
tools: phpunit

View File

@@ -49,7 +49,7 @@ jobs:
continue-on-error: true
- name: Create Pull Request
uses: peter-evans/create-pull-request@v3
uses: peter-evans/create-pull-request@v4
with:
token: ${{ secrets.COMMAND_BOT_PAT }}
commit-message: Update psalm baseline

View File

@@ -1,6 +1,6 @@
[main]
host = https://www.transifex.com
lang_map = bg_BG: bg, cs_CZ: cs, fi_FI: fi, hu_HU: hu, nb_NO: nb, sk_SK: sk, th_TH: th, ja_JP: ja
lang_map = hu_HU: hu, nb_NO: nb, sk_SK: sk, th_TH: th, ja_JP: ja, bg_BG: bg, cs_CZ: cs, fi_FI: fi
[o:nextcloud:p:nextcloud:r:deck]
file_filter = translationfiles/<lang>/deck.po

View File

@@ -1,30 +1,45 @@
# Changelog
All notable changes to this project will be documented in this file.
## 1.7.2
## 1.8.0-beta.1
### Enhancements
- Nextcloud 25 compatibility
- Performance improvements
- Use capped memory cache for board permissions @juliushaertl [#3980](https://github.com/nextcloud/deck/pull/3980)
- Improve CalDAV integration performance @juliushaertl [#3982](https://github.com/nextcloud/deck/pull/3982)
- Simpify query for getting shared files @juliushaertl [#3983](https://github.com/nextcloud/deck/pull/3983)
- Accessibility improvements
- Add a11y label for sidebar button @marcelklehr [#3986](https://github.com/nextcloud/deck/pull/3986)
- Improve filter popover accessibility @juliushaertl [#3820](https://github.com/nextcloud/deck/pull/3820)
- Set ids to skip to content/navigation @juliushaertl [#3924](https://github.com/nextcloud/deck/pull/3924)
- Invert icons properly in dark mode @juliushaertl [#3939](https://github.com/nextcloud/deck/pull/3939)
- Bump dependencies
### Fixed
- Cache user membership for circles [#4132](https://github.com/nextcloud/deck/pull/4132)
- Set event link also for notifications that get emitted from activities [#4118](https://github.com/nextcloud/deck/pull/4118)
- Fix Card menu not displaying when description is not set [#4103](https://github.com/nextcloud/deck/pull/4103)
- disable Create card button while no stack is chosen [#4019](https://github.com/nextcloud/deck/pull/4019)
- to nextcloud/OCP package in stable24 [#4093](https://github.com/nextcloud/deck/pull/4093)
- Fix attachment creator name: show display name [#4037](https://github.com/nextcloud/deck/pull/4037)
- Use capped memory cache for board permissions [#3997](https://github.com/nextcloud/deck/pull/3997)
- Improve CalDAV integration performance [#3995](https://github.com/nextcloud/deck/pull/3995)
- Fetch attachment folder for the correct user during cron job [#3959](https://github.com/nextcloud/deck/pull/3959)
- Switch to 'markdown-it-task-checkbox' for rendering of task lists [#3925](https://github.com/nextcloud/deck/pull/3925)
- Prevent opening card and applyLabelFilter on card drag end [#3917](https://github.com/nextcloud/deck/pull/3917)
- Fix for issue #3637 [#3901](https://github.com/nextcloud/deck/pull/3901)
- Fix z-index for deck sidebar [#3885](https://github.com/nextcloud/deck/pull/3885)
- set last modified when the card was found. Fixes #3763 @ylebre [#3796](https://github.com/nextcloud/deck/pull/3796)
- Increase file count after sharing @luka-nextcloud [#3682](https://github.com/nextcloud/deck/pull/3682)
- Align Duedate-delete icon properly - fixes nextcloud/deck#3791 @Ben-Ro [#3811](https://github.com/nextcloud/deck/pull/3811)
- Fix for issue #3637 @flummer [#3833](https://github.com/nextcloud/deck/pull/3833)
- Switch to 'markdown-it-task-checkbox' for rendering of task lists @q-wertz [#3898](https://github.com/nextcloud/deck/pull/3898)
- Make rename functions accessibly by keyboard navigation @juliushaertl [#3813](https://github.com/nextcloud/deck/pull/3813)
- Prevent opening card and applyLabelFilter on card drag end @eneiluj [#3916](https://github.com/nextcloud/deck/pull/3916)
- Inserted required property in the rename list field, to prevent the l… @mstolf [#3862](https://github.com/nextcloud/deck/pull/3862)
- Fix share provider for master changes @nickvergessen [#3942](https://github.com/nextcloud/deck/pull/3942)
- Fetch attachment folder for the correct user during cron job @juliushaertl [#3952](https://github.com/nextcloud/deck/pull/3952)
- Fix z-index for deck sidebar @Raudius [#3884](https://github.com/nextcloud/deck/pull/3884)
## 1.7.1
### Other
### Fixed
- Align Duedate-delete icon properly - fixes nextcloud/deck#3791 [#3817](https://github.com/nextcloud/deck/pull/3817)
- Increase file count after sharing [#3806](https://github.com/nextcloud/deck/pull/3806)
- Fetch full board data after cloning [#3781](https://github.com/nextcloud/deck/pull/3781)
- Switch from OC::$server->get to OCP\Server::get @CarlSchwan [#3801](https://github.com/nextcloud/deck/pull/3801)
- Add performance section in README @eneiluj [#3830](https://github.com/nextcloud/deck/pull/3830)
- Fix static analysis by stubbing more circle methods @juliushaertl [#3900](https://github.com/nextcloud/deck/pull/3900)
- fix(docs): fix links to JSON schemas for Trello @wiktor2200 [#3872](https://github.com/nextcloud/deck/pull/3872)
- Move to OCP\Collaboration\Resources\LoadAdditionalScriptsEvent @juliushaertl [#3818](https://github.com/nextcloud/deck/pull/3818)
- Rename settings to deck settings @PVince81 [#3928](https://github.com/nextcloud/deck/pull/3928)
- SCSS cleanup @juliushaertl [#3803](https://github.com/nextcloud/deck/pull/3803)
- Hide deprecated projects in sidebar and card details by default @Pytal [#3984](https://github.com/nextcloud/deck/pull/3984)
## 1.7.0
@@ -76,7 +91,7 @@ All notable changes to this project will be documented in this file.
- Adapt the card modal to upstream changes [#3764](https://github.com/nextcloud/deck/pull/3764)
- Fix text selection in dark mode and modal view [#3765](https://github.com/nextcloud/deck/pull/3765)
- Add missing indices [#3754](https://github.com/nextcloud/deck/pull/3754)
- Handle qb mapper exception messages properly @juliushaertl [#3769](https://github.com/nextcloud/deck/pull/3769)
## 1.6.0-beta1

View File

@@ -30,6 +30,16 @@ build: clean-dist install-deps build-js
release: clean-dist install-deps-nodev build-js
lint: lint-js lint-php
lint-js:
npm run lint
npm run stylelint
lint-php:
composer run lint 1>/dev/null
composer run cs:check
build-js: install-deps-js
npm run build

View File

@@ -24,9 +24,9 @@ Deck is a kanban style organization tool aimed at personal planning and project
### 3rd-Party Integrations
- [trello-to-deck](https://github.com/maxammann/trello-to-deck) - Migrates cards from Trello
- [mail2deck](https://github.com/newroco/mail2deck) - Provides an "email in" solution
- [mail2deck](https://github.com/newroco/mail2deck) - Provides an "email in" solution
- [A-deck](https://github.com/leoossa/A-deck) - Chrome Extension that allows to create new card in selected stack based on current tab
## Installation/Update
This app is supposed to work on the two latest Nextcloud versions.
@@ -52,14 +52,32 @@ Please make sure you have installed the following dependencies: `make, which, ta
Instead of setting everything up manually, you can just [download the nightly build](https://github.com/nextcloud/deck/releases/tag/nightly) instead. These builds are updated every 24 hours, and are pre-configured with all the needed dependencies.
## Performance limitations
Deck is not yet ready for intensive usage.
A lot of database queries are generated when the number of boards, cards and attachments is high.
For example, a user having access to 13 boards, with each board having on average 100 cards,
and each card having on average 5 attachments,
would generate 6500 database queries when doing the file related queries
which would increase the page loading time significantly.
Improvements on Nextcloud server and Deck itself will improve the situation.
## Developing
### Nextcloud environment
You need to setup a [development environment](https://docs.nextcloud.com/server/latest/developer_manual//getting_started/devenv.html) of the current nextcloud version. You can also alternatively install & run the [nextcloud docker container](https://github.com/juliushaertl/nextcloud-docker-dev).
After the finished installation, you can clone the deck project directly in the `/[nextcloud-docker-dev-dir]/workspace/server/apps/` folder.
### PHP
Nothing to prepare, just dig into the code.
### JavaScript
This requires at least Node 16 and npm 7 to be installed.
Deck requires running a `make build-js` to install npm dependencies and build the JavaScript code using webpack. While developing you can also use `make watch` to rebuild everytime the code changes.
#### Hot reloading

View File

@@ -16,7 +16,7 @@
- 🚀 Get your project organized
</description>
<version>1.7.2</version>
<version>1.9.0-beta.1</version>
<licence>agpl</licence>
<author>Julius Härtl</author>
<namespace>Deck</namespace>
@@ -34,7 +34,7 @@
<database min-version="9.4">pgsql</database>
<database>sqlite</database>
<database min-version="8.0">mysql</database>
<nextcloud min-version="24" max-version="24"/>
<nextcloud min-version="26" max-version="26"/>
</dependencies>
<background-jobs>
<job>OCA\Deck\Cron\DeleteCron</job>

View File

@@ -19,7 +19,7 @@
"symfony/event-dispatcher": "^4.0",
"vimeo/psalm": "^4.3",
"php-parallel-lint/php-parallel-lint": "^1.2",
"nextcloud/ocp": "dev-stable24"
"nextcloud/ocp": "dev-master"
},
"config": {
"optimize-autoloader": true,
@@ -36,6 +36,7 @@
"cs:check": "php-cs-fixer fix --dry-run --diff",
"cs:fix": "php-cs-fixer fix",
"psalm": "psalm",
"psalm:update-baseline": "psalm --update-baseline",
"psalm:fix": "psalm --alter --issues=InvalidReturnType,InvalidNullableReturnType,MismatchingDocblockParamType,MismatchingDocblockReturnType,MissingParamType,InvalidFalsableReturnType",
"test": [
"@test:unit",

421
composer.lock generated

File diff suppressed because it is too large Load Diff

9
css/deck.css Normal file
View File

@@ -0,0 +1,9 @@
.icon-deck {
background-image: url(../img/deck-dark.svg);
filter: var(--background-invert-if-dark);
}
.icon-deck-white, .icon-deck.icon-white {
background-image: url(../img/deck.svg);
filter: var(--background-invert-if-dark);
}

View File

@@ -1 +0,0 @@
@include icon-black-white('deck', 'deck', 1);

View File

@@ -1,41 +0,0 @@
/**
* Custom icons
*/
@include icon-black-white('deck', 'deck', 1);
@include icon-black-white('archive', 'deck', 1);
@include icon-black-white('circles', 'deck', 1);
@include icon-black-white('clone', 'deck', 1);
@include icon-black-white('filter', 'deck', 1);
@include icon-black-white('filter_set', 'deck', 1);
@include icon-black-white('attach', 'deck', 1);
@include icon-black-white('reply', 'deck', 1);
@include icon-black-white('notifications-dark', 'deck', 1);
@include icon-black-white('description', 'deck', 1);
.icon-toggle-compact-collapsed {
@include icon-color('toggle-view-expand', 'deck', $color-black);
}
.icon-toggle-compact-expanded {
@include icon-color('toggle-view-collapse', 'deck', $color-black);
}
.icon-activity {
@include icon-color('activity-dark', 'activity', $color-black);
}
.icon-comment--unread {
@include icon-color('comment', 'actions', $color-primary, 1, true);
}
.avatardiv.circles {
background: var(--color-primary);
}
.icon-circles {
opacity: 1;
background-size: 20px;
background-position: center center;
}
.icon-colorpicker {
background-image: url('../img/color_picker.svg');
}

17
cypress.config.js Normal file
View File

@@ -0,0 +1,17 @@
const { defineConfig } = require('cypress')
module.exports = defineConfig({
projectId: '1s7wkc',
viewportWidth: 1280,
viewportHeight: 720,
e2e: {
// We've imported your old cypress plugins here.
// You may want to clean this up later by importing these.
setupNodeEvents(on, config) {
return require('./cypress/plugins/index.js')(on, config)
},
baseUrl: 'http://nextcloud.local/index.php',
experimentalSessionAndOrigin: true,
specPattern: 'cypress/e2e/**/*.{js,jsx,ts,tsx}',
},
})

View File

@@ -0,0 +1,41 @@
import { randHash } from '../utils'
const randUser = randHash()
describe('Board', function() {
const password = 'pass123'
before(function() {
cy.nextcloudCreateUser(randUser, password)
})
beforeEach(function() {
cy.login(randUser, password)
})
it('Can create a board', function() {
const board = 'Test'
cy.intercept({
method: 'POST',
url: '/index.php/apps/deck/boards',
}).as('createBoardRequest')
// Click "Add board"
cy.openLeftSidebar()
cy.get('#app-navigation-vue .app-navigation__list .app-navigation-entry')
.eq(3).find('a').first().click({ force: true })
// Type the board title
cy.get('.board-create form input[type=text]')
.type(board, { force: true })
// Submit
cy.get('.board-create form input[type=submit]')
.first().click({ force: true })
cy.wait('@createBoardRequest').its('response.statusCode').should('equal', 200)
cy.get('.app-navigation__list .app-navigation-entry__children .app-navigation-entry')
.contains(board).should('be.visible')
})
})

View File

@@ -0,0 +1,67 @@
import { randHash } from '../utils'
const randUser = randHash()
const testBoardData = {
title: 'MyBoardTest',
color: '00ff00',
stacks: [
{
title: 'TestList',
cards: [
{
title: 'Hello world',
},
],
},
],
}
describe('Card', function() {
before(function() {
cy.nextcloudCreateUser(randUser, randUser)
cy.createExampleBoard({
user: randUser,
password: randUser,
board: testBoardData,
})
})
beforeEach(function() {
cy.login(randUser, randUser)
})
it('Can show card details modal', function() {
cy.openLeftSidebar()
cy.getNavigationEntry(testBoardData.title)
.first().click({ force: true })
cy.get('.board .stack').eq(0).within(() => {
cy.get('.card:contains("Hello world")').should('be.visible').click()
})
cy.get('.modal__card').should('be.visible')
cy.get('.app-sidebar-header__maintitle').contains('Hello world')
})
it('Can add a card', function() {
const newCardTitle = 'Write some cypress tests'
cy.openLeftSidebar()
cy.getNavigationEntry(testBoardData.title)
.first().click({ force: true })
cy.get('.board .stack').eq(0).within(() => {
cy.get('.card:contains("Hello world")').should('be.visible')
cy.get('.button-vue[aria-label*="Add card"]')
.first().click()
cy.get('.stack__card-add form input#new-stack-input-main')
.type(newCardTitle)
cy.get('.stack__card-add form input[type=submit]')
.first().click()
cy.get(`.card:contains("${newCardTitle}")`).should('be.visible')
})
})
})

View File

@@ -0,0 +1,31 @@
import { randHash } from '../utils'
const randUser = randHash()
describe('Deck dashboard', function() {
const password = 'pass123'
before(function() {
cy.nextcloudCreateUser(randUser, password)
})
beforeEach(function() {
cy.login(randUser, password)
})
it('Can show the right title on the dashboard', function() {
cy.get('.board-title h2')
.should('have.length', 1).first()
.should('have.text', 'Upcoming cards')
})
it('Can see the default "Personal Board" created for user by default', function() {
const defaultBoard = 'Personal'
cy.openLeftSidebar()
cy.get('.app-navigation-entry-wrapper[icon=icon-deck]')
.find('ul.app-navigation-entry__children .app-navigation-entry:contains(' + defaultBoard + ')')
.first()
.contains(defaultBoard)
.should('be.visible')
})
})

View File

@@ -0,0 +1,30 @@
import { randHash } from '../utils'
const randUser = randHash()
describe('Stack', function() {
const board = 'TestBoard'
const password = 'pass123'
const stack = 'List 1'
before(function() {
cy.nextcloudCreateUser(randUser, password)
cy.deckCreateBoard({ user: randUser, password }, board)
})
beforeEach(function() {
cy.logout()
cy.login(randUser, password)
})
it('Can create a stack', function() {
cy.openLeftSidebar()
cy.getNavigationEntry(board)
.click({ force: true })
cy.get('#stack-add button').first().click()
cy.get('#stack-add form input#new-stack-input-main').type(stack)
cy.get('#stack-add form input[type=submit]').first().click()
cy.get('.board .stack').eq(0).contains(stack).should('be.visible')
})
})

View File

@@ -0,0 +1,5 @@
{
"name": "Using fixtures to represent data",
"email": "hello@cypress.io",
"body": "Fixtures are a great way to mock data for responses to routes"
}

22
cypress/plugins/index.js Normal file
View File

@@ -0,0 +1,22 @@
/// <reference types="cypress" />
// ***********************************************************
// This example plugins/index.js can be used to load plugins
//
// You can change the location of this file or turn off loading
// the plugins file with the 'pluginsFile' configuration option.
//
// You can read more here:
// https://on.cypress.io/plugins-guide
// ***********************************************************
// This function is called when a project is opened or re-opened (e.g. due to
// the project's config changing)
/**
* @type {Cypress.PluginConfig}
*/
// eslint-disable-next-line no-unused-vars
module.exports = (on, config) => {
// `on` is used to hook into various events Cypress emits
// `config` is the resolved Cypress config
}

159
cypress/support/commands.js Normal file
View File

@@ -0,0 +1,159 @@
/**
* @copyright Copyright (c) 2019 John Molakvoæ <skjnldsv@protonmail.com>
*
* @author John Molakvoæ <skjnldsv@protonmail.com>
*
* @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/>.
*
*/
const url = Cypress.config('baseUrl').replace(/\/index.php\/?$/g, '')
Cypress.env('baseUrl', url)
Cypress.Commands.add('login', (user, password, route = '/apps/deck/') => {
const session = `${user}-${Date.now()}`
cy.session(session, function() {
cy.visit(route)
cy.get('input[name=user]').type(user)
cy.get('input[name=password]').type(password)
cy.get('form[name=login] [type=submit]').click()
cy.url().should('include', route)
})
cy.visit(route)
})
Cypress.Commands.add('logout', (route = '/') => {
cy.session('_guest', function() {})
})
Cypress.Commands.add('nextcloudCreateUser', (user, password) => {
cy.clearCookies()
cy.request({
method: 'POST',
url: `${Cypress.env('baseUrl')}/ocs/v1.php/cloud/users?format=json`,
form: true,
body: {
userid: user,
password,
},
auth: { user: 'admin', pass: 'admin' },
headers: {
'OCS-ApiRequest': 'true',
'Content-Type': 'application/x-www-form-urlencoded',
},
}).then((response) => {
cy.log(`Created user ${user}`, response.status)
})
})
Cypress.Commands.add('nextcloudUpdateUser', (user, password, key, value) => {
cy.request({
method: 'PUT',
url: `${Cypress.env('baseUrl')}/ocs/v2.php/cloud/users/${user}`,
form: true,
body: { key, value },
auth: { user, pass: password },
headers: {
'OCS-ApiRequest': 'true',
'Content-Type': 'application/x-www-form-urlencoded',
},
}).then((response) => {
cy.log(`Updated user ${user} ${key} to ${value}`, response.status)
})
})
Cypress.Commands.add('openLeftSidebar', () => {
cy.get('.app-navigation button.app-navigation-toggle').click()
})
Cypress.Commands.add('deckCreateBoard', ({ user, password }, title) => {
cy.login(user, password)
cy.get('.app-navigation button.app-navigation-toggle').click()
cy.get('#app-navigation-vue .app-navigation__list .app-navigation-entry')
.eq(3)
.find('a')
.first()
.click({ force: true })
cy.get('.board-create form input[type=text]').type(title, { force: true })
cy.get('.board-create form input[type=submit]')
.first()
.click({ force: true })
})
Cypress.Commands.add('deckCreateList', ({ user, password }, title) => {
cy.login(user, password)
cy.get('.app-navigation button.app-navigation-toggle').click()
cy.get('#app-navigation-vue .app-navigation__list .app-navigation-entry')
.eq(3)
.find('a.app-navigation-entry-link')
.first()
.click({ force: true })
cy.get('#stack-add button').first().click()
cy.get('#stack-add form input#new-stack-input-main').type(title)
cy.get('#stack-add form input[type=submit]').first().click()
})
Cypress.Commands.add('createExampleBoard', ({ user, password, board }) => {
cy.request({
method: 'POST',
url: `${Cypress.env('baseUrl')}/index.php/apps/deck/api/v1.0/boards`,
auth: {
user,
password,
},
body: { title: board.title, color: board.color ?? 'ff0000' },
}).then((boardResponse) => {
expect(boardResponse.status).to.eq(200)
const boardData = boardResponse.body
for (const stackIndex in board.stacks) {
const stack = board.stacks[stackIndex]
cy.request({
method: 'POST',
url: `${Cypress.env('baseUrl')}/index.php/apps/deck/api/v1.0/boards/${boardData.id}/stacks`,
auth: {
user,
password,
},
body: { title: stack.title, order: 0 },
}).then((stackResponse) => {
const stackData = stackResponse.body
for (const cardIndex in stack.cards) {
const card = stack.cards[cardIndex]
cy.request({
method: 'POST',
url: `${Cypress.env('baseUrl')}/index.php/apps/deck/api/v1.0/boards/${boardData.id}/stacks/${stackData.id}/cards`,
auth: {
user,
password,
},
body: { title: card.title },
})
}
})
}
})
})
Cypress.Commands.add('getNavigationEntry', (boardTitle) => {
return cy.get('.app-navigation-entry-wrapper[icon=icon-deck]')
.find('ul.app-navigation-entry__children .app-navigation-entry:contains(' + boardTitle + ')')
.find('a.app-navigation-entry-link')
})

20
cypress/support/e2e.js Normal file
View File

@@ -0,0 +1,20 @@
// ***********************************************************
// This example support/index.js is processed and
// loaded automatically before your test files.
//
// This is a great place to put global configuration and
// behavior that modifies Cypress.
//
// You can change the location of this file or turn off
// automatically serving support files with the
// 'supportFile' configuration option.
//
// You can read more here:
// https://on.cypress.io/configuration
// ***********************************************************
// Import commands.js using ES2015 syntax:
import './commands'
// Alternatively you can use CommonJS syntax:
// require('./commands')

1
cypress/utils/index.js Normal file
View File

@@ -0,0 +1 @@
export const randHash = () => Math.random().toString(36).replace(/[^a-z]+/g, '').slice(0, 10)

View File

@@ -90,7 +90,7 @@ Steps:
* Create the configuration file
* Execute the import informing the import file path, data file and source as `Trello JSON`
Create the configuration file respecting the [JSON Schema](https://github.com/nextcloud/deck/blob/master/lib/Service/fixtures/config-trelloJson-schema.json) for import `Trello JSON`
Create the configuration file respecting the [JSON Schema](https://github.com/nextcloud/deck/blob/master/lib/Service/Importer/fixtures/config-trelloJson-schema.json) for import `Trello JSON`
Example configuration file:
```json
@@ -120,7 +120,7 @@ https://api.trello.com/1/members/me/boards?key={yourKey}&token={yourToken}&field
This ID you will use in the configuration file in the `board` property
* Create the configuration file
Create the configuration file respecting the [JSON Schema](https://github.com/nextcloud/deck/blob/master/lib/Service/fixtures/config-trelloApi-schema.json) for import `Trello JSON`
Create the configuration file respecting the [JSON Schema](https://github.com/nextcloud/deck/blob/master/lib/Service/Importer/fixtures/config-trelloApi-schema.json) for import `Trello JSON`
Example configuration file:
```json

4
img/activity-dark.svg Normal file
View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" height="32" width="32" version="1.0" viewbox="0 0 32 32">
<path d="m16 1-10 18h11l-1 12 10-18h-11z"/>
</svg>

After

Width:  |  Height:  |  Size: 205 B

4
img/activity.svg Normal file
View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg xmlns="http://www.w3.org/2000/svg" height="32" width="32" version="1.0" viewBox="0 0 32 32">
<path d="m16 1-10 18h11l-1 12 10-18h-11z" fill="#FFF"/>
</svg>

After

Width:  |  Height:  |  Size: 217 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><g transform="translate(0 -1036.362)" fill="#fff"><path d="M1.93 1041.296c-.185 0-.336.138-.336.31v9.842c0 .172.15.313.336.313h12.517c.185 0 .333-.14.333-.313v-9.842c0-.172-.148-.31-.333-.31H1.93zm4.124 1.507h4.223c.39 0 .705.314.705.704v.43c0 .39-.315.705-.705.705H6.054a.703.703 0 0 1-.705-.705v-.43c0-.39.314-.704.705-.704z"/><rect width="15.742" height="2.296" x=".136" y="1037.543" ry="0"/></g></svg>

Before

Width:  |  Height:  |  Size: 488 B

1
img/circles-dark.svg Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 58 58" width="512" height="512"><g fill="#000"><path d="M54.319 37.839C54.762 35.918 55 33.96 55 32c0-9.095-4.631-17.377-12.389-22.153a1 1 0 1 0-1.049 1.703C48.724 15.96 53 23.604 53 32c0 1.726-.2 3.451-.573 5.147A6.992 6.992 0 0 0 51 37c-3.86 0-7 3.141-7 7s3.14 7 7 7 7-3.141 7-7a7.006 7.006 0 0 0-3.681-6.161zM38.171 54.182A23.867 23.867 0 0 1 29 56a24.047 24.047 0 0 1-17.017-7.092A6.974 6.974 0 0 0 14 44c0-3.859-3.14-7-7-7s-7 3.141-7 7 3.14 7 7 7a6.952 6.952 0 0 0 3.381-.875C15.26 55.136 21.994 58 29 58c3.435 0 6.778-.663 9.936-1.971.51-.211.753-.796.542-1.307a1.001 1.001 0 0 0-1.307-.54zM4 31.213a1 1 0 0 0 1.068-.927c.712-10.089 7.586-18.52 17.22-21.314C23.142 11.874 25.825 14 29 14c3.86 0 7-3.141 7-7s-3.14-7-7-7c-3.851 0-6.985 3.127-6.999 6.975C11.42 9.922 3.851 19.12 3.073 30.146A.999.999 0 0 0 4 31.213z"/></g></svg>

After

Width:  |  Height:  |  Size: 885 B

View File

@@ -1 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 58 58" width="512" height="512"><g fill="#000"><path d="M54.319 37.839C54.762 35.918 55 33.96 55 32c0-9.095-4.631-17.377-12.389-22.153a1 1 0 1 0-1.049 1.703C48.724 15.96 53 23.604 53 32c0 1.726-.2 3.451-.573 5.147A6.992 6.992 0 0 0 51 37c-3.86 0-7 3.141-7 7s3.14 7 7 7 7-3.141 7-7a7.006 7.006 0 0 0-3.681-6.161zM38.171 54.182A23.867 23.867 0 0 1 29 56a24.047 24.047 0 0 1-17.017-7.092A6.974 6.974 0 0 0 14 44c0-3.859-3.14-7-7-7s-7 3.141-7 7 3.14 7 7 7a6.952 6.952 0 0 0 3.381-.875C15.26 55.136 21.994 58 29 58c3.435 0 6.778-.663 9.936-1.971.51-.211.753-.796.542-1.307a1.001 1.001 0 0 0-1.307-.54zM4 31.213a1 1 0 0 0 1.068-.927c.712-10.089 7.586-18.52 17.22-21.314C23.142 11.874 25.825 14 29 14c3.86 0 7-3.141 7-7s-3.14-7-7-7c-3.851 0-6.985 3.127-6.999 6.975C11.42 9.922 3.851 19.12 3.073 30.146A.999.999 0 0 0 4 31.213z"/></g></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 58 58" width="512" height="512"><g fill="#fff"><path d="M54.319 37.839C54.762 35.918 55 33.96 55 32c0-9.095-4.631-17.377-12.389-22.153a1 1 0 1 0-1.049 1.703C48.724 15.96 53 23.604 53 32c0 1.726-.2 3.451-.573 5.147A6.992 6.992 0 0 0 51 37c-3.86 0-7 3.141-7 7s3.14 7 7 7 7-3.141 7-7a7.006 7.006 0 0 0-3.681-6.161zM38.171 54.182A23.867 23.867 0 0 1 29 56a24.047 24.047 0 0 1-17.017-7.092A6.974 6.974 0 0 0 14 44c0-3.859-3.14-7-7-7s-7 3.141-7 7 3.14 7 7 7a6.952 6.952 0 0 0 3.381-.875C15.26 55.136 21.994 58 29 58c3.435 0 6.778-.663 9.936-1.971.51-.211.753-.796.542-1.307a1.001 1.001 0 0 0-1.307-.54zM4 31.213a1 1 0 0 0 1.068-.927c.712-10.089 7.586-18.52 17.22-21.314C23.142 11.874 25.825 14 29 14c3.86 0 7-3.141 7-7s-3.14-7-7-7c-3.851 0-6.985 3.127-6.999 6.975C11.42 9.922 3.851 19.12 3.073 30.146A.999.999 0 0 0 4 31.213z"/></g></svg>

Before

Width:  |  Height:  |  Size: 885 B

After

Width:  |  Height:  |  Size: 885 B

View File

@@ -1 +0,0 @@
<svg width="16" height="16" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M11.8 13.8H2.2V4.2h9.6m1.2 0c0-.67-.53-1.2-1.2-1.2H2.2C1.53 3 1 3.53 1 4.2v9.6c0 .67.53 1.2 1.2 1.2h9.6c.67 0 1.2-.53 1.2-1.2"/><path d="m4.2 1c-0.67 0-1.2 0.54-1.2 1.2h10.8v10.8c0.67 0 1.2-0.53 1.2-1.2v-9.6c0-0.67-0.53-1.2-1.2-1.2z"/></svg>

Before

Width:  |  Height:  |  Size: 327 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" height="16" width="16"><path d="M15 15s-.4-7.8-7-10V1L1 8l7 7v-4c5.1 0 7 4 7 4z"/></svg>

Before

Width:  |  Height:  |  Size: 128 B

View File

@@ -45,7 +45,9 @@ use OCP\AppFramework\Db\DoesNotExistException;
use OCP\AppFramework\Db\MultipleObjectsReturnedException;
use OCP\Comments\IComment;
use OCP\IUser;
use OCP\Server;
use OCP\L10N\IFactory;
use Psr\Log\LoggerInterface;
class ActivityManager {
public const DECK_NOAUTHOR_COMMENT_SYSTEM_ENFORCED = 'DECK_NOAUTHOR_COMMENT_SYSTEM_ENFORCED';
@@ -53,14 +55,14 @@ class ActivityManager {
public const SUBJECT_PARAMS_MAX_LENGTH = 4000;
public const SHORTENED_DESCRIPTION_MAX_LENGTH = 2000;
private $manager;
private $userId;
private $permissionService;
private $boardMapper;
private $cardMapper;
private $aclMapper;
private $stackMapper;
private $l10nFactory;
private IManager $manager;
private ?string $userId;
private PermissionService $permissionService;
private BoardMapper $boardMapper;
private CardMapper $cardMapper;
private AclMapper $aclMapper;
private StackMapper $stackMapper;
private IFactory $l10nFactory;
public const DECK_OBJECT_BOARD = 'deck_board';
public const DECK_OBJECT_CARD = 'deck_card';
@@ -114,7 +116,7 @@ class ActivityManager {
StackMapper $stackMapper,
AclMapper $aclMapper,
IFactory $l10nFactory,
$userId
?string $userId
) {
$this->manager = $manager;
$this->permissionService = $permissionsService;
@@ -310,10 +312,10 @@ class ActivityManager {
try {
$object = $this->findObjectForEntity($objectType, $entity);
} catch (DoesNotExistException $e) {
\OC::$server->getLogger()->error('Could not create activity entry for ' . $subject . '. Entity not found.', (array)$entity);
Server::get(LoggerInterface::class)->error('Could not create activity entry for ' . $subject . '. Entity not found.', (array)$entity);
return null;
} catch (MultipleObjectsReturnedException $e) {
\OC::$server->getLogger()->error('Could not create activity entry for ' . $subject . '. Entity not found.', (array)$entity);
Server::get(LoggerInterface::class)->error('Could not create activity entry for ' . $subject . '. Entity not found.', (array)$entity);
return null;
}
@@ -365,7 +367,15 @@ class ActivityManager {
case self::SUBJECT_CARD_USER_ASSIGN:
case self::SUBJECT_CARD_USER_UNASSIGN:
$subjectParams = $this->findDetailsForCard($entity->getId(), $subject);
break;
if (isset($additionalParams['after']) && $additionalParams['after'] instanceof \DateTimeInterface) {
$additionalParams['after'] = $additionalParams['after']->format('c');
}
if (isset($additionalParams['before']) && $additionalParams['before'] instanceof \DateTimeInterface) {
$additionalParams['before'] = $additionalParams['before']->format('c');
}
break;
case self::SUBJECT_ATTACHMENT_CREATE:
case self::SUBJECT_ATTACHMENT_UPDATE:
case self::SUBJECT_ATTACHMENT_DELETE:

View File

@@ -312,12 +312,19 @@ class DeckProvider implements IProvider {
$userLanguage = $this->config->getUserValue($event->getAuthor(), 'core', 'lang', $this->l10nFactory->findLanguage());
$userLocale = $this->config->getUserValue($event->getAuthor(), 'core', 'locale', $this->l10nFactory->findLocale());
$l10n = $this->l10nFactory->get('deck', $userLanguage, $userLocale);
$date = new \DateTime($subjectParams['after']);
$date->setTimezone(new \DateTimeZone(\date_default_timezone_get()));
if (is_array($subjectParams['after'])) {
// Unluckily there was a time when we stored jsonSerialized date objects in the database
// Broken in 1.8.0 and fixed again in 1.8.1
$date = new \DateTime($subjectParams['after']['date']);
$date->setTimezone(new \DateTimeZone(\date_default_timezone_get()));
} else {
$date = new \DateTime($subjectParams['after']);
$date->setTimezone(new \DateTimeZone(\date_default_timezone_get()));
}
$params['after'] = [
'type' => 'highlight',
'id' => 'dt:' . $subjectParams['after'],
'name' => $l10n->l('datetime', $date)
'name' => $l10n->l('datetime', $date),
];
}
return $params;

View File

@@ -47,6 +47,7 @@ use OCA\Deck\Listeners\FullTextSearchEventListener;
use OCA\Deck\Middleware\DefaultBoardMiddleware;
use OCA\Deck\Middleware\ExceptionMiddleware;
use OCA\Deck\Notification\Notifier;
use OCA\Deck\Reference\CardReferenceProvider;
use OCA\Deck\Search\CardCommentProvider;
use OCA\Deck\Search\DeckProvider;
use OCA\Deck\Service\PermissionService;
@@ -57,20 +58,22 @@ use OCP\AppFramework\Bootstrap\IBootContext;
use OCP\AppFramework\Bootstrap\IBootstrap;
use OCP\AppFramework\Bootstrap\IRegistrationContext;
use OCP\AppFramework\Http\Events\BeforeTemplateRenderedEvent;
use OCP\Collaboration\Reference\RenderReferenceEvent;
use OCP\Collaboration\Resources\IProviderManager;
use OCP\Comments\CommentsEntityEvent;
use OCP\Comments\ICommentsManager;
use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\Group\Events\GroupDeletedEvent;
use OCP\IConfig;
use OCP\IDBConnection;
use OCP\IGroup;
use OCP\IGroupManager;
use OCP\IServerContainer;
use OCP\IUser;
use OCP\IRequest;
use OCP\Server;
use OCP\IUserManager;
use OCP\Notification\IManager as NotificationManager;
use OCP\Share\IManager;
use OCP\User\Events\UserDeletedEvent;
use OCP\Util;
use Psr\Container\ContainerInterface;
@@ -79,13 +82,16 @@ class Application extends App implements IBootstrap {
public const COMMENT_ENTITY_TYPE = 'deckCard';
/** @var IServerContainer */
private $server;
public function __construct(array $urlParams = []) {
parent::__construct(self::APP_ID, $urlParams);
$this->server = \OC::$server;
// TODO move this back to ::register after fixing the autoload issue
// (and use a listener class)
$container = $this->getContainer();
$eventDispatcher = $container->get(IEventDispatcher::class);
$eventDispatcher->addListener(RenderReferenceEvent::class, function () {
Util::addScript(self::APP_ID, self::APP_ID . '-card-reference');
});
}
public function boot(IBootContext $context): void {
@@ -124,8 +130,12 @@ class Application extends App implements IBootstrap {
$context->registerSearchProvider(CardCommentProvider::class);
$context->registerDashboardWidget(DeckWidget::class);
// reference widget
$context->registerReferenceProvider(CardReferenceProvider::class);
// $context->registerEventListener(RenderReferenceEvent::class, CardReferenceListener::class);
$context->registerEventListener(BeforeTemplateRenderedEvent::class, BeforeTemplateRenderedListener::class);
// Event listening for full text search indexing
$context->registerEventListener(CardCreatedEvent::class, FullTextSearchEventListener::class);
$context->registerEventListener(CardUpdatedEvent::class, FullTextSearchEventListener::class);
@@ -141,33 +151,43 @@ class Application extends App implements IBootstrap {
private function registerUserGroupHooks(IUserManager $userManager, IGroupManager $groupManager): void {
$container = $this->getContainer();
/** @var IEventDispatcher $eventDispatcher */
$eventDispatcher = $container->get(IEventDispatcher::class);
// Delete user/group acl entries when they get deleted
$userManager->listen('\OC\User', 'postDelete', static function (IUser $user) use ($container) {
$eventDispatcher->addListener(UserDeletedEvent::class, static function (Event $event) use ($container): void {
if (!($event instanceof UserDeletedEvent)) {
return;
}
$user = $event->getUser();
// delete existing acl entries for deleted user
/** @var AclMapper $aclMapper */
$aclMapper = $container->query(AclMapper::class);
$aclMapper = $container->get(AclMapper::class);
$acls = $aclMapper->findByParticipant(Acl::PERMISSION_TYPE_USER, $user->getUID());
foreach ($acls as $acl) {
$aclMapper->delete($acl);
}
// delete existing user assignments
$assignmentMapper = $container->query(AssignmentMapper::class);
$assignmentMapper = $container->get(AssignmentMapper::class);
$assignments = $assignmentMapper->findByParticipant($user->getUID());
foreach ($assignments as $assignment) {
$assignmentMapper->delete($assignment);
}
/** @var BoardMapper $boardMapper */
$boardMapper = $container->query(BoardMapper::class);
$boardMapper = $container->get(BoardMapper::class);
$boards = $boardMapper->findAllByOwner($user->getUID());
foreach ($boards as $board) {
$boardMapper->delete($board);
}
});
$groupManager->listen('\OC\Group', 'postDelete', static function (IGroup $group) use ($container) {
$eventDispatcher->addListener(GroupDeletedEvent::class, static function (Event $event) use ($container): void {
if (!($event instanceof GroupDeletedEvent)) {
return;
}
$group = $event->getGroup();
/** @var AclMapper $aclMapper */
$aclMapper = $container->query(AclMapper::class);
$aclMapper = $container->get(AclMapper::class);
$aclMapper->findByParticipant(Acl::PERMISSION_TYPE_GROUP, $group->getGID());
$acls = $aclMapper->findByParticipant(Acl::PERMISSION_TYPE_GROUP, $group->getGID());
foreach ($acls as $acl) {
@@ -181,6 +201,7 @@ class Application extends App implements IBootstrap {
$event->addEntityCollection(self::COMMENT_ENTITY_TYPE, function ($name) {
/** @var CardMapper */
$cardMapper = $this->getContainer()->get(CardMapper::class);
/** @var PermissionService $permissionService */
$permissionService = $this->getContainer()->get(PermissionService::class);
try {
@@ -203,7 +224,7 @@ class Application extends App implements IBootstrap {
$resourceManager->registerResourceProvider(ResourceProviderCard::class);
$symfonyAdapter->addListener('\OCP\Collaboration\Resources::loadAdditionalScripts', static function () {
if (strpos(\OC::$server->getRequest()->getPathInfo(), '/call/') === 0) {
if (strpos(Server::get(IRequest::class)->getPathInfo(), '/call/') === 0) {
// Talk integration has its own entrypoint which already includes collections handling
return;
}

View File

@@ -32,20 +32,23 @@ use OCP\AppFramework\QueryException;
use OCP\Collaboration\Resources\IManager;
use OCP\Collaboration\Resources\IProvider;
use OCP\Collaboration\Resources\IResource;
use OCP\IURLGenerator;
use OCP\IUser;
use OCP\Server;
class ResourceProvider implements IProvider {
public const RESOURCE_TYPE = 'deck';
private $boardMapper;
private $permissionService;
private BoardMapper $boardMapper;
private PermissionService $permissionService;
private IURLGenerator $urlGenerator;
/** @var array */
protected $nodes = [];
protected array $nodes = [];
public function __construct(BoardMapper $boardMapper, PermissionService $permissionService) {
public function __construct(BoardMapper $boardMapper, PermissionService $permissionService, IURLGenerator $urlGenerator) {
$this->boardMapper = $boardMapper;
$this->permissionService = $permissionService;
$this->urlGenerator = $urlGenerator;
}
/**
@@ -70,14 +73,14 @@ class ResourceProvider implements IProvider {
*/
public function getResourceRichObject(IResource $resource): array {
$board = $this->getBoard($resource);
$link = \OC::$server->getURLGenerator()->linkToRoute('deck.page.index') . '#/board/' . $resource->getId();
$link = $this->urlGenerator->linkToRoute('deck.page.index') . '#/board/' . $resource->getId();
return [
'type' => self::RESOURCE_TYPE,
'id' => $resource->getId(),
'name' => $board->getTitle(),
'link' => $link,
'iconUrl' => \OC::$server->getURLGenerator()->imagePath('deck', 'deck-dark.svg')
'iconUrl' => $this->urlGenerator->imagePath('deck', 'deck-dark.svg')
];
}
@@ -118,7 +121,7 @@ class ResourceProvider implements IProvider {
public function invalidateAccessCache($boardId = null) {
try {
/** @var IManager $resourceManager */
$resourceManager = \OC::$server->query(IManager::class);
$resourceManager = Server::get(IManager::class);
} catch (QueryException $e) {
}
if ($boardId !== null) {

View File

@@ -37,24 +37,16 @@ use OCP\Collaboration\Resources\IResource;
use OCP\Collaboration\Resources\ResourceException;
use OCP\IURLGenerator;
use OCP\IUser;
use OCP\Server;
class ResourceProviderCard implements IProvider {
public const RESOURCE_TYPE = 'deck-card';
/** @var CardMapper */
private $cardMapper;
/** @var BoardMapper */
private $boardMapper;
/** @var PermissionService */
private $permissionService;
/** @var IURLGenerator */
private $urlGenerator;
/** @var array */
protected $nodes = [];
private CardMapper $cardMapper;
private BoardMapper $boardMapper;
private PermissionService $permissionService;
private IURLGenerator $urlGenerator;
protected array $nodes = [];
public function __construct(CardMapper $cardMapper, BoardMapper $boardMapper, PermissionService $permissionService, IURLGenerator $urlGenerator) {
$this->cardMapper = $cardMapper;
@@ -147,7 +139,7 @@ class ResourceProviderCard implements IProvider {
public function invalidateAccessCache($cardId = null) {
try {
/** @var IManager $resourceManager */
$resourceManager = \OC::$server->query(IManager::class);
$resourceManager = Server::get(IManager::class);
} catch (QueryException $e) {
}
if ($cardId !== null) {

View File

@@ -30,8 +30,7 @@ use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
class BoardImport extends Command {
/** @var BoardImportCommandService */
private $boardImportCommandService;
private BoardImportCommandService $boardImportCommandService;
public function __construct(
BoardImportCommandService $boardImportCommandService

View File

@@ -27,6 +27,7 @@ use OCA\Deck\Db\AssignmentMapper;
use OCA\Deck\Db\BoardMapper;
use OCA\Deck\Db\CardMapper;
use OCA\Deck\Db\StackMapper;
use OCA\Deck\Model\CardDetails;
use OCA\Deck\Service\BoardService;
use OCP\AppFramework\Db\DoesNotExistException;
use OCP\AppFramework\Db\MultipleObjectsReturnedException;
@@ -101,7 +102,9 @@ class UserExport extends Command {
$fullCard = $this->cardMapper->find($card->getId());
$assignedUsers = $this->assignedUsersMapper->findAll($card->getId());
$fullCard->setAssignedUsers($assignedUsers);
$data[$board->getId()]['stacks'][$stack->getId()]['cards'][] = (array)$fullCard->jsonSerialize();
$cardDetails = new CardDetails($fullCard, $fullBoard);
$data[$board->getId()]['stacks'][$stack->getId()]['cards'][] = $cardDetails->jsonSerialize();
}
}
}

View File

@@ -29,7 +29,9 @@ use OCA\Deck\Service\PermissionService;
use OCA\Files\Event\LoadSidebar;
use OCA\Viewer\Event\LoadViewer;
use OCP\AppFramework\Http\ContentSecurityPolicy;
use OCP\Collaboration\Resources\LoadAdditionalScriptsEvent as CollaborationResourcesEvent;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\IConfig;
use OCP\IInitialStateService;
use OCP\IRequest;
use OCP\AppFramework\Http\TemplateResponse;
@@ -41,16 +43,17 @@ use OCA\Deck\Db\Acl;
use OCA\Deck\Service\CardService;
class PageController extends Controller {
private $permissionService;
private $initialState;
private $configService;
private $eventDispatcher;
private $cardMapper;
private $urlGenerator;
private $cardService;
private PermissionService $permissionService;
private IInitialStateService $initialState;
private ConfigService $configService;
private IEventDispatcher $eventDispatcher;
private CardMapper $cardMapper;
private IURLGenerator $urlGenerator;
private CardService $cardService;
private IConfig $config;
public function __construct(
$AppName,
string $AppName,
IRequest $request,
PermissionService $permissionService,
IInitialStateService $initialStateService,
@@ -58,7 +61,8 @@ class PageController extends Controller {
IEventDispatcher $eventDispatcher,
CardMapper $cardMapper,
IURLGenerator $urlGenerator,
CardService $cardService
CardService $cardService,
IConfig $config
) {
parent::__construct($AppName, $request);
@@ -69,6 +73,7 @@ class PageController extends Controller {
$this->cardMapper = $cardMapper;
$this->urlGenerator = $urlGenerator;
$this->cardService = $cardService;
$this->config = $config;
}
/**
@@ -84,13 +89,17 @@ class PageController extends Controller {
$this->initialState->provideInitialState(Application::APP_ID, 'config', $this->configService->getAll());
$this->eventDispatcher->dispatchTyped(new LoadSidebar());
$this->eventDispatcher->dispatchTyped(new CollaborationResourcesEvent());
if (class_exists(LoadViewer::class)) {
$this->eventDispatcher->dispatchTyped(new LoadViewer());
}
$response = new TemplateResponse('deck', 'main');
$response = new TemplateResponse('deck', 'main', [
'id-app-content' => '#app-content-vue',
'id-app-navigation' => '#app-navigation-vue',
]);
if (\OC::$server->getConfig()->getSystemValueBool('debug', false)) {
if ($this->config->getSystemValueBool('debug', false)) {
$csp = new ContentSecurityPolicy();
$csp->addAllowedConnectDomain('*');
$csp->addAllowedScriptDomain('*');

View File

@@ -27,6 +27,7 @@ declare(strict_types=1);
namespace OCA\Deck\Controller;
use OCA\Deck\Db\Card;
use OCA\Deck\Model\CardDetails;
use OCA\Deck\Service\SearchService;
use OCP\AppFramework\Http\DataResponse;
use OCP\AppFramework\OCSController;
@@ -50,9 +51,12 @@ class SearchController extends OCSController {
public function search(string $term, ?int $limit = null, ?int $cursor = null): DataResponse {
$cards = $this->searchService->searchCards($term, $limit, $cursor);
return new DataResponse(array_map(function (Card $card) {
$json = $card->jsonSerialize();
$board = $card->getRelatedBoard();
$json = (new CardDetails($card, $board))->jsonSerialize();
$json['relatedBoard'] = $board;
$json['relatedStack'] = $card->getRelatedStack();
$json['relatedBoard'] = $card->getRelatedBoard();
return $json;
}, $cards));
}

View File

@@ -26,18 +26,34 @@ declare(strict_types=1);
namespace OCA\Deck\Dashboard;
use OCP\Dashboard\IWidget;
use DateTime;
use OCA\Deck\AppInfo\Application;
use OCA\Deck\Db\Label;
use OCA\Deck\Service\OverviewService;
use OCP\Dashboard\IAPIWidget;
use OCP\Dashboard\IButtonWidget;
use OCP\Dashboard\IIconWidget;
use OCP\Dashboard\Model\WidgetButton;
use OCP\Dashboard\Model\WidgetItem;
use OCP\IDateTimeFormatter;
use OCP\IL10N;
use OCP\IURLGenerator;
use OCP\Util;
class DeckWidget implements IWidget {
class DeckWidget implements IAPIWidget, IButtonWidget, IIconWidget {
private IL10N $l10n;
private OverviewService $dashboardService;
private IURLGenerator $urlGenerator;
private IDateTimeFormatter $dateTimeFormatter;
/**
* @var IL10N
*/
private $l10n;
public function __construct(IL10N $l10n) {
public function __construct(IL10N $l10n,
OverviewService $dashboardService,
IDateTimeFormatter $dateTimeFormatter,
IURLGenerator $urlGenerator) {
$this->l10n = $l10n;
$this->dashboardService = $dashboardService;
$this->urlGenerator = $urlGenerator;
$this->dateTimeFormatter = $dateTimeFormatter;
}
/**
@@ -68,17 +84,88 @@ class DeckWidget implements IWidget {
return 'icon-deck';
}
/**
* @inheritDoc
*/
public function getIconUrl(): string {
return $this->urlGenerator->getAbsoluteURL(
$this->urlGenerator->imagePath(Application::APP_ID, 'deck-dark.svg')
);
}
/**
* @inheritDoc
*/
public function getUrl(): ?string {
return null;
return $this->urlGenerator->getAbsoluteURL(
$this->urlGenerator->linkToRoute(Application::APP_ID . '.page.index')
);
}
/**
* @inheritDoc
*/
public function load(): void {
\OCP\Util::addScript('deck', 'deck-dashboard');
Util::addScript('deck', 'deck-dashboard');
}
/**
* @inheritDoc
*/
public function getItems(string $userId, ?string $since = null, int $limit = 7): array {
$upcomingCards = $this->dashboardService->findUpcomingCards($userId);
$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']) {
$ts = (new Datetime($card['duedate']))->getTimestamp();
return $ts > $nowTimestamp && ($sinceTimestamp === null || $ts > $sinceTimestamp);
}
return false;
});
usort($upcomingCards, static function ($a, $b) {
$a = new Datetime($a['duedate']);
$ta = $a->getTimestamp();
$b = new Datetime($b['duedate']);
$tb = $b->getTimestamp();
return ($ta > $tb) ? 1 : -1;
});
$upcomingCards = array_slice($upcomingCards, 0, $limit);
$urlGenerator = $this->urlGenerator;
$dateTimeFormatter = $this->dateTimeFormatter;
return array_map(static function (array $card) use ($urlGenerator, $dateTimeFormatter) {
$formattedDueDate = $dateTimeFormatter->formatDateTime(new DateTime($card['duedate']));
return new WidgetItem(
$card['title'] . ' (' . $formattedDueDate . ')',
implode(
', ',
array_map(static function (Label $label) {
return $label->jsonSerialize()['title'];
}, $card['labels'])
),
$urlGenerator->getAbsoluteURL(
$urlGenerator->linkToRoute(Application::APP_ID . '.page.redirectToCard', ['cardId' => $card['id']])
),
$urlGenerator->getAbsoluteURL(
$urlGenerator->imagePath(Application::APP_ID, 'deck-dark.svg')
),
$card['duedate']
);
}, $upcomingCards);
}
/**
* @inheritDoc
*/
public function getWidgetButtons(string $userId): array {
return [
new WidgetButton(
WidgetButton::TYPE_MORE,
$this->urlGenerator->getAbsoluteURL(
$this->urlGenerator->linkToRoute(Application::APP_ID . '.page.index')
),
$this->l10n->t('Load more')
),
];
}
}

View File

@@ -33,18 +33,46 @@ class AclMapper extends DeckMapper implements IPermissionMapper {
parent::__construct($db, 'deck_board_acl', Acl::class);
}
/**
* @param numeric $boardId
* @param int|null $limit
* @param int|null $offset
* @return Acl[]
* @throws \OCP\DB\Exception
*/
public function findAll($boardId, $limit = null, $offset = null) {
$sql = 'SELECT id, board_id, type, participant, permission_edit, permission_share, permission_manage FROM `*PREFIX*deck_board_acl` WHERE `board_id` = ? ';
return $this->findEntities($sql, [$boardId], $limit, $offset);
$qb = $this->db->getQueryBuilder();
$qb->select('id', 'board_id', 'type', 'participant', 'permission_edit', 'permission_share', 'permission_manage')
->from('deck_board_acl')
->where($qb->expr()->eq('board_id', $qb->createNamedParameter($boardId, IQueryBuilder::PARAM_INT)))
->setMaxResults($limit)
->setFirstResult($offset);
return $this->findEntities($qb);
}
public function isOwner($userId, $aclId): bool {
$sql = 'SELECT owner FROM `*PREFIX*deck_boards` WHERE `id` IN (SELECT board_id FROM `*PREFIX*deck_board_acl` WHERE id = ?)';
$stmt = $this->execute($sql, [$aclId]);
$row = $stmt->fetch();
return ($row['owner'] === $userId);
/**
* @param numeric $userId
* @param numeric $id
* @return bool
* @throws \OCP\DB\Exception
*/
public function isOwner($userId, $id): bool {
$aclId = $id;
$qb = $this->db->getQueryBuilder();
$qb->select('acl.id')
->from($this->getTableName(), 'acl')
->innerJoin('acl', 'deck_boards', 'b', 'acl.board_id = b.id')
->where($qb->expr()->eq('owner', $qb->createNamedParameter($userId, IQueryBuilder::PARAM_STR)))
->andWhere($qb->expr()->eq('acl.id', $qb->createNamedParameter($aclId, IQueryBuilder::PARAM_INT)));
return count($qb->executeQuery()->fetchAll()) > 0;
}
/**
* @param numeric $id
* @return int|null
*/
public function findBoardId($id): ?int {
try {
$entity = $this->find($id);
@@ -54,9 +82,21 @@ class AclMapper extends DeckMapper implements IPermissionMapper {
return null;
}
/**
* @param int $type
* @param string $participant
* @return Acl[]
* @throws \OCP\DB\Exception
*/
public function findByParticipant($type, $participant): array {
$sql = 'SELECT * from *PREFIX*deck_board_acl WHERE type = ? AND participant = ?';
return $this->findEntities($sql, [$type, $participant]);
$qb = $this->db->getQueryBuilder();
$qb->select('*')
->from($this->getTableName())
->where($qb->expr()->eq('type', $qb->createNamedParameter($type, IQueryBuilder::PARAM_INT)))
->andWhere($qb->expr()->eq('participant', $qb->createNamedParameter($participant, IQueryBuilder::PARAM_STR)));
return $this->findEntities($qb);
}
/**

View File

@@ -55,9 +55,6 @@ class AssignmentMapper extends QBMapper implements IPermissionMapper {
$this->circleService = $circleService;
}
/**
* @return Assignment[]
*/
public function findAll(int $cardId): array {
$qb = $this->db->getQueryBuilder();
$qb->select('*')
@@ -80,8 +77,8 @@ class AssignmentMapper extends QBMapper implements IPermissionMapper {
}
public function isOwner($userId, $cardId): bool {
return $this->cardMapper->isOwner($userId, $cardId);
public function isOwner($userId, $id): bool {
return $this->cardMapper->isOwner($userId, $id);
}
public function findBoardId($id): ?int {

View File

@@ -30,7 +30,6 @@ use OCP\AppFramework\Db\MultipleObjectsReturnedException;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\IDBConnection;
use OCP\IUserManager;
use PDO;
class AttachmentMapper extends DeckMapper implements IPermissionMapper {
private $cardMapper;
@@ -52,70 +51,53 @@ class AttachmentMapper extends DeckMapper implements IPermissionMapper {
}
/**
* @param $id
* @return Entity|Attachment
* @throws \OCP\AppFramework\Db\DoesNotExistException
* @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException
* @param int $id
* @return Attachment
* @throws DoesNotExistException
* @throws MultipleObjectsReturnedException
* @throws \OCP\DB\Exception
*/
public function find($id) {
$qb = $this->db->getQueryBuilder();
$qb->select('*')
->from('deck_attachment')
->from($this->getTableName())
->where($qb->expr()->eq('id', $qb->createNamedParameter($id, IQueryBuilder::PARAM_INT)));
$cursor = $qb->execute();
$row = $cursor->fetch(PDO::FETCH_ASSOC);
if ($row === false) {
$cursor->closeCursor();
throw new DoesNotExistException('Did expect one result but found none when executing query: ' . $qb->getSQL());
}
$row2 = $cursor->fetch();
$cursor->closeCursor();
if ($row2 !== false) {
throw new MultipleObjectsReturnedException('Did not expect more than one result when executing query: ' . $qb->getSQL());
}
return $this->mapRowToEntity($row);
}
public function findByData($cardId, $data) {
$qb = $this->db->getQueryBuilder();
$qb->select('*')
->from('deck_attachment')
->where($qb->expr()->eq('card_id', $qb->createNamedParameter($cardId, IQueryBuilder::PARAM_INT)))
->andWhere($qb->expr()->eq('data', $qb->createNamedParameter($data, IQueryBuilder::PARAM_STR)));
$cursor = $qb->execute();
$row = $cursor->fetch(PDO::FETCH_ASSOC);
if ($row === false) {
$cursor->closeCursor();
throw new DoesNotExistException('Did expect one result but found none when executing query: ' . $qb->getSQL());
}
$cursor->closeCursor();
return $this->mapRowToEntity($row);
return $this->findEntity($qb);
}
/**
* @param int $cardId
* @param string $data
* @return Attachment
* @throws DoesNotExistException
* @throws MultipleObjectsReturnedException
* @throws \OCP\DB\Exception
*/
public function findByData($cardId, $data) {
$qb = $this->db->getQueryBuilder();
$qb->select('*')
->from($this->getTableName())
->where($qb->expr()->eq('card_id', $qb->createNamedParameter($cardId, IQueryBuilder::PARAM_INT)))
->andWhere($qb->expr()->eq('data', $qb->createNamedParameter($data, IQueryBuilder::PARAM_STR)));
return $this->findEntity($qb);
}
/**
* Find all attachments for a card
*
* @param $cardId
* @return array
* @return Entity[]
* @throws \OCP\DB\Exception
*/
public function findAll($cardId) {
$qb = $this->db->getQueryBuilder();
$qb->select('*')
->from('deck_attachment')
->from($this->getTableName())
->where($qb->expr()->eq('card_id', $qb->createNamedParameter($cardId, IQueryBuilder::PARAM_INT)))
->andWhere($qb->expr()->eq('deleted_at', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT)));
$entities = [];
$cursor = $qb->execute();
while ($row = $cursor->fetch()) {
$entities[] = $this->mapRowToEntity($row);
}
$cursor->closeCursor();
return $entities;
return $this->findEntities($qb);
}
/**
@@ -128,7 +110,7 @@ class AttachmentMapper extends DeckMapper implements IPermissionMapper {
$timeLimit = time() - (60 * 5);
$qb = $this->db->getQueryBuilder();
$qb->select('*')
->from('deck_attachment')
->from($this->getTableName())
->where($qb->expr()->gt('deleted_at', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT)));
if ($withOffset) {
$qb
@@ -139,13 +121,7 @@ class AttachmentMapper extends DeckMapper implements IPermissionMapper {
->andWhere($qb->expr()->eq('card_id', $qb->createNamedParameter($cardId, IQueryBuilder::PARAM_INT)));
}
$entities = [];
$cursor = $qb->execute();
while ($row = $cursor->fetch()) {
$entities[] = $this->mapRowToEntity($row);
}
$cursor->closeCursor();
return $entities;
return $this->findEntities($qb);
}

View File

@@ -23,6 +23,14 @@
namespace OCA\Deck\Db;
/**
* @method int getId()
* @method string getTitle()
* @method int getShared()
* @method bool getArchived()
* @method int getDeletedAt()
* @method int getLastModified()
*/
class Board extends RelationalEntity {
protected $title;
protected $owner;

View File

@@ -42,9 +42,9 @@ class BoardMapper extends QBMapper implements IPermissionMapper {
private $circlesService;
private $logger;
/** @var CappedMemoryCache */
/** @var CappedMemoryCache<Board[]> */
private $userBoardCache;
/** @var CappedMemoryCache */
/** @var CappedMemoryCache<Board> */
private $boardCache;
public function __construct(
@@ -107,6 +107,47 @@ class BoardMapper extends QBMapper implements IPermissionMapper {
return $this->boardCache[$id];
}
public function findBoardIds(string $userId): array {
$qb = $this->db->getQueryBuilder();
$qb->selectDistinct('b.id')
->from($this->getTableName(), 'b')
->leftJoin('b', 'deck_board_acl', 'acl', $qb->expr()->eq('b.id', 'acl.board_id'));
// Owned by the user
$qb->where($qb->expr()->andX(
$qb->expr()->eq('owner', $qb->createNamedParameter($userId, IQueryBuilder::PARAM_STR)),
));
// Shared to the user
$qb->orWhere($qb->expr()->andX(
$qb->expr()->eq('acl.participant', $qb->createNamedParameter($userId, IQueryBuilder::PARAM_STR)),
$qb->expr()->eq('acl.type', $qb->createNamedParameter(Acl::PERMISSION_TYPE_USER, IQueryBuilder::PARAM_INT)),
));
// Shared to user groups of the user
$groupIds = $this->groupManager->getUserGroupIds($this->userManager->get($userId));
if (count($groupIds) !== 0) {
$qb->orWhere($qb->expr()->andX(
$qb->expr()->in('acl.participant', $qb->createNamedParameter($groupIds, IQueryBuilder::PARAM_STR_ARRAY)),
$qb->expr()->eq('acl.type', $qb->createNamedParameter(Acl::PERMISSION_TYPE_GROUP, IQueryBuilder::PARAM_INT)),
));
}
// Shared to circles of the user
$circles = $this->circlesService->getUserCircles($userId);
if (count($circles) !== 0) {
$qb->orWhere($qb->expr()->andX(
$qb->expr()->in('acl.participant', $qb->createNamedParameter($circles, IQueryBuilder::PARAM_STR_ARRAY)),
$qb->expr()->eq('acl.type', $qb->createNamedParameter(Acl::PERMISSION_TYPE_CIRCLE, IQueryBuilder::PARAM_INT)),
));
}
$result = $qb->executeQuery();
return array_map(function (string $id) {
return (int)$id;
}, $result->fetchAll(\PDO::FETCH_COLUMN));
}
public function findAllForUser(string $userId, ?int $since = null, bool $includeArchived = true, ?int $before = null,
?string $term = null): array {
$useCache = ($since === -1 && $includeArchived === true && $before === null && $term === null);
@@ -131,14 +172,9 @@ class BoardMapper extends QBMapper implements IPermissionMapper {
/**
* Find all boards for a given user
*
* @param $userId
* @param null $limit
* @param null $offset
* @return array
*/
public function findAllByUser(string $userId, ?int $limit = null, ?int $offset = null, ?int $since = null,
bool $includeArchived = true, ?int $before = null, ?string $term = null) {
bool $includeArchived = true, ?int $before = null, ?string $term = null): array {
// FIXME this used to be a UNION to get boards owned by $userId and the user shares in one single query
// Is it possible with the query builder?
$qb = $this->db->getQueryBuilder();
@@ -247,15 +283,9 @@ class BoardMapper extends QBMapper implements IPermissionMapper {
/**
* Find all boards for a given user
*
* @param $userId
* @param $groups
* @param null $limit
* @param null $offset
* @return array
*/
public function findAllByGroups(string $userId, array $groups, ?int $limit = null, ?int $offset = null, ?int $since = null,
bool $includeArchived = true, ?int $before = null, ?string $term = null) {
bool $includeArchived = true, ?int $before = null, ?string $term = null): array {
if (count($groups) <= 0) {
return [];
}
@@ -414,8 +444,8 @@ class BoardMapper extends QBMapper implements IPermissionMapper {
return parent::delete($entity);
}
public function isOwner($userId, $boardId): bool {
$board = $this->find($boardId);
public function isOwner($userId, $id): bool {
$board = $this->find($id);
return ($board->getOwner() === $userId);
}

View File

@@ -27,6 +27,44 @@ use DateTime;
use DateTimeZone;
use Sabre\VObject\Component\VCalendar;
/**
* @method string getTitle()
* @method string getDescription()
* @method string getDescriptionPrev()
* @method int getStackId()
* @method int getOrder()
* @method int getLastModified()
* @method int getCreatedAt()
* @method bool getArchived()
* @method bool getNotified()
*
* @method void setLabels(Label[] $labels)
* @method null|Label[] getLabels()
*
* @method void setAssignedUsers(Assignment[] $users)
* @method null|User[] getAssignedUsers()
*
* @method void setAttachments(Attachment[] $attachments)
* @method null|Attachment[] getAttachments()
*
* @method void setAttachmentCount(int $count)
* @method null|int getAttachmentCount()
*
* @method void setCommentsUnread(int $count)
* @method null|int getCommentsUnread()
*
* @method void setCommentsCount(int $count)
* @method null|int getCommentsCount()
*
* @method void setOwner(string $user)
* @method null|string getOwner()
*
* @method void setRelatedStack(Stack $stack)
* @method null|Stack getRelatedStack()
*
* @method void setRelatedBoard(Board $board)
* @method null|Board getRelatedBoard()
*/
class Card extends RelationalEntity {
public const TITLE_MAX_LENGTH = 255;
@@ -70,6 +108,7 @@ class Card extends RelationalEntity {
$this->addType('archived', 'boolean');
$this->addType('notified', 'boolean');
$this->addType('deletedAt', 'integer');
$this->addType('duedate', 'datetime');
$this->addRelation('labels');
$this->addRelation('assignedUsers');
$this->addRelation('attachments');
@@ -87,50 +126,6 @@ class Card extends RelationalEntity {
$this->databaseType = $type;
}
public function getDuedate($isoFormat = false) {
if ($this->duedate === null) {
return null;
}
$dt = new DateTime($this->duedate);
if (!$isoFormat && $this->databaseType === 'mysql') {
return $dt->format('Y-m-d H:i:s');
}
return $dt->format('c');
}
public function jsonSerialize(): array {
$json = parent::jsonSerialize();
$json['overdue'] = self::DUEDATE_FUTURE;
$due = $this->duedate ? strtotime($this->duedate) : false;
if ($due !== false) {
$today = new DateTime();
$today->setTime(0, 0);
$match_date = new DateTime($this->duedate);
$match_date->setTime(0, 0);
$diff = $today->diff($match_date);
$diffDays = (integer) $diff->format('%R%a'); // Extract days count in interval
if ($diffDays === 1) {
$json['overdue'] = self::DUEDATE_NEXT;
}
if ($diffDays === 0) {
$json['overdue'] = self::DUEDATE_NOW;
}
if ($diffDays < 0) {
$json['overdue'] = self::DUEDATE_OVERDUE;
}
}
$json['duedate'] = $this->getDuedate(true);
unset($json['notified']);
unset($json['descriptionPrev']);
unset($json['relatedStack']);
unset($json['relatedBoard']);
return $json;
}
public function getCalendarObject(): VCalendar {
$calendar = new VCalendar();
$event = $calendar->createComponent('VTODO');
@@ -139,7 +134,7 @@ class Card extends RelationalEntity {
$creationDate = new DateTime();
$creationDate->setTimestamp($this->createdAt);
$event->DTSTAMP = $creationDate;
$event->DUE = new DateTime($this->getDuedate(true), new DateTimeZone('UTC'));
$event->DUE = new DateTime($this->getDuedate()->format('c'), new DateTimeZone('UTC'));
}
$event->add('RELATED-TO', 'deck-stack-' . $this->getStackId());

View File

@@ -227,6 +227,21 @@ class CardMapper extends QBMapper implements IPermissionMapper {
return $this->findEntities($qb);
}
public function findAllByBoardId(int $boardId, ?int $limit = null, ?int $offset = null): array {
$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('board_id', $qb->createNamedParameter($boardId, IQueryBuilder::PARAM_INT)))
->andWhere($qb->expr()->eq('archived', $qb->createNamedParameter(false, IQueryBuilder::PARAM_BOOL)))
->setMaxResults($limit)
->setFirstResult($offset)
->orderBy('c.lastmodified')
->addOrderBy('c.id');
return $this->findEntities($qb);
}
public function findAllWithDue($boardId) {
$qb = $this->db->getQueryBuilder();
$qb->select('c.*')
@@ -549,10 +564,10 @@ class CardMapper extends QBMapper implements IPermissionMapper {
$qb->execute();
}
public function isOwner($userId, $cardId): bool {
public function isOwner($userId, $id): bool {
$sql = 'SELECT owner FROM `*PREFIX*deck_boards` WHERE `id` IN (SELECT board_id FROM `*PREFIX*deck_stacks` WHERE id IN (SELECT stack_id FROM `*PREFIX*deck_cards` WHERE id = ?))';
$stmt = $this->db->prepare($sql);
$stmt->bindParam(1, $cardId, \PDO::PARAM_INT, 0);
$stmt->bindParam(1, $id, \PDO::PARAM_INT, 0);
$stmt->execute();
$row = $stmt->fetch();
return ($row['owner'] === $userId);

View File

@@ -24,6 +24,7 @@
namespace OCA\Deck\Db;
use OCP\ICacheFactory;
use OCP\ICache;
use OCP\IDBConnection;
use OCP\IRequest;
@@ -31,13 +32,16 @@ class ChangeHelper {
public const TYPE_BOARD = 'boardChanged';
public const TYPE_CARD = 'cardChanged';
private $db;
private IDBConnection $db;
private ICache $cache;
private IRequest $request;
private ?string $userId;
public function __construct(
IDBConnection $db,
ICacheFactory $cacheFactory,
IRequest $request,
$userId
?string $userId
) {
$this->db = $db;
$this->cache = $cacheFactory->createDistributed('deck_changes');

View File

@@ -23,17 +23,15 @@
namespace OCA\Deck\Db;
use OCP\AppFramework\Db\Mapper;
use OCP\AppFramework\Db\QBMapper;
use OCP\DB\QueryBuilder\IQueryBuilder;
/**
* Class DeckMapper
*
* @package OCA\Deck\Db
* @deprecated use QBMapper
*
* TODO: Move to QBMapper once Nextcloud 14 is a minimum requirement
*/
class DeckMapper extends Mapper {
class DeckMapper extends QBMapper {
/**
* @param $id
@@ -42,11 +40,11 @@ class DeckMapper extends Mapper {
* @throws \OCP\AppFramework\Db\DoesNotExistException
*/
public function find($id) {
$sql = 'SELECT * FROM `' . $this->tableName . '` ' . 'WHERE `id` = ?';
return $this->findEntity($sql, [$id]);
}
$qb = $this->db->getQueryBuilder();
$qb->select('*')
->from($this->getTableName())
->where($qb->expr()->eq('id', $qb->createNamedParameter($id, IQueryBuilder::PARAM_INT)));
protected function execute($sql, array $params = [], $limit = null, $offset = null) {
return parent::execute($sql, $params, $limit, $offset);
return $this->findEntity($qb);
}
}

View File

@@ -26,6 +26,7 @@ namespace OCA\Deck\Db;
use OCP\AppFramework\Db\DoesNotExistException;
use OCP\AppFramework\Db\Entity;
use OCP\AppFramework\Db\MultipleObjectsReturnedException;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\IDBConnection;
class LabelMapper extends DeckMapper implements IPermissionMapper {
@@ -33,41 +34,105 @@ class LabelMapper extends DeckMapper implements IPermissionMapper {
parent::__construct($db, 'deck_labels', Label::class);
}
public function findAll($boardId, $limit = null, $offset = null) {
$sql = 'SELECT * FROM `*PREFIX*deck_labels` WHERE `board_id` = ? ORDER BY `id`';
return $this->findEntities($sql, [$boardId], $limit, $offset);
/**
* @param numeric $boardId
* @param int|null $limit
* @param int|null $offset
* @return Label[]
* @throws \OCP\DB\Exception
*/
public function findAll($boardId, $limit = null, $offset = null): array {
$qb = $this->db->getQueryBuilder();
$qb->select('*')
->from($this->getTableName())
->where($qb->expr()->eq('board_id', $qb->createNamedParameter($boardId, IQueryBuilder::PARAM_INT)))
->setMaxResults($limit)
->setFirstResult($offset);
return $this->findEntities($qb);
}
public function delete(\OCP\AppFramework\Db\Entity $entity) {
/**
* @param Entity $entity
* @return Entity
* @throws \OCP\DB\Exception
*/
public function delete(Entity $entity): Entity {
// delete assigned labels
$this->deleteLabelAssignments($entity->getId());
// delete label
return parent::delete($entity);
}
public function findAssignedLabelsForCard($cardId, $limit = null, $offset = null) {
$sql = 'SELECT l.*,card_id FROM `*PREFIX*deck_assigned_labels` as al INNER JOIN *PREFIX*deck_labels as l ON l.id = al.label_id WHERE `card_id` = ? ORDER BY l.id';
return $this->findEntities($sql, [$cardId], $limit, $offset);
}
public function findAssignedLabelsForBoard($boardId, $limit = null, $offset = null) {
$sql = 'SELECT c.id as card_id, l.id as id, l.title as title, l.color as color FROM `*PREFIX*deck_cards` as c ' .
' INNER JOIN `*PREFIX*deck_assigned_labels` as al ON al.card_id = c.id INNER JOIN `*PREFIX*deck_labels` as l ON al.label_id = l.id WHERE board_id=? ORDER BY l.id';
return $this->findEntities($sql, [$boardId], $limit, $offset);
/**
* @param numeric $cardId
* @param int|null $limit
* @param int|null $offset
* @return Label[]
* @throws \OCP\DB\Exception
*/
public function findAssignedLabelsForCard($cardId, $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()->eq('card_id', $qb->createNamedParameter($cardId, IQueryBuilder::PARAM_INT)))
->orderBy('l.id')
->setMaxResults($limit)
->setFirstResult($offset);
return $this->findEntities($qb);
}
public function insert(Entity $entity) {
/**
* @param numeric $boardId
* @param int|null $limit
* @param int|null $offset
* @return Label[]
* @throws \OCP\DB\Exception
*/
public function findAssignedLabelsForBoard($boardId, $limit = null, $offset = null): array {
$qb = $this->db->getQueryBuilder();
$qb->select('l.id as id', 'l.title as title', 'l.color as color')
->selectAlias('c.id', 'card_id')
->from($this->getTableName(), 'l')
->innerJoin('l', 'deck_assigned_labels', 'al', 'al.label_id = l.id')
->innerJoin('l', 'deck_cards', 'c', 'al.card_id = c.id')
->where($qb->expr()->eq('board_id', $qb->createNamedParameter($boardId, IQueryBuilder::PARAM_INT)))
->orderBy('l.id')
->setMaxResults($limit)
->setFirstResult($offset);
return $this->findEntities($qb);
}
/**
* @param Entity $entity
* @return Entity
* @throws \OCP\DB\Exception
*/
public function insert(Entity $entity): Entity {
$entity->setLastModified(time());
return parent::insert($entity);
}
public function update(Entity $entity, $updateModified = true) {
/**
* @param Entity $entity
* @param bool $updateModified
* @return Entity
* @throws \OCP\DB\Exception
*/
public function update(Entity $entity, $updateModified = true): Entity {
if ($updateModified) {
$entity->setLastModified(time());
}
return parent::update($entity);
}
/**
* @param numeric $boardId
* @return array
* @throws \OCP\DB\Exception
*/
public function getAssignedLabelsForBoard($boardId) {
$labels = $this->findAssignedLabelsForBoard($boardId);
$result = [];
@@ -80,27 +145,51 @@ class LabelMapper extends DeckMapper implements IPermissionMapper {
return $result;
}
/**
* @param numeric $labelId
* @return void
* @throws \OCP\DB\Exception
*/
public function deleteLabelAssignments($labelId) {
$sql = 'DELETE FROM `*PREFIX*deck_assigned_labels` WHERE label_id = ?';
$stmt = $this->db->prepare($sql);
$stmt->bindParam(1, $labelId, \PDO::PARAM_INT, 0);
$stmt->execute();
$qb = $this->db->getQueryBuilder();
$qb->delete('deck_assigned_labels')
->where($qb->expr()->eq('label_id', $qb->createNamedParameter($labelId, IQueryBuilder::PARAM_INT)));
$qb->executeStatement();
}
/**
* @param numeric $cardId
* @return void
* @throws \OCP\DB\Exception
*/
public function deleteLabelAssignmentsForCard($cardId) {
$sql = 'DELETE FROM `*PREFIX*deck_assigned_labels` WHERE card_id = ?';
$stmt = $this->db->prepare($sql);
$stmt->bindParam(1, $cardId, \PDO::PARAM_INT, 0);
$stmt->execute();
$qb = $this->db->getQueryBuilder();
$qb->delete('deck_assigned_labels')
->where($qb->expr()->eq('card_id', $qb->createNamedParameter($cardId, IQueryBuilder::PARAM_INT)));
$qb->executeStatement();
}
/**
* @param string $userId
* @param numeric $labelId
* @return bool
* @throws \OCP\DB\Exception
*/
public function isOwner($userId, $labelId): bool {
$sql = 'SELECT owner FROM `*PREFIX*deck_boards` WHERE `id` IN (SELECT board_id FROM `*PREFIX*deck_labels` WHERE id = ?)';
$stmt = $this->execute($sql, [$labelId]);
$row = $stmt->fetch();
return ($row['owner'] === $userId);
$qb = $this->db->getQueryBuilder();
$qb->select('l.id')
->from($this->getTableName(), 'l')
->innerJoin('l', 'deck_boards', 'b', 'l.board_id = b.id')
->where($qb->expr()->eq('l.id', $qb->createNamedParameter($labelId, IQueryBuilder::PARAM_INT)))
->andWhere($qb->expr()->eq('b.owner', $qb->createNamedParameter($userId, IQueryBuilder::PARAM_STR)));
return count($qb->executeQuery()->fetchAll()) > 0;
}
/**
* @param numeric $id
* @return int|null
*/
public function findBoardId($id): ?int {
try {
$entity = $this->find($id);

View File

@@ -72,6 +72,9 @@ class RelationalEntity extends Entity implements \JsonSerializable {
$propertyReflection = $reflection->getProperty($property);
if (!$propertyReflection->isPrivate() && !in_array($property, $this->_resolvedProperties, true)) {
$json[$property] = $this->getter($property);
if ($json[$property] instanceof \DateTimeInterface) {
$json[$property] = $json[$property]->format('c');
}
}
}
}

View File

@@ -26,6 +26,7 @@ namespace OCA\Deck\Db;
use OCP\AppFramework\Db\DoesNotExistException;
use OCP\AppFramework\Db\Entity;
use OCP\AppFramework\Db\MultipleObjectsReturnedException;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\IDBConnection;
class StackMapper extends DeckMapper implements IPermissionMapper {
@@ -38,62 +39,112 @@ class StackMapper extends DeckMapper implements IPermissionMapper {
/**
* @param $id
* @throws MultipleObjectsReturnedException
* @param numeric $id
* @return Stack
* @throws DoesNotExistException
* @throws MultipleObjectsReturnedException
* @throws \OCP\DB\Exception
*/
public function find($id): Stack {
$sql = 'SELECT * FROM `*PREFIX*deck_stacks` ' .
'WHERE `id` = ?';
return $this->findEntity($sql, [$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);
}
/**
* @param $cardId
* @return Stack|null
* @throws \OCP\DB\Exception
*/
public function findStackFromCardId($cardId): ?Stack {
$sql = <<<SQL
SELECT s.*
FROM `*PREFIX*deck_stacks` as `s`
INNER JOIN `*PREFIX*deck_cards` as `c` ON s.id = c.stack_id
WHERE c.id = ?
SQL;
$qb = $this->db->getQueryBuilder();
$qb->select('s.*')
->from($this->getTableName(), 's')
->innerJoin('s', 'deck_cards', 'c', 's.id = c.stack_id')
->where($qb->expr()->eq('c.id', $qb->createNamedParameter($cardId, IQueryBuilder::PARAM_INT)));
try {
return $this->findEntity($sql, [$cardId]);
return $this->findEntity($qb);
} catch (MultipleObjectsReturnedException|DoesNotExistException $e) {
}
return null;
}
/**
* @param numeric $boardId
* @param int|null $limit
* @param int|null $offset
* @return Stack[]
* @throws \OCP\DB\Exception
*/
public function findAll($boardId, $limit = null, $offset = null): array {
$qb = $this->db->getQueryBuilder();
$qb->select('*')
->from($this->getTableName())
->where($qb->expr()->eq('board_id', $qb->createNamedParameter($boardId, IQueryBuilder::PARAM_INT)))
->andWhere($qb->expr()->eq('deleted_at', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT)))
->setFirstResult($offset)
->setMaxResults($limit);
public function findAll($boardId, $limit = null, $offset = null) {
$sql = 'SELECT * FROM `*PREFIX*deck_stacks` WHERE `board_id` = ? AND deleted_at = 0 ORDER BY `order`, `id`';
return $this->findEntities($sql, [$boardId], $limit, $offset);
return $this->findEntities($qb);
}
/**
* @param numeric $boardId
* @param int|null $limit
* @param int|null $offset
* @return Stack[]
* @throws \OCP\DB\Exception
*/
public function findDeleted($boardId, $limit = null, $offset = null) {
$sql = 'SELECT * FROM `*PREFIX*deck_stacks` s
WHERE `s`.`board_id` = ? AND NOT s.deleted_at = 0';
return $this->findEntities($sql, [$boardId], $limit, $offset);
$qb = $this->db->getQueryBuilder();
$qb->select('*')
->from($this->getTableName())
->where($qb->expr()->eq('board_id', $qb->createNamedParameter($boardId, IQueryBuilder::PARAM_INT)))
->andWhere($qb->expr()->neq('deleted_at', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT)))
->setFirstResult($offset)
->setMaxResults($limit);
return $this->findEntities($qb);
}
public function delete(Entity $entity) {
/**
* @param Entity $entity
* @return Entity
* @throws \OCP\DB\Exception
*/
public function delete(Entity $entity): Entity {
// delete cards on stack
$this->cardMapper->deleteByStack($entity->getId());
return parent::delete($entity);
}
public function isOwner($userId, $stackId): bool {
$sql = 'SELECT owner FROM `*PREFIX*deck_boards` WHERE `id` IN (SELECT board_id FROM `*PREFIX*deck_stacks` WHERE id = ?)';
$stmt = $this->execute($sql, [$stackId]);
$row = $stmt->fetch();
return ($row['owner'] === $userId);
/**
* @param numeric $userId
* @param numeric $stackId
* @return bool
* @throws \OCP\DB\Exception
*/
public function isOwner($userId, $id): bool {
$qb = $this->db->getQueryBuilder();
$qb->select('s.id')
->from($this->getTableName(), 's')
->innerJoin('s', 'deck_boards', 'b', 'b.id = s.board_id')
->where($qb->expr()->eq('s.id', $qb->createNamedParameter($id, IQueryBuilder::PARAM_INT)))
->andWhere($qb->expr()->eq('owner', $qb->createNamedParameter($userId, IQueryBuilder::PARAM_STR)));
return count($qb->executeQuery()->fetchAll()) > 0;
}
/**
* @param numeric $id
* @return int|null
* @throws \OCP\DB\Exception
*/
public function findBoardId($id): ?int {
try {
$entity = $this->find($id);

View File

@@ -33,7 +33,6 @@ use OCP\AppFramework\OCS\OCSException;
use OCP\AppFramework\OCSController;
use OCP\ILogger;
use OCP\IRequest;
use OCP\Util;
use OCP\IConfig;
class ExceptionMiddleware extends Middleware {
@@ -85,9 +84,9 @@ class ExceptionMiddleware extends Middleware {
'message' => 'Permission denied'
], 403);
}
if ($exception instanceof StatusException) {
if ($this->config->getSystemValue('loglevel', Util::WARN) === Util::DEBUG) {
if ($this->config->getSystemValue('loglevel', ILogger::WARN) === ILogger::DEBUG) {
$this->logger->logException($exception);
}

View File

@@ -1,11 +1,8 @@
/*
* @copyright Copyright (c) 2016 Julius Härtl <jus@bitgrid.net>
<?php
/**
* @copyright Copyright (c) 2022 Raul Ferreira Fuentes <raul@nextcloud.com>
*
* @author Julius Härtl <jus@bitgrid.net>
* @author Artem Anufrij <artem.anufrij@live.de>
* @author Marin Treselj <marin@pixelipo.com>
* @author Oskar Kurz <oskar.kurz@gmail.com>
* @author Ryan Fletcher <ryan.fletcher@codepassion.ca>
* @author Raul Ferreira Fuentes <raul@nextcloud.com>
*
* @license GNU AGPL version 3 or any later version
*
@@ -23,6 +20,26 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\Deck\Model;
@import 'icons';
@import 'print';
use OCA\Deck\Db\Board;
class BoardSummary extends Board {
private Board $board;
public function __construct(Board $board) {
parent::__construct();
$this->board = $board;
}
public function jsonSerialize(): array {
return [
'id' => $this->getId(),
'title' => $this->getTitle()
];
}
public function __call($name, $arguments) {
return $this->board->__call($name, $arguments);
}
}

92
lib/Model/CardDetails.php Normal file
View File

@@ -0,0 +1,92 @@
<?php
/**
* @copyright Copyright (c) 2022 Raul Ferreira Fuentes <raul@nextcloud.com>
*
* @author Raul Ferreira Fuentes <raul@nextcloud.com>
*
* @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/>.
*
*/
namespace OCA\Deck\Model;
use DateTime;
use OCA\Deck\Db\Board;
use OCA\Deck\Db\Card;
class CardDetails extends Card {
private Card $card;
private ?Board $board;
public function __construct(Card $card, ?Board $board = null) {
parent::__construct();
$this->card = $card;
$this->board = $board;
}
public function setBoard(?Board $board): void {
$this->board = $board;
}
public function jsonSerialize(array $extras = []): array {
$array = $this->card->jsonSerialize();
unset($array['notified'], $array['descriptionPrev'], $array['relatedStack'], $array['relatedBoard']);
$array['overdue'] = $this->getDueStatus();
$this->appendBoardDetails($array);
return $array;
}
private function getDueStatus(): int {
$today = new DateTime();
$today->setTime(0, 0);
$match_date = $this->card->getDuedate();
if (!$match_date) {
return Card::DUEDATE_FUTURE;
}
$match_date->setTime(0, 0);
$diff = $today->diff($match_date);
$diffDays = (int) $diff->format('%R%a'); // Extract days count in interval
if ($diffDays === 1) {
return Card::DUEDATE_NEXT;
}
if ($diffDays === 0) {
return Card::DUEDATE_NOW;
}
if ($diffDays < 0) {
return Card::DUEDATE_OVERDUE;
}
return Card::DUEDATE_FUTURE;
}
private function appendBoardDetails(&$array): void {
if (!$this->board) {
return;
}
$array['boardId'] = $this->board->id;
$array['board'] = (new BoardSummary($this->board))->jsonSerialize();
}
public function __call($name, $arguments) {
return $this->card->__call($name, $arguments);
}
}

View File

@@ -129,7 +129,7 @@ class NotificationHelper {
->setSubject('card-overdue', [
$card->getTitle(), $board->getTitle()
])
->setDateTime(new DateTime($card->getDuedate()));
->setDateTime($card->getDuedate());
$this->notificationManager->notify($notification);
}
}
@@ -242,7 +242,7 @@ class NotificationHelper {
}
return $this->boards[$boardId];
}
private function generateBoardShared(Board $board, string $userId): INotification {
$notification = $this->notificationManager->createNotification();
$notification

View File

@@ -114,7 +114,7 @@ class Notifier implements INotifier {
$dn = $params[2];
}
$notification->setParsedSubject(
(string) $l->t('The card "%s" on "%s" has been assigned to you by %s.', [$params[0], $params[1], $dn])
$l->t('The card "%s" on "%s" has been assigned to you by %s.', [$params[0], $params[1], $dn])
);
$notification->setRichSubject(
$l->t('{user} has assigned the card {deck-card} on {deck-board} to you.'),
@@ -151,7 +151,7 @@ class Notifier implements INotifier {
}
$notification->setParsedSubject(
(string) $l->t('The card "%s" on "%s" has reached its due date.', $params)
$l->t('The card "%s" on "%s" has reached its due date.', $params)
);
$notification->setRichSubject(
$l->t('The card {deck-card} on {deck-board} has reached its due date.'),
@@ -189,7 +189,7 @@ class Notifier implements INotifier {
$dn = $params[2];
}
$notification->setParsedSubject(
(string) $l->t('%s has mentioned you in a comment on "%s".', [$dn, $params[0]])
$l->t('%s has mentioned you in a comment on "%s".', [$dn, $params[0]])
);
$notification->setRichSubject(
$l->t('{user} has mentioned you in a comment on {deck-card}.'),
@@ -226,7 +226,7 @@ class Notifier implements INotifier {
$dn = $params[1];
}
$notification->setParsedSubject(
(string) $l->t('The board "%s" has been shared with you by %s.', [$params[0], $dn])
$l->t('The board "%s" has been shared with you by %s.', [$params[0], $dn])
);
$notification->setRichSubject(
$l->t('{user} has shared {deck-board} with you.'),

View File

@@ -54,22 +54,11 @@ use OCP\IURLGenerator;
class DeckProvider implements IFullTextSearchProvider {
public const DECK_PROVIDER_ID = 'deck';
/** @var IL10N */
private $l10n;
/** @var IUrlGenerator */
private $urlGenerator;
/** @var FullTextSearchService */
private $fullTextSearchService;
/** @var IRunner */
private $runner;
/** @var IIndexOptions */
private $indexOptions = [];
private IL10N $l10n;
private IUrlGenerator $urlGenerator;
private FullTextSearchService $fullTextSearchService;
private ?IRunner $runner = null;
private ?IIndexOptions $indexOptions = null;
/**

View File

@@ -0,0 +1,167 @@
<?php
/**
* @copyright Copyright (c) 2022 Julien Veyssier <eneiluj@posteo.net>
*
* @author Julien Veyssier <eneiluj@posteo.net>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
namespace OCA\Deck\Reference;
use OCA\Deck\AppInfo\Application;
use OCA\Deck\Db\Assignment;
use OCA\Deck\Db\Attachment;
use OCA\Deck\Db\Label;
use OCA\Deck\Model\CardDetails;
use OCA\Deck\Service\BoardService;
use OCA\Deck\Service\CardService;
use OCA\Deck\Service\StackService;
use OCP\Collaboration\Reference\IReference;
use OCP\Collaboration\Reference\IReferenceProvider;
use OCP\Collaboration\Reference\Reference;
use OCP\IURLGenerator;
class CardReferenceProvider implements IReferenceProvider {
private CardService $cardService;
private IURLGenerator $urlGenerator;
private BoardService $boardService;
private StackService $stackService;
public function __construct(CardService $cardService,
BoardService $boardService,
StackService $stackService,
IURLGenerator $urlGenerator,
?string $userId) {
$this->cardService = $cardService;
$this->urlGenerator = $urlGenerator;
$this->boardService = $boardService;
$this->stackService = $stackService;
}
/**
* @inheritDoc
*/
public function matchReference(string $referenceText): bool {
$start = $this->urlGenerator->getAbsoluteURL('/apps/' . Application::APP_ID);
$startIndex = $this->urlGenerator->getAbsoluteURL('/index.php/apps/' . Application::APP_ID);
// link example: https://nextcloud.local/index.php/apps/deck/#/board/2/card/11
$noIndexMatch = preg_match('/^' . preg_quote($start, '/') . '\/#\/board\/[0-9]+\/card\/[0-9]+$/', $referenceText) === 1;
$indexMatch = preg_match('/^' . preg_quote($startIndex, '/') . '\/#\/board\/[0-9]+\/card\/[0-9]+$/', $referenceText) === 1;
return $noIndexMatch || $indexMatch;
}
/**
* @inheritDoc
*/
public function resolveReference(string $referenceText): ?IReference {
if ($this->matchReference($referenceText)) {
$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();
$card = $this->sanitizeSerializedCard($card);
$board = $this->sanitizeSerializedBoard($board);
$stack = $this->sanitizeSerializedStack($stack);
/** @var IReference $reference */
$reference = new Reference($referenceText);
$reference->setRichObject(Application::APP_ID . '-card', [
'id' => $boardId . '/' . $cardId,
'card' => $card,
'board' => $board,
'stack' => $stack,
]);
return $reference;
}
}
return null;
}
private function sanitizeSerializedStack(array $stack): array {
$stack['cards'] = array_map(function (CardDetails $cardDetails) {
$result = $cardDetails->jsonSerialize();
unset($result['assignedUsers']);
return $result;
}, $stack['cards']);
return $stack;
}
private function sanitizeSerializedBoard(array $board): array {
unset($board['labels']);
$board['owner'] = $board['owner']->jsonSerialize();
unset($board['acl']);
unset($board['users']);
return $board;
}
private function sanitizeSerializedCard(array $card): array {
$card['labels'] = array_map(function (Label $label) {
return $label->jsonSerialize();
}, $card['labels']);
$card['assignedUsers'] = array_map(function (Assignment $assignment) {
$result = $assignment->jsonSerialize();
$result['participant'] = $result['participant']->jsonSerialize();
return $result;
}, $card['assignedUsers']);
$card['owner'] = $card['owner']->jsonSerialize();
unset($card['relatedStack']);
unset($card['relatedBoard']);
$card['attachments'] = array_map(function (Attachment $attachment) {
return $attachment->jsonSerialize();
}, $card['attachments']);
return $card;
}
private function getBoardCardId(string $url): ?array {
$start = $this->urlGenerator->getAbsoluteURL('/apps/' . Application::APP_ID);
$startIndex = $this->urlGenerator->getAbsoluteURL('/index.php/apps/' . Application::APP_ID);
preg_match('/^' . preg_quote($start, '/') . '\/#\/board\/([0-9]+)\/card\/([0-9]+)$/', $url, $matches);
if ($matches && count($matches) > 2) {
return [$matches[1], $matches[2]];
}
preg_match('/^' . preg_quote($startIndex, '/') . '\/#\/board\/([0-9]+)\/card\/([0-9]+)$/', $url, $matches2);
if ($matches2 && count($matches2) > 2) {
return [$matches2[1], $matches2[2]];
}
return null;
}
public function getCachePrefix(string $referenceId): string {
$ids = $this->getBoardCardId($referenceId);
if ($ids !== null) {
[$boardId, $cardId] = $ids;
return $boardId . '/' . $cardId;
}
return $referenceId;
}
public function getCacheKey(string $referenceId): ?string {
return $this->userId ?? '';
}
}

View File

@@ -24,7 +24,6 @@
namespace OCA\Deck\Service;
use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
use OCA\Deck\Activity\ActivityManager;
use OCA\Deck\Activity\ChangeSet;
use OCA\Deck\AppInfo\Application;
@@ -43,39 +42,43 @@ use OCA\Deck\Event\AclUpdatedEvent;
use OCA\Deck\NoPermissionException;
use OCA\Deck\Notification\NotificationHelper;
use OCP\AppFramework\Db\DoesNotExistException;
use OCP\AppFramework\Db\MultipleObjectsReturnedException;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\IConfig;
use OCP\IDBConnection;
use OCP\IGroupManager;
use OCP\IL10N;
use OCP\DB\Exception as DbException;
use OCA\Deck\Db\Board;
use OCA\Deck\Db\BoardMapper;
use OCA\Deck\Db\LabelMapper;
use OCP\IUserManager;
use OCA\Deck\BadRequestException;
use OCP\IURLGenerator;
use OCP\Server;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
class BoardService {
private $boardMapper;
private $stackMapper;
private $labelMapper;
private $aclMapper;
/** @var IConfig */
private $config;
private $l10n;
private $permissionService;
private $notificationHelper;
private $assignedUsersMapper;
private $userManager;
private $groupManager;
private $userId;
private $activityManager;
private $eventDispatcher;
private $changeHelper;
private $cardMapper;
private $boardsCache = null;
private $urlGenerator;
private BoardMapper $boardMapper;
private StackMapper $stackMapper;
private LabelMapper $labelMapper;
private AclMapper $aclMapper;
private IConfig $config;
private IL10N $l10n;
private PermissionService $permissionService;
private NotificationHelper $notificationHelper;
private AssignmentMapper $assignedUsersMapper;
private IUserManager $userManager;
private IGroupManager $groupManager;
private ?string $userId;
private ActivityManager $activityManager;
private IEventDispatcher $eventDispatcher;
private ChangeHelper $changeHelper;
private CardMapper $cardMapper;
private ?array $boardsCache = null;
private IURLGenerator $urlGenerator;
private IDBConnection $connection;
public function __construct(
BoardMapper $boardMapper,
@@ -94,7 +97,8 @@ class BoardService {
IEventDispatcher $eventDispatcher,
ChangeHelper $changeHelper,
IURLGenerator $urlGenerator,
$userId
IDBConnection $connection,
?string $userId
) {
$this->boardMapper = $boardMapper;
$this->stackMapper = $stackMapper;
@@ -113,6 +117,7 @@ class BoardService {
$this->userId = $userId;
$this->urlGenerator = $urlGenerator;
$this->cardMapper = $cardMapper;
$this->connection = $connection;
}
/**
@@ -534,7 +539,7 @@ class BoardService {
// TODO: use the dispatched event for this
try {
$resourceProvider = \OC::$server->query(\OCA\Deck\Collaboration\Resources\ResourceProvider::class);
$resourceProvider = Server::get(\OCA\Deck\Collaboration\Resources\ResourceProvider::class);
$resourceProvider->invalidateAccessCache($boardId);
} catch (\Exception $e) {
}
@@ -590,18 +595,14 @@ class BoardService {
}
/**
* @param $id
* @return \OCP\AppFramework\Db\Entity
* @throws DbException
* @throws DoesNotExistException
* @throws \OCA\Deck\NoPermissionException
* @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException
* @throws BadRequestException
* @throws NoPermissionException
* @throws MultipleObjectsReturnedException
* @throws ContainerExceptionInterface
* @throws NotFoundExceptionInterface
*/
public function deleteAcl($id) {
if (is_numeric($id) === false) {
throw new BadRequestException('id must be a number');
}
public function deleteAcl(int $id): ?Acl {
$this->permissionService->checkPermission($this->aclMapper, $id, Acl::PERMISSION_SHARE);
/** @var Acl $acl */
$acl = $this->aclMapper->find($id);
@@ -620,16 +621,16 @@ class BoardService {
$version = \OCP\Util::getVersion()[0];
if ($version >= 16) {
try {
$resourceProvider = \OC::$server->query(\OCA\Deck\Collaboration\Resources\ResourceProvider::class);
$resourceProvider = Server::get(\OCA\Deck\Collaboration\Resources\ResourceProvider::class);
$resourceProvider->invalidateAccessCache($acl->getBoardId());
} catch (\Exception $e) {
}
}
$delete = $this->aclMapper->delete($acl);
$deletedAcl = $this->aclMapper->delete($acl);
$this->eventDispatcher->dispatchTyped(new AclDeletedEvent($acl));
return $delete;
return $deletedAcl;
}
/**
@@ -683,7 +684,7 @@ class BoardService {
}
public function transferBoardOwnership(int $boardId, string $newOwner, bool $changeContent = false): Board {
\OC::$server->getDatabaseConnection()->beginTransaction();
$this->connection->beginTransaction();
try {
$board = $this->boardMapper->find($boardId);
$previousOwner = $board->getOwner();
@@ -692,7 +693,10 @@ class BoardService {
if (!$changeContent) {
try {
$this->addAcl($boardId, Acl::PERMISSION_TYPE_USER, $previousOwner, true, true, true);
} catch (UniqueConstraintViolationException $e) {
} catch (DbException $e) {
if ($e->getReason() !== DbException::REASON_UNIQUE_CONSTRAINT_VIOLATION) {
throw $e;
}
}
}
$this->boardMapper->transferOwnership($previousOwner, $newOwner, $boardId);
@@ -702,10 +706,10 @@ class BoardService {
$this->assignedUsersMapper->remapAssignedUser($boardId, $previousOwner, $newOwner);
$this->cardMapper->remapCardOwner($boardId, $previousOwner, $newOwner);
}
\OC::$server->getDatabaseConnection()->commit();
$this->connection->commit();
return $this->boardMapper->find($boardId);
} catch (\Throwable $e) {
\OC::$server->getDatabaseConnection()->rollBack();
$this->connection->rollBack();
throw $e;
}
}

View File

@@ -45,26 +45,30 @@ use OCA\Deck\StatusException;
use OCA\Deck\BadRequestException;
use OCP\Comments\ICommentsManager;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\IRequest;
use OCP\IUserManager;
use OCP\IURLGenerator;
use Psr\Log\LoggerInterface;
class CardService {
private $cardMapper;
private $stackMapper;
private $boardMapper;
private $labelMapper;
private $permissionService;
private $boardService;
private $notificationHelper;
private $assignedUsersMapper;
private $attachmentService;
private $currentUser;
private $activityManager;
private $commentsManager;
private $changeHelper;
private $eventDispatcher;
private $userManager;
private $urlGenerator;
private CardMapper $cardMapper;
private StackMapper $stackMapper;
private BoardMapper $boardMapper;
private LabelMapper $labelMapper;
private PermissionService $permissionService;
private BoardService $boardService;
private NotificationHelper $notificationHelper;
private AssignmentMapper $assignedUsersMapper;
private AttachmentService $attachmentService;
private ?string $currentUser;
private ActivityManager $activityManager;
private ICommentsManager $commentsManager;
private ChangeHelper $changeHelper;
private IEventDispatcher $eventDispatcher;
private IUserManager $userManager;
private IURLGenerator $urlGenerator;
private LoggerInterface $logger;
private IRequest $request;
public function __construct(
CardMapper $cardMapper,
@@ -82,7 +86,9 @@ class CardService {
ChangeHelper $changeHelper,
IEventDispatcher $eventDispatcher,
IURLGenerator $urlGenerator,
$userId
LoggerInterface $logger,
IRequest $request,
?string $userId
) {
$this->cardMapper = $cardMapper;
$this->stackMapper = $stackMapper;
@@ -100,6 +106,8 @@ class CardService {
$this->eventDispatcher = $eventDispatcher;
$this->currentUser = $userId;
$this->urlGenerator = $urlGenerator;
$this->logger = $logger;
$this->request = $request;
}
public function enrich($card) {
@@ -131,23 +139,18 @@ class CardService {
}
/**
* @param $cardId
* @return \OCA\Deck\Db\RelationalEntity
* @throws \OCA\Deck\NoPermissionException
* @throws \OCP\AppFramework\Db\DoesNotExistException
* @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException
* @throws BadRequestException
*/
public function find($cardId) {
if (is_numeric($cardId) === false) {
throw new BadRequestException('card id must be a number');
}
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());
$attachments = $this->attachmentService->findAll($cardId, true);
if (\OC::$server->getRequest()->getParam('apiVersion') === '1.0') {
if ($this->request->getParam('apiVersion') === '1.0') {
$attachments = array_filter($attachments, function ($attachment) {
return $attachment->getType() === 'deck_file';
});
@@ -162,7 +165,7 @@ class CardService {
try {
$this->permissionService->checkPermission($this->boardMapper, $boardId, Acl::PERMISSION_READ);
} catch (NoPermissionException $e) {
\OC::$server->getLogger()->error('Unable to check permission for a previously obtained board ' . $boardId, ['exception' => $e]);
$this->logger->error('Unable to check permission for a previously obtained board ' . $boardId, ['exception' => $e]);
return [];
}
$cards = $this->cardMapper->findCalendarEntries($boardId);
@@ -334,11 +337,11 @@ class CardService {
$card->setType($type);
$card->setOrder($order);
$card->setOwner($owner);
$card->setDuedate($duedate);
$card->setDuedate($duedate ? new \DateTime($duedate) : null);
$resetDuedateNotification = false;
if (
$card->getDuedate() === null ||
(new \DateTime($card->getDuedate())) != (new \DateTime($changes->getBefore()->getDuedate() ?? ''))
($card->getDuedate()) != ($changes->getBefore()->getDuedate())
) {
$card->setNotified(false);
$resetDuedateNotification = true;
@@ -486,7 +489,7 @@ class CardService {
* @throws StatusException
* @throws \OCA\Deck\NoPermissionException
* @throws \OCP\AppFramework\Db\DoesNotExistException
* @throws \OCP\AppFramework\Db\
* @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException
* @throws BadRequestException
*/
public function archive($id) {

View File

@@ -31,6 +31,7 @@ use OCA\Circles\Model\Circle;
use OCA\Circles\Model\Member;
use OCA\Circles\Model\Probes\CircleProbe;
use OCP\App\IAppManager;
use OCP\Server;
use Throwable;
/**
@@ -38,7 +39,7 @@ use Throwable;
* having the app disabled is properly handled
*/
class CirclesService {
private $circlesEnabled;
private bool $circlesEnabled;
private $userCircleCache = [];
@@ -58,8 +59,7 @@ class CirclesService {
try {
// Enforce current user condition since we always want the full list of members
/** @var CirclesManager $circlesManager */
$circlesManager = \OC::$server->get(CirclesManager::class);
$circlesManager = Server::get(CirclesManager::class);
$circlesManager->startSuperSession();
return $circlesManager->getCircle($circleId);
} catch (Throwable $e) {
@@ -77,8 +77,7 @@ class CirclesService {
}
try {
/** @var CirclesManager $circlesManager */
$circlesManager = \OC::$server->get(CirclesManager::class);
$circlesManager = Server::get(CirclesManager::class);
$federatedUser = $circlesManager->getFederatedUser($userId, Member::TYPE_USER);
$circlesManager->startSession($federatedUser);
$circle = $circlesManager->getCircle($circleId);
@@ -106,8 +105,7 @@ class CirclesService {
}
try {
/** @var CirclesManager $circlesManager */
$circlesManager = \OC::$server->get(CirclesManager::class);
$circlesManager = Server::get(CirclesManager::class);
$federatedUser = $circlesManager->getFederatedUser($userId, Member::TYPE_USER);
$circlesManager->startSession($federatedUser);
$probe = new CircleProbe();

View File

@@ -40,20 +40,14 @@ use OutOfBoundsException;
use function is_numeric;
class CommentService {
private ICommentsManager $commentsManager;
private IUserManager $userManager;
private CardMapper $cardMapper;
private PermissionService $permissionService;
private ILogger $logger;
private ?string $userId;
/**
* @var ICommentsManager
*/
private $commentsManager;
/**
* @var IUserManager
*/
private $userManager;
/** @var ILogger */
private $logger;
private $userId;
public function __construct(ICommentsManager $commentsManager, PermissionService $permissionService, CardMapper $cardMapper, IUserManager $userManager, ILogger $logger, $userId) {
public function __construct(ICommentsManager $commentsManager, PermissionService $permissionService, CardMapper $cardMapper, IUserManager $userManager, ILogger $logger, ?string $userId) {
$this->commentsManager = $commentsManager;
$this->permissionService = $permissionService;
$this->cardMapper = $cardMapper;

View File

@@ -40,9 +40,9 @@ class ConfigService {
public const SETTING_BOARD_NOTIFICATION_DUE_ALL = 'all';
public const SETTING_BOARD_NOTIFICATION_DUE_DEFAULT = self::SETTING_BOARD_NOTIFICATION_DUE_ASSIGNED;
private $config;
private $userId;
private $groupManager;
private IConfig $config;
private ?string $userId = null;
private IGroupManager $groupManager;
public function __construct(
IConfig $config,
@@ -52,11 +52,14 @@ class ConfigService {
$this->config = $config;
}
public function getUserId() {
public function getUserId(): ?string {
if (!$this->userId) {
$user = \OC::$server->get(IUserSession::class)->getUser();
// We cannot use DI for the userId or UserSession as the ConfigService
// is initiated too early before the session is actually loaded
$user = \OCP\Server::get(IUserSession::class)->getUser();
$this->userId = $user ? $user->getUID() : null;
}
return $this->userId;
}
@@ -75,8 +78,11 @@ class ConfigService {
return $data;
}
public function get($key) {
$result = null;
/**
* @return bool|array{id: string, displayname: string}[]
* @throws NoPermissionException
*/
public function get(string $key) {
[$scope] = explode(':', $key, 2);
switch ($scope) {
case 'groupLimit':
@@ -90,11 +96,12 @@ class ConfigService {
}
return (bool)$this->config->getUserValue($this->getUserId(), Application::APP_ID, 'calendar', true);
case 'cardDetailsInModal':
if ($this->getUserId() === null) {
return false;
}
if ($this->getUserId() === null) {
return false;
}
return (bool)$this->config->getUserValue($this->getUserId(), Application::APP_ID, 'cardDetailsInModal', true);
}
return false;
}
public function isCalendarEnabled(int $boardId = null): bool {
@@ -157,7 +164,10 @@ class ConfigService {
return $result;
}
private function setGroupLimit($value) {
/**
* @return string[]
*/
private function setGroupLimit(array $value): array {
$groups = [];
foreach ($value as $group) {
$groups[] = $group['id'];
@@ -167,7 +177,7 @@ class ConfigService {
return $groups;
}
private function getGroupLimitList() {
private function getGroupLimitList(): array {
$value = $this->config->getAppValue(Application::APP_ID, 'groupLimit', '');
$groups = explode(',', $value);
if ($value === '') {
@@ -176,9 +186,10 @@ class ConfigService {
return $groups;
}
/** @return array{id: string, displayname: string}[] */
private function getGroupLimit() {
$groups = $this->getGroupLimitList();
$groups = array_map(function ($groupId) {
$groups = array_map(function (string $groupId): ?array {
/** @var IGroup $groups */
$group = $this->groupManager->get($groupId);
if ($group === null) {

View File

@@ -88,18 +88,6 @@ class DefaultBoardService {
* @throws BadRequestException
*/
public function createDefaultBoard(string $title, string $userId, string $color) {
if ($title === false || $title === null) {
throw new BadRequestException('title must be provided');
}
if ($userId === false || $userId === null) {
throw new BadRequestException('userId must be provided');
}
if ($color === false || $color === null) {
throw new BadRequestException('color must be provided');
}
$defaultBoard = $this->boardService->create($title, $userId, $color);
$defaultStacks = [];
$defaultCards = [];

View File

@@ -219,8 +219,11 @@ class FileService implements IAttachmentService {
throw new \Exception('no instance id!');
}
$name = 'appdata_' . $instanceId;
/** @var \OCP\Files\Folder $appDataFolder */
$appDataFolder = $this->rootFolder->get($name);
/** @var \OCP\Files\Folder $appDataFolder */
$appDataFolder = $appDataFolder->get('deck');
/** @var \OCP\Files\Folder $cardFolder */
$cardFolder = $appDataFolder->get($folderName);
return $cardFolder->get($attachment->getData());
}

View File

@@ -44,18 +44,19 @@ use OCP\Share\IShare;
use Psr\Log\LoggerInterface;
class FilesAppService implements IAttachmentService, ICustomAttachmentService {
private $request;
private $rootFolder;
private $shareProvider;
private $shareManager;
private $userId;
private $configService;
private $l10n;
private $preview;
private $mimeTypeDetector;
private $permissionService;
private $cardMapper;
private $logger;
private IRequest $request;
private IRootFolder $rootFolder;
private DeckShareProvider $shareProvider;
private IManager $shareManager;
private ?string $userId;
private ConfigService $configService;
private IL10N $l10n;
private IPreview $preview;
private IMimeTypeDetector $mimeTypeDetector;
private PermissionService $permissionService;
private CardMapper $cardMapper;
private LoggerInterface $logger;
private IDBConnection $connection;
public function __construct(
IRequest $request,
@@ -69,7 +70,8 @@ class FilesAppService implements IAttachmentService, ICustomAttachmentService {
PermissionService $permissionService,
CardMapper $cardMapper,
LoggerInterface $logger,
string $userId = null
IDBConnection $connection,
?string $userId
) {
$this->request = $request;
$this->l10n = $l10n;
@@ -83,6 +85,7 @@ class FilesAppService implements IAttachmentService, ICustomAttachmentService {
$this->permissionService = $permissionService;
$this->cardMapper = $cardMapper;
$this->logger = $logger;
$this->connection = $connection;
}
public function listAttachments(int $cardId): array {
@@ -108,9 +111,7 @@ class FilesAppService implements IAttachmentService, ICustomAttachmentService {
}
public function getAttachmentCount(int $cardId): int {
/** @var IDBConnection $qb */
$db = \OC::$server->getDatabaseConnection();
$qb = $db->getQueryBuilder();
$qb = $this->connection->getQueryBuilder();
$qb->select('s.id', 'f.fileid', 'f.path')
->selectAlias('st.id', 'storage_string_id')
->from('share', 's')
@@ -125,7 +126,7 @@ class FilesAppService implements IAttachmentService, ICustomAttachmentService {
));
$count = 0;
$cursor = $qb->execute();
$cursor = $qb->executeQuery();
while ($data = $cursor->fetch()) {
if ($this->shareProvider->isAccessibleResult($data)) {
$count++;

View File

@@ -47,34 +47,22 @@ use OCP\Comments\ICommentsManager;
use OCP\Comments\NotFoundException as CommentNotFoundException;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\IUserManager;
use OCP\Server;
class BoardImportService {
/** @var IUserManager */
private $userManager;
/** @var BoardMapper */
private $boardMapper;
/** @var AclMapper */
private $aclMapper;
/** @var LabelMapper */
private $labelMapper;
/** @var StackMapper */
private $stackMapper;
/** @var CardMapper */
private $cardMapper;
/** @var AssignmentMapper */
private $assignmentMapper;
/** @var AttachmentMapper */
private $attachmentMapper;
/** @var ICommentsManager */
private $commentsManager;
/** @var IEventDispatcher */
private $eventDispatcher;
/** @var string */
private $system = '';
/** @var null|ABoardImportService */
private $systemInstance;
/** @var array */
private $allowedSystems = [];
private IUserManager $userManager;
private BoardMapper $boardMapper;
private AclMapper $aclMapper;
private LabelMapper $labelMapper;
private StackMapper $stackMapper;
private CardMapper $cardMapper;
private AssignmentMapper $assignmentMapper;
private AttachmentMapper $attachmentMapper;
private ICommentsManager $commentsManager;
private IEventDispatcher $eventDispatcher;
private string $system = '';
private ?ABoardImportService $systemInstance;
private array $allowedSystems = [];
/**
* Data object created from config JSON
*
@@ -89,10 +77,7 @@ class BoardImportService {
* @psalm-suppress PropertyNotSetInConstructor
*/
private $data;
/**
* @var Board
*/
private $board;
private Board $board;
public function __construct(
IUserManager $userManager,
@@ -198,7 +183,7 @@ class BoardImportService {
}
if (!is_object($this->systemInstance)) {
$systemClass = 'OCA\\Deck\\Service\\Importer\\Systems\\' . ucfirst($this->getSystem()) . 'Service';
$this->systemInstance = \OC::$server->get($systemClass);
$this->systemInstance = Server::get($systemClass);
$this->systemInstance->setImportService($this);
}
return $this->systemInstance;
@@ -343,7 +328,7 @@ class BoardImportService {
}
public function insertAttachment(Attachment $attachment, string $content): Attachment {
$service = \OC::$server->get(FileService::class);
$service = Server::get(FileService::class);
$folder = $service->getFolder($attachment);
if ($folder->fileExists($attachment->getData())) {

View File

@@ -91,12 +91,10 @@ class LabelService {
$this->permissionService->checkPermission(null, $boardId, Acl::PERMISSION_MANAGE);
$boardLabels = $this->labelMapper->findAll($boardId);
if (\is_array($boardLabels)) {
foreach ($boardLabels as $boardLabel) {
if ($boardLabel->getTitle() === $title) {
throw new BadRequestException('title must be unique');
break;
}
foreach ($boardLabels as $boardLabel) {
if ($boardLabel->getTitle() === $title) {
throw new BadRequestException('title must be unique');
break;
}
}
@@ -163,15 +161,13 @@ class LabelService {
$label = $this->find($id);
$boardLabels = $this->labelMapper->findAll($label->getBoardId());
if (\is_array($boardLabels)) {
foreach ($boardLabels as $boardLabel) {
if ($boardLabel->getId() === $label->getId()) {
continue;
}
if ($boardLabel->getTitle() === $title) {
throw new BadRequestException('title must be unique');
break;
}
foreach ($boardLabels as $boardLabel) {
if ($boardLabel->getId() === $label->getId()) {
continue;
}
if ($boardLabel->getTitle() === $title) {
throw new BadRequestException('title must be unique');
break;
}
}

View File

@@ -30,31 +30,20 @@ namespace OCA\Deck\Service;
use OCA\Deck\Db\AssignmentMapper;
use OCA\Deck\Db\Card;
use OCA\Deck\Db\CardMapper;
use OCA\Deck\Model\CardDetails;
use OCP\Comments\ICommentsManager;
use OCP\IGroupManager;
use OCA\Deck\Db\Board;
use OCA\Deck\Db\BoardMapper;
use OCA\Deck\Db\LabelMapper;
use OCP\IUserManager;
class OverviewService {
/** @var BoardMapper */
private $boardMapper;
/** @var LabelMapper */
private $labelMapper;
/** @var CardMapper */
private $cardMapper;
/** @var AssignmentMapper */
private $assignedUsersMapper;
/** @var IUserManager */
private $userManager;
/** @var IGroupManager */
private $groupManager;
/** @var ICommentsManager */
private $commentsManager;
/** @var AttachmentService */
private $attachmentService;
private BoardMapper $boardMapper;
private LabelMapper $labelMapper;
private CardMapper $cardMapper;
private AssignmentMapper $assignedUsersMapper;
private IUserManager $userManager;
private ICommentsManager $commentsManager;
private AttachmentService $attachmentService;
public function __construct(
BoardMapper $boardMapper,
@@ -62,7 +51,6 @@ class OverviewService {
CardMapper $cardMapper,
AssignmentMapper $assignedUsersMapper,
IUserManager $userManager,
IGroupManager $groupManager,
ICommentsManager $commentsManager,
AttachmentService $attachmentService
) {
@@ -71,7 +59,6 @@ class OverviewService {
$this->cardMapper = $cardMapper;
$this->assignedUsersMapper = $assignedUsersMapper;
$this->userManager = $userManager;
$this->groupManager = $groupManager;
$this->commentsManager = $commentsManager;
$this->attachmentService = $attachmentService;
}
@@ -93,62 +80,37 @@ class OverviewService {
}
public function findAllWithDue(string $userId): array {
$userBoards = $this->findAllBoardsFromUser($userId);
$userBoards = $this->boardMapper->findAllForUser($userId);
$allDueCards = [];
foreach ($userBoards as $userBoard) {
$service = $this;
$allDueCards[] = array_map(static function ($card) use ($service, $userBoard, $userId) {
$service->enrich($card, $userId);
$cardData = $card->jsonSerialize();
$cardData['boardId'] = $userBoard->getId();
return $cardData;
$allDueCards[] = array_map(function ($card) use ($userBoard, $userId) {
$this->enrich($card, $userId);
return (new CardDetails($card, $userBoard))->jsonSerialize();
}, $this->cardMapper->findAllWithDue($userBoard->getId()));
}
return $allDueCards;
return array_merge(...$allDueCards);
}
public function findUpcomingCards(string $userId): array {
$userBoards = $this->findAllBoardsFromUser($userId);
$findCards = [];
$userBoards = $this->boardMapper->findAllForUser($userId);
$foundCards = [];
foreach ($userBoards as $userBoard) {
$service = $this;
if (count($userBoard->getAcl()) === 0) {
// private board: get cards with due date
$findCards[] = array_map(static function ($card) use ($service, $userBoard, $userId) {
$service->enrich($card, $userId);
$cardData = $card->jsonSerialize();
$cardData['boardId'] = $userBoard->getId();
return $cardData;
}, $this->cardMapper->findAllWithDue($userBoard->getId()));
$cards = $this->cardMapper->findAllWithDue($userBoard->getId());
} else {
// shared board: get all my assigned or unassigned cards
$findCards[] = array_map(static function ($card) use ($service, $userBoard, $userId) {
$service->enrich($card, $userId);
$cardData = $card->jsonSerialize();
$cardData['boardId'] = $userBoard->getId();
return $cardData;
}, $this->cardMapper->findToMeOrNotAssignedCards($userBoard->getId(), $userId));
$cards = $this->cardMapper->findToMeOrNotAssignedCards($userBoard->getId(), $userId);
}
$foundCards[] = array_map(
function (Card $card) use ($userBoard, $userId) {
$this->enrich($card, $userId);
return (new CardDetails($card, $userBoard))->jsonSerialize();
},
$cards
);
}
return $findCards;
}
// FIXME: This is duplicate code with the board service
private function findAllBoardsFromUser(string $userId): array {
$userInfo = $this->getBoardPrerequisites($userId);
$userBoards = $this->boardMapper->findAllByUser($userInfo['user'], null, null);
$groupBoards = $this->boardMapper->findAllByGroups($userInfo['user'], $userInfo['groups'], null, null);
$circleBoards = $this->boardMapper->findAllByCircles($userInfo['user'], null, null);
return array_unique(array_merge($userBoards, $groupBoards, $circleBoards));
}
private function getBoardPrerequisites($userId): array {
$user = $this->userManager->get($userId);
$groups = $user !== null ? $this->groupManager->getUserGroupIds($user) : [];
return [
'user' => $userId,
'groups' => $groups
];
return array_merge(...$foundCards);
}
}

View File

@@ -23,7 +23,7 @@
namespace OCA\Deck\Service;
use OC\Cache\CappedMemoryCache;
use OCP\Cache\CappedMemoryCache;
use OCA\Circles\Model\Member;
use OCA\Deck\Db\Acl;
use OCA\Deck\Db\AclMapper;
@@ -63,8 +63,8 @@ class PermissionService {
/** @var array */
private $users = [];
private $boardCache;
private $permissionCache;
private CappedMemoryCache $boardCache;
private CappedMemoryCache $permissionCache;
public function __construct(
ILogger $logger,

View File

@@ -30,26 +30,30 @@ use OCA\Deck\BadRequestException;
use OCA\Deck\Db\Acl;
use OCA\Deck\Db\AssignmentMapper;
use OCA\Deck\Db\BoardMapper;
use OCA\Deck\Db\Card;
use OCA\Deck\Db\CardMapper;
use OCA\Deck\Db\ChangeHelper;
use OCA\Deck\Db\LabelMapper;
use OCA\Deck\Db\Stack;
use OCA\Deck\Db\StackMapper;
use OCA\Deck\Model\CardDetails;
use OCA\Deck\NoPermissionException;
use OCA\Deck\StatusException;
use Psr\Log\LoggerInterface;
class StackService {
private $stackMapper;
private $cardMapper;
private $boardMapper;
private $labelMapper;
private $permissionService;
private $boardService;
private $cardService;
private $assignedUsersMapper;
private $attachmentService;
private $activityManager;
private $changeHelper;
private StackMapper $stackMapper;
private CardMapper $cardMapper;
private BoardMapper $boardMapper;
private LabelMapper $labelMapper;
private PermissionService $permissionService;
private BoardService $boardService;
private CardService $cardService;
private AssignmentMapper $assignedUsersMapper;
private AttachmentService $attachmentService;
private ActivityManager $activityManager;
private ChangeHelper $changeHelper;
private LoggerInterface $logger;
public function __construct(
StackMapper $stackMapper,
@@ -62,7 +66,8 @@ class StackService {
AssignmentMapper $assignedUsersMapper,
AttachmentService $attachmentService,
ActivityManager $activityManager,
ChangeHelper $changeHelper
ChangeHelper $changeHelper,
LoggerInterface $logger
) {
$this->stackMapper = $stackMapper;
$this->boardMapper = $boardMapper;
@@ -75,6 +80,7 @@ class StackService {
$this->attachmentService = $attachmentService;
$this->activityManager = $activityManager;
$this->changeHelper = $changeHelper;
$this->logger = $logger;
}
private function enrichStackWithCards($stack, $since = -1) {
@@ -84,9 +90,13 @@ class StackService {
return;
}
foreach ($cards as $card) {
$this->cardService->enrich($card);
}
$cards = array_map(
function (Card $card): CardDetails {
$this->cardService->enrich($card);
return new CardDetails($card);
},
$cards
);
$stack->setCards($cards);
}
@@ -112,12 +122,18 @@ class StackService {
$this->permissionService->checkPermission($this->stackMapper, $stackId, Acl::PERMISSION_READ);
$stack = $this->stackMapper->find($stackId);
$cards = $this->cardMapper->findAll($stackId);
foreach ($cards as $cardIndex => $card) {
$assignedUsers = $this->assignedUsersMapper->findAll($card->getId());
$card->setAssignedUsers($assignedUsers);
$card->setAttachmentCount($this->attachmentService->count($card->getId()));
}
$cards = array_map(
function (Card $card): CardDetails {
$assignedUsers = $this->assignedUsersMapper->findAll($card->getId());
$card->setAssignedUsers($assignedUsers);
$card->setAttachmentCount($this->attachmentService->count($card->getId()));
return new CardDetails($card);
},
$this->cardMapper->findAll($stackId)
);
$stack->setCards($cards);
return $stack;
@@ -146,7 +162,7 @@ class StackService {
try {
$this->permissionService->checkPermission(null, $boardId, Acl::PERMISSION_READ);
} catch (NoPermissionException $e) {
\OC::$server->getLogger()->error('Unable to check permission for a previously obtained board ' . $boardId, ['exception' => $e]);
$this->logger->error('Unable to check permission for a previously obtained board ' . $boardId, ['exception' => $e]);
return [];
}
return $this->stackMapper->findAll($boardId);
@@ -202,7 +218,7 @@ class StackService {
* @throws BadRequestException
*/
public function create($title, $boardId, $order) {
if ($title === false || $title === null) {
if ($title === false || $title === null || mb_strlen($title) === 0) {
throw new BadRequestException('title must be provided');
}
@@ -279,7 +295,7 @@ class StackService {
throw new BadRequestException('stack id must be a number');
}
if ($title === false || $title === null) {
if ($title === false || $title === null || mb_strlen($title) === 0) {
throw new BadRequestException('title must be provided');
}
@@ -336,6 +352,7 @@ class StackService {
$this->permissionService->checkPermission($this->stackMapper, $id, Acl::PERMISSION_MANAGE);
$stackToSort = $this->stackMapper->find($id);
$stacks = $this->stackMapper->findAll($stackToSort->getBoardId());
usort($stacks, static fn (Stack $stackA, Stack $stackB) => $stackA->getOrder() - $stackB->getOrder());
$result = [];
$i = 0;
foreach ($stacks as $stack) {

View File

@@ -65,22 +65,16 @@ class DeckShareProvider implements \OCP\Share\IShareProvider {
public const SHARE_TYPE_DECK_USER = IShare::TYPE_DECK_USER;
/** @var IDBConnection */
private $dbConnection;
/** @var IManager */
private $shareManager;
/** @var AttachmentCacheHelper */
private $attachmentCacheHelper;
/** @var BoardMapper */
private $boardMapper;
/** @var CardMapper */
private $cardMapper;
/** @var PermissionService */
private $permissionService;
/** @var ITimeFactory */
private $timeFactory;
/** @var IL10N */
private $l;
private IDBConnection $dbConnection;
private IManager $shareManager;
private AttachmentCacheHelper $attachmentCacheHelper;
private BoardMapper $boardMapper;
private CardMapper $cardMapper;
private PermissionService $permissionService;
private ITimeFactory $timeFactory;
private IL10N $l;
private IMimeTypeLoader $mimeTypeLoader;
private ?string $userId;
public function __construct(
IDBConnection $connection,
@@ -89,7 +83,10 @@ class DeckShareProvider implements \OCP\Share\IShareProvider {
CardMapper $cardMapper,
PermissionService $permissionService,
AttachmentCacheHelper $attachmentCacheHelper,
IL10N $l
IL10N $l,
ITimeFactory $timeFactory,
IMimeTypeLoader $mimeTypeLoader,
?string $userId
) {
$this->dbConnection = $connection;
$this->shareManager = $shareManager;
@@ -97,9 +94,10 @@ class DeckShareProvider implements \OCP\Share\IShareProvider {
$this->cardMapper = $cardMapper;
$this->attachmentCacheHelper = $attachmentCacheHelper;
$this->permissionService = $permissionService;
$this->l = $l;
$this->timeFactory = \OC::$server->get(ITimeFactory::class);
$this->timeFactory = $timeFactory;
$this->mimeTypeLoader = $mimeTypeLoader;
$this->userId = $userId;
}
public static function register(IEventDispatcher $dispatcher): void {
@@ -207,13 +205,13 @@ class DeckShareProvider implements \OCP\Share\IShareProvider {
->setValue('file_target', $qb->createNamedParameter($target))
->setValue('permissions', $qb->createNamedParameter($permissions))
->setValue('token', $qb->createNamedParameter($token))
->setValue('stime', $qb->createNamedParameter(\OC::$server->get(ITimeFactory::class)->getTime()));
->setValue('stime', $qb->createNamedParameter($this->timeFactory->getTime()));
if ($expirationDate !== null) {
$qb->setValue('expiration', $qb->createNamedParameter($expirationDate, 'datetime'));
}
$qb->execute();
$qb->executeStatement();
return $qb->getLastInsertId();
}
@@ -281,7 +279,7 @@ class DeckShareProvider implements \OCP\Share\IShareProvider {
$entryData = $data;
$entryData['permissions'] = $entryData['f_permissions'];
$entryData['parent'] = $entryData['f_parent'];
$share->setNodeCacheEntry(Cache::cacheEntryFromData($entryData, \OC::$server->get(IMimeTypeLoader::class)));
$share->setNodeCacheEntry(Cache::cacheEntryFromData($entryData, $this->mimeTypeLoader));
}
return $share;
}
@@ -474,14 +472,14 @@ class DeckShareProvider implements \OCP\Share\IShareProvider {
'file_target' => $qb->createNamedParameter($share->getTarget()),
'permissions' => $qb->createNamedParameter($share->getPermissions()),
'stime' => $qb->createNamedParameter($share->getShareTime()->getTimestamp()),
])->execute();
])->executeStatement();
} else {
// Already a userroom share. Update it.
$qb = $this->dbConnection->getQueryBuilder();
$qb->update('share')
->set('file_target', $qb->createNamedParameter($share->getTarget()))
->where($qb->expr()->eq('id', $qb->createNamedParameter($data['id'])))
->execute();
->executeStatement();
}
return $share;
@@ -491,7 +489,7 @@ class DeckShareProvider implements \OCP\Share\IShareProvider {
* @inheritDoc
* @returns
*/
public function getSharesInFolder($userId, Folder $node, $reshares) {
public function getSharesInFolder($userId, Folder $node, $reshares, $shallow = true) {
$qb = $this->dbConnection->getQueryBuilder();
$qb->select('*')
->from('share', 's')
@@ -518,7 +516,11 @@ class DeckShareProvider implements \OCP\Share\IShareProvider {
}
$qb->innerJoin('s', 'filecache', 'f', $qb->expr()->eq('s.file_source', 'f.fileid'));
$qb->andWhere($qb->expr()->eq('f.parent', $qb->createNamedParameter($node->getId())));
if ($shallow) {
$qb->andWhere($qb->expr()->eq('f.parent', $qb->createNamedParameter($node->getId())));
} else {
$qb->andWhere($qb->expr()->like('f.path', $qb->createNamedParameter($this->dbConnection->escapeLikeParameter($node->getInternalPath()) . '/%')));
}
$qb->orderBy('s.id');
@@ -632,8 +634,8 @@ class DeckShareProvider implements \OCP\Share\IShareProvider {
$start = 0;
while (true) {
/** @var IShare[] $shareSlice */
$shareSlice = array_slice($shares, $start, 100);
$start += 100;
$shareSlice = array_slice($shares, $start, 1000);
$start += 1000;
if ($shareSlice === []) {
break;
@@ -712,15 +714,15 @@ class DeckShareProvider implements \OCP\Share\IShareProvider {
* @return IShare[]
*/
public function getSharedWith($userId, $shareType, $node, $limit, $offset): array {
$allBoards = $this->boardMapper->findAllForUser($userId);
$allBoards = $this->boardMapper->findBoardIds($userId);
/** @var IShare[] $shares */
$shares = [];
$start = 0;
while (true) {
$boards = array_slice($allBoards, $start, 100);
$start += 100;
$boards = array_slice($allBoards, $start, 1000);
$start += 1000;
if ($boards === []) {
break;
@@ -750,10 +752,6 @@ class DeckShareProvider implements \OCP\Share\IShareProvider {
$qb->andWhere($qb->expr()->eq('s.file_source', $qb->createNamedParameter($node->getId())));
}
$boards = array_map(function (Board $board) {
return $board->getId();
}, $boards);
$qb->andWhere($qb->expr()->eq('s.share_type', $qb->createNamedParameter(IShare::TYPE_DECK)))
->andWhere($qb->expr()->in('db.id', $qb->createNamedParameter(
$boards,
@@ -821,7 +819,7 @@ class DeckShareProvider implements \OCP\Share\IShareProvider {
$qb->expr()->eq('s.item_type', $qb->createNamedParameter('folder'))
));
$cursor = $qb->execute();
$cursor = $qb->executeQuery();
while ($data = $cursor->fetch()) {
if (!$this->isAccessibleResult($data)) {
continue;
@@ -836,9 +834,7 @@ class DeckShareProvider implements \OCP\Share\IShareProvider {
}
$cursor->closeCursor();
$shares = $this->resolveSharesForRecipient($shares, \OC::$server->getUserSession()->getUser()->getUID());
return $shares;
return $this->resolveSharesForRecipient($shares, $this->userId);
}
public function isAccessibleResult(array $data): bool {
@@ -941,7 +937,7 @@ class DeckShareProvider implements \OCP\Share\IShareProvider {
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
));
$cursor = $qb->execute();
$cursor = $qb->executeQuery();
$users = [];
while ($row = $cursor->fetch()) {

View File

@@ -29,14 +29,13 @@ namespace OCA\Deck\Sharing;
use OC\Files\Filesystem;
use OCA\Deck\Service\ConfigService;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\Server;
use OCP\Share\Events\VerifyMountPointEvent;
use OCP\Share\IShare;
use Symfony\Component\EventDispatcher\GenericEvent;
class Listener {
/** @var ConfigService */
private $configService;
private ConfigService $configService;
public function __construct(ConfigService $configService) {
$this->configService = $configService;
@@ -52,13 +51,13 @@ class Listener {
public static function listenPreShare(GenericEvent $event): void {
/** @var self $listener */
$listener = \OC::$server->query(self::class);
$listener = Server::get(self::class);
$listener->overwriteShareTarget($event);
}
public static function listenVerifyMountPointEvent(VerifyMountPointEvent $event): void {
/** @var self $listener */
$listener = \OC::$server->query(self::class);
$listener = Server::get(self::class);
$listener->overwriteMountPoint($event);
}

66645
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,100 +1,106 @@
{
"name": "deck",
"description": "",
"version": "1.7.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",
"lint": "eslint --ext .js,.vue src",
"lint:fix": "eslint --ext .js,.vue src --fix",
"stylelint": "stylelint src",
"stylelint:fix": "stylelint src --fix",
"test": "jest",
"test:coverage": "jest --coverage"
},
"dependencies": {
"@babel/polyfill": "^7.12.1",
"@babel/runtime": "^7.17.9",
"@juliushaertl/vue-richtext": "^1.0.1",
"@nextcloud/auth": "^1.3.0",
"@nextcloud/axios": "^1.9.0",
"@nextcloud/dialogs": "^3.1.2",
"@nextcloud/event-bus": "^2.1.1",
"@nextcloud/files": "^2.1.0",
"@nextcloud/initial-state": "^1.2.1",
"@nextcloud/l10n": "^1.4.1",
"@nextcloud/moment": "^1.2.0",
"@nextcloud/router": "^2.0.0",
"@nextcloud/vue": "^5.3.1",
"@nextcloud/vue-dashboard": "^2.0.1",
"blueimp-md5": "^2.19.0",
"dompurify": "^2.3.6",
"lodash": "^4.17.21",
"markdown-it": "^12.3.2",
"markdown-it-link-attributes": "^4.0.0",
"markdown-it-task-checkbox": "^1.0.6",
"moment": "^2.29.2",
"nextcloud-vue-collections": "^0.9.0",
"p-queue": "^6.6.2",
"url-search-params-polyfill": "^8.1.1",
"vue": "^2.6.14",
"vue-at": "^2.5.0-beta.2",
"vue-click-outside": "^1.1.0",
"vue-easymde": "^2.0.0",
"vue-infinite-loading": "^2.4.5",
"vue-router": "^3.5.3",
"vue-smooth-dnd": "^0.8.1",
"vuex": "^3.6.2",
"vuex-router-sync": "^5.0.0"
},
"browserslist": [
"extends @nextcloud/browserslist-config"
],
"engines": {
"node": "^14.0.0",
"npm": "^7.0.0"
},
"devDependencies": {
"@nextcloud/babel-config": "^1.0.0",
"@nextcloud/browserslist-config": "^2.2.0",
"@nextcloud/eslint-config": "^6.1.2",
"@nextcloud/stylelint-config": "^2.1.2",
"@nextcloud/webpack-vue-config": "^5.0.0",
"@relative-ci/agent": "^3.1.2",
"@vue/test-utils": "^1.3.0",
"jest": "^27.5.1",
"jest-serializer-vue": "^2.0.2",
"vue-jest": "^3.0.7"
},
"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.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",
"stylelint": "stylelint src",
"stylelint:fix": "stylelint src --fix",
"test": "jest",
"test:coverage": "jest --coverage"
},
"dependencies": {
"@babel/polyfill": "^7.12.1",
"@babel/runtime": "^7.19.4",
"@juliushaertl/vue-richtext": "^1.0.1",
"@nextcloud/auth": "^2.0.0",
"@nextcloud/axios": "^2.1.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": "^1.6.0",
"@nextcloud/moment": "^1.2.1",
"@nextcloud/router": "^2.0.0",
"@nextcloud/vue": "^7.0.1",
"@nextcloud/vue-dashboard": "^2.0.1",
"@nextcloud/vue-richtext": "^2.0.4",
"blueimp-md5": "^2.19.0",
"dompurify": "^2.4.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.10.0",
"p-queue": "^7.3.0",
"url-search-params-polyfill": "^8.1.1",
"vue": "^2.7.13",
"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.1.2",
"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/eslint-config": "^8.0.0",
"@nextcloud/stylelint-config": "^2.2.0",
"@nextcloud/webpack-vue-config": "^5.3.0",
"@relative-ci/agent": "^4.1.1",
"@vue/test-utils": "^1.3.0",
"cypress": "^10.10.0",
"eslint-webpack-plugin": "^3.2.0",
"jest": "^29.2.1",
"jest-serializer-vue": "^2.0.2",
"stylelint-webpack-plugin": "^3.3.0",
"vue-jest": "^3.0.7",
"vue-template-compiler": "^2.7.13"
},
"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

@@ -7,6 +7,9 @@
xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"
errorBaseline="tests/psalm-baseline.xml"
>
<stubs>
<file name="tests/stub.phpstub" preloadClasses="true"/>
</stubs>
<projectFiles>
<directory name="lib" />
<ignoreFiles>

View File

@@ -21,14 +21,13 @@
-->
<template>
<Content id="content" app-name="deck" :class="{ 'nav-hidden': !navShown, 'sidebar-hidden': !sidebarRouterView }">
<NcContent app-name="deck" :class="{ 'nav-hidden': !navShown, 'sidebar-hidden': !sidebarRouterView }">
<AppNavigation />
<AppContent>
<NcAppContent>
<router-view />
</AppContent>
</NcAppContent>
<Modal
v-if="cardDetailsInModal && $route.params.cardId"
<NcModal v-if="cardDetailsInModal && $route.params.cardId"
:clear-view-delay="0"
:title="t('deck', 'Card details')"
size="large"
@@ -36,18 +35,17 @@
<div class="modal__content modal__card">
<router-view name="sidebar" />
</div>
</Modal>
</NcModal>
<router-view name="sidebar" :visible="!cardDetailsInModal || !$route.params.cardId" />
</Content>
</NcContent>
</template>
<script>
import { mapState } from 'vuex'
import AppNavigation from './components/navigation/AppNavigation'
import { Modal, Content, AppContent } from '@nextcloud/vue'
import { BoardApi } from './services/BoardApi'
import AppNavigation from './components/navigation/AppNavigation.vue'
import { NcModal, NcContent, NcAppContent } from '@nextcloud/vue'
import { BoardApi } from './services/BoardApi.js'
import { emit, subscribe } from '@nextcloud/event-bus'
const boardApi = new BoardApi()
@@ -56,9 +54,9 @@ export default {
name: 'App',
components: {
AppNavigation,
Modal,
Content,
AppContent,
NcModal,
NcContent,
NcAppContent,
},
provide() {
return {
@@ -130,7 +128,7 @@ export default {
<style lang="scss" scoped>
#content {
#content-vue {
#app-content {
transition: margin-left 100ms ease;
position: relative;
@@ -158,6 +156,37 @@ export default {
</style>
<style lang="scss">
@import '../css/print';
.icon-activity {
background-image: url(../img/activity-dark.svg);
body[data-theme-dark] & {
background-image: url(../img/activity.svg);
}
}
.avatardiv.circles {
background: var(--color-primary);
}
.icon-circles {
background-image: url(../img/circles-dark.svg);
opacity: 1;
background-size: 20px;
background-position: center center;
}
.icon-circles-white, .icon-circles.icon-white {
background-image: url(../img/circles.svg);
opacity: 1;
background-size: 20px;
background-position: center center;
}
.icon-colorpicker {
background-image: url('../img/color_picker.svg');
}
.multiselect {
width: 100%;

View File

@@ -21,7 +21,7 @@
-->
<template>
<Modal @close="close">
<NcModal @close="close">
<div id="modal-inner" :class="{ 'icon-loading': loading }">
<h1>{{ t('deck', 'Select the board to link to a project') }}</h1>
<input v-model="filter" type="text" :placeholder="t('deck', 'Search by board title')">
@@ -38,17 +38,17 @@
{{ t('deck', 'Select board') }}
</button>
</div>
</Modal>
</NcModal>
</template>
<script>
import Modal from '@nextcloud/vue/dist/Components/Modal'
import { NcModal } from '@nextcloud/vue'
import axios from '@nextcloud/axios'
import { generateUrl } from '@nextcloud/router'
export default {
name: 'BoardSelector',
components: {
Modal,
NcModal,
},
data() {
return {

View File

@@ -21,11 +21,11 @@
-->
<template>
<Modal class="card-selector" @close="close">
<NcModal class="card-selector" @close="close">
<div class="modal-scroller">
<div v-if="!creating && !created" id="modal-inner" :class="{ 'icon-loading': loading }">
<h3>{{ t('deck', 'Create a new card') }}</h3>
<Multiselect v-model="selectedBoard"
<NcMultiselect v-model="selectedBoard"
:placeholder="t('deck', 'Select a board')"
:options="boards"
:disabled="loading"
@@ -44,9 +44,9 @@
<span>{{ props.option.title }}</span>
</span>
</template>
</Multiselect>
</NcMultiselect>
<Multiselect v-model="selectedStack"
<NcMultiselect v-model="selectedStack"
:placeholder="t('deck', 'Select a list')"
:options="stacksFromBoard"
:max-height="100"
@@ -71,10 +71,10 @@
</div>
</div>
<div v-else id="modal-inner">
<EmptyContent v-if="creating" icon="icon-loading">
<NcEmptyContent v-if="creating" icon="icon-loading">
{{ t('deck', 'Creating the new card ') }}
</EmptyContent>
<EmptyContent v-else-if="created" icon="icon-checkmark">
</NcEmptyContent>
<NcEmptyContent v-else-if="created" icon="icon-checkmark">
{{ t('deck', 'Card "{card}" was added to "{board}"', { card: pendingTitle, board: selectedBoard.title }) }}
<template #desc>
<button class="primary" @click="openNewCard">
@@ -84,28 +84,26 @@
{{ t('deck', 'Close') }}
</button>
</template>
</EmptyContent>
</NcEmptyContent>
</div>
</div>
</Modal>
</NcModal>
</template>
<script>
import { generateUrl } from '@nextcloud/router'
import Modal from '@nextcloud/vue/dist/Components/Modal'
import Multiselect from '@nextcloud/vue/dist/Components/Multiselect'
import EmptyContent from '@nextcloud/vue/dist/Components/EmptyContent'
import { NcModal, NcMultiselect, NcEmptyContent } from '@nextcloud/vue'
import axios from '@nextcloud/axios'
import { CardApi } from './services/CardApi'
import { CardApi } from './services/CardApi.js'
const cardApi = new CardApi()
export default {
name: 'CardCreateDialog',
components: {
EmptyContent,
Modal,
Multiselect,
NcEmptyContent,
NcModal,
NcMultiselect,
},
props: {
title: {

View File

@@ -21,10 +21,10 @@
-->
<template>
<Modal class="card-selector" @close="close">
<NcModal class="card-selector" @close="close">
<div id="modal-inner" :class="{ 'icon-loading': loading }">
<h3>{{ title }}</h3>
<Multiselect v-model="selectedBoard"
<NcMultiselect v-model="selectedBoard"
:placeholder="t('deck', 'Select a board')"
:options="boards"
:disabled="loading"
@@ -42,9 +42,9 @@
<span>{{ props.option.title }}</span>
</span>
</template>
</Multiselect>
</NcMultiselect>
<Multiselect v-model="selectedCard"
<NcMultiselect v-model="selectedCard"
:placeholder="t('deck', 'Select a card')"
:options="cardsFromBoard"
:disabled="loading || selectedBoard === ''"
@@ -57,20 +57,19 @@
{{ t('deck', 'Cancel') }}
</button>
</div>
</Modal>
</NcModal>
</template>
<script>
import { generateUrl } from '@nextcloud/router'
import Modal from '@nextcloud/vue/dist/Components/Modal'
import Multiselect from '@nextcloud/vue/dist/Components/Multiselect'
import { NcModal, NcMultiselect } from '@nextcloud/vue'
import axios from '@nextcloud/axios'
export default {
name: 'CardSelector',
components: {
Modal,
Multiselect,
NcModal,
NcMultiselect,
},
props: {
title: {

View File

@@ -36,10 +36,10 @@
<script>
import RichText from '@juliushaertl/vue-richtext'
import { UserBubble } from '@nextcloud/vue'
import { NcUserBubble } from '@nextcloud/vue'
import moment from '@nextcloud/moment'
import DOMPurify from 'dompurify'
import relativeDate from '../mixins/relativeDate'
import relativeDate from '../mixins/relativeDate.js'
const InternalLink = {
name: 'InternalLink',
@@ -93,7 +93,7 @@ export default {
break
case 'user':
parameters[key] = {
component: UserBubble,
component: NcUserBubble,
props: {
user: parameters[key].id,
displayName: parameters[key].name,

View File

@@ -37,7 +37,7 @@
<script>
import axios from '@nextcloud/axios'
import { generateOcsUrl } from '@nextcloud/router'
import ActivityEntry from './ActivityEntry'
import ActivityEntry from './ActivityEntry.vue'
import InfiniteLoading from 'vue-infinite-loading'
const ACTIVITY_FETCH_LIMIT = 50

View File

@@ -27,24 +27,21 @@
@drop.prevent="handleDropFiles">
<slot />
<transition name="fade" mode="out-in">
<div
v-show="isDraggingOver"
<div v-show="isDraggingOver"
class="dragover">
<div class="drop-hint">
<div
class="drop-hint__icon"
<div class="drop-hint__icon"
:class="{
'icon-upload' : !isReadOnly,
'icon-error' : isReadOnly}" />
<h2
class="drop-hint__text">
<h2 class="drop-hint__text">
{{ dropHintText }}
</h2>
</div>
</div>
</transition>
<Modal v-if="modalShow" :title="t('deck', 'File already exists')" @close="modalShow=false">
<NcModal v-if="modalShow" :title="t('deck', 'File already exists')" @close="modalShow=false">
<div class="modal__content">
<h2>{{ t('deck', 'File already exists') }}</h2>
<p>
@@ -60,13 +57,13 @@
{{ t('deck', 'Keep existing file') }}
</button>
</div>
</Modal>
</NcModal>
</div>
</template>
<script>
import { Modal } from '@nextcloud/vue'
import attachmentUpload from '../mixins/attachmentUpload'
import { NcModal } from '@nextcloud/vue'
import attachmentUpload from '../mixins/attachmentUpload.js'
import { loadState } from '@nextcloud/initial-state'
let maxUploadSizeState
@@ -78,7 +75,7 @@ try {
export default {
name: 'AttachmentDragAndDrop',
components: { Modal },
components: { NcModal },
mixins: [attachmentUpload],
props: {
cardId: {

View File

@@ -25,11 +25,11 @@
<div v-if="overviewName" class="board-title">
<div class="board-bullet icon-calendar-dark" />
<h2>{{ overviewName }}</h2>
<Actions>
<ActionButton icon="icon-add" @click="clickShowAddCardModel">
<NcActions>
<NcActionButton icon="icon-add" @click="clickShowAddCardModel">
{{ t('deck', 'Add card') }}
</ActionButton>
</Actions>
</NcActionButton>
</NcActions>
<CardCreateDialog v-if="showAddCardModal" @close="clickHideAddCardModel" />
</div>
<div v-else-if="board" class="board-title">
@@ -49,11 +49,11 @@
<div v-if="board && canManage && !showArchived && !board.archived"
id="stack-add"
v-click-outside="hideAddStack">
<Actions v-if="!isAddStackVisible">
<ActionButton icon="icon-add" @click.stop="showAddStack">
<NcActions v-if="!isAddStackVisible">
<NcActionButton icon="icon-add" @click.stop="showAddStack">
{{ t('deck', 'Add list') }}
</ActionButton>
</Actions>
</NcActionButton>
</NcActions>
<form v-else @submit.prevent="addNewStack()">
<label for="new-stack-input-main" class="hidden-visually">{{ t('deck', 'Add list') }}</label>
<input id="new-stack-input-main"
@@ -70,137 +70,145 @@
</form>
</div>
<div v-if="board" class="board-action-buttons">
<Popover @show="filterVisible=true" @hide="filterVisible=false">
<Actions slot="trigger" :title="t('deck', 'Apply filter')">
<ActionButton v-if="isFilterActive" icon="icon-filter_set" />
<ActionButton v-else icon="icon-filter" />
</Actions>
<div class="board-action-buttons__filter">
<NcPopover container=".board-action-buttons__filter"
:placement="'bottom-end'"
:aria-label="t('deck', 'Active filters')"
@show="filterVisible=true"
@hide="filterVisible=false">
<!-- We cannot use NcActions here are the popover trigger does not update on reactive icons -->
<NcButton slot="trigger"
:title="t('deck', 'Apply filter')"
class="filter-button"
type="tertiary-no-background">
<template #icon>
<FilterIcon v-if="isFilterActive" :size="20" decorative />
<FilterOffIcon v-else :size="20" decorative />
</template>
</NcButton>
<div v-if="filterVisible" class="filter">
<h3>{{ t('deck', 'Filter by tag') }}</h3>
<div v-for="label in labelsSorted" :key="label.id" class="filter--item">
<input
:id="label.id"
v-model="filter.tags"
type="checkbox"
class="checkbox"
:value="label.id"
@change="setFilter">
<label :for="label.id"><span class="label" :style="labelStyle(label)">{{ label.title }}</span></label>
<div v-if="filterVisible" class="filter">
<h3>{{ t('deck', 'Filter by tag') }}</h3>
<div v-for="label in labelsSorted" :key="label.id" class="filter--item">
<input :id="label.id"
v-model="filter.tags"
type="checkbox"
class="checkbox"
:value="label.id"
@change="setFilter">
<label :for="label.id"><span class="label" :style="labelStyle(label)">{{ label.title }}</span></label>
</div>
<h3>{{ t('deck', 'Filter by assigned user') }}</h3>
<div class="filter--item">
<input id="unassigned"
v-model="filter.unassigned"
type="checkbox"
class="checkbox"
value="unassigned"
@change="setFilter"
@click="beforeSetFilter">
<label for="unassigned">{{ t('deck', 'Unassigned') }}</label>
</div>
<div v-for="user in board.users" :key="user.uid" class="filter--item">
<input :id="user.uid"
v-model="filter.users"
type="checkbox"
class="checkbox"
:value="user.uid"
@change="setFilter">
<label :for="user.uid"><NcAvatar :user="user.uid" :size="24" :disable-menu="true" /> {{ user.displayname }}</label>
</div>
<h3>{{ t('deck', 'Filter by due date') }}</h3>
<div class="filter--item">
<input id="overdue"
v-model="filter.due"
type="radio"
class="radio"
value="overdue"
@change="setFilter"
@click="beforeSetFilter">
<label for="overdue">{{ t('deck', 'Overdue') }}</label>
</div>
<div class="filter--item">
<input id="dueToday"
v-model="filter.due"
type="radio"
class="radio"
value="dueToday"
@change="setFilter"
@click="beforeSetFilter">
<label for="dueToday">{{ t('deck', 'Next 24 hours') }}</label>
</div>
<div class="filter--item">
<input id="dueWeek"
v-model="filter.due"
type="radio"
class="radio"
value="dueWeek"
@change="setFilter"
@click="beforeSetFilter">
<label for="dueWeek">{{ t('deck', 'Next 7 days') }}</label>
</div>
<div class="filter--item">
<input id="dueMonth"
v-model="filter.due"
type="radio"
class="radio"
value="dueMonth"
@change="setFilter"
@click="beforeSetFilter">
<label for="dueMonth">{{ t('deck', 'Next 30 days') }}</label>
</div>
<div class="filter--item">
<input id="noDue"
v-model="filter.due"
type="radio"
class="radio"
value="noDue"
@change="setFilter"
@click="beforeSetFilter">
<label for="noDue">{{ t('deck', 'No due date') }}</label>
</div>
<NcButton :disabled="!isFilterActive" :wide="true" @click="clearFilter">
{{ t('deck', 'Clear filter') }}
</NcButton>
</div>
</NcPopover>
</div>
<h3>{{ t('deck', 'Filter by assigned user') }}</h3>
<div class="filter--item">
<input
id="unassigned"
v-model="filter.unassigned"
type="checkbox"
class="checkbox"
value="unassigned"
@change="setFilter"
@click="beforeSetFilter">
<label for="unassigned">{{ t('deck', 'Unassigned') }}</label>
</div>
<div v-for="user in board.users" :key="user.uid" class="filter--item">
<input
:id="user.uid"
v-model="filter.users"
type="checkbox"
class="checkbox"
:value="user.uid"
@change="setFilter">
<label :for="user.uid"><Avatar :user="user.uid" :size="24" :disable-menu="true" /> {{ user.displayname }}</label>
</div>
<h3>{{ t('deck', 'Filter by due date') }}</h3>
<div class="filter--item">
<input
id="overdue"
v-model="filter.due"
type="radio"
class="radio"
value="overdue"
@change="setFilter"
@click="beforeSetFilter">
<label for="overdue">{{ t('deck', 'Overdue') }}</label>
</div>
<div class="filter--item">
<input
id="dueToday"
v-model="filter.due"
type="radio"
class="radio"
value="dueToday"
@change="setFilter"
@click="beforeSetFilter">
<label for="dueToday">{{ t('deck', 'Next 24 hours') }}</label>
</div>
<div class="filter--item">
<input
id="dueWeek"
v-model="filter.due"
type="radio"
class="radio"
value="dueWeek"
@change="setFilter"
@click="beforeSetFilter">
<label for="dueWeek">{{ t('deck', 'Next 7 days') }}</label>
</div>
<div class="filter--item">
<input
id="dueMonth"
v-model="filter.due"
type="radio"
class="radio"
value="dueMonth"
@change="setFilter"
@click="beforeSetFilter">
<label for="dueMonth">{{ t('deck', 'Next 30 days') }}</label>
</div>
<div class="filter--item">
<input
id="noDue"
v-model="filter.due"
type="radio"
class="radio"
value="noDue"
@change="setFilter"
@click="beforeSetFilter">
<label for="noDue">{{ t('deck', 'No due date') }}</label>
</div>
<Button :disabled="!isFilterActive" @click="clearFilter">
{{ t('deck', 'Clear filter') }}
</Button>
</div>
</Popover>
<Actions>
<ActionButton
icon="icon-archive"
@click="toggleShowArchived">
<NcActions>
<NcActionButton @click="toggleShowArchived">
<template #icon>
<ArchiveIcon :size="20" decorative />
</template>
{{ showArchived ? t('deck', 'Hide archived cards') : t('deck', 'Show archived cards') }}
</ActionButton>
<ActionButton v-if="compactMode"
icon="icon-toggle-compact-collapsed"
</NcActionButton>
<NcActionButton v-if="compactMode"
@click="toggleCompactMode">
<ArrowExpandVerticalIcon slot="icon" :size="20" decorative />
{{ t('deck', 'Toggle compact mode') }}
</ActionButton>
<ActionButton v-else
icon="icon-toggle-compact-expanded"
</NcActionButton>
<NcActionButton v-else
@click="toggleCompactMode">
<ArrowCollapseVerticalIcon slot="icon" :size="20" decorative />
{{ t('deck', 'Toggle compact mode') }}
</ActionButton>
</Actions>
<!-- FIXME: ActionRouter currently doesn't work as an inline action -->
<Actions :title="t('deck', 'Details')">
<ActionButton icon="icon-menu-sidebar" @click="toggleDetailsView" />
</Actions>
</NcActionButton>
</NcActions>
<!-- FIXME: NcActionRouter currently doesn't work as an inline action -->
<NcActions>
<NcActionButton icon="icon-menu-sidebar"
:aria-label="t('deck', 'Open details')"
:title="t('deck', 'Details')"
@click="toggleDetailsView" />
</NcActions>
</div>
</div>
</div>
@@ -208,14 +216,29 @@
<script>
import { mapState, mapGetters } from 'vuex'
import { Actions, ActionButton, Popover, Avatar } from '@nextcloud/vue'
import labelStyle from '../mixins/labelStyle'
import CardCreateDialog from '../CardCreateDialog'
import { NcActions, NcActionButton, NcAvatar, NcButton, NcPopover } from '@nextcloud/vue'
import labelStyle from '../mixins/labelStyle.js'
import CardCreateDialog from '../CardCreateDialog.vue'
import ArchiveIcon from 'vue-material-design-icons/Archive.vue'
import FilterIcon from 'vue-material-design-icons/Filter.vue'
import FilterOffIcon from 'vue-material-design-icons/FilterOff.vue'
import ArrowCollapseVerticalIcon from 'vue-material-design-icons/ArrowCollapseVertical.vue'
import ArrowExpandVerticalIcon from 'vue-material-design-icons/ArrowExpandVertical.vue'
export default {
name: 'Controls',
components: {
Actions, ActionButton, Popover, Avatar, CardCreateDialog,
NcActions,
NcActionButton,
NcButton,
NcPopover,
NcAvatar,
CardCreateDialog,
ArchiveIcon,
FilterIcon,
FilterOffIcon,
ArrowCollapseVerticalIcon,
ArrowExpandVerticalIcon,
},
mixins: [labelStyle],
props: {
@@ -258,18 +281,12 @@ export default {
}
},
isFilterActive() {
if (this.filter.tags.length !== 0 || this.filter.users.length !== 0 || this.filter.due !== '') {
return true
}
return false
return this.filter.tags.length !== 0 || this.filter.users.length !== 0 || this.filter.due !== ''
},
labelsSorted() {
return [...this.board.labels].sort((a, b) => (a.title < b.title) ? -1 : 1)
},
},
beforeDestroy() {
this.setPageTitle('')
},
watch: {
board(current, previous) {
if (current?.id !== previous?.id) {
@@ -280,6 +297,9 @@ export default {
}
},
},
beforeDestroy() {
this.setPageTitle('')
},
methods: {
beforeSetFilter(e) {
if (this.filter.due === e.target.value) {
@@ -360,7 +380,7 @@ export default {
<style lang="scss" scoped>
.controls {
display: flex;
padding: 3px;
margin: 5px;
height: 44px;
padding-left: 44px;
@@ -408,18 +428,15 @@ export default {
.board-action-buttons {
display: flex;
button {
border: 0;
width: 44px;
margin: 0 0 0 -1px;
background-color: transparent;
}
}
.deck-search {
display: flex;
align-items: center;
justify-content: center;
input[type=search] {
background-position: 5px;
padding-left: 24px;
padding-left: 24px !important;
}
}
@@ -441,8 +458,9 @@ export default {
}
.filter {
width: 250px;
max-height: 80vh;
width: 240px;
max-height: calc(100vh - 150px);
position: relative;
overflow: auto;
padding: 8px;
}
@@ -451,8 +469,23 @@ export default {
margin-top: 0px;
margin-bottom: 5px;
}
.filter-button {
padding: 0;
border-radius: 50%;
width: 44px;
height: 44px;
&:hover, &:focus {
background-color: rgba(127,127,127,0.25) !important;
}
}
</style>
<style lang="scss">
.popover:focus {
outline: 2px solid var(--color-main-text);
}
.tooltip-inner.popover-inner {
text-align: left;
}

View File

@@ -45,6 +45,7 @@ export default {
#app-sidebar .icon-close {
z-index: 100;
}
.app-deck .app-sidebar {
z-index: 1500 !important;
}

View File

@@ -30,7 +30,7 @@
<h2>{{ t('deck', 'Loading board') }}</h2>
<p />
</div>
<EmptyContent v-else-if="isEmpty" key="empty" icon="icon-deck">
<NcEmptyContent v-else-if="isEmpty" key="empty" icon="icon-deck">
{{ t('deck', 'No lists available') }}
<template v-if="canManage" #desc>
{{ t('deck', 'Create a new list to add cards to this board') }}
@@ -48,7 +48,7 @@
value="">
</form>
</template>
</EmptyContent>
</NcEmptyContent>
<div v-else-if="!isEmpty && !loading" key="board" class="board">
<Container lock-axix="y"
orientation="horizontal"
@@ -73,11 +73,11 @@
import { Container, Draggable } from 'vue-smooth-dnd'
import { mapState, mapGetters } from 'vuex'
import Controls from '../Controls'
import Stack from './Stack'
import { EmptyContent } from '@nextcloud/vue'
import GlobalSearchResults from '../search/GlobalSearchResults'
import { showError } from '../../helpers/errors'
import Controls from '../Controls.vue'
import Stack from './Stack.vue'
import { NcEmptyContent } from '@nextcloud/vue'
import GlobalSearchResults from '../search/GlobalSearchResults.vue'
import { showError } from '../../helpers/errors.js'
export default {
name: 'Board',
@@ -87,7 +87,7 @@ export default {
Container,
Draggable,
Stack,
EmptyContent,
NcEmptyContent,
},
inject: [
'boardApi',
@@ -163,8 +163,8 @@ export default {
<style lang="scss" scoped>
@import '../../css/animations.scss';
@import '../../css/variables.scss';
@import '../../css/animations';
@import '../../css/variables';
form {
text-align: center;
@@ -222,6 +222,7 @@ export default {
padding: $stack-spacing;
overflow-x: hidden;
overflow-y: auto;
scrollbar-gutter: stable;
padding-top: 15px;
margin-top: -10px;
}

View File

@@ -21,57 +21,57 @@
-->
<template>
<AppSidebar v-if="board != null"
<NcAppSidebar v-if="board != null"
:actions="[]"
:title="board.title"
@close="closeSidebar">
<AppSidebarTab id="sharing"
<NcAppSidebarTab id="sharing"
:order="0"
:name="t('deck', 'Sharing')"
icon="icon-shared">
<SharingTabSidebar :board="board" />
</AppSidebarTab>
</NcAppSidebarTab>
<AppSidebarTab id="tags"
<NcAppSidebarTab id="tags"
:order="1"
:name="t('deck', 'Tags')"
icon="icon-tag">
<TagsTabSidebar :board="board" />
</AppSidebarTab>
</NcAppSidebarTab>
<AppSidebarTab v-if="canEdit"
<NcAppSidebarTab v-if="canEdit"
id="deleted"
:order="2"
:name="t('deck', 'Deleted items')"
icon="icon-delete">
<DeletedTabSidebar :board="board" />
</AppSidebarTab>
</NcAppSidebarTab>
<AppSidebarTab v-if="hasActivity"
<NcAppSidebarTab v-if="hasActivity"
id="activity"
:order="3"
:name="t('deck', 'Timeline')"
icon="icon-activity">
<TimelineTabSidebar :board="board" />
</AppSidebarTab>
</AppSidebar>
</NcAppSidebarTab>
</NcAppSidebar>
</template>
<script>
import { mapState, mapGetters } from 'vuex'
import SharingTabSidebar from './SharingTabSidebar'
import TagsTabSidebar from './TagsTabSidebar'
import DeletedTabSidebar from './DeletedTabSidebar'
import TimelineTabSidebar from './TimelineTabSidebar'
import { AppSidebar, AppSidebarTab } from '@nextcloud/vue'
import SharingTabSidebar from './SharingTabSidebar.vue'
import TagsTabSidebar from './TagsTabSidebar.vue'
import DeletedTabSidebar from './DeletedTabSidebar.vue'
import TimelineTabSidebar from './TimelineTabSidebar.vue'
import { NcAppSidebar, NcAppSidebarTab } from '@nextcloud/vue'
const capabilities = window.OC.getCapabilities()
export default {
name: 'BoardSidebar',
components: {
AppSidebar,
AppSidebarTab,
NcAppSidebar,
NcAppSidebarTab,
SharingTabSidebar,
TagsTabSidebar,
DeletedTabSidebar,

View File

@@ -8,8 +8,7 @@
<span>{{ deletedStack.title }}</span>
<span class="timestamp">{{ relativeDate(deletedStack.deletedAt*1000) }}</span>
</div>
<button
:title="t('settings', 'Undo')"
<button :title="t('settings', 'Undo')"
class="app-navigation-entry-deleted-button icon-history"
@click="stackUndoDelete(deletedStack)" />
</li>
@@ -23,8 +22,7 @@
<span>{{ deletedCard.title }}</span>
<span class="timestamp">{{ relativeDate(deletedCard.deletedAt*1000) }}</span>
</div>
<button
:title="t('settings', 'Undo')"
<button :title="t('settings', 'Undo')"
class="app-navigation-entry-deleted-button icon-history"
@click="cardUndoDelete(deletedCard)" />
</li>
@@ -34,7 +32,7 @@
<script>
import { mapState } from 'vuex'
import relativeDate from '../../mixins/relativeDate'
import relativeDate from '../../mixins/relativeDate.js'
export default {
name: 'DeletedTabSidebar',
@@ -88,8 +86,6 @@ export default {
li {
display: flex;
height: 44px;
&:hover, &:active, &.focus {
button {
opacity: 1;
@@ -108,7 +104,10 @@ export default {
.title {
flex-grow: 2;
padding: 3px 0px;
> span:not(.timestamp) {
line-height: 1.2em;
margin-bottom: 5px;
}
.timestamp {
font-size: 0.9em;
color: var(--color-text-lighter);

View File

@@ -1,7 +1,6 @@
<template>
<div>
<Multiselect
v-if="canShare"
<NcMultiselect v-if="canShare"
v-model="addAcl"
:placeholder="t('deck', 'Share board with a user, group or circle …')"
:options="formatedSharees"
@@ -19,13 +18,12 @@
<template #noResult>
{{ isSearching ? t('deck', 'Searching for users, groups and circles …') : t('deck', 'No participants found') }}
</template>
</Multiselect>
</NcMultiselect>
<ul
id="shareWithList"
<ul id="shareWithList"
class="shareWithList">
<li>
<Avatar :user="board.owner.uid" />
<NcAvatar :user="board.owner.uid" />
<span class="has-tooltip username">
{{ board.owner.displayname }}
<span v-if="!isCurrentUser(board.owner.uid)" class="board-owner-label">
@@ -34,7 +32,7 @@
</span>
</li>
<li v-for="acl in board.acl" :key="acl.id">
<Avatar v-if="acl.type===0" :user="acl.participant.uid" />
<NcAvatar v-if="acl.type===0" :user="acl.participant.uid" />
<div v-if="acl.type===1" class="avatardiv icon icon-group" />
<div v-if="acl.type===7" class="avatardiv icon icon-circles" />
<span class="has-tooltip username">
@@ -43,10 +41,10 @@
<span v-if="acl.type===7">{{ t('deck', '(Circle)') }}</span>
</span>
<ActionCheckbox v-if="!(isCurrentUser(acl.participant.uid) && acl.type === 0) && (canManage || (canEdit && canShare))" :checked="acl.permissionEdit" @change="clickEditAcl(acl)">
<NcActionCheckbox v-if="!(isCurrentUser(acl.participant.uid) && acl.type === 0) && (canManage || (canEdit && canShare))" :checked="acl.permissionEdit" @change="clickEditAcl(acl)">
{{ t('deck', 'Can edit') }}
</ActionCheckbox>
<Actions v-if="!(isCurrentUser(acl.participant.uid) && acl.type === 0)" :force-menu="true">
</NcActionCheckbox>
<NcActions v-if="!(isCurrentUser(acl.participant.uid) && acl.type === 0)" :force-menu="true">
<ActionCheckbox v-if="canManage || canShare" :checked="acl.permissionShare" @change="clickShareAcl(acl)">
{{ t('deck', 'Can share') }}
</ActionCheckbox>
@@ -56,14 +54,18 @@
<ActionCheckbox v-if="acl.type === 0 && isCurrentUser(board.owner.uid)" :checked="acl.owner" @change="clickTransferOwner(acl.participant.uid)">
{{ t('deck', 'Owner') }}
</ActionCheckbox>
<ActionButton v-if="canManage" icon="icon-delete" @click="clickDeleteAcl(acl)">
<NcActionButton v-if="canManage" icon="icon-delete" @click="clickDeleteAcl(acl)">
{{ t('deck', 'Delete') }}
</ActionButton>
</Actions>
</NcActionButton>
</NcActions>
</li>
</ul>
<CollectionList v-if="board.id"
<NcRelatedResourcesPanel v-if="board.id"
provider-id="deck"
:item-id="board.id" />
<CollectionList v-if="projectsEnabled && board.id"
:id="`${board.id}`"
:name="board.title"
type="deck" />
@@ -71,22 +73,24 @@
</template>
<script>
import { Avatar, Multiselect, Actions, ActionButton, ActionCheckbox } from '@nextcloud/vue'
import { NcAvatar, NcMultiselect, NcActions, NcActionButton, NcActionCheckbox, NcRelatedResourcesPanel } from '@nextcloud/vue'
import { CollectionList } from 'nextcloud-vue-collections'
import { mapGetters, mapState } from 'vuex'
import { getCurrentUser } from '@nextcloud/auth'
import { showError, showSuccess } from '@nextcloud/dialogs'
import { loadState } from '@nextcloud/initial-state'
import debounce from 'lodash/debounce'
export default {
name: 'SharingTabSidebar',
components: {
Avatar,
Actions,
ActionButton,
ActionCheckbox,
Multiselect,
NcAvatar,
NcActions,
NcActionButton,
NcActionCheckbox,
NcMultiselect,
CollectionList,
NcRelatedResourcesPanel,
},
props: {
board: {
@@ -101,6 +105,7 @@ export default {
addAcl: null,
addAclForAPI: null,
newOwner: null,
projectsEnabled: loadState('core', 'projects_enabled', false),
}
},
computed: {
@@ -200,7 +205,7 @@ export default {
},
clickTransferOwner(newOwner) {
OC.dialogs.confirmDestructive(
t('deck', 'Are you sure you want to transfer the board {title} for {user}?', { title: this.board.title, user: newOwner }),
t('deck', 'Are you sure you want to transfer the board {title} to {user}?', { title: this.board.title, user: newOwner }),
t('deck', 'Transfer the board.'),
{
type: OC.dialogs.YES_NO_BUTTONS,
@@ -214,13 +219,13 @@ export default {
this.isLoading = true
await this.$store.dispatch('transferOwnership', {
boardId: this.board.id,
newOwner
newOwner,
})
const successMessage = t('deck', 'Transfer the board for {user} successfully', { user: newOwner })
const successMessage = t('deck', 'The board has been transferred to {user}', { user: newOwner })
showSuccess(successMessage)
this.$router.push({ name: 'main' })
} catch (e) {
const errorMessage = t('deck', 'Failed to transfer the board for {user}', { user: newOwner.user })
const errorMessage = t('deck', 'Failed to transfer the board to {user}', { user: newOwner.user })
showError(errorMessage)
} finally {
this.isLoading = false

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