From 313fccc0dce53ff3c45eb8e2848036e3b8536f34 Mon Sep 17 00:00:00 2001 From: Julius Knorr Date: Wed, 8 Jan 2025 10:47:07 +0100 Subject: [PATCH 1/3] fix: Adapt URLs generated in the backend to new routes Signed-off-by: Julius Knorr --- lib/Activity/DeckProvider.php | 4 +- .../Resources/ResourceProvider.php | 2 +- .../Resources/ResourceProviderCard.php | 5 ++- lib/Notification/Notifier.php | 42 +++++++++++-------- lib/Provider/DeckProvider.php | 2 +- lib/Search/BoardSearchResultEntry.php | 2 +- lib/Service/BoardService.php | 4 -- lib/Service/CardService.php | 8 ++-- lib/Sharing/ShareAPIHelper.php | 2 +- lib/Teams/DeckTeamResourceProvider.php | 2 +- src/router.js | 4 +- 11 files changed, 42 insertions(+), 35 deletions(-) diff --git a/lib/Activity/DeckProvider.php b/lib/Activity/DeckProvider.php index 63cdd2d9c..f18842f48 100644 --- a/lib/Activity/DeckProvider.php +++ b/lib/Activity/DeckProvider.php @@ -131,7 +131,7 @@ public function parse($language, IEvent $event, ?IEvent $previousEvent = null): ]; if (array_key_exists('board', $subjectParams)) { - $card['link'] = $this->cardService->getRedirectUrlForCard($event->getObjectId()); + $card['link'] = $this->cardService->getCardUrl($event->getObjectId()); $event->setLink($card['link']); } $params['card'] = $card; @@ -365,6 +365,6 @@ private function parseParamForChanges($subjectParams, $params, $event) { } public function deckUrl($endpoint) { - return $this->urlGenerator->linkToRouteAbsolute('deck.page.index') . '#' . $endpoint; + return $this->urlGenerator->linkToRouteAbsolute('deck.page.index') . trim($endpoint, '/'); } } diff --git a/lib/Collaboration/Resources/ResourceProvider.php b/lib/Collaboration/Resources/ResourceProvider.php index 299c2498f..36ae8f112 100644 --- a/lib/Collaboration/Resources/ResourceProvider.php +++ b/lib/Collaboration/Resources/ResourceProvider.php @@ -57,7 +57,7 @@ public function getType(): string { */ public function getResourceRichObject(IResource $resource): array { $board = $this->getBoard($resource); - $link = $this->urlGenerator->linkToRoute('deck.page.index') . '#/board/' . $resource->getId(); + $link = $this->urlGenerator->linkToRoute('deck.page.indexBoard', ['boardId' => $resource->getId()]); return [ 'type' => self::RESOURCE_TYPE, diff --git a/lib/Collaboration/Resources/ResourceProviderCard.php b/lib/Collaboration/Resources/ResourceProviderCard.php index 2c9e9d19d..77c226da9 100644 --- a/lib/Collaboration/Resources/ResourceProviderCard.php +++ b/lib/Collaboration/Resources/ResourceProviderCard.php @@ -66,7 +66,10 @@ public function getResourceRichObject(IResource $resource): array { throw new ResourceException('No unique card found for resource, this should never happen'); } - $link = $this->urlGenerator->linkToRoute('deck.page.index') . '#/board/' . $board->getId() . '/card/' . $resource->getId(); + $link = $this->urlGenerator->linkToRoute('deck.page.indexCard', [ + 'boardId' => $board->getId(), + 'cardId' => $card->getId() + ]); return [ 'type' => self::RESOURCE_TYPE, diff --git a/lib/Notification/Notifier.php b/lib/Notification/Notifier.php index dbba06332..6d3887ba6 100644 --- a/lib/Notification/Notifier.php +++ b/lib/Notification/Notifier.php @@ -85,9 +85,9 @@ public function prepare(INotification $notification, string $languageCode): INot switch ($notification->getSubject()) { case 'card-assigned': - $cardId = $notification->getObjectId(); + $cardId = (int)$notification->getObjectId(); $stack = $this->stackMapper->findStackFromCardId($cardId); - $boardId = $stack ? $stack->getBoardId() : null; + $boardId = $stack ? (int)$stack->getBoardId() : null; if (!$boardId) { throw new AlreadyProcessedException(); } @@ -110,13 +110,13 @@ public function prepare(INotification $notification, string $languageCode): INot 'name' => $params[0], 'boardname' => $params[1], 'stackname' => $stack->getTitle(), - 'link' => $this->url->linkToRouteAbsolute('deck.page.index') . '#/board/' . $boardId . '/card/' . $cardId . '', + 'link' => $this->getCardUrl($boardId, $cardId), ], 'deck-board' => [ 'type' => 'deck-board', 'id' => $boardId, 'name' => $params[1], - 'link' => $this->url->linkToRouteAbsolute('deck.page.index') . '#/board/' . $boardId, + 'link' => $this->getBoardUrl($boardId), ], 'user' => [ 'type' => 'user', @@ -125,12 +125,12 @@ public function prepare(INotification $notification, string $languageCode): INot ] ] ); - $notification->setLink($this->url->linkToRouteAbsolute('deck.page.index') . '#/board/' . $boardId . '/card/' . $cardId . ''); + $notification->setLink($this->getCardUrl($boardId, $cardId)); break; case 'card-overdue': - $cardId = $notification->getObjectId(); + $cardId = (int)$notification->getObjectId(); $stack = $this->stackMapper->findStackFromCardId($cardId); - $boardId = $stack ? $stack->getBoardId() : null; + $boardId = $stack ? (int)$stack->getBoardId() : null; if (!$boardId) { throw new AlreadyProcessedException(); } @@ -147,22 +147,22 @@ public function prepare(INotification $notification, string $languageCode): INot 'name' => $params[0], 'boardname' => $params[1], 'stackname' => $stack->getTitle(), - 'link' => $this->url->linkToRouteAbsolute('deck.page.index') . '#/board/' . $boardId . '/card/' . $cardId . '', + 'link' => $this->getCardUrl($boardId, $cardId), ], 'deck-board' => [ 'type' => 'deck-board', 'id' => $boardId, 'name' => $params[1], - 'link' => $this->url->linkToRouteAbsolute('deck.page.index') . '#/board/' . $boardId, + 'link' => $this->getBoardUrl($boardId), ], ] ); - $notification->setLink($this->url->linkToRouteAbsolute('deck.page.index') . '#/board/' . $boardId . '/card/' . $cardId . ''); + $notification->setLink($this->getCardUrl($boardId, $cardId)); break; case 'card-comment-mentioned': - $cardId = $notification->getObjectId(); + $cardId = (int)$notification->getObjectId(); $stack = $this->stackMapper->findStackFromCardId($cardId); - $boardId = $stack ? $stack->getBoardId() : null; + $boardId = $stack ? (int)$stack->getBoardId() : null; if (!$boardId) { throw new AlreadyProcessedException(); } @@ -185,7 +185,7 @@ public function prepare(INotification $notification, string $languageCode): INot 'name' => $params[0], 'boardname' => $params[1], 'stackname' => $stack->getTitle(), - 'link' => $this->url->linkToRouteAbsolute('deck.page.index') . '#/board/' . $boardId . '/card/' . $cardId . '', + 'link' => $this->getCardUrl($boardId, $cardId), ], 'user' => [ 'type' => 'user', @@ -197,10 +197,10 @@ public function prepare(INotification $notification, string $languageCode): INot if ($notification->getMessage() === '{message}') { $notification->setParsedMessage($notification->getMessageParameters()['message']); } - $notification->setLink($this->url->linkToRouteAbsolute('deck.page.index') . '#/board/' . $boardId . '/card/' . $cardId . ''); + $notification->setLink($this->getCardUrl($boardId, $cardId)); break; case 'board-shared': - $boardId = $notification->getObjectId(); + $boardId = (int)$notification->getObjectId(); if (!$boardId) { throw new AlreadyProcessedException(); } @@ -220,7 +220,7 @@ public function prepare(INotification $notification, string $languageCode): INot 'type' => 'deck-board', 'id' => $boardId, 'name' => $params[0], - 'link' => $this->url->linkToRouteAbsolute('deck.page.index') . '#/board/' . $boardId, + 'link' => $this->getBoardUrl($boardId), ], 'user' => [ 'type' => 'user', @@ -229,9 +229,17 @@ public function prepare(INotification $notification, string $languageCode): INot ] ] ); - $notification->setLink($this->url->linkToRouteAbsolute('deck.page.index') . '#/board/' . $boardId . '/'); + $notification->setLink($this->getBoardUrl($boardId)); break; } return $notification; } + + private function getBoardUrl(int $boardId): string { + return $this->url->linkToRouteAbsolute('deck.page.indexBoard', ['boardId' => $boardId]); + } + + private function getCardUrl(int $boardId, int $cardId): string { + return $this->url->linkToRouteAbsolute('deck.page.indexCard', ['boardId' => $boardId, 'cardId' => $cardId]); + } } diff --git a/lib/Provider/DeckProvider.php b/lib/Provider/DeckProvider.php index cda55c4db..7e962952c 100644 --- a/lib/Provider/DeckProvider.php +++ b/lib/Provider/DeckProvider.php @@ -219,7 +219,7 @@ public function improveSearchResult(ISearchResult $searchResult) { try { $board = $this->fullTextSearchService->getBoardFromCardId((int)$document->getId()); - $path = '#/board/' . $board->getId() . '/card/' . $document->getId(); + $path = '/board/' . $board->getId() . '/card/' . $document->getId(); $document->setLink($this->urlGenerator->linkToRoute('deck.page.index') . $path); } catch (DoesNotExistException $e) { } catch (MultipleObjectsReturnedException $e) { diff --git a/lib/Search/BoardSearchResultEntry.php b/lib/Search/BoardSearchResultEntry.php index 5fd435f0d..d2ed4b4e0 100644 --- a/lib/Search/BoardSearchResultEntry.php +++ b/lib/Search/BoardSearchResultEntry.php @@ -22,7 +22,7 @@ public function __construct(Board $board, $urlGenerator) { ), $board->getTitle(), '', - $urlGenerator->linkToRouteAbsolute('deck.page.index') . '#/board/' . $board->getId(), + $urlGenerator->linkToRouteAbsolute('deck.page.indexBoard', ['boardId' => $board->getId()]), 'icon-deck'); } } diff --git a/lib/Service/BoardService.php b/lib/Service/BoardService.php index 103aaec2c..18bc3d24d 100644 --- a/lib/Service/BoardService.php +++ b/lib/Service/BoardService.php @@ -746,10 +746,6 @@ private function enrichWithUsers($board, $since = -1) { $board->setUsers(array_values($boardUsers)); } - public function getBoardUrl($endpoint) { - return $this->urlGenerator->linkToRouteAbsolute('deck.page.index') . '#' . $endpoint; - } - /** * Clean a given board data from the Cache */ diff --git a/lib/Service/CardService.php b/lib/Service/CardService.php index 30fd754c5..639fa078e 100644 --- a/lib/Service/CardService.php +++ b/lib/Service/CardService.php @@ -655,13 +655,13 @@ public function removeLabel($cardId, $labelId) { $this->eventDispatcher->dispatchTyped(new CardUpdatedEvent($card)); } - public function getCardUrl($cardId) { + public function getCardUrl(int $cardId): string { $boardId = $this->cardMapper->findBoardId($cardId); - return $this->urlGenerator->linkToRouteAbsolute('deck.page.index') . "#/board/$boardId/card/$cardId"; + return $this->urlGenerator->linkToRouteAbsolute('deck.page.indexCard', ['boardId' => $boardId, 'cardId' => $cardId]); } - public function getRedirectUrlForCard($cardId) { - return $this->urlGenerator->linkToRouteAbsolute('deck.page.index') . "card/$cardId"; + public function getRedirectUrlForCard(int $cardId): string { + return $this->urlGenerator->linkToRouteAbsolute('deck.page.redirectToCard', ['cardId' => $cardId]); } } diff --git a/lib/Sharing/ShareAPIHelper.php b/lib/Sharing/ShareAPIHelper.php index 1a14f59db..6ed1f04a3 100644 --- a/lib/Sharing/ShareAPIHelper.php +++ b/lib/Sharing/ShareAPIHelper.php @@ -47,7 +47,7 @@ public function formatShare(IShare $share): array { $boardId = $this->cardMapper->findBoardId($card->getId()); $result['share_with'] = $share->getSharedWith(); $result['share_with_displayname'] = $card->getTitle(); - $result['share_with_link'] = $this->urlGenerator->linkToRouteAbsolute('deck.page.index') . '#/board/' . $boardId . '/card/' . $card->getId(); + $result['share_with_link'] = $this->urlGenerator->linkToRouteAbsolute('deck.page.indexCard', ['boardId' => $boardId, 'cardId' => $card->getId()]); return $result; } diff --git a/lib/Teams/DeckTeamResourceProvider.php b/lib/Teams/DeckTeamResourceProvider.php index 19e5670d5..b8cece026 100644 --- a/lib/Teams/DeckTeamResourceProvider.php +++ b/lib/Teams/DeckTeamResourceProvider.php @@ -43,7 +43,7 @@ public function getSharedWith($teamId): array { $this, (string)$board->getId(), $board->getTitle(), - $this->urlGenerator->linkToRouteAbsolute('deck.page.index') . '#/board/' . $board->getId(), + $this->urlGenerator->linkToRouteAbsolute('deck.page.indexBoard', ['boardId' => $board->getId()]), $this->getBoardBulletIcon($board), $this->urlGenerator->getAbsoluteURL($this->urlGenerator->imagePath('deck', 'deck-current.svg')), ); diff --git a/src/router.js b/src/router.js index 5942fa37a..ad5621161 100644 --- a/src/router.js +++ b/src/router.js @@ -144,8 +144,8 @@ const router = new Router({ router.beforeEach((to, from, next) => { // Redirect if fullPath begins with a hash (ignore hashes later in path) - if (to.fullPath.substring(0, 2) === '/#') { - const path = to.fullPath.substring(2) + if (to.hash.substring(0, 2) === '#/') { + const path = to.fullPath.replace('/apps/deck/#/', '/apps/deck/') next(path) return } From 1177d08e0dbc21201ddeab67f116e9e049815870 Mon Sep 17 00:00:00 2001 From: Julius Knorr Date: Fri, 17 Jan 2025 10:59:25 +0100 Subject: [PATCH 2/3] tests: Fix url generation mocks and cleanup some phpunit code Signed-off-by: Julius Knorr --- tests/unit/Activity/ActivityManagerTest.php | 4 +-- tests/unit/Activity/DeckProviderTest.php | 10 +++---- tests/unit/Db/CardTest.php | 2 +- .../Middleware/ExceptionMiddlewareTest.php | 2 +- tests/unit/Notification/NotifierTest.php | 28 +++++++++++-------- .../Reference/CardReferenceProviderTest.php | 2 +- tests/unit/Search/FilterStringParserTest.php | 2 +- .../unit/Search/Query/AQueryParameterTest.php | 2 +- tests/unit/Service/BoardServiceTest.php | 2 +- tests/unit/Service/CardServiceTest.php | 2 +- tests/unit/Service/PermissionServiceTest.php | 4 +-- 11 files changed, 33 insertions(+), 27 deletions(-) diff --git a/tests/unit/Activity/ActivityManagerTest.php b/tests/unit/Activity/ActivityManagerTest.php index bce21ebd7..c1036c3d7 100644 --- a/tests/unit/Activity/ActivityManagerTest.php +++ b/tests/unit/Activity/ActivityManagerTest.php @@ -284,7 +284,7 @@ public function testCreateEventLabel() { $this->assertEquals($event, $actual); } - public function dataSendToUsers() { + public static function dataSendToUsers() { return [ [ActivityManager::DECK_OBJECT_BOARD], [ActivityManager::DECK_OBJECT_CARD], @@ -344,7 +344,7 @@ public function testSendToUser($objectType) { $this->invokePrivate($this->activityManager, 'sendToUsers', [$event]); } - public function dataFindObjectForEntity() { + public static function dataFindObjectForEntity() { $board = new Board(); $board->setId(1); $stack = new Stack(); diff --git a/tests/unit/Activity/DeckProviderTest.php b/tests/unit/Activity/DeckProviderTest.php index a371d86da..c82520087 100644 --- a/tests/unit/Activity/DeckProviderTest.php +++ b/tests/unit/Activity/DeckProviderTest.php @@ -123,7 +123,7 @@ public function testParseFailureApp() { $this->provider->parse('en_US', $event, $event); } - public function dataEventIcons() { + public static function dataEventIcons() { return [ [ActivityManager::SUBJECT_LABEL_ASSIGN, 'core', 'actions/tag.svg'], [ActivityManager::SUBJECT_CARD_CREATE, 'files', 'add-color.svg'], @@ -166,7 +166,7 @@ public function testDeckUrl() { ->with('deck.page.index') ->willReturn('http://localhost/index.php/apps/deck/'); $this->assertEquals( - 'http://localhost/index.php/apps/deck/#board/1/card/1', + 'http://localhost/index.php/apps/deck/board/1/card/1', $this->provider->deckUrl('board/1/card/1') ); } @@ -202,7 +202,7 @@ public function testParseObjectTypeBoard() { 'type' => 'highlight', 'id' => 1, 'name' => 'Board', - 'link' => '#/board/1', + 'link' => 'board/1', ], 'user' => [ 'type' => 'user', @@ -319,9 +319,9 @@ public function testParseParamForBoard() { $expected = [ 'board' => [ 'type' => 'highlight', - 'id' => 1, + 'id' => '1', 'name' => 'Board name', - 'link' => '#/board/1/', + 'link' => 'board/1', ], ]; $actual = $this->invokePrivate($this->provider, 'parseParamForBoard', ['board', $subjectParams, $params]); diff --git a/tests/unit/Db/CardTest.php b/tests/unit/Db/CardTest.php index f1321b063..92393e7ba 100644 --- a/tests/unit/Db/CardTest.php +++ b/tests/unit/Db/CardTest.php @@ -47,7 +47,7 @@ private function createCard() { return $card; } - public function dataDuedate() { + public static function dataDuedate() { return [ [(new DateTime()), Card::DUEDATE_NOW], [(new DateTime())->sub(new DateInterval('P1D')), Card::DUEDATE_OVERDUE], diff --git a/tests/unit/Middleware/ExceptionMiddlewareTest.php b/tests/unit/Middleware/ExceptionMiddlewareTest.php index a04d1c345..a076061a2 100644 --- a/tests/unit/Middleware/ExceptionMiddlewareTest.php +++ b/tests/unit/Middleware/ExceptionMiddlewareTest.php @@ -58,7 +58,7 @@ public function setUp(): void { } - public function dataAfterException() { + public static function dataAfterException() { return [ [new NoPermissionException('No permission'), 403, 'No permission'], [new NotFoundException('Not found'), 404, 'Not found'] diff --git a/tests/unit/Notification/NotifierTest.php b/tests/unit/Notification/NotifierTest.php index e9fb9a501..491f78d6e 100644 --- a/tests/unit/Notification/NotifierTest.php +++ b/tests/unit/Notification/NotifierTest.php @@ -76,6 +76,15 @@ public function setUp(): void { $this->l10nFactory->expects($this->once()) ->method('get') ->willReturn($this->l10n); + + $this->url->expects($this->any()) + ->method('linkToRouteAbsolute') + ->willReturnCallback(function ($route) { + return match ($route) { + 'deck.page.indexBoard' => '/board/123', + 'deck.page.indexCard' => '/board/123/card/234', + }; + }); } public function testPrepareWrongApp() { @@ -178,7 +187,7 @@ public function testPrepareCardCommentMentioned() { $this->assertEquals($notification, $actualNotification); } - public function dataPrepareCardAssigned() { + public static function dataPrepareCardAssigned() { return [ [true], [false] ]; @@ -239,13 +248,13 @@ public function testPrepareCardAssigned($withUserFound = true) { 'name' => 'Card title', 'boardname' => 'Board title', 'stackname' => null, - 'link' => '#/board/123/card/123', + 'link' => '/board/123/card/234', ], 'deck-board' => [ 'type' => 'deck-board', 'id' => 123, 'name' => 'Board title', - 'link' => '#/board/123', + 'link' => '/board/123', ] ]); @@ -266,7 +275,7 @@ public function testPrepareCardAssigned($withUserFound = true) { $this->assertEquals($notification, $actualNotification); } - public function dataPrepareBoardShared() { + public static function dataPrepareBoardShared() { return [ [true], [false] ]; @@ -321,7 +330,7 @@ public function testPrepareBoardShared($withUserFound = true) { 'type' => 'deck-board', 'id' => 123, 'name' => 'Board title', - 'link' => '#/board/123', + 'link' => '/board/123', ] ]); @@ -347,11 +356,8 @@ public function testPrepareBoardShared($withUserFound = true) { * @return Stack|MockObject */ private function buildMockStack(int $boardId = 999) { - $mockStack = $this->getMockBuilder(Stack::class) - ->addMethods(['getBoardId']) - ->getMock(); - - $mockStack->method('getBoardId')->willReturn($boardId); - return $mockStack; + $stack = new Stack(); + $stack->setBoardId($boardId); + return $stack; } } diff --git a/tests/unit/Reference/CardReferenceProviderTest.php b/tests/unit/Reference/CardReferenceProviderTest.php index 9fbfb2966..603ce50cd 100644 --- a/tests/unit/Reference/CardReferenceProviderTest.php +++ b/tests/unit/Reference/CardReferenceProviderTest.php @@ -42,7 +42,7 @@ class CardReferenceProviderTest extends TestCase { private $l10n; private $userId; private $provider; - + public function setUp() : void { parent::setUp(); diff --git a/tests/unit/Search/FilterStringParserTest.php b/tests/unit/Search/FilterStringParserTest.php index 8629f32a1..68eb6b60a 100644 --- a/tests/unit/Search/FilterStringParserTest.php +++ b/tests/unit/Search/FilterStringParserTest.php @@ -102,7 +102,7 @@ public function testParseTextTokenQuotesWrong() { Assert::assertEquals($expected, $result); } - public function dataParseDate() { + public static function dataParseDate() { return [ ['date:today', [new DateQueryParameter('date', SearchQuery::COMPARATOR_EQUAL, 'today')], []], ['date:>today', [new DateQueryParameter('date', SearchQuery::COMPARATOR_MORE, 'today')], []], diff --git a/tests/unit/Search/Query/AQueryParameterTest.php b/tests/unit/Search/Query/AQueryParameterTest.php index f86ab649b..57576058e 100644 --- a/tests/unit/Search/Query/AQueryParameterTest.php +++ b/tests/unit/Search/Query/AQueryParameterTest.php @@ -29,7 +29,7 @@ use PHPUnit\Framework\TestCase; class AQueryParameterTest extends TestCase { - public function dataValue() { + public static function dataValue() { return [ ['foo', 'foo'], ['spätial character', 'spätial character'], diff --git a/tests/unit/Service/BoardServiceTest.php b/tests/unit/Service/BoardServiceTest.php index d8bec0096..a525714e5 100644 --- a/tests/unit/Service/BoardServiceTest.php +++ b/tests/unit/Service/BoardServiceTest.php @@ -291,7 +291,7 @@ public function testAddAcl() { )); } - public function dataAddAclExtendPermission() { + public static function dataAddAclExtendPermission() { return [ [[false, false, false], [false, false, false], [false, false, false]], [[false, false, false], [true, true, true], [false, false, false]], diff --git a/tests/unit/Service/CardServiceTest.php b/tests/unit/Service/CardServiceTest.php index e68775f2f..f7e8b3a99 100644 --- a/tests/unit/Service/CardServiceTest.php +++ b/tests/unit/Service/CardServiceTest.php @@ -365,7 +365,7 @@ public function testRenameArchived() { $this->cardService->rename(123, 'newtitle'); } - public function dataReorder() { + public static function dataReorder() { return [ [0, 0, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]], [0, 9, [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]], diff --git a/tests/unit/Service/PermissionServiceTest.php b/tests/unit/Service/PermissionServiceTest.php index b9dfe8560..a25a325d5 100644 --- a/tests/unit/Service/PermissionServiceTest.php +++ b/tests/unit/Service/PermissionServiceTest.php @@ -151,7 +151,7 @@ public function testUserIsBoardOwnerNull() { $this->assertEquals(false, $this->service->userIsBoardOwner(123)); } - public function dataTestUserCan() { + public static function dataTestUserCan() { return [ // participant permissions type ['admin', false, false, false, 'user', true, false, false, false], @@ -183,7 +183,7 @@ public function testUserCanFail() { $this->assertFalse($this->service->userCan([], Acl::PERMISSION_EDIT)); } - public function dataCheckPermission() { + public static function dataCheckPermission() { return [ // see getAcls() for set permissions [1, Acl::PERMISSION_READ, true], From edb5fd421a04bfc4894ad2ddca2a577bc51ea37a Mon Sep 17 00:00:00 2001 From: Julius Knorr Date: Fri, 17 Jan 2025 15:30:07 +0100 Subject: [PATCH 3/3] fix: Use dynamic base URL for vue router to make routing work in all cases Signed-off-by: Julius Knorr --- src/router.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/router.js b/src/router.js index ad5621161..e4f206cf9 100644 --- a/src/router.js +++ b/src/router.js @@ -5,7 +5,7 @@ import Vue from 'vue' import Router from 'vue-router' -import { generateUrl } from '@nextcloud/router' +import { generateUrl, getRootUrl } from '@nextcloud/router' import { BOARD_FILTERS } from './store/main.js' import Boards from './components/boards/Boards.vue' import Board from './components/board/Board.vue' @@ -16,9 +16,15 @@ import Overview from './components/overview/Overview.vue' Vue.use(Router) +// We apply a dynamic base URL depending on the URL used in the browser +const baseUrl = generateUrl('/apps/deck/') +const webRootWithIndexPHP = getRootUrl() + '/index.php' +const doesURLContainIndexPHP = window.location.pathname.startsWith(webRootWithIndexPHP) +const currentBaseUrl = doesURLContainIndexPHP ? baseUrl : baseUrl.replace('/index.php/', '/') + const router = new Router({ mode: 'history', - base: generateUrl('/apps/deck/'), + base: currentBaseUrl, linkActiveClass: 'active', routes: [ { @@ -145,7 +151,7 @@ const router = new Router({ router.beforeEach((to, from, next) => { // Redirect if fullPath begins with a hash (ignore hashes later in path) if (to.hash.substring(0, 2) === '#/') { - const path = to.fullPath.replace('/apps/deck/#/', '/apps/deck/') + const path = to.fullPath.replace('/#/', '/').trimEnd('/') next(path) return }