From e37bf2b51dbf42bd04637151e4f9b654305ec6a1 Mon Sep 17 00:00:00 2001 From: Martin Filser Date: Sun, 3 Jul 2022 22:23:31 +0200 Subject: [PATCH] Copy card at card details copies now attachments --- client/components/cards/cardDetails.js | 12 +-------- models/cards.js | 34 ++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js index a5af18272..57a45ff01 100644 --- a/client/components/cards/cardDetails.js +++ b/client/components/cards/cardDetails.js @@ -1035,18 +1035,8 @@ class DialogWithBoardSwimlaneList extends BlazeComponent { const title = textarea.val().trim(); if (title) { - const oldTitle = card.title; - card.title = title; - card.coverId = ''; - // insert new card to the top of new list - const minOrder = card.getMinSort(listId, swimlaneId); - card.sort = minOrder - 1; - - const newCardId = card.copy(boardId, swimlaneId, listId); - - // restore the old card title, otherwise the card title would change in the current view (only temporary) - card.title = oldTitle; + const newCardId = Meteor.call('copyCard', card._id, boardId, swimlaneId, listId, true, {title: title}); // In case the filter is active we need to add the newly inserted card in // the list of exceptions -- cards that are not filtered. Otherwise the diff --git a/models/cards.js b/models/cards.js index 4a3497c6a..e30483aa1 100644 --- a/models/cards.js +++ b/models/cards.js @@ -3038,6 +3038,40 @@ const addCronJob = _.debounce( ); if (Meteor.isServer) { + Meteor.methods({ + /** copies a card + *
  • this method is needed on the server because attachments can only be copied on the server (access to file system) + * @param card id to copy + * @param boardId copy to this board + * @param swimlandeId copy to this swimlane id + * @param listId copy to this list id + * @param insertAtTop insert the card at the top? + * @param mergeCardValues this values into the copied card + * @return the new card id + */ + copyCard(cardId, boardId, swimlaneId, listId, insertAtTop, mergeCardValues) { + check(cardId, String); + check(boardId, String); + check(swimlaneId, String); + check(listId, String); + check(insertAtTop, Boolean); + check(mergeCardValues, Object); + + const card = Cards.findOne({_id: cardId}); + Object.assign(card, mergeCardValues); + + const sort = card.getSort(listId, swimlaneId, insertAtTop); + if (insertAtTop) { + card.sort = sort - 1; + } else + { + card.sort = sort + 1; + } + + const ret = card.copy(boardId, swimlaneId, listId); + return ret; + }, + }); // Cards are often fetched within a board, so we create an index to make these // queries more efficient. Meteor.startup(() => {