From 389fb552be207a181e6ecd408dbdf42b57bc53ca Mon Sep 17 00:00:00 2001 From: Jonas Date: Tue, 10 Nov 2026 11:44:32 +0100 Subject: [PATCH] fix(cards): keep card color on clone and use contrasting text color Pass the card color through when duplicating a card so the copy keeps it. On cards with a custom background color, pick black or white text based on the background's lightness, as is already done for tags, and apply it to muted text and badges on the card as well. Signed-off-by: Jonas Assisted-by: ClaudeCode:claude-opus-5-5 --- lib/Service/CardService.php | 2 +- src/components/cards/CardItem.vue | 15 ++++++++++++++- tests/unit/Service/CardServiceTest.php | 8 +++++++- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/lib/Service/CardService.php b/lib/Service/CardService.php index 5e770bc53c..5b81308781 100644 --- a/lib/Service/CardService.php +++ b/lib/Service/CardService.php @@ -396,7 +396,7 @@ public function cloneCard(int $id, ?int $targetStackId = null):Card { $targetStackId = $originCard->getStackId(); } $this->permissionService->checkPermission($this->stackMapper, $targetStackId, Acl::PERMISSION_EDIT); - $newCard = $this->create($originCard->getTitle(), $targetStackId, $originCard->getType(), $originCard->getOrder(), $originCard->getOwner()); + $newCard = $this->create($originCard->getTitle(), $targetStackId, $originCard->getType(), $originCard->getOrder(), $originCard->getOwner(), color: $originCard->getColor()); $boardId = $this->stackMapper->findBoardId($targetStackId); foreach ($this->labelMapper->findAssignedLabelsForCard($id) as $label) { if ($boardId !== $this->stackMapper->findBoardId($originCard->getStackId())) { diff --git a/src/components/cards/CardItem.vue b/src/components/cards/CardItem.vue index 702267f267..dacc063f9c 100644 --- a/src/components/cards/CardItem.vue +++ b/src/components/cards/CardItem.vue @@ -8,7 +8,7 @@
setOwner('admin'); $card->setStackId(12345); $card->setDescription('A test description'); + $card->setColor('FF0000'); $clonedCard = clone $card; $clonedCard->setId(2); $clonedCard->setStackId(1234); + $inserted = []; $this->cardMapper->expects($this->exactly(2)) ->method('insert') - ->willReturn($card, $clonedCard); + ->willReturnCallback(function (Card $entity) use (&$inserted, $card, $clonedCard) { + $inserted[] = $entity; + return count($inserted) === 1 ? $card : $clonedCard; + }); $this->cardMapper->expects($this->once()) ->method('update')->willReturn($clonedCard); @@ -408,6 +413,7 @@ public function testClone() { $this->assertNotEquals($b->getStackId(), $c->getStackId()); $this->assertEquals('A test description', $c->getDescription()); + $this->assertEquals('FF0000', $inserted[1]->getColor()); $this->assertCount(1, $c->getLabels()); $this->assertEquals($label->getId(), $c->getLabels()[0]->getId());