From 511e2f71298b3634f10eaa85553cd207355e46e0 Mon Sep 17 00:00:00 2001 From: Okba Allaoua Date: Sat, 7 Nov 2026 15:45:24 +0100 Subject: [PATCH] fix(boards): keep the done column when cloning or importing Exports without the field import as a normal column. Signed-off-by: Okba Allaoua Assisted-by: ClaudeCode:claude-opus-5-5 --- lib/Service/BoardService.php | 1 + .../Importer/Systems/DeckJsonService.php | 1 + tests/unit/Service/BoardServiceTest.php | 38 +++++++++++++++++++ .../Importer/Systems/DeckJsonServiceTest.php | 15 ++++++++ 4 files changed, 55 insertions(+) diff --git a/lib/Service/BoardService.php b/lib/Service/BoardService.php index cb38c8d4b4..a3d3e0afc9 100644 --- a/lib/Service/BoardService.php +++ b/lib/Service/BoardService.php @@ -698,6 +698,7 @@ public function clone( $newStack->setOrder($stack->getOrder()); } $newStack->setBoardId($newBoard->getId()); + $newStack->setIsDoneColumn($stack->getIsDoneColumn()); $this->stackMapper->insert($newStack); } diff --git a/lib/Service/Importer/Systems/DeckJsonService.php b/lib/Service/Importer/Systems/DeckJsonService.php index 43cd78386a..e650a38262 100644 --- a/lib/Service/Importer/Systems/DeckJsonService.php +++ b/lib/Service/Importer/Systems/DeckJsonService.php @@ -271,6 +271,7 @@ public function getStacks(): array { $stack->setBoardId($this->getImportService()->getBoard()->getId()); $stack->setOrder($source->order); $stack->setLastModified($source->lastModified); + $stack->setIsDoneColumn($source->isDoneColumn ?? false); $return[$source->id] = $stack; } diff --git a/tests/unit/Service/BoardServiceTest.php b/tests/unit/Service/BoardServiceTest.php index 7e52be8312..0d1b8d7d85 100644 --- a/tests/unit/Service/BoardServiceTest.php +++ b/tests/unit/Service/BoardServiceTest.php @@ -49,6 +49,7 @@ use OCA\Deck\Db\LabelMapper; use OCA\Deck\Db\Session; use OCA\Deck\Db\SessionMapper; +use OCA\Deck\Db\Stack; use OCA\Deck\Db\StackMapper; use OCA\Deck\Db\User; use OCA\Deck\Event\AclCreatedEvent; @@ -736,6 +737,43 @@ public function testUpdateArchivedLogsCriticalAction(): void { $this->assertSame(['boardId' => 123], $auditEvents[0]->getParameters()); } + public function testCloneKeepsDoneColumn(): void { + $board = new Board(); + $board->setId(1); + $board->setOwner('admin'); + $board->setTitle('Board'); + $board->setColor('ffffff'); + $doneStack = new Stack(); + $doneStack->setTitle('Done'); + $doneStack->setOrder(1); + $doneStack->setIsDoneColumn(true); + $openStack = new Stack(); + $openStack->setTitle('Open'); + $openStack->setOrder(0); + $this->permissionService->method('canCreate')->willReturn(true); + $this->permissionService->method('findUsers')->willReturn(['admin' => 'admin']); + $this->boardMapper->method('find')->willReturn($board); + $this->boardMapper->method('insert') + ->willReturnCallback(static function (Board $newBoard): Board { + $newBoard->setId(2); + return $newBoard; + }); + $this->aclMapper->method('findAll')->willReturn([]); + $this->labelMapper->method('findAll')->willReturn([]); + $this->stackMapper->method('findAll')->willReturn([$doneStack, $openStack]); + $this->sessionMapper->method('findAllActive')->willReturn([]); + $inserted = []; + $this->stackMapper->method('insert') + ->willReturnCallback(static function (Stack $stack) use (&$inserted): Stack { + $inserted[$stack->getTitle()] = $stack->getIsDoneColumn(); + return $stack; + }); + + $this->service->clone(1, 'admin'); + + $this->assertSame(['Done' => true, 'Open' => false], $inserted); + } + public function testCloneLogsCriticalAction(): void { $board = new Board(); $board->setId(1); diff --git a/tests/unit/Service/Importer/Systems/DeckJsonServiceTest.php b/tests/unit/Service/Importer/Systems/DeckJsonServiceTest.php index 23a3231159..41babeeaca 100644 --- a/tests/unit/Service/Importer/Systems/DeckJsonServiceTest.php +++ b/tests/unit/Service/Importer/Systems/DeckJsonServiceTest.php @@ -109,6 +109,21 @@ public function testGetCards() { $this->assertEquals('# Test description' . "\n\n" . 'Hello world', $card119->getDescription()); } + public function testGetStacksKeepsDoneColumn(): void { + $importService = $this->setUpImportService(); + $importService->getData()->stacks = [ + (object)['id' => 1, 'title' => 'Done', 'order' => 0, 'lastModified' => 0, 'isDoneColumn' => true], + (object)['id' => 2, 'title' => 'Open', 'order' => 1, 'lastModified' => 0, 'isDoneColumn' => false], + (object)['id' => 3, 'title' => 'Old export', 'order' => 2, 'lastModified' => 0], + ]; + + $stacks = $this->service->getStacks(); + + $this->assertTrue($stacks[1]->getIsDoneColumn()); + $this->assertFalse($stacks[2]->getIsDoneColumn()); + $this->assertFalse($stacks[3]->getIsDoneColumn()); + } + private function setUpImportService(): BoardImportService { $importService = Server::get(BoardImportService::class);