From f8aa487e9118264f4d96c4d0cde384bcaf05e0a0 Mon Sep 17 00:00:00 2001 From: Lauri Ojansivu Date: Sun, 8 Feb 2026 01:35:31 +0200 Subject: [PATCH] Fix Copy Card and Move Card. Thanks to xet7 ! Fixes #6119 --- client/components/cards/cardDetails.js | 12 ++++-- client/lib/dialogWithBoardSwimlaneList.js | 37 ++++++++++++++++--- client/lib/dialogWithBoardSwimlaneListCard.js | 9 ++++- 3 files changed, 47 insertions(+), 11 deletions(-) diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js index bd6614280..cb40ceec5 100644 --- a/client/components/cards/cardDetails.js +++ b/client/components/cards/cardDetails.js @@ -1030,7 +1030,8 @@ Template.editCardAssignerForm.events({ } } else { // If no card selected, move to end - sortIndex = card.getMaxSort(options.listId, options.swimlaneId) + 1; + const maxSort = card.getMaxSort(options.listId, options.swimlaneId); + sortIndex = maxSort !== null ? maxSort + 1 : 0; } await card.move(options.boardId, options.swimlaneId, options.listId, sortIndex); @@ -1073,7 +1074,8 @@ Template.editCardAssignerForm.events({ } } else { // If no card selected, copy to end - sortIndex = newCard.getMaxSort(options.listId, options.swimlaneId) + 1; + const maxSort = newCard.getMaxSort(options.listId, options.swimlaneId); + sortIndex = maxSort !== null ? maxSort + 1 : 0; } await newCard.move(options.boardId, options.swimlaneId, options.listId, sortIndex); @@ -1125,7 +1127,8 @@ Template.editCardAssignerForm.events({ } } } else { - sortIndex = newCard.getMaxSort(options.listId, options.swimlaneId) + 1; + const maxSort = newCard.getMaxSort(options.listId, options.swimlaneId); + sortIndex = maxSort !== null ? maxSort + 1 : 0; } await newCard.move(options.boardId, options.swimlaneId, options.listId, sortIndex); @@ -1170,7 +1173,8 @@ Template.editCardAssignerForm.events({ } } } else { - sortIndex = newCard.getMaxSort(options.listId, options.swimlaneId) + 1; + const maxSort = newCard.getMaxSort(options.listId, options.swimlaneId); + sortIndex = maxSort !== null ? maxSort + 1 : 0; } await newCard.move(options.boardId, options.swimlaneId, options.listId, sortIndex); diff --git a/client/lib/dialogWithBoardSwimlaneList.js b/client/lib/dialogWithBoardSwimlaneList.js index 888601a56..f1a780069 100644 --- a/client/lib/dialogWithBoardSwimlaneList.js +++ b/client/lib/dialogWithBoardSwimlaneList.js @@ -73,12 +73,37 @@ export class DialogWithBoardSwimlaneList extends BlazeComponent { /** sets the first list id */ setFirstListId() { try { - const board = ReactiveCache.getBoard(this.selectedBoardId.get()); - const listId = board.lists()[0]._id; + const boardId = this.selectedBoardId.get(); + const swimlaneId = this.selectedSwimlaneId.get(); + const lists = this.getListsForBoardSwimlane(boardId, swimlaneId); + const listId = lists[0] ? lists[0]._id : ''; this.selectedListId.set(listId); } catch (e) {} } + /** get lists filtered by board and swimlane */ + getListsForBoardSwimlane(boardId, swimlaneId) { + if (!boardId) return []; + const board = ReactiveCache.getBoard(boardId); + if (!board) return []; + + const selector = { + boardId, + archived: false, + }; + + if (swimlaneId) { + const defaultSwimlane = board.getDefaultSwimline && board.getDefaultSwimline(); + if (defaultSwimlane && defaultSwimlane._id === swimlaneId) { + selector.swimlaneId = { $in: [swimlaneId, null, ''] }; + } else { + selector.swimlaneId = swimlaneId; + } + } + + return ReactiveCache.getLists(selector, { sort: { sort: 1 } }); + } + /** returns if the board id was the last confirmed one * @param boardId check this board id * @return if the board id was the last confirmed one @@ -130,9 +155,10 @@ export class DialogWithBoardSwimlaneList extends BlazeComponent { /** returns all available lists of the current board */ lists() { - const board = ReactiveCache.getBoard(this.selectedBoardId.get()); - const ret = board.lists(); - return ret; + return this.getListsForBoardSwimlane( + this.selectedBoardId.get(), + this.selectedSwimlaneId.get(), + ); } /** Fix swimlane title translation issue for "Default" swimlane @@ -214,6 +240,7 @@ export class DialogWithBoardSwimlaneList extends BlazeComponent { }, 'change .js-select-swimlanes'(event) { this.selectedSwimlaneId.set($(event.currentTarget).val()); + this.setFirstListId(); }, }, ]; diff --git a/client/lib/dialogWithBoardSwimlaneListCard.js b/client/lib/dialogWithBoardSwimlaneListCard.js index 6ab5aa663..bf86cfea1 100644 --- a/client/lib/dialogWithBoardSwimlaneListCard.js +++ b/client/lib/dialogWithBoardSwimlaneListCard.js @@ -37,8 +37,9 @@ export class DialogWithBoardSwimlaneListCard extends DialogWithBoardSwimlaneList /** returns all available cards of the current list */ cards() { const list = ReactiveCache.getList({_id: this.selectedListId.get(), boardId: this.selectedBoardId.get()}); - if (list) { - return list.cards(); + const swimlaneId = this.selectedSwimlaneId.get(); + if (list && swimlaneId) { + return list.cards(swimlaneId).sort((a, b) => a.sort - b.sort); } else { return []; } @@ -112,12 +113,16 @@ export class DialogWithBoardSwimlaneListCard extends DialogWithBoardSwimlaneList }, 'change .js-select-swimlanes'(event) { this.selectedSwimlaneId.set($(event.currentTarget).val()); + this.setFirstListId(); }, 'change .js-select-lists'(event) { this.selectedListId.set($(event.currentTarget).val()); // Reset card selection when list changes this.selectedCardId.set(''); }, + 'change .js-select-cards'(event) { + this.selectedCardId.set($(event.currentTarget).val()); + }, }, ]; }