Compare commits

..

1 Commits

Author SHA1 Message Date
Cyrille Bollu
fbdfd66e2a Update User_documentation_en.md
Adds a documentation how permissions are granted when sharing a board, based on code at ea4655b24e/lib/Service/PermissionService.php (L169)

Signed-off-by: Cyrille Bollu <StCyr@users.noreply.github.com>
2024-06-24 17:27:22 +02:00
25 changed files with 135 additions and 106 deletions

View File

@@ -24,7 +24,7 @@ jobs:
- 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.31.0 uses: shivammathur/setup-php@2.30.5
with: with:
php-version: '7.4' php-version: '7.4'
tools: composer tools: composer

View File

@@ -72,7 +72,7 @@ jobs:
filename: ${{ env.APP_NAME }}/appinfo/info.xml filename: ${{ env.APP_NAME }}/appinfo/info.xml
- name: Set up php ${{ steps.php-versions.outputs.php-min }} - name: Set up php ${{ steps.php-versions.outputs.php-min }}
uses: shivammathur/setup-php@2e947f1f6932d141d076ca441d0e1e881775e95b # v2 uses: shivammathur/setup-php@fc14643b0a99ee9db10a3c025a33d76544fa3761 # v2
with: with:
php-version: ${{ steps.php-versions.outputs.php-min }} php-version: ${{ steps.php-versions.outputs.php-min }}
coverage: none coverage: none

View File

@@ -91,7 +91,7 @@ jobs:
restore-keys: ${{ steps.extcache.outputs.key }} restore-keys: ${{ steps.extcache.outputs.key }}
- name: Set up php ${{ matrix.php-versions }} - name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@2.31.0 uses: shivammathur/setup-php@2.30.5
with: with:
php-version: ${{ matrix.php-versions }} php-version: ${{ matrix.php-versions }}
extensions: ${{ env.extensions }} extensions: ${{ env.extensions }}

View File

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

View File

@@ -25,7 +25,7 @@ jobs:
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
- name: Set up php8.2 - name: Set up php8.2
uses: shivammathur/setup-php@2e947f1f6932d141d076ca441d0e1e881775e95b # v2 uses: shivammathur/setup-php@fc14643b0a99ee9db10a3c025a33d76544fa3761 # v2
with: with:
php-version: 8.2 php-version: 8.2
coverage: none coverage: none

View File

@@ -28,7 +28,7 @@ jobs:
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
- name: Set up php ${{ matrix.php-versions }} - name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@2e947f1f6932d141d076ca441d0e1e881775e95b # v2 uses: shivammathur/setup-php@fc14643b0a99ee9db10a3c025a33d76544fa3761 # v2
with: with:
php-version: ${{ matrix.php-versions }} php-version: ${{ matrix.php-versions }}
coverage: none coverage: none

View File

@@ -92,7 +92,7 @@ jobs:
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@2e947f1f6932d141d076ca441d0e1e881775e95b # v2 uses: shivammathur/setup-php@fc14643b0a99ee9db10a3c025a33d76544fa3761 # v2
with: with:
php-version: ${{ matrix.php-versions }} php-version: ${{ matrix.php-versions }}
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation # https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation

View File

@@ -80,7 +80,7 @@ jobs:
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@2e947f1f6932d141d076ca441d0e1e881775e95b # v2 uses: shivammathur/setup-php@fc14643b0a99ee9db10a3c025a33d76544fa3761 # v2
with: with:
php-version: ${{ matrix.php-versions }} php-version: ${{ matrix.php-versions }}
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation # https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation

View File

@@ -69,7 +69,7 @@ jobs:
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@2e947f1f6932d141d076ca441d0e1e881775e95b # v2 uses: shivammathur/setup-php@fc14643b0a99ee9db10a3c025a33d76544fa3761 # v2
with: with:
php-version: ${{ matrix.php-versions }} php-version: ${{ matrix.php-versions }}
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation # https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation

View File

@@ -21,7 +21,7 @@ jobs:
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
- name: Set up php8.2 - name: Set up php8.2
uses: shivammathur/setup-php@2e947f1f6932d141d076ca441d0e1e881775e95b # v2 uses: shivammathur/setup-php@fc14643b0a99ee9db10a3c025a33d76544fa3761 # v2
with: with:
php-version: 8.2 php-version: 8.2
coverage: none coverage: none

View File

@@ -43,7 +43,7 @@ jobs:
# Enable GitHub auto merge # Enable GitHub auto merge
- name: Auto merge - name: Auto merge
uses: alexwilson/enable-github-automerge-action@95df6f3009ad99156b8b23cd8b0f26b815333981 # main uses: alexwilson/enable-github-automerge-action@835faa041540d2234ea4530506a7abd42c847dfc # main
if: startsWith(steps.branchname.outputs.branch, 'automated/noid/') && endsWith(steps.branchname.outputs.branch, 'update-nextcloud-ocp') if: startsWith(steps.branchname.outputs.branch, 'automated/noid/') && endsWith(steps.branchname.outputs.branch, 'update-nextcloud-ocp')
with: with:
github-token: ${{ secrets.GITHUB_TOKEN }} github-token: ${{ secrets.GITHUB_TOKEN }}

View File

@@ -31,7 +31,7 @@ jobs:
- name: Set up php8.2 - name: Set up php8.2
if: steps.checkout.outcome == 'success' if: steps.checkout.outcome == 'success'
uses: shivammathur/setup-php@2e947f1f6932d141d076ca441d0e1e881775e95b # v2 uses: shivammathur/setup-php@fc14643b0a99ee9db10a3c025a33d76544fa3761 # v2
with: with:
php-version: 8.2 php-version: 8.2
# https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation # https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation

8
composer.lock generated
View File

@@ -254,12 +254,12 @@
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/nextcloud-deps/ocp.git", "url": "https://github.com/nextcloud-deps/ocp.git",
"reference": "6a23d33b2cfd8660aa2a23ee377329773451dcf7" "reference": "bdeabb2fbb4691ac3d72dc27f56dd52aa6c61725"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/nextcloud-deps/ocp/zipball/6a23d33b2cfd8660aa2a23ee377329773451dcf7", "url": "https://api.github.com/repos/nextcloud-deps/ocp/zipball/bdeabb2fbb4691ac3d72dc27f56dd52aa6c61725",
"reference": "6a23d33b2cfd8660aa2a23ee377329773451dcf7", "reference": "bdeabb2fbb4691ac3d72dc27f56dd52aa6c61725",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@@ -291,7 +291,7 @@
"issues": "https://github.com/nextcloud-deps/ocp/issues", "issues": "https://github.com/nextcloud-deps/ocp/issues",
"source": "https://github.com/nextcloud-deps/ocp/tree/master" "source": "https://github.com/nextcloud-deps/ocp/tree/master"
}, },
"time": "2024-06-28T00:36:28+00:00" "time": "2024-06-18T00:36:38+00:00"
}, },
{ {
"name": "nikic/php-parser", "name": "nikic/php-parser",

View File

@@ -1 +1,5 @@
<!--
- SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors
- SPDX-License-Identifier: AGPL-3.0-or-later
-->
../README.md ../README.md

View File

@@ -149,7 +149,6 @@ OC.L10N.register(
"Filter by tag" : "Filtrer på knagg", "Filter by tag" : "Filtrer på knagg",
"Filter by assigned user" : "Filtrer på tildelt bruker", "Filter by assigned user" : "Filtrer på tildelt bruker",
"Unassigned" : "Ikke tildelt", "Unassigned" : "Ikke tildelt",
"Filter by status" : "Filtrer etter status",
"Open and completed" : "Åpen og fullført", "Open and completed" : "Åpen og fullført",
"Open" : "Åpne", "Open" : "Åpne",
"Completed" : "Ferdig", "Completed" : "Ferdig",
@@ -258,7 +257,6 @@ OC.L10N.register(
"Remove due date" : "Fjern forfallsdato", "Remove due date" : "Fjern forfallsdato",
"Mark as done" : "Marker som fullført", "Mark as done" : "Marker som fullført",
"Due at:" : "Forfaller den:", "Due at:" : "Forfaller den:",
"Not done" : "Ikke fullført",
"Unarchive card" : "Hent kort fra arkiv", "Unarchive card" : "Hent kort fra arkiv",
"Archive card" : "Arkiver kort", "Archive card" : "Arkiver kort",
"Select Date" : "Velg dato", "Select Date" : "Velg dato",

View File

@@ -147,7 +147,6 @@
"Filter by tag" : "Filtrer på knagg", "Filter by tag" : "Filtrer på knagg",
"Filter by assigned user" : "Filtrer på tildelt bruker", "Filter by assigned user" : "Filtrer på tildelt bruker",
"Unassigned" : "Ikke tildelt", "Unassigned" : "Ikke tildelt",
"Filter by status" : "Filtrer etter status",
"Open and completed" : "Åpen og fullført", "Open and completed" : "Åpen og fullført",
"Open" : "Åpne", "Open" : "Åpne",
"Completed" : "Ferdig", "Completed" : "Ferdig",
@@ -256,7 +255,6 @@
"Remove due date" : "Fjern forfallsdato", "Remove due date" : "Fjern forfallsdato",
"Mark as done" : "Marker som fullført", "Mark as done" : "Marker som fullført",
"Due at:" : "Forfaller den:", "Due at:" : "Forfaller den:",
"Not done" : "Ikke fullført",
"Unarchive card" : "Hent kort fra arkiv", "Unarchive card" : "Hent kort fra arkiv",
"Archive card" : "Arkiver kort", "Archive card" : "Arkiver kort",
"Select Date" : "Velg dato", "Select Date" : "Velg dato",

View File

@@ -1,37 +1,43 @@
<?php <?php
declare(strict_types=1);
/** /**
* SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors * SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later * SPDX-License-Identifier: AGPL-3.0-or-later
*/ */
namespace OCA\Deck\Listeners; namespace OCA\Deck\Activity;
use OCA\Deck\Activity\ActivityManager;
use OCA\Deck\Db\CardMapper; use OCA\Deck\Db\CardMapper;
use OCA\Deck\Db\ChangeHelper; use OCA\Deck\Db\ChangeHelper;
use OCA\Deck\Notification\NotificationHelper; use OCA\Deck\Notification\NotificationHelper;
use OCP\Comments\CommentsEvent; use OCP\Comments\CommentsEvent;
use OCP\EventDispatcher\Event; use OCP\Comments\IComment;
use OCP\EventDispatcher\IEventListener; use OCP\Comments\ICommentsEventHandler;
/** @template-implements IEventListener<CommentsEvent|Event> */ class CommentEventHandler implements ICommentsEventHandler {
class CommentEventListener implements IEventListener {
public function __construct( /** @var ActivityManager */
private ActivityManager $activityManager, private $activityManager;
private NotificationHelper $notificationHelper,
private CardMapper $cardMapper, /** @var NotificationHelper */
private ChangeHelper $changeHelper, private $notificationHelper;
) {
/** @var CardMapper */
private $cardMapper;
/** @var ChangeHelper */
private $changeHelper;
public function __construct(ActivityManager $activityManager, NotificationHelper $notificationHelper, CardMapper $cardMapper, ChangeHelper $changeHelper) {
$this->notificationHelper = $notificationHelper;
$this->activityManager = $activityManager;
$this->cardMapper = $cardMapper;
$this->changeHelper = $changeHelper;
} }
public function handle(Event $event): void { /**
if (!$event instanceof CommentsEvent) { * @param CommentsEvent $event
return; */
} public function handle(CommentsEvent $event) {
if ($event->getComment()->getObjectType() !== 'deckCard') { if ($event->getComment()->getObjectType() !== 'deckCard') {
return; return;
} }
@@ -55,13 +61,20 @@ class CommentEventListener implements IEventListener {
} }
} }
private function activityHandler(CommentsEvent $event): void { /**
* @param CommentsEvent $event
*/
private function activityHandler(CommentsEvent $event) {
/** @var IComment $comment */
$comment = $event->getComment(); $comment = $event->getComment();
$card = $this->cardMapper->find($comment->getObjectId()); $card = $this->cardMapper->find($comment->getObjectId());
$this->activityManager->triggerEvent(ActivityManager::DECK_OBJECT_CARD, $card, ActivityManager::SUBJECT_CARD_COMMENT_CREATE, ['comment' => $comment]); $this->activityManager->triggerEvent(ActivityManager::DECK_OBJECT_CARD, $card, ActivityManager::SUBJECT_CARD_COMMENT_CREATE, ['comment' => $comment]);
} }
private function notificationHandler(CommentsEvent $event): void { /**
* @param CommentsEvent $event
*/
private function notificationHandler(CommentsEvent $event) {
$this->notificationHelper->sendMention($event->getComment()); $this->notificationHelper->sendMention($event->getComment());
} }
} }

View File

@@ -9,6 +9,7 @@ namespace OCA\Deck\AppInfo;
use Closure; use Closure;
use Exception; use Exception;
use OCA\Circles\Events\CircleDestroyedEvent; use OCA\Circles\Events\CircleDestroyedEvent;
use OCA\Deck\Activity\CommentEventHandler;
use OCA\Deck\Capabilities; use OCA\Deck\Capabilities;
use OCA\Deck\Collaboration\Resources\ResourceProvider; use OCA\Deck\Collaboration\Resources\ResourceProvider;
use OCA\Deck\Collaboration\Resources\ResourceProviderCard; use OCA\Deck\Collaboration\Resources\ResourceProviderCard;
@@ -27,7 +28,6 @@ use OCA\Deck\Event\CardUpdatedEvent;
use OCA\Deck\Event\SessionClosedEvent; use OCA\Deck\Event\SessionClosedEvent;
use OCA\Deck\Event\SessionCreatedEvent; use OCA\Deck\Event\SessionCreatedEvent;
use OCA\Deck\Listeners\BeforeTemplateRenderedListener; use OCA\Deck\Listeners\BeforeTemplateRenderedListener;
use OCA\Deck\Listeners\CommentEventListener;
use OCA\Deck\Listeners\FullTextSearchEventListener; use OCA\Deck\Listeners\FullTextSearchEventListener;
use OCA\Deck\Listeners\LiveUpdateListener; use OCA\Deck\Listeners\LiveUpdateListener;
use OCA\Deck\Listeners\ParticipantCleanupListener; use OCA\Deck\Listeners\ParticipantCleanupListener;
@@ -56,7 +56,7 @@ use OCP\Collaboration\Reference\RenderReferenceEvent;
use OCP\Collaboration\Resources\IProviderManager; use OCP\Collaboration\Resources\IProviderManager;
use OCP\Collaboration\Resources\LoadAdditionalScriptsEvent; use OCP\Collaboration\Resources\LoadAdditionalScriptsEvent;
use OCP\Comments\CommentsEntityEvent; use OCP\Comments\CommentsEntityEvent;
use OCP\Comments\CommentsEvent; use OCP\Comments\ICommentsManager;
use OCP\EventDispatcher\IEventDispatcher; use OCP\EventDispatcher\IEventDispatcher;
use OCP\Group\Events\GroupDeletedEvent; use OCP\Group\Events\GroupDeletedEvent;
use OCP\IConfig; use OCP\IConfig;
@@ -91,6 +91,7 @@ class Application extends App implements IBootstrap {
public function boot(IBootContext $context): void { public function boot(IBootContext $context): void {
$context->injectFn(Closure::fromCallable([$this, 'registerCommentsEntity'])); $context->injectFn(Closure::fromCallable([$this, 'registerCommentsEntity']));
$context->injectFn(Closure::fromCallable([$this, 'registerCommentsEventHandler']));
$context->injectFn(Closure::fromCallable([$this, 'registerCollaborationResources'])); $context->injectFn(Closure::fromCallable([$this, 'registerCollaborationResources']));
$context->injectFn(function (IManager $shareManager) { $context->injectFn(function (IManager $shareManager) {
@@ -140,7 +141,6 @@ class Application extends App implements IBootstrap {
$context->registerEventListener(AclCreatedEvent::class, FullTextSearchEventListener::class); $context->registerEventListener(AclCreatedEvent::class, FullTextSearchEventListener::class);
$context->registerEventListener(AclUpdatedEvent::class, FullTextSearchEventListener::class); $context->registerEventListener(AclUpdatedEvent::class, FullTextSearchEventListener::class);
$context->registerEventListener(AclDeletedEvent::class, FullTextSearchEventListener::class); $context->registerEventListener(AclDeletedEvent::class, FullTextSearchEventListener::class);
$context->registerEventListener(CommentsEvent::class, CommentEventListener::class);
// Handling cache invalidation for collections // Handling cache invalidation for collections
$context->registerEventListener(AclCreatedEvent::class, ResourceListener::class); $context->registerEventListener(AclCreatedEvent::class, ResourceListener::class);
@@ -184,6 +184,12 @@ class Application extends App implements IBootstrap {
}); });
} }
protected function registerCommentsEventHandler(ICommentsManager $commentsManager): void {
$commentsManager->registerEventHandler(function () {
return $this->getContainer()->query(CommentEventHandler::class);
});
}
protected function registerCollaborationResources(IProviderManager $resourceManager): void { protected function registerCollaborationResources(IProviderManager $resourceManager): void {
$resourceManager->registerResourceProvider(ResourceProvider::class); $resourceManager->registerResourceProvider(ResourceProvider::class);
$resourceManager->registerResourceProvider(ResourceProviderCard::class); $resourceManager->registerResourceProvider(ResourceProviderCard::class);

View File

@@ -113,7 +113,7 @@ class CardMapper extends QBMapper implements IPermissionMapper {
return parent::update($cardUpdate); return parent::update($cardUpdate);
} }
public function find($id, bool $enhance = true): Card { public function find($id): Card {
$qb = $this->db->getQueryBuilder(); $qb = $this->db->getQueryBuilder();
$qb->select('*') $qb->select('*')
->from('deck_cards') ->from('deck_cards')
@@ -122,11 +122,9 @@ class CardMapper extends QBMapper implements IPermissionMapper {
->addOrderBy('id'); ->addOrderBy('id');
/** @var Card $card */ /** @var Card $card */
$card = $this->findEntity($qb); $card = $this->findEntity($qb);
if ($enhance) { $labels = $this->labelMapper->findAssignedLabelsForCard($card->getId());
$labels = $this->labelMapper->findAssignedLabelsForCard($card->getId()); $card->setLabels($labels);
$card->setLabels($labels); $this->mapOwner($card);
$this->mapOwner($card);
}
return $card; return $card;
} }

View File

@@ -119,7 +119,7 @@ class PermissionService {
if ($permissions[$permission] === true) { if ($permissions[$permission] === true) {
if (!$allowDeletedCard && $mapper instanceof CardMapper) { if (!$allowDeletedCard && $mapper instanceof CardMapper) {
$card = $mapper->find((int)$id, false); $card = $mapper->find((int)$id);
if ($card->getDeletedAt() > 0) { if ($card->getDeletedAt() > 0) {
throw new NoPermissionException('Card is deleted'); throw new NoPermissionException('Card is deleted');
} }

View File

@@ -831,7 +831,7 @@ class DeckShareProvider implements \OCP\Share\IShareProvider {
$pathSections = explode('/', $data['path'], 2); $pathSections = explode('/', $data['path'], 2);
// FIXME: would not detect rare md5'd home storage case properly // FIXME: would not detect rare md5'd home storage case properly
if ($pathSections[0] !== 'files' if ($pathSections[0] !== 'files'
&& (strpos($data['storage_string_id'], 'home::') === 0 || strpos($data['storage_string_id'], 'object::user') === 0)) { && in_array(explode(':', $data['storage_string_id'], 2)[0], ['home', 'object'])) {
return false; return false;
} }
return true; return true;

100
package-lock.json generated
View File

@@ -14,7 +14,7 @@
"@nextcloud/auth": "^2.3.0", "@nextcloud/auth": "^2.3.0",
"@nextcloud/axios": "^2.5.0", "@nextcloud/axios": "^2.5.0",
"@nextcloud/capabilities": "^1.2.0", "@nextcloud/capabilities": "^1.2.0",
"@nextcloud/dialogs": "^5.3.4", "@nextcloud/dialogs": "^5.3.3",
"@nextcloud/event-bus": "^3.3.1", "@nextcloud/event-bus": "^3.3.1",
"@nextcloud/files": "^3.5.1", "@nextcloud/files": "^3.5.1",
"@nextcloud/initial-state": "^2.2.0", "@nextcloud/initial-state": "^2.2.0",
@@ -22,7 +22,7 @@
"@nextcloud/moment": "^1.3.1", "@nextcloud/moment": "^1.3.1",
"@nextcloud/notify_push": "^1.3.0", "@nextcloud/notify_push": "^1.3.0",
"@nextcloud/router": "^3.0.1", "@nextcloud/router": "^3.0.1",
"@nextcloud/vue": "^8.13.0", "@nextcloud/vue": "^8.12.0",
"blueimp-md5": "^2.19.0", "blueimp-md5": "^2.19.0",
"chroma-js": "^2.4.2", "chroma-js": "^2.4.2",
"dompurify": "^3.1.5", "dompurify": "^3.1.5",
@@ -52,7 +52,7 @@
"@nextcloud/eslint-config": "^8.4.1", "@nextcloud/eslint-config": "^8.4.1",
"@nextcloud/stylelint-config": "^3.0.1", "@nextcloud/stylelint-config": "^3.0.1",
"@nextcloud/webpack-vue-config": "^6.0.0", "@nextcloud/webpack-vue-config": "^6.0.0",
"@relative-ci/agent": "^4.2.9", "@relative-ci/agent": "^4.2.8",
"@vue/test-utils": "^2.4.6", "@vue/test-utils": "^2.4.6",
"@vue/vue2-jest": "^29.2.6", "@vue/vue2-jest": "^29.2.6",
"cypress": "^13.12.0", "cypress": "^13.12.0",
@@ -1994,9 +1994,9 @@
"dev": true "dev": true
}, },
"node_modules/@bundle-stats/plugin-webpack-validate": { "node_modules/@bundle-stats/plugin-webpack-validate": {
"version": "4.13.3", "version": "4.13.2",
"resolved": "https://registry.npmjs.org/@bundle-stats/plugin-webpack-validate/-/plugin-webpack-validate-4.13.3.tgz", "resolved": "https://registry.npmjs.org/@bundle-stats/plugin-webpack-validate/-/plugin-webpack-validate-4.13.2.tgz",
"integrity": "sha512-R7qGmWsWq5rhv/Zu6pS+d1S29gV1rxogl/udmbH/L4LysX+TxcotFENsCKn9J7nNBlmLyqDVZpynfGm14ywXjg==", "integrity": "sha512-Rfdipz+uBsAIIDUo1D+ylD0RxXLCcznaxpodz9QCcd0/P5tkD8gnWh1MZcfZmLFaCnxvTyJMdKJHyjIJ7xyCbA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"lodash": "4.17.21", "lodash": "4.17.21",
@@ -3525,9 +3525,9 @@
} }
}, },
"node_modules/@nextcloud/dialogs": { "node_modules/@nextcloud/dialogs": {
"version": "5.3.4", "version": "5.3.3",
"resolved": "https://registry.npmjs.org/@nextcloud/dialogs/-/dialogs-5.3.4.tgz", "resolved": "https://registry.npmjs.org/@nextcloud/dialogs/-/dialogs-5.3.3.tgz",
"integrity": "sha512-0oWLycHX/T68Ab7xMOlghg3nHZOOldbTwoOmNOSIbAg69Tmpcu90JlRtFa9LKiDf1pWQPqCoh9QeYj10SCEm0w==", "integrity": "sha512-K5ZdwRch3vrt7ZQXp04rUHGid4GcSeRnG0SkvccwfhiVg85wut9YZd+i2YiMPw+VYURKEjr2ZOK7R5afnViWag==",
"dependencies": { "dependencies": {
"@mdi/js": "^7.4.47", "@mdi/js": "^7.4.47",
"@nextcloud/auth": "^2.3.0", "@nextcloud/auth": "^2.3.0",
@@ -3876,18 +3876,6 @@
"stylelint-config-recommended-vue": "^1.5.0" "stylelint-config-recommended-vue": "^1.5.0"
} }
}, },
"node_modules/@nextcloud/timezones": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/@nextcloud/timezones/-/timezones-0.1.1.tgz",
"integrity": "sha512-ldLuLyz605sszetnp6jy6mtlThu4ICKsZThxHIZwn6t4QzjQH3xr+k8mRU7GIvKq9egUFDqBp4gBjxm3/ROZig==",
"dependencies": {
"ical.js": "^2.0.1"
},
"engines": {
"node": "^20.0.0",
"npm": "^10.0.0"
}
},
"node_modules/@nextcloud/typings": { "node_modules/@nextcloud/typings": {
"version": "1.8.0", "version": "1.8.0",
"resolved": "https://registry.npmjs.org/@nextcloud/typings/-/typings-1.8.0.tgz", "resolved": "https://registry.npmjs.org/@nextcloud/typings/-/typings-1.8.0.tgz",
@@ -3903,27 +3891,27 @@
} }
}, },
"node_modules/@nextcloud/vue": { "node_modules/@nextcloud/vue": {
"version": "8.13.0", "version": "8.12.0",
"resolved": "https://registry.npmjs.org/@nextcloud/vue/-/vue-8.13.0.tgz", "resolved": "https://registry.npmjs.org/@nextcloud/vue/-/vue-8.12.0.tgz",
"integrity": "sha512-FV0GWSbxkaDQ8S/bWc4XcCXzJfpHzJn4xj0pK/jEwSwdSleBdBFsFFGo+wLCAGoXH5Xf5mHE+LtATFh6wnX7VA==", "integrity": "sha512-MHL12+XGIDvpsSdrJn79pYKYrTVUouEymc4No91lKTNZTWDN6bciDSprmMs553hECXrqj7sfwxu6sepj0zcR3Q==",
"dependencies": { "dependencies": {
"@floating-ui/dom": "^1.1.0", "@floating-ui/dom": "^1.1.0",
"@linusborg/vue-simple-portal": "^0.1.5", "@linusborg/vue-simple-portal": "^0.1.5",
"@nextcloud/auth": "^2.2.1", "@nextcloud/auth": "^2.2.1",
"@nextcloud/axios": "^2.4.0", "@nextcloud/axios": "^2.4.0",
"@nextcloud/browser-storage": "^0.4.0", "@nextcloud/browser-storage": "^0.4.0",
"@nextcloud/calendar-js": "^7.0.0",
"@nextcloud/capabilities": "^1.1.0", "@nextcloud/capabilities": "^1.1.0",
"@nextcloud/event-bus": "^3.1.0", "@nextcloud/event-bus": "^3.1.0",
"@nextcloud/initial-state": "^2.1.0", "@nextcloud/initial-state": "^2.1.0",
"@nextcloud/l10n": "^3.0.1", "@nextcloud/l10n": "^3.0.1",
"@nextcloud/logger": "^3.0.1", "@nextcloud/logger": "^3.0.1",
"@nextcloud/router": "^3.0.0", "@nextcloud/router": "^3.0.0",
"@nextcloud/timezones": "^0.1.1",
"@nextcloud/vue-select": "^3.25.0", "@nextcloud/vue-select": "^3.25.0",
"@vueuse/components": "^10.9.0", "@vueuse/components": "^10.9.0",
"@vueuse/core": "^10.9.0", "@vueuse/core": "^10.9.0",
"clone": "^2.1.2", "clone": "^2.1.2",
"debounce": "2.1.0", "debounce": "2.0.0",
"dompurify": "^3.0.5", "dompurify": "^3.0.5",
"emoji-mart-vue-fast": "^15.0.1", "emoji-mart-vue-fast": "^15.0.1",
"escape-html": "^1.0.3", "escape-html": "^1.0.3",
@@ -3947,7 +3935,6 @@
"vue": "^2.7.16", "vue": "^2.7.16",
"vue-color": "^2.8.1", "vue-color": "^2.8.1",
"vue-frag": "^1.4.3", "vue-frag": "^1.4.3",
"vue-router": "^3.6.5",
"vue2-datepicker": "^3.11.0" "vue2-datepicker": "^3.11.0"
}, },
"engines": { "engines": {
@@ -3979,6 +3966,19 @@
"@floating-ui/core": "^1.0.5" "@floating-ui/core": "^1.0.5"
} }
}, },
"node_modules/@nextcloud/vue/node_modules/@nextcloud/calendar-js": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/@nextcloud/calendar-js/-/calendar-js-7.0.0.tgz",
"integrity": "sha512-CvCcO4hFPjMfIB2AKW0QLNYukGoHFS7QQVvIC8khJjzNfVGS6qMJd2oaZtD9Q9w1fLpvwp1X7orcYGYmosDkAA==",
"engines": {
"node": "^20.0.0",
"npm": "^10.0.0"
},
"peerDependencies": {
"ical.js": "^2.0.1",
"uuid": "^9.0.0"
}
},
"node_modules/@nextcloud/vue/node_modules/@types/unist": { "node_modules/@nextcloud/vue/node_modules/@types/unist": {
"version": "3.0.2", "version": "3.0.2",
"resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz",
@@ -4062,6 +4062,19 @@
"url": "https://opencollective.com/unified" "url": "https://opencollective.com/unified"
} }
}, },
"node_modules/@nextcloud/vue/node_modules/uuid": {
"version": "9.0.1",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
"integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
"funding": [
"https://github.com/sponsors/broofa",
"https://github.com/sponsors/ctavan"
],
"peer": true,
"bin": {
"uuid": "dist/bin/uuid"
}
},
"node_modules/@nextcloud/vue/node_modules/vfile": { "node_modules/@nextcloud/vue/node_modules/vfile": {
"version": "6.0.1", "version": "6.0.1",
"resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz",
@@ -4187,16 +4200,16 @@
} }
}, },
"node_modules/@relative-ci/agent": { "node_modules/@relative-ci/agent": {
"version": "4.2.9", "version": "4.2.8",
"resolved": "https://registry.npmjs.org/@relative-ci/agent/-/agent-4.2.9.tgz", "resolved": "https://registry.npmjs.org/@relative-ci/agent/-/agent-4.2.8.tgz",
"integrity": "sha512-VrpE0eHi6DMVnfS5epTzo6Z9aGC3l7QuwqP/h2NQrpKMyXfLjqBrYNVzttHueIqxvLP9FzBXmpYm7OxjcTYJuQ==", "integrity": "sha512-GbmBZ1LlMkLGkypOakINfSfsrI5l0USom7EFqv9EPHmcKhxWu0TIrnTBhIGPO29A8m9yLKIz9ZTzHCA1ROKF1Q==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@bundle-stats/plugin-webpack-filter": "4.13.3", "@bundle-stats/plugin-webpack-filter": "4.13.2",
"@bundle-stats/plugin-webpack-validate": "4.13.3", "@bundle-stats/plugin-webpack-validate": "4.13.2",
"core-js": "3.37.1", "core-js": "3.37.1",
"cosmiconfig": "9.0.0", "cosmiconfig": "9.0.0",
"debug": "4.3.5", "debug": "4.3.4",
"dotenv": "16.4.5", "dotenv": "16.4.5",
"env-ci": "7.3.0", "env-ci": "7.3.0",
"fs-extra": "11.2.0", "fs-extra": "11.2.0",
@@ -4220,9 +4233,9 @@
} }
}, },
"node_modules/@relative-ci/agent/node_modules/@bundle-stats/plugin-webpack-filter": { "node_modules/@relative-ci/agent/node_modules/@bundle-stats/plugin-webpack-filter": {
"version": "4.13.3", "version": "4.13.2",
"resolved": "https://registry.npmjs.org/@bundle-stats/plugin-webpack-filter/-/plugin-webpack-filter-4.13.3.tgz", "resolved": "https://registry.npmjs.org/@bundle-stats/plugin-webpack-filter/-/plugin-webpack-filter-4.13.2.tgz",
"integrity": "sha512-jMMt2Hz5FgHMBT+52L2zsB14RJBLVjV9UxnFhpd8iH1JWgxTvQFmUG/FpubMdzhIXZx6QAHFslrtCSExgMYgtQ==", "integrity": "sha512-FU1i0DYBhIzY2hElvKSSEdazka4lpc9zP2zAYGmOmYkF6g4Omz+1DWH6a7MZv0cZhee8yIxaRNGkGy1R/llmtQ==",
"dev": true, "dev": true,
"engines": { "engines": {
"node": ">= 14.0" "node": ">= 14.0"
@@ -7983,9 +7996,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/debounce": { "node_modules/debounce": {
"version": "2.1.0", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/debounce/-/debounce-2.1.0.tgz", "resolved": "https://registry.npmjs.org/debounce/-/debounce-2.0.0.tgz",
"integrity": "sha512-OkL3+0pPWCqoBc/nhO9u6TIQNTK44fnBnzuVtJAbp13Naxw9R6u21x+8tVTka87AhDZ3htqZ2pSSsZl9fqL2Wg==", "integrity": "sha512-xRetU6gL1VJbs85Mc4FoEGSjQxzpdxRyFhe3lmWFyy2EzydIcD4xzUvRJMD+NPDfMwKNhxa3PvsIOU32luIWeA==",
"engines": { "engines": {
"node": ">=18" "node": ">=18"
}, },
@@ -7994,9 +8007,9 @@
} }
}, },
"node_modules/debug": { "node_modules/debug": {
"version": "4.3.5", "version": "4.3.4",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
"integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
"dependencies": { "dependencies": {
"ms": "2.1.2" "ms": "2.1.2"
}, },
@@ -11226,7 +11239,8 @@
"node_modules/ical.js": { "node_modules/ical.js": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/ical.js/-/ical.js-2.0.1.tgz", "resolved": "https://registry.npmjs.org/ical.js/-/ical.js-2.0.1.tgz",
"integrity": "sha512-uYYb1CwTXbd9NP/xTtgQZ5ivv6bpUjQu9VM98s3X78L3XRu00uJW5ZtmnLwyxhztpf5fSiRyDpFW7ZNCePlaPw==" "integrity": "sha512-uYYb1CwTXbd9NP/xTtgQZ5ivv6bpUjQu9VM98s3X78L3XRu00uJW5ZtmnLwyxhztpf5fSiRyDpFW7ZNCePlaPw==",
"peer": true
}, },
"node_modules/iconv-lite": { "node_modules/iconv-lite": {
"version": "0.4.24", "version": "0.4.24",

View File

@@ -35,7 +35,7 @@
"@nextcloud/auth": "^2.3.0", "@nextcloud/auth": "^2.3.0",
"@nextcloud/axios": "^2.5.0", "@nextcloud/axios": "^2.5.0",
"@nextcloud/capabilities": "^1.2.0", "@nextcloud/capabilities": "^1.2.0",
"@nextcloud/dialogs": "^5.3.4", "@nextcloud/dialogs": "^5.3.3",
"@nextcloud/event-bus": "^3.3.1", "@nextcloud/event-bus": "^3.3.1",
"@nextcloud/files": "^3.5.1", "@nextcloud/files": "^3.5.1",
"@nextcloud/initial-state": "^2.2.0", "@nextcloud/initial-state": "^2.2.0",
@@ -43,7 +43,7 @@
"@nextcloud/moment": "^1.3.1", "@nextcloud/moment": "^1.3.1",
"@nextcloud/notify_push": "^1.3.0", "@nextcloud/notify_push": "^1.3.0",
"@nextcloud/router": "^3.0.1", "@nextcloud/router": "^3.0.1",
"@nextcloud/vue": "^8.13.0", "@nextcloud/vue": "^8.12.0",
"blueimp-md5": "^2.19.0", "blueimp-md5": "^2.19.0",
"chroma-js": "^2.4.2", "chroma-js": "^2.4.2",
"dompurify": "^3.1.5", "dompurify": "^3.1.5",
@@ -80,7 +80,7 @@
"@nextcloud/eslint-config": "^8.4.1", "@nextcloud/eslint-config": "^8.4.1",
"@nextcloud/stylelint-config": "^3.0.1", "@nextcloud/stylelint-config": "^3.0.1",
"@nextcloud/webpack-vue-config": "^6.0.0", "@nextcloud/webpack-vue-config": "^6.0.0",
"@relative-ci/agent": "^4.2.9", "@relative-ci/agent": "^4.2.8",
"@vue/test-utils": "^2.4.6", "@vue/test-utils": "^2.4.6",
"@vue/vue2-jest": "^29.2.6", "@vue/vue2-jest": "^29.2.6",
"cypress": "^13.12.0", "cypress": "^13.12.0",

View File

@@ -187,6 +187,7 @@ export default {
}, },
onUpdate: ({ markdown }) => { onUpdate: ({ markdown }) => {
if (this.description === markdown) { if (this.description === markdown) {
this.descriptionLastEdit = 0
return return
} }
this.description = markdown this.description = markdown
@@ -282,9 +283,7 @@ export default {
return return
} }
this.descriptionSaving = true this.descriptionSaving = true
if (this.card.id !== undefined) { await this.$store.dispatch('updateCardDesc', { ...this.card, description: this.description })
await this.$store.dispatch('updateCardDesc', { ...this.card, description: this.description })
}
this.$emit('change', this.description) this.$emit('change', this.description)
this.descriptionLastEdit = 0 this.descriptionLastEdit = 0
this.descriptionSaving = false this.descriptionSaving = false

View File

@@ -21,9 +21,8 @@
* *
*/ */
namespace OCA\Deck\Listeners; namespace OCA\Deck\Activity;
use OCA\Deck\Activity\ActivityManager;
use OCA\Deck\Db\Card; use OCA\Deck\Db\Card;
use OCA\Deck\Db\CardMapper; use OCA\Deck\Db\CardMapper;
use OCA\Deck\Db\ChangeHelper; use OCA\Deck\Db\ChangeHelper;
@@ -32,9 +31,9 @@ use OCP\Comments\CommentsEvent;
use OCP\Comments\IComment; use OCP\Comments\IComment;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
class CommentEventListenerTest extends TestCase { class CommentEventHandlerTest extends TestCase {
/** @var CommentEventListener */ /** @var CommentEventHandler */
private $commentEventHandler; private $commentEventHandler;
/** @var ActivityManager */ /** @var ActivityManager */
private $activityManager; private $activityManager;
@@ -50,7 +49,7 @@ class CommentEventListenerTest extends TestCase {
$this->notificationHelper = $this->createMock(NotificationHelper::class); $this->notificationHelper = $this->createMock(NotificationHelper::class);
$this->cardMapper = $this->createMock(CardMapper::class); $this->cardMapper = $this->createMock(CardMapper::class);
$this->changeHelper = $this->createMock(ChangeHelper::class); $this->changeHelper = $this->createMock(ChangeHelper::class);
$this->commentEventHandler = new CommentEventListener( $this->commentEventHandler = new CommentEventHandler(
$this->activityManager, $this->activityManager,
$this->notificationHelper, $this->notificationHelper,
$this->cardMapper, $this->cardMapper,