Compare commits

..
319 Commits
Author SHA1 Message Date
Jonas 3486e0f24c Merge pull request #4571 from nextcloud/backport/4566/stable22
[stable22] Gracefully handle not found card for a share
2023-03-29 11:28:18 +02:00
Jonas 9519033881 Gracefully handle not found card for a share
Fixes: #3464
Fixes: #4565

Signed-off-by: Jonas <jonas@freesources.org>
2023-03-29 09:08:50 +00:00
Nextcloud bot fc1f3fd10a [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-11-04 02:21:24 +00:00
Nextcloud bot c483b042fd [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-11-03 02:21:21 +00:00
Nextcloud bot 3d26acd0ba [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-11-02 02:21:39 +00:00
Nextcloud bot dd23f7b0d3 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-11-01 02:21:46 +00:00
Nextcloud bot a12043357a [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-10-31 02:21:11 +00:00
Nextcloud bot 2bd5d5532d [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-10-30 02:24:16 +00:00
Nextcloud bot ef72c08c11 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-10-29 02:23:29 +00:00
Nextcloud bot 3c3ff391a6 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-10-27 02:21:21 +00:00
Nextcloud bot 29361b3ee7 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-10-25 02:26:22 +00:00
Nextcloud bot a421a62fb5 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-10-24 02:22:00 +00:00
Nextcloud bot 2392308f58 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-10-18 02:21:45 +00:00
Nextcloud bot 26cc02bea1 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-10-13 02:22:27 +00:00
Nextcloud bot 9ecdc84148 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-10-08 02:21:56 +00:00
Nextcloud bot af6a099f59 [tx-robot] Update transifex configuration
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-10-07 02:21:48 +00:00
Nextcloud bot b885ec4b80 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-10-06 02:26:21 +00:00
Nextcloud bot e9e8e26fb5 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-10-05 02:21:27 +00:00
Nextcloud bot 1e2eb5ae2f [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-10-01 02:24:42 +00:00
Nextcloud bot d445ae7527 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-30 03:23:48 +00:00
Nextcloud bot cef8fe8b0d [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-28 02:46:22 +00:00
Nextcloud bot 98b66d0b5d [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-26 02:47:22 +00:00
Nextcloud bot 81733002e5 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-24 02:47:27 +00:00
Nextcloud bot 80b729c944 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-23 02:42:14 +00:00
Nextcloud bot c286ce3859 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-22 02:45:53 +00:00
Nextcloud bot f31033de72 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-20 02:46:01 +00:00
Nextcloud bot 79e83e56ba [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-17 02:45:19 +00:00
Nextcloud bot 09176b3ae6 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-16 02:39:42 +00:00
Nextcloud bot ed85991683 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-15 02:45:13 +00:00
Nextcloud bot cbf1dc790d [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-14 02:39:58 +00:00
Nextcloud bot 8a1c1c4690 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-13 02:40:45 +00:00
Nextcloud bot 0c80b60c6d [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-12 02:39:46 +00:00
Nextcloud bot 0f904e65f4 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-09 02:40:45 +00:00
Nextcloud bot e1b5d6d557 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-08 02:40:36 +00:00
Nextcloud bot eca6b1f4f0 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-07 02:40:05 +00:00
Nextcloud bot 7dfdae86bf [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-06 02:39:43 +00:00
Nextcloud bot cf491c5ad0 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-05 02:39:04 +00:00
Nextcloud bot 63cddda8de [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-04 02:38:06 +00:00
Nextcloud bot ad17f558ce [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-03 02:44:40 +00:00
Nextcloud bot 4134818a85 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-09-01 02:50:11 +00:00
Nextcloud bot 85a7e888e7 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-08-28 02:36:36 +00:00
Nextcloud bot 062025873b [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-08-27 02:36:48 +00:00
Nextcloud bot 2262cf00c7 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-08-24 02:39:45 +00:00
Nextcloud bot ec022909de [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-08-22 02:37:19 +00:00
Nextcloud bot 8de5ef1255 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-08-21 02:36:39 +00:00
Nextcloud bot c6a0cfa172 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-08-20 02:37:03 +00:00
Nextcloud bot 5002a3df29 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-08-13 02:37:54 +00:00
Nextcloud bot cac42bac12 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-08-12 02:37:00 +00:00
Nextcloud bot 1bef8004ac [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-08-09 02:36:41 +00:00
Julius Härtl 3b9efba8ab Merge pull request #3961 from nextcloud/backport/3952/stable22 2022-08-08 09:32:55 +02:00
Julius Härtl f10e1a21fe Fetch attachment folder for the correct user during cron job
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-08-08 07:00:59 +00:00
Nextcloud bot af36323e53 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-08-07 02:41:03 +00:00
Nextcloud bot 9c1ae577fd [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-08-06 02:37:39 +00:00
Nextcloud bot 532516b4c4 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-08-05 02:13:46 +00:00
Nextcloud bot 02f3f821b5 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-08-03 02:13:46 +00:00
Nextcloud bot 52cd5f9881 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-07-29 02:13:37 +00:00
Nextcloud bot d718aafc74 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-07-28 02:13:43 +00:00
Nextcloud bot 6f475b7acc [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-07-27 02:13:42 +00:00
Nextcloud bot ee2fc04fa1 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-07-25 02:39:14 +00:00
Nextcloud bot a5217a49d3 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-07-24 02:40:52 +00:00
Nextcloud bot c241ee54fe [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-07-23 02:38:39 +00:00
Nextcloud bot ff4ee6ced6 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-07-21 02:38:57 +00:00
Nextcloud bot e72a3d34fd [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-07-19 02:38:04 +00:00
Nextcloud bot 120b4ad981 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-07-18 02:37:20 +00:00
Nextcloud bot 0d35859ab1 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-07-14 02:37:48 +00:00
Julius Härtl db9e367633 Merge pull request #3919 from nextcloud/backport/3916/stable22
[stable22] Prevent opening card and applyLabelFilter on card drag end
2022-07-12 16:36:54 +02:00
Julien Veyssier 2537aaa6ea refs #2594 prevent opening card and applyLabelFilter on card drag end
Signed-off-by: Julien Veyssier <eneiluj@posteo.net>
2022-07-12 11:57:28 +00:00
Nextcloud bot e7c15b6154 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-07-08 02:37:20 +00:00
Nextcloud bot 9016e5020d [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-07-06 02:35:59 +00:00
Nextcloud bot f8d811463e [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-07-04 02:35:53 +00:00
Nextcloud bot b60b5d4225 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-07-02 02:37:26 +00:00
Raul Ferreira Fuentes e19befa2df Merge pull request #3887 from nextcloud/backport/3884/stable22
[stable22] Fix z-index for deck sidebar
2022-06-28 15:26:16 +02:00
Raul 5ca11c7515 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 12:40:42 +00:00
Nextcloud bot 4ec9aa3cb6 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-06-22 02:40:30 +00:00
Nextcloud bot 571d764209 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-06-14 02:41:55 +00:00
Nextcloud bot 5230a76442 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-06-12 02:41:08 +00:00
Nextcloud bot 284d8642f6 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-06-09 02:45:36 +00:00
Nextcloud bot 6b6fbab98d [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-06-07 02:44:10 +00:00
Nextcloud bot cc3e946880 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-06-03 02:47:55 +00:00
Nextcloud bot e131aa70cf [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-06-02 02:47:13 +00:00
Julius Härtl d643ea75a2 Merge pull request #3838 from nextcloud/release/1.5.8
release/1.5.8
2022-06-01 11:28:01 +02:00
Julius Härtl 8f04c37275 Pin engines
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-06-01 11:27:13 +02:00
Julius Härtl 5251e69830 Merge pull request #3846 from nextcloud/backport/3528/stable22
[stable22] Add app config to toggle the default calendar setting as an admin
2022-05-30 18:20:54 +02:00
Julius Härtl 33f24e5add Add app config to toggle the default calendar setting as an admin
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-05-30 12:42:40 +00:00
Nextcloud bot 1d16341d0f [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-05-29 02:46:57 +00:00
Nextcloud bot 8220872eba [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-05-28 02:43:28 +00:00
Luka Trovic 73df3588e5 changes for 1.5.8
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2022-05-27 17:41:08 +02:00
Nextcloud bot dbca67dec0 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-05-26 02:44:20 +00:00
Nextcloud bot 9fd46c2e43 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-05-24 02:47:16 +00:00
Nextcloud bot 9bfc39b316 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-05-23 02:43:49 +00:00
Nextcloud bot e9fb6616d9 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-05-22 02:43:44 +00:00
Nextcloud bot e4a4ab5912 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-05-21 02:47:16 +00:00
Nextcloud bot 9e7261e5d5 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-05-20 02:46:31 +00:00
Julius Härtl 2af2e7c9cc Merge pull request #3817 from nextcloud/backport/3811/stable22
[stable22] Align Duedate-delete icon properly - fixes nextcloud/deck#3791
2022-05-13 09:35:05 +02:00
Nextcloud bot 2dc9eaf74e [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-05-13 02:41:51 +00:00
ben 62318fedef Align Duedate-delete icon properly - fixes nextcloud/deck#3791
Signed-off-by: ben <ben@ro.tt>
2022-05-12 14:54:23 +00:00
Julius Härtl d8c640d0a4 Merge pull request #3806 from nextcloud/backport/3682/stable22
[stable22] Increase file count after sharing
2022-05-12 09:57:56 +02:00
Julius Härtl 47f546fb12 Fix php-cs-fixer failure
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-05-12 09:09:40 +02:00
Julius Härtl fc0571aeda Move all caching to helper
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-05-11 14:44:53 +00:00
Luka Trovic 8695641c2a 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-11 14:44:52 +00:00
Luka Trovic 894e17aaef fix: update attachments count when sharing
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2022-05-11 14:44:51 +00:00
Luka Trovic cd3b7e7fd9 fix: increase file count after sharing
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2022-05-11 14:44:51 +00:00
Julius Härtl ab6d12cc5f Merge pull request #3794 from nextcloud/backport/3681/stable22-bis
[stable22] Show cards after moving into another list
2022-05-10 12:32:14 +02:00
Luka Trovic a8db7a90f1 fix: undefined variable in AttachmentMapper.php
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2022-05-09 19:25:41 +01:00
Luka Trovic 19b4d0ac21 fix: feedback
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2022-05-09 16:48:50 +01:00
Luka Trovic 1dec7be713 fix: show card after moving into another list
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2022-05-09 16:46:38 +01:00
Nextcloud bot 92a0ef904f [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-05-06 02:41:19 +00:00
Nextcloud bot f389f834f0 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-05-05 02:41:09 +00:00
Julius Härtl c035a6be73 Merge pull request #3781 from nextcloud/backport/3777/stable22
[stable22] Fetch full board data after cloning
2022-05-04 17:17:14 +02:00
Julius Härtl d1498486eb Fetch full board data after cloning
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-05-04 10:29:41 +00:00
Nextcloud bot 408a19ba9a [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-05-04 02:43:00 +00:00
Nextcloud bot 9523aa9eeb [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-05-03 02:41:27 +00:00
Nextcloud bot 3d74323be4 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-04-30 02:39:58 +00:00
Julius Härtl 3d14e3f916 Bump version to 1.5.7
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-04-29 16:31:04 +02:00
Julius Härtl cce5bd8a7d Merge pull request #3767 from nextcloud/backport/3761/stable22
[stable22] Fix text selection in dark mode and modal view
2022-04-29 16:29:22 +02:00
Julius Härtl 62ccab6e96 Fix text selection in dark mode and modal view
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-04-29 15:58:44 +02:00
Nextcloud bot 9f8e7258b5 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-04-29 02:41:10 +00:00
Julius Härtl 2ca00fed08 Merge pull request #3756 from nextcloud/backport/3745/stable22
[stable22] Add missing indices
2022-04-28 10:12:04 +02:00
Nextcloud bot 22cb32e197 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-04-28 02:41:24 +00:00
Julius Härtl e1391efbef Add missing indices
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-04-26 16:26:44 +00:00
Nextcloud bot 4633ddc153 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-04-24 02:41:18 +00:00
Nextcloud bot a96ccc3bfd [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-04-23 02:39:31 +00:00
Nextcloud bot 14bcab8c8a [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-04-22 02:40:29 +00:00
Joas Schilling 40f0f3d194 Merge pull request #3742 from nextcloud/backport/stable22/3683
[stable22] Fix paramter replacements when creating deck cards from talk messages
2022-04-21 09:35:27 +02:00
Julius Härtl 32e5f6dd6b Merge pull request #3743 from nextcloud/backport/stable22/3326
[stable22] add autofocus on board edit #3326
2022-04-21 08:22:45 +02:00
Julius Härtl 5f2235a91f Merge pull request #3739 from nextcloud/backport/3663/stable22
[stable22] [stable23] Sort boards non case sensitive
2022-04-20 18:55:26 +02:00
Michael Weimann deca12ddd3 add autofocus on board edit
Signed-off-by: Michael Weimann <mail@michael-weimann.eu>
2022-04-20 18:53:42 +02:00
Joas Schilling 31d6794490 Fix paramter replacements when creating deck cards from talk messages
Signed-off-by: Joas Schilling <coding@schilljs.com>
2022-04-20 18:51:05 +02:00
ben 90938d5f58 fixes nextcloud/deck#3410
Signed-off-by: ben <git@rott.io>
2022-04-20 16:17:47 +00:00
Julius Härtl 0c7768b36d Merge pull request #3735 from nextcloud/backport/3692/stable22
[stable22] Fix hidden attachment icon on archived cards
2022-04-20 18:14:20 +02:00
Luka Trovic d14c7810ee fix: hidden attachment icon on archived cards
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2022-04-20 14:22:33 +00:00
Julius Härtl de5153337d Merge pull request #3731 from nextcloud/backport/3497/stable22
[stable22] [stable23] Use explicit cast to make use of index
2022-04-20 16:20:43 +02:00
Julius Härtl bd405122e2 Use explicit cast to make use of index
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-04-19 19:43:29 +00:00
Nextcloud bot e7d6233796 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-04-17 02:38:12 +00:00
Nextcloud bot 25bb72c3dc [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-04-14 02:42:25 +00:00
Nextcloud bot 487c626a73 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-04-13 02:40:16 +00:00
Julius Härtl 6b0182ea70 Merge pull request #3721 from nextcloud/backport/3717/stable22
[stable22] Fix: Check all circle shares for permissions
2022-04-12 22:25:43 +02:00
Bink ca6fe65580 Fix: Check all circle shares for permissions instead of returning after the first 2022-04-12 15:19:09 +00:00
Julius Härtl 498ed9dfff Merge pull request #3665 from nextcloud/backport/stable22/2496
[stable22] Transfer ownership
2022-04-11 18:29:28 +02:00
Julius Härtl 32a2a4ebf5 Merge pull request #3714 from nextcloud/backport/3670/stable22
[stable22] Properly check for the stack AND setting board permissions
2022-04-11 18:28:06 +02:00
Julius Härtl 4bd1b70a5e Properly check for the stack AND setting board permissions
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-04-11 14:35:25 +00:00
Julius Härtl 71b78e8ec3 Remove unused argument
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-04-11 16:25:37 +02:00
Julius Härtl 2d6fc18218 Merge pull request #3707 from nextcloud/backport/3501/stable22
[stable22] Add a missing translation - not found in transifex
2022-04-11 09:53:33 +02:00
Nextcloud bot b7554a06d2 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-04-09 02:39:17 +00:00
Luka Trovic 35a8fee3b3 add a missing translation - not found in transifex
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2022-04-08 19:35:39 +00:00
Nextcloud bot 4fe94e65ad [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-04-06 02:39:54 +00:00
Nextcloud bot 80fa93716b [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-04-05 02:39:56 +00:00
Nextcloud bot 0145593cba [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-03-31 02:41:42 +00:00
Nextcloud bot af712ddb56 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-03-30 02:39:33 +00:00
Nextcloud bot f0deb93cb7 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-03-29 02:39:55 +00:00
Nextcloud bot 781cfc11c7 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-03-28 02:39:02 +00:00
Nextcloud bot 97e45ebc69 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-03-25 03:07:29 +00:00
Nextcloud bot c4bc945b1e [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-03-24 02:38:36 +00:00
Julius Härtl 2bd12ed7b5 lint: fix eslint
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-03-22 15:58:54 +01:00
Julius Härtl 658d358e70 Skip unavailable cache
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-03-22 15:12:41 +01:00
Julius Härtl 3e6a80eb37 Fix tests and move to 7.3 as a min php version
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-03-22 15:07:42 +01:00
Julius Härtl 5408d4f9c5 Adjust documentaion wording
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-03-22 14:20:29 +01:00
Julius Härtl 6e5fd9e25a Handle board exceptions more gracefully
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-03-22 14:20:29 +01:00
Julius Härtl 9fbdafbe73 Cover case where the owner is preserved
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-03-22 14:20:29 +01:00
Luka Trovic 9403fb1759 fix: feedback
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2022-03-22 14:20:29 +01:00
Luka Trovic 691abb02d8 feat: add api endpoint and UI to transfer a board to a different user
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2022-03-22 14:20:29 +01:00
Julius Härtl 3bb99a9001 fix: test cases using generator
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-03-22 14:20:28 +01:00
Julius Härtl 74e0149a6d Reuse single board transfer for all user boards
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-03-22 14:20:28 +01:00
Julius Härtl c5d83e662c fix: Properly handle limited scope for remapping users
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-03-22 14:20:28 +01:00
Julius Härtl 376c7c7d07 cleanup test cases
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-03-22 14:20:28 +01:00
Julius Härtl a52664e9e4 Allow transfer of single boards
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-03-22 14:20:28 +01:00
Julius Härtl f573abe279 fix: Psalm
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-03-22 14:20:26 +01:00
Julius Härtl 975af7c056 fix: unit tests
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-03-22 14:18:40 +01:00
Luka Trovic f2456d796c feat: add integration test for transferring board ownership with data
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2022-03-22 14:18:13 +01:00
Luka Trovic c7c9302109 fix: integration tests
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2022-03-22 14:18:11 +01:00
Luka Trovic 989db4702c fix: unit test & psalm static code analysis issues
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2022-03-22 14:17:04 +01:00
Max 9de5f12f4b fix: queries with the new base mapper in BoardMapper
Signed-off-by: Max <max@nextcloud.com>
2022-03-22 14:17:04 +01:00
Max 9338ebb561 fix: Assignment is the new AssignedUsers
Signed-off-by: Max <max@nextcloud.com>
2022-03-22 14:17:04 +01:00
Julius Härtl 0d9cdc5f1e Make queries work with the new base mapper
Signed-off-by: Julius Härtl <jus@bitgrid.net>

fix: conflicts
2022-03-22 14:17:04 +01:00
Julius Härtl f66c71ee55 Just cleanup old ACL rules, there are none for the board owner so nothing to cleanup or persist there
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-03-22 14:17:03 +01:00
Julius Härtl d742bc097b Use proper description of what gets transferred
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-03-22 14:17:03 +01:00
Julius Härtl 53386a7f1a Fix card mapper query for transfer
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-03-22 14:17:03 +01:00
Sergey Shliakhov cfbc18deb9 Fix coding styles
Signed-off-by: Julius Härtl <jus@bitgrid.net>
Signed-off-by: Max <max@nextcloud.com>
2022-03-22 14:17:03 +01:00
Sergey Shliakhov bdf4631504 Transfer deck ownership even if target user already participant of a board
https://github.com/nextcloud/deck/pull/1955#issuecomment-640392715
Signed-off-by: Sergey Shliakhov <husband.sergey@gmail.com>
2022-03-22 14:17:03 +01:00
Sergey Shliakhov a0f93a81d2 Check type before transfer card participants ownership
Signed-off-by: Sergey Shliakhov <husband.sergey@gmail.com>

temp
2022-03-22 14:17:03 +01:00
Sergey Shliakhov d9b086f146 Fix wrong class name
Signed-off-by: Sergey Shliakhov <husband.sergey@gmail.com>
2022-03-22 14:17:03 +01:00
Sergey Shliakhov b8b3ac3516 Fix code style
Signed-off-by: Sergey Shliakhov <husband.sergey@gmail.com>
2022-03-22 14:17:03 +01:00
Sergey Shliakhov 118959795f Add tests
Signed-off-by: Sergey Shliakhov <husband.sergey@gmail.com>
2022-03-22 14:17:03 +01:00
Sergey Shliakhov c93aaeb9bf Update docs
Signed-off-by: Sergey Shliakhov <husband.sergey@gmail.com>

fix: conflicts
2022-03-22 14:17:02 +01:00
Sergey Shliakhov f42c82274f Add deck:transfer-ownership command
Signed-off-by: Sergey Shliakhov <husband.sergey@gmail.com>
2022-03-22 14:17:02 +01:00
Nextcloud bot fff9c4f7a2 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-03-18 02:38:33 +00:00
Julius Härtl 3eb5ccbbe2 Merge pull request #3642 from nextcloud/backport/3635/stable22
[stable22] 🐛 Fix missing files sidebar
2022-03-17 08:19:47 +01:00
Vinicius Reis cc61f3d4e0 fix style-lint
Signed-off-by: Vinicius Reis <vinicius.reis@nextcloud.com>
2022-03-17 00:05:24 -03:00
Nextcloud bot 209adc1e7a [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-03-17 02:41:21 +00:00
Vinicius Reis e26f06be8f 🐛 Fix missing files sidebar
Signed-off-by: Vinicius Reis <vinicius.reis@nextcloud.com>
2022-03-14 14:11:02 +00:00
Julius Härtl c99b4bf4ab Merge pull request #3629 from nextcloud/release/1.5.6
Release 1.5.6
2022-03-10 09:54:21 +01:00
Julius Härtl 296e7abf14 Bump version to 1.5.6
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-03-10 09:30:38 +01:00
Julius Härtl c6ef07ceb0 Merge pull request #3627 from nextcloud/backport/3611/stable22
[stable22] Generate fixed link for activity emails
2022-03-09 20:20:26 +01:00
Luka Trovic 4e937bd03a fix: generate fixed link for activity emails
Signed-off-by: Luka Trovic <luka@nextcloud.com>

fix: generate fixed link for activity emails

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

Fix tests

Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-03-09 17:24:32 +00:00
Julius Härtl 84943c5889 Create appstore-build-publish.yml 2022-03-04 13:58:23 +01:00
Julius Härtl 4ed71b7a63 Merge pull request #3615 from nextcloud/backport/3612/stable22
[stable22] Make insert attachment buttom easy to click
2022-03-02 21:05:00 +01:00
Luka Trovic 4ab8078103 fix: make insert attachment buttom easy to click
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2022-03-02 16:24:22 +00:00
Nextcloud bot 6b75a1ab1b [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-02-19 02:38:02 +00:00
Nextcloud bot 76e3a3a25e [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-02-17 02:38:53 +00:00
Nextcloud bot 9503de4716 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-02-08 02:38:07 +00:00
Nextcloud bot 3340ccec6f [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-02-06 02:37:01 +00:00
Nextcloud bot a90e099113 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-02-05 02:37:29 +00:00
Nextcloud bot aa69495075 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-02-01 02:37:27 +00:00
Nextcloud bot 11eb779beb [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-01-31 02:37:27 +00:00
Nextcloud bot 836e2b33df [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-01-24 02:37:12 +00:00
Nextcloud bot c63b72bf2e [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-01-19 02:38:15 +00:00
Julien Veyssier c20008dacc Merge pull request #3544 from nextcloud/backport/3541/stable22
[stable22] Fix confusion between stackId and boardId in StackService
2022-01-18 16:45:52 +01:00
Julien Veyssier edacda1377 fix confusion between stackId and boardId in StackService::update()
Signed-off-by: Julien Veyssier <eneiluj@posteo.net>
2022-01-18 15:23:26 +00:00
Nextcloud bot 2f0ad2d639 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-01-18 02:56:05 +00:00
Nextcloud bot 745d76c74b [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-01-13 02:37:11 +00:00
Julius Härtl 3b7f49de55 Merge pull request #3527 from nextcloud/backport/3500/stable22 2022-01-12 13:45:45 +01:00
Julius Härtl e336bd98b2 Merge pull request #3524 from nextcloud/backport/3502/stable22 2022-01-12 08:39:40 +01:00
Julius Härtl f62e87cffa Update psalm baseline
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-01-12 08:38:51 +01:00
Nextcloud bot d4d716b1f5 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-01-12 02:37:26 +00:00
Julius Härtl 6e89dd48bc Move any circles API usage to internal service
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-01-11 09:31:34 +01:00
Julius Härtl 2bbd572cb5 Avoid blocking calendar access if something goes wrong while fetching deck entries
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2022-01-11 09:29:29 +01:00
Luka Trovic 17543eaf94 exclude deleted boards in the selection for target
Signed-off-by: Luka Trovic <luka@nextcloud.com>
2022-01-11 08:00:48 +00:00
Nextcloud bot 4f4e9fa5c7 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-01-11 02:37:41 +00:00
Julius Härtl d0060604a6 Merge pull request #3521 from nextcloud/backport/3512/stable22 2022-01-10 21:08:16 +01:00
Simon Spannagel 9f8df2bbd4 CardApiController: Fix order of optional parameters
Signed-off-by: Simon Spannagel <simonspa@kth.se>
2022-01-10 11:02:10 +00:00
Nextcloud bot 139cca1ae8 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-01-10 02:37:43 +00:00
Nextcloud bot 32054adcb5 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-01-08 02:36:42 +00:00
Nextcloud bot 764dd1e995 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-01-06 02:38:51 +00:00
Nextcloud bot b65fde069f [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-01-05 02:38:16 +00:00
Nextcloud bot bec68eb5c3 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-01-04 02:38:10 +00:00
Nextcloud bot 8dca76f9f0 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-01-03 02:38:06 +00:00
Nextcloud bot 13ed30e2bc [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-01-02 02:37:46 +00:00
Nextcloud bot a7ff79605d [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2022-01-01 02:37:48 +00:00
Nextcloud bot b5bebac3c2 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-12-31 02:38:05 +00:00
Nextcloud bot 756d78f78a [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-12-24 02:39:53 +00:00
Nextcloud bot 7e55cb18b3 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-12-22 02:38:53 +00:00
Nextcloud bot b834ef664a [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-12-20 02:40:45 +00:00
Nextcloud bot 1ee0e16f9e [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-12-18 02:37:55 +00:00
Nextcloud bot 63434d7b63 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-12-17 02:40:02 +00:00
Nextcloud bot d9f993dc5b [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-12-16 02:38:16 +00:00
Nextcloud bot 9090c13417 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-12-12 02:38:56 +00:00
Nextcloud bot 0630dafef9 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-12-09 02:40:05 +00:00
Nextcloud bot 150ab7b83a [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-12-05 02:43:14 +00:00
Nextcloud bot 11cc569914 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-12-03 02:40:13 +00:00
Nextcloud bot eaf58e0fc9 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-12-02 02:40:11 +00:00
Julius Härtl da994c5ecd Merge pull request #3460 from nextcloud/backport/3459/stable22 2021-11-30 16:32:06 +01:00
Julius Härtl cef4cc6a4d Fix cursor generation if no results are found
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2021-11-30 12:22:08 +00:00
Nextcloud bot d761323887 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-11-27 02:37:10 +00:00
Nextcloud bot 0857270a48 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-11-26 02:57:41 +00:00
Nextcloud bot df178369c0 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-11-25 02:36:05 +00:00
Nextcloud bot 8c3edf077d [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-11-24 02:37:00 +00:00
Jonas ac477a58c3 Merge pull request #3441 from nextcloud/backport/3428/stable22
[stable22] Allow to download an attachment without navigating to the files app
2021-11-22 19:11:19 +01:00
Julius Härtl 504f977739 Allow to download an attachment without navigating to the files app
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2021-11-22 17:40:38 +00:00
Nextcloud bot 00e813295b [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-11-20 02:53:16 +00:00
Nextcloud bot 300d300c45 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-11-19 02:53:35 +00:00
Nextcloud bot 1514f9a737 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-11-15 02:35:08 +00:00
Nextcloud bot f4fe271b39 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-11-14 02:36:21 +00:00
Nextcloud bot 1c01881eb7 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-11-13 02:36:43 +00:00
Julius Härtl af1564d8e5 Bump version to 1.5.5
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2021-11-10 20:12:55 +01:00
Julius Härtl 35515ce157 Bump version to 1.5.4
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2021-11-10 16:16:20 +01:00
Nextcloud bot fd62ab7a59 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-11-10 02:36:04 +00:00
Nextcloud bot 1557797926 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-11-09 04:07:36 +00:00
Nextcloud bot 90a8b479f6 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-11-08 02:49:15 +00:00
Nextcloud bot c2fae6b2d7 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-11-07 02:32:58 +00:00
Nextcloud bot 89a3f4fc26 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-11-06 02:33:23 +00:00
Julius Härtl 7aa94c74d7 Merge pull request #3407 from nextcloud/backport/3384/stable22
[stable22] Keep exceptions http response generic
2021-11-05 19:53:06 +01:00
Julius Härtl 33993418ac Keep exceptions http response generic and return the request ID for further tracing
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2021-11-05 17:02:27 +00:00
Nextcloud bot 75a2d9d54c [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-10-30 02:33:52 +00:00
Nextcloud bot b1a3c6b237 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-10-29 02:33:14 +00:00
Julius Härtl 437704abb3 Merge pull request #3392 from nextcloud/backport/3391/stable22 2021-10-27 14:16:01 +02:00
Paweł Kuffel 0e09548e69 use displayname instead of uid for mentions
Signed-off-by: Paweł Kuffel <pawel@kuffel.io>
2021-10-27 11:59:19 +00:00
Julius Härtl 37834cb926 Merge pull request #3378 from nextcloud/backport/3324/stable22 2021-10-22 20:24:40 +02:00
Nextcloud bot 7dd3bb49f4 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-10-22 02:32:43 +00:00
Julius Härtl fdf1eaeaed Merge pull request #3381 from Artem4590/backport/3323/stable22 2021-10-21 15:49:43 +02:00
Nextcloud bot 4cc88c8b64 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-10-21 02:34:56 +00:00
Nextcloud bot db331ecb72 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-10-20 02:53:53 +00:00
Artem Lavrukhin c2757bec7d [stable22] Extend drag-and-drop zone in card sidebar
Signed-off-by: Artem Lavrukhin <lavryha4590@gmail.com>
2021-10-15 16:09:10 +03:00
Lera Dmitrieva e074eac092 Fix menu button position in card modal
Signed-off-by: Lera Dmitrieva <dmit.valerya@yandex.ru>
2021-10-12 10:25:11 +00:00
Nextcloud bot d5166c74e5 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-10-07 02:36:02 +00:00
Julius Härtl 226e3c8212 Merge pull request #3366 from nextcloud/backport/3364/stable22 2021-10-06 11:40:20 +02:00
Julius Härtl a680915a89 Fix optional parameter order
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2021-10-06 09:24:12 +00:00
Julius Härtl b8ff06e5d2 Merge pull request #3361 from nextcloud/enh/stable22-paginated-search-for-boards-and-cards 2021-10-05 08:24:06 +02:00
Julien Veyssier 5a108b64b0 use distinct pagination cursor for cards and boards, use cursor and limit in SearchService::searchBoards()
Signed-off-by: Julien Veyssier <eneiluj@posteo.net>
2021-10-04 17:38:07 +02:00
Nextcloud bot 00630587af [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-10-04 02:37:16 +00:00
Nextcloud bot b02cf925a1 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-10-02 02:37:09 +00:00
Julius Härtl aaa26575dd Bump version to 1.5.3
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2021-09-14 21:08:10 +02:00
Julius Härtl aebb3cef03 Merge pull request #3317 from nextcloud/backport/3316/stable22
[stable22] Additional check for stacks
2021-09-14 21:06:56 +02:00
Julius Härtl 18a7ae3a1a Additional check for stacks
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2021-09-14 19:01:19 +00:00
Nextcloud bot 6c84c67970 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-09-14 02:42:00 +00:00
Nextcloud bot d449acde30 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-09-13 02:40:06 +00:00
Nextcloud bot c1e700cefa [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-09-12 02:40:07 +00:00
Julius Härtl 30df03948c Bump version to 1.5.2
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2021-09-09 14:18:07 +02:00
Nextcloud bot 15ea081daa [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-09-09 02:38:56 +00:00
Julius Härtl 0f71741c46 Merge pull request #3306 from nextcloud/backport/3299/stable22
[stable22] Return false instead of throwing when getting calendar setting
2021-09-08 18:28:57 +02:00
Julius Härtl 585f0999a3 Merge pull request #3303 from nextcloud/backport/3298/stable22 2021-09-08 18:14:35 +02:00
Julius Härtl d51f645299 Return false instead of throwing when getting calendar integration setting
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2021-09-08 16:00:28 +00:00
Julius Härtl ebbe4eb802 Delete file shares through attachments API
Previously the file was deleted in the file structure of the user is not
expected as the file might not only be related to the card.

Signed-off-by: Julius Härtl <jus@bitgrid.net>
2021-09-08 17:57:01 +02:00
Nextcloud bot d6c94f44d9 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-09-08 02:38:21 +00:00
Julius Härtl 86345a6338 Merge pull request #3300 from nextcloud/backport/3294/stable22
[stable22] Fix print style issues
2021-09-07 13:14:33 +02:00
Michael Weimann 2c77d8a589 fix print style issues
Signed-off-by: Michael Weimann <mail@michael-weimann.eu>
2021-09-06 13:58:34 +00:00
Nextcloud bot 16cbbd4805 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-09-06 02:38:53 +00:00
Nextcloud bot 8aa77679c8 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-09-05 02:38:20 +00:00
Julius Härtl e6cff5bbb6 Bump version to 1.5.1
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2021-09-03 15:03:27 +02:00
Nextcloud bot 86ed24744c [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-08-31 02:37:47 +00:00
Julius Härtl 01ed3625dc Merge pull request #3264 from nextcloud/backport/3263/stable22
[stable22] Defer obtaining the user session in the config service
2021-08-20 19:07:13 +02:00
Julius Härtl cc9dea1f2b Defer obtaining the user session in the config service which might be injected before login has hapened
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2021-08-20 16:02:48 +00:00
Nextcloud bot b16ade905c [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-08-18 02:37:01 +00:00
Nextcloud bot ee1bba7d99 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-08-10 02:44:35 +00:00
Nextcloud bot 3407097e95 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-08-06 02:38:51 +00:00
Julius Härtl 47ac3e6082 Merge pull request #3231 from nextcloud/backport/3225/stable22
[stable22] Check for null value to avoid TypeError in the group manager
2021-08-05 09:04:16 +02:00
Julius Härtl 75110bed47 Check for null value to avoid TypeError in the group manager
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2021-08-04 16:41:31 +00:00
Julius Härtl 74f0106718 Merge pull request #3224 from nextcloud/backport/3217/stable22
[stable22] Move circle checks to a unified service and improve member checks
2021-08-03 11:41:03 +02:00
Julius Härtl 958d50d9b7 Move circle checks to a unified service and improve member checks
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2021-08-03 07:43:30 +00:00
Julius Härtl 5f4aa017b6 Pin mariadb to 10.5 for tests
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2021-08-03 09:42:43 +02:00
Nextcloud bot 92c2a58f50 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-08-01 02:12:52 +00:00
Nextcloud bot 75bf0dffe6 [tx-robot] updated from transifex
Signed-off-by: Nextcloud bot <bot@nextcloud.com>
2021-07-15 10:52:50 +00:00
Julius Härtl 45a10f0840 Bump version to 1.5.0
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2021-07-09 11:55:34 +02:00
Julius Härtl fbf3b1cd19 Merge pull request #3168 from nextcloud/backport/3161/stable22
[stable22] Reduce duplicate queries when fetching user boards an permissions
2021-07-06 07:54:35 +02:00
Julius Härtl 0cc4151929 Reduce duplicate queries when fetching user boards an permissions
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2021-07-05 18:27:49 +00:00
Julius Härtl e261ade1bb Merge pull request #3165 from nextcloud/backport/3151/stable22
[stable22] Always log generic exceptions
2021-07-05 16:21:15 +02:00
Julius Härtl 5d7e54d419 Always log generic exceptions
Signed-off-by: Julius Härtl <jus@bitgrid.net>
2021-07-02 15:55:44 +00:00
Julius Härtl 3499858295 Merge remote-tracking branch 'origin/master' into stable22 2021-06-25 15:39:38 +02:00
Julius Härtl 1615e218bd Merge pull request #3148 from nextcloud/update-stable22-target-versions
Update stable22 target versions
2021-06-25 09:07:38 +02:00
Joas Schilling 9a3b859780 Update stable22 target versions
Signed-off-by: Joas Schilling <coding@schilljs.com>
2021-06-24 14:07:30 +02:00
135 changed files with 11063 additions and 11356 deletions
+1 -5
View File
@@ -3,10 +3,6 @@ module.exports = {
'@nextcloud', '@nextcloud',
], ],
rules: { rules: {
'jsdoc/require-param-description': ['off'], 'valid-jsdoc': ['off'],
'jsdoc/require-param-type': ['off'],
'jsdoc/check-param-names': ['off'],
'jsdoc/no-undefined-types': ['off'],
'jsdoc/require-property-description' : ['off']
}, },
} }
-10
View File
@@ -39,13 +39,3 @@ updates:
versions: versions:
- "< 16" - "< 16"
- ">= 15.a" - ">= 15.a"
- package-ecosystem: github-actions
directory: "/"
schedule:
interval: weekly
day: saturday
time: "03:00"
timezone: Europe/Paris
open-pull-requests-limit: 10
reviewers:
- juliushaertl
+25
View File
@@ -0,0 +1,25 @@
# Number of days of inactivity before an issue becomes stale
daysUntilStale: 60
# Number of days of inactivity before a stale issue is closed
daysUntilClose: 7
# Issues with these labels will never be considered stale
exemptLabels:
- "1. to develop"
- "2. developing"
- "3. to review"
- "discussion"
- "bounty"
- "bug"
- "enhancement"
# Limit the number of actions per hour, from 1-30. Default is 30
limitPerRun: 30
# Label to use when marking an issue as stale
staleLabel: stale
# Comment to post when marking an issue as stale. Set to `false` to disable
markComment: >
This issue has been automatically marked as stale because it has not had
recent activity. It will be closed if no further activity occurs. Thank you
for your contributions.
+39
View File
@@ -0,0 +1,39 @@
name: Package build
on:
pull_request:
jobs:
build:
runs-on: ubuntu-18.04
strategy:
matrix:
node-version: [14.x]
steps:
- uses: actions/checkout@v1
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
- name: Set up npm7
run: npm i -g npm@7
- name: Setup PHP
uses: shivammathur/setup-php@v1
with:
php-version: '7.4'
tools: composer
- name: install dependencies
run: |
wget https://github.com/ChristophWurst/krankerl/releases/download/v0.12.2/krankerl_0.12.2_amd64.deb
sudo dpkg -i krankerl_0.12.2_amd64.deb
- name: package
run: |
uname -a
RUST_BACKTRACE=1 krankerl --version
RUST_BACKTRACE=1 krankerl package
- uses: actions/upload-artifact@v2
with:
name: Deck app tarball
path: build/artifacts/deck.tar.gz
-46
View File
@@ -1,46 +0,0 @@
# This workflow is provided via the organization template repository
#
# https://github.com/nextcloud/.github
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
name: Rebase command
on:
issue_comment:
types: created
jobs:
rebase:
runs-on: ubuntu-latest
# On pull requests and if the comment starts with `/rebase`
if: github.event.issue.pull_request != '' && startsWith(github.event.comment.body, '/rebase')
steps:
- name: Add reaction on start
uses: peter-evans/create-or-update-comment@v1
with:
token: ${{ secrets.COMMAND_BOT_PAT }}
repository: ${{ github.event.repository.full_name }}
comment-id: ${{ github.event.comment.id }}
reaction-type: "+1"
- name: Checkout the latest code
uses: actions/checkout@v2.4.0
with:
fetch-depth: 0
token: ${{ secrets.COMMAND_BOT_PAT }}
- name: Automatic Rebase
uses: cirrus-actions/rebase@1.5
env:
GITHUB_TOKEN: ${{ secrets.COMMAND_BOT_PAT }}
- name: Add reaction on failure
uses: peter-evans/create-or-update-comment@v1
if: failure()
with:
token: ${{ secrets.COMMAND_BOT_PAT }}
repository: ${{ github.event.repository.full_name }}
comment-id: ${{ github.event.comment.id }}
reaction-type: "-1"
@@ -1,29 +0,0 @@
# This workflow is provided via the organization template repository
#
# https://github.com/nextcloud/.github
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
name: Dependabot
on:
pull_request_target:
branches:
- master
- stable*
jobs:
auto-approve-merge:
if: github.actor == 'dependabot[bot]'
runs-on: ubuntu-latest
steps:
# Github actions bot approve
- uses: hmarr/auto-approve-action@v2
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
# Nextcloud bot approve and merge request
- uses: ahmadnassri/action-dependabot-auto-merge@v2
with:
target: patch
github-token: ${{ secrets.DEPENDABOT_AUTOMERGE_TOKEN }}
-33
View File
@@ -1,33 +0,0 @@
# This workflow is provided via the organization template repository
#
# https://github.com/nextcloud/.github
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
name: Block fixup and squash commits
on:
pull_request:
types: [opened, ready_for_review, reopened, synchronize]
permissions:
contents: read
concurrency:
group: fixup-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
commit-message-check:
if: github.event.pull_request.draft == false
permissions:
pull-requests: write
name: Block fixup and squash commits
runs-on: ubuntu-latest
steps:
- name: Run check
uses: skjnldsv/block-fixup-merge-action@42d26e1b536ce61e5cf467d65fb76caf4aa85acf # v1
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
+6 -13
View File
@@ -19,13 +19,13 @@ jobs:
matrix: matrix:
php-versions: ['7.4'] php-versions: ['7.4']
databases: ['sqlite', 'mysql', 'pgsql'] databases: ['sqlite', 'mysql', 'pgsql']
server-versions: ['stable23'] server-versions: ['stable22']
name: php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }} name: php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }}
services: services:
postgres: postgres:
image: postgres:14 image: postgres
ports: ports:
- 4445:5432/tcp - 4445:5432/tcp
env: env:
@@ -43,7 +43,7 @@ jobs:
steps: steps:
- name: Checkout server - name: Checkout server
uses: actions/checkout@v2.4.0 uses: actions/checkout@v2
with: with:
repository: nextcloud/server repository: nextcloud/server
ref: ${{ matrix.server-versions }} ref: ${{ matrix.server-versions }}
@@ -56,23 +56,16 @@ jobs:
git -c "http.extraheader=$auth_header" -c protocol.version=2 submodule update --init --force --recursive --depth=1 git -c "http.extraheader=$auth_header" -c protocol.version=2 submodule update --init --force --recursive --depth=1
- name: Checkout app - name: Checkout app
uses: actions/checkout@v2.4.0 uses: actions/checkout@v2
with: with:
path: apps/${{ env.APP_NAME }} path: apps/${{ env.APP_NAME }}
- name: Checkout activity
uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
with:
repository: nextcloud/activity
ref: ${{ matrix.server-versions }}
path: apps/activity
- name: Set up php ${{ matrix.php-versions }} - name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@2.15.0 uses: shivammathur/setup-php@v2
with: with:
php-version: ${{ matrix.php-versions }} php-version: ${{ matrix.php-versions }}
tools: phpunit tools: phpunit
extensions: mbstring, gd, iconv, fileinfo, intl, sqlite, pdo_sqlite, mysql, pdo_mysql, pgsql, pdo_pgsql, extensions: mbstring, iconv, fileinfo, intl, sqlite, pdo_sqlite, mysql, pdo_mysql, pgsql, pdo_pgsql,
coverage: none coverage: none
- name: Set up PHPUnit - name: Set up PHPUnit
+12 -12
View File
@@ -17,9 +17,9 @@ jobs:
name: php${{ matrix.php-versions }} lint name: php${{ matrix.php-versions }} lint
steps: steps:
- uses: actions/checkout@v2.4.0 - uses: actions/checkout@v2
- name: Set up php${{ matrix.php-versions }} - name: Set up php${{ matrix.php-versions }}
uses: shivammathur/setup-php@2.15.0 uses: shivammathur/setup-php@v1
with: with:
php-version: ${{ matrix.php-versions }} php-version: ${{ matrix.php-versions }}
coverage: none coverage: none
@@ -31,9 +31,9 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v2.4.0 uses: actions/checkout@master
- name: Set up php - name: Set up php
uses: shivammathur/setup-php@2.15.0 uses: shivammathur/setup-php@master
with: with:
php-version: 7.4 php-version: 7.4
coverage: none coverage: none
@@ -50,9 +50,9 @@ jobs:
node-version: [14.x] node-version: [14.x]
steps: steps:
- uses: actions/checkout@v2.4.0 - uses: actions/checkout@v2
- name: Use node ${{ matrix.node-version }} - name: Use node ${{ matrix.node-version }}
uses: actions/setup-node@v2.4.1 uses: actions/setup-node@v1
with: with:
node-version: ${{ matrix.node-version }} node-version: ${{ matrix.node-version }}
- name: Set up npm7 - name: Set up npm7
@@ -67,16 +67,16 @@ jobs:
strategy: strategy:
matrix: matrix:
node-version: [14.x] node-versions: [14.x]
name: stylelint node${{ matrix.node-version }} name: stylelint node${{ matrix.node-versions }}
steps: steps:
- uses: actions/checkout@v2.4.0 - uses: actions/checkout@v2
- name: Set up node ${{ matrix.node-version }} - name: Set up node ${{ matrix.node-versions }}
uses: actions/setup-node@v2.4.1 uses: actions/setup-node@v1
with: with:
node-version: ${{ matrix.node-version }} node-versions: ${{ matrix.node-versions }}
- name: Set up npm7 - name: Set up npm7
run: npm i -g npm@7 run: npm i -g npm@7
+3 -3
View File
@@ -17,15 +17,15 @@ jobs:
node-version: [14.x] node-version: [14.x]
steps: steps:
- uses: actions/checkout@v2.4.0 - uses: actions/checkout@v1
- name: Use Node.js ${{ matrix.node-version }} - name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v2.4.1 uses: actions/setup-node@v1
with: with:
node-version: ${{ matrix.node-version }} node-version: ${{ matrix.node-version }}
- name: Set up npm7 - name: Set up npm7
run: npm i -g npm@7 run: npm i -g npm@7
- name: Setup PHP - name: Setup PHP
uses: shivammathur/setup-php@2.15.0 uses: shivammathur/setup-php@v1
with: with:
php-version: '7.4' php-version: '7.4'
tools: composer tools: composer
+2 -2
View File
@@ -12,9 +12,9 @@ jobs:
node-version: [14.x] node-version: [14.x]
steps: steps:
- uses: actions/checkout@v2.4.0 - uses: actions/checkout@v1
- name: Use Node.js ${{ matrix.node-version }} - name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v2.4.1 uses: actions/setup-node@v1
with: with:
node-version: ${{ matrix.node-version }} node-version: ${{ matrix.node-version }}
- name: Set up npm7 - name: Set up npm7
+6 -6
View File
@@ -13,20 +13,20 @@ env:
jobs: jobs:
integration: integration:
runs-on: ubuntu-latest runs-on: ubuntu-18.04
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
php-versions: ['7.3', '7.4'] php-versions: ['7.3', '7.4']
databases: ['sqlite', 'mysql', 'pgsql'] databases: ['sqlite', 'mysql', 'pgsql']
server-versions: ['stable23'] server-versions: ['stable22']
name: php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }} name: php${{ matrix.php-versions }}-${{ matrix.databases }}-${{ matrix.server-versions }}
services: services:
postgres: postgres:
image: postgres:14 image: postgres
ports: ports:
- 4445:5432/tcp - 4445:5432/tcp
env: env:
@@ -44,7 +44,7 @@ jobs:
steps: steps:
- name: Checkout server - name: Checkout server
uses: actions/checkout@v3 uses: actions/checkout@v2
with: with:
repository: nextcloud/server repository: nextcloud/server
ref: ${{ matrix.server-versions }} ref: ${{ matrix.server-versions }}
@@ -57,12 +57,12 @@ jobs:
git -c "http.extraheader=$auth_header" -c protocol.version=2 submodule update --init --force --recursive --depth=1 git -c "http.extraheader=$auth_header" -c protocol.version=2 submodule update --init --force --recursive --depth=1
- name: Checkout app - name: Checkout app
uses: actions/checkout@v3 uses: actions/checkout@v2
with: with:
path: apps/${{ env.APP_NAME }} path: apps/${{ env.APP_NAME }}
- name: Set up php ${{ matrix.php-versions }} - name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@2.15.0 uses: shivammathur/setup-php@v2
with: with:
php-version: ${{ matrix.php-versions }} php-version: ${{ matrix.php-versions }}
tools: phpunit tools: phpunit
-35
View File
@@ -1,35 +0,0 @@
# This workflow is provided via the organization template repository
#
# https://github.com/nextcloud/.github
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
name: Static analysis
on:
pull_request:
push:
branches:
- master
- main
- stable*
jobs:
static-analysis:
runs-on: ubuntu-latest
name: Nextcloud
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Set up php
uses: shivammathur/setup-php@v2
with:
php-version: 7.4
coverage: none
- name: Install dependencies
run: composer i
- name: Run coding standards check
run: composer run psalm
+31
View File
@@ -0,0 +1,31 @@
name: Static analysis
on:
pull_request:
push:
branches:
- master
- stable*
jobs:
static-psalm-analysis:
runs-on: ubuntu-latest
strategy:
matrix:
ocp-version: [ 'dev-stable22' ]
name: Nextcloud ${{ matrix.ocp-version }}
steps:
- name: Checkout
uses: actions/checkout@master
- name: Set up php
uses: shivammathur/setup-php@master
with:
php-version: 7.4
tools: composer:v1
coverage: none
- name: Install dependencies
run: composer i
- name: Install dependencies
run: composer require --dev christophwurst/nextcloud:${{ matrix.ocp-version }}
- name: Run coding standards check
run: composer run psalm
@@ -1,65 +0,0 @@
# This workflow is provided via the organization template repository
#
# https://github.com/nextcloud/.github
# https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization
name: Update nextcloud/ocp
on:
workflow_dispatch:
schedule:
- cron: "5 2 * * 0"
jobs:
update-nextcloud-ocp:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
branches: ["master", "stable25", "stable24", "stable23"]
name: update-nextcloud-ocp-${{ matrix.branches }}
steps:
- uses: actions/checkout@v3
with:
ref: ${{ matrix.branches }}
submodules: true
- name: Set up php7.4
uses: shivammathur/setup-php@v2
with:
php-version: 7.4
extensions: ctype,curl,dom,fileinfo,gd,intl,json,mbstring,openssl,pdo_sqlite,posix,sqlite,xml,zip
coverage: none
- name: Composer install
run: composer install
- name: Composer update nextcloud/ocp
run: composer require --dev nextcloud/ocp:dev-${{ matrix.branches }}
continue-on-error: true
- name: Reset checkout dirs
run: |
git clean -f 3rdparty
git clean -f vendor
git checkout 3rdparty vendor
continue-on-error: true
- name: Create Pull Request
uses: peter-evans/create-pull-request@v3
with:
token: ${{ secrets.COMMAND_BOT_PAT }}
commit-message: Update psalm baseline
committer: GitHub <noreply@github.com>
author: nextcloud-command <nextcloud-command@users.noreply.github.com>
signoff: true
branch: automated/noid/${{ matrix.branches }}-update-nextcloud-ocp
title: "[${{ matrix.branches }}] Update nextcloud/ocp dependency"
body: |
Auto-generated update of [nextcloud/ocp](https://github.com/nextcloud-deps/ocp/) dependency
labels: |
dependencies
3. to review
+1 -1
View File
@@ -1,6 +1,6 @@
[main] [main]
host = https://www.transifex.com host = https://www.transifex.com
lang_map = sk_SK: sk, th_TH: th, ja_JP: ja, bg_BG: bg, cs_CZ: cs, fi_FI: fi, hu_HU: hu, nb_NO: nb 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
[o:nextcloud:p:nextcloud:r:deck] [o:nextcloud:p:nextcloud:r:deck]
file_filter = translationfiles/<lang>/deck.po file_filter = translationfiles/<lang>/deck.po
+110 -118
View File
@@ -1,132 +1,124 @@
# Changelog # Changelog
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
## 1.6.7 ## 1.5.8
### Fixed ### Fixed
- Align Duedate-delete icon properly - fixes nextcloud/deck#3791 [#3817](https://github.com/nextcloud/deck/pull/3817)
- fix: Detect end of the activity responses (fix #3395) #6518 - Increase file count after sharing [#3806](https://github.com/nextcloud/deck/pull/3806)
- fix: Avoid conflicts on deck attachments folder name #5705 - Show cards after moving into another list [#3794](https://github.com/nextcloud/deck/pull/3794)
- Fetch full board data after cloning [#3781](https://github.com/nextcloud/deck/pull/3781)
## 1.6.6
### Fixed
- Gracefully handle not found card for a share [#4570](https://github.com/nextcloud/deck/pull/4570)
- Fix(occ): set user id for permission sevice from board service [#5073](https://github.com/nextcloud/deck/pull/5073)
- Fix deleted card/board issues @juliushaertl [#5450](https://github.com/nextcloud/deck/pull/5450)
- Fix small issues around delete/undo @juliushaertl [#5447](https://github.com/nextcloud/deck/pull/5447)
## 1.6.5
### Fixed
- minor style fixes [#4203](https://github.com/nextcloud/deck/pull/4203)
- Add integration test for attachment handling on cards [#4177](https://github.com/nextcloud/deck/pull/4177)
- feat: add validators to check values in services @juliushaertl [#4175](https://github.com/nextcloud/deck/pull/4175)
- disables autocomplete on card creation @juliushaertl [#4183](https://github.com/nextcloud/deck/pull/4183)
## 1.6.4
### Fixed
- Cache user membership for circles [#4133](https://github.com/nextcloud/deck/pull/4133)
- Set event link also for notifications that get emitted from activities [#4119](https://github.com/nextcloud/deck/pull/4119)
- disable Create card button while no stack is chosen [#4020](https://github.com/nextcloud/deck/pull/4020)
- to nextcloud/OCP package in stable23 [#4094](https://github.com/nextcloud/deck/pull/4094)
- Use capped memory cache for board permissions [#3998](https://github.com/nextcloud/deck/pull/3998)
- Improve CalDAV integration performance [#3996](https://github.com/nextcloud/deck/pull/3996)
- Fetch attachment folder for the correct user during cron job [#3960](https://github.com/nextcloud/deck/pull/3960)
- Switch to 'markdown-it-task-checkbox' for rendering of task lists [#3926](https://github.com/nextcloud/deck/pull/3926)
- Prevent opening card and applyLabelFilter on card drag end [#3918](https://github.com/nextcloud/deck/pull/3918)
- Fix z-index for deck sidebar [#3886](https://github.com/nextcloud/deck/pull/3886)
## 1.6.3 ## 1.5.7
### Fixed
- Align Duedate-delete icon properly - fixes nextcloud/deck#3791 [#3816](https://github.com/nextcloud/deck/pull/3816)
- Increase file count after sharing [#3805](https://github.com/nextcloud/deck/pull/3805)
- Show cards after moving into another list [#3795](https://github.com/nextcloud/deck/pull/3795)
- Fetch full board data after cloning [#3780](https://github.com/nextcloud/deck/pull/3780)
- Handle qb mapper exception messages properly [#3770](https://github.com/nextcloud/deck/pull/3770)
## 1.6.2
### Added ### Added
- Transfer ownership @juliushaertl [#3664](https://github.com/nextcloud/deck/pull/3664) - Transfer ownership @juliushaertl [#3665](https://github.com/nextcloud/deck/pull/3665)
### Fixed ### Fixed
- 🐛 Fix missing files sidebar [#3641](https://github.com/nextcloud/deck/pull/3641) - Fix: Check all circle shares for permissions [#3721](https://github.com/nextcloud/deck/pull/3721)
- Add a missing translation - not found in transifex [#3706](https://github.com/nextcloud/deck/pull/3706) - Add a missing translation - not found in transifex [#3707](https://github.com/nextcloud/deck/pull/3707)
- Fix: Check all circle shares for permissions [#3717](https://github.com/nextcloud/deck/pull/3717) - 🐛 Fix missing files sidebar [#3642](https://github.com/nextcloud/deck/pull/3642)
- Sort boards non case sensitive [#3663](https://github.com/nextcloud/deck/pull/3663) - [stable23] Use explicit cast to make use of index [#3731](https://github.com/nextcloud/deck/pull/3731)
- Use explicit cast to make use of index @juliushaertl [#3497](https://github.com/nextcloud/deck/pull/3497) - Fix hidden attachment icon on archived cards [#3735](https://github.com/nextcloud/deck/pull/3735)
- Fix paramter replacements when creating deck cards from talk messages @juliushaertl [#3741](https://github.com/nextcloud/deck/pull/3741) - [stable23] Sort boards non case sensitive [#3739](https://github.com/nextcloud/deck/pull/3739)
- Fix hidden attachment icon on archived cards [#3734](https://github.com/nextcloud/deck/pull/3734) - add autofocus on board edit #3326 @juliushaertl [#3743](https://github.com/nextcloud/deck/pull/3743)
- Fix text selection in dark mode and modal view [#3766](https://github.com/nextcloud/deck/pull/3766) - Fix paramter replacements when creating deck cards from talk messages @juliushaertl [#3742](https://github.com/nextcloud/deck/pull/3742)
- Fix text selection in dark mode and modal view [#3767](https://github.com/nextcloud/deck/pull/3767)
### Other ### Other
- Properly check for the stack AND setting board permissions [#3713](https://github.com/nextcloud/deck/pull/3713) - Properly check for the stack AND setting board permissions [#3714](https://github.com/nextcloud/deck/pull/3714)
- Add missing indices [#3755](https://github.com/nextcloud/deck/pull/3755) - Add missing indices [#3756](https://github.com/nextcloud/deck/pull/3756)
## 1.6.1
## 1.5.6
### Fixed ### Fixed
- Exclude deleted boards in the selection for target [#3523](https://api.github.com/repos/nextcloud/deck/pulls/3523) - Allow to download an attachment without navigating to the files app [#3441](https://api.github.com/repos/nextcloud/deck/pulls/3441)
- CardApiController: Fix order of optional parameters [#3520](https://api.github.com/repos/nextcloud/deck/pulls/3520) - Fix CalDAV blocking and modernize circles API usage [#3527](https://api.github.com/repos/nextcloud/deck/pulls/3527)
- Fix cursor generation if no results are found [#3462](https://api.github.com/repos/nextcloud/deck/pulls/3462) - CardApiController: Fix order of optional parameters [#3521](https://api.github.com/repos/nextcloud/deck/pulls/3521)
- Fix CalDAV blocking and modernize circles API usage [#3526](https://api.github.com/repos/nextcloud/deck/pulls/3526) - Fix cursor generation if no results are found [#3460](https://api.github.com/repos/nextcloud/deck/pulls/3460)
- Fix overview card listing [#3463](https://api.github.com/repos/nextcloud/deck/pulls/3463) - Exclude deleted boards in the selection for target [#3524](https://api.github.com/repos/nextcloud/deck/pulls/3524)
- Generate fixed link for activity emails [#3626](https://api.github.com/repos/nextcloud/deck/pulls/3626) - Generate fixed link for activity emails [#3627](https://api.github.com/repos/nextcloud/deck/pulls/3627)
- return the selector for collections [#3618](https://api.github.com/repos/nextcloud/deck/pulls/3618) - Make insert attachment buttom easy to click [#3615](https://api.github.com/repos/nextcloud/deck/pulls/3615)
- Fix confusion between stackId and boardId in StackService [#3543](https://api.github.com/repos/nextcloud/deck/pulls/3543) - Fix confusion between stackId and boardId in StackService [#3544](https://api.github.com/repos/nextcloud/deck/pulls/3544)
- Fix talk integration [#3537](https://api.github.com/repos/nextcloud/deck/pulls/3537)
- Make insert attachment buttom easy to click [#3614](https://api.github.com/repos/nextcloud/deck/pulls/3614)
## 1.6.0 ## 1.5.5
- Fix release asset build
## 1.5.4
### Fixed
- #3378 Fix menu button position in card modal
- #3392 Use displayname instead of uid for mentions (reopened against master)
- #3361 Improve combined search @eneiluj
- #3381 Extend drag-and-drop zone in card sidebar @Artem4590
- #3366 Fix optional parameter order
- #3407 Keep exceptions http response generic
## 1.5.3
### Fied
- #3317 Additional check for stacks
## 1.5.2
### Fixed
- #3300 Fix print style issues
- #3303 Delete file shares through attachments API
- #3306 Return false instead of throwing when getting calendar setting
## 1.5.1 - 2021-09-03
### Fixed
- #3224 Move circle checks to a unified service and improve member checks
- #3231 Check for null value to avoid TypeError in the group manager
- #3264 Defer obtaining the user session in the config service
## 1.5.0 - 2021-07-09
### Added ### Added
- #3449 Cache most frequent queries * Nextcloud 22 compatibility
- #3177 Use async import for vue component on collections entrypoint @juliushaertl * [#3105](https://github.com/nextcloud/deck/pull/3105) Compatibility with Cirlces changes in 22
- #2791 Open description links in new tab @fm-sys * [#3147](https://github.com/nextcloud/deck/pull/3147) Add card button to the dashboard widget @jakobroehrl
- #3344 Improve combined search @eneiluj * [#2854](https://github.com/nextcloud/deck/pull/2854) Add card button in card overview @jakobroehrl
- #3362 Improve search performance @eneiluj * [#3078](https://github.com/nextcloud/deck/pull/3078) Show on shared boards unassigned cards to all users @jakobroehrl
- #2710 Due date shortcuts in the datepicker @jakobroehrl
### Fixed ### Fixed
- #3446 Switch to QBMapper in BoardMapper * [#2935](https://github.com/nextcloud/deck/pull/2935) Rich object string parameters for notifications @nickvergessen
- #3433 Fix event name for updating the description * [#2950](https://github.com/nextcloud/deck/pull/2950) Remove notification on unshare and add type hints
- #3463 Fix overview card listing * [#2983](https://github.com/nextcloud/deck/pull/2983) Fix codemirror description width
- #3440 Allow to download an attachment without navigating to the files app * [#2989](https://github.com/nextcloud/deck/pull/2989) Fix unified comments search with postgres
- #3462 Fix cursor generation if no results are found * [#3005](https://github.com/nextcloud/deck/pull/3005) Do not query the lookupserver when looking for sharees
- #3161 Reduce duplicate queries when fetching user boards an permissions @juliushaertl * [#3011](https://github.com/nextcloud/deck/pull/3011) L10n: Spelling unification @Valdnet
- #3151 Always log generic exceptions @juliushaertl * [#3014](https://github.com/nextcloud/deck/pull/3014) Proper error handling when fetching comments fails
- #3217 Move circle checks to a unified service and improve member checks @juliushaertl * [#3016](https://github.com/nextcloud/deck/pull/3016) Allow searching for filters without a query to match all that have a given filter set
- #3225 Check for null value to avoid TypeError in the group manager @juliushaertl * [#3021](https://github.com/nextcloud/deck/pull/3021) L10n: Add word "Card" @Valdnet
- #3263 Defer obtaining the user session in the config service @juliushaertl * [#3025](https://github.com/nextcloud/deck/pull/3025) Show comment counter and highlight if unread comments are available
- #3294 Fix print style issues @weeman1337 * [#3036](https://github.com/nextcloud/deck/pull/3036) Add link to migration tool for Trello @maxammann
- #3299 Return false instead of throwing when getting calendar setting @juliushaertl * [#3037](https://github.com/nextcloud/deck/pull/3037) Catch any error during circle detail fetching
- #3298 Delete file shares through attachments API @juliushaertl * [#3038](https://github.com/nextcloud/deck/pull/3038) Get attachment from the user node instead of the share source
- #3343 Fix search pagination cursor @eneiluj * [#3092](https://github.com/nextcloud/deck/pull/3092) Refactor update to have proper order of optional parameters
- #3326 add autofocus on board edit @weeman1337 * [#3113](https://github.com/nextcloud/deck/pull/3113) Use new viewer syntax with destructuring object @azul
- #3323 Extend drag-and-drop zone in card sidebar @old-green-frog * [#3142](https://github.com/nextcloud/deck/pull/3142) Always pass user id in share provider
- #3364 Fix optional parameter order @juliushaertl * [#3152](https://github.com/nextcloud/deck/pull/3152) Only offer stack creation in emptycontent with proper permissions
- #3324 Fix menu button position in card modal @valerydmitrieva * [#3165](https://github.com/nextcloud/deck/pull/3165) Always log generic exceptions
- #3391 Use displayname instead of uid for mentions (reopened against master) @kffl * [#3168](https://github.com/nextcloud/deck/pull/3168) Reduce duplicate queries when fetching user boards an permissions
- #3316 Additional check for stacks @juliushaertl
- #3357 Revert "Fix search pagination cursor" @juliushaertl
- #3327 Do not show both bullets and checkboxes for checklists @Themanwhosmellslikesugar
- #3375 Show absolute dates when printing @weeman1337
- #3376 Print assignee names @weeman1337
- #3384 Keep exceptions http response generic @juliushaertl
## 1.4.0 - 2021-04-13 ## 1.4.0 - 2021-04-13
@@ -163,15 +155,15 @@ All notable changes to this project will be documented in this file.
## 1.3.0-beta2 ## 1.3.0-beta2
### Fixed ### Fixed
* [#2700](https://github.com/nextcloud/deck/pull/2700) Attempt to copy file on dropping it to deck @juliushaertl * [#2700](https://github.com/nextcloud/deck/pull/2700) Attempt to copy file on dropping it to deck
* [#2701](https://github.com/nextcloud/deck/pull/2701) Fix uploading files by drag and drop @juliushaertl * [#2701](https://github.com/nextcloud/deck/pull/2701) Fix uploading files by drag and drop
* [#2707](https://github.com/nextcloud/deck/pull/2707) L10n: Change to a capital letter @Valdnet * [#2707](https://github.com/nextcloud/deck/pull/2707) L10n: Change to a capital letter @Valdnet
* [#2712](https://github.com/nextcloud/deck/pull/2712) Docs: Fix table in section "GET /api/v1.0/config" @das-g * [#2712](https://github.com/nextcloud/deck/pull/2712) Docs: Fix table in section "GET /api/v1.0/config" @das-g
* [#2716](https://github.com/nextcloud/deck/pull/2716) Remove repair step which is no longer needed as we cleanup properly @juliushaertl * [#2716](https://github.com/nextcloud/deck/pull/2716) Remove repair step which is no longer needed as we cleanup properly
* [#2723](https://github.com/nextcloud/deck/pull/2723) Pad random color with leading zeroes @PVince81 * [#2723](https://github.com/nextcloud/deck/pull/2723) Pad random color with leading zeroes @PVince81
* [#2729](https://github.com/nextcloud/deck/pull/2729) Remove invalid activity parameters @nickvergessen * [#2729](https://github.com/nextcloud/deck/pull/2729) Remove invalid activity parameters @nickvergessen
* [#2750](https://github.com/nextcloud/deck/pull/2750) Fix deck activity emails not being translated @nickvergessen * [#2750](https://github.com/nextcloud/deck/pull/2750) Fix deck activity emails not being translated @nickvergessen
* [#2751](https://github.com/nextcloud/deck/pull/2751) Properly set author for activity events that are triggered by cron @juliushaertl * [#2751](https://github.com/nextcloud/deck/pull/2751) Properly set author for activity events that are triggered by cron
## 1.2.2 - 2020-11-24 ## 1.2.2 - 2020-11-24
@@ -280,31 +272,31 @@ All notable changes to this project will be documented in this file.
### Fixed ### Fixed
* [#2116](https://github.com/nextcloud/deck/pull/2116) Fix navigation layout issues @juliushaertl * [#2116](https://github.com/nextcloud/deck/pull/2116) Fix navigation layout issues
* [#2118](https://github.com/nextcloud/deck/pull/2118) Use proper parameter when handling attachments @juliushaertl * [#2118](https://github.com/nextcloud/deck/pull/2118) Use proper parameter when handling attachments
## 1.0.4 - 2020-06-26 ## 1.0.4 - 2020-06-26
### Fixed ### Fixed
* [#2062](https://github.com/nextcloud/deck/pull/2062) Fix saving card description after toggling checkboxes @juliushaertl * [#2062](https://github.com/nextcloud/deck/pull/2062) Fix saving card description after toggling checkboxes
* [#2065](https://github.com/nextcloud/deck/pull/2065) Adding CSS rule for Markdown Blockquotes @reox * [#2065](https://github.com/nextcloud/deck/pull/2065) Adding CSS rule for Markdown Blockquotes @reox
* [#2059](https://github.com/nextcloud/deck/pull/2059) Fix fetching attachments on card change @juliushaertl * [#2059](https://github.com/nextcloud/deck/pull/2059) Fix fetching attachments on card change
* [#2060](https://github.com/nextcloud/deck/pull/2060) Use mixing for relative date in card sidebar @juliushaertl * [#2060](https://github.com/nextcloud/deck/pull/2060) Use mixing for relative date in card sidebar
## 1.0.3 - 2020-06-19 ## 1.0.3 - 2020-06-19
### Fixed ### Fixed
* [#2019](https://github.com/nextcloud/deck/pull/2019) Remove old global css rule @juliushaertl * [#2019](https://github.com/nextcloud/deck/pull/2019) Remove old global css rule
* [#2020](https://github.com/nextcloud/deck/pull/2020) Fix navigation issue with leftover nodes @juliushaertl * [#2020](https://github.com/nextcloud/deck/pull/2020) Fix navigation issue with leftover nodes
* [#2021](https://github.com/nextcloud/deck/pull/2021) Fix description issues @juliushaertl * [#2021](https://github.com/nextcloud/deck/pull/2021) Fix description issues
* [#2022](https://github.com/nextcloud/deck/pull/2022) Fix replyto issues with the comments API @juliushaertl * [#2022](https://github.com/nextcloud/deck/pull/2022) Fix replyto issues with the comments API
* [#2027](https://github.com/nextcloud/deck/pull/2027) Allow to unassign current user from card @juliushaertl * [#2027](https://github.com/nextcloud/deck/pull/2027) Allow to unassign current user from card
* [#2029](https://github.com/nextcloud/deck/pull/2029) Fix wording : stack -> list @cloud2018 * [#2029](https://github.com/nextcloud/deck/pull/2029) Fix wording : stack -> list @cloud2018
* [#2032](https://github.com/nextcloud/deck/pull/2032) Force order by id as second sorting key @juliushaertl * [#2032](https://github.com/nextcloud/deck/pull/2032) Force order by id as second sorting key
* [#2045](https://github.com/nextcloud/deck/pull/2045) Improve label styling @juliushaertl * [#2045](https://github.com/nextcloud/deck/pull/2045) Improve label styling
* [#2010](https://github.com/nextcloud/deck/pull/2010) User documentation fixes @Nyco * [#2010](https://github.com/nextcloud/deck/pull/2010) User documentation fixes @Nyco
* [#1998](https://github.com/nextcloud/deck/pull/1998) Add Checklist explaination to the doc @4rnoP * [#1998](https://github.com/nextcloud/deck/pull/1998) Add Checklist explaination to the doc @4rnoP
+1 -2
View File
@@ -25,8 +25,7 @@ Deck is a kanban style organization tool aimed at personal planning and project
- [trello-to-deck](https://github.com/maxammann/trello-to-deck) - Migrates cards from Trello - [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 ## Installation/Update
This app is supposed to work on the two latest Nextcloud versions. This app is supposed to work on the two latest Nextcloud versions.
+2 -2
View File
@@ -16,7 +16,7 @@
- 🚀 Get your project organized - 🚀 Get your project organized
</description> </description>
<version>1.6.7</version> <version>1.5.8</version>
<licence>agpl</licence> <licence>agpl</licence>
<author>Julius Härtl</author> <author>Julius Härtl</author>
<namespace>Deck</namespace> <namespace>Deck</namespace>
@@ -35,7 +35,7 @@
<database min-version="9.4">pgsql</database> <database min-version="9.4">pgsql</database>
<database>sqlite</database> <database>sqlite</database>
<database min-version="5.5">mysql</database> <database min-version="5.5">mysql</database>
<nextcloud min-version="23" max-version="23"/> <nextcloud min-version="22" max-version="22"/>
</dependencies> </dependencies>
<background-jobs> <background-jobs>
<job>OCA\Deck\Cron\DeleteCron</job> <job>OCA\Deck\Cron\DeleteCron</job>
+8 -12
View File
@@ -8,22 +8,24 @@
"email": "jus@bitgrid.net" "email": "jus@bitgrid.net"
} }
], ],
"config": {
"platform": {
"php": "7.3"
}
},
"require": { "require": {
"cogpowered/finediff": "0.3.*" "cogpowered/finediff": "0.3.*"
}, },
"require-dev": { "require-dev": {
"roave/security-advisories": "dev-master", "roave/security-advisories": "dev-master",
"christophwurst/nextcloud": "^22@dev",
"phpunit/phpunit": "^8", "phpunit/phpunit": "^8",
"nextcloud/coding-standard": "^0.5.0", "nextcloud/coding-standard": "^0.5.0",
"symfony/event-dispatcher": "^4.0", "symfony/event-dispatcher": "^4.0",
"vimeo/psalm": "^4.3", "vimeo/psalm": "^4.3",
"php-parallel-lint/php-parallel-lint": "^1.2", "php-parallel-lint/php-parallel-lint": "^1.2"
"nextcloud/ocp": "dev-stable23"
}, },
"config": { "config": {
"platform": {
"php": "7.3"
},
"optimize-autoloader": true, "optimize-autoloader": true,
"classmap-authoritative": true "classmap-authoritative": true
}, },
@@ -38,12 +40,6 @@
"@test:integration" "@test:integration"
], ],
"test:unit": "phpunit -c tests/phpunit.xml", "test:unit": "phpunit -c tests/phpunit.xml",
"test:integration": "phpunit -c tests/phpunit.integration.xml", "test:integration": "phpunit -c tests/phpunit.integration.xml && cd tests/integration && ./run.sh"
"test:api": "cd tests/integration && ./run.sh"
},
"autoload-dev": {
"psr-4": {
"OCP\\": "vendor/nextcloud/ocp/OCP"
}
} }
} }
Generated
+46 -49
View File
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "388de1616aef9f3496ad3432af301215", "content-hash": "a984e9e37aadc6504b0f9ddbd6604835",
"packages": [ "packages": [
{ {
"name": "cogpowered/finediff", "name": "cogpowered/finediff",
@@ -230,6 +230,49 @@
], ],
"time": "2021-03-30T17:13:30+00:00" "time": "2021-03-30T17:13:30+00:00"
}, },
{
"name": "christophwurst/nextcloud",
"version": "v22.1.1",
"source": {
"type": "git",
"url": "https://github.com/ChristophWurst/nextcloud_composer.git",
"reference": "8bb086cd016128b5ef8353662fd1852db3248d1e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/ChristophWurst/nextcloud_composer/zipball/8bb086cd016128b5ef8353662fd1852db3248d1e",
"reference": "8bb086cd016128b5ef8353662fd1852db3248d1e",
"shasum": ""
},
"require": {
"php": "^7.3 || ~8.0.0",
"psr/container": "^1.0",
"psr/event-dispatcher": "^1.0",
"psr/log": "^1.1"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "23.0.0-dev"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"AGPL-3.0-or-later"
],
"authors": [
{
"name": "Christoph Wurst",
"email": "christoph@winzerhof-wurst.at"
}
],
"description": "Composer package containing Nextcloud's public API (classes, interfaces)",
"support": {
"issues": "https://github.com/ChristophWurst/nextcloud_composer/issues",
"source": "https://github.com/ChristophWurst/nextcloud_composer/tree/v22.1.1"
},
"time": "2021-11-11T14:01:42+00:00"
},
{ {
"name": "composer/package-versions-deprecated", "name": "composer/package-versions-deprecated",
"version": "1.11.99.5", "version": "1.11.99.5",
@@ -1137,49 +1180,6 @@
}, },
"time": "2021-01-11T14:15:58+00:00" "time": "2021-01-11T14:15:58+00:00"
}, },
{
"name": "nextcloud/ocp",
"version": "dev-stable23",
"source": {
"type": "git",
"url": "https://github.com/nextcloud-deps/ocp.git",
"reference": "5b18c55569528d8190224af04095e9dde1953c72"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/nextcloud-deps/ocp/zipball/5b18c55569528d8190224af04095e9dde1953c72",
"reference": "5b18c55569528d8190224af04095e9dde1953c72",
"shasum": ""
},
"require": {
"php": "^7.3 || ~8.0.0",
"psr/container": "^1.1.1",
"psr/event-dispatcher": "^1.0",
"psr/log": "^1.1"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "23.0.0-dev"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"AGPL-3.0-or-later"
],
"authors": [
{
"name": "Christoph Wurst",
"email": "christoph@winzerhof-wurst.at"
}
],
"description": "Composer package containing Nextcloud's public API (classes, interfaces)",
"support": {
"issues": "https://github.com/nextcloud-deps/ocp/issues",
"source": "https://github.com/nextcloud-deps/ocp/tree/stable23"
},
"time": "2022-12-20T00:37:08+00:00"
},
{ {
"name": "nikic/php-parser", "name": "nikic/php-parser",
"version": "v4.13.2", "version": "v4.13.2",
@@ -5247,14 +5247,11 @@
"minimum-stability": "stable", "minimum-stability": "stable",
"stability-flags": { "stability-flags": {
"roave/security-advisories": 20, "roave/security-advisories": 20,
"nextcloud/ocp": 20 "christophwurst/nextcloud": 20
}, },
"prefer-stable": false, "prefer-stable": false,
"prefer-lowest": false, "prefer-lowest": false,
"platform": [], "platform": [],
"platform-dev": [], "platform-dev": [],
"platform-overrides": { "plugin-api-version": "2.2.0"
"php": "7.3"
},
"plugin-api-version": "2.3.0"
} }
-3
View File
@@ -183,10 +183,8 @@ OC.L10N.register(
"Failed to transfer the board to {user}" : "Неуспешно прехвърляне на таблото на {user}", "Failed to transfer the board to {user}" : "Неуспешно прехвърляне на таблото на {user}",
"Add a new list" : "Добавяне на нов списък", "Add a new list" : "Добавяне на нов списък",
"Archive all cards" : "Архивира всички карти", "Archive all cards" : "Архивира всички карти",
"Unarchive all cards" : "Разархивиране на всички карти",
"Delete list" : "Изтрива списък", "Delete list" : "Изтрива списък",
"Archive all cards in this list" : "Архивира всички карти в този списък", "Archive all cards in this list" : "Архивира всички карти в този списък",
"Unarchive all cards in this list" : "Разархивиране всички карти в този списък",
"Add a new card" : "Добави нова карта", "Add a new card" : "Добави нова карта",
"Card name" : "Име на карта", "Card name" : "Име на карта",
"List deleted" : "Списъкът е изтрит", "List deleted" : "Списъкът е изтрит",
@@ -262,7 +260,6 @@ OC.L10N.register(
"Shared with you" : "Споделени с вас", "Shared with you" : "Споделени с вас",
"Deck settings" : "Настройки на платформата", "Deck settings" : "Настройки на платформата",
"Use bigger card view" : "Използва по-голям изглед на картата", "Use bigger card view" : "Използва по-голям изглед на картата",
"Show card ID badge" : "Показване на обозначение за самоличност на картата",
"Show boards in calendar/tasks" : "Показване на таблата в календар / задачи", "Show boards in calendar/tasks" : "Показване на таблата в календар / задачи",
"Limit deck usage of groups" : "Ограничава използването на набора от групи", "Limit deck usage of groups" : "Ограничава използването на набора от групи",
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Ограничаването на приложението Deck/набор/ ще блокира потребителите, които не са част от тези групи, да създават свои собствени табла. Потребителите все още ще могат да работят на таблата, които са споделени с тях.", "Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Ограничаването на приложението Deck/набор/ ще блокира потребителите, които не са част от тези групи, да създават свои собствени табла. Потребителите все още ще могат да работят на таблата, които са споделени с тях.",
-3
View File
@@ -181,10 +181,8 @@
"Failed to transfer the board to {user}" : "Неуспешно прехвърляне на таблото на {user}", "Failed to transfer the board to {user}" : "Неуспешно прехвърляне на таблото на {user}",
"Add a new list" : "Добавяне на нов списък", "Add a new list" : "Добавяне на нов списък",
"Archive all cards" : "Архивира всички карти", "Archive all cards" : "Архивира всички карти",
"Unarchive all cards" : "Разархивиране на всички карти",
"Delete list" : "Изтрива списък", "Delete list" : "Изтрива списък",
"Archive all cards in this list" : "Архивира всички карти в този списък", "Archive all cards in this list" : "Архивира всички карти в този списък",
"Unarchive all cards in this list" : "Разархивиране всички карти в този списък",
"Add a new card" : "Добави нова карта", "Add a new card" : "Добави нова карта",
"Card name" : "Име на карта", "Card name" : "Име на карта",
"List deleted" : "Списъкът е изтрит", "List deleted" : "Списъкът е изтрит",
@@ -260,7 +258,6 @@
"Shared with you" : "Споделени с вас", "Shared with you" : "Споделени с вас",
"Deck settings" : "Настройки на платформата", "Deck settings" : "Настройки на платформата",
"Use bigger card view" : "Използва по-голям изглед на картата", "Use bigger card view" : "Използва по-голям изглед на картата",
"Show card ID badge" : "Показване на обозначение за самоличност на картата",
"Show boards in calendar/tasks" : "Показване на таблата в календар / задачи", "Show boards in calendar/tasks" : "Показване на таблата в календар / задачи",
"Limit deck usage of groups" : "Ограничава използването на набора от групи", "Limit deck usage of groups" : "Ограничава използването на набора от групи",
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Ограничаването на приложението Deck/набор/ ще блокира потребителите, които не са част от тези групи, да създават свои собствени табла. Потребителите все още ще могат да работят на таблата, които са споделени с тях.", "Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Ограничаването на приложението Deck/набор/ ще блокира потребителите, които не са част от тези групи, да създават свои собствени табла. Потребителите все още ще могат да работят на таблата, които са споделени с тях.",
+31 -34
View File
@@ -29,7 +29,7 @@ OC.L10N.register(
"{user} has deleted card {card} in list {stack} on board {board}" : "{user} ha suprimit la targeta {card} a la llista {stack} al tauler {board}", "{user} has deleted card {card} in list {stack} on board {board}" : "{user} ha suprimit la targeta {card} a la llista {stack} al tauler {board}",
"You have renamed the card {before} to {card}" : "Heu reanomenat la targeta {before} a {card}", "You have renamed the card {before} to {card}" : "Heu reanomenat la targeta {before} a {card}",
"{user} has renamed the card {before} to {card}" : "{user} ha reanomenat la targeta {before} a {card}", "{user} has renamed the card {before} to {card}" : "{user} ha reanomenat la targeta {before} a {card}",
"You have added a description to card {card} in list {stack} on board {board}" : "Heu afegit una descripció a la targeta {card} a la llista {stack} del tauler {board}", "You have added a description to card {card} in list {stack} on board {board}" : "Heu afegit una descripció a la targeta {card} a la llista {stack} al tauler {board}",
"{user} has added a description to card {card} in list {stack} on board {board}" : "{user} ha afegit una descripció a la targeta {card} a la llista {stack} al tauler {board}", "{user} has added a description to card {card} in list {stack} on board {board}" : "{user} ha afegit una descripció a la targeta {card} a la llista {stack} al tauler {board}",
"You have updated the description of card {card} in list {stack} on board {board}" : "Heu actualitzat la descripció de la targeta {card} a la llista {stack} al tauler {board}", "You have updated the description of card {card} in list {stack} on board {board}" : "Heu actualitzat la descripció de la targeta {card} a la llista {stack} al tauler {board}",
"{user} has updated the description of the card {card} in list {stack} on board {board}" : "{user} ha actualitzat la descripció de la targeta {card} a la llista {stack} al tauler {board}", "{user} has updated the description of the card {card} in list {stack} on board {board}" : "{user} ha actualitzat la descripció de la targeta {card} a la llista {stack} al tauler {board}",
@@ -37,12 +37,12 @@ OC.L10N.register(
"{user} has archived card {card} in list {stack} on board {board}" : "{user} té la targeta arxivada {card} a la llista {stack} al tauler {board}", "{user} has archived card {card} in list {stack} on board {board}" : "{user} té la targeta arxivada {card} a la llista {stack} al tauler {board}",
"You have unarchived card {card} in list {stack} on board {board}" : "Teniu una targeta no-arxchivada {card} a la llista {stack} al tauler {board}", "You have unarchived card {card} in list {stack} on board {board}" : "Teniu una targeta no-arxchivada {card} a la llista {stack} al tauler {board}",
"{user} has unarchived card {card} in list {stack} on board {board}" : "{user} té una targeta no-arxivada {card} a la llista {stack} al tauler {board}", "{user} has unarchived card {card} in list {stack} on board {board}" : "{user} té una targeta no-arxivada {card} a la llista {stack} al tauler {board}",
"You have removed the due date of card {card}" : "Heu suprimit la data de caducitat de la targeta {targeta}", "You have removed the due date of card {card}" : "Heu suprimit la data de venciment de la targeta {targeta}",
"{user} has removed the due date of card {card}" : "{user} ha suprimit la data de caducitat de la targeta {targeta}", "{user} has removed the due date of card {card}" : "{user} ha suprimit la data de venciment de la targeta {targeta}",
"You have set the due date of card {card} to {after}" : "Heu establert la data de caducitat de la targeta {card} a {after}", "You have set the due date of card {card} to {after}" : "Heu establert la data de venciment de la targeta {card} a {after}",
"{user} has set the due date of card {card} to {after}" : "{user} ha establert la data de caducitat de la targeta {card} a {after}", "{user} has set the due date of card {card} to {after}" : "{user} ha establert la data de venciment de la targeta {card} a {after}",
"You have updated the due date of card {card} to {after}" : "Heu actualitzat la data de caducitat de la targeta {card} a {after}", "You have updated the due date of card {card} to {after}" : "Heu actualitzat la data de venciment de la targeta {card} a {after}",
"{user} has updated the due date of card {card} to {after}" : "{user} ha actualitzat la data de caducitat de la targeta {card} a {after}", "{user} has updated the due date of card {card} to {after}" : "{user} ha actualitzat la data de venciment de la targeta {card} a {after}",
"You have added the tag {label} to card {card} in list {stack} on board {board}" : "Heu afegit l'etiqueta {label} a la targeta {card} a la llista {stack} al tauler {board}", "You have added the tag {label} to card {card} in list {stack} on board {board}" : "Heu afegit l'etiqueta {label} a la targeta {card} a la llista {stack} al tauler {board}",
"{user} has added the tag {label} to card {card} in list {stack} on board {board}" : "{user} ha afegit l'etiqueta {label} a la targeta {card} a la llista {stack} al tauler {board}", "{user} has added the tag {label} to card {card} in list {stack} on board {board}" : "{user} ha afegit l'etiqueta {label} a la targeta {card} a la llista {stack} al tauler {board}",
"You have removed the tag {label} from card {card} in list {stack} on board {board}" : "Heu eliminat l'etiqueta {label} de la targeta {card} a la llista {stack} al tauler {board}", "You have removed the tag {label} from card {card} in list {stack} on board {board}" : "Heu eliminat l'etiqueta {label} de la targeta {card} a la llista {stack} al tauler {board}",
@@ -66,13 +66,13 @@ OC.L10N.register(
"A <strong>card description</strong> inside the Deck app has been changed" : "S'ha canviat una <strong>descripció de targeta</strong> a l'aplicació Tauler", "A <strong>card description</strong> inside the Deck app has been changed" : "S'ha canviat una <strong>descripció de targeta</strong> a l'aplicació Tauler",
"Deck" : "Targetes", "Deck" : "Targetes",
"Changes in the <strong>Deck app</strong>" : "Canvis a l'<strong>aplicació Targetes</strong>", "Changes in the <strong>Deck app</strong>" : "Canvis a l'<strong>aplicació Targetes</strong>",
"A <strong>comment</strong> was created on a card" : "S'ha creat un <strong>comentari</strong> a una targeta", "A <strong>comment</strong> was created on a card" : "S'ha afegit un <strong>comentari</strong> a una targeta",
"Upcoming cards" : "Pròximes targetes", "Upcoming cards" : "Pròximes targetes",
"Load more" : "Carrega'n més", "Load more" : "Carrega'n més",
"Personal" : "Personal", "Personal" : "Personal",
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "La targeta \"%s\" sobre \"%s\" se us ha assignat per %s.", "The card \"%s\" on \"%s\" has been assigned to you by %s." : "La targeta \"%s\" sobre \"%s\" se us ha assignat per %s.",
"{user} has assigned the card {deck-card} on {deck-board} to you." : "{user} us ha assignat la targeta {deck-card} a {deck-board}.", "{user} has assigned the card {deck-card} on {deck-board} to you." : "{user} us ha assignat la targeta {deck-card} a {deck-board}.",
"The card \"%s\" on \"%s\" has reached its due date." : "La targeta \"%s\" sobre \"%s\" ha assolit la seva data de caducitat.", "The card \"%s\" on \"%s\" has reached its due date." : "La targeta \"%s\" sobre \"%s\" ha assolit la seva data de venciment.",
"The card {deck-card} on {deck-board} has reached its due date." : "La targeta {deck-card} a {deck-board} ha assolit la seva data de caducitat.", "The card {deck-card} on {deck-board} has reached its due date." : "La targeta {deck-card} a {deck-board} ha assolit la seva data de caducitat.",
"%s has mentioned you in a comment on \"%s\"." : "%s us ha anomenat en un comentari sobre \"%s\".", "%s has mentioned you in a comment on \"%s\"." : "%s us ha anomenat en un comentari sobre \"%s\".",
"{user} has mentioned you in a comment on {deck-card}." : "{user} us ha mencionat en un comentari a {deck-card}.", "{user} has mentioned you in a comment on {deck-card}." : "{user} us ha mencionat en un comentari a {deck-card}.",
@@ -88,7 +88,7 @@ OC.L10N.register(
"copy" : "còpia", "copy" : "còpia",
"To do" : "Pendent", "To do" : "Pendent",
"Doing" : "En procés", "Doing" : "En procés",
"Done" : "Fet", "Done" : "Finalitzat",
"Example Task 3" : "Tasca d'exemple 3", "Example Task 3" : "Tasca d'exemple 3",
"Example Task 2" : "Tasca d'exemple 2", "Example Task 2" : "Tasca d'exemple 2",
"Example Task 1" : "Tasca d'exemple 1", "Example Task 1" : "Tasca d'exemple 1",
@@ -99,7 +99,7 @@ OC.L10N.register(
"No file was uploaded" : "No s'ha pujat cap fitxer", "No file was uploaded" : "No s'ha pujat cap fitxer",
"Missing a temporary folder" : "Falta una carpeta temporal", "Missing a temporary folder" : "Falta una carpeta temporal",
"Could not write file to disk" : "No sha pogut escriure el fitxer al disc", "Could not write file to disk" : "No sha pogut escriure el fitxer al disc",
"A PHP extension stopped the file upload" : "Una extensió del PHP ha aturat la pujada del fitxer", "A PHP extension stopped the file upload" : "Una extensió del PHP ha aturat la carregada del fitxer",
"No file uploaded or file size exceeds maximum of %s" : "No s'ha carregat cap fitxer o la mida del fitxer sobrepassa el màxim de %s", "No file uploaded or file size exceeds maximum of %s" : "No s'ha carregat cap fitxer o la mida del fitxer sobrepassa el màxim de %s",
"This comment has more than %s characters.\nAdded as an attachment to the card with name %s.\nAccessible on URL: %s." : "Aquest comentari té més de %s caràcters.\nS'ha afegit com a fitxer adjunt a la targeta amb el nom %s.\nAccessible a l'URL: %s.", "This comment has more than %s characters.\nAdded as an attachment to the card with name %s.\nAccessible on URL: %s." : "Aquest comentari té més de %s caràcters.\nS'ha afegit com a fitxer adjunt a la targeta amb el nom %s.\nAccessible a l'URL: %s.",
"Card not found" : "No s'ha trobat la targeta", "Card not found" : "No s'ha trobat la targeta",
@@ -131,7 +131,7 @@ OC.L10N.register(
"Overwrite file" : "Sobreescriu el fitxer", "Overwrite file" : "Sobreescriu el fitxer",
"Keep existing file" : "Mantén el fitxer existent", "Keep existing file" : "Mantén el fitxer existent",
"This board is read only" : "Aquest tauler és només de lectura", "This board is read only" : "Aquest tauler és només de lectura",
"Drop your files to upload" : "Deixeu anar els fitxers per pujar-los", "Drop your files to upload" : "Deixeu anar els fitxers per penjar-los",
"Add card" : "Afegeix una targeta", "Add card" : "Afegeix una targeta",
"Archived cards" : "Targetes arxivades", "Archived cards" : "Targetes arxivades",
"Add list" : "Afegeix una llista", "Add list" : "Afegeix una llista",
@@ -174,38 +174,36 @@ OC.L10N.register(
"Can share" : "Pot compartir", "Can share" : "Pot compartir",
"Can manage" : "Pot gestionar", "Can manage" : "Pot gestionar",
"Owner" : "Propietari", "Owner" : "Propietari",
"Delete" : "Suprimeix", "Delete" : "Eliminar",
"Failed to create share with {displayName}" : "Ha fallat la creació de la compartició amb {displayName}", "Failed to create share with {displayName}" : "Ha fallat la creació de la compartició amb {displayName}",
"Are you sure you want to transfer the board {title} to {user}?" : "Esteu segur que voleu transferir el tauler {title} a {user}?", "Are you sure you want to transfer the board {title} to {user}?" : "Esteu segur que voleu transferir el tauler {title} a {user}?",
"Transfer the board." : "Transfereix el tauler.", "Transfer the board." : "Transfereix el tauler.",
"Transfer" : "Transferència", "Transfer" : "Transferència",
"The board has been transferred to {user}" : "El tauler s'ha transferit a {user}", "The board has been transferred to {user}" : "El tauler s'ha transferit a {user}",
"Failed to transfer the board to {user}" : "No s'ha pogut transferir el tauler a {user}", "Failed to transfer the board to {user}" : "No s'ha pogut transferir el tauler a {user}",
"Add a new list" : "Afegeix una llista nova", "Add a new list" : "Afegir una llista nova",
"Archive all cards" : "Arxiva totes les targetes", "Archive all cards" : "Arxiva totes les targetes",
"Unarchive all cards" : "Desarxivar totes les targetes",
"Delete list" : "Suprimeix la llista", "Delete list" : "Suprimeix la llista",
"Archive all cards in this list" : "Arxiva totes les targetes d'aquesta llista", "Archive all cards in this list" : "Arxiva totes les targetes d'aquesta llista",
"Unarchive all cards in this list" : "Desarxivar totes les targetes d'aquesta llista", "Add a new card" : "Afegir una nova targeta",
"Add a new card" : "Afegeix una nova targeta",
"Card name" : "Nom de la targeta", "Card name" : "Nom de la targeta",
"List deleted" : "Llista suprimida", "List deleted" : "Llista suprimida",
"Edit" : "Edició", "Edit" : "Edita",
"Add a new tag" : "Afegeix una etiqueta nova", "Add a new tag" : "Afegir una etiqueta nova",
"title and color value must be provided" : "sha de proporcionar el valor del títol i del color", "title and color value must be provided" : "sha de proporcionar el valor del títol i del color",
"Board name" : "Nom del taulell", "Board name" : "Nom del taulell",
"Members" : "Membres", "Members" : "Membres",
"Upload new files" : "Pujada de nous fitxers", "Upload new files" : "Puja nous fitxers",
"Share from Files" : "Comparteix des de Fitxers", "Share from Files" : "Comparteix des de Fitxers",
"Pending share" : "Compartició pendent", "Pending share" : "Compartició pendent",
"Add this attachment" : "Afegeix aquest adjunt", "Add this attachment" : "Afegeix aquest adjunt",
"Show in Files" : "Mostra a Fitxers", "Show in Files" : "Mostra a Fitxers",
"Download" : "Baixada", "Download" : "Baixa",
"Remove attachment" : "Treu l'adjunt", "Remove attachment" : "Treu l'adjunt",
"Delete Attachment" : "Suprimeix ladjunt", "Delete Attachment" : "Suprimeix ladjunt",
"Restore Attachment" : "Restaura l'adjunt", "Restore Attachment" : "Restaura l'adjunt",
"File to share" : "Fitxer a compartir", "File to share" : "Fitxer a compartir",
"Invalid path selected" : "S'ha seleccionat un camí no vàlid", "Invalid path selected" : "S'ha seleccionat una ruta invàlida",
"Open in sidebar view" : "Obre a la vista de la barra lateral", "Open in sidebar view" : "Obre a la vista de la barra lateral",
"Open in bigger view" : "Obre a la vista més gran", "Open in bigger view" : "Obre a la vista més gran",
"Attachments" : "Adjunts", "Attachments" : "Adjunts",
@@ -215,13 +213,13 @@ OC.L10N.register(
"The title cannot be empty." : "El títol no pot estar buit.", "The title cannot be empty." : "El títol no pot estar buit.",
"No comments yet. Begin the discussion!" : "No hi ha comentaris encara. Començar la discussió!", "No comments yet. Begin the discussion!" : "No hi ha comentaris encara. Començar la discussió!",
"Failed to load comments" : "No s'han pogut carregar els comentaris", "Failed to load comments" : "No s'han pogut carregar els comentaris",
"Assign a tag to this card…" : "Assignació d'una etiqueta a aquesta targeta…", "Assign a tag to this card…" : "Assigna una etiqueta a aquesta targeta…",
"Assign to users" : "Assignació als usuaris", "Assign to users" : "Assigna als usuaris",
"Assign to users/groups/circles" : "Assignació a usuaris/grups/cercles", "Assign to users/groups/circles" : "Assigna a usuaris/grups/cercles",
"Assign a user to this card…" : "Assignació d'un usuari a aquesta targeta…", "Assign a user to this card…" : "Assigneu un usuari a aquesta targeta…",
"Due date" : "Data de caducitat", "Due date" : "Per la data",
"Set a due date" : "Definir una data de caducitat", "Set a due date" : "Definir una data de venciment",
"Remove due date" : "Suprimeix la data de caducitat", "Remove due date" : "Elimina la data de venciment",
"Select Date" : "Selecciona la data", "Select Date" : "Selecciona la data",
"Today" : "Avui", "Today" : "Avui",
"Tomorrow" : "Demà", "Tomorrow" : "Demà",
@@ -238,15 +236,15 @@ OC.L10N.register(
"(Unsaved)" : "(No desat)", "(Unsaved)" : "(No desat)",
"(Saving…)" : "(Desant…)", "(Saving…)" : "(Desant…)",
"Formatting help" : "Format d'ajuda", "Formatting help" : "Format d'ajuda",
"Edit description" : "Edició descripció", "Edit description" : "Edita descripció",
"View description" : "Veure descripció", "View description" : "Veure descripció",
"Add Attachment" : "Afegeix un adjunt", "Add Attachment" : "Afegeix un adjunt",
"Write a description …" : "Escriviu una descripció …", "Write a description …" : "Escriviu una descripció …",
"Choose attachment" : "Triar adjunt", "Choose attachment" : "Triar adjunt",
"(group)" : "(grup)", "(group)" : "(grup)",
"Todo items" : "Tasques pendents", "Todo items" : "Elements pendents",
"{count} comments, {unread} unread" : "{count} comentaris, {unread} no llegits", "{count} comments, {unread} unread" : "{count} comentaris, {unread} no llegits",
"Edit card title" : "Edició del títol de la targeta", "Edit card title" : "Edita el títol de la targeta",
"Assign to me" : "Assigna'm a mi", "Assign to me" : "Assigna'm a mi",
"Unassign myself" : "Desasignar a mi mateix", "Unassign myself" : "Desasignar a mi mateix",
"Move card" : "Mou la targeta", "Move card" : "Mou la targeta",
@@ -260,9 +258,8 @@ OC.L10N.register(
"All boards" : "Tots els taulers", "All boards" : "Tots els taulers",
"Archived boards" : "Taulers arxivats", "Archived boards" : "Taulers arxivats",
"Shared with you" : "Us han compartit", "Shared with you" : "Us han compartit",
"Deck settings" : "Paràmetres del Tauler", "Deck settings" : "Configuració del Tauler",
"Use bigger card view" : "Utilitza la visualització de targetes més gran", "Use bigger card view" : "Utilitza la visualització de targetes més gran",
"Show card ID badge" : "Mostra el distintiu dID de la targeta",
"Show boards in calendar/tasks" : "Mostra els taulers al calendari/tasques", "Show boards in calendar/tasks" : "Mostra els taulers al calendari/tasques",
"Limit deck usage of groups" : "Limitar l'ús del tauler de grups", "Limit deck usage of groups" : "Limitar l'ús del tauler de grups",
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Limitant el Tauler bloquejarà la creació de taulers als usuaris que no són part d'aquests grups. Els usuaris podran seguir treballant en els taulers que hagin estat compartits amb ells.", "Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Limitant el Tauler bloquejarà la creació de taulers als usuaris que no són part d'aquests grups. Els usuaris podran seguir treballant en els taulers que hagin estat compartits amb ells.",
+31 -34
View File
@@ -27,7 +27,7 @@
"{user} has deleted card {card} in list {stack} on board {board}" : "{user} ha suprimit la targeta {card} a la llista {stack} al tauler {board}", "{user} has deleted card {card} in list {stack} on board {board}" : "{user} ha suprimit la targeta {card} a la llista {stack} al tauler {board}",
"You have renamed the card {before} to {card}" : "Heu reanomenat la targeta {before} a {card}", "You have renamed the card {before} to {card}" : "Heu reanomenat la targeta {before} a {card}",
"{user} has renamed the card {before} to {card}" : "{user} ha reanomenat la targeta {before} a {card}", "{user} has renamed the card {before} to {card}" : "{user} ha reanomenat la targeta {before} a {card}",
"You have added a description to card {card} in list {stack} on board {board}" : "Heu afegit una descripció a la targeta {card} a la llista {stack} del tauler {board}", "You have added a description to card {card} in list {stack} on board {board}" : "Heu afegit una descripció a la targeta {card} a la llista {stack} al tauler {board}",
"{user} has added a description to card {card} in list {stack} on board {board}" : "{user} ha afegit una descripció a la targeta {card} a la llista {stack} al tauler {board}", "{user} has added a description to card {card} in list {stack} on board {board}" : "{user} ha afegit una descripció a la targeta {card} a la llista {stack} al tauler {board}",
"You have updated the description of card {card} in list {stack} on board {board}" : "Heu actualitzat la descripció de la targeta {card} a la llista {stack} al tauler {board}", "You have updated the description of card {card} in list {stack} on board {board}" : "Heu actualitzat la descripció de la targeta {card} a la llista {stack} al tauler {board}",
"{user} has updated the description of the card {card} in list {stack} on board {board}" : "{user} ha actualitzat la descripció de la targeta {card} a la llista {stack} al tauler {board}", "{user} has updated the description of the card {card} in list {stack} on board {board}" : "{user} ha actualitzat la descripció de la targeta {card} a la llista {stack} al tauler {board}",
@@ -35,12 +35,12 @@
"{user} has archived card {card} in list {stack} on board {board}" : "{user} té la targeta arxivada {card} a la llista {stack} al tauler {board}", "{user} has archived card {card} in list {stack} on board {board}" : "{user} té la targeta arxivada {card} a la llista {stack} al tauler {board}",
"You have unarchived card {card} in list {stack} on board {board}" : "Teniu una targeta no-arxchivada {card} a la llista {stack} al tauler {board}", "You have unarchived card {card} in list {stack} on board {board}" : "Teniu una targeta no-arxchivada {card} a la llista {stack} al tauler {board}",
"{user} has unarchived card {card} in list {stack} on board {board}" : "{user} té una targeta no-arxivada {card} a la llista {stack} al tauler {board}", "{user} has unarchived card {card} in list {stack} on board {board}" : "{user} té una targeta no-arxivada {card} a la llista {stack} al tauler {board}",
"You have removed the due date of card {card}" : "Heu suprimit la data de caducitat de la targeta {targeta}", "You have removed the due date of card {card}" : "Heu suprimit la data de venciment de la targeta {targeta}",
"{user} has removed the due date of card {card}" : "{user} ha suprimit la data de caducitat de la targeta {targeta}", "{user} has removed the due date of card {card}" : "{user} ha suprimit la data de venciment de la targeta {targeta}",
"You have set the due date of card {card} to {after}" : "Heu establert la data de caducitat de la targeta {card} a {after}", "You have set the due date of card {card} to {after}" : "Heu establert la data de venciment de la targeta {card} a {after}",
"{user} has set the due date of card {card} to {after}" : "{user} ha establert la data de caducitat de la targeta {card} a {after}", "{user} has set the due date of card {card} to {after}" : "{user} ha establert la data de venciment de la targeta {card} a {after}",
"You have updated the due date of card {card} to {after}" : "Heu actualitzat la data de caducitat de la targeta {card} a {after}", "You have updated the due date of card {card} to {after}" : "Heu actualitzat la data de venciment de la targeta {card} a {after}",
"{user} has updated the due date of card {card} to {after}" : "{user} ha actualitzat la data de caducitat de la targeta {card} a {after}", "{user} has updated the due date of card {card} to {after}" : "{user} ha actualitzat la data de venciment de la targeta {card} a {after}",
"You have added the tag {label} to card {card} in list {stack} on board {board}" : "Heu afegit l'etiqueta {label} a la targeta {card} a la llista {stack} al tauler {board}", "You have added the tag {label} to card {card} in list {stack} on board {board}" : "Heu afegit l'etiqueta {label} a la targeta {card} a la llista {stack} al tauler {board}",
"{user} has added the tag {label} to card {card} in list {stack} on board {board}" : "{user} ha afegit l'etiqueta {label} a la targeta {card} a la llista {stack} al tauler {board}", "{user} has added the tag {label} to card {card} in list {stack} on board {board}" : "{user} ha afegit l'etiqueta {label} a la targeta {card} a la llista {stack} al tauler {board}",
"You have removed the tag {label} from card {card} in list {stack} on board {board}" : "Heu eliminat l'etiqueta {label} de la targeta {card} a la llista {stack} al tauler {board}", "You have removed the tag {label} from card {card} in list {stack} on board {board}" : "Heu eliminat l'etiqueta {label} de la targeta {card} a la llista {stack} al tauler {board}",
@@ -64,13 +64,13 @@
"A <strong>card description</strong> inside the Deck app has been changed" : "S'ha canviat una <strong>descripció de targeta</strong> a l'aplicació Tauler", "A <strong>card description</strong> inside the Deck app has been changed" : "S'ha canviat una <strong>descripció de targeta</strong> a l'aplicació Tauler",
"Deck" : "Targetes", "Deck" : "Targetes",
"Changes in the <strong>Deck app</strong>" : "Canvis a l'<strong>aplicació Targetes</strong>", "Changes in the <strong>Deck app</strong>" : "Canvis a l'<strong>aplicació Targetes</strong>",
"A <strong>comment</strong> was created on a card" : "S'ha creat un <strong>comentari</strong> a una targeta", "A <strong>comment</strong> was created on a card" : "S'ha afegit un <strong>comentari</strong> a una targeta",
"Upcoming cards" : "Pròximes targetes", "Upcoming cards" : "Pròximes targetes",
"Load more" : "Carrega'n més", "Load more" : "Carrega'n més",
"Personal" : "Personal", "Personal" : "Personal",
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "La targeta \"%s\" sobre \"%s\" se us ha assignat per %s.", "The card \"%s\" on \"%s\" has been assigned to you by %s." : "La targeta \"%s\" sobre \"%s\" se us ha assignat per %s.",
"{user} has assigned the card {deck-card} on {deck-board} to you." : "{user} us ha assignat la targeta {deck-card} a {deck-board}.", "{user} has assigned the card {deck-card} on {deck-board} to you." : "{user} us ha assignat la targeta {deck-card} a {deck-board}.",
"The card \"%s\" on \"%s\" has reached its due date." : "La targeta \"%s\" sobre \"%s\" ha assolit la seva data de caducitat.", "The card \"%s\" on \"%s\" has reached its due date." : "La targeta \"%s\" sobre \"%s\" ha assolit la seva data de venciment.",
"The card {deck-card} on {deck-board} has reached its due date." : "La targeta {deck-card} a {deck-board} ha assolit la seva data de caducitat.", "The card {deck-card} on {deck-board} has reached its due date." : "La targeta {deck-card} a {deck-board} ha assolit la seva data de caducitat.",
"%s has mentioned you in a comment on \"%s\"." : "%s us ha anomenat en un comentari sobre \"%s\".", "%s has mentioned you in a comment on \"%s\"." : "%s us ha anomenat en un comentari sobre \"%s\".",
"{user} has mentioned you in a comment on {deck-card}." : "{user} us ha mencionat en un comentari a {deck-card}.", "{user} has mentioned you in a comment on {deck-card}." : "{user} us ha mencionat en un comentari a {deck-card}.",
@@ -86,7 +86,7 @@
"copy" : "còpia", "copy" : "còpia",
"To do" : "Pendent", "To do" : "Pendent",
"Doing" : "En procés", "Doing" : "En procés",
"Done" : "Fet", "Done" : "Finalitzat",
"Example Task 3" : "Tasca d'exemple 3", "Example Task 3" : "Tasca d'exemple 3",
"Example Task 2" : "Tasca d'exemple 2", "Example Task 2" : "Tasca d'exemple 2",
"Example Task 1" : "Tasca d'exemple 1", "Example Task 1" : "Tasca d'exemple 1",
@@ -97,7 +97,7 @@
"No file was uploaded" : "No s'ha pujat cap fitxer", "No file was uploaded" : "No s'ha pujat cap fitxer",
"Missing a temporary folder" : "Falta una carpeta temporal", "Missing a temporary folder" : "Falta una carpeta temporal",
"Could not write file to disk" : "No sha pogut escriure el fitxer al disc", "Could not write file to disk" : "No sha pogut escriure el fitxer al disc",
"A PHP extension stopped the file upload" : "Una extensió del PHP ha aturat la pujada del fitxer", "A PHP extension stopped the file upload" : "Una extensió del PHP ha aturat la carregada del fitxer",
"No file uploaded or file size exceeds maximum of %s" : "No s'ha carregat cap fitxer o la mida del fitxer sobrepassa el màxim de %s", "No file uploaded or file size exceeds maximum of %s" : "No s'ha carregat cap fitxer o la mida del fitxer sobrepassa el màxim de %s",
"This comment has more than %s characters.\nAdded as an attachment to the card with name %s.\nAccessible on URL: %s." : "Aquest comentari té més de %s caràcters.\nS'ha afegit com a fitxer adjunt a la targeta amb el nom %s.\nAccessible a l'URL: %s.", "This comment has more than %s characters.\nAdded as an attachment to the card with name %s.\nAccessible on URL: %s." : "Aquest comentari té més de %s caràcters.\nS'ha afegit com a fitxer adjunt a la targeta amb el nom %s.\nAccessible a l'URL: %s.",
"Card not found" : "No s'ha trobat la targeta", "Card not found" : "No s'ha trobat la targeta",
@@ -129,7 +129,7 @@
"Overwrite file" : "Sobreescriu el fitxer", "Overwrite file" : "Sobreescriu el fitxer",
"Keep existing file" : "Mantén el fitxer existent", "Keep existing file" : "Mantén el fitxer existent",
"This board is read only" : "Aquest tauler és només de lectura", "This board is read only" : "Aquest tauler és només de lectura",
"Drop your files to upload" : "Deixeu anar els fitxers per pujar-los", "Drop your files to upload" : "Deixeu anar els fitxers per penjar-los",
"Add card" : "Afegeix una targeta", "Add card" : "Afegeix una targeta",
"Archived cards" : "Targetes arxivades", "Archived cards" : "Targetes arxivades",
"Add list" : "Afegeix una llista", "Add list" : "Afegeix una llista",
@@ -172,38 +172,36 @@
"Can share" : "Pot compartir", "Can share" : "Pot compartir",
"Can manage" : "Pot gestionar", "Can manage" : "Pot gestionar",
"Owner" : "Propietari", "Owner" : "Propietari",
"Delete" : "Suprimeix", "Delete" : "Eliminar",
"Failed to create share with {displayName}" : "Ha fallat la creació de la compartició amb {displayName}", "Failed to create share with {displayName}" : "Ha fallat la creació de la compartició amb {displayName}",
"Are you sure you want to transfer the board {title} to {user}?" : "Esteu segur que voleu transferir el tauler {title} a {user}?", "Are you sure you want to transfer the board {title} to {user}?" : "Esteu segur que voleu transferir el tauler {title} a {user}?",
"Transfer the board." : "Transfereix el tauler.", "Transfer the board." : "Transfereix el tauler.",
"Transfer" : "Transferència", "Transfer" : "Transferència",
"The board has been transferred to {user}" : "El tauler s'ha transferit a {user}", "The board has been transferred to {user}" : "El tauler s'ha transferit a {user}",
"Failed to transfer the board to {user}" : "No s'ha pogut transferir el tauler a {user}", "Failed to transfer the board to {user}" : "No s'ha pogut transferir el tauler a {user}",
"Add a new list" : "Afegeix una llista nova", "Add a new list" : "Afegir una llista nova",
"Archive all cards" : "Arxiva totes les targetes", "Archive all cards" : "Arxiva totes les targetes",
"Unarchive all cards" : "Desarxivar totes les targetes",
"Delete list" : "Suprimeix la llista", "Delete list" : "Suprimeix la llista",
"Archive all cards in this list" : "Arxiva totes les targetes d'aquesta llista", "Archive all cards in this list" : "Arxiva totes les targetes d'aquesta llista",
"Unarchive all cards in this list" : "Desarxivar totes les targetes d'aquesta llista", "Add a new card" : "Afegir una nova targeta",
"Add a new card" : "Afegeix una nova targeta",
"Card name" : "Nom de la targeta", "Card name" : "Nom de la targeta",
"List deleted" : "Llista suprimida", "List deleted" : "Llista suprimida",
"Edit" : "Edició", "Edit" : "Edita",
"Add a new tag" : "Afegeix una etiqueta nova", "Add a new tag" : "Afegir una etiqueta nova",
"title and color value must be provided" : "sha de proporcionar el valor del títol i del color", "title and color value must be provided" : "sha de proporcionar el valor del títol i del color",
"Board name" : "Nom del taulell", "Board name" : "Nom del taulell",
"Members" : "Membres", "Members" : "Membres",
"Upload new files" : "Pujada de nous fitxers", "Upload new files" : "Puja nous fitxers",
"Share from Files" : "Comparteix des de Fitxers", "Share from Files" : "Comparteix des de Fitxers",
"Pending share" : "Compartició pendent", "Pending share" : "Compartició pendent",
"Add this attachment" : "Afegeix aquest adjunt", "Add this attachment" : "Afegeix aquest adjunt",
"Show in Files" : "Mostra a Fitxers", "Show in Files" : "Mostra a Fitxers",
"Download" : "Baixada", "Download" : "Baixa",
"Remove attachment" : "Treu l'adjunt", "Remove attachment" : "Treu l'adjunt",
"Delete Attachment" : "Suprimeix ladjunt", "Delete Attachment" : "Suprimeix ladjunt",
"Restore Attachment" : "Restaura l'adjunt", "Restore Attachment" : "Restaura l'adjunt",
"File to share" : "Fitxer a compartir", "File to share" : "Fitxer a compartir",
"Invalid path selected" : "S'ha seleccionat un camí no vàlid", "Invalid path selected" : "S'ha seleccionat una ruta invàlida",
"Open in sidebar view" : "Obre a la vista de la barra lateral", "Open in sidebar view" : "Obre a la vista de la barra lateral",
"Open in bigger view" : "Obre a la vista més gran", "Open in bigger view" : "Obre a la vista més gran",
"Attachments" : "Adjunts", "Attachments" : "Adjunts",
@@ -213,13 +211,13 @@
"The title cannot be empty." : "El títol no pot estar buit.", "The title cannot be empty." : "El títol no pot estar buit.",
"No comments yet. Begin the discussion!" : "No hi ha comentaris encara. Començar la discussió!", "No comments yet. Begin the discussion!" : "No hi ha comentaris encara. Començar la discussió!",
"Failed to load comments" : "No s'han pogut carregar els comentaris", "Failed to load comments" : "No s'han pogut carregar els comentaris",
"Assign a tag to this card…" : "Assignació d'una etiqueta a aquesta targeta…", "Assign a tag to this card…" : "Assigna una etiqueta a aquesta targeta…",
"Assign to users" : "Assignació als usuaris", "Assign to users" : "Assigna als usuaris",
"Assign to users/groups/circles" : "Assignació a usuaris/grups/cercles", "Assign to users/groups/circles" : "Assigna a usuaris/grups/cercles",
"Assign a user to this card…" : "Assignació d'un usuari a aquesta targeta…", "Assign a user to this card…" : "Assigneu un usuari a aquesta targeta…",
"Due date" : "Data de caducitat", "Due date" : "Per la data",
"Set a due date" : "Definir una data de caducitat", "Set a due date" : "Definir una data de venciment",
"Remove due date" : "Suprimeix la data de caducitat", "Remove due date" : "Elimina la data de venciment",
"Select Date" : "Selecciona la data", "Select Date" : "Selecciona la data",
"Today" : "Avui", "Today" : "Avui",
"Tomorrow" : "Demà", "Tomorrow" : "Demà",
@@ -236,15 +234,15 @@
"(Unsaved)" : "(No desat)", "(Unsaved)" : "(No desat)",
"(Saving…)" : "(Desant…)", "(Saving…)" : "(Desant…)",
"Formatting help" : "Format d'ajuda", "Formatting help" : "Format d'ajuda",
"Edit description" : "Edició descripció", "Edit description" : "Edita descripció",
"View description" : "Veure descripció", "View description" : "Veure descripció",
"Add Attachment" : "Afegeix un adjunt", "Add Attachment" : "Afegeix un adjunt",
"Write a description …" : "Escriviu una descripció …", "Write a description …" : "Escriviu una descripció …",
"Choose attachment" : "Triar adjunt", "Choose attachment" : "Triar adjunt",
"(group)" : "(grup)", "(group)" : "(grup)",
"Todo items" : "Tasques pendents", "Todo items" : "Elements pendents",
"{count} comments, {unread} unread" : "{count} comentaris, {unread} no llegits", "{count} comments, {unread} unread" : "{count} comentaris, {unread} no llegits",
"Edit card title" : "Edició del títol de la targeta", "Edit card title" : "Edita el títol de la targeta",
"Assign to me" : "Assigna'm a mi", "Assign to me" : "Assigna'm a mi",
"Unassign myself" : "Desasignar a mi mateix", "Unassign myself" : "Desasignar a mi mateix",
"Move card" : "Mou la targeta", "Move card" : "Mou la targeta",
@@ -258,9 +256,8 @@
"All boards" : "Tots els taulers", "All boards" : "Tots els taulers",
"Archived boards" : "Taulers arxivats", "Archived boards" : "Taulers arxivats",
"Shared with you" : "Us han compartit", "Shared with you" : "Us han compartit",
"Deck settings" : "Paràmetres del Tauler", "Deck settings" : "Configuració del Tauler",
"Use bigger card view" : "Utilitza la visualització de targetes més gran", "Use bigger card view" : "Utilitza la visualització de targetes més gran",
"Show card ID badge" : "Mostra el distintiu dID de la targeta",
"Show boards in calendar/tasks" : "Mostra els taulers al calendari/tasques", "Show boards in calendar/tasks" : "Mostra els taulers al calendari/tasques",
"Limit deck usage of groups" : "Limitar l'ús del tauler de grups", "Limit deck usage of groups" : "Limitar l'ús del tauler de grups",
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Limitant el Tauler bloquejarà la creació de taulers als usuaris que no són part d'aquests grups. Els usuaris podran seguir treballant en els taulers que hagin estat compartits amb ells.", "Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Limitant el Tauler bloquejarà la creació de taulers als usuaris que no són part d'aquests grups. Els usuaris podran seguir treballant en els taulers que hagin estat compartits amb ells.",
-1
View File
@@ -37,7 +37,6 @@ OC.L10N.register(
"The card \"%s\" on \"%s\" has reached its due date." : "Kortet \"%s\" på \"%s\" har nået sin forfaldsdato.", "The card \"%s\" on \"%s\" has reached its due date." : "Kortet \"%s\" på \"%s\" har nået sin forfaldsdato.",
"%s has mentioned you in a comment on \"%s\"." : " %s har nævnt dig i en kommentar på \"%s\".", "%s has mentioned you in a comment on \"%s\"." : " %s har nævnt dig i en kommentar på \"%s\".",
"The board \"%s\" has been shared with you by %s." : "Tavlen \"%s\" er blevet delt med dig af %s.", "The board \"%s\" has been shared with you by %s." : "Tavlen \"%s\" er blevet delt med dig af %s.",
"%s on %s" : "%s på %s",
"No data was provided to create an attachment." : "Ingen data blev givet som kunne vedhæftes", "No data was provided to create an attachment." : "Ingen data blev givet som kunne vedhæftes",
"Finished" : "Færdiggjort", "Finished" : "Færdiggjort",
"To review" : "Til gennemgang", "To review" : "Til gennemgang",
-1
View File
@@ -35,7 +35,6 @@
"The card \"%s\" on \"%s\" has reached its due date." : "Kortet \"%s\" på \"%s\" har nået sin forfaldsdato.", "The card \"%s\" on \"%s\" has reached its due date." : "Kortet \"%s\" på \"%s\" har nået sin forfaldsdato.",
"%s has mentioned you in a comment on \"%s\"." : " %s har nævnt dig i en kommentar på \"%s\".", "%s has mentioned you in a comment on \"%s\"." : " %s har nævnt dig i en kommentar på \"%s\".",
"The board \"%s\" has been shared with you by %s." : "Tavlen \"%s\" er blevet delt med dig af %s.", "The board \"%s\" has been shared with you by %s." : "Tavlen \"%s\" er blevet delt med dig af %s.",
"%s on %s" : "%s på %s",
"No data was provided to create an attachment." : "Ingen data blev givet som kunne vedhæftes", "No data was provided to create an attachment." : "Ingen data blev givet som kunne vedhæftes",
"Finished" : "Færdiggjort", "Finished" : "Færdiggjort",
"To review" : "Til gennemgang", "To review" : "Til gennemgang",
+1 -1
View File
@@ -245,7 +245,7 @@ OC.L10N.register(
"Archive card" : "Αρχειοθέτηση καρτέλας", "Archive card" : "Αρχειοθέτηση καρτέλας",
"Delete card" : "Διαγραφή καρτέλας", "Delete card" : "Διαγραφή καρτέλας",
"Move card to another board" : "Μετακίνηση καρτέλας σε άλλο πίνακα", "Move card to another board" : "Μετακίνηση καρτέλας σε άλλο πίνακα",
"List is empty" : "Η λίστα είναι κενή", "List is empty" : "Η λίστα είναι άδεια.",
"Card deleted" : "Η καρτέλα διαγράφηκε", "Card deleted" : "Η καρτέλα διαγράφηκε",
"seconds ago" : " δευτερόλεπτα πριν ", "seconds ago" : " δευτερόλεπτα πριν ",
"All boards" : "Όλοι οι πίνακες", "All boards" : "Όλοι οι πίνακες",
+1 -1
View File
@@ -243,7 +243,7 @@
"Archive card" : "Αρχειοθέτηση καρτέλας", "Archive card" : "Αρχειοθέτηση καρτέλας",
"Delete card" : "Διαγραφή καρτέλας", "Delete card" : "Διαγραφή καρτέλας",
"Move card to another board" : "Μετακίνηση καρτέλας σε άλλο πίνακα", "Move card to another board" : "Μετακίνηση καρτέλας σε άλλο πίνακα",
"List is empty" : "Η λίστα είναι κενή", "List is empty" : "Η λίστα είναι άδεια.",
"Card deleted" : "Η καρτέλα διαγράφηκε", "Card deleted" : "Η καρτέλα διαγράφηκε",
"seconds ago" : " δευτερόλεπτα πριν ", "seconds ago" : " δευτερόλεπτα πριν ",
"All boards" : "Όλοι οι πίνακες", "All boards" : "Όλοι οι πίνακες",
+1 -236
View File
@@ -1,97 +1,17 @@
OC.L10N.register( OC.L10N.register(
"deck", "deck",
{ {
"You have created a new board {board}" : "You have created a new board {board}",
"{user} has created a new board {board}" : "{user} has created a new board {board}",
"You have deleted the board {board}" : "You have deleted the board {board}",
"{user} has deleted the board {board}" : "{user} has deleted the board {board}",
"You have restored the board {board}" : "You have restored the board {board}",
"{user} has restored the board {board}" : "{user} has restored the board {board}",
"You have shared the board {board} with {acl}" : "You have shared the board {board} with {acl}",
"{user} has shared the board {board} with {acl}" : "{user} has shared the board {board} with {acl}",
"You have removed {acl} from the board {board}" : "You have removed {acl} from the board {board}",
"{user} has removed {acl} from the board {board}" : "{user} has removed {acl} from the board {board}",
"You have renamed the board {before} to {board}" : "You have renamed the board {before} to {board}",
"{user} has renamed the board {before} to {board}" : "{user} has renamed the board {before} to {board}",
"You have archived the board {board}" : "You have archived the board {board}",
"{user} has archived the board {before}" : "{user} has archived the board {before}",
"You have unarchived the board {board}" : "You have unarchived the board {board}",
"{user} has unarchived the board {before}" : "{user} has unarchived the board {before}",
"You have created a new list {stack} on board {board}" : "You have created a new list {stack} on board {board}",
"{user} has created a new list {stack} on board {board}" : "{user} has created a new list {stack} on board {board}",
"You have renamed list {before} to {stack} on board {board}" : "You have renamed list {before} to {stack} on board {board}",
"{user} has renamed list {before} to {stack} on board {board}" : "{user} has renamed list {before} to {stack} on board {board}",
"You have deleted list {stack} on board {board}" : "You have deleted list {stack} on board {board}",
"{user} has deleted list {stack} on board {board}" : "{user} has deleted list {stack} on board {board}",
"You have created card {card} in list {stack} on board {board}" : "You have created card {card} in list {stack} on board {board}",
"{user} has created card {card} in list {stack} on board {board}" : "{user} has created card {card} in list {stack} on board {board}",
"You have deleted card {card} in list {stack} on board {board}" : "You have deleted card {card} in list {stack} on board {board}",
"{user} has deleted card {card} in list {stack} on board {board}" : "{user} has deleted card {card} in list {stack} on board {board}",
"You have renamed the card {before} to {card}" : "You have renamed the card {before} to {card}",
"{user} has renamed the card {before} to {card}" : "{user} has renamed the card {before} to {card}",
"You have added a description to card {card} in list {stack} on board {board}" : "You have added a description to card {card} in list {stack} on board {board}",
"{user} has added a description to card {card} in list {stack} on board {board}" : "{user} has added a description to card {card} in list {stack} on board {board}",
"You have updated the description of card {card} in list {stack} on board {board}" : "You have updated the description of card {card} in list {stack} on board {board}",
"{user} has updated the description of the card {card} in list {stack} on board {board}" : "{user} has updated the description of the card {card} in list {stack} on board {board}",
"You have archived card {card} in list {stack} on board {board}" : "You have archived card {card} in list {stack} on board {board}",
"{user} has archived card {card} in list {stack} on board {board}" : "{user} has archived card {card} in list {stack} on board {board}",
"You have unarchived card {card} in list {stack} on board {board}" : "You have unarchived card {card} in list {stack} on board {board}",
"{user} has unarchived card {card} in list {stack} on board {board}" : "{user} has unarchived card {card} in list {stack} on board {board}",
"You have removed the due date of card {card}" : "You have removed the due date of card {card}",
"{user} has removed the due date of card {card}" : "{user} has removed the due date of card {card}",
"You have set the due date of card {card} to {after}" : "You have set the due date of card {card} to {after}",
"{user} has set the due date of card {card} to {after}" : "{user} has set the due date of card {card} to {after}",
"You have updated the due date of card {card} to {after}" : "You have updated the due date of card {card} to {after}",
"{user} has updated the due date of card {card} to {after}" : "{user} has updated the due date of card {card} to {after}",
"You have added the tag {label} to card {card} in list {stack} on board {board}" : "You have added the tag {label} to card {card} in list {stack} on board {board}",
"{user} has added the tag {label} to card {card} in list {stack} on board {board}" : "{user} has added the tag {label} to card {card} in list {stack} on board {board}",
"You have removed the tag {label} from card {card} in list {stack} on board {board}" : "You have removed the tag {label} from card {card} in list {stack} on board {board}",
"{user} has removed the tag {label} from card {card} in list {stack} on board {board}" : "{user} has removed the tag {label} from card {card} in list {stack} on board {board}",
"You have assigned {assigneduser} to card {card} on board {board}" : "You have assigned {assigneduser} to card {card} on board {board}",
"{user} has assigned {assigneduser} to card {card} on board {board}" : "{user} has assigned {assigneduser} to card {card} on board {board}",
"You have unassigned {assigneduser} from card {card} on board {board}" : "You have unassigned {assigneduser} from card {card} on board {board}",
"{user} has unassigned {assigneduser} from card {card} on board {board}" : "{user} has unassigned {assigneduser} from card {card} on board {board}",
"You have moved the card {card} from list {stackBefore} to {stack}" : "You have moved the card {card} from list {stackBefore} to {stack}",
"{user} has moved the card {card} from list {stackBefore} to {stack}" : "{user} has moved the card {card} from list {stackBefore} to {stack}",
"You have added the attachment {attachment} to card {card}" : "You have added the attachment {attachment} to card {card}",
"{user} has added the attachment {attachment} to card {card}" : "{user} has added the attachment {attachment} to card {card}",
"You have updated the attachment {attachment} on card {card}" : "You have updated the attachment {attachment} on card {card}",
"{user} has updated the attachment {attachment} on card {card}" : "{user} has updated the attachment {attachment} on card {card}",
"You have deleted the attachment {attachment} from card {card}" : "You have deleted the attachment {attachment} from card {card}",
"{user} has deleted the attachment {attachment} from card {card}" : "{user} has deleted the attachment {attachment} from card {card}",
"You have restored the attachment {attachment} to card {card}" : "You have restored the attachment {attachment} to card {card}",
"{user} has restored the attachment {attachment} to card {card}" : "{user} has restored the attachment {attachment} to card {card}",
"You have commented on card {card}" : "You have commented on card {card}",
"{user} has commented on card {card}" : "{user} has commented on card {card}",
"A <strong>card description</strong> inside the Deck app has been changed" : "A <strong>card description</strong> inside the Deck app has been changed",
"Deck" : "Deck", "Deck" : "Deck",
"Changes in the <strong>Deck app</strong>" : "Changes in the <strong>Deck app</strong>",
"A <strong>comment</strong> was created on a card" : "A <strong>comment</strong> was created on a card",
"Upcoming cards" : "Upcoming cards",
"Load more" : "Load more",
"Personal" : "Personal", "Personal" : "Personal",
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "The card \"%s\" on \"%s\" has been assigned to you by %s.",
"{user} has assigned the card {deck-card} on {deck-board} to you." : "{user} has assigned the card {deck-card} on {deck-board} to you.",
"The card \"%s\" on \"%s\" has reached its due date." : "The card \"%s\" on \"%s\" has reached its due date.", "The card \"%s\" on \"%s\" has reached its due date." : "The card \"%s\" on \"%s\" has reached its due date.",
"The card {deck-card} on {deck-board} has reached its due date." : "The card {deck-card} on {deck-board} has reached its due date.",
"%s has mentioned you in a comment on \"%s\"." : "%s has mentioned you in a comment on \"%s\".",
"{user} has mentioned you in a comment on {deck-card}." : "{user} has mentioned you in a comment on {deck-card}.",
"The board \"%s\" has been shared with you by %s." : "The board \"%s\" has been shared with you by %s.", "The board \"%s\" has been shared with you by %s." : "The board \"%s\" has been shared with you by %s.",
"{user} has shared {deck-board} with you." : "{user} has shared {deck-board} with you.",
"Card comments" : "Card comments",
"%s on %s" : "%s on %s", "%s on %s" : "%s on %s",
"No data was provided to create an attachment." : "No data was provided to create an attachment.",
"Finished" : "Finished", "Finished" : "Finished",
"To review" : "To review", "To review" : "To review",
"Action needed" : "Action needed", "Action needed" : "Action needed",
"Later" : "Later", "Later" : "Later",
"copy" : "copy", "copy" : "copy",
"To do" : "To do",
"Doing" : "Doing",
"Done" : "Done", "Done" : "Done",
"Example Task 3" : "Example Task 3",
"Example Task 2" : "Example Task 2",
"Example Task 1" : "Example Task 1",
"The file was uploaded" : "The file was uploaded", "The file was uploaded" : "The file was uploaded",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "The uploaded file exceeds the upload_max_filesize directive in php.ini", "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "The uploaded file exceeds the upload_max_filesize directive in php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form",
@@ -100,218 +20,63 @@ OC.L10N.register(
"Missing a temporary folder" : "Missing a temporary folder", "Missing a temporary folder" : "Missing a temporary folder",
"Could not write file to disk" : "Could not write file to disk", "Could not write file to disk" : "Could not write file to disk",
"A PHP extension stopped the file upload" : "A PHP extension stopped the file upload", "A PHP extension stopped the file upload" : "A PHP extension stopped the file upload",
"No file uploaded or file size exceeds maximum of %s" : "No file uploaded or file size exceeds maximum of %s",
"This comment has more than %s characters.\nAdded as an attachment to the card with name %s.\nAccessible on URL: %s." : "This comment has more than %s characters.\nAdded as an attachment to the card with name %s.\nAccessible on URL: %s.",
"Card not found" : "Card not found", "Card not found" : "Card not found",
"Path is already shared with this card" : "Path is already shared with this card",
"Invalid date, date format must be YYYY-MM-DD" : "Invalid date, date format must be YYYY-MM-DD", "Invalid date, date format must be YYYY-MM-DD" : "Invalid date, date format must be YYYY-MM-DD",
"Personal planning and team project organization" : "Personal planning and team project organization",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in Markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your Markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in Markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your Markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized",
"Card details" : "Card details",
"Add board" : "Add board", "Add board" : "Add board",
"Select the board to link to a project" : "Select the board to link to a project",
"Search by board title" : "Search by board title",
"Select board" : "Select board",
"Create a new card" : "Create a new card",
"Select a board" : "Select a board",
"Select a list" : "Select a list",
"Card title" : "Card title",
"Cancel" : "Cancel", "Cancel" : "Cancel",
"Creating the new card …" : "Creating the new card …",
"Card \"{card}\" was added to \"{board}\"" : "Card \"{card}\" was added to \"{board}\"",
"Open card" : "Open card",
"Close" : "Close", "Close" : "Close",
"Create card" : "Create card", "Create card" : "Create card",
"Select a card" : "Select a card",
"Select the card to link to a project" : "Select the card to link to a project",
"Link to card" : "Link to card",
"File already exists" : "File already exists", "File already exists" : "File already exists",
"A file with the name {filename} already exists." : "A file with the name {filename} already exists.",
"Do you want to overwrite it?" : "Do you want to overwrite it?", "Do you want to overwrite it?" : "Do you want to overwrite it?",
"Overwrite file" : "Overwrite file",
"Keep existing file" : "Keep existing file",
"This board is read only" : "This board is read only",
"Drop your files to upload" : "Drop your files to upload",
"Add card" : "Add card", "Add card" : "Add card",
"Archived cards" : "Archived cards",
"Add list" : "Add list", "Add list" : "Add list",
"List name" : "List name",
"Active filters" : "Active filters",
"Apply filter" : "Apply filter",
"Filter by tag" : "Filter by tag", "Filter by tag" : "Filter by tag",
"Filter by assigned user" : "Filter by assigned user",
"Unassigned" : "Unassigned", "Unassigned" : "Unassigned",
"Filter by due date" : "Filter by due date",
"Overdue" : "Overdue", "Overdue" : "Overdue",
"Next 24 hours" : "Next 24 hours",
"Next 7 days" : "Next 7 days",
"Next 30 days" : "Next 30 days",
"No due date" : "No due date",
"Clear filter" : "Clear filter",
"Hide archived cards" : "Hide archived cards", "Hide archived cards" : "Hide archived cards",
"Show archived cards" : "Show archived cards", "Show archived cards" : "Show archived cards",
"Toggle compact mode" : "Toggle compact mode",
"Open details" : "Open details", "Open details" : "Open details",
"Details" : "Details", "Details" : "Details",
"Loading board" : "Loading board",
"No lists available" : "No lists available",
"Create a new list to add cards to this board" : "Create a new list to add cards to this board",
"Board not found" : "Board not found",
"Sharing" : "Sharing", "Sharing" : "Sharing",
"Tags" : "Tags", "Tags" : "Tags",
"Deleted items" : "Deleted items",
"Timeline" : "Timeline",
"Deleted lists" : "Deleted lists",
"Undo" : "Undo", "Undo" : "Undo",
"Deleted cards" : "Deleted cards",
"Share board with a user, group or circle …" : "Share board with a user, group or circle …",
"Searching for users, groups and circles …" : "Searching for users, groups and circles …",
"No participants found" : "No participants found",
"Board owner" : "Board owner",
"(Group)" : "(Group)",
"(Circle)" : "(Circle)",
"Can edit" : "Can edit", "Can edit" : "Can edit",
"Can share" : "Can share", "Can share" : "Can share",
"Can manage" : "Can manage",
"Owner" : "Owner", "Owner" : "Owner",
"Delete" : "Delete", "Delete" : "Delete",
"Failed to create share with {displayName}" : "Failed to create share with {displayName}",
"Are you sure you want to transfer the board {title} to {user}?" : "Are you sure you want to transfer the board {title} to {user}?",
"Transfer the board." : "Transfer the board.",
"Transfer" : "Transfer", "Transfer" : "Transfer",
"The board has been transferred to {user}" : "The board has been transferred to {user}",
"Failed to transfer the board to {user}" : "Failed to transfer the board to {user}",
"Add a new list" : "Add a new list",
"Archive all cards" : "Archive all cards",
"Unarchive all cards" : "Unarchive all cards",
"Delete list" : "Delete list", "Delete list" : "Delete list",
"Archive all cards in this list" : "Archive all cards in this list",
"Unarchive all cards in this list" : "Unarchive all cards in this list",
"Add a new card" : "Add a new card",
"Card name" : "Card name",
"List deleted" : "List deleted",
"Edit" : "Edit", "Edit" : "Edit",
"Add a new tag" : "Add a new tag",
"title and color value must be provided" : "title and colour value must be provided",
"Board name" : "Board name",
"Members" : "Members", "Members" : "Members",
"Upload new files" : "Upload new files",
"Share from Files" : "Share from Files",
"Pending share" : "Pending share",
"Add this attachment" : "Add this attachment",
"Show in Files" : "Show in Files",
"Download" : "Download", "Download" : "Download",
"Remove attachment" : "Remove attachment",
"Delete Attachment" : "Delete Attachment",
"Restore Attachment" : "Restore Attachment",
"File to share" : "File to share",
"Invalid path selected" : "Invalid path selected",
"Open in sidebar view" : "Open in sidebar view",
"Open in bigger view" : "Open in bigger view",
"Attachments" : "Attachments", "Attachments" : "Attachments",
"Comments" : "Comments", "Comments" : "Comments",
"Modified" : "Modified", "Modified" : "Modified",
"Created" : "Created", "Created" : "Created",
"The title cannot be empty." : "The title cannot be empty.",
"No comments yet. Begin the discussion!" : "No comments yet. Begin the discussion!",
"Failed to load comments" : "Failed to load comments",
"Assign a tag to this card…" : "Assign a tag to this card…",
"Assign to users" : "Assign to users",
"Assign to users/groups/circles" : "Assign to users/groups/circles",
"Assign a user to this card…" : "Assign a user to this card…",
"Due date" : "Due date", "Due date" : "Due date",
"Set a due date" : "Set a due date",
"Remove due date" : "Remove due date", "Remove due date" : "Remove due date",
"Select Date" : "Select Date",
"Today" : "Today", "Today" : "Today",
"Tomorrow" : "Tomorrow", "Tomorrow" : "Tomorrow",
"Next week" : "Next week", "Next week" : "Next week",
"Next month" : "Next month", "Next month" : "Next month",
"Save" : "Save", "Save" : "Save",
"The comment cannot be empty." : "The comment cannot be empty.",
"The comment cannot be longer than 1000 characters." : "The comment cannot be longer than 1000 characters.",
"In reply to" : "In reply to",
"Cancel reply" : "Cancel reply",
"Reply" : "Reply", "Reply" : "Reply",
"Update" : "Update", "Update" : "Update",
"Description" : "Description", "Description" : "Description",
"(Unsaved)" : "(Unsaved)",
"(Saving…)" : "(Saving…)",
"Formatting help" : "Formatting help", "Formatting help" : "Formatting help",
"Edit description" : "Edit description",
"View description" : "View description",
"Add Attachment" : "Add Attachment",
"Write a description …" : "Write a description …",
"Choose attachment" : "Choose attachment",
"(group)" : "(group)", "(group)" : "(group)",
"Todo items" : "Todo items",
"{count} comments, {unread} unread" : "{count} comments, {unread} unread",
"Edit card title" : "Edit card title",
"Assign to me" : "Assign to me",
"Unassign myself" : "Unassign myself",
"Move card" : "Move card",
"Unarchive card" : "Unarchive card",
"Archive card" : "Archive card", "Archive card" : "Archive card",
"Delete card" : "Delete card", "Delete card" : "Delete card",
"Move card to another board" : "Move card to another board",
"List is empty" : "List is empty",
"Card deleted" : "Card deleted",
"seconds ago" : "seconds ago", "seconds ago" : "seconds ago",
"All boards" : "All boards",
"Archived boards" : "Archived boards", "Archived boards" : "Archived boards",
"Shared with you" : "Shared with you", "Shared with you" : "Shared with you",
"Deck settings" : "Deck settings",
"Use bigger card view" : "Use bigger card view",
"Show card ID badge" : "Show card ID badge",
"Show boards in calendar/tasks" : "Show boards in calendar/tasks",
"Limit deck usage of groups" : "Limit deck usage of groups",
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them.",
"Board details" : "Board details", "Board details" : "Board details",
"Edit board" : "Edit board", "Edit board" : "Edit board",
"Clone board" : "Clone board",
"Unarchive board" : "Unarchive board", "Unarchive board" : "Unarchive board",
"Archive board" : "Archive board", "Archive board" : "Archive board",
"Turn on due date reminders" : "Turn on due date reminders",
"Turn off due date reminders" : "Turn off due date reminders",
"Due date reminders" : "Due date reminders",
"All cards" : "All cards",
"Assigned cards" : "Assigned cards",
"No notifications" : "No notifications", "No notifications" : "No notifications",
"Delete board" : "Delete board", "Delete board" : "Delete board",
"Board {0} deleted" : "Board {0} deleted",
"Only assigned cards" : "Only assigned cards",
"No reminder" : "No reminder",
"An error occurred" : "An error occurred",
"Are you sure you want to delete the board {title}? This will delete all the data of this board including archived cards." : "Are you sure you want to delete the board {title}? This will delete all the data of this board including archived cards.",
"Delete the board?" : "Delete the board?",
"Loading filtered view" : "Loading filtered view",
"No due" : "No due",
"Search for {searchQuery} in all boards" : "Search for {searchQuery} in all boards",
"No results found" : "No results found",
"{stack} in {board}" : "{stack} in {board}",
"Click to expand description" : "Click to expand description",
"* Created on {created}\n* Last modified on {lastMod}\n* {nbAttachments} attachments\n* {nbComments} comments" : "* Created on {created}\n* Last modified on {lastMod}\n* {nbAttachments} attachments\n* {nbComments} comments",
"{nbCards} cards" : "{nbCards} cards",
"No upcoming cards" : "No upcoming cards",
"upcoming cards" : "upcoming cards",
"Due on {date}" : "Due on {date}",
"Link to a board" : "Link to a board",
"Link to a card" : "Link to a card",
"Create a card" : "Create a card",
"Message from {author} in {conversationName}" : "Message from {author} in {conversationName}",
"Something went wrong" : "Something went wrong",
"Failed to upload {name}" : "Failed to upload {name}",
"Maximum file size of {size} exceeded" : "Maximum file size of {size} exceeded",
"Error creating the share" : "Error creating the share",
"Share with a Deck card" : "Share with a Deck card",
"Share {file} with a Deck card" : "Share {file} with a Deck card",
"Share" : "Share", "Share" : "Share",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized", "This week" : "This week"
"Are you sure you want to transfer the board {title} for {user} ?" : "Are you sure you want to transfer the board {title} for {user} ?",
"Transfer the board for {user} successfully" : "Transfer the board for {user} successfully",
"Failed to transfer the board for {user}" : "Failed to transfer the board for {user}",
"Are you sure you want to delete the board {title}? This will delete all the data of this board." : "Are you sure you want to delete the board {title}? This will delete all the data of this board.",
"This week" : "This week",
"Are you sure you want to transfer the board {title} for {user}?" : "Are you sure you want to transfer the board {title} for {user}?"
}, },
"nplurals=2; plural=(n != 1);"); "nplurals=2; plural=(n != 1);");
+1 -236
View File
@@ -1,95 +1,15 @@
{ "translations": { { "translations": {
"You have created a new board {board}" : "You have created a new board {board}",
"{user} has created a new board {board}" : "{user} has created a new board {board}",
"You have deleted the board {board}" : "You have deleted the board {board}",
"{user} has deleted the board {board}" : "{user} has deleted the board {board}",
"You have restored the board {board}" : "You have restored the board {board}",
"{user} has restored the board {board}" : "{user} has restored the board {board}",
"You have shared the board {board} with {acl}" : "You have shared the board {board} with {acl}",
"{user} has shared the board {board} with {acl}" : "{user} has shared the board {board} with {acl}",
"You have removed {acl} from the board {board}" : "You have removed {acl} from the board {board}",
"{user} has removed {acl} from the board {board}" : "{user} has removed {acl} from the board {board}",
"You have renamed the board {before} to {board}" : "You have renamed the board {before} to {board}",
"{user} has renamed the board {before} to {board}" : "{user} has renamed the board {before} to {board}",
"You have archived the board {board}" : "You have archived the board {board}",
"{user} has archived the board {before}" : "{user} has archived the board {before}",
"You have unarchived the board {board}" : "You have unarchived the board {board}",
"{user} has unarchived the board {before}" : "{user} has unarchived the board {before}",
"You have created a new list {stack} on board {board}" : "You have created a new list {stack} on board {board}",
"{user} has created a new list {stack} on board {board}" : "{user} has created a new list {stack} on board {board}",
"You have renamed list {before} to {stack} on board {board}" : "You have renamed list {before} to {stack} on board {board}",
"{user} has renamed list {before} to {stack} on board {board}" : "{user} has renamed list {before} to {stack} on board {board}",
"You have deleted list {stack} on board {board}" : "You have deleted list {stack} on board {board}",
"{user} has deleted list {stack} on board {board}" : "{user} has deleted list {stack} on board {board}",
"You have created card {card} in list {stack} on board {board}" : "You have created card {card} in list {stack} on board {board}",
"{user} has created card {card} in list {stack} on board {board}" : "{user} has created card {card} in list {stack} on board {board}",
"You have deleted card {card} in list {stack} on board {board}" : "You have deleted card {card} in list {stack} on board {board}",
"{user} has deleted card {card} in list {stack} on board {board}" : "{user} has deleted card {card} in list {stack} on board {board}",
"You have renamed the card {before} to {card}" : "You have renamed the card {before} to {card}",
"{user} has renamed the card {before} to {card}" : "{user} has renamed the card {before} to {card}",
"You have added a description to card {card} in list {stack} on board {board}" : "You have added a description to card {card} in list {stack} on board {board}",
"{user} has added a description to card {card} in list {stack} on board {board}" : "{user} has added a description to card {card} in list {stack} on board {board}",
"You have updated the description of card {card} in list {stack} on board {board}" : "You have updated the description of card {card} in list {stack} on board {board}",
"{user} has updated the description of the card {card} in list {stack} on board {board}" : "{user} has updated the description of the card {card} in list {stack} on board {board}",
"You have archived card {card} in list {stack} on board {board}" : "You have archived card {card} in list {stack} on board {board}",
"{user} has archived card {card} in list {stack} on board {board}" : "{user} has archived card {card} in list {stack} on board {board}",
"You have unarchived card {card} in list {stack} on board {board}" : "You have unarchived card {card} in list {stack} on board {board}",
"{user} has unarchived card {card} in list {stack} on board {board}" : "{user} has unarchived card {card} in list {stack} on board {board}",
"You have removed the due date of card {card}" : "You have removed the due date of card {card}",
"{user} has removed the due date of card {card}" : "{user} has removed the due date of card {card}",
"You have set the due date of card {card} to {after}" : "You have set the due date of card {card} to {after}",
"{user} has set the due date of card {card} to {after}" : "{user} has set the due date of card {card} to {after}",
"You have updated the due date of card {card} to {after}" : "You have updated the due date of card {card} to {after}",
"{user} has updated the due date of card {card} to {after}" : "{user} has updated the due date of card {card} to {after}",
"You have added the tag {label} to card {card} in list {stack} on board {board}" : "You have added the tag {label} to card {card} in list {stack} on board {board}",
"{user} has added the tag {label} to card {card} in list {stack} on board {board}" : "{user} has added the tag {label} to card {card} in list {stack} on board {board}",
"You have removed the tag {label} from card {card} in list {stack} on board {board}" : "You have removed the tag {label} from card {card} in list {stack} on board {board}",
"{user} has removed the tag {label} from card {card} in list {stack} on board {board}" : "{user} has removed the tag {label} from card {card} in list {stack} on board {board}",
"You have assigned {assigneduser} to card {card} on board {board}" : "You have assigned {assigneduser} to card {card} on board {board}",
"{user} has assigned {assigneduser} to card {card} on board {board}" : "{user} has assigned {assigneduser} to card {card} on board {board}",
"You have unassigned {assigneduser} from card {card} on board {board}" : "You have unassigned {assigneduser} from card {card} on board {board}",
"{user} has unassigned {assigneduser} from card {card} on board {board}" : "{user} has unassigned {assigneduser} from card {card} on board {board}",
"You have moved the card {card} from list {stackBefore} to {stack}" : "You have moved the card {card} from list {stackBefore} to {stack}",
"{user} has moved the card {card} from list {stackBefore} to {stack}" : "{user} has moved the card {card} from list {stackBefore} to {stack}",
"You have added the attachment {attachment} to card {card}" : "You have added the attachment {attachment} to card {card}",
"{user} has added the attachment {attachment} to card {card}" : "{user} has added the attachment {attachment} to card {card}",
"You have updated the attachment {attachment} on card {card}" : "You have updated the attachment {attachment} on card {card}",
"{user} has updated the attachment {attachment} on card {card}" : "{user} has updated the attachment {attachment} on card {card}",
"You have deleted the attachment {attachment} from card {card}" : "You have deleted the attachment {attachment} from card {card}",
"{user} has deleted the attachment {attachment} from card {card}" : "{user} has deleted the attachment {attachment} from card {card}",
"You have restored the attachment {attachment} to card {card}" : "You have restored the attachment {attachment} to card {card}",
"{user} has restored the attachment {attachment} to card {card}" : "{user} has restored the attachment {attachment} to card {card}",
"You have commented on card {card}" : "You have commented on card {card}",
"{user} has commented on card {card}" : "{user} has commented on card {card}",
"A <strong>card description</strong> inside the Deck app has been changed" : "A <strong>card description</strong> inside the Deck app has been changed",
"Deck" : "Deck", "Deck" : "Deck",
"Changes in the <strong>Deck app</strong>" : "Changes in the <strong>Deck app</strong>",
"A <strong>comment</strong> was created on a card" : "A <strong>comment</strong> was created on a card",
"Upcoming cards" : "Upcoming cards",
"Load more" : "Load more",
"Personal" : "Personal", "Personal" : "Personal",
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "The card \"%s\" on \"%s\" has been assigned to you by %s.",
"{user} has assigned the card {deck-card} on {deck-board} to you." : "{user} has assigned the card {deck-card} on {deck-board} to you.",
"The card \"%s\" on \"%s\" has reached its due date." : "The card \"%s\" on \"%s\" has reached its due date.", "The card \"%s\" on \"%s\" has reached its due date." : "The card \"%s\" on \"%s\" has reached its due date.",
"The card {deck-card} on {deck-board} has reached its due date." : "The card {deck-card} on {deck-board} has reached its due date.",
"%s has mentioned you in a comment on \"%s\"." : "%s has mentioned you in a comment on \"%s\".",
"{user} has mentioned you in a comment on {deck-card}." : "{user} has mentioned you in a comment on {deck-card}.",
"The board \"%s\" has been shared with you by %s." : "The board \"%s\" has been shared with you by %s.", "The board \"%s\" has been shared with you by %s." : "The board \"%s\" has been shared with you by %s.",
"{user} has shared {deck-board} with you." : "{user} has shared {deck-board} with you.",
"Card comments" : "Card comments",
"%s on %s" : "%s on %s", "%s on %s" : "%s on %s",
"No data was provided to create an attachment." : "No data was provided to create an attachment.",
"Finished" : "Finished", "Finished" : "Finished",
"To review" : "To review", "To review" : "To review",
"Action needed" : "Action needed", "Action needed" : "Action needed",
"Later" : "Later", "Later" : "Later",
"copy" : "copy", "copy" : "copy",
"To do" : "To do",
"Doing" : "Doing",
"Done" : "Done", "Done" : "Done",
"Example Task 3" : "Example Task 3",
"Example Task 2" : "Example Task 2",
"Example Task 1" : "Example Task 1",
"The file was uploaded" : "The file was uploaded", "The file was uploaded" : "The file was uploaded",
"The uploaded file exceeds the upload_max_filesize directive in php.ini" : "The uploaded file exceeds the upload_max_filesize directive in php.ini", "The uploaded file exceeds the upload_max_filesize directive in php.ini" : "The uploaded file exceeds the upload_max_filesize directive in php.ini",
"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form",
@@ -98,218 +18,63 @@
"Missing a temporary folder" : "Missing a temporary folder", "Missing a temporary folder" : "Missing a temporary folder",
"Could not write file to disk" : "Could not write file to disk", "Could not write file to disk" : "Could not write file to disk",
"A PHP extension stopped the file upload" : "A PHP extension stopped the file upload", "A PHP extension stopped the file upload" : "A PHP extension stopped the file upload",
"No file uploaded or file size exceeds maximum of %s" : "No file uploaded or file size exceeds maximum of %s",
"This comment has more than %s characters.\nAdded as an attachment to the card with name %s.\nAccessible on URL: %s." : "This comment has more than %s characters.\nAdded as an attachment to the card with name %s.\nAccessible on URL: %s.",
"Card not found" : "Card not found", "Card not found" : "Card not found",
"Path is already shared with this card" : "Path is already shared with this card",
"Invalid date, date format must be YYYY-MM-DD" : "Invalid date, date format must be YYYY-MM-DD", "Invalid date, date format must be YYYY-MM-DD" : "Invalid date, date format must be YYYY-MM-DD",
"Personal planning and team project organization" : "Personal planning and team project organization",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in Markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your Markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in Markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your Markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized",
"Card details" : "Card details",
"Add board" : "Add board", "Add board" : "Add board",
"Select the board to link to a project" : "Select the board to link to a project",
"Search by board title" : "Search by board title",
"Select board" : "Select board",
"Create a new card" : "Create a new card",
"Select a board" : "Select a board",
"Select a list" : "Select a list",
"Card title" : "Card title",
"Cancel" : "Cancel", "Cancel" : "Cancel",
"Creating the new card …" : "Creating the new card …",
"Card \"{card}\" was added to \"{board}\"" : "Card \"{card}\" was added to \"{board}\"",
"Open card" : "Open card",
"Close" : "Close", "Close" : "Close",
"Create card" : "Create card", "Create card" : "Create card",
"Select a card" : "Select a card",
"Select the card to link to a project" : "Select the card to link to a project",
"Link to card" : "Link to card",
"File already exists" : "File already exists", "File already exists" : "File already exists",
"A file with the name {filename} already exists." : "A file with the name {filename} already exists.",
"Do you want to overwrite it?" : "Do you want to overwrite it?", "Do you want to overwrite it?" : "Do you want to overwrite it?",
"Overwrite file" : "Overwrite file",
"Keep existing file" : "Keep existing file",
"This board is read only" : "This board is read only",
"Drop your files to upload" : "Drop your files to upload",
"Add card" : "Add card", "Add card" : "Add card",
"Archived cards" : "Archived cards",
"Add list" : "Add list", "Add list" : "Add list",
"List name" : "List name",
"Active filters" : "Active filters",
"Apply filter" : "Apply filter",
"Filter by tag" : "Filter by tag", "Filter by tag" : "Filter by tag",
"Filter by assigned user" : "Filter by assigned user",
"Unassigned" : "Unassigned", "Unassigned" : "Unassigned",
"Filter by due date" : "Filter by due date",
"Overdue" : "Overdue", "Overdue" : "Overdue",
"Next 24 hours" : "Next 24 hours",
"Next 7 days" : "Next 7 days",
"Next 30 days" : "Next 30 days",
"No due date" : "No due date",
"Clear filter" : "Clear filter",
"Hide archived cards" : "Hide archived cards", "Hide archived cards" : "Hide archived cards",
"Show archived cards" : "Show archived cards", "Show archived cards" : "Show archived cards",
"Toggle compact mode" : "Toggle compact mode",
"Open details" : "Open details", "Open details" : "Open details",
"Details" : "Details", "Details" : "Details",
"Loading board" : "Loading board",
"No lists available" : "No lists available",
"Create a new list to add cards to this board" : "Create a new list to add cards to this board",
"Board not found" : "Board not found",
"Sharing" : "Sharing", "Sharing" : "Sharing",
"Tags" : "Tags", "Tags" : "Tags",
"Deleted items" : "Deleted items",
"Timeline" : "Timeline",
"Deleted lists" : "Deleted lists",
"Undo" : "Undo", "Undo" : "Undo",
"Deleted cards" : "Deleted cards",
"Share board with a user, group or circle …" : "Share board with a user, group or circle …",
"Searching for users, groups and circles …" : "Searching for users, groups and circles …",
"No participants found" : "No participants found",
"Board owner" : "Board owner",
"(Group)" : "(Group)",
"(Circle)" : "(Circle)",
"Can edit" : "Can edit", "Can edit" : "Can edit",
"Can share" : "Can share", "Can share" : "Can share",
"Can manage" : "Can manage",
"Owner" : "Owner", "Owner" : "Owner",
"Delete" : "Delete", "Delete" : "Delete",
"Failed to create share with {displayName}" : "Failed to create share with {displayName}",
"Are you sure you want to transfer the board {title} to {user}?" : "Are you sure you want to transfer the board {title} to {user}?",
"Transfer the board." : "Transfer the board.",
"Transfer" : "Transfer", "Transfer" : "Transfer",
"The board has been transferred to {user}" : "The board has been transferred to {user}",
"Failed to transfer the board to {user}" : "Failed to transfer the board to {user}",
"Add a new list" : "Add a new list",
"Archive all cards" : "Archive all cards",
"Unarchive all cards" : "Unarchive all cards",
"Delete list" : "Delete list", "Delete list" : "Delete list",
"Archive all cards in this list" : "Archive all cards in this list",
"Unarchive all cards in this list" : "Unarchive all cards in this list",
"Add a new card" : "Add a new card",
"Card name" : "Card name",
"List deleted" : "List deleted",
"Edit" : "Edit", "Edit" : "Edit",
"Add a new tag" : "Add a new tag",
"title and color value must be provided" : "title and colour value must be provided",
"Board name" : "Board name",
"Members" : "Members", "Members" : "Members",
"Upload new files" : "Upload new files",
"Share from Files" : "Share from Files",
"Pending share" : "Pending share",
"Add this attachment" : "Add this attachment",
"Show in Files" : "Show in Files",
"Download" : "Download", "Download" : "Download",
"Remove attachment" : "Remove attachment",
"Delete Attachment" : "Delete Attachment",
"Restore Attachment" : "Restore Attachment",
"File to share" : "File to share",
"Invalid path selected" : "Invalid path selected",
"Open in sidebar view" : "Open in sidebar view",
"Open in bigger view" : "Open in bigger view",
"Attachments" : "Attachments", "Attachments" : "Attachments",
"Comments" : "Comments", "Comments" : "Comments",
"Modified" : "Modified", "Modified" : "Modified",
"Created" : "Created", "Created" : "Created",
"The title cannot be empty." : "The title cannot be empty.",
"No comments yet. Begin the discussion!" : "No comments yet. Begin the discussion!",
"Failed to load comments" : "Failed to load comments",
"Assign a tag to this card…" : "Assign a tag to this card…",
"Assign to users" : "Assign to users",
"Assign to users/groups/circles" : "Assign to users/groups/circles",
"Assign a user to this card…" : "Assign a user to this card…",
"Due date" : "Due date", "Due date" : "Due date",
"Set a due date" : "Set a due date",
"Remove due date" : "Remove due date", "Remove due date" : "Remove due date",
"Select Date" : "Select Date",
"Today" : "Today", "Today" : "Today",
"Tomorrow" : "Tomorrow", "Tomorrow" : "Tomorrow",
"Next week" : "Next week", "Next week" : "Next week",
"Next month" : "Next month", "Next month" : "Next month",
"Save" : "Save", "Save" : "Save",
"The comment cannot be empty." : "The comment cannot be empty.",
"The comment cannot be longer than 1000 characters." : "The comment cannot be longer than 1000 characters.",
"In reply to" : "In reply to",
"Cancel reply" : "Cancel reply",
"Reply" : "Reply", "Reply" : "Reply",
"Update" : "Update", "Update" : "Update",
"Description" : "Description", "Description" : "Description",
"(Unsaved)" : "(Unsaved)",
"(Saving…)" : "(Saving…)",
"Formatting help" : "Formatting help", "Formatting help" : "Formatting help",
"Edit description" : "Edit description",
"View description" : "View description",
"Add Attachment" : "Add Attachment",
"Write a description …" : "Write a description …",
"Choose attachment" : "Choose attachment",
"(group)" : "(group)", "(group)" : "(group)",
"Todo items" : "Todo items",
"{count} comments, {unread} unread" : "{count} comments, {unread} unread",
"Edit card title" : "Edit card title",
"Assign to me" : "Assign to me",
"Unassign myself" : "Unassign myself",
"Move card" : "Move card",
"Unarchive card" : "Unarchive card",
"Archive card" : "Archive card", "Archive card" : "Archive card",
"Delete card" : "Delete card", "Delete card" : "Delete card",
"Move card to another board" : "Move card to another board",
"List is empty" : "List is empty",
"Card deleted" : "Card deleted",
"seconds ago" : "seconds ago", "seconds ago" : "seconds ago",
"All boards" : "All boards",
"Archived boards" : "Archived boards", "Archived boards" : "Archived boards",
"Shared with you" : "Shared with you", "Shared with you" : "Shared with you",
"Deck settings" : "Deck settings",
"Use bigger card view" : "Use bigger card view",
"Show card ID badge" : "Show card ID badge",
"Show boards in calendar/tasks" : "Show boards in calendar/tasks",
"Limit deck usage of groups" : "Limit deck usage of groups",
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them.",
"Board details" : "Board details", "Board details" : "Board details",
"Edit board" : "Edit board", "Edit board" : "Edit board",
"Clone board" : "Clone board",
"Unarchive board" : "Unarchive board", "Unarchive board" : "Unarchive board",
"Archive board" : "Archive board", "Archive board" : "Archive board",
"Turn on due date reminders" : "Turn on due date reminders",
"Turn off due date reminders" : "Turn off due date reminders",
"Due date reminders" : "Due date reminders",
"All cards" : "All cards",
"Assigned cards" : "Assigned cards",
"No notifications" : "No notifications", "No notifications" : "No notifications",
"Delete board" : "Delete board", "Delete board" : "Delete board",
"Board {0} deleted" : "Board {0} deleted",
"Only assigned cards" : "Only assigned cards",
"No reminder" : "No reminder",
"An error occurred" : "An error occurred",
"Are you sure you want to delete the board {title}? This will delete all the data of this board including archived cards." : "Are you sure you want to delete the board {title}? This will delete all the data of this board including archived cards.",
"Delete the board?" : "Delete the board?",
"Loading filtered view" : "Loading filtered view",
"No due" : "No due",
"Search for {searchQuery} in all boards" : "Search for {searchQuery} in all boards",
"No results found" : "No results found",
"{stack} in {board}" : "{stack} in {board}",
"Click to expand description" : "Click to expand description",
"* Created on {created}\n* Last modified on {lastMod}\n* {nbAttachments} attachments\n* {nbComments} comments" : "* Created on {created}\n* Last modified on {lastMod}\n* {nbAttachments} attachments\n* {nbComments} comments",
"{nbCards} cards" : "{nbCards} cards",
"No upcoming cards" : "No upcoming cards",
"upcoming cards" : "upcoming cards",
"Due on {date}" : "Due on {date}",
"Link to a board" : "Link to a board",
"Link to a card" : "Link to a card",
"Create a card" : "Create a card",
"Message from {author} in {conversationName}" : "Message from {author} in {conversationName}",
"Something went wrong" : "Something went wrong",
"Failed to upload {name}" : "Failed to upload {name}",
"Maximum file size of {size} exceeded" : "Maximum file size of {size} exceeded",
"Error creating the share" : "Error creating the share",
"Share with a Deck card" : "Share with a Deck card",
"Share {file} with a Deck card" : "Share {file} with a Deck card",
"Share" : "Share", "Share" : "Share",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized", "This week" : "This week"
"Are you sure you want to transfer the board {title} for {user} ?" : "Are you sure you want to transfer the board {title} for {user} ?",
"Transfer the board for {user} successfully" : "Transfer the board for {user} successfully",
"Failed to transfer the board for {user}" : "Failed to transfer the board for {user}",
"Are you sure you want to delete the board {title}? This will delete all the data of this board." : "Are you sure you want to delete the board {title}? This will delete all the data of this board.",
"This week" : "This week",
"Are you sure you want to transfer the board {title} for {user}?" : "Are you sure you want to transfer the board {title} for {user}?"
},"pluralForm" :"nplurals=2; plural=(n != 1);" },"pluralForm" :"nplurals=2; plural=(n != 1);"
} }
+1 -3
View File
@@ -18,7 +18,6 @@ OC.L10N.register(
"Details" : "Üksikasjad", "Details" : "Üksikasjad",
"Sharing" : "Jagamine", "Sharing" : "Jagamine",
"Tags" : "Sildid", "Tags" : "Sildid",
"Undo" : "Tühista",
"Can edit" : "Võib redigeerida", "Can edit" : "Võib redigeerida",
"Can share" : "Can share", "Can share" : "Can share",
"Owner" : "Omanik", "Owner" : "Omanik",
@@ -43,7 +42,6 @@ OC.L10N.register(
"Shared with you" : "Sinuga jagatud", "Shared with you" : "Sinuga jagatud",
"No notifications" : "Märguandeid pole", "No notifications" : "Märguandeid pole",
"An error occurred" : "Tekkis tõrge", "An error occurred" : "Tekkis tõrge",
"Share" : "Jaga", "Share" : "Jaga"
"This week" : "Käesolev nädal"
}, },
"nplurals=2; plural=(n != 1);"); "nplurals=2; plural=(n != 1);");
+1 -3
View File
@@ -16,7 +16,6 @@
"Details" : "Üksikasjad", "Details" : "Üksikasjad",
"Sharing" : "Jagamine", "Sharing" : "Jagamine",
"Tags" : "Sildid", "Tags" : "Sildid",
"Undo" : "Tühista",
"Can edit" : "Võib redigeerida", "Can edit" : "Võib redigeerida",
"Can share" : "Can share", "Can share" : "Can share",
"Owner" : "Omanik", "Owner" : "Omanik",
@@ -41,7 +40,6 @@
"Shared with you" : "Sinuga jagatud", "Shared with you" : "Sinuga jagatud",
"No notifications" : "Märguandeid pole", "No notifications" : "Märguandeid pole",
"An error occurred" : "Tekkis tõrge", "An error occurred" : "Tekkis tõrge",
"Share" : "Jaga", "Share" : "Jaga"
"This week" : "Käesolev nädal"
},"pluralForm" :"nplurals=2; plural=(n != 1);" },"pluralForm" :"nplurals=2; plural=(n != 1);"
} }
+1 -3
View File
@@ -131,7 +131,7 @@ OC.L10N.register(
"Overwrite file" : "Remplacer le fichier", "Overwrite file" : "Remplacer le fichier",
"Keep existing file" : "Conserver le fichier existant", "Keep existing file" : "Conserver le fichier existant",
"This board is read only" : "Ce tableau est en lecture seule", "This board is read only" : "Ce tableau est en lecture seule",
"Drop your files to upload" : "Glissez vos fichiers pour les téléverser", "Drop your files to upload" : "Glissez vos fichiers pour les envoyer",
"Add card" : "Ajouter une carte", "Add card" : "Ajouter une carte",
"Archived cards" : "Cartes archivées", "Archived cards" : "Cartes archivées",
"Add list" : "Ajouter une liste", "Add list" : "Ajouter une liste",
@@ -183,10 +183,8 @@ OC.L10N.register(
"Failed to transfer the board to {user}" : "Échec du transfert du tableau à {user}", "Failed to transfer the board to {user}" : "Échec du transfert du tableau à {user}",
"Add a new list" : "Ajouter une nouvelle liste", "Add a new list" : "Ajouter une nouvelle liste",
"Archive all cards" : "Archiver toutes les cartes", "Archive all cards" : "Archiver toutes les cartes",
"Unarchive all cards" : "Désarchiver toutes les cartes",
"Delete list" : "Supprimer la liste", "Delete list" : "Supprimer la liste",
"Archive all cards in this list" : "Archiver toutes les cartes de cette liste", "Archive all cards in this list" : "Archiver toutes les cartes de cette liste",
"Unarchive all cards in this list" : "Désarchiver toutes les cartes de cette liste",
"Add a new card" : "Ajouter une nouvelle carte", "Add a new card" : "Ajouter une nouvelle carte",
"Card name" : "Nom de la carte", "Card name" : "Nom de la carte",
"List deleted" : "Liste supprimée", "List deleted" : "Liste supprimée",
+1 -3
View File
@@ -129,7 +129,7 @@
"Overwrite file" : "Remplacer le fichier", "Overwrite file" : "Remplacer le fichier",
"Keep existing file" : "Conserver le fichier existant", "Keep existing file" : "Conserver le fichier existant",
"This board is read only" : "Ce tableau est en lecture seule", "This board is read only" : "Ce tableau est en lecture seule",
"Drop your files to upload" : "Glissez vos fichiers pour les téléverser", "Drop your files to upload" : "Glissez vos fichiers pour les envoyer",
"Add card" : "Ajouter une carte", "Add card" : "Ajouter une carte",
"Archived cards" : "Cartes archivées", "Archived cards" : "Cartes archivées",
"Add list" : "Ajouter une liste", "Add list" : "Ajouter une liste",
@@ -181,10 +181,8 @@
"Failed to transfer the board to {user}" : "Échec du transfert du tableau à {user}", "Failed to transfer the board to {user}" : "Échec du transfert du tableau à {user}",
"Add a new list" : "Ajouter une nouvelle liste", "Add a new list" : "Ajouter une nouvelle liste",
"Archive all cards" : "Archiver toutes les cartes", "Archive all cards" : "Archiver toutes les cartes",
"Unarchive all cards" : "Désarchiver toutes les cartes",
"Delete list" : "Supprimer la liste", "Delete list" : "Supprimer la liste",
"Archive all cards in this list" : "Archiver toutes les cartes de cette liste", "Archive all cards in this list" : "Archiver toutes les cartes de cette liste",
"Unarchive all cards in this list" : "Désarchiver toutes les cartes de cette liste",
"Add a new card" : "Ajouter une nouvelle carte", "Add a new card" : "Ajouter une nouvelle carte",
"Card name" : "Nom de la carte", "Card name" : "Nom de la carte",
"List deleted" : "Liste supprimée", "List deleted" : "Liste supprimée",
-4
View File
@@ -183,10 +183,8 @@ OC.L10N.register(
"Failed to transfer the board to {user}" : "A tábla átadása {user} számára sikertelen", "Failed to transfer the board to {user}" : "A tábla átadása {user} számára sikertelen",
"Add a new list" : "Új lista hozzáadása", "Add a new list" : "Új lista hozzáadása",
"Archive all cards" : "Az összes kártya archiválása", "Archive all cards" : "Az összes kártya archiválása",
"Unarchive all cards" : "Az összes kártya archiválásának visszavonása",
"Delete list" : "Lista törlése", "Delete list" : "Lista törlése",
"Archive all cards in this list" : "Az összes kártya archiválása ebben a listában", "Archive all cards in this list" : "Az összes kártya archiválása ebben a listában",
"Unarchive all cards in this list" : "Az összes kártya archiválásának visszavonása ebben a listában",
"Add a new card" : "Új kártya hozzáadása", "Add a new card" : "Új kártya hozzáadása",
"Card name" : "Kártya neve", "Card name" : "Kártya neve",
"List deleted" : "Lista törölve", "List deleted" : "Lista törölve",
@@ -262,7 +260,6 @@ OC.L10N.register(
"Shared with you" : "Megosztva Önnel", "Shared with you" : "Megosztva Önnel",
"Deck settings" : "Kártyák beállításai", "Deck settings" : "Kártyák beállításai",
"Use bigger card view" : "Nagyobb kártyanézet használata", "Use bigger card view" : "Nagyobb kártyanézet használata",
"Show card ID badge" : "Kártyaazonosító jelvény megjelenítése",
"Show boards in calendar/tasks" : "Táblák megjelenítése a naptárak/teendők között", "Show boards in calendar/tasks" : "Táblák megjelenítése a naptárak/teendők között",
"Limit deck usage of groups" : "A kártyák használatának csoportokra korlátozása", "Limit deck usage of groups" : "A kártyák használatának csoportokra korlátozása",
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "A Kártyák korlátozása blokkolja a saját táblák létrehozását azoknál a felhasználóknál, akik nem tagjai a megadott csoportoknak. A felhasználók továbbra is tudnak dolgozni a velük megosztott táblákon.", "Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "A Kártyák korlátozása blokkolja a saját táblák létrehozását azoknál a felhasználóknál, akik nem tagjai a megadott csoportoknak. A felhasználók továbbra is tudnak dolgozni a velük megosztott táblákon.",
@@ -289,7 +286,6 @@ OC.L10N.register(
"Search for {searchQuery} in all boards" : "Keresés a(z) {searchQuery} kifejezésre az összes táblában", "Search for {searchQuery} in all boards" : "Keresés a(z) {searchQuery} kifejezésre az összes táblában",
"No results found" : "Nincs találat", "No results found" : "Nincs találat",
"{stack} in {board}" : "{stack} itt: {board}", "{stack} in {board}" : "{stack} itt: {board}",
"Click to expand description" : "Kattintson a leírás kibontásához",
"* Created on {created}\n* Last modified on {lastMod}\n* {nbAttachments} attachments\n* {nbComments} comments" : "* Létrehozva: {created}\n* Utoljára módosítva: {lastMod}\n* {nbAttachments} melléklet\n* {nbComments} megjegyzés", "* Created on {created}\n* Last modified on {lastMod}\n* {nbAttachments} attachments\n* {nbComments} comments" : "* Létrehozva: {created}\n* Utoljára módosítva: {lastMod}\n* {nbAttachments} melléklet\n* {nbComments} megjegyzés",
"{nbCards} cards" : "{nbCards} kártya", "{nbCards} cards" : "{nbCards} kártya",
"No upcoming cards" : "Nincsenek közelgő kártyák", "No upcoming cards" : "Nincsenek közelgő kártyák",
-4
View File
@@ -181,10 +181,8 @@
"Failed to transfer the board to {user}" : "A tábla átadása {user} számára sikertelen", "Failed to transfer the board to {user}" : "A tábla átadása {user} számára sikertelen",
"Add a new list" : "Új lista hozzáadása", "Add a new list" : "Új lista hozzáadása",
"Archive all cards" : "Az összes kártya archiválása", "Archive all cards" : "Az összes kártya archiválása",
"Unarchive all cards" : "Az összes kártya archiválásának visszavonása",
"Delete list" : "Lista törlése", "Delete list" : "Lista törlése",
"Archive all cards in this list" : "Az összes kártya archiválása ebben a listában", "Archive all cards in this list" : "Az összes kártya archiválása ebben a listában",
"Unarchive all cards in this list" : "Az összes kártya archiválásának visszavonása ebben a listában",
"Add a new card" : "Új kártya hozzáadása", "Add a new card" : "Új kártya hozzáadása",
"Card name" : "Kártya neve", "Card name" : "Kártya neve",
"List deleted" : "Lista törölve", "List deleted" : "Lista törölve",
@@ -260,7 +258,6 @@
"Shared with you" : "Megosztva Önnel", "Shared with you" : "Megosztva Önnel",
"Deck settings" : "Kártyák beállításai", "Deck settings" : "Kártyák beállításai",
"Use bigger card view" : "Nagyobb kártyanézet használata", "Use bigger card view" : "Nagyobb kártyanézet használata",
"Show card ID badge" : "Kártyaazonosító jelvény megjelenítése",
"Show boards in calendar/tasks" : "Táblák megjelenítése a naptárak/teendők között", "Show boards in calendar/tasks" : "Táblák megjelenítése a naptárak/teendők között",
"Limit deck usage of groups" : "A kártyák használatának csoportokra korlátozása", "Limit deck usage of groups" : "A kártyák használatának csoportokra korlátozása",
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "A Kártyák korlátozása blokkolja a saját táblák létrehozását azoknál a felhasználóknál, akik nem tagjai a megadott csoportoknak. A felhasználók továbbra is tudnak dolgozni a velük megosztott táblákon.", "Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "A Kártyák korlátozása blokkolja a saját táblák létrehozását azoknál a felhasználóknál, akik nem tagjai a megadott csoportoknak. A felhasználók továbbra is tudnak dolgozni a velük megosztott táblákon.",
@@ -287,7 +284,6 @@
"Search for {searchQuery} in all boards" : "Keresés a(z) {searchQuery} kifejezésre az összes táblában", "Search for {searchQuery} in all boards" : "Keresés a(z) {searchQuery} kifejezésre az összes táblában",
"No results found" : "Nincs találat", "No results found" : "Nincs találat",
"{stack} in {board}" : "{stack} itt: {board}", "{stack} in {board}" : "{stack} itt: {board}",
"Click to expand description" : "Kattintson a leírás kibontásához",
"* Created on {created}\n* Last modified on {lastMod}\n* {nbAttachments} attachments\n* {nbComments} comments" : "* Létrehozva: {created}\n* Utoljára módosítva: {lastMod}\n* {nbAttachments} melléklet\n* {nbComments} megjegyzés", "* Created on {created}\n* Last modified on {lastMod}\n* {nbAttachments} attachments\n* {nbComments} comments" : "* Létrehozva: {created}\n* Utoljára módosítva: {lastMod}\n* {nbAttachments} melléklet\n* {nbComments} megjegyzés",
"{nbCards} cards" : "{nbCards} kártya", "{nbCards} cards" : "{nbCards} kártya",
"No upcoming cards" : "Nincsenek közelgő kártyák", "No upcoming cards" : "Nincsenek közelgő kártyák",
+25 -28
View File
@@ -71,14 +71,14 @@ OC.L10N.register(
"Load more" : "Carregar mais", "Load more" : "Carregar mais",
"Personal" : "Pessoal", "Personal" : "Pessoal",
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "O cartão \"%s\" em \"%s\" foi vinculado com você por %s.", "The card \"%s\" on \"%s\" has been assigned to you by %s." : "O cartão \"%s\" em \"%s\" foi vinculado com você por %s.",
"{user} has assigned the card {deck-card} on {deck-board} to you." : "{user} atribuiu o cartão {deck-card} no {deck-board} a você.", "{user} has assigned the card {deck-card} on {deck-board} to you." : "{usuário} atribuiu a carta {deck-card} no {deck-board} para você.",
"The card \"%s\" on \"%s\" has reached its due date." : "O cartão \"%s\" em \"%s\" atingiu sua data de vencimento.", "The card \"%s\" on \"%s\" has reached its due date." : "O cartão \"%s\" em \"%s\" atingiu sua data de vencimento.",
"The card {deck-card} on {deck-board} has reached its due date." : "O cartão {deck-card} em {deck-board} atingiu sua data de vencimento.", "The card {deck-card} on {deck-board} has reached its due date." : "A carta {deck-card} em {deck-board} atingiu sua data de vencimento.",
"%s has mentioned you in a comment on \"%s\"." : "%s citou você num comentário em \"%s\".", "%s has mentioned you in a comment on \"%s\"." : "%s citou você num comentário em \"%s\".",
"{user} has mentioned you in a comment on {deck-card}." : "{user} mencionou você em um comentário em {deck-card}.", "{user} has mentioned you in a comment on {deck-card}." : "{user} mencionou você em um comentário em {deck-card}.",
"The board \"%s\" has been shared with you by %s." : "O painel \"%s\" foi compartilhado com você por %s.", "The board \"%s\" has been shared with you by %s." : "O painel \"%s\" foi compartilhado com você por %s.",
"{user} has shared {deck-board} with you." : "{user} compartilhou o {deck-board} com você.", "{user} has shared {deck-board} with you." : "{user} compartilhou {deck-board} com você.",
"Card comments" : "Comentários do cartão", "Card comments" : "Comentários nos Cards",
"%s on %s" : "%s em %s", "%s on %s" : "%s em %s",
"No data was provided to create an attachment." : "Nenhum dado foi fornecido para criar um anexo.", "No data was provided to create an attachment." : "Nenhum dado foi fornecido para criar um anexo.",
"Finished" : "Terminado", "Finished" : "Terminado",
@@ -101,12 +101,12 @@ OC.L10N.register(
"Could not write file to disk" : "Não foi possível escrever no disco", "Could not write file to disk" : "Não foi possível escrever no disco",
"A PHP extension stopped the file upload" : "Uma extensão PHP parou o envio do arquivo", "A PHP extension stopped the file upload" : "Uma extensão PHP parou o envio do arquivo",
"No file uploaded or file size exceeds maximum of %s" : "Nenhum arquivo enviado ou o tamanho excede o máximo de %s", "No file uploaded or file size exceeds maximum of %s" : "Nenhum arquivo enviado ou o tamanho excede o máximo de %s",
"This comment has more than %s characters.\nAdded as an attachment to the card with name %s.\nAccessible on URL: %s." : "Este comentário tem mais de %s caracteres.\nEle foi adicionado como um anexo ao cartão de nome %s.\nAcessível na URL: %s.", "This comment has more than %s characters.\nAdded as an attachment to the card with name %s.\nAccessible on URL: %s." : "Este comentário tem mais de %s caracteres.\nAdicionado como um anexo ao cartão com o nome %s.\nAcessível no URL: %s.",
"Card not found" : "Cartão não encontrado", "Card not found" : "Cartão não encontrado",
"Path is already shared with this card" : "O caminho já é compartilhado com este cartão", "Path is already shared with this card" : "O caminho já é compartilhado com este cartão",
"Invalid date, date format must be YYYY-MM-DD" : "Data inválida, o formato da data deve ser AAAA-MM-DD", "Invalid date, date format must be YYYY-MM-DD" : "Data inválida, o formato da data deve ser AAAA-MM-DD",
"Personal planning and team project organization" : "Planejamento pessoal e organização de projetos em equipe", "Personal planning and team project organization" : "Planejamento pessoal e organização de projetos em equipe",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in Markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your Markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "O Deck é uma ferramenta de organização ao estilo kanban voltada para o planejamento pessoal e para a organização de projetos para equipes, integrada ao Nextcloud.\n\n\n- 📥Adicione suas tarefas aos cartões e coloque-os em ordem\n- 📄 Escreva notas adicionais formatadas em Markdown \n- 🔖 Atribua rótulos para uma organização ainda melhor\n- 👥 Compartilhe com sua equipe, seus amigos ou sua família\n- 📎 Anexe arquivos e incorpore-os à sua descrição em Markdown\n- 💬 Discuta com sua equipe usando comentários\n- ⚡ Acompanhe as alterações no fluxo de atividades \n- 🚀 Organize seu projeto ", "Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in Markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your Markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck é uma ferramenta de organização do estilo kanban voltada para o planejamento pessoal e organização de projetos para equipes integradas ao Nextcloud.\n\n\n- 📥Adicione suas tarefas aos cartões e coloque-as em ordem\n- 📄 Escreva notas adicionais em Anotar \n- 🔖 Atribua rótulos para uma organização ainda melhor\n- 👥 Compartilhe com sua equipe, amigos ou família\n- 📎 Anexar arquivos e incorporá-los à descrição da Nota\n- 💬 Discuta com sua equipe usando comentários\n- ⚡ Acompanhe as mudanças no fluxo de atividades \n- 🚀 Organize seu projeto ",
"Card details" : "Detalhes do cartão", "Card details" : "Detalhes do cartão",
"Add board" : "Adicionar painel", "Add board" : "Adicionar painel",
"Select the board to link to a project" : "Selecione o painel para vincular a um projeto", "Select the board to link to a project" : "Selecione o painel para vincular a um projeto",
@@ -117,7 +117,7 @@ OC.L10N.register(
"Select a list" : "Selecione uma lista", "Select a list" : "Selecione uma lista",
"Card title" : "Título do cartão", "Card title" : "Título do cartão",
"Cancel" : "Cancelar", "Cancel" : "Cancelar",
"Creating the new card …" : "Criando o novo cartão…", "Creating the new card …" : "Criando o novo cartão …",
"Card \"{card}\" was added to \"{board}\"" : "O cartão \"{card}\" foi adicionado a \"{board}\" ", "Card \"{card}\" was added to \"{board}\"" : "O cartão \"{card}\" foi adicionado a \"{board}\" ",
"Open card" : "Abrir o cartão", "Open card" : "Abrir o cartão",
"Close" : "Fechar", "Close" : "Fechar",
@@ -150,7 +150,7 @@ OC.L10N.register(
"Clear filter" : "Limpar filtro", "Clear filter" : "Limpar filtro",
"Hide archived cards" : "Ocultar cartões arquivados", "Hide archived cards" : "Ocultar cartões arquivados",
"Show archived cards" : "Exibir cartões arquivados", "Show archived cards" : "Exibir cartões arquivados",
"Toggle compact mode" : "Alternar modo compacto", "Toggle compact mode" : "Alternar para modo compacto",
"Open details" : "Abrir detalhes", "Open details" : "Abrir detalhes",
"Details" : "Detalhes", "Details" : "Detalhes",
"Loading board" : "Carregando painel", "Loading board" : "Carregando painel",
@@ -176,17 +176,15 @@ OC.L10N.register(
"Owner" : "Proprietário", "Owner" : "Proprietário",
"Delete" : "Excluir", "Delete" : "Excluir",
"Failed to create share with {displayName}" : "Falha ao criar compartilhamento com {displayName}", "Failed to create share with {displayName}" : "Falha ao criar compartilhamento com {displayName}",
"Are you sure you want to transfer the board {title} to {user}?" : "Deseja realmente transferir o painel {title} para {user}?", "Are you sure you want to transfer the board {title} to {user}?" : "Tem certeza de que deseja transferir o quadro {title} para {user}?",
"Transfer the board." : "Transferir o painel.", "Transfer the board." : "Transfira a reunião.",
"Transfer" : "Transferir", "Transfer" : "Transferir",
"The board has been transferred to {user}" : "A painel foi transferida para {user}", "The board has been transferred to {user}" : "A quadro foi transferida para {user}",
"Failed to transfer the board to {user}" : "Não foi possível transferir o painel para {user}", "Failed to transfer the board to {user}" : "Falha ao transferir o quadro para {user}",
"Add a new list" : "Adicionar nova lista", "Add a new list" : "Adicionar nova lista",
"Archive all cards" : "Arquivar todos os cartões", "Archive all cards" : "Arquivar todos os cartões",
"Unarchive all cards" : "Desarquivar todos os cartões",
"Delete list" : "Excluir lista", "Delete list" : "Excluir lista",
"Archive all cards in this list" : "Arquivar todos os cartões desta lista", "Archive all cards in this list" : "Arquivar todos os cartões desta lista",
"Unarchive all cards in this list" : "Desarquivar todos os cartões desta lista",
"Add a new card" : "Adicionar um novo cartão", "Add a new card" : "Adicionar um novo cartão",
"Card name" : "Nome do cartão", "Card name" : "Nome do cartão",
"List deleted" : "Lista excluída", "List deleted" : "Lista excluída",
@@ -199,7 +197,7 @@ OC.L10N.register(
"Share from Files" : "Compartilhar de Arquivos", "Share from Files" : "Compartilhar de Arquivos",
"Pending share" : "Compartilhamento pendente", "Pending share" : "Compartilhamento pendente",
"Add this attachment" : "Adicionar este anexo", "Add this attachment" : "Adicionar este anexo",
"Show in Files" : "Exibir em Arquivos", "Show in Files" : "Mostrar em Arquivos",
"Download" : "Baixar", "Download" : "Baixar",
"Remove attachment" : "Remover anexo", "Remove attachment" : "Remover anexo",
"Delete Attachment" : "Excluir Anexo", "Delete Attachment" : "Excluir Anexo",
@@ -214,13 +212,13 @@ OC.L10N.register(
"Created" : "Criado", "Created" : "Criado",
"The title cannot be empty." : "O título não pode ficar em branco.", "The title cannot be empty." : "O título não pode ficar em branco.",
"No comments yet. Begin the discussion!" : "Nenhum comentário ainda. Inicie a conversa!", "No comments yet. Begin the discussion!" : "Nenhum comentário ainda. Inicie a conversa!",
"Failed to load comments" : "Não foi possível carregar os comentários", "Failed to load comments" : "Falha ao carregar comentários",
"Assign a tag to this card…" : "Atribuir uma etiqueta a este cartão...", "Assign a tag to this card…" : "Atribuir uma etiqueta a este cartão...",
"Assign to users" : "Atribuir a usuários", "Assign to users" : "Atribuir a usuários",
"Assign to users/groups/circles" : "Atribuir a usuários/grupos/círculos", "Assign to users/groups/circles" : "Atribuir a usuários/grupos/círculos",
"Assign a user to this card…" : "Atribuir um usuário a este cartão...", "Assign a user to this card…" : "Atribuir um usuário a este cartão...",
"Due date" : "Data de vencimento", "Due date" : "Data de vencimento",
"Set a due date" : "Definir uma data de vencimento", "Set a due date" : "Definir uma data de finalização",
"Remove due date" : "Remover data de vencimento", "Remove due date" : "Remover data de vencimento",
"Select Date" : "Selecionar Data", "Select Date" : "Selecionar Data",
"Today" : "Hoje", "Today" : "Hoje",
@@ -244,7 +242,7 @@ OC.L10N.register(
"Write a description …" : "Escreva uma descrição...", "Write a description …" : "Escreva uma descrição...",
"Choose attachment" : "Escolher anexo", "Choose attachment" : "Escolher anexo",
"(group)" : "(grupo)", "(group)" : "(grupo)",
"Todo items" : "Itens a fazer", "Todo items" : "Itens para fazer",
"{count} comments, {unread} unread" : "{count} comentários, {unread} não lidos", "{count} comments, {unread} unread" : "{count} comentários, {unread} não lidos",
"Edit card title" : "Editar título do cartão", "Edit card title" : "Editar título do cartão",
"Assign to me" : "Atribuir a mim", "Assign to me" : "Atribuir a mim",
@@ -254,7 +252,7 @@ OC.L10N.register(
"Archive card" : "Arquivar cartão", "Archive card" : "Arquivar cartão",
"Delete card" : "Excluir cartão", "Delete card" : "Excluir cartão",
"Move card to another board" : "Mover o cartão para outro painel", "Move card to another board" : "Mover o cartão para outro painel",
"List is empty" : "A lista está vazia", "List is empty" : "A Lista está vazia",
"Card deleted" : "Cartão excluído", "Card deleted" : "Cartão excluído",
"seconds ago" : "segundos atrás", "seconds ago" : "segundos atrás",
"All boards" : "Todos os painéis", "All boards" : "Todos os painéis",
@@ -262,8 +260,7 @@ OC.L10N.register(
"Shared with you" : "Compartilhado com você", "Shared with you" : "Compartilhado com você",
"Deck settings" : "Configurações do Deck", "Deck settings" : "Configurações do Deck",
"Use bigger card view" : "Use uma exibição de cartão maior", "Use bigger card view" : "Use uma exibição de cartão maior",
"Show card ID badge" : "Exibir o distintivo de identificação do cartão", "Show boards in calendar/tasks" : "Mostrar painéis em calendários/tarefas",
"Show boards in calendar/tasks" : "Exibir os painéis em calendários/tarefas",
"Limit deck usage of groups" : "Limitar o uso de grupos no deck", "Limit deck usage of groups" : "Limitar o uso de grupos no deck",
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Limitar o Deck impedirá que usuários que não fazem parte desses grupos criem seus próprios painéis. Os usuários ainda poderão trabalhar em pastas que foram compartilhadas com eles.", "Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Limitar o Deck impedirá que usuários que não fazem parte desses grupos criem seus próprios painéis. Os usuários ainda poderão trabalhar em pastas que foram compartilhadas com eles.",
"Board details" : "Detalhes do painel", "Board details" : "Detalhes do painel",
@@ -282,20 +279,20 @@ OC.L10N.register(
"Only assigned cards" : "Apenas cartões atribuídos", "Only assigned cards" : "Apenas cartões atribuídos",
"No reminder" : "Nenhum lembrete", "No reminder" : "Nenhum lembrete",
"An error occurred" : "Ocorreu um erro", "An error occurred" : "Ocorreu um erro",
"Are you sure you want to delete the board {title}? This will delete all the data of this board including archived cards." : "Deseja realmente excluir o painel {title}? Isso excluirá todos os dados deste painel, inclusive os cartões arquivados.", "Are you sure you want to delete the board {title}? This will delete all the data of this board including archived cards." : "Tem certeza de que deseja excluir o quadro {title}? Isso excluirá todos os dados deste quadro, incluindo cartões arquivados.",
"Delete the board?" : "Excluir o painel?", "Delete the board?" : "Excluir o painel?",
"Loading filtered view" : "Carregando exibição filtrada", "Loading filtered view" : "Carregando exibição filtrada",
"No due" : "Sem vencimento", "No due" : "Sem vencimento",
"Search for {searchQuery} in all boards" : "Pesquisar por {searchQuery} em todos os painéis", "Search for {searchQuery} in all boards" : "Pesquisar por {searchQuery} em todos os painéis",
"No results found" : "Nenhum resultado encontrado", "No results found" : "Nenhum resultado encontrado",
"{stack} in {board}" : "{stack} em {board}", "{stack} in {board}" : "{stack} de {board}",
"Click to expand description" : "Clique para expandir a descrição", "Click to expand description" : "Clique para expandir a descrição",
"* Created on {created}\n* Last modified on {lastMod}\n* {nbAttachments} attachments\n* {nbComments} comments" : "* Criado em {created}\n* Última modificação em {lastMod}\n* {nbAttachments} anexos\n* {nbComments} comentários", "* Created on {created}\n* Last modified on {lastMod}\n* {nbAttachments} attachments\n* {nbComments} comments" : "* Criado em {created}\n* Última modificação em {lastMod}\n* {nbAttachments} anexos\n* {nbComments} comentários",
"{nbCards} cards" : "{nbCards} cartões", "{nbCards} cards" : "{nbCards} cartões",
"No upcoming cards" : "Não há mais cartões", "No upcoming cards" : "Não há mais cartões",
"upcoming cards" : "próximos cartões", "upcoming cards" : "próximos cartões",
"Due on {date}" : "Vencimento em {date}", "Due on {date}" : "Vencimento em {date}",
"Link to a board" : "Vincular a um painel", "Link to a board" : "Linkar a um painel",
"Link to a card" : "Vincular a um cartão", "Link to a card" : "Vincular a um cartão",
"Create a card" : "Criar um cartão", "Create a card" : "Criar um cartão",
"Message from {author} in {conversationName}" : "Mensagem de {author} em {conversationName}", "Message from {author} in {conversationName}" : "Mensagem de {author} em {conversationName}",
@@ -307,11 +304,11 @@ OC.L10N.register(
"Share {file} with a Deck card" : "Compartilhar {file} com um cartão Deck", "Share {file} with a Deck card" : "Compartilhar {file} com um cartão Deck",
"Share" : "Compartilhar", "Share" : "Compartilhar",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck é uma ferramenta de organização de estilo kanban destinada ao planejamento pessoal e organização para equipes integradas com o Nextcloud.\n\n\n- 📥 Adicione suas tarefas aos cartões e coloque-os em ordem\n- 📄 Insira notas adicionais em markdown\n- 🔖 Atribua etiquetas para melhorar a organização\n- 👥 Compartilhe com sua equipe, amigos ou familiares\n- 📎 Anexe arquivos e incorpore-os em sua descrição no markdown\n- 💬 Discuta com sua equipe usando os comentários\n- ⚡ Acompanhe as alterações no fluxo de atividades\n- 🚀 Mantenha seu projeto organizado", "Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck é uma ferramenta de organização de estilo kanban destinada ao planejamento pessoal e organização para equipes integradas com o Nextcloud.\n\n\n- 📥 Adicione suas tarefas aos cartões e coloque-os em ordem\n- 📄 Insira notas adicionais em markdown\n- 🔖 Atribua etiquetas para melhorar a organização\n- 👥 Compartilhe com sua equipe, amigos ou familiares\n- 📎 Anexe arquivos e incorpore-os em sua descrição no markdown\n- 💬 Discuta com sua equipe usando os comentários\n- ⚡ Acompanhe as alterações no fluxo de atividades\n- 🚀 Mantenha seu projeto organizado",
"Are you sure you want to transfer the board {title} for {user} ?" : "Deseja realmente transferir o painel {title} para {user}?", "Are you sure you want to transfer the board {title} for {user} ?" : "Tem certeza de que deseja transferir o quadro {title} para {user}?",
"Transfer the board for {user} successfully" : "O painel foi transferido para {user} com sucesso", "Transfer the board for {user} successfully" : "Transferida a reunião para {user} com sucesso",
"Failed to transfer the board for {user}" : "Não foi possível transferir o painel para {user}", "Failed to transfer the board for {user}" : "Falha ao transferir a reunião para {user}",
"Are you sure you want to delete the board {title}? This will delete all the data of this board." : "Deseja realmente excluir o painel {title}? Isto excluirá todos os dados deste painel.", "Are you sure you want to delete the board {title}? This will delete all the data of this board." : "Deseja realmente excluir o painel {title}? Isto excluirá todos os dados deste painel.",
"This week" : "Esta semana", "This week" : "Esta semana",
"Are you sure you want to transfer the board {title} for {user}?" : "Deseja realmente transferir o painel {title} para {user}?" "Are you sure you want to transfer the board {title} for {user}?" : "Tem certeza de que deseja transferir o quadro {title} para {user}?"
}, },
"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"); "nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
+25 -28
View File
@@ -69,14 +69,14 @@
"Load more" : "Carregar mais", "Load more" : "Carregar mais",
"Personal" : "Pessoal", "Personal" : "Pessoal",
"The card \"%s\" on \"%s\" has been assigned to you by %s." : "O cartão \"%s\" em \"%s\" foi vinculado com você por %s.", "The card \"%s\" on \"%s\" has been assigned to you by %s." : "O cartão \"%s\" em \"%s\" foi vinculado com você por %s.",
"{user} has assigned the card {deck-card} on {deck-board} to you." : "{user} atribuiu o cartão {deck-card} no {deck-board} a você.", "{user} has assigned the card {deck-card} on {deck-board} to you." : "{usuário} atribuiu a carta {deck-card} no {deck-board} para você.",
"The card \"%s\" on \"%s\" has reached its due date." : "O cartão \"%s\" em \"%s\" atingiu sua data de vencimento.", "The card \"%s\" on \"%s\" has reached its due date." : "O cartão \"%s\" em \"%s\" atingiu sua data de vencimento.",
"The card {deck-card} on {deck-board} has reached its due date." : "O cartão {deck-card} em {deck-board} atingiu sua data de vencimento.", "The card {deck-card} on {deck-board} has reached its due date." : "A carta {deck-card} em {deck-board} atingiu sua data de vencimento.",
"%s has mentioned you in a comment on \"%s\"." : "%s citou você num comentário em \"%s\".", "%s has mentioned you in a comment on \"%s\"." : "%s citou você num comentário em \"%s\".",
"{user} has mentioned you in a comment on {deck-card}." : "{user} mencionou você em um comentário em {deck-card}.", "{user} has mentioned you in a comment on {deck-card}." : "{user} mencionou você em um comentário em {deck-card}.",
"The board \"%s\" has been shared with you by %s." : "O painel \"%s\" foi compartilhado com você por %s.", "The board \"%s\" has been shared with you by %s." : "O painel \"%s\" foi compartilhado com você por %s.",
"{user} has shared {deck-board} with you." : "{user} compartilhou o {deck-board} com você.", "{user} has shared {deck-board} with you." : "{user} compartilhou {deck-board} com você.",
"Card comments" : "Comentários do cartão", "Card comments" : "Comentários nos Cards",
"%s on %s" : "%s em %s", "%s on %s" : "%s em %s",
"No data was provided to create an attachment." : "Nenhum dado foi fornecido para criar um anexo.", "No data was provided to create an attachment." : "Nenhum dado foi fornecido para criar um anexo.",
"Finished" : "Terminado", "Finished" : "Terminado",
@@ -99,12 +99,12 @@
"Could not write file to disk" : "Não foi possível escrever no disco", "Could not write file to disk" : "Não foi possível escrever no disco",
"A PHP extension stopped the file upload" : "Uma extensão PHP parou o envio do arquivo", "A PHP extension stopped the file upload" : "Uma extensão PHP parou o envio do arquivo",
"No file uploaded or file size exceeds maximum of %s" : "Nenhum arquivo enviado ou o tamanho excede o máximo de %s", "No file uploaded or file size exceeds maximum of %s" : "Nenhum arquivo enviado ou o tamanho excede o máximo de %s",
"This comment has more than %s characters.\nAdded as an attachment to the card with name %s.\nAccessible on URL: %s." : "Este comentário tem mais de %s caracteres.\nEle foi adicionado como um anexo ao cartão de nome %s.\nAcessível na URL: %s.", "This comment has more than %s characters.\nAdded as an attachment to the card with name %s.\nAccessible on URL: %s." : "Este comentário tem mais de %s caracteres.\nAdicionado como um anexo ao cartão com o nome %s.\nAcessível no URL: %s.",
"Card not found" : "Cartão não encontrado", "Card not found" : "Cartão não encontrado",
"Path is already shared with this card" : "O caminho já é compartilhado com este cartão", "Path is already shared with this card" : "O caminho já é compartilhado com este cartão",
"Invalid date, date format must be YYYY-MM-DD" : "Data inválida, o formato da data deve ser AAAA-MM-DD", "Invalid date, date format must be YYYY-MM-DD" : "Data inválida, o formato da data deve ser AAAA-MM-DD",
"Personal planning and team project organization" : "Planejamento pessoal e organização de projetos em equipe", "Personal planning and team project organization" : "Planejamento pessoal e organização de projetos em equipe",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in Markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your Markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "O Deck é uma ferramenta de organização ao estilo kanban voltada para o planejamento pessoal e para a organização de projetos para equipes, integrada ao Nextcloud.\n\n\n- 📥Adicione suas tarefas aos cartões e coloque-os em ordem\n- 📄 Escreva notas adicionais formatadas em Markdown \n- 🔖 Atribua rótulos para uma organização ainda melhor\n- 👥 Compartilhe com sua equipe, seus amigos ou sua família\n- 📎 Anexe arquivos e incorpore-os à sua descrição em Markdown\n- 💬 Discuta com sua equipe usando comentários\n- ⚡ Acompanhe as alterações no fluxo de atividades \n- 🚀 Organize seu projeto ", "Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in Markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your Markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck é uma ferramenta de organização do estilo kanban voltada para o planejamento pessoal e organização de projetos para equipes integradas ao Nextcloud.\n\n\n- 📥Adicione suas tarefas aos cartões e coloque-as em ordem\n- 📄 Escreva notas adicionais em Anotar \n- 🔖 Atribua rótulos para uma organização ainda melhor\n- 👥 Compartilhe com sua equipe, amigos ou família\n- 📎 Anexar arquivos e incorporá-los à descrição da Nota\n- 💬 Discuta com sua equipe usando comentários\n- ⚡ Acompanhe as mudanças no fluxo de atividades \n- 🚀 Organize seu projeto ",
"Card details" : "Detalhes do cartão", "Card details" : "Detalhes do cartão",
"Add board" : "Adicionar painel", "Add board" : "Adicionar painel",
"Select the board to link to a project" : "Selecione o painel para vincular a um projeto", "Select the board to link to a project" : "Selecione o painel para vincular a um projeto",
@@ -115,7 +115,7 @@
"Select a list" : "Selecione uma lista", "Select a list" : "Selecione uma lista",
"Card title" : "Título do cartão", "Card title" : "Título do cartão",
"Cancel" : "Cancelar", "Cancel" : "Cancelar",
"Creating the new card …" : "Criando o novo cartão…", "Creating the new card …" : "Criando o novo cartão …",
"Card \"{card}\" was added to \"{board}\"" : "O cartão \"{card}\" foi adicionado a \"{board}\" ", "Card \"{card}\" was added to \"{board}\"" : "O cartão \"{card}\" foi adicionado a \"{board}\" ",
"Open card" : "Abrir o cartão", "Open card" : "Abrir o cartão",
"Close" : "Fechar", "Close" : "Fechar",
@@ -148,7 +148,7 @@
"Clear filter" : "Limpar filtro", "Clear filter" : "Limpar filtro",
"Hide archived cards" : "Ocultar cartões arquivados", "Hide archived cards" : "Ocultar cartões arquivados",
"Show archived cards" : "Exibir cartões arquivados", "Show archived cards" : "Exibir cartões arquivados",
"Toggle compact mode" : "Alternar modo compacto", "Toggle compact mode" : "Alternar para modo compacto",
"Open details" : "Abrir detalhes", "Open details" : "Abrir detalhes",
"Details" : "Detalhes", "Details" : "Detalhes",
"Loading board" : "Carregando painel", "Loading board" : "Carregando painel",
@@ -174,17 +174,15 @@
"Owner" : "Proprietário", "Owner" : "Proprietário",
"Delete" : "Excluir", "Delete" : "Excluir",
"Failed to create share with {displayName}" : "Falha ao criar compartilhamento com {displayName}", "Failed to create share with {displayName}" : "Falha ao criar compartilhamento com {displayName}",
"Are you sure you want to transfer the board {title} to {user}?" : "Deseja realmente transferir o painel {title} para {user}?", "Are you sure you want to transfer the board {title} to {user}?" : "Tem certeza de que deseja transferir o quadro {title} para {user}?",
"Transfer the board." : "Transferir o painel.", "Transfer the board." : "Transfira a reunião.",
"Transfer" : "Transferir", "Transfer" : "Transferir",
"The board has been transferred to {user}" : "A painel foi transferida para {user}", "The board has been transferred to {user}" : "A quadro foi transferida para {user}",
"Failed to transfer the board to {user}" : "Não foi possível transferir o painel para {user}", "Failed to transfer the board to {user}" : "Falha ao transferir o quadro para {user}",
"Add a new list" : "Adicionar nova lista", "Add a new list" : "Adicionar nova lista",
"Archive all cards" : "Arquivar todos os cartões", "Archive all cards" : "Arquivar todos os cartões",
"Unarchive all cards" : "Desarquivar todos os cartões",
"Delete list" : "Excluir lista", "Delete list" : "Excluir lista",
"Archive all cards in this list" : "Arquivar todos os cartões desta lista", "Archive all cards in this list" : "Arquivar todos os cartões desta lista",
"Unarchive all cards in this list" : "Desarquivar todos os cartões desta lista",
"Add a new card" : "Adicionar um novo cartão", "Add a new card" : "Adicionar um novo cartão",
"Card name" : "Nome do cartão", "Card name" : "Nome do cartão",
"List deleted" : "Lista excluída", "List deleted" : "Lista excluída",
@@ -197,7 +195,7 @@
"Share from Files" : "Compartilhar de Arquivos", "Share from Files" : "Compartilhar de Arquivos",
"Pending share" : "Compartilhamento pendente", "Pending share" : "Compartilhamento pendente",
"Add this attachment" : "Adicionar este anexo", "Add this attachment" : "Adicionar este anexo",
"Show in Files" : "Exibir em Arquivos", "Show in Files" : "Mostrar em Arquivos",
"Download" : "Baixar", "Download" : "Baixar",
"Remove attachment" : "Remover anexo", "Remove attachment" : "Remover anexo",
"Delete Attachment" : "Excluir Anexo", "Delete Attachment" : "Excluir Anexo",
@@ -212,13 +210,13 @@
"Created" : "Criado", "Created" : "Criado",
"The title cannot be empty." : "O título não pode ficar em branco.", "The title cannot be empty." : "O título não pode ficar em branco.",
"No comments yet. Begin the discussion!" : "Nenhum comentário ainda. Inicie a conversa!", "No comments yet. Begin the discussion!" : "Nenhum comentário ainda. Inicie a conversa!",
"Failed to load comments" : "Não foi possível carregar os comentários", "Failed to load comments" : "Falha ao carregar comentários",
"Assign a tag to this card…" : "Atribuir uma etiqueta a este cartão...", "Assign a tag to this card…" : "Atribuir uma etiqueta a este cartão...",
"Assign to users" : "Atribuir a usuários", "Assign to users" : "Atribuir a usuários",
"Assign to users/groups/circles" : "Atribuir a usuários/grupos/círculos", "Assign to users/groups/circles" : "Atribuir a usuários/grupos/círculos",
"Assign a user to this card…" : "Atribuir um usuário a este cartão...", "Assign a user to this card…" : "Atribuir um usuário a este cartão...",
"Due date" : "Data de vencimento", "Due date" : "Data de vencimento",
"Set a due date" : "Definir uma data de vencimento", "Set a due date" : "Definir uma data de finalização",
"Remove due date" : "Remover data de vencimento", "Remove due date" : "Remover data de vencimento",
"Select Date" : "Selecionar Data", "Select Date" : "Selecionar Data",
"Today" : "Hoje", "Today" : "Hoje",
@@ -242,7 +240,7 @@
"Write a description …" : "Escreva uma descrição...", "Write a description …" : "Escreva uma descrição...",
"Choose attachment" : "Escolher anexo", "Choose attachment" : "Escolher anexo",
"(group)" : "(grupo)", "(group)" : "(grupo)",
"Todo items" : "Itens a fazer", "Todo items" : "Itens para fazer",
"{count} comments, {unread} unread" : "{count} comentários, {unread} não lidos", "{count} comments, {unread} unread" : "{count} comentários, {unread} não lidos",
"Edit card title" : "Editar título do cartão", "Edit card title" : "Editar título do cartão",
"Assign to me" : "Atribuir a mim", "Assign to me" : "Atribuir a mim",
@@ -252,7 +250,7 @@
"Archive card" : "Arquivar cartão", "Archive card" : "Arquivar cartão",
"Delete card" : "Excluir cartão", "Delete card" : "Excluir cartão",
"Move card to another board" : "Mover o cartão para outro painel", "Move card to another board" : "Mover o cartão para outro painel",
"List is empty" : "A lista está vazia", "List is empty" : "A Lista está vazia",
"Card deleted" : "Cartão excluído", "Card deleted" : "Cartão excluído",
"seconds ago" : "segundos atrás", "seconds ago" : "segundos atrás",
"All boards" : "Todos os painéis", "All boards" : "Todos os painéis",
@@ -260,8 +258,7 @@
"Shared with you" : "Compartilhado com você", "Shared with you" : "Compartilhado com você",
"Deck settings" : "Configurações do Deck", "Deck settings" : "Configurações do Deck",
"Use bigger card view" : "Use uma exibição de cartão maior", "Use bigger card view" : "Use uma exibição de cartão maior",
"Show card ID badge" : "Exibir o distintivo de identificação do cartão", "Show boards in calendar/tasks" : "Mostrar painéis em calendários/tarefas",
"Show boards in calendar/tasks" : "Exibir os painéis em calendários/tarefas",
"Limit deck usage of groups" : "Limitar o uso de grupos no deck", "Limit deck usage of groups" : "Limitar o uso de grupos no deck",
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Limitar o Deck impedirá que usuários que não fazem parte desses grupos criem seus próprios painéis. Os usuários ainda poderão trabalhar em pastas que foram compartilhadas com eles.", "Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Limitar o Deck impedirá que usuários que não fazem parte desses grupos criem seus próprios painéis. Os usuários ainda poderão trabalhar em pastas que foram compartilhadas com eles.",
"Board details" : "Detalhes do painel", "Board details" : "Detalhes do painel",
@@ -280,20 +277,20 @@
"Only assigned cards" : "Apenas cartões atribuídos", "Only assigned cards" : "Apenas cartões atribuídos",
"No reminder" : "Nenhum lembrete", "No reminder" : "Nenhum lembrete",
"An error occurred" : "Ocorreu um erro", "An error occurred" : "Ocorreu um erro",
"Are you sure you want to delete the board {title}? This will delete all the data of this board including archived cards." : "Deseja realmente excluir o painel {title}? Isso excluirá todos os dados deste painel, inclusive os cartões arquivados.", "Are you sure you want to delete the board {title}? This will delete all the data of this board including archived cards." : "Tem certeza de que deseja excluir o quadro {title}? Isso excluirá todos os dados deste quadro, incluindo cartões arquivados.",
"Delete the board?" : "Excluir o painel?", "Delete the board?" : "Excluir o painel?",
"Loading filtered view" : "Carregando exibição filtrada", "Loading filtered view" : "Carregando exibição filtrada",
"No due" : "Sem vencimento", "No due" : "Sem vencimento",
"Search for {searchQuery} in all boards" : "Pesquisar por {searchQuery} em todos os painéis", "Search for {searchQuery} in all boards" : "Pesquisar por {searchQuery} em todos os painéis",
"No results found" : "Nenhum resultado encontrado", "No results found" : "Nenhum resultado encontrado",
"{stack} in {board}" : "{stack} em {board}", "{stack} in {board}" : "{stack} de {board}",
"Click to expand description" : "Clique para expandir a descrição", "Click to expand description" : "Clique para expandir a descrição",
"* Created on {created}\n* Last modified on {lastMod}\n* {nbAttachments} attachments\n* {nbComments} comments" : "* Criado em {created}\n* Última modificação em {lastMod}\n* {nbAttachments} anexos\n* {nbComments} comentários", "* Created on {created}\n* Last modified on {lastMod}\n* {nbAttachments} attachments\n* {nbComments} comments" : "* Criado em {created}\n* Última modificação em {lastMod}\n* {nbAttachments} anexos\n* {nbComments} comentários",
"{nbCards} cards" : "{nbCards} cartões", "{nbCards} cards" : "{nbCards} cartões",
"No upcoming cards" : "Não há mais cartões", "No upcoming cards" : "Não há mais cartões",
"upcoming cards" : "próximos cartões", "upcoming cards" : "próximos cartões",
"Due on {date}" : "Vencimento em {date}", "Due on {date}" : "Vencimento em {date}",
"Link to a board" : "Vincular a um painel", "Link to a board" : "Linkar a um painel",
"Link to a card" : "Vincular a um cartão", "Link to a card" : "Vincular a um cartão",
"Create a card" : "Criar um cartão", "Create a card" : "Criar um cartão",
"Message from {author} in {conversationName}" : "Mensagem de {author} em {conversationName}", "Message from {author} in {conversationName}" : "Mensagem de {author} em {conversationName}",
@@ -305,11 +302,11 @@
"Share {file} with a Deck card" : "Compartilhar {file} com um cartão Deck", "Share {file} with a Deck card" : "Compartilhar {file} com um cartão Deck",
"Share" : "Compartilhar", "Share" : "Compartilhar",
"Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck é uma ferramenta de organização de estilo kanban destinada ao planejamento pessoal e organização para equipes integradas com o Nextcloud.\n\n\n- 📥 Adicione suas tarefas aos cartões e coloque-os em ordem\n- 📄 Insira notas adicionais em markdown\n- 🔖 Atribua etiquetas para melhorar a organização\n- 👥 Compartilhe com sua equipe, amigos ou familiares\n- 📎 Anexe arquivos e incorpore-os em sua descrição no markdown\n- 💬 Discuta com sua equipe usando os comentários\n- ⚡ Acompanhe as alterações no fluxo de atividades\n- 🚀 Mantenha seu projeto organizado", "Deck is a kanban style organization tool aimed at personal planning and project organization for teams integrated with Nextcloud.\n\n\n- 📥 Add your tasks to cards and put them in order\n- 📄 Write down additional notes in markdown\n- 🔖 Assign labels for even better organization\n- 👥 Share with your team, friends or family\n- 📎 Attach files and embed them in your markdown description\n- 💬 Discuss with your team using comments\n- ⚡ Keep track of changes in the activity stream\n- 🚀 Get your project organized" : "Deck é uma ferramenta de organização de estilo kanban destinada ao planejamento pessoal e organização para equipes integradas com o Nextcloud.\n\n\n- 📥 Adicione suas tarefas aos cartões e coloque-os em ordem\n- 📄 Insira notas adicionais em markdown\n- 🔖 Atribua etiquetas para melhorar a organização\n- 👥 Compartilhe com sua equipe, amigos ou familiares\n- 📎 Anexe arquivos e incorpore-os em sua descrição no markdown\n- 💬 Discuta com sua equipe usando os comentários\n- ⚡ Acompanhe as alterações no fluxo de atividades\n- 🚀 Mantenha seu projeto organizado",
"Are you sure you want to transfer the board {title} for {user} ?" : "Deseja realmente transferir o painel {title} para {user}?", "Are you sure you want to transfer the board {title} for {user} ?" : "Tem certeza de que deseja transferir o quadro {title} para {user}?",
"Transfer the board for {user} successfully" : "O painel foi transferido para {user} com sucesso", "Transfer the board for {user} successfully" : "Transferida a reunião para {user} com sucesso",
"Failed to transfer the board for {user}" : "Não foi possível transferir o painel para {user}", "Failed to transfer the board for {user}" : "Falha ao transferir a reunião para {user}",
"Are you sure you want to delete the board {title}? This will delete all the data of this board." : "Deseja realmente excluir o painel {title}? Isto excluirá todos os dados deste painel.", "Are you sure you want to delete the board {title}? This will delete all the data of this board." : "Deseja realmente excluir o painel {title}? Isto excluirá todos os dados deste painel.",
"This week" : "Esta semana", "This week" : "Esta semana",
"Are you sure you want to transfer the board {title} for {user}?" : "Deseja realmente transferir o painel {title} para {user}?" "Are you sure you want to transfer the board {title} for {user}?" : "Tem certeza de que deseja transferir o quadro {title} para {user}?"
},"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;" },"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
} }
-9
View File
@@ -183,10 +183,8 @@ OC.L10N.register(
"Failed to transfer the board to {user}" : "Не удалось передать доску пользователю {user}", "Failed to transfer the board to {user}" : "Не удалось передать доску пользователю {user}",
"Add a new list" : "Создать список", "Add a new list" : "Создать список",
"Archive all cards" : "Переместить все карточки в архив", "Archive all cards" : "Переместить все карточки в архив",
"Unarchive all cards" : "Восстановить все карточки из архива",
"Delete list" : "Удалить список", "Delete list" : "Удалить список",
"Archive all cards in this list" : "Переместить в архив все карточки текущего списка", "Archive all cards in this list" : "Переместить в архив все карточки текущего списка",
"Unarchive all cards in this list" : "Восстановить из архива все карточки списка",
"Add a new card" : "Создать карточку", "Add a new card" : "Создать карточку",
"Card name" : "Название карточки", "Card name" : "Название карточки",
"List deleted" : "Список удалён", "List deleted" : "Список удалён",
@@ -244,9 +242,7 @@ OC.L10N.register(
"Write a description …" : "Добавьте описание...", "Write a description …" : "Добавьте описание...",
"Choose attachment" : "Выберите вложение", "Choose attachment" : "Выберите вложение",
"(group)" : "(группа)", "(group)" : "(группа)",
"Todo items" : "Элементы списка задач",
"{count} comments, {unread} unread" : "{count} комментариев, {unread} непрочитано", "{count} comments, {unread} unread" : "{count} комментариев, {unread} непрочитано",
"Edit card title" : "Изменить заголовок карточки",
"Assign to me" : "Назначить себе", "Assign to me" : "Назначить себе",
"Unassign myself" : "Отказаться от назначения", "Unassign myself" : "Отказаться от назначения",
"Move card" : "Переместить карточку", "Move card" : "Переместить карточку",
@@ -260,9 +256,7 @@ OC.L10N.register(
"All boards" : "Все доски", "All boards" : "Все доски",
"Archived boards" : "Архив досок", "Archived boards" : "Архив досок",
"Shared with you" : "Предоставленные вам", "Shared with you" : "Предоставленные вам",
"Deck settings" : "Параметры карточек",
"Use bigger card view" : "Режим просмотра с увеличенными карточками", "Use bigger card view" : "Режим просмотра с увеличенными карточками",
"Show card ID badge" : "Показывать идентификатор карточки",
"Show boards in calendar/tasks" : "Показывать карточки в календаре и задачах", "Show boards in calendar/tasks" : "Показывать карточки в календаре и задачах",
"Limit deck usage of groups" : "Разрешить использовать приложение Карточки только участникам заданных групп", "Limit deck usage of groups" : "Разрешить использовать приложение Карточки только участникам заданных групп",
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Создание собственных рабочих досок пользователям, не входящим в заданные группы, будет заблокировано. Тем не менее, такие пользователи смогут продолжить работать с общими досками, к которым у них есть доступ. ", "Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Создание собственных рабочих досок пользователям, не входящим в заданные группы, будет заблокировано. Тем не менее, такие пользователи смогут продолжить работать с общими досками, к которым у них есть доступ. ",
@@ -282,15 +276,12 @@ OC.L10N.register(
"Only assigned cards" : "Только для назначенных карточек", "Only assigned cards" : "Только для назначенных карточек",
"No reminder" : "Не напоминать", "No reminder" : "Не напоминать",
"An error occurred" : "Произошла ошибка", "An error occurred" : "Произошла ошибка",
"Are you sure you want to delete the board {title}? This will delete all the data of this board including archived cards." : "Подтвердите удаление доски «{title}»; это действие приведёт к удалению также все данных, принадлежащих этой доске, включая карточки в архиве.",
"Delete the board?" : "Удалить доску?", "Delete the board?" : "Удалить доску?",
"Loading filtered view" : "Выполняется отбор", "Loading filtered view" : "Выполняется отбор",
"No due" : "Без назначенной даты", "No due" : "Без назначенной даты",
"Search for {searchQuery} in all boards" : "Искать {searchQuery} на всех досках", "Search for {searchQuery} in all boards" : "Искать {searchQuery} на всех досках",
"No results found" : "Результаты отсутствуют", "No results found" : "Результаты отсутствуют",
"{stack} in {board}" : "«{stack}» с доски «{board}»", "{stack} in {board}" : "«{stack}» с доски «{board}»",
"Click to expand description" : "Нажмите, чтобы развернуть поле описания",
"{nbCards} cards" : "карточек: {nbCards}",
"No upcoming cards" : "Отсутствуют карточки, ожидающие выполнения", "No upcoming cards" : "Отсутствуют карточки, ожидающие выполнения",
"upcoming cards" : "карточки, ожидающие выполнения", "upcoming cards" : "карточки, ожидающие выполнения",
"Link to a board" : "Ссылка на доску", "Link to a board" : "Ссылка на доску",
-9
View File
@@ -181,10 +181,8 @@
"Failed to transfer the board to {user}" : "Не удалось передать доску пользователю {user}", "Failed to transfer the board to {user}" : "Не удалось передать доску пользователю {user}",
"Add a new list" : "Создать список", "Add a new list" : "Создать список",
"Archive all cards" : "Переместить все карточки в архив", "Archive all cards" : "Переместить все карточки в архив",
"Unarchive all cards" : "Восстановить все карточки из архива",
"Delete list" : "Удалить список", "Delete list" : "Удалить список",
"Archive all cards in this list" : "Переместить в архив все карточки текущего списка", "Archive all cards in this list" : "Переместить в архив все карточки текущего списка",
"Unarchive all cards in this list" : "Восстановить из архива все карточки списка",
"Add a new card" : "Создать карточку", "Add a new card" : "Создать карточку",
"Card name" : "Название карточки", "Card name" : "Название карточки",
"List deleted" : "Список удалён", "List deleted" : "Список удалён",
@@ -242,9 +240,7 @@
"Write a description …" : "Добавьте описание...", "Write a description …" : "Добавьте описание...",
"Choose attachment" : "Выберите вложение", "Choose attachment" : "Выберите вложение",
"(group)" : "(группа)", "(group)" : "(группа)",
"Todo items" : "Элементы списка задач",
"{count} comments, {unread} unread" : "{count} комментариев, {unread} непрочитано", "{count} comments, {unread} unread" : "{count} комментариев, {unread} непрочитано",
"Edit card title" : "Изменить заголовок карточки",
"Assign to me" : "Назначить себе", "Assign to me" : "Назначить себе",
"Unassign myself" : "Отказаться от назначения", "Unassign myself" : "Отказаться от назначения",
"Move card" : "Переместить карточку", "Move card" : "Переместить карточку",
@@ -258,9 +254,7 @@
"All boards" : "Все доски", "All boards" : "Все доски",
"Archived boards" : "Архив досок", "Archived boards" : "Архив досок",
"Shared with you" : "Предоставленные вам", "Shared with you" : "Предоставленные вам",
"Deck settings" : "Параметры карточек",
"Use bigger card view" : "Режим просмотра с увеличенными карточками", "Use bigger card view" : "Режим просмотра с увеличенными карточками",
"Show card ID badge" : "Показывать идентификатор карточки",
"Show boards in calendar/tasks" : "Показывать карточки в календаре и задачах", "Show boards in calendar/tasks" : "Показывать карточки в календаре и задачах",
"Limit deck usage of groups" : "Разрешить использовать приложение Карточки только участникам заданных групп", "Limit deck usage of groups" : "Разрешить использовать приложение Карточки только участникам заданных групп",
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Создание собственных рабочих досок пользователям, не входящим в заданные группы, будет заблокировано. Тем не менее, такие пользователи смогут продолжить работать с общими досками, к которым у них есть доступ. ", "Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Создание собственных рабочих досок пользователям, не входящим в заданные группы, будет заблокировано. Тем не менее, такие пользователи смогут продолжить работать с общими досками, к которым у них есть доступ. ",
@@ -280,15 +274,12 @@
"Only assigned cards" : "Только для назначенных карточек", "Only assigned cards" : "Только для назначенных карточек",
"No reminder" : "Не напоминать", "No reminder" : "Не напоминать",
"An error occurred" : "Произошла ошибка", "An error occurred" : "Произошла ошибка",
"Are you sure you want to delete the board {title}? This will delete all the data of this board including archived cards." : "Подтвердите удаление доски «{title}»; это действие приведёт к удалению также все данных, принадлежащих этой доске, включая карточки в архиве.",
"Delete the board?" : "Удалить доску?", "Delete the board?" : "Удалить доску?",
"Loading filtered view" : "Выполняется отбор", "Loading filtered view" : "Выполняется отбор",
"No due" : "Без назначенной даты", "No due" : "Без назначенной даты",
"Search for {searchQuery} in all boards" : "Искать {searchQuery} на всех досках", "Search for {searchQuery} in all boards" : "Искать {searchQuery} на всех досках",
"No results found" : "Результаты отсутствуют", "No results found" : "Результаты отсутствуют",
"{stack} in {board}" : "«{stack}» с доски «{board}»", "{stack} in {board}" : "«{stack}» с доски «{board}»",
"Click to expand description" : "Нажмите, чтобы развернуть поле описания",
"{nbCards} cards" : "карточек: {nbCards}",
"No upcoming cards" : "Отсутствуют карточки, ожидающие выполнения", "No upcoming cards" : "Отсутствуют карточки, ожидающие выполнения",
"upcoming cards" : "карточки, ожидающие выполнения", "upcoming cards" : "карточки, ожидающие выполнения",
"Link to a board" : "Ссылка на доску", "Link to a board" : "Ссылка на доску",
-3
View File
@@ -183,10 +183,8 @@ OC.L10N.register(
"Failed to transfer the board to {user}" : "Chyba pri presune nástenky na {user}", "Failed to transfer the board to {user}" : "Chyba pri presune nástenky na {user}",
"Add a new list" : "Pridať nový zoznam", "Add a new list" : "Pridať nový zoznam",
"Archive all cards" : "Archivovať všetky karty", "Archive all cards" : "Archivovať všetky karty",
"Unarchive all cards" : "Zrušiť archiváciu všetkých kariet",
"Delete list" : "Vymazať zoznam", "Delete list" : "Vymazať zoznam",
"Archive all cards in this list" : "Archivovať všetky karty v tomto zozname", "Archive all cards in this list" : "Archivovať všetky karty v tomto zozname",
"Unarchive all cards in this list" : "Zrušiť archiváciu všetkých kariet v tomto zozname",
"Add a new card" : "Pridať novú kartu", "Add a new card" : "Pridať novú kartu",
"Card name" : "Názov karty", "Card name" : "Názov karty",
"List deleted" : "Zoznam bol vymazaný", "List deleted" : "Zoznam bol vymazaný",
@@ -262,7 +260,6 @@ OC.L10N.register(
"Shared with you" : "Vám sprístupnené", "Shared with you" : "Vám sprístupnené",
"Deck settings" : "Nastavenia paluby", "Deck settings" : "Nastavenia paluby",
"Use bigger card view" : "Použiť väčšie zobrazenie karty", "Use bigger card view" : "Použiť väčšie zobrazenie karty",
"Show card ID badge" : "Ukázať ID karty",
"Show boards in calendar/tasks" : "Zobrazovať nástenky v kalendári/úlohách", "Show boards in calendar/tasks" : "Zobrazovať nástenky v kalendári/úlohách",
"Limit deck usage of groups" : "Obmedziť použitie Deck na skupiny", "Limit deck usage of groups" : "Obmedziť použitie Deck na skupiny",
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Obmedzenie Násteniek bráni používateľom, ktorí nie sú súčasťou týchto skupín, aby si vytvárali vlastné nástenky. Môžu však stále pracovať na nástenkách, ktoré im niekto sprístupní.", "Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Obmedzenie Násteniek bráni používateľom, ktorí nie sú súčasťou týchto skupín, aby si vytvárali vlastné nástenky. Môžu však stále pracovať na nástenkách, ktoré im niekto sprístupní.",
-3
View File
@@ -181,10 +181,8 @@
"Failed to transfer the board to {user}" : "Chyba pri presune nástenky na {user}", "Failed to transfer the board to {user}" : "Chyba pri presune nástenky na {user}",
"Add a new list" : "Pridať nový zoznam", "Add a new list" : "Pridať nový zoznam",
"Archive all cards" : "Archivovať všetky karty", "Archive all cards" : "Archivovať všetky karty",
"Unarchive all cards" : "Zrušiť archiváciu všetkých kariet",
"Delete list" : "Vymazať zoznam", "Delete list" : "Vymazať zoznam",
"Archive all cards in this list" : "Archivovať všetky karty v tomto zozname", "Archive all cards in this list" : "Archivovať všetky karty v tomto zozname",
"Unarchive all cards in this list" : "Zrušiť archiváciu všetkých kariet v tomto zozname",
"Add a new card" : "Pridať novú kartu", "Add a new card" : "Pridať novú kartu",
"Card name" : "Názov karty", "Card name" : "Názov karty",
"List deleted" : "Zoznam bol vymazaný", "List deleted" : "Zoznam bol vymazaný",
@@ -260,7 +258,6 @@
"Shared with you" : "Vám sprístupnené", "Shared with you" : "Vám sprístupnené",
"Deck settings" : "Nastavenia paluby", "Deck settings" : "Nastavenia paluby",
"Use bigger card view" : "Použiť väčšie zobrazenie karty", "Use bigger card view" : "Použiť väčšie zobrazenie karty",
"Show card ID badge" : "Ukázať ID karty",
"Show boards in calendar/tasks" : "Zobrazovať nástenky v kalendári/úlohách", "Show boards in calendar/tasks" : "Zobrazovať nástenky v kalendári/úlohách",
"Limit deck usage of groups" : "Obmedziť použitie Deck na skupiny", "Limit deck usage of groups" : "Obmedziť použitie Deck na skupiny",
"Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Obmedzenie Násteniek bráni používateľom, ktorí nie sú súčasťou týchto skupín, aby si vytvárali vlastné nástenky. Môžu však stále pracovať na nástenkách, ktoré im niekto sprístupní.", "Limiting Deck will block users not part of those groups from creating their own boards. Users will still be able to work on boards that have been shared with them." : "Obmedzenie Násteniek bráni používateľom, ktorí nie sú súčasťou týchto skupín, aby si vytvárali vlastné nástenky. Môžu však stále pracovať na nástenkách, ktoré im niekto sprístupní.",
+1 -1
View File
@@ -260,7 +260,7 @@ OC.L10N.register(
"All boards" : "Alla tavlor", "All boards" : "Alla tavlor",
"Archived boards" : "Arkiverade tavlor", "Archived boards" : "Arkiverade tavlor",
"Shared with you" : "Delad med dig", "Shared with you" : "Delad med dig",
"Deck settings" : "Deck-inställningar", "Deck settings" : "Deckinställningar",
"Use bigger card view" : "Visa större kort", "Use bigger card view" : "Visa större kort",
"Show card ID badge" : "Visa kortets ID-märke", "Show card ID badge" : "Visa kortets ID-märke",
"Show boards in calendar/tasks" : "Visa tavlor i kalender / uppgifter", "Show boards in calendar/tasks" : "Visa tavlor i kalender / uppgifter",
+1 -1
View File
@@ -258,7 +258,7 @@
"All boards" : "Alla tavlor", "All boards" : "Alla tavlor",
"Archived boards" : "Arkiverade tavlor", "Archived boards" : "Arkiverade tavlor",
"Shared with you" : "Delad med dig", "Shared with you" : "Delad med dig",
"Deck settings" : "Deck-inställningar", "Deck settings" : "Deckinställningar",
"Use bigger card view" : "Visa större kort", "Use bigger card view" : "Visa större kort",
"Show card ID badge" : "Visa kortets ID-märke", "Show card ID badge" : "Visa kortets ID-märke",
"Show boards in calendar/tasks" : "Visa tavlor i kalender / uppgifter", "Show boards in calendar/tasks" : "Visa tavlor i kalender / uppgifter",
+3 -3
View File
@@ -11,7 +11,7 @@ OC.L10N.register(
"{user} has shared the board {board} with {acl}" : "{user} поділився дошкою {board} з {acl}", "{user} has shared the board {board} with {acl}" : "{user} поділився дошкою {board} з {acl}",
"You have removed {acl} from the board {board}" : "Ви вилучили {acl} з дошки {board}", "You have removed {acl} from the board {board}" : "Ви вилучили {acl} з дошки {board}",
"{user} has removed {acl} from the board {board}" : "{user} вилучив {acl} з дошки {board}", "{user} has removed {acl} from the board {board}" : "{user} вилучив {acl} з дошки {board}",
"You have renamed the board {before} to {board}" : "Ви перейменували дошку з {before} на {board}", "You have renamed the board {before} to {board}" : "Ви перейменували дошку з {before} у {board}",
"{user} has renamed the board {before} to {board}" : "{user} змінив назву дошки {before} на {board}", "{user} has renamed the board {before} to {board}" : "{user} змінив назву дошки {before} на {board}",
"You have archived the board {board}" : "Ви заархівували дошку {board}", "You have archived the board {board}" : "Ви заархівували дошку {board}",
"{user} has archived the board {before}" : "{user} заархівував дошку {before}", "{user} has archived the board {before}" : "{user} заархівував дошку {before}",
@@ -125,7 +125,7 @@ OC.L10N.register(
"Upload new files" : "Додати файл", "Upload new files" : "Додати файл",
"Share from Files" : "Відкрити Файли", "Share from Files" : "Відкрити Файли",
"Add this attachment" : "Долучити вкладення", "Add this attachment" : "Долучити вкладення",
"Download" : "Звантажити", "Download" : "Завантажити",
"Delete Attachment" : "Забрати вкладення", "Delete Attachment" : "Забрати вкладення",
"Restore Attachment" : "Відновити вкладення", "Restore Attachment" : "Відновити вкладення",
"File to share" : "Виберіть файл для надання доступу", "File to share" : "Виберіть файл для надання доступу",
@@ -190,7 +190,7 @@ OC.L10N.register(
"Something went wrong" : "От халепа!", "Something went wrong" : "От халепа!",
"Maximum file size of {size} exceeded" : "Досягнуто максимальний розмір файлу {size}", "Maximum file size of {size} exceeded" : "Досягнуто максимальний розмір файлу {size}",
"Error creating the share" : "Помилка створення спільного доступу", "Error creating the share" : "Помилка створення спільного доступу",
"Share" : "Спільний доступ", "Share" : "Поділитися",
"This week" : "Цього тижня" "This week" : "Цього тижня"
}, },
"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);"); "nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);");
+3 -3
View File
@@ -9,7 +9,7 @@
"{user} has shared the board {board} with {acl}" : "{user} поділився дошкою {board} з {acl}", "{user} has shared the board {board} with {acl}" : "{user} поділився дошкою {board} з {acl}",
"You have removed {acl} from the board {board}" : "Ви вилучили {acl} з дошки {board}", "You have removed {acl} from the board {board}" : "Ви вилучили {acl} з дошки {board}",
"{user} has removed {acl} from the board {board}" : "{user} вилучив {acl} з дошки {board}", "{user} has removed {acl} from the board {board}" : "{user} вилучив {acl} з дошки {board}",
"You have renamed the board {before} to {board}" : "Ви перейменували дошку з {before} на {board}", "You have renamed the board {before} to {board}" : "Ви перейменували дошку з {before} у {board}",
"{user} has renamed the board {before} to {board}" : "{user} змінив назву дошки {before} на {board}", "{user} has renamed the board {before} to {board}" : "{user} змінив назву дошки {before} на {board}",
"You have archived the board {board}" : "Ви заархівували дошку {board}", "You have archived the board {board}" : "Ви заархівували дошку {board}",
"{user} has archived the board {before}" : "{user} заархівував дошку {before}", "{user} has archived the board {before}" : "{user} заархівував дошку {before}",
@@ -123,7 +123,7 @@
"Upload new files" : "Додати файл", "Upload new files" : "Додати файл",
"Share from Files" : "Відкрити Файли", "Share from Files" : "Відкрити Файли",
"Add this attachment" : "Долучити вкладення", "Add this attachment" : "Долучити вкладення",
"Download" : "Звантажити", "Download" : "Завантажити",
"Delete Attachment" : "Забрати вкладення", "Delete Attachment" : "Забрати вкладення",
"Restore Attachment" : "Відновити вкладення", "Restore Attachment" : "Відновити вкладення",
"File to share" : "Виберіть файл для надання доступу", "File to share" : "Виберіть файл для надання доступу",
@@ -188,7 +188,7 @@
"Something went wrong" : "От халепа!", "Something went wrong" : "От халепа!",
"Maximum file size of {size} exceeded" : "Досягнуто максимальний розмір файлу {size}", "Maximum file size of {size} exceeded" : "Досягнуто максимальний розмір файлу {size}",
"Error creating the share" : "Помилка створення спільного доступу", "Error creating the share" : "Помилка створення спільного доступу",
"Share" : "Спільний доступ", "Share" : "Поділитися",
"This week" : "Цього тижня" "This week" : "Цього тижня"
},"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);" },"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);"
} }
-3
View File
@@ -134,7 +134,6 @@ OC.L10N.register(
"Archived cards" : "已归档卡片", "Archived cards" : "已归档卡片",
"Add list" : "添加列表", "Add list" : "添加列表",
"List name" : "列表名称", "List name" : "列表名称",
"Active filters" : "已开启的过滤器",
"Apply filter" : "应用筛选", "Apply filter" : "应用筛选",
"Filter by tag" : "按标签筛选", "Filter by tag" : "按标签筛选",
"Filter by assigned user" : "按指派的用户筛选", "Filter by assigned user" : "按指派的用户筛选",
@@ -236,9 +235,7 @@ OC.L10N.register(
"Write a description …" : "写一段描述", "Write a description …" : "写一段描述",
"Choose attachment" : "选择附件", "Choose attachment" : "选择附件",
"(group)" : "(组)", "(group)" : "(组)",
"Todo items" : "待办事项",
"{count} comments, {unread} unread" : "{count} 条评论,{unread} 未读", "{count} comments, {unread} unread" : "{count} 条评论,{unread} 未读",
"Edit card title" : "编辑卡片标题",
"Assign to me" : "指派给我", "Assign to me" : "指派给我",
"Unassign myself" : "不再指派给我", "Unassign myself" : "不再指派给我",
"Move card" : "移动卡片", "Move card" : "移动卡片",
-3
View File
@@ -132,7 +132,6 @@
"Archived cards" : "已归档卡片", "Archived cards" : "已归档卡片",
"Add list" : "添加列表", "Add list" : "添加列表",
"List name" : "列表名称", "List name" : "列表名称",
"Active filters" : "已开启的过滤器",
"Apply filter" : "应用筛选", "Apply filter" : "应用筛选",
"Filter by tag" : "按标签筛选", "Filter by tag" : "按标签筛选",
"Filter by assigned user" : "按指派的用户筛选", "Filter by assigned user" : "按指派的用户筛选",
@@ -234,9 +233,7 @@
"Write a description …" : "写一段描述", "Write a description …" : "写一段描述",
"Choose attachment" : "选择附件", "Choose attachment" : "选择附件",
"(group)" : "(组)", "(group)" : "(组)",
"Todo items" : "待办事项",
"{count} comments, {unread} unread" : "{count} 条评论,{unread} 未读", "{count} comments, {unread} unread" : "{count} 条评论,{unread} 未读",
"Edit card title" : "编辑卡片标题",
"Assign to me" : "指派给我", "Assign to me" : "指派给我",
"Unassign myself" : "不再指派给我", "Unassign myself" : "不再指派给我",
"Move card" : "移动卡片", "Move card" : "移动卡片",
-21
View File
@@ -39,7 +39,6 @@ use OCA\Deck\Db\CardMapper;
use OCA\Deck\Db\Label; use OCA\Deck\Db\Label;
use OCA\Deck\Db\Stack; use OCA\Deck\Db\Stack;
use OCA\Deck\Db\StackMapper; use OCA\Deck\Db\StackMapper;
use OCA\Deck\NoPermissionException;
use OCA\Deck\Service\PermissionService; use OCA\Deck\Service\PermissionService;
use OCP\Activity\IEvent; use OCP\Activity\IEvent;
use OCP\Activity\IManager; use OCP\Activity\IManager;
@@ -544,24 +543,4 @@ class ActivityManager {
'board' => $board 'board' => $board
]; ];
} }
public function canSeeCardActivity(int $cardId): bool {
try {
$this->permissionService->checkPermission($this->cardMapper, $cardId, Acl::PERMISSION_READ);
$card = $this->cardMapper->find($cardId);
return $card->getDeletedAt() === 0;
} catch (NoPermissionException $e) {
return false;
}
}
public function canSeeBoardActivity(int $boardId): bool {
try {
$this->permissionService->checkPermission($this->boardMapper, $boardId, Acl::PERMISSION_READ);
$board = $this->boardMapper->find($boardId);
return $board->getDeletedAt() === 0;
} catch (NoPermissionException $e) {
return false;
}
}
} }
+1 -8
View File
@@ -111,9 +111,6 @@ class DeckProvider implements IProvider {
$event->setAuthor($author); $event->setAuthor($author);
} }
if ($event->getObjectType() === ActivityManager::DECK_OBJECT_BOARD) { if ($event->getObjectType() === ActivityManager::DECK_OBJECT_BOARD) {
if (!$this->activityManager->canSeeBoardActivity($event->getObjectId())) {
throw new \InvalidArgumentException();
}
if (isset($subjectParams['board']) && $event->getObjectName() === '') { if (isset($subjectParams['board']) && $event->getObjectName() === '') {
$event->setObject($event->getObjectType(), $event->getObjectId(), $subjectParams['board']['title']); $event->setObject($event->getObjectType(), $event->getObjectId(), $subjectParams['board']['title']);
} }
@@ -124,13 +121,9 @@ class DeckProvider implements IProvider {
'link' => $this->deckUrl('/board/' . $event->getObjectId()), 'link' => $this->deckUrl('/board/' . $event->getObjectId()),
]; ];
$params['board'] = $board; $params['board'] = $board;
$event->setLink($this->deckUrl('/board/' . $event->getObjectId()));
} }
if (isset($subjectParams['card']) && $event->getObjectType() === ActivityManager::DECK_OBJECT_CARD) { if (isset($subjectParams['card']) && $event->getObjectType() === ActivityManager::DECK_OBJECT_CARD) {
if (!$this->activityManager->canSeeCardActivity($event->getObjectId())) {
throw new \InvalidArgumentException();
}
if ($event->getObjectName() === '') { if ($event->getObjectName() === '') {
$event->setObject($event->getObjectType(), $event->getObjectId(), $subjectParams['card']['title']); $event->setObject($event->getObjectType(), $event->getObjectId(), $subjectParams['card']['title']);
} }
@@ -141,8 +134,8 @@ class DeckProvider implements IProvider {
]; ];
if (array_key_exists('board', $subjectParams)) { if (array_key_exists('board', $subjectParams)) {
$archivedParam = $subjectParams['card']['archived'] ? 'archived/' : '';
$card['link'] = $this->cardService->getRedirectUrlForCard($event->getObjectId()); $card['link'] = $this->cardService->getRedirectUrlForCard($event->getObjectId());
$event->setLink($card['link']);
} }
$params['card'] = $card; $params['card'] = $card;
} }
@@ -100,15 +100,12 @@ class ResourceProvider implements IProvider {
if ($board->getOwner() === $user->getUID()) { if ($board->getOwner() === $user->getUID()) {
return true; return true;
} }
if ($board->getAcl() === null) {
return false;
}
return $this->permissionService->userCan($board->getAcl(), Acl::PERMISSION_READ, $user->getUID()); return $this->permissionService->userCan($board->getAcl(), Acl::PERMISSION_READ, $user->getUID());
} }
private function getBoard(IResource $resource) { private function getBoard(IResource $resource) {
try { try {
return $this->boardMapper->find((int)$resource->getId(), false, true); return $this->boardMapper->find($resource->getId(), false, true);
} catch (DoesNotExistException $e) { } catch (DoesNotExistException $e) {
} catch (MultipleObjectsReturnedException $e) { } catch (MultipleObjectsReturnedException $e) {
return null; return null;
@@ -127,9 +127,6 @@ class ResourceProviderCard implements IProvider {
if ($board->getOwner() === $user->getUID()) { if ($board->getOwner() === $user->getUID()) {
return true; return true;
} }
if ($board->getAcl() === null) {
return false;
}
return $this->permissionService->userCan($board->getAcl(), Acl::PERMISSION_READ, $user->getUID()); return $this->permissionService->userCan($board->getAcl(), Acl::PERMISSION_READ, $user->getUID());
} }
+9 -17
View File
@@ -52,6 +52,12 @@ class Calendar extends ExternalCalendar {
$this->board = $board; $this->board = $board;
$this->principalUri = $principalUri; $this->principalUri = $principalUri;
if ($board) {
$this->children = $this->backend->getChildren($board->getId());
} else {
$this->children = [];
}
} }
public function getOwner() { public function getOwner() {
@@ -116,7 +122,7 @@ class Calendar extends ExternalCalendar {
public function getChild($name) { public function getChild($name) {
if ($this->childExists($name)) { if ($this->childExists($name)) {
$card = array_values(array_filter( $card = array_values(array_filter(
$this->getBackendChildren(), $this->children,
function ($card) use (&$name) { function ($card) use (&$name) {
return $card->getCalendarPrefix() . '-' . $card->getId() . '.ics' === $name; return $card->getCalendarPrefix() . '-' . $card->getId() . '.ics' === $name;
} }
@@ -131,7 +137,7 @@ class Calendar extends ExternalCalendar {
public function getChildren() { public function getChildren() {
$childNames = array_map(function ($card) { $childNames = array_map(function ($card) {
return $card->getCalendarPrefix() . '-' . $card->getId() . '.ics'; return $card->getCalendarPrefix() . '-' . $card->getId() . '.ics';
}, $this->getBackendChildren()); }, $this->children);
$children = []; $children = [];
@@ -142,23 +148,9 @@ class Calendar extends ExternalCalendar {
return $children; return $children;
} }
private function getBackendChildren() {
if ($this->children) {
return $this->children;
}
if ($this->board) {
$this->children = $this->backend->getChildren($this->board->getId());
} else {
$this->children = [];
}
return $this->children;
}
public function childExists($name) { public function childExists($name) {
return count(array_filter( return count(array_filter(
$this->getBackendChildren(), $this->children,
function ($card) use (&$name) { function ($card) use (&$name) {
return $card->getCalendarPrefix() . '-' . $card->getId() . '.ics' === $name; return $card->getCalendarPrefix() . '-' . $card->getId() . '.ics' === $name;
} }
+3 -3
View File
@@ -67,13 +67,13 @@ class AttachmentMapper extends DeckMapper implements IPermissionMapper {
$row = $cursor->fetch(PDO::FETCH_ASSOC); $row = $cursor->fetch(PDO::FETCH_ASSOC);
if ($row === false) { if ($row === false) {
$cursor->closeCursor(); $cursor->closeCursor();
throw new DoesNotExistException('Did expect one result but found none when executing query: ' . $qb->getSQL()); throw new DoesNotExistException('Did expect one result but found none when executing' . $qb);
} }
$row2 = $cursor->fetch(); $row2 = $cursor->fetch();
$cursor->closeCursor(); $cursor->closeCursor();
if ($row2 !== false) { if ($row2 !== false) {
throw new MultipleObjectsReturnedException('Did not expect more than one result when executing query: ' . $qb->getSQL()); throw new MultipleObjectsReturnedException('Did not expect more than one result when executing' . $qb);
} }
return $this->mapRowToEntity($row); return $this->mapRowToEntity($row);
@@ -89,7 +89,7 @@ class AttachmentMapper extends DeckMapper implements IPermissionMapper {
$row = $cursor->fetch(PDO::FETCH_ASSOC); $row = $cursor->fetch(PDO::FETCH_ASSOC);
if ($row === false) { if ($row === false) {
$cursor->closeCursor(); $cursor->closeCursor();
throw new DoesNotExistException('Did expect one result but found none when executing query: ' . $qb->getSQL()); throw new DoesNotExistException('Did expect one result but found none when executing' . $qb);
} }
$cursor->closeCursor(); $cursor->closeCursor();
return $this->mapRowToEntity($row); return $this->mapRowToEntity($row);
+8 -20
View File
@@ -28,10 +28,8 @@ class Board extends RelationalEntity {
protected $owner; protected $owner;
protected $color; protected $color;
protected $archived = false; protected $archived = false;
/** @var Label[]|null */ protected $labels = [];
protected $labels = null; protected $acl = [];
/** @var Acl[]|null */
protected $acl = null;
protected $permissions = []; protected $permissions = [];
protected $users = []; protected $users = [];
protected $shared; protected $shared;
@@ -63,10 +61,6 @@ class Board extends RelationalEntity {
if ($this->shared === -1) { if ($this->shared === -1) {
unset($json['shared']); unset($json['shared']);
} }
// FIXME: Ideally the API responses should follow the internal data structure and return null if the labels/acls have not been fetched from the db
// however this would be a breaking change for consumers of the API
$json['acl'] = $this->acl ?? [];
$json['labels'] = $this->labels ?? [];
return $json; return $json;
} }
@@ -74,27 +68,21 @@ class Board extends RelationalEntity {
* @param Label[] $labels * @param Label[] $labels
*/ */
public function setLabels($labels) { public function setLabels($labels) {
$this->labels = $labels; foreach ($labels as $l) {
$this->labels[] = $l;
}
} }
/** /**
* @param Acl[] $acl * @param Acl[] $acl
*/ */
public function setAcl($acl) { public function setAcl($acl) {
$this->acl = $acl; foreach ($acl as $a) {
$this->acl[] = $a;
}
} }
public function getETag() { public function getETag() {
return md5((string)$this->getLastModified()); return md5((string)$this->getLastModified());
} }
/** @returns Acl[]|null */
public function getAcl(): ?array {
return $this->acl;
}
/** @returns Label[]|null */
public function getLabels(): ?array {
return $this->labels;
}
} }
+55 -233
View File
@@ -26,14 +26,13 @@ namespace OCA\Deck\Db;
use OC\Cache\CappedMemoryCache; use OC\Cache\CappedMemoryCache;
use OCA\Deck\Service\CirclesService; use OCA\Deck\Service\CirclesService;
use OCP\AppFramework\Db\DoesNotExistException; use OCP\AppFramework\Db\DoesNotExistException;
use OCP\AppFramework\Db\QBMapper;
use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\IDBConnection; use OCP\IDBConnection;
use OCP\IUserManager; use OCP\IUserManager;
use OCP\IGroupManager; use OCP\IGroupManager;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
class BoardMapper extends QBMapper implements IPermissionMapper { class BoardMapper extends DeckMapper implements IPermissionMapper {
private $labelMapper; private $labelMapper;
private $aclMapper; private $aclMapper;
private $stackMapper; private $stackMapper;
@@ -44,8 +43,6 @@ class BoardMapper extends QBMapper implements IPermissionMapper {
/** @var CappedMemoryCache */ /** @var CappedMemoryCache */
private $userBoardCache; private $userBoardCache;
/** @var CappedMemoryCache */
private $boardCache;
public function __construct( public function __construct(
IDBConnection $db, IDBConnection $db,
@@ -67,7 +64,6 @@ class BoardMapper extends QBMapper implements IPermissionMapper {
$this->logger = $logger; $this->logger = $logger;
$this->userBoardCache = new CappedMemoryCache(); $this->userBoardCache = new CappedMemoryCache();
$this->boardCache = new CappedMemoryCache();
} }
@@ -75,54 +71,40 @@ class BoardMapper extends QBMapper implements IPermissionMapper {
* @param $id * @param $id
* @param bool $withLabels * @param bool $withLabels
* @param bool $withAcl * @param bool $withAcl
* @return Board * @return \OCP\AppFramework\Db\Entity
* @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException * @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException
* @throws DoesNotExistException * @throws DoesNotExistException
*/ */
public function find(int $id, bool $withLabels = false, bool $withAcl = false, bool $allowDeleted = false): Board { public function find($id, $withLabels = false, $withAcl = false) {
if (!isset($this->boardCache[$id])) { $sql = 'SELECT id, title, owner, color, archived, deleted_at, last_modified FROM `*PREFIX*deck_boards` ' .
$qb = $this->db->getQueryBuilder(); 'WHERE `id` = ?';
$deletedWhere = $allowDeleted ? $qb->expr()->gte('deleted_at', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT)) : $qb->expr()->eq('deleted_at', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT)); $board = $this->findEntity($sql, [$id]);
$qb->select('*')
->from('deck_boards')
->where($qb->expr()->eq('id', $qb->createNamedParameter($id, IQueryBuilder::PARAM_INT)))
->andWhere($deletedWhere)
->orderBy('id');
$this->boardCache[$id] = $this->findEntity($qb);
}
// FIXME is this necessary? it was NOT done with the old mapper
// $this->mapOwner($board);
// Add labels // Add labels
if ($withLabels && $this->boardCache[$id]->getLabels() === null) { if ($withLabels) {
$labels = $this->labelMapper->findAll($id); $labels = $this->labelMapper->findAll($id);
$this->boardCache[$id]->setLabels($labels); $board->setLabels($labels);
} }
// Add acl // Add acl
if ($withAcl && $this->boardCache[$id]->getAcl() === null) { if ($withAcl) {
$acl = $this->aclMapper->findAll($id); $acl = $this->aclMapper->findAll($id);
$this->boardCache[$id]->setAcl($acl); $board->setAcl($acl);
} }
return $this->boardCache[$id]; return $board;
} }
public function findAllForUser(string $userId, ?int $since = null, bool $includeArchived = true, ?int $before = null, public function findAllForUser(string $userId, int $since = -1, $includeArchived = true): array {
?string $term = null): array { $useCache = ($since === -1 && $includeArchived === true);
$useCache = ($since === -1 && $includeArchived === true && $before === null && $term === null);
if (!isset($this->userBoardCache[$userId]) || !$useCache) { if (!isset($this->userBoardCache[$userId]) || !$useCache) {
$groups = $this->groupManager->getUserGroupIds( $groups = $this->groupManager->getUserGroupIds(
$this->userManager->get($userId) $this->userManager->get($userId)
); );
$userBoards = $this->findAllByUser($userId, null, null, $since, $includeArchived, $before, $term); $userBoards = $this->findAllByUser($userId, null, null, $since, $includeArchived);
$groupBoards = $this->findAllByGroups($userId, $groups, null, null, $since, $includeArchived, $before, $term); $groupBoards = $this->findAllByGroups($userId, $groups, null, null, $since, $includeArchived);
$circleBoards = $this->findAllByCircles($userId, null, null, $since, $includeArchived, $before, $term); $circleBoards = $this->findAllByCircles($userId, null, null, $since, $includeArchived);
$allBoards = array_unique(array_merge($userBoards, $groupBoards, $circleBoards)); $allBoards = array_unique(array_merge($userBoards, $groupBoards, $circleBoards));
foreach ($allBoards as $board) {
$this->boardCache[$board->getId()] = $board;
}
if ($useCache) { if ($useCache) {
$this->userBoardCache[$userId] = $allBoards; $this->userBoardCache[$userId] = $allBoards;
} }
@@ -139,91 +121,19 @@ class BoardMapper extends QBMapper implements IPermissionMapper {
* @param null $offset * @param null $offset
* @return array * @return array
*/ */
public function findAllByUser(string $userId, ?int $limit = null, ?int $offset = null, ?int $since = null, public function findAllByUser($userId, $limit = null, $offset = null, $since = -1, $includeArchived = true) {
bool $includeArchived = true, ?int $before = null, ?string $term = null) { // FIXME: One moving to QBMapper we should allow filtering the boards probably by method chaining for additional where clauses
// FIXME this used to be a UNION to get boards owned by $userId and the user shares in one single query $sql = 'SELECT id, title, owner, color, archived, deleted_at, 0 as shared, last_modified FROM `*PREFIX*deck_boards` WHERE owner = ? AND last_modified > ?';
// Is it possible with the query builder?
$qb = $this->db->getQueryBuilder();
$qb->select('id', 'title', 'owner', 'color', 'archived', 'deleted_at', 'last_modified')
// this does not work in MySQL/PostgreSQL
//->selectAlias('0', 'shared')
->from('deck_boards', 'b')
->where($qb->expr()->eq('owner', $qb->createNamedParameter($userId, IQueryBuilder::PARAM_STR)));
if (!$includeArchived) { if (!$includeArchived) {
$qb->andWhere($qb->expr()->eq('archived', $qb->createNamedParameter(false, IQueryBuilder::PARAM_BOOL))) $sql .= ' AND NOT archived AND deleted_at = 0';
->andWhere($qb->expr()->eq('deleted_at', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT)));
} }
if ($since !== null) { $sql .= ' UNION ' .
$qb->andWhere($qb->expr()->gt('last_modified', $qb->createNamedParameter($since, IQueryBuilder::PARAM_INT))); 'SELECT boards.id, title, owner, color, archived, deleted_at, 1 as shared, last_modified FROM `*PREFIX*deck_boards` as boards ' .
} 'JOIN `*PREFIX*deck_board_acl` as acl ON boards.id=acl.board_id WHERE acl.participant=? AND acl.type=? AND boards.owner != ? AND last_modified > ?';
if ($before !== null) {
$qb->andWhere($qb->expr()->lt('last_modified', $qb->createNamedParameter($before, IQueryBuilder::PARAM_INT)));
}
if ($term !== null) {
$qb->andWhere(
$qb->expr()->iLike(
'title',
$qb->createNamedParameter(
'%' . $this->db->escapeLikeParameter($term) . '%',
IQueryBuilder::PARAM_STR
)
)
);
}
$qb->orderBy('b.id');
if ($limit !== null) {
$qb->setMaxResults($limit);
}
if ($offset !== null) {
$qb->setFirstResult($offset);
}
$entries = $this->findEntities($qb);
foreach ($entries as $entry) {
$entry->setShared(0);
}
// shared with user
$qb->resetQueryParts();
$qb->select('b.id', 'title', 'owner', 'color', 'archived', 'deleted_at', 'last_modified')
//->selectAlias('1', 'shared')
->from('deck_boards', 'b')
->innerJoin('b', 'deck_board_acl', 'acl', $qb->expr()->eq('b.id', 'acl.board_id'))
->where($qb->expr()->eq('acl.participant', $qb->createNamedParameter($userId, IQueryBuilder::PARAM_STR)))
->andWhere($qb->expr()->eq('acl.type', $qb->createNamedParameter(Acl::PERMISSION_TYPE_USER, IQueryBuilder::PARAM_INT)))
->andWhere($qb->expr()->neq('b.owner', $qb->createNamedParameter($userId, IQueryBuilder::PARAM_STR)));
if (!$includeArchived) { if (!$includeArchived) {
$qb->andWhere($qb->expr()->eq('archived', $qb->createNamedParameter(false, IQueryBuilder::PARAM_BOOL))) $sql .= ' AND NOT archived AND deleted_at = 0';
->andWhere($qb->expr()->eq('deleted_at', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT)));
} }
if ($since !== null) { $entries = $this->findEntities($sql, [$userId, $since, $userId, Acl::PERMISSION_TYPE_USER, $userId, $since], $limit, $offset);
$qb->andWhere($qb->expr()->gt('last_modified', $qb->createNamedParameter($since, IQueryBuilder::PARAM_INT)));
}
if ($before !== null) {
$qb->andWhere($qb->expr()->lt('last_modified', $qb->createNamedParameter($before, IQueryBuilder::PARAM_INT)));
}
if ($term !== null) {
$qb->andWhere(
$qb->expr()->iLike(
'title',
$qb->createNamedParameter(
'%' . $this->db->escapeLikeParameter($term) . '%',
IQueryBuilder::PARAM_STR
)
)
);
}
$qb->orderBy('b.id');
if ($limit !== null) {
$qb->setMaxResults($limit);
}
if ($offset !== null) {
$qb->setFirstResult($offset);
}
$sharedEntries = $this->findEntities($qb);
foreach ($sharedEntries as $entry) {
$entry->setShared(1);
}
$entries = array_merge($entries, $sharedEntries);
/* @var Board $entry */ /* @var Board $entry */
foreach ($entries as $entry) { foreach ($entries as $entry) {
$acl = $this->aclMapper->findAll($entry->id); $acl = $this->aclMapper->findAll($entry->id);
@@ -232,19 +142,9 @@ class BoardMapper extends QBMapper implements IPermissionMapper {
return $entries; return $entries;
} }
public function findAllByOwner(string $userId, ?int $limit = null, ?int $offset = null) { public function findAllByOwner(string $userId, int $limit = null, int $offset = null) {
$qb = $this->db->getQueryBuilder(); $sql = 'SELECT * FROM `*PREFIX*deck_boards` WHERE owner = ?';
$qb->select('*') return $this->findEntities($sql, [$userId], $limit, $offset);
->from('deck_boards')
->where($qb->expr()->eq('owner', $qb->createNamedParameter($userId, IQueryBuilder::PARAM_STR)))
->orderBy('id');
if ($limit !== null) {
$qb->setMaxResults($limit);
}
if ($offset !== null) {
$qb->setFirstResult($offset);
}
return $this->findEntities($qb);
} }
/** /**
@@ -256,57 +156,23 @@ class BoardMapper extends QBMapper implements IPermissionMapper {
* @param null $offset * @param null $offset
* @return array * @return array
*/ */
public function findAllByGroups(string $userId, array $groups, ?int $limit = null, ?int $offset = null, ?int $since = null, public function findAllByGroups($userId, $groups, $limit = null, $offset = null, $since = -1,$includeArchived = true) {
bool $includeArchived = true, ?int $before = null, ?string $term = null) {
if (count($groups) <= 0) { if (count($groups) <= 0) {
return []; return [];
} }
$qb = $this->db->getQueryBuilder(); $sql = 'SELECT boards.id, title, owner, color, archived, deleted_at, 2 as shared, last_modified FROM `*PREFIX*deck_boards` as boards ' .
$qb->select('b.id', 'title', 'owner', 'color', 'archived', 'deleted_at', 'last_modified') 'INNER JOIN `*PREFIX*deck_board_acl` as acl ON boards.id=acl.board_id WHERE owner != ? AND type=? AND (';
//->selectAlias('2', 'shared')
->from('deck_boards', 'b')
->innerJoin('b', 'deck_board_acl', 'acl', $qb->expr()->eq('b.id', 'acl.board_id'))
->where($qb->expr()->eq('acl.type', $qb->createNamedParameter(Acl::PERMISSION_TYPE_GROUP, IQueryBuilder::PARAM_INT)))
->andWhere($qb->expr()->neq('b.owner', $qb->createNamedParameter($userId, IQueryBuilder::PARAM_STR)));
$or = $qb->expr()->orx();
for ($i = 0, $iMax = count($groups); $i < $iMax; $i++) { for ($i = 0, $iMax = count($groups); $i < $iMax; $i++) {
$or->add( $sql .= 'acl.participant = ? ';
$qb->expr()->eq('acl.participant', $qb->createNamedParameter($groups[$i], IQueryBuilder::PARAM_STR)) if (count($groups) > 1 && $i < count($groups) - 1) {
); $sql .= ' OR ';
}
} }
$qb->andWhere($or); $sql .= ')';
if (!$includeArchived) { if (!$includeArchived) {
$qb->andWhere($qb->expr()->eq('archived', $qb->createNamedParameter(false, IQueryBuilder::PARAM_BOOL))) $sql .= ' AND NOT archived AND deleted_at = 0';
->andWhere($qb->expr()->eq('deleted_at', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT)));
}
if ($since !== null) {
$qb->andWhere($qb->expr()->gt('last_modified', $qb->createNamedParameter($since, IQueryBuilder::PARAM_INT)));
}
if ($before !== null) {
$qb->andWhere($qb->expr()->lt('last_modified', $qb->createNamedParameter($before, IQueryBuilder::PARAM_INT)));
}
if ($term !== null) {
$qb->andWhere(
$qb->expr()->iLike(
'title',
$qb->createNamedParameter(
'%' . $this->db->escapeLikeParameter($term) . '%',
IQueryBuilder::PARAM_STR
)
)
);
}
$qb->orderBy('b.id');
if ($limit !== null) {
$qb->setMaxResults($limit);
}
if ($offset !== null) {
$qb->setFirstResult($offset);
}
$entries = $this->findEntities($qb);
foreach ($entries as $entry) {
$entry->setShared(2);
} }
$entries = $this->findEntities($sql, array_merge([$userId, Acl::PERMISSION_TYPE_GROUP], $groups), $limit, $offset);
/* @var Board $entry */ /* @var Board $entry */
foreach ($entries as $entry) { foreach ($entries as $entry) {
$acl = $this->aclMapper->findAll($entry->id); $acl = $this->aclMapper->findAll($entry->id);
@@ -315,59 +181,25 @@ class BoardMapper extends QBMapper implements IPermissionMapper {
return $entries; return $entries;
} }
public function findAllByCircles(string $userId, ?int $limit = null, ?int $offset = null, ?int $since = null, public function findAllByCircles($userId, $limit = null, $offset = null, $since = -1,$includeArchived = true) {
bool $includeArchived = true, ?int $before = null, ?string $term = null) {
$circles = $this->circlesService->getUserCircles($userId); $circles = $this->circlesService->getUserCircles($userId);
if (count($circles) === 0) { if (count($circles) === 0) {
return []; return [];
} }
$qb = $this->db->getQueryBuilder(); $sql = 'SELECT boards.id, title, owner, color, archived, deleted_at, 2 as shared, last_modified FROM `*PREFIX*deck_boards` as boards ' .
$qb->select('b.id', 'title', 'owner', 'color', 'archived', 'deleted_at', 'last_modified') 'INNER JOIN `*PREFIX*deck_board_acl` as acl ON boards.id=acl.board_id WHERE owner != ? AND type=? AND (';
//->selectAlias('2', 'shared')
->from('deck_boards', 'b')
->innerJoin('b', 'deck_board_acl', 'acl', $qb->expr()->eq('b.id', 'acl.board_id'))
->where($qb->expr()->eq('acl.type', $qb->createNamedParameter(Acl::PERMISSION_TYPE_CIRCLE, IQueryBuilder::PARAM_INT)))
->andWhere($qb->expr()->neq('b.owner', $qb->createNamedParameter($userId, IQueryBuilder::PARAM_STR)));
$or = $qb->expr()->orx();
for ($i = 0, $iMax = count($circles); $i < $iMax; $i++) { for ($i = 0, $iMax = count($circles); $i < $iMax; $i++) {
$or->add( $sql .= 'acl.participant = ? ';
$qb->expr()->eq('acl.participant', $qb->createNamedParameter($circles[$i], IQueryBuilder::PARAM_STR)) if (count($circles) > 1 && $i < count($circles) - 1) {
); $sql .= ' OR ';
}
} }
$qb->andWhere($or); $sql .= ')';
if (!$includeArchived) { if (!$includeArchived) {
$qb->andWhere($qb->expr()->eq('archived', $qb->createNamedParameter(false, IQueryBuilder::PARAM_BOOL))) $sql .= ' AND NOT archived AND deleted_at = 0';
->andWhere($qb->expr()->eq('deleted_at', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT)));
}
if ($since !== null) {
$qb->andWhere($qb->expr()->gt('last_modified', $qb->createNamedParameter($since, IQueryBuilder::PARAM_INT)));
}
if ($before !== null) {
$qb->andWhere($qb->expr()->lt('last_modified', $qb->createNamedParameter($before, IQueryBuilder::PARAM_INT)));
}
if ($term !== null) {
$qb->andWhere(
$qb->expr()->iLike(
'title',
$qb->createNamedParameter(
'%' . $this->db->escapeLikeParameter($term) . '%',
IQueryBuilder::PARAM_STR
)
)
);
}
$qb->orderBy('b.id');
if ($limit !== null) {
$qb->setMaxResults($limit);
}
if ($offset !== null) {
$qb->setFirstResult($offset);
}
$entries = $this->findEntities($qb);
foreach ($entries as $entry) {
$entry->setShared(2);
} }
$entries = $this->findEntities($sql, array_merge([$userId, Acl::PERMISSION_TYPE_CIRCLE], $circles), $limit, $offset);
/* @var Board $entry */ /* @var Board $entry */
foreach ($entries as $entry) { foreach ($entries as $entry) {
$acl = $this->aclMapper->findAll($entry->id); $acl = $this->aclMapper->findAll($entry->id);
@@ -376,26 +208,21 @@ class BoardMapper extends QBMapper implements IPermissionMapper {
return $entries; return $entries;
} }
public function findAll(): array { public function findAll() {
$qb = $this->db->getQueryBuilder(); $sql = 'SELECT id from *PREFIX*deck_boards;';
$qb->select('id') return $this->findEntities($sql);
->from('deck_boards');
return $this->findEntities($qb);
} }
public function findToDelete() { public function findToDelete() {
// add buffer of 5 min // add buffer of 5 min
$timeLimit = time() - (60 * 5); $timeLimit = time() - (60 * 5);
$qb = $this->db->getQueryBuilder(); $sql = 'SELECT id, title, owner, color, archived, deleted_at, last_modified FROM `*PREFIX*deck_boards` ' .
$qb->select('id', 'title', 'owner', 'color', 'archived', 'deleted_at', 'last_modified') 'WHERE `deleted_at` > 0 AND `deleted_at` < ?';
->from('deck_boards') return $this->findEntities($sql, [$timeLimit]);
->where($qb->expr()->gt('deleted_at', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT)))
->andWhere($qb->expr()->lt('deleted_at', $qb->createNamedParameter($timeLimit, IQueryBuilder::PARAM_INT)));
return $this->findEntities($qb);
} }
public function delete(/** @noinspection PhpUnnecessaryFullyQualifiedNameInspection */ public function delete(/** @noinspection PhpUnnecessaryFullyQualifiedNameInspection */
\OCP\AppFramework\Db\Entity $entity): \OCP\AppFramework\Db\Entity { \OCP\AppFramework\Db\Entity $entity) {
// delete acl // delete acl
$acl = $this->aclMapper->findAll($entity->getId()); $acl = $this->aclMapper->findAll($entity->getId());
foreach ($acl as $item) { foreach ($acl as $item) {
@@ -496,11 +323,6 @@ class BoardMapper extends QBMapper implements IPermissionMapper {
* Reset cache for a given board or a given user * Reset cache for a given board or a given user
*/ */
public function flushCache(?int $boardId = null, ?string $userId = null) { public function flushCache(?int $boardId = null, ?string $userId = null) {
if ($boardId) {
unset($this->boardCache[$boardId]);
} else {
$this->boardCache = null;
}
if ($userId) { if ($userId) {
unset($this->userBoardCache[$userId]); unset($this->userBoardCache[$userId]);
} else { } else {
+10 -33
View File
@@ -30,8 +30,6 @@ use OCA\Deck\Search\Query\SearchQuery;
use OCP\AppFramework\Db\Entity; use OCP\AppFramework\Db\Entity;
use OCP\AppFramework\Db\QBMapper; use OCP\AppFramework\Db\QBMapper;
use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\ICache;
use OCP\ICacheFactory;
use OCP\IDBConnection; use OCP\IDBConnection;
use OCP\IGroupManager; use OCP\IGroupManager;
use OCP\IUser; use OCP\IUser;
@@ -48,8 +46,6 @@ class CardMapper extends QBMapper implements IPermissionMapper {
private $groupManager; private $groupManager;
/** @var IManager */ /** @var IManager */
private $notificationManager; private $notificationManager;
/** @var ICache */
private $cache;
private $databaseType; private $databaseType;
private $database4ByteSupport; private $database4ByteSupport;
@@ -59,7 +55,6 @@ class CardMapper extends QBMapper implements IPermissionMapper {
IUserManager $userManager, IUserManager $userManager,
IGroupManager $groupManager, IGroupManager $groupManager,
IManager $notificationManager, IManager $notificationManager,
ICacheFactory $cacheFactory,
$databaseType = 'sqlite3', $databaseType = 'sqlite3',
$database4ByteSupport = true $database4ByteSupport = true
) { ) {
@@ -68,7 +63,6 @@ class CardMapper extends QBMapper implements IPermissionMapper {
$this->userManager = $userManager; $this->userManager = $userManager;
$this->groupManager = $groupManager; $this->groupManager = $groupManager;
$this->notificationManager = $notificationManager; $this->notificationManager = $notificationManager;
$this->cache = $cacheFactory->createDistributed('deck-cardMapper');
$this->databaseType = $databaseType; $this->databaseType = $databaseType;
$this->database4ByteSupport = $database4ByteSupport; $this->database4ByteSupport = $database4ByteSupport;
} }
@@ -81,9 +75,7 @@ class CardMapper extends QBMapper implements IPermissionMapper {
$description = preg_replace('/[\x{10000}-\x{10FFFF}]/u', "\xEF\xBF\xBD", $entity->getDescription()); $description = preg_replace('/[\x{10000}-\x{10FFFF}]/u', "\xEF\xBF\xBD", $entity->getDescription());
$entity->setDescription($description); $entity->setDescription($description);
} }
$entity = parent::insert($entity); return parent::insert($entity);
$this->cache->remove('findBoardId:' . $entity->getId());
return $entity;
} }
public function update(Entity $entity, $updateModified = true): Entity { public function update(Entity $entity, $updateModified = true): Entity {
@@ -115,10 +107,6 @@ class CardMapper extends QBMapper implements IPermissionMapper {
} catch (Exception $e) { } catch (Exception $e) {
} }
} }
// Invalidate cache when the card may be moved to a different board
if (isset($updatedFields['stackId'])) {
$this->cache->remove('findBoardId:' . $entity->getId());
}
return parent::update($entity); return parent::update($entity);
} }
@@ -193,7 +181,6 @@ class CardMapper extends QBMapper implements IPermissionMapper {
->from('deck_cards', 'c') ->from('deck_cards', 'c')
->join('c', 'deck_stacks', 's', 's.id = c.stack_id') ->join('c', 'deck_stacks', 's', 's.id = c.stack_id')
->where($qb->expr()->eq('s.board_id', $qb->createNamedParameter($boardId))) ->where($qb->expr()->eq('s.board_id', $qb->createNamedParameter($boardId)))
->andWhere($qb->expr()->eq('c.archived', $qb->createNamedParameter(false, IQueryBuilder::PARAM_BOOL)))
->andWhere($qb->expr()->eq('c.deleted_at', $qb->createNamedParameter('0'))) ->andWhere($qb->expr()->eq('c.deleted_at', $qb->createNamedParameter('0')))
->orderBy('c.duedate') ->orderBy('c.duedate')
->setMaxResults($limit) ->setMaxResults($limit)
@@ -492,8 +479,8 @@ class CardMapper extends QBMapper implements IPermissionMapper {
} }
return $qb->createNamedParameter($dateTime, IQueryBuilder::PARAM_DATE); return $qb->createNamedParameter($dateTime, IQueryBuilder::PARAM_DATE);
} }
public function searchRaw($boardIds, $term, $limit = null, $offset = null) { public function searchRaw($boardIds, $term, $limit = null, $offset = null) {
$qb = $this->queryCardsByBoards($boardIds) $qb = $this->queryCardsByBoards($boardIds)
@@ -519,8 +506,9 @@ class CardMapper extends QBMapper implements IPermissionMapper {
} }
public function delete(Entity $entity): Entity { public function delete(Entity $entity): Entity {
// delete assigned labels
$this->labelMapper->deleteLabelAssignmentsForCard($entity->getId()); $this->labelMapper->deleteLabelAssignmentsForCard($entity->getId());
$this->cache->remove('findBoardId:' . $entity->getId()); // delete card
return parent::delete($entity); return parent::delete($entity);
} }
@@ -559,22 +547,11 @@ class CardMapper extends QBMapper implements IPermissionMapper {
} }
public function findBoardId($id): ?int { public function findBoardId($id): ?int {
$result = $this->cache->get('findBoardId:' . $id); $sql = 'SELECT id 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 = ?))';
if ($result === null) { $stmt = $this->db->prepare($sql);
try { $stmt->bindParam(1, $id, \PDO::PARAM_INT);
$qb = $this->db->getQueryBuilder(); $stmt->execute();
$qb->select('board_id') return $stmt->fetchColumn() ?? null;
->from('deck_stacks', 's')
->innerJoin('s', 'deck_cards', 'c', 'c.stack_id = s.id')
->where($qb->expr()->eq('c.id', $qb->createNamedParameter($id)));
$queryResult = $qb->executeQuery();
$result = $queryResult->fetchOne();
} catch (\Exception $e) {
$result = false;
}
$this->cache->set('findBoardId:' . $id, $result);
}
return $result !== false ? $result : null;
} }
public function mapOwner(Card &$card) { public function mapOwner(Card &$card) {
+15 -12
View File
@@ -35,7 +35,6 @@ use OCA\Deck\Event\CardUpdatedEvent;
use OCA\Deck\NoPermissionException; use OCA\Deck\NoPermissionException;
use OCA\Deck\NotFoundException; use OCA\Deck\NotFoundException;
use OCA\Deck\Notification\NotificationHelper; use OCA\Deck\Notification\NotificationHelper;
use OCA\Deck\Validators\AssignmentServiceValidator;
use OCP\AppFramework\Db\DoesNotExistException; use OCP\AppFramework\Db\DoesNotExistException;
use OCP\AppFramework\Db\Entity; use OCP\AppFramework\Db\Entity;
use OCP\AppFramework\Db\MultipleObjectsReturnedException; use OCP\AppFramework\Db\MultipleObjectsReturnedException;
@@ -77,11 +76,6 @@ class AssignmentService {
private $eventDispatcher; private $eventDispatcher;
/** @var string|null */ /** @var string|null */
private $currentUser; private $currentUser;
/**
* @var AssignmentServiceValidator
*/
private $assignmentServiceValidator;
public function __construct( public function __construct(
PermissionService $permissionService, PermissionService $permissionService,
@@ -92,10 +86,8 @@ class AssignmentService {
ActivityManager $activityManager, ActivityManager $activityManager,
ChangeHelper $changeHelper, ChangeHelper $changeHelper,
IEventDispatcher $eventDispatcher, IEventDispatcher $eventDispatcher,
AssignmentServiceValidator $assignmentServiceValidator,
$userId $userId
) { ) {
$this->assignmentServiceValidator = $assignmentServiceValidator;
$this->permissionService = $permissionService; $this->permissionService = $permissionService;
$this->cardMapper = $cardMapper; $this->cardMapper = $cardMapper;
$this->assignedUsersMapper = $assignedUsersMapper; $this->assignedUsersMapper = $assignedUsersMapper;
@@ -104,8 +96,6 @@ class AssignmentService {
$this->changeHelper = $changeHelper; $this->changeHelper = $changeHelper;
$this->activityManager = $activityManager; $this->activityManager = $activityManager;
$this->eventDispatcher = $eventDispatcher; $this->eventDispatcher = $eventDispatcher;
$this->assignmentServiceValidator->check(compact('userId'));
$this->currentUser = $userId; $this->currentUser = $userId;
} }
@@ -119,7 +109,13 @@ class AssignmentService {
* @throws DoesNotExistException * @throws DoesNotExistException
*/ */
public function assignUser($cardId, $userId, int $type = Assignment::TYPE_USER) { public function assignUser($cardId, $userId, int $type = Assignment::TYPE_USER) {
$this->assignmentServiceValidator->check(compact('cardId', 'userId')); if (is_numeric($cardId) === false) {
throw new BadRequestException('card id must be a number');
}
if ($userId === false || $userId === null) {
throw new BadRequestException('user id must be provided');
}
if ($type !== Assignment::TYPE_USER && $type !== Assignment::TYPE_GROUP) { if ($type !== Assignment::TYPE_USER && $type !== Assignment::TYPE_GROUP) {
throw new BadRequestException('Invalid type provided for assignemnt'); throw new BadRequestException('Invalid type provided for assignemnt');
@@ -172,9 +168,16 @@ class AssignmentService {
* @throws MultipleObjectsReturnedException * @throws MultipleObjectsReturnedException
*/ */
public function unassignUser($cardId, $userId, $type = 0) { public function unassignUser($cardId, $userId, $type = 0) {
$this->assignmentServiceValidator->check(compact('cardId', 'userId'));
$this->permissionService->checkPermission($this->cardMapper, $cardId, Acl::PERMISSION_EDIT); $this->permissionService->checkPermission($this->cardMapper, $cardId, Acl::PERMISSION_EDIT);
if (is_numeric($cardId) === false) {
throw new BadRequestException('card id must be a number');
}
if ($userId === false || $userId === null) {
throw new BadRequestException('user must be provided');
}
$assignments = $this->assignedUsersMapper->findAll($cardId); $assignments = $this->assignedUsersMapper->findAll($cardId);
foreach ($assignments as $assignment) { foreach ($assignments as $assignment) {
if ($assignment->getParticipant() === $userId && $assignment->getType() === $type) { if ($assignment->getParticipant() === $userId && $assignment->getType() === $type) {
+15 -8
View File
@@ -36,7 +36,6 @@ use OCA\Deck\NoPermissionException;
use OCA\Deck\NotFoundException; use OCA\Deck\NotFoundException;
use OCA\Deck\Cache\AttachmentCacheHelper; use OCA\Deck\Cache\AttachmentCacheHelper;
use OCA\Deck\StatusException; use OCA\Deck\StatusException;
use OCA\Deck\Validators\AttachmentServiceValidator;
use OCP\AppFramework\Db\IMapperException; use OCP\AppFramework\Db\IMapperException;
use OCP\AppFramework\Http\Response; use OCP\AppFramework\Http\Response;
use OCP\IL10N; use OCP\IL10N;
@@ -59,10 +58,8 @@ class AttachmentService {
private $activityManager; private $activityManager;
/** @var ChangeHelper */ /** @var ChangeHelper */
private $changeHelper; private $changeHelper;
/** @var AttachmentServiceValidator */
private $attachmentServiceValidator;
public function __construct(AttachmentMapper $attachmentMapper, CardMapper $cardMapper, ChangeHelper $changeHelper, PermissionService $permissionService, Application $application, AttachmentCacheHelper $attachmentCacheHelper, $userId, IL10N $l10n, ActivityManager $activityManager, AttachmentServiceValidator $attachmentServiceValidator) { public function __construct(AttachmentMapper $attachmentMapper, CardMapper $cardMapper, ChangeHelper $changeHelper, PermissionService $permissionService, Application $application, AttachmentCacheHelper $attachmentCacheHelper, $userId, IL10N $l10n, ActivityManager $activityManager) {
$this->attachmentMapper = $attachmentMapper; $this->attachmentMapper = $attachmentMapper;
$this->cardMapper = $cardMapper; $this->cardMapper = $cardMapper;
$this->permissionService = $permissionService; $this->permissionService = $permissionService;
@@ -72,7 +69,6 @@ class AttachmentService {
$this->l10n = $l10n; $this->l10n = $l10n;
$this->activityManager = $activityManager; $this->activityManager = $activityManager;
$this->changeHelper = $changeHelper; $this->changeHelper = $changeHelper;
$this->attachmentServiceValidator = $attachmentServiceValidator;
// Register shipped attachment services // Register shipped attachment services
// TODO: move this to a plugin based approach once we have different types of attachments // TODO: move this to a plugin based approach once we have different types of attachments
@@ -178,7 +174,17 @@ class AttachmentService {
* @throws BadRequestException * @throws BadRequestException
*/ */
public function create($cardId, $type, $data) { public function create($cardId, $type, $data) {
$this->attachmentServiceValidator->check(compact('cardId', 'type')); if (is_numeric($cardId) === false) {
throw new BadRequestException('card id must be a number');
}
if ($type === false || $type === null) {
throw new BadRequestException('type must be provided');
}
if ($data === false || $data === null) {
//throw new BadRequestException('data must be provided');
}
$this->permissionService->checkPermission($this->cardMapper, $cardId, Acl::PERMISSION_EDIT); $this->permissionService->checkPermission($this->cardMapper, $cardId, Acl::PERMISSION_EDIT);
@@ -263,8 +269,6 @@ class AttachmentService {
* @throws NoPermissionException * @throws NoPermissionException
*/ */
public function update($cardId, $attachmentId, $data, $type = 'deck_file') { public function update($cardId, $attachmentId, $data, $type = 'deck_file') {
$this->attachmentServiceValidator->check(compact('cardId', 'type', 'data'));
try { try {
$service = $this->getService($type); $service = $this->getService($type);
} catch (InvalidAttachmentType $e) { } catch (InvalidAttachmentType $e) {
@@ -286,6 +290,9 @@ class AttachmentService {
} }
} }
if ($data === false || $data === null) {
//throw new BadRequestException('data must be provided');
}
try { try {
$attachment = $this->attachmentMapper->find($attachmentId); $attachment = $this->attachmentMapper->find($attachmentId);
} catch (\Exception $e) { } catch (\Exception $e) {
+96 -29
View File
@@ -52,7 +52,6 @@ use OCA\Deck\Db\BoardMapper;
use OCA\Deck\Db\LabelMapper; use OCA\Deck\Db\LabelMapper;
use OCP\IUserManager; use OCP\IUserManager;
use OCA\Deck\BadRequestException; use OCA\Deck\BadRequestException;
use OCA\Deck\Validators\BoardServiceValidator;
use OCP\IURLGenerator; use OCP\IURLGenerator;
class BoardService { class BoardService {
@@ -76,7 +75,6 @@ class BoardService {
private $boardsCache = null; private $boardsCache = null;
private $urlGenerator; private $urlGenerator;
private $boardServiceValidator;
public function __construct( public function __construct(
@@ -96,7 +94,6 @@ class BoardService {
IEventDispatcher $eventDispatcher, IEventDispatcher $eventDispatcher,
ChangeHelper $changeHelper, ChangeHelper $changeHelper,
IURLGenerator $urlGenerator, IURLGenerator $urlGenerator,
BoardServiceValidator $boardServiceValidator,
$userId $userId
) { ) {
$this->boardMapper = $boardMapper; $this->boardMapper = $boardMapper;
@@ -116,7 +113,6 @@ class BoardService {
$this->userId = $userId; $this->userId = $userId;
$this->urlGenerator = $urlGenerator; $this->urlGenerator = $urlGenerator;
$this->cardMapper = $cardMapper; $this->cardMapper = $cardMapper;
$this->boardServiceValidator = $boardServiceValidator;
} }
/** /**
@@ -126,15 +122,13 @@ class BoardService {
*/ */
public function setUserId(string $userId): void { public function setUserId(string $userId): void {
$this->userId = $userId; $this->userId = $userId;
$this->permissionService->setUserId($userId);
} }
/** /**
* Get all boards that are shared with a user, their groups or circles * Get all boards that are shared with a user, their groups or circles
*/ */
public function getUserBoards(?int $since = null, bool $includeArchived = true, ?int $before = null, public function getUserBoards(int $since = -1, bool $includeArchived = true): array {
?string $term = null): array { return $this->boardMapper->findAllForUser($this->userId, $since, $includeArchived);
return $this->boardMapper->findAllForUser($this->userId, $since, $includeArchived, $before, $term);
} }
/** /**
@@ -181,8 +175,7 @@ class BoardService {
* @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException * @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException
* @throws BadRequestException * @throws BadRequestException
*/ */
public function find($boardId, bool $allowDeleted = false) { public function find($boardId) {
$this->boardServiceValidator->check(compact('boardId'));
if ($this->boardsCache && isset($this->boardsCache[$boardId])) { if ($this->boardsCache && isset($this->boardsCache[$boardId])) {
return $this->boardsCache[$boardId]; return $this->boardsCache[$boardId];
} }
@@ -192,13 +185,11 @@ class BoardService {
$this->permissionService->checkPermission($this->boardMapper, $boardId, Acl::PERMISSION_READ); $this->permissionService->checkPermission($this->boardMapper, $boardId, Acl::PERMISSION_READ);
/** @var Board $board */ /** @var Board $board */
$board = $this->boardMapper->find((int)$boardId, true, true, $allowDeleted); $board = $this->boardMapper->find($boardId, true, true);
$this->boardMapper->mapOwner($board); $this->boardMapper->mapOwner($board);
if ($board->getAcl() !== null) { foreach ($board->getAcl() as &$acl) {
foreach ($board->getAcl() as $acl) { if ($acl !== null) {
if ($acl !== null) { $this->boardMapper->mapAcl($acl);
$this->boardMapper->mapAcl($acl);
}
} }
} }
$permissions = $this->permissionService->matchPermissions($board); $permissions = $this->permissionService->matchPermissions($board);
@@ -237,7 +228,9 @@ class BoardService {
* @throws BadRequestException * @throws BadRequestException
*/ */
public function isArchived($mapper, $id) { public function isArchived($mapper, $id) {
$this->boardServiceValidator->check(compact('id')); if (is_numeric($id) === false) {
throw new BadRequestException('id must be a number');
}
try { try {
$boardId = $id; $boardId = $id;
@@ -264,7 +257,13 @@ class BoardService {
* @throws BadRequestException * @throws BadRequestException
*/ */
public function isDeleted($mapper, $id) { public function isDeleted($mapper, $id) {
$this->boardServiceValidator->check(compact('mapper', 'id')); if ($mapper === false || $mapper === null) {
throw new BadRequestException('mapper must be provided');
}
if (is_numeric($id) === false) {
throw new BadRequestException('id must be a number');
}
try { try {
$boardId = $id; $boardId = $id;
@@ -290,7 +289,17 @@ class BoardService {
* @throws BadRequestException * @throws BadRequestException
*/ */
public function create($title, $userId, $color) { public function create($title, $userId, $color) {
$this->boardServiceValidator->check(compact('title', 'userId', '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');
}
if (!$this->permissionService->canCreate()) { if (!$this->permissionService->canCreate()) {
throw new NoPermissionException('Creating boards has been disabled for your account.'); throw new NoPermissionException('Creating boards has been disabled for your account.');
@@ -341,7 +350,9 @@ class BoardService {
* @throws BadRequestException * @throws BadRequestException
*/ */
public function delete($id) { public function delete($id) {
$this->boardServiceValidator->check(compact('id')); if (is_numeric($id) === false) {
throw new BadRequestException('board id must be a number');
}
$this->permissionService->checkPermission($this->boardMapper, $id, Acl::PERMISSION_MANAGE); $this->permissionService->checkPermission($this->boardMapper, $id, Acl::PERMISSION_MANAGE);
$board = $this->find($id); $board = $this->find($id);
@@ -364,10 +375,12 @@ class BoardService {
* @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException * @throws \OCP\AppFramework\Db\MultipleObjectsReturnedException
*/ */
public function deleteUndo($id) { public function deleteUndo($id) {
$this->boardServiceValidator->check(compact('id')); if (is_numeric($id) === false) {
throw new BadRequestException('board id must be a number');
}
$this->permissionService->checkPermission($this->boardMapper, $id, Acl::PERMISSION_MANAGE); $this->permissionService->checkPermission($this->boardMapper, $id, Acl::PERMISSION_MANAGE);
$board = $this->find($id, true); $board = $this->find($id);
$board->setDeletedAt(0); $board->setDeletedAt(0);
$board = $this->boardMapper->update($board); $board = $this->boardMapper->update($board);
$this->activityManager->triggerEvent(ActivityManager::DECK_OBJECT_BOARD, $board, ActivityManager::SUBJECT_BOARD_RESTORE); $this->activityManager->triggerEvent(ActivityManager::DECK_OBJECT_BOARD, $board, ActivityManager::SUBJECT_BOARD_RESTORE);
@@ -385,10 +398,12 @@ class BoardService {
* @throws BadRequestException * @throws BadRequestException
*/ */
public function deleteForce($id) { public function deleteForce($id) {
$this->boardServiceValidator->check(compact('id')); if (is_numeric($id) === false) {
throw new BadRequestException('id must be a number');
}
$this->permissionService->checkPermission($this->boardMapper, $id, Acl::PERMISSION_MANAGE); $this->permissionService->checkPermission($this->boardMapper, $id, Acl::PERMISSION_MANAGE);
$board = $this->find($id, true); $board = $this->find($id);
$delete = $this->boardMapper->delete($board); $delete = $this->boardMapper->delete($board);
return $delete; return $delete;
@@ -406,7 +421,21 @@ class BoardService {
* @throws BadRequestException * @throws BadRequestException
*/ */
public function update($id, $title, $color, $archived) { public function update($id, $title, $color, $archived) {
$this->boardServiceValidator->check(compact('id', 'title', 'color', 'archived')); if (is_numeric($id) === false) {
throw new BadRequestException('board id must be a number');
}
if ($title === false || $title === null) {
throw new BadRequestException('title must be provided');
}
if ($color === false || $color === null) {
throw new BadRequestException('color must be provided');
}
if (is_bool($archived) === false) {
throw new BadRequestException('archived must be a boolean');
}
$this->permissionService->checkPermission($this->boardMapper, $id, Acl::PERMISSION_MANAGE); $this->permissionService->checkPermission($this->boardMapper, $id, Acl::PERMISSION_MANAGE);
$board = $this->find($id); $board = $this->find($id);
@@ -456,7 +485,29 @@ class BoardService {
* @throws \OCA\Deck\NoPermissionException * @throws \OCA\Deck\NoPermissionException
*/ */
public function addAcl($boardId, $type, $participant, $edit, $share, $manage) { public function addAcl($boardId, $type, $participant, $edit, $share, $manage) {
$this->boardServiceValidator->check(compact('boardId', 'type', 'participant', 'edit', 'share', 'manage')); if (is_numeric($boardId) === false) {
throw new BadRequestException('board id must be a number');
}
if ($type === false || $type === null) {
throw new BadRequestException('type must be provided');
}
if ($participant === false || $participant === null) {
throw new BadRequestException('participant must be provided');
}
if ($edit === null) {
throw new BadRequestException('edit must be provided');
}
if ($share === null) {
throw new BadRequestException('share must be provided');
}
if ($manage === null) {
throw new BadRequestException('manage must be provided');
}
$this->permissionService->checkPermission($this->boardMapper, $boardId, Acl::PERMISSION_SHARE); $this->permissionService->checkPermission($this->boardMapper, $boardId, Acl::PERMISSION_SHARE);
[$edit, $share, $manage] = $this->applyPermissions($boardId, $edit, $share, $manage); [$edit, $share, $manage] = $this->applyPermissions($boardId, $edit, $share, $manage);
@@ -471,7 +522,7 @@ class BoardService {
$newAcl = $this->aclMapper->insert($acl); $newAcl = $this->aclMapper->insert($acl);
$this->activityManager->triggerEvent(ActivityManager::DECK_OBJECT_BOARD, $newAcl, ActivityManager::SUBJECT_BOARD_SHARE, [], $this->userId); $this->activityManager->triggerEvent(ActivityManager::DECK_OBJECT_BOARD, $newAcl, ActivityManager::SUBJECT_BOARD_SHARE, [], $this->userId);
$this->notificationHelper->sendBoardShared($boardId, $acl); $this->notificationHelper->sendBoardShared((int)$boardId, $acl);
$this->boardMapper->mapAcl($newAcl); $this->boardMapper->mapAcl($newAcl);
$this->changeHelper->boardChanged($boardId); $this->changeHelper->boardChanged($boardId);
@@ -502,7 +553,21 @@ class BoardService {
* @throws BadRequestException * @throws BadRequestException
*/ */
public function updateAcl($id, $edit, $share, $manage) { public function updateAcl($id, $edit, $share, $manage) {
$this->boardServiceValidator->check(compact('id', 'edit', 'share', 'manage')); if (is_numeric($id) === false) {
throw new BadRequestException('id must be a number');
}
if ($edit === null) {
throw new BadRequestException('edit must be provided');
}
if ($share === null) {
throw new BadRequestException('share must be provided');
}
if ($manage === null) {
throw new BadRequestException('manage must be provided');
}
$this->permissionService->checkPermission($this->aclMapper, $id, Acl::PERMISSION_SHARE); $this->permissionService->checkPermission($this->aclMapper, $id, Acl::PERMISSION_SHARE);
@@ -574,7 +639,9 @@ class BoardService {
* @throws BadRequestException * @throws BadRequestException
*/ */
public function clone($id, $userId) { public function clone($id, $userId) {
$this->boardServiceValidator->check(compact('id', 'userId')); if (is_numeric($id) === false) {
throw new BadRequestException('board id must be a number');
}
$this->permissionService->checkPermission($this->boardMapper, $id, Acl::PERMISSION_READ); $this->permissionService->checkPermission($this->boardMapper, $id, Acl::PERMISSION_READ);
+86 -24
View File
@@ -43,7 +43,6 @@ use OCA\Deck\Db\BoardMapper;
use OCA\Deck\Db\LabelMapper; use OCA\Deck\Db\LabelMapper;
use OCA\Deck\StatusException; use OCA\Deck\StatusException;
use OCA\Deck\BadRequestException; use OCA\Deck\BadRequestException;
use OCA\Deck\Validators\CardServiceValidator;
use OCP\Comments\ICommentsManager; use OCP\Comments\ICommentsManager;
use OCP\EventDispatcher\IEventDispatcher; use OCP\EventDispatcher\IEventDispatcher;
use OCP\IUserManager; use OCP\IUserManager;
@@ -66,7 +65,6 @@ class CardService {
private $eventDispatcher; private $eventDispatcher;
private $userManager; private $userManager;
private $urlGenerator; private $urlGenerator;
private $cardServiceValidator;
public function __construct( public function __construct(
CardMapper $cardMapper, CardMapper $cardMapper,
@@ -84,7 +82,6 @@ class CardService {
ChangeHelper $changeHelper, ChangeHelper $changeHelper,
IEventDispatcher $eventDispatcher, IEventDispatcher $eventDispatcher,
IURLGenerator $urlGenerator, IURLGenerator $urlGenerator,
CardServiceValidator $cardServiceValidator,
$userId $userId
) { ) {
$this->cardMapper = $cardMapper; $this->cardMapper = $cardMapper;
@@ -103,7 +100,6 @@ class CardService {
$this->eventDispatcher = $eventDispatcher; $this->eventDispatcher = $eventDispatcher;
$this->currentUser = $userId; $this->currentUser = $userId;
$this->urlGenerator = $urlGenerator; $this->urlGenerator = $urlGenerator;
$this->cardServiceValidator = $cardServiceValidator;
} }
public function enrich($card) { public function enrich($card) {
@@ -126,7 +122,6 @@ class CardService {
} }
public function fetchDeleted($boardId) { public function fetchDeleted($boardId) {
$this->cardServiceValidator->check(compact('boardId'));
$this->permissionService->checkPermission($this->boardMapper, $boardId, Acl::PERMISSION_READ); $this->permissionService->checkPermission($this->boardMapper, $boardId, Acl::PERMISSION_READ);
$cards = $this->cardMapper->findDeleted($boardId); $cards = $this->cardMapper->findDeleted($boardId);
foreach ($cards as $card) { foreach ($cards as $card) {
@@ -192,7 +187,29 @@ class CardService {
* @throws BadrequestException * @throws BadrequestException
*/ */
public function create($title, $stackId, $type, $order, $owner, $description = '', $duedate = null) { public function create($title, $stackId, $type, $order, $owner, $description = '', $duedate = null) {
$this->cardServiceValidator->check(compact('title', 'stackId', 'type', 'order', 'owner')); if ($title === 'false' || $title === null) {
throw new BadRequestException('title must be provided');
}
if (mb_strlen($title) > Card::TITLE_MAX_LENGTH) {
throw new BadRequestException('The title cannot exceed 255 characters');
}
if (is_numeric($stackId) === false) {
throw new BadRequestException('stack id must be a number');
}
if ($type === 'false' || $type === null) {
throw new BadRequestException('type must be provided');
}
if (is_numeric($order) === false) {
throw new BadRequestException('order must be a number');
}
if ($owner === false || $owner === null) {
throw new BadRequestException('owner must be provided');
}
$this->permissionService->checkPermission($this->stackMapper, $stackId, Acl::PERMISSION_EDIT); $this->permissionService->checkPermission($this->stackMapper, $stackId, Acl::PERMISSION_EDIT);
if ($this->boardService->isArchived($this->stackMapper, $stackId)) { if ($this->boardService->isArchived($this->stackMapper, $stackId)) {
@@ -262,9 +279,31 @@ class CardService {
* @throws BadRequestException * @throws BadRequestException
*/ */
public function update($id, $title, $stackId, $type, $owner, $description = '', $order = 0, $duedate = null, $deletedAt = null, $archived = null) { public function update($id, $title, $stackId, $type, $owner, $description = '', $order = 0, $duedate = null, $deletedAt = null, $archived = null) {
$this->cardServiceValidator->check(compact('id', 'title', 'stackId', 'type', 'owner', 'order')); if (is_numeric($id) === false) {
throw new BadRequestException('card id must be a number');
}
$this->permissionService->checkPermission($this->cardMapper, $id, Acl::PERMISSION_EDIT, null, true); if ($title === false || $title === null) {
throw new BadRequestException('title must be provided');
}
if (mb_strlen($title) > Card::TITLE_MAX_LENGTH) {
throw new BadRequestException('The title cannot exceed 255 characters');
}
if (is_numeric($stackId) === false) {
throw new BadRequestException('stack id must be a number $$$');
}
if ($type === false || $type === null) {
throw new BadRequestException('type must be provided');
}
if ($owner === false || $owner === null) {
throw new BadRequestException('owner must be provided');
}
$this->permissionService->checkPermission($this->cardMapper, $id, Acl::PERMISSION_EDIT);
$this->permissionService->checkPermission($this->stackMapper, $stackId, Acl::PERMISSION_EDIT); $this->permissionService->checkPermission($this->stackMapper, $stackId, Acl::PERMISSION_EDIT);
if ($this->boardService->isArchived($this->cardMapper, $id)) { if ($this->boardService->isArchived($this->cardMapper, $id)) {
@@ -274,14 +313,6 @@ class CardService {
if ($archived !== null && $card->getArchived() && $archived === true) { if ($archived !== null && $card->getArchived() && $archived === true) {
throw new StatusException('Operation not allowed. This card is archived.'); throw new StatusException('Operation not allowed. This card is archived.');
} }
if ($card->getDeletedAt() !== 0) {
if ($deletedAt === null || $deletedAt > 0) {
// Only allow operations when restoring the card
throw new NoPermissionException('Operation not allowed. This card was deleted.');
}
}
$changes = new ChangeSet($card); $changes = new ChangeSet($card);
if ($card->getLastEditor() !== $this->currentUser && $card->getLastEditor() !== null) { if ($card->getLastEditor() !== $this->currentUser && $card->getLastEditor() !== null) {
$this->activityManager->triggerEvent( $this->activityManager->triggerEvent(
@@ -353,7 +384,17 @@ class CardService {
* @throws BadRequestException * @throws BadRequestException
*/ */
public function rename($id, $title) { public function rename($id, $title) {
$this->cardServiceValidator->check(compact('id', 'title')); if (is_numeric($id) === false) {
throw new BadRequestException('id must be a number');
}
if ($title === false || $title === null) {
throw new BadRequestException('title must be provided');
}
if (mb_strlen($title) > Card::TITLE_MAX_LENGTH) {
throw new BadRequestException('The title cannot exceed 255 characters');
}
$this->permissionService->checkPermission($this->cardMapper, $id, Acl::PERMISSION_EDIT); $this->permissionService->checkPermission($this->cardMapper, $id, Acl::PERMISSION_EDIT);
if ($this->boardService->isArchived($this->cardMapper, $id)) { if ($this->boardService->isArchived($this->cardMapper, $id)) {
@@ -384,8 +425,17 @@ class CardService {
* @throws BadRequestException * @throws BadRequestException
*/ */
public function reorder($id, $stackId, $order) { public function reorder($id, $stackId, $order) {
$this->cardServiceValidator->check(compact('id', 'stackId', 'order')); if (is_numeric($id) === false) {
throw new BadRequestException('card id must be a number');
}
if (is_numeric($stackId) === false) {
throw new BadRequestException('stack id must be a number');
}
if (is_numeric($order) === false) {
throw new BadRequestException('order must be a number');
}
$this->permissionService->checkPermission($this->cardMapper, $id, Acl::PERMISSION_EDIT); $this->permissionService->checkPermission($this->cardMapper, $id, Acl::PERMISSION_EDIT);
$this->permissionService->checkPermission($this->stackMapper, $stackId, Acl::PERMISSION_EDIT); $this->permissionService->checkPermission($this->stackMapper, $stackId, Acl::PERMISSION_EDIT);
@@ -440,8 +490,9 @@ class CardService {
* @throws BadRequestException * @throws BadRequestException
*/ */
public function archive($id) { public function archive($id) {
$this->cardServiceValidator->check(compact('id')); if (is_numeric($id) === false) {
throw new BadRequestException('id must be a number');
}
$this->permissionService->checkPermission($this->cardMapper, $id, Acl::PERMISSION_EDIT); $this->permissionService->checkPermission($this->cardMapper, $id, Acl::PERMISSION_EDIT);
if ($this->boardService->isArchived($this->cardMapper, $id)) { if ($this->boardService->isArchived($this->cardMapper, $id)) {
@@ -469,8 +520,9 @@ class CardService {
* @throws BadRequestException * @throws BadRequestException
*/ */
public function unarchive($id) { public function unarchive($id) {
$this->cardServiceValidator->check(compact('id')); if (is_numeric($id) === false) {
throw new BadRequestException('id must be a number');
}
$this->permissionService->checkPermission($this->cardMapper, $id, Acl::PERMISSION_EDIT); $this->permissionService->checkPermission($this->cardMapper, $id, Acl::PERMISSION_EDIT);
if ($this->boardService->isArchived($this->cardMapper, $id)) { if ($this->boardService->isArchived($this->cardMapper, $id)) {
@@ -497,8 +549,13 @@ class CardService {
* @throws BadRequestException * @throws BadRequestException
*/ */
public function assignLabel($cardId, $labelId) { public function assignLabel($cardId, $labelId) {
$this->cardServiceValidator->check(compact('cardId', 'labelId')); if (is_numeric($cardId) === false) {
throw new BadRequestException('card id must be a number');
}
if (is_numeric($labelId) === false) {
throw new BadRequestException('label id must be a number');
}
$this->permissionService->checkPermission($this->cardMapper, $cardId, Acl::PERMISSION_EDIT); $this->permissionService->checkPermission($this->cardMapper, $cardId, Acl::PERMISSION_EDIT);
if ($this->boardService->isArchived($this->cardMapper, $cardId)) { if ($this->boardService->isArchived($this->cardMapper, $cardId)) {
@@ -526,8 +583,13 @@ class CardService {
* @throws BadRequestException * @throws BadRequestException
*/ */
public function removeLabel($cardId, $labelId) { public function removeLabel($cardId, $labelId) {
$this->cardServiceValidator->check(compact('cardId', 'labelId')); if (is_numeric($cardId) === false) {
throw new BadRequestException('card id must be a number');
}
if (is_numeric($labelId) === false) {
throw new BadRequestException('label id must be a number');
}
$this->permissionService->checkPermission($this->cardMapper, $cardId, Acl::PERMISSION_EDIT); $this->permissionService->checkPermission($this->cardMapper, $cardId, Acl::PERMISSION_EDIT);
if ($this->boardService->isArchived($this->cardMapper, $cardId)) { if ($this->boardService->isArchived($this->cardMapper, $cardId)) {
+1 -14
View File
@@ -40,8 +40,6 @@ use Throwable;
class CirclesService { class CirclesService {
private $circlesEnabled; private $circlesEnabled;
private $userCircleCache = [];
public function __construct(IAppManager $appManager) { public function __construct(IAppManager $appManager) {
$this->circlesEnabled = $appManager->isEnabledForUser('circles'); $this->circlesEnabled = $appManager->isEnabledForUser('circles');
} }
@@ -72,10 +70,6 @@ class CirclesService {
return false; return false;
} }
if (isset($this->userCircleCache[$circleId][$userId])) {
return $this->userCircleCache[$circleId][$userId];
}
try { try {
/** @var CirclesManager $circlesManager */ /** @var CirclesManager $circlesManager */
$circlesManager = \OC::$server->get(CirclesManager::class); $circlesManager = \OC::$server->get(CirclesManager::class);
@@ -83,14 +77,7 @@ class CirclesService {
$circlesManager->startSession($federatedUser); $circlesManager->startSession($federatedUser);
$circle = $circlesManager->getCircle($circleId); $circle = $circlesManager->getCircle($circleId);
$member = $circle->getInitiator(); $member = $circle->getInitiator();
$isUserInCircle = $member !== null && $member->getLevel() >= Member::LEVEL_MEMBER; return $member !== null && $member->getLevel() >= Member::LEVEL_MEMBER;
if (!isset($this->userCircleCache[$circleId])) {
$this->userCircleCache[$circleId] = [];
}
$this->userCircleCache[$circleId][$userId] = $isUserInCircle;
return $isUserInCircle;
} catch (Throwable $e) { } catch (Throwable $e) {
} }
return false; return false;
+11 -4
View File
@@ -83,17 +83,24 @@ class CommentService {
} }
/** /**
* @param string $cardId
* @param string $message
* @param string $replyTo
* @return DataResponse
* @throws BadRequestException * @throws BadRequestException
* @throws NotFoundException|NoPermissionException * @throws NotFoundException|NoPermissionException
*/ */
public function create(int $cardId, string $message, string $replyTo = '0'): DataResponse { public function create(string $cardId, string $message, string $replyTo = '0'): DataResponse {
if (!is_numeric($cardId)) {
throw new BadRequestException('A valid card id must be provided');
}
$this->permissionService->checkPermission($this->cardMapper, $cardId, Acl::PERMISSION_READ); $this->permissionService->checkPermission($this->cardMapper, $cardId, Acl::PERMISSION_READ);
// Check if parent is a comment on the same card // Check if parent is a comment on the same card
if ($replyTo !== '0') { if ($replyTo !== '0') {
try { try {
$comment = $this->commentsManager->get($replyTo); $comment = $this->commentsManager->get($replyTo);
if ($comment->getObjectType() !== Application::COMMENT_ENTITY_TYPE || (int)$comment->getObjectId() !== $cardId) { if ($comment->getObjectType() !== Application::COMMENT_ENTITY_TYPE || $comment->getObjectId() !== $cardId) {
throw new CommentNotFoundException(); throw new CommentNotFoundException();
} }
} catch (CommentNotFoundException $e) { } catch (CommentNotFoundException $e) {
@@ -102,7 +109,7 @@ class CommentService {
} }
try { try {
$comment = $this->commentsManager->create('users', $this->userId, Application::COMMENT_ENTITY_TYPE, (string)$cardId); $comment = $this->commentsManager->create('users', $this->userId, Application::COMMENT_ENTITY_TYPE, $cardId);
$comment->setMessage($message); $comment->setMessage($message);
$comment->setVerb('comment'); $comment->setVerb('comment');
$comment->setParentId($replyTo); $comment->setParentId($replyTo);
@@ -138,7 +145,7 @@ class CommentService {
throw new NoPermissionException('Only authors are allowed to edit their comment.'); throw new NoPermissionException('Only authors are allowed to edit their comment.');
} }
if ($comment->getParentId() !== '0') { if ($comment->getParentId() !== '0') {
$this->permissionService->checkPermission($this->cardMapper, (int)$comment->getParentId(), Acl::PERMISSION_READ); $this->permissionService->checkPermission($this->cardMapper, $comment->getParentId(), Acl::PERMISSION_READ);
} }
$comment->setMessage($message); $comment->setMessage($message);
-8
View File
@@ -176,12 +176,4 @@ class ConfigService {
return $this->config->getUserValue($userId ?? $this->getUserId(), 'deck', 'attachment_folder', '/Deck'); return $this->config->getUserValue($userId ?? $this->getUserId(), 'deck', 'attachment_folder', '/Deck');
} }
public function setAttachmentFolder(?string $userId = null, string $path): void {
if ($userId === null && $this->getUserId() === null) {
throw new NoPermissionException('Must be logged in get the attachment folder');
}
$this->config->setUserValue($userId ?? $this->getUserId(), 'deck', 'attachment_folder', $path);
}
} }
+4 -37
View File
@@ -31,7 +31,6 @@ use OCA\Deck\Sharing\DeckShareProvider;
use OCA\Deck\StatusException; use OCA\Deck\StatusException;
use OCP\AppFramework\Http\StreamResponse; use OCP\AppFramework\Http\StreamResponse;
use OCP\Constants; use OCP\Constants;
use OCP\Files\Folder;
use OCP\Files\IMimeTypeDetector; use OCP\Files\IMimeTypeDetector;
use OCP\Files\IRootFolder; use OCP\Files\IRootFolder;
use OCP\Files\NotFoundException; use OCP\Files\NotFoundException;
@@ -138,7 +137,7 @@ class FilesAppService implements IAttachmentService, ICustomAttachmentService {
public function extendData(Attachment $attachment) { public function extendData(Attachment $attachment) {
$userFolder = $this->rootFolder->getUserFolder($this->userId); $userFolder = $this->rootFolder->getUserFolder($this->userId);
$share = $this->getShareForAttachment($attachment); $share = $this->shareProvider->getShareById($attachment->getId());
$files = $userFolder->getById($share->getNode()->getId()); $files = $userFolder->getById($share->getNode()->getId());
if (count($files) === 0) { if (count($files) === 0) {
return $attachment; return $attachment;
@@ -161,7 +160,7 @@ class FilesAppService implements IAttachmentService, ICustomAttachmentService {
// Problem: Folders // Problem: Folders
/** @psalm-suppress InvalidCatch */ /** @psalm-suppress InvalidCatch */
try { try {
$share = $this->getShareForAttachment($attachment); $share = $this->shareProvider->getShareById($attachment->getId());
} catch (ShareNotFound $e) { } catch (ShareNotFound $e) {
throw new NotFoundException('File not found'); throw new NotFoundException('File not found');
} }
@@ -190,16 +189,6 @@ class FilesAppService implements IAttachmentService, ICustomAttachmentService {
$folder = $userFolder->newFolder($this->configService->getAttachmentFolder()); $folder = $userFolder->newFolder($this->configService->getAttachmentFolder());
} }
if ($folder->isShared()) {
$folderName = $userFolder->getNonExistingName($this->configService->getAttachmentFolder());
$folder = $userFolder->newFolder($folderName);
$this->configService->setAttachmentFolder($this->userId, $folderName);
}
if (!$folder instanceof Folder || $folder->isShared()) {
throw new NotFoundException('No target folder found');
}
$fileName = $folder->getNonExistingName($fileName); $fileName = $folder->getNonExistingName($fileName);
$target = $folder->newFile($fileName); $target = $folder->newFile($fileName);
$content = fopen($file['tmp_name'], 'rb'); $content = fopen($file['tmp_name'], 'rb');
@@ -251,7 +240,7 @@ class FilesAppService implements IAttachmentService, ICustomAttachmentService {
} }
public function update(Attachment $attachment) { public function update(Attachment $attachment) {
$share = $this->getShareForAttachment($attachment); $share = $this->shareProvider->getShareById($attachment->getId());
$target = $share->getNode(); $target = $share->getNode();
$file = $this->getUploadedFile(); $file = $this->getUploadedFile();
$fileName = $file['name']; $fileName = $file['name'];
@@ -268,13 +257,8 @@ class FilesAppService implements IAttachmentService, ICustomAttachmentService {
return $attachment; return $attachment;
} }
/**
* @throws NoPermissionException
* @throws NotFoundException
* @throws ShareNotFound
*/
public function delete(Attachment $attachment) { public function delete(Attachment $attachment) {
$share = $this->getShareForAttachment($attachment); $share = $this->shareProvider->getShareById($attachment->getId());
$file = $share->getNode(); $file = $share->getNode();
$attachment->setData($file->getName()); $attachment->setData($file->getName());
@@ -297,21 +281,4 @@ class FilesAppService implements IAttachmentService, ICustomAttachmentService {
public function markAsDeleted(Attachment $attachment) { public function markAsDeleted(Attachment $attachment) {
throw new \Exception('Not implemented'); throw new \Exception('Not implemented');
} }
/**
* @throws NoPermissionException
*/
private function getShareForAttachment(Attachment $attachment): IShare {
try {
$share = $this->shareProvider->getShareById($attachment->getId());
} catch (ShareNotFound $e) {
throw new NoPermissionException('No permission to access the attachment from the card');
}
if ((int)$share->getSharedWith() !== (int)$attachment->getCardId()) {
throw new NoPermissionException('No permission to access the attachment from the card');
}
return $share;
}
} }
+2 -2
View File
@@ -59,7 +59,7 @@ class FullTextSearchService {
/** @var CardMapper */ /** @var CardMapper */
private $cardMapper; private $cardMapper;
public function __construct( public function __construct(
BoardMapper $boardMapper, StackMapper $stackMapper, CardMapper $cardMapper BoardMapper $boardMapper, StackMapper $stackMapper, CardMapper $cardMapper
) { ) {
@@ -187,6 +187,6 @@ class FullTextSearchService {
* @return Board[] * @return Board[]
*/ */
private function getBoardsFromUser(string $userId): array { private function getBoardsFromUser(string $userId): array {
return $this->boardMapper->findAllByUser($userId, null, null, null); return $this->boardMapper->findAllByUser($userId, null, null, -1);
} }
} }
+26 -14
View File
@@ -29,7 +29,6 @@ use OCA\Deck\Db\Acl;
use OCA\Deck\Db\LabelMapper; use OCA\Deck\Db\LabelMapper;
use OCA\Deck\StatusException; use OCA\Deck\StatusException;
use OCA\Deck\BadRequestException; use OCA\Deck\BadRequestException;
use OCA\Deck\Validators\LabelServiceValidator;
class LabelService { class LabelService {
@@ -41,21 +40,12 @@ class LabelService {
private $boardService; private $boardService;
/** @var ChangeHelper */ /** @var ChangeHelper */
private $changeHelper; private $changeHelper;
/** @var LabelServiceValidator */
private $labelServiceValidator;
public function __construct( public function __construct(LabelMapper $labelMapper, PermissionService $permissionService, BoardService $boardService, ChangeHelper $changeHelper) {
LabelMapper $labelMapper,
PermissionService $permissionService,
BoardService $boardService,
ChangeHelper $changeHelper,
LabelServiceValidator $labelServiceValidator
) {
$this->labelMapper = $labelMapper; $this->labelMapper = $labelMapper;
$this->permissionService = $permissionService; $this->permissionService = $permissionService;
$this->boardService = $boardService; $this->boardService = $boardService;
$this->changeHelper = $changeHelper; $this->changeHelper = $changeHelper;
$this->labelServiceValidator = $labelServiceValidator;
} }
/** /**
@@ -86,7 +76,17 @@ class LabelService {
* @throws BadRequestException * @throws BadRequestException
*/ */
public function create($title, $color, $boardId) { public function create($title, $color, $boardId) {
$this->labelServiceValidator->check(compact('title', 'color', 'boardId')); if ($title === false || $title === null) {
throw new BadRequestException('title must be provided');
}
if ($color === false || $color === null) {
throw new BadRequestException('color must be provided');
}
if (is_numeric($boardId) === false) {
throw new BadRequestException('board id must be a number');
}
$this->permissionService->checkPermission(null, $boardId, Acl::PERMISSION_MANAGE); $this->permissionService->checkPermission(null, $boardId, Acl::PERMISSION_MANAGE);
@@ -121,7 +121,9 @@ class LabelService {
* @throws BadRequestException * @throws BadRequestException
*/ */
public function delete($id) { public function delete($id) {
$this->labelServiceValidator->check(compact('id')); if (is_numeric($id) === false) {
throw new BadRequestException('label id must be a number');
}
$this->permissionService->checkPermission($this->labelMapper, $id, Acl::PERMISSION_MANAGE); $this->permissionService->checkPermission($this->labelMapper, $id, Acl::PERMISSION_MANAGE);
if ($this->boardService->isArchived($this->labelMapper, $id)) { if ($this->boardService->isArchived($this->labelMapper, $id)) {
@@ -144,7 +146,17 @@ class LabelService {
* @throws BadRequestException * @throws BadRequestException
*/ */
public function update($id, $title, $color) { public function update($id, $title, $color) {
$this->labelServiceValidator->check(compact('title', 'color', 'id')); if (is_numeric($id) === false) {
throw new BadRequestException('label id must be a number');
}
if ($title === false || $title === null || $title === "") {
throw new BadRequestException('title must be provided');
}
if ($color === false || $color === null) {
throw new BadRequestException('color must be provided');
}
$this->permissionService->checkPermission($this->labelMapper, $id, Acl::PERMISSION_MANAGE); $this->permissionService->checkPermission($this->labelMapper, $id, Acl::PERMISSION_MANAGE);
+20 -39
View File
@@ -29,11 +29,11 @@ use OCA\Deck\Db\Acl;
use OCA\Deck\Db\AclMapper; use OCA\Deck\Db\AclMapper;
use OCA\Deck\Db\Board; use OCA\Deck\Db\Board;
use OCA\Deck\Db\BoardMapper; use OCA\Deck\Db\BoardMapper;
use OCA\Deck\Db\CardMapper;
use OCA\Deck\Db\IPermissionMapper; use OCA\Deck\Db\IPermissionMapper;
use OCA\Deck\Db\User; use OCA\Deck\Db\User;
use OCA\Deck\NoPermissionException; use OCA\Deck\NoPermissionException;
use OCP\AppFramework\Db\DoesNotExistException; use OCP\AppFramework\Db\DoesNotExistException;
use OCP\AppFramework\Db\Entity;
use OCP\AppFramework\Db\MultipleObjectsReturnedException; use OCP\AppFramework\Db\MultipleObjectsReturnedException;
use OCP\IConfig; use OCP\IConfig;
use OCP\IGroupManager; use OCP\IGroupManager;
@@ -65,7 +65,6 @@ class PermissionService {
private $users = []; private $users = [];
private $boardCache; private $boardCache;
private $permissionCache;
public function __construct( public function __construct(
ILogger $logger, ILogger $logger,
@@ -89,7 +88,6 @@ class PermissionService {
$this->userId = $userId; $this->userId = $userId;
$this->boardCache = new CappedMemoryCache(); $this->boardCache = new CappedMemoryCache();
$this->permissionCache = new CappedMemoryCache();
} }
/** /**
@@ -98,27 +96,16 @@ class PermissionService {
* @param $boardId * @param $boardId
* @return bool|array * @return bool|array
*/ */
public function getPermissions($boardId, ?string $userId = null) { public function getPermissions($boardId) {
if ($userId === null) { $owner = $this->userIsBoardOwner($boardId);
$userId = $this->userId; $acls = $this->aclMapper->findAll($boardId);
} return [
if ($cached = $this->permissionCache->get($boardId)) {
return $cached;
}
$board = $this->getBoard($boardId);
$owner = $this->userIsBoardOwner($boardId, $userId);
$acls = $board->getDeletedAt() === 0 ? $this->aclMapper->findAll($boardId) : [];
$permissions = [
Acl::PERMISSION_READ => $owner || $this->userCan($acls, Acl::PERMISSION_READ), Acl::PERMISSION_READ => $owner || $this->userCan($acls, Acl::PERMISSION_READ),
Acl::PERMISSION_EDIT => $owner || $this->userCan($acls, Acl::PERMISSION_EDIT), Acl::PERMISSION_EDIT => $owner || $this->userCan($acls, Acl::PERMISSION_EDIT),
Acl::PERMISSION_MANAGE => $owner || $this->userCan($acls, Acl::PERMISSION_MANAGE), Acl::PERMISSION_MANAGE => $owner || $this->userCan($acls, Acl::PERMISSION_MANAGE),
Acl::PERMISSION_SHARE => ($owner || $this->userCan($acls, Acl::PERMISSION_SHARE)) Acl::PERMISSION_SHARE => ($owner || $this->userCan($acls, Acl::PERMISSION_SHARE))
&& (!$this->shareManager->sharingDisabledForUser($this->userId)) && (!$this->shareManager->sharingDisabledForUser($this->userId))
]; ];
$this->permissionCache->set((string)$boardId, $permissions);
return $permissions;
} }
/** /**
@@ -130,7 +117,7 @@ class PermissionService {
*/ */
public function matchPermissions(Board $board) { public function matchPermissions(Board $board) {
$owner = $this->userIsBoardOwner($board->getId()); $owner = $this->userIsBoardOwner($board->getId());
$acls = $board->getAcl() ?? []; $acls = $board->getAcl();
return [ return [
Acl::PERMISSION_READ => $owner || $this->userCan($acls, Acl::PERMISSION_READ), Acl::PERMISSION_READ => $owner || $this->userCan($acls, Acl::PERMISSION_READ),
Acl::PERMISSION_EDIT => $owner || $this->userCan($acls, Acl::PERMISSION_EDIT), Acl::PERMISSION_EDIT => $owner || $this->userCan($acls, Acl::PERMISSION_EDIT),
@@ -143,10 +130,13 @@ class PermissionService {
/** /**
* check permissions for replacing dark magic middleware * check permissions for replacing dark magic middleware
* *
* @param numeric $id * @param $mapper IPermissionMapper|null null if $id is a boardId
* @param $id int unique identifier of the Entity
* @param $permission int
* @return bool
* @throws NoPermissionException * @throws NoPermissionException
*/ */
public function checkPermission($mapper, $id, $permission, $userId = null, bool $allowDeletedCard = false) { public function checkPermission($mapper, $id, $permission, $userId = null) {
$boardId = $id; $boardId = $id;
if ($mapper instanceof IPermissionMapper && !($mapper instanceof BoardMapper)) { if ($mapper instanceof IPermissionMapper && !($mapper instanceof BoardMapper)) {
$boardId = $mapper->findBoardId($id); $boardId = $mapper->findBoardId($id);
@@ -160,20 +150,12 @@ class PermissionService {
throw new NoPermissionException('Permission denied'); throw new NoPermissionException('Permission denied');
} }
if ($this->userIsBoardOwner($boardId, $userId)) {
return true;
}
try { try {
$permissions = $this->getPermissions($boardId, $userId); $acls = $this->getBoard($boardId)->getAcl();
if ($permissions[$permission] === true) {
if (!$allowDeletedCard && $mapper instanceof CardMapper) {
$card = $mapper->find($id);
if ($card->getDeletedAt() > 0) {
throw new NoPermissionException('Card is deleted');
}
}
return true;
}
$acls = $this->getBoard((int)$boardId)->getAcl() ?? [];
$result = $this->userCan($acls, $permission, $userId); $result = $this->userCan($acls, $permission, $userId);
if ($result) { if ($result) {
return true; return true;
@@ -205,11 +187,11 @@ class PermissionService {
* @throws MultipleObjectsReturnedException * @throws MultipleObjectsReturnedException
* @throws DoesNotExistException * @throws DoesNotExistException
*/ */
private function getBoard(int $boardId): Board { private function getBoard($boardId): Board {
if (!isset($this->boardCache[(string)$boardId])) { if (!isset($this->boardCache[$boardId])) {
$this->boardCache[(string)$boardId] = $this->boardMapper->find($boardId, false, true); $this->boardCache[$boardId] = $this->boardMapper->find($boardId, false, true);
} }
return $this->boardCache[(string)$boardId]; return $this->boardCache[$boardId];
} }
/** /**
@@ -361,6 +343,5 @@ class PermissionService {
*/ */
public function setUserId(string $userId): void { public function setUserId(string $userId): void {
$this->userId = $userId; $this->userId = $userId;
$this->permissionCache->clear();
} }
} }
+11 -5
View File
@@ -90,19 +90,25 @@ class SearchService {
} }
public function searchBoards(string $term, ?int $limit, ?int $cursor): array { public function searchBoards(string $term, ?int $limit, ?int $cursor): array {
$boards = $this->boardService->getUserBoards(null, true, $cursor, mb_strtolower($term)); $boards = $this->boardService->getUserBoards();
// get boards that have a lastmodified date which is lower than the cursor
// and which match the search term
$filteredBoards = array_filter($boards, static function (Board $board) use ($term, $cursor) {
return (
($cursor === null || $board->getLastModified() < $cursor)
&& mb_stripos(mb_strtolower($board->getTitle()), mb_strtolower($term)) > -1
);
});
// sort the boards, recently modified first // sort the boards, recently modified first
usort($boards, function ($boardA, $boardB) { usort($filteredBoards, function ($boardA, $boardB) {
$ta = $boardA->getLastModified(); $ta = $boardA->getLastModified();
$tb = $boardB->getLastModified(); $tb = $boardB->getLastModified();
return $ta === $tb return $ta === $tb
? 0 ? 0
: ($ta > $tb ? -1 : 1); : ($ta > $tb ? -1 : 1);
}); });
// limit the number of results // limit the number of results
return array_slice($boards, 0, $limit); return array_slice($filteredBoards, 0, $limit);
} }
public function searchComments(string $term, ?int $limit = null, ?int $cursor = null): array { public function searchComments(string $term, ?int $limit = null, ?int $cursor = null): array {
+33 -7
View File
@@ -37,7 +37,6 @@ use OCA\Deck\Db\Stack;
use OCA\Deck\Db\StackMapper; use OCA\Deck\Db\StackMapper;
use OCA\Deck\NoPermissionException; use OCA\Deck\NoPermissionException;
use OCA\Deck\StatusException; use OCA\Deck\StatusException;
use OCA\Deck\Validators\StackServiceValidator;
class StackService { class StackService {
private $stackMapper; private $stackMapper;
@@ -51,7 +50,6 @@ class StackService {
private $attachmentService; private $attachmentService;
private $activityManager; private $activityManager;
private $changeHelper; private $changeHelper;
private $stackServiceValidator;
public function __construct( public function __construct(
StackMapper $stackMapper, StackMapper $stackMapper,
@@ -64,7 +62,6 @@ class StackService {
AssignmentMapper $assignedUsersMapper, AssignmentMapper $assignedUsersMapper,
AttachmentService $attachmentService, AttachmentService $attachmentService,
ActivityManager $activityManager, ActivityManager $activityManager,
StackServiceValidator $stackServiceValidator,
ChangeHelper $changeHelper ChangeHelper $changeHelper
) { ) {
$this->stackMapper = $stackMapper; $this->stackMapper = $stackMapper;
@@ -78,7 +75,6 @@ class StackService {
$this->attachmentService = $attachmentService; $this->attachmentService = $attachmentService;
$this->activityManager = $activityManager; $this->activityManager = $activityManager;
$this->changeHelper = $changeHelper; $this->changeHelper = $changeHelper;
$this->stackServiceValidator = $stackServiceValidator;
} }
private function enrichStackWithCards($stack, $since = -1) { private function enrichStackWithCards($stack, $since = -1) {
@@ -206,7 +202,17 @@ class StackService {
* @throws BadRequestException * @throws BadRequestException
*/ */
public function create($title, $boardId, $order) { public function create($title, $boardId, $order) {
$this->stackServiceValidator->check(compact('title', 'boardId', 'order')); if ($title === false || $title === null) {
throw new BadRequestException('title must be provided');
}
if (is_numeric($order) === false) {
throw new BadRequestException('order must be a number');
}
if (is_numeric($boardId) === false) {
throw new BadRequestException('board id must be a number');
}
$this->permissionService->checkPermission(null, $boardId, Acl::PERMISSION_MANAGE); $this->permissionService->checkPermission(null, $boardId, Acl::PERMISSION_MANAGE);
if ($this->boardService->isArchived(null, $boardId)) { if ($this->boardService->isArchived(null, $boardId)) {
@@ -269,7 +275,21 @@ class StackService {
* @throws BadRequestException * @throws BadRequestException
*/ */
public function update($id, $title, $boardId, $order, $deletedAt) { public function update($id, $title, $boardId, $order, $deletedAt) {
$this->stackServiceValidator->check(compact('id', 'title', 'boardId', 'order')); if (is_numeric($id) === false) {
throw new BadRequestException('stack id must be a number');
}
if ($title === false || $title === null) {
throw new BadRequestException('title must be provided');
}
if (is_numeric($boardId) === false) {
throw new BadRequestException('board id must be a number');
}
if (is_numeric($order) === false) {
throw new BadRequestException('order must be a number');
}
$this->permissionService->checkPermission($this->stackMapper, $id, Acl::PERMISSION_MANAGE); $this->permissionService->checkPermission($this->stackMapper, $id, Acl::PERMISSION_MANAGE);
$this->permissionService->checkPermission($this->boardMapper, $boardId, Acl::PERMISSION_MANAGE); $this->permissionService->checkPermission($this->boardMapper, $boardId, Acl::PERMISSION_MANAGE);
@@ -305,7 +325,13 @@ class StackService {
* @throws BadRequestException * @throws BadRequestException
*/ */
public function reorder($id, $order) { public function reorder($id, $order) {
$this->stackServiceValidator->check(compact('id', 'order')); if (is_numeric($id) === false) {
throw new BadRquestException('id must be a number');
}
if ($order === false || $order === null) {
throw new BadRequestException('order must be provided');
}
$this->permissionService->checkPermission($this->stackMapper, $id, Acl::PERMISSION_MANAGE); $this->permissionService->checkPermission($this->stackMapper, $id, Acl::PERMISSION_MANAGE);
$stackToSort = $this->stackMapper->find($id); $stackToSort = $this->stackMapper->find($id);
+1 -1
View File
@@ -115,7 +115,7 @@ class ShareAPIHelper {
*/ */
public function canAccessShare(IShare $share, string $user): bool { public function canAccessShare(IShare $share, string $user): bool {
try { try {
$this->permissionService->checkPermission($this->cardMapper, (int)$share->getSharedWith(), Acl::PERMISSION_READ, $user); $this->permissionService->checkPermission($this->cardMapper, $share->getSharedWith(), Acl::PERMISSION_READ, $user);
} catch (NoPermissionException $e) { } catch (NoPermissionException $e) {
return false; return false;
} }
@@ -1,37 +0,0 @@
<?php
/**
* @copyright Copyright (c) 2016 Julius Härtl <jus@bitgrid.net>
*
* @author Julius Härtl <jus@bitgrid.net>
* @author Maxence Lange <maxence@artificial-owl.com>
* @author Luka Trovic <luka.trovic@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/>.
*
*/
declare(strict_types=1);
namespace OCA\Deck\Validators;
class AssignmentServiceValidator extends BaseValidator {
public function rules() {
return [
'cardId' => ['numeric'],
'userId' => ['not_empty', 'not_null', 'not_false', 'max:64'],
];
}
}
@@ -1,37 +0,0 @@
<?php
/**
* @copyright Copyright (c) 2016 Julius Härtl <jus@bitgrid.net>
*
* @author Julius Härtl <jus@bitgrid.net>
* @author Maxence Lange <maxence@artificial-owl.com>
* @author Luka Trovic <luka.trovic@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/>.
*
*/
declare(strict_types=1);
namespace OCA\Deck\Validators;
class AttachmentServiceValidator extends BaseValidator {
public function rules() {
return [
'cardId' => ['numeric'],
'type' => ['not_empty', 'not_null', 'not_false'],
'data' => ['not_empty', 'not_null', 'not_false', 'max:255'],
];
}
}
-182
View File
@@ -1,182 +0,0 @@
<?php
/**
* @copyright Copyright (c) 2016 Julius Härtl <jus@bitgrid.net>
*
* @author Julius Härtl <jus@bitgrid.net>
* @author Maxence Lange <maxence@artificial-owl.com>
* @author Luka Trovic <luka.trovic@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/>.
*
*/
declare(strict_types=1);
namespace OCA\Deck\Validators;
use Exception;
use OCA\Deck\BadRequestException;
abstract class BaseValidator {
/**
* @return array
*/
abstract public function rules();
/**
* Validate given entries
*
* @param array $data
* @return void
* @throws BadRequestException
*/
private function validate($data) {
$rules = $this->rules();
foreach ($data as $field => $value) {
$field_rule = $rules[$field];
if (is_array($field_rule)) {
foreach ($field_rule as $rule) {
// The format for specifying validation rules and parameters follows an
// easy {rule}:{parameters} formatting convention. For instance the
// rule "Max:3" states that the value may only be three letters.
if (strpos($rule, ':') !== false) {
[$rule, $parameter] = explode(':', $rule, 2);
if (!$this->{$rule}($value, $parameter)) {
throw new BadRequestException(
$this->getErrorMessage($rule, $field, $parameter));
}
} else {
if (!$this->{$rule}($value)) {
throw new BadRequestException(
$field . ' must be provided and must be '. str_replace("_", " ", $rule));
}
}
}
}
if (is_callable($field_rule) && !$field_rule($value)) {
throw new BadRequestException($field . ' must be provided');
}
}
}
/**
* @param array $data
* @return void
* @throws BadRequestException
*/
public function check(array $data) {
$this->validate($data);
}
/**
* @param $value
* @return bool
*/
private function numeric($value): bool {
return is_numeric($value);
}
/**
* @param $value
* @return bool
*/
private function bool($value): bool {
return is_bool($value);
}
/**
* @param $value
* @return bool
*/
private function not_false($value): bool {
return ($value !== false) && ($value !== 'false');
}
/**
* @param $value
* @return bool
*/
private function not_null($value): bool {
return !is_null($value);
}
/**
* @param $value
* @return bool
*/
private function not_empty($value): bool {
return !empty($value);
}
/**
* @throws Exception
*/
private function max($value, $limit): bool {
if (!$limit || !is_numeric($limit)) {
throw new Exception("Validation rule max requires at least 1 parameter. " . json_encode($limit));
}
return $this->getSize($value) <= $limit;
}
/**
* @throws Exception
*/
private function min($value, $limit): bool {
if (!$limit || !is_numeric($limit)) {
throw new Exception("Validation rule max requires at least 1 parameter.");
}
return $this->getSize($value) >= $limit;
}
/**
* Get the size of an attribute.
*
* @param mixed $value
* @return int
*/
protected function getSize($value): int {
// This method will determine if the attribute is a number or string and
// return the proper size accordingly. If it is a number, then number itself
// is the size.
if (is_int($value)) {
return $value;
} elseif (is_array($value)) {
return count($value);
}
return mb_strlen($value ?? '');
}
/**
* @param $rule
* @param $field
* @param $parameter
* @return string
*/
protected function getErrorMessage($rule, $field, $parameter = null): string {
if (in_array($rule, ['max', 'min'])) {
return $rule === 'max'
? $field . ' cannot be longer than '. $parameter . ' characters '
: $field . ' must be at least '. $parameter . ' characters long ';
}
return $field . ' must be provided and must be '. str_replace("_", " ", $rule);
}
}
-47
View File
@@ -1,47 +0,0 @@
<?php
/**
* @copyright Copyright (c) 2016 Julius Härtl <jus@bitgrid.net>
*
* @author Julius Härtl <jus@bitgrid.net>
* @author Maxence Lange <maxence@artificial-owl.com>
* @author Luka Trovic <luka.trovic@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/>.
*
*/
declare(strict_types=1);
namespace OCA\Deck\Validators;
class BoardServiceValidator extends BaseValidator {
public function rules() {
return [
'id' => ['numeric'],
'boardId' => ['numeric'],
'type' => ['numeric'],
'mapper' => ['not_empty', 'not_null', 'not_false'],
'title' => ['not_empty', 'not_null', 'not_false', 'max:100'],
'userId' => ['not_empty', 'not_null', 'not_false', 'max:64'],
'color' => ['not_empty', 'not_null', 'not_false', 'max:6'],
'participant' => ['not_empty', 'not_null', 'not_false', 'max:64'],
'edit' => ['not_null'],
'share' => ['not_null'],
'manage' => ['not_null'],
'archived' => ['bool']
];
}
}
-44
View File
@@ -1,44 +0,0 @@
<?php
/**
* @copyright Copyright (c) 2016 Julius Härtl <jus@bitgrid.net>
*
* @author Julius Härtl <jus@bitgrid.net>
* @author Maxence Lange <maxence@artificial-owl.com>
* @author Luka Trovic <luka.trovic@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/>.
*
*/
declare(strict_types=1);
namespace OCA\Deck\Validators;
class CardServiceValidator extends BaseValidator {
public function rules() {
return [
'id' => ['numeric'],
'title' => ['not_empty', 'not_null', 'not_false', 'max:255'],
'cardId' => ['numeric'],
'stackId' => ['numeric'],
'boardId' => ['numeric'],
'labelId' => ['numeric'],
'type' => ['not_empty', 'not_null', 'not_false', 'max:64'],
'order' => ['numeric'],
'owner' => ['not_empty', 'not_null', 'not_false', 'max:64'],
];
}
}
-39
View File
@@ -1,39 +0,0 @@
<?php
/**
* @copyright Copyright (c) 2016 Julius Härtl <jus@bitgrid.net>
*
* @author Julius Härtl <jus@bitgrid.net>
* @author Maxence Lange <maxence@artificial-owl.com>
* @author Luka Trovic <luka.trovic@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/>.
*
*/
declare(strict_types=1);
namespace OCA\Deck\Validators;
class LabelServiceValidator extends BaseValidator {
public function rules() {
return [
'id' => ['numeric'],
'title' => ['not_empty', 'not_null', 'not_false', 'max:100'],
'boardId' => ['numeric', 'not_null'],
'color' => ['not_empty', 'not_null', 'not_false', 'max:6']
];
}
}
-39
View File
@@ -1,39 +0,0 @@
<?php
/**
* @copyright Copyright (c) 2016 Julius Härtl <jus@bitgrid.net>
*
* @author Julius Härtl <jus@bitgrid.net>
* @author Maxence Lange <maxence@artificial-owl.com>
* @author Luka Trovic <luka.trovic@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/>.
*
*/
declare(strict_types=1);
namespace OCA\Deck\Validators;
class StackServiceValidator extends BaseValidator {
public function rules() {
return [
'id' => ['numeric'],
'title' => ['not_empty', 'not_null', 'not_false', 'max:100'],
'boardId' => ['numeric', 'not_null'],
'order' => ['numeric', 'not_null']
];
}
}
+9870 -8133
View File
File diff suppressed because it is too large Load Diff
+97 -98
View File
@@ -1,100 +1,99 @@
{ {
"name": "deck", "name": "deck",
"description": "", "description": "",
"version": "1.6.7", "version": "1.5.8",
"authors": [ "authors": [
{ {
"name": "Julius Härtl", "name": "Julius Härtl",
"email": "jus@bitgrid.net", "email": "jus@bitgrid.net",
"role": "Developer" "role": "Developer"
}, },
{ {
"name": "Michael Weimann", "name": "Michael Weimann",
"email": "mail@michael-weimann.eu", "email": "mail@michael-weimann.eu",
"role": "Developer" "role": "Developer"
} }
], ],
"license": "agpl", "license": "agpl",
"private": true, "private": true,
"scripts": { "scripts": {
"build": "NODE_ENV=production webpack --progress --config webpack.js", "build": "NODE_ENV=production webpack --progress --config webpack.js",
"dev": "NODE_ENV=development webpack --progress --config webpack.js", "dev": "NODE_ENV=development webpack --progress --config webpack.js",
"watch": "NODE_ENV=development webpack --progress --watch --config webpack.js", "watch": "NODE_ENV=development webpack --progress --watch --config webpack.js",
"lint": "eslint --ext .js,.vue src", "lint": "eslint --ext .js,.vue src",
"lint:fix": "eslint --ext .js,.vue src --fix", "lint:fix": "eslint --ext .js,.vue src --fix",
"stylelint": "stylelint src", "stylelint": "stylelint src",
"stylelint:fix": "stylelint src --fix", "stylelint:fix": "stylelint src --fix",
"test": "jest", "test": "jest",
"test:coverage": "jest --coverage" "test:coverage": "jest --coverage"
}, },
"dependencies": { "dependencies": {
"@babel/polyfill": "^7.12.1", "@babel/polyfill": "^7.12.1",
"@babel/runtime": "^7.16.0", "@babel/runtime": "^7.14.6",
"@juliushaertl/vue-richtext": "^1.0.1", "@juliushaertl/vue-richtext": "^1.0.1",
"@nextcloud/auth": "^1.3.0", "@nextcloud/auth": "^1.3.0",
"@nextcloud/axios": "^1.7.0", "@nextcloud/axios": "^1.6.0",
"@nextcloud/dialogs": "^3.1.2", "@nextcloud/dialogs": "^3.1.2",
"@nextcloud/event-bus": "^2.1.1", "@nextcloud/event-bus": "^2.0.0",
"@nextcloud/files": "^2.1.0", "@nextcloud/files": "^2.0.0",
"@nextcloud/initial-state": "^1.2.1", "@nextcloud/initial-state": "^1.2.0",
"@nextcloud/l10n": "^1.4.1", "@nextcloud/l10n": "^1.4.1",
"@nextcloud/moment": "^1.1.1", "@nextcloud/moment": "^1.1.1",
"@nextcloud/router": "^2.0.0", "@nextcloud/router": "^2.0.0",
"@nextcloud/vue": "^4.2.0", "@nextcloud/vue": "^3.10.1",
"@nextcloud/vue-dashboard": "^2.0.1", "@nextcloud/vue-dashboard": "^2.0.1",
"blueimp-md5": "^2.19.0", "blueimp-md5": "^2.18.0",
"dompurify": "^2.3.3", "dompurify": "^2.2.9",
"lodash": "^4.17.21", "lodash": "^4.17.21",
"markdown-it": "^12.2.0", "markdown-it": "^12.0.6",
"markdown-it-link-attributes": "^3.0.0", "markdown-it-task-lists": "^2.1.1",
"markdown-it-task-checkbox": "^1.0.6", "moment": "^2.29.1",
"moment": "^2.29.1", "nextcloud-vue-collections": "^0.9.0",
"nextcloud-vue-collections": "^0.9.0", "p-queue": "^6.6.2",
"p-queue": "^6.6.2", "url-search-params-polyfill": "^8.1.1",
"url-search-params-polyfill": "^8.1.1", "vue": "^2.6.14",
"vue": "^2.6.14", "vue-at": "^2.5.0-beta.2",
"vue-at": "^2.5.0-beta.2", "vue-click-outside": "^1.1.0",
"vue-click-outside": "^1.1.0", "vue-easymde": "^1.4.0",
"vue-easymde": "^2.0.0", "vue-infinite-loading": "^2.4.5",
"vue-infinite-loading": "^2.4.5", "vue-router": "^3.5.1",
"vue-router": "^3.5.3", "vue-smooth-dnd": "^0.8.1",
"vue-smooth-dnd": "^0.8.1", "vuex": "^3.6.2",
"vuex": "^3.6.2", "vuex-router-sync": "^5.0.0"
"vuex-router-sync": "^5.0.0" },
}, "browserslist": [
"browserslist": [ "extends @nextcloud/browserslist-config"
"extends @nextcloud/browserslist-config" ],
], "engines": {
"engines": { "node": "^14.0.0",
"node": "^14.0.0", "npm": "^7.0.0"
"npm": "^7.0.0" },
}, "devDependencies": {
"devDependencies": { "@nextcloud/babel-config": "^1.0.0-beta.1",
"@nextcloud/babel-config": "^1.0.0", "@nextcloud/browserslist-config": "^2.1.0",
"@nextcloud/browserslist-config": "^2.2.0", "@nextcloud/eslint-config": "^5.1.0",
"@nextcloud/eslint-config": "^6.1.0", "@nextcloud/stylelint-config": "^1.0.0-beta.0",
"@nextcloud/stylelint-config": "^1.0.0-beta.0", "@nextcloud/webpack-vue-config": "^4.0.3",
"@nextcloud/webpack-vue-config": "^4.1.2", "@relative-ci/agent": "^2.0.0",
"@relative-ci/agent": "^3.0.0", "@vue/test-utils": "^1.2.1",
"@vue/test-utils": "^1.2.2", "jest": "^27.0.4",
"jest": "^27.3.1", "jest-serializer-vue": "^2.0.2",
"jest-serializer-vue": "^2.0.2", "vue-jest": "^3.0.7"
"vue-jest": "^3.0.7" },
}, "jest": {
"jest": { "moduleFileExtensions": [
"moduleFileExtensions": [ "js",
"js", "vue"
"vue" ],
], "moduleNameMapper": {
"moduleNameMapper": { "^@/(.*)$": "<rootDir>/src/$1"
"^@/(.*)$": "<rootDir>/src/$1" },
}, "transform": {
"transform": { "^.+\\.js$": "<rootDir>/node_modules/babel-jest",
"^.+\\.js$": "<rootDir>/node_modules/babel-jest", ".*\\.(vue)$": "<rootDir>/node_modules/vue-jest"
".*\\.(vue)$": "<rootDir>/node_modules/vue-jest" },
}, "snapshotSerializers": [
"snapshotSerializers": [ "<rootDir>/node_modules/jest-serializer-vue"
"<rootDir>/node_modules/jest-serializer-vue" ]
] }
}
} }
+5 -5
View File
@@ -59,11 +59,6 @@ export default {
Content, Content,
AppContent, AppContent,
}, },
provide() {
return {
boardApi,
}
},
data() { data() {
return { return {
addButton: { addButton: {
@@ -117,6 +112,11 @@ export default {
this.$router.push({ name: 'board' }) this.$router.push({ name: 'board' })
}, },
}, },
provide() {
return {
boardApi,
}
},
} }
</script> </script>
+1 -1
View File
@@ -137,7 +137,7 @@ export default {
}, },
computed: { computed: {
isBoardAndStackChoosen() { isBoardAndStackChoosen() {
return !(this.selectedBoard === '' || this.selectedStack === '') return !(this.selectedBoard === '')
}, },
}, },
beforeMount() { beforeMount() {
+2 -15
View File
@@ -84,20 +84,7 @@ export default {
params.append('object_id', '' + this.objectId) params.append('object_id', '' + this.objectId)
params.append('limit', ACTIVITY_FETCH_LIMIT) params.append('limit', ACTIVITY_FETCH_LIMIT)
const response = await axios.get( const response = await axios.get(generateOcsUrl(`apps/activity/api/v2/activity/${this.filter}`) + '?' + params)
generateOcsUrl(`apps/activity/api/v2/activity/${this.filter}`) + '?' + params,
{
validateStatus: (status) => {
return (status >= 200 && status < 300) || status === 304
},
},
)
if (response.status === 304) {
this.endReached = true
return []
}
let activities = response.data.ocs.data let activities = response.data.ocs.data
if (this.filter === 'deck') { if (this.filter === 'deck') {
// We need to manually filter activities here, since currently we use two different types and there is no way // We need to manually filter activities here, since currently we use two different types and there is no way
@@ -108,7 +95,7 @@ export default {
}) })
} }
this.activities.push(...activities) this.activities.push(...activities)
if (activities.length === 0) { if (response.data.ocs.meta.statuscode === 304 || activities.length === 0) {
this.endReached = true this.endReached = true
return [] return []
} }
+100 -98
View File
@@ -76,108 +76,110 @@
<ActionButton v-else icon="icon-filter" /> <ActionButton v-else icon="icon-filter" />
</Actions> </Actions>
<div v-if="filterVisible" class="filter"> <template>
<h3>{{ t('deck', 'Filter by tag') }}</h3> <div v-if="filterVisible" class="filter">
<div v-for="label in labelsSorted" :key="label.id" class="filter--item"> <h3>{{ t('deck', 'Filter by tag') }}</h3>
<input <div v-for="label in labelsSorted" :key="label.id" class="filter--item">
:id="label.id" <input
v-model="filter.tags" :id="label.id"
type="checkbox" v-model="filter.tags"
class="checkbox" type="checkbox"
:value="label.id" class="checkbox"
@change="setFilter"> :value="label.id"
<label :for="label.id"><span class="label" :style="labelStyle(label)">{{ label.title }}</span></label> @change="setFilter">
</div> <label :for="label.id"><span class="label" :style="labelStyle(label)">{{ label.title }}</span></label>
</div>
<h3>{{ t('deck', 'Filter by assigned user') }}</h3> <h3>{{ t('deck', 'Filter by assigned user') }}</h3>
<div class="filter--item"> <div class="filter--item">
<input <input
id="unassigned" id="unassigned"
v-model="filter.unassigned" v-model="filter.unassigned"
type="checkbox" type="checkbox"
class="checkbox" class="checkbox"
value="unassigned" value="unassigned"
@change="setFilter" @change="setFilter"
@click="beforeSetFilter"> @click="beforeSetFilter">
<label for="unassigned">{{ t('deck', 'Unassigned') }}</label> <label for="unassigned">{{ t('deck', 'Unassigned') }}</label>
</div> </div>
<div v-for="user in board.users" :key="user.uid" class="filter--item"> <div v-for="user in board.users" :key="user.uid" class="filter--item">
<input <input
:id="user.uid" :id="user.uid"
v-model="filter.users" v-model="filter.users"
type="checkbox" type="checkbox"
class="checkbox" class="checkbox"
:value="user.uid" :value="user.uid"
@change="setFilter"> @change="setFilter">
<label :for="user.uid"><Avatar :user="user.uid" :size="24" :disable-menu="true" /> {{ user.displayname }}</label> <label :for="user.uid"><Avatar :user="user.uid" :size="24" :disable-menu="true" /> {{ user.displayname }}</label>
</div> </div>
<h3>{{ t('deck', 'Filter by due date') }}</h3> <h3>{{ t('deck', 'Filter by due date') }}</h3>
<div class="filter--item"> <div class="filter--item">
<input <input
id="overdue" id="overdue"
v-model="filter.due" v-model="filter.due"
type="radio" type="radio"
class="radio" class="radio"
value="overdue" value="overdue"
@change="setFilter" @change="setFilter"
@click="beforeSetFilter"> @click="beforeSetFilter">
<label for="overdue">{{ t('deck', 'Overdue') }}</label> <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> </div>
</template>
<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> </Popover>
<Actions> <Actions>
+1 -1
View File
@@ -208,7 +208,7 @@ export default {
confirmClasses: 'error', confirmClasses: 'error',
cancel: t('deck', 'Cancel'), cancel: t('deck', 'Cancel'),
}, },
async (result) => { async(result) => {
if (result) { if (result) {
try { try {
this.isLoading = true this.isLoading = true
+18 -16
View File
@@ -43,22 +43,24 @@
<li v-if="addLabel" class="editing"> <li v-if="addLabel" class="editing">
<!-- New Tag --> <!-- New Tag -->
<form class="label-form" @submit.prevent="clickAddLabel"> <template>
<ColorPicker class="color-picker-wrapper" :value="'#' + addLabelObj.color" @input="updateColor"> <form class="label-form" @submit.prevent="clickAddLabel">
<div :style="{ backgroundColor: '#' + addLabelObj.color }" class="color0 icon-colorpicker" /> <ColorPicker class="color-picker-wrapper" :value="'#' + addLabelObj.color" @input="updateColor">
</ColorPicker> <div :style="{ backgroundColor: '#' + addLabelObj.color }" class="color0 icon-colorpicker" />
<input v-model="addLabelObj.title" type="text"> </ColorPicker>
<input v-tooltip="{content: missingDataLabel, show: !addLabelObjValidated, trigger: 'manual' }" <input v-model="addLabelObj.title" type="text">
:disabled="!addLabelObjValidated" <input v-tooltip="{content: missingDataLabel, show: !addLabelObjValidated, trigger: 'manual' }"
type="submit" :disabled="!addLabelObjValidated"
value="" type="submit"
class="icon-confirm"> value=""
<Actions> class="icon-confirm">
<ActionButton icon="icon-close" @click="addLabel=false"> <Actions>
{{ t('deck', 'Cancel') }} <ActionButton icon="icon-close" @click="addLabel=false">
</ActionButton> {{ t('deck', 'Cancel') }}
</Actions> </ActionButton>
</form> </Actions>
</form>
</template>
</li> </li>
<button v-if="canManage && !isArchived" @click="clickShowAddLabel()"> <button v-if="canManage && !isArchived" @click="clickShowAddLabel()">
<span class="icon-add" />{{ t('deck', 'Add a new tag') }} <span class="icon-add" />{{ t('deck', 'Add a new tag') }}
+5 -5
View File
@@ -71,7 +71,7 @@
</a> </a>
</div> </div>
<Actions v-if="selectable"> <Actions v-if="selectable">
<ActionButton icon="icon-confirm" @click="$emit('select-attachment', attachment)"> <ActionButton icon="icon-confirm" @click="$emit('selectAttachment', attachment)">
{{ t('deck', 'Add this attachment') }} {{ t('deck', 'Add this attachment') }}
</ActionButton> </ActionButton>
</Actions> </Actions>
@@ -89,10 +89,10 @@
{{ t('deck', 'Remove attachment') }} {{ t('deck', 'Remove attachment') }}
</ActionButton> </ActionButton>
<ActionButton v-if="!attachment.extendedData.fileid && attachment.deletedAt === 0" icon="icon-delete" @click="$emit('delete-attachment', attachment)"> <ActionButton v-if="!attachment.extendedData.fileid && attachment.deletedAt === 0" icon="icon-delete" @click="$emit('deleteAttachment', attachment)">
{{ t('deck', 'Delete Attachment') }} {{ t('deck', 'Delete Attachment') }}
</ActionButton> </ActionButton>
<ActionButton v-else-if="!attachment.extendedData.fileid" icon="icon-history" @click="$emit('restore-attachment', attachment)"> <ActionButton v-else-if="!attachment.extendedData.fileid" icon="icon-history" @click="$emit('restoreAttachment', attachment)">
{{ t('deck', 'Restore Attachment') }} {{ t('deck', 'Restore Attachment') }}
</ActionButton> </ActionButton>
</Actions> </Actions>
@@ -173,7 +173,7 @@ export default {
} }
}, },
attachmentPreview() { attachmentPreview() {
return (attachment) => (attachment.extendedData.fileid ? generateUrl(`/core/preview?fileId=${attachment.extendedData.fileid}&x=64&y=64`) : null) return (attachment) => (attachment.extendedData.fileid ? generateUrl(`/core/preview?fileId=${attachment.extendedData.fileid}&x=64&y=64&a=true`) : null)
}, },
attachmentUrl() { attachmentUrl() {
return (attachment) => generateUrl(`/apps/deck/cards/${attachment.cardId}/attachment/${attachment.id}`) return (attachment) => generateUrl(`/apps/deck/cards/${attachment.cardId}/attachment/${attachment.id}`)
@@ -225,7 +225,7 @@ export default {
}, },
shareFromFiles() { shareFromFiles() {
picker.pick() picker.pick()
.then(async (path) => { .then(async(path) => {
console.debug(`path ${path} selected for sharing`) console.debug(`path ${path} selected for sharing`)
if (!path.startsWith('/')) { if (!path.startsWith('/')) {
throw new Error(t('files', 'Invalid path selected')) throw new Error(t('files', 'Invalid path selected'))
@@ -24,8 +24,8 @@
<AttachmentList <AttachmentList
:card-id="card.id" :card-id="card.id"
:removable="true" :removable="true"
@delete-attachment="deleteAttachment" @deleteAttachment="deleteAttachment"
@restore-attachment="restoreAttachment" /> @restoreAttachment="restoreAttachment" />
</template> </template>
<script> <script>
@@ -101,7 +101,6 @@
:lang="lang" :lang="lang"
:formatter="format" :formatter="format"
:disabled="saving || !canEdit" :disabled="saving || !canEdit"
:shortcuts="shortcuts"
confirm /> confirm />
<Actions v-if="canEdit"> <Actions v-if="canEdit">
<ActionButton v-if="copiedCard.duedate" icon="icon-delete" @click="removeDue()"> <ActionButton v-if="copiedCard.duedate" icon="icon-delete" @click="removeDue()">
@@ -177,48 +176,6 @@ export default {
stringify: this.stringify, stringify: this.stringify,
parse: this.parse, parse: this.parse,
}, },
shortcuts: [
{
text: t('deck', 'Today'),
onClick() {
const date = new Date()
date.setDate(date.getDate())
date.setHours(23)
date.setMinutes(59)
return date
},
},
{
text: t('deck', 'Tomorrow'),
onClick() {
const date = new Date()
date.setDate(date.getDate() + 1)
date.setHours(23)
date.setMinutes(59)
return date
},
},
{
text: t('deck', 'Next week'),
onClick() {
const date = new Date()
date.setDate(date.getDate() + 7)
date.setHours(23)
date.setMinutes(59)
return date
},
},
{
text: t('deck', 'Next month'),
onClick() {
const date = new Date()
date.setDate(date.getDate() + 30)
date.setHours(23)
date.setMinutes(59)
return date
},
},
],
} }
}, },
computed: { computed: {
@@ -359,14 +316,6 @@ export default {
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.section-wrapper::v-deep .mx-datepicker-main.mx-datepicker-popup {
left: 0 !important;
}
.section-wrapper::v-deep .mx-datepicker-main.mx-datepicker-popup.mx-datepicker-sidebar {
padding: 0 !important;
}
.section-wrapper { .section-wrapper {
display: flex; display: flex;
max-width: 100%; max-width: 100%;
+40 -38
View File
@@ -19,45 +19,47 @@
</div> </div>
</div> </div>
<li v-else class="comment"> <li v-else class="comment">
<div class="comment--header"> <template>
<Avatar :user="comment.actorId" /> <div class="comment--header">
<span class="has-tooltip username"> <Avatar :user="comment.actorId" />
{{ comment.actorDisplayName }} <span class="has-tooltip username">
</span> {{ comment.actorDisplayName }}
<Actions v-show="!edit" :force-menu="true"> </span>
<ActionButton icon="icon-reply" :close-after-click="true" @click="replyTo()"> <Actions v-show="!edit" :force-menu="true">
{{ t('deck', 'Reply') }} <ActionButton icon="icon-reply" :close-after-click="true" @click="replyTo()">
</ActionButton> {{ t('deck', 'Reply') }}
<ActionButton v-if="canEdit" </ActionButton>
icon="icon-rename" <ActionButton v-if="canEdit"
:close-after-click="true" icon="icon-rename"
@click="showUpdateForm()"> :close-after-click="true"
{{ t('deck', 'Update') }} @click="showUpdateForm()">
</ActionButton> {{ t('deck', 'Update') }}
<ActionButton v-if="canEdit" </ActionButton>
icon="icon-delete" <ActionButton v-if="canEdit"
:close-after-click="true" icon="icon-delete"
@click="deleteComment()"> :close-after-click="true"
{{ t('deck', 'Delete') }} @click="deleteComment()">
</ActionButton> {{ t('deck', 'Delete') }}
</Actions> </ActionButton>
<Actions v-if="edit"> </Actions>
<ActionButton icon="icon-close" @click="hideUpdateForm" /> <Actions v-if="edit">
</Actions> <ActionButton icon="icon-close" @click="hideUpdateForm" />
<div class="spacer" /> </Actions>
<div class="timestamp"> <div class="spacer" />
{{ relativeDate(comment.creationDateTime) }} <div class="timestamp">
{{ relativeDate(comment.creationDateTime) }}
</div>
</div> </div>
</div> <CommentItem v-if="comment.replyTo" :reply="true" :comment="comment.replyTo" />
<CommentItem v-if="comment.replyTo" :reply="true" :comment="comment.replyTo" /> <div v-show="!edit" ref="richTextElement">
<div v-show="!edit" ref="richTextElement"> <RichText
<RichText class="comment--content"
class="comment--content" :text="richText(comment)"
:text="richText(comment)" :arguments="richArgs(comment)"
:arguments="richArgs(comment)" :autolink="true" />
:autolink="true" /> </div>
</div> <CommentForm v-if="edit" v-model="commentMsg" @submit="updateComment" />
<CommentForm v-if="edit" v-model="commentMsg" @submit="updateComment" /> </template>
</li> </li>
</template> </template>
+5 -13
View File
@@ -57,7 +57,7 @@
ref="markdownEditor" ref="markdownEditor"
v-model="description" v-model="description"
:configs="mdeConfig" :configs="mdeConfig"
@update:modelValue="updateDescription" @input="updateDescription"
@blur="saveDescription" /> @blur="saveDescription" />
<Modal v-if="modalShow" :title="t('deck', 'Choose attachment')" @close="modalShow=false"> <Modal v-if="modalShow" :title="t('deck', 'Choose attachment')" @close="modalShow=false">
@@ -66,7 +66,7 @@
<AttachmentList <AttachmentList
:card-id="card.id" :card-id="card.id"
:selectable="true" :selectable="true"
@select-attachment="addAttachment" /> @selectAttachment="addAttachment" />
</div> </div>
</Modal> </Modal>
</div> </div>
@@ -74,8 +74,7 @@
<script> <script>
import MarkdownIt from 'markdown-it' import MarkdownIt from 'markdown-it'
import MarkdownItTaskCheckbox from 'markdown-it-task-checkbox' import MarkdownItTaskLists from 'markdown-it-task-lists'
import MarkdownItLinkAttributes from 'markdown-it-link-attributes'
import AttachmentList from './AttachmentList' import AttachmentList from './AttachmentList'
import { Actions, ActionButton, Modal } from '@nextcloud/vue' import { Actions, ActionButton, Modal } from '@nextcloud/vue'
import { formatFileSize } from '@nextcloud/files' import { formatFileSize } from '@nextcloud/files'
@@ -85,14 +84,7 @@ import { mapState, mapGetters } from 'vuex'
const markdownIt = new MarkdownIt({ const markdownIt = new MarkdownIt({
linkify: true, linkify: true,
}) })
markdownIt.use(MarkdownItTaskCheckbox, { disabled: false, idPrefix: 'task-item-', ulClass: 'contains-task-list' }) markdownIt.use(MarkdownItTaskLists, { enabled: true, label: true, labelAfter: true })
markdownIt.use(MarkdownItLinkAttributes, {
attrs: {
target: '_blank',
rel: 'noreferrer noopener',
},
})
export default { export default {
name: 'Description', name: 'Description',
@@ -231,7 +223,7 @@ export default {
updateDescription() { updateDescription() {
this.descriptionLastEdit = Date.now() this.descriptionLastEdit = Date.now()
clearTimeout(this.descriptionSaveTimeout) clearTimeout(this.descriptionSaveTimeout)
this.descriptionSaveTimeout = setTimeout(async () => { this.descriptionSaveTimeout = setTimeout(async() => {
await this.saveDescription() await this.saveDescription()
}, 2500) }, 2500)
}, },
-44
View File
@@ -53,19 +53,6 @@
<PopoverMenu :menu="popover" /> <PopoverMenu :menu="popover" />
<slot /> <slot />
</div> </div>
<div class="avatar-print-list">
<div v-for="user in avatarUsers" :key="user.id" class="avatar-print-list-item">
<Avatar
class="avatar-print-list-avatar"
:user="user.participant.uid"
:display-name="user.participant.displayname"
:disable-menu="true"
:is-no-user="user.type !== 0"
:size="24" />
{{ user.participant.displayname }}
</div>
</div>
</div> </div>
</template> </template>
@@ -129,15 +116,6 @@ export default {
}), }),
] ]
}, },
avatarUsers() {
if (!this.users) {
return []
}
return this.users.filter((user) => {
return [0, 1, 7].includes(user.type)
})
},
}, },
methods: { methods: {
togglePopover() { togglePopover() {
@@ -198,26 +176,4 @@ export default {
display: block; display: block;
margin: 40px -6px; margin: 40px -6px;
} }
.avatar-print-list {
display: none;
}
@media print {
.avatar-list {
display: none;
}
.avatar-print-list-item {
align-items: center;
display: flex;
gap: 10px;
margin-bottom: 10px;
}
.avatar-print-list {
display: block;
padding-top: 5px;
}
}
</style> </style>
+1 -12
View File
@@ -41,7 +41,7 @@
<AvatarList :users="card.assignedUsers" /> <AvatarList :users="card.assignedUsers" />
<CardMenu class="card-menu" :card="card" /> <CardMenu :card="card" />
</div> </div>
</template> </template>
<script> <script>
@@ -150,15 +150,4 @@ export default {
.fade-enter, .fade-leave-to { .fade-enter, .fade-leave-to {
opacity: 0; opacity: 0;
} }
@media print {
.badges {
align-items: flex-start;
max-height: none !important;
}
.card-menu {
display: none;
}
}
</style> </style>
-1
View File
@@ -51,7 +51,6 @@
<input v-model="copiedCard.title" <input v-model="copiedCard.title"
v-focus v-focus
type="text" type="text"
autocomplete="off"
required required
pattern=".*\S+.*"> pattern=".*\S+.*">
<input type="submit" value="" class="icon-confirm"> <input type="submit" value="" class="icon-confirm">
+4 -19
View File
@@ -23,7 +23,7 @@
<template> <template>
<div v-if="card" class="duedate"> <div v-if="card" class="duedate">
<transition name="zoom"> <transition name="zoom">
<div v-if="card.duedate" :class="dueIcon" :title="absoluteDate"> <div v-if="card.duedate" :class="dueIcon">
<span>{{ relativeDate }}</span> <span>{{ relativeDate }}</span>
</div> </div>
</transition> </transition>
@@ -62,14 +62,14 @@ export default {
} }
return moment(this.card.duedate).fromNow() return moment(this.card.duedate).fromNow()
}, },
absoluteDate() { dueDateTooltip() {
return moment(this.card.duedate).format('L') return moment(this.card.duedate).format('LLLL')
}, },
}, },
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" coped>
.icon.due { .icon.due {
background-position: 4px center; background-position: 4px center;
border-radius: 3px; border-radius: 3px;
@@ -105,7 +105,6 @@ export default {
padding: 3px 4px; padding: 3px 4px;
} }
&::before,
span { span {
margin-left: 20px; margin-left: 20px;
white-space: nowrap; white-space: nowrap;
@@ -113,18 +112,4 @@ export default {
overflow: hidden; overflow: hidden;
} }
} }
@media print {
.icon.due {
background-color: transparent !important;
span {
display: none;
}
&::before {
content: attr(title);
}
}
}
</style> </style>
@@ -39,9 +39,6 @@
<script> <script>
import { ColorPicker, ActionButton, Actions, AppNavigationItem } from '@nextcloud/vue' import { ColorPicker, ActionButton, Actions, AppNavigationItem } from '@nextcloud/vue'
/**
*
*/
function randomColor() { function randomColor() {
let randomHexColor = ((1 << 24) * Math.random() | 0).toString(16) let randomHexColor = ((1 << 24) * Math.random() | 0).toString(16)
while (randomHexColor.length < 6) { while (randomHexColor.length < 6) {
@@ -70,9 +67,9 @@ export default {
startCreateBoard(e) { startCreateBoard(e) {
this.editing = true this.editing = true
}, },
async createBoard(e) { createBoard(e) {
const title = e.currentTarget.childNodes[0].value const title = e.currentTarget.childNodes[0].value
await this.$store.dispatch('createBoard', { this.$store.dispatch('createBoard', {
title, title,
color: this.color.substring(1), color: this.color.substring(1),
}) })
@@ -63,15 +63,10 @@ import { Actions, ActionButton } from '@nextcloud/vue'
const createCancelToken = () => axios.CancelToken.source() const createCancelToken = () => axios.CancelToken.source()
/**
* @param root0
* @param root0.query
* @param root0.cursor
*/
function search({ query, cursor }) { function search({ query, cursor }) {
const cancelToken = createCancelToken() const cancelToken = createCancelToken()
const request = async () => axios.get(generateOcsUrl('apps/deck/api/v1.0/search'), { const request = async() => axios.get(generateOcsUrl('apps/deck/api/v1.0/search'), {
cancelToken: cancelToken.token, cancelToken: cancelToken.token,
params: { params: {
term: query, term: query,
+1 -6
View File
@@ -21,11 +21,6 @@ ul {
ul { ul {
list-style-type: disc; list-style-type: disc;
.task-list-item {
margin-left: -20px;
list-style-type: none;
}
} }
h1 { h1 {
@@ -72,7 +67,7 @@ img {
} }
input[type=checkbox] { input[type=checkbox] {
margin: 0px 3px 0px 0px; margin: 0px 10px 0px 0px;
line-height: 10px; line-height: 10px;
font-size: 10px; font-size: 10px;
display: inline-block; display: inline-block;
+3 -2
View File
@@ -25,8 +25,9 @@ const buildSelector = (selector, propsData = {}) => {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const container = document.createElement('div') const container = document.createElement('div')
document.getElementById('body-user').append(container) document.getElementById('body-user').append(container)
const ComponentVM = new Vue({ const View = Vue.extend(selector)
render: (h) => h(selector, propsData), const ComponentVM = new View({
propsData,
}).$mount(container) }).$mount(container)
ComponentVM.$root.$on('close', () => { ComponentVM.$root.$on('close', () => {
ComponentVM.$el.remove() ComponentVM.$el.remove()

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