diff --git a/client/src/actions/cards.js b/client/src/actions/cards.js index 0b0be6be..47dd2947 100644 --- a/client/src/actions/cards.js +++ b/client/src/actions/cards.js @@ -57,10 +57,15 @@ updateCard.failure = (id, error) => ({ }, }); -const handleCardUpdate = (card) => ({ +const handleCardUpdate = (card, isFetched, cardMemberships, cardLabels, tasks, attachments) => ({ type: ActionTypes.CARD_UPDATE_HANDLE, payload: { card, + isFetched, + cardMemberships, + cardLabels, + tasks, + attachments, }, }); diff --git a/client/src/constants/ActionTypes.js b/client/src/constants/ActionTypes.js index 4b8c5455..4e35cdb4 100644 --- a/client/src/constants/ActionTypes.js +++ b/client/src/constants/ActionTypes.js @@ -195,9 +195,6 @@ export default { CARD_UPDATE__SUCCESS: 'CARD_UPDATE__SUCCESS', CARD_UPDATE__FAILURE: 'CARD_UPDATE__FAILURE', CARD_UPDATE_HANDLE: 'CARD_UPDATE_HANDLE', - CARD_TRANSFER: 'CARD_TRANSFER', - CARD_TRANSFER__SUCCESS: 'CARD_TRANSFER__SUCCESS', - CARD_TRANSFER__FAILURE: 'CARD_TRANSFER__FAILURE', CARD_DUPLICATE: 'CARD_DUPLICATE', CARD_DUPLICATE__SUCCESS: 'CARD_DUPLICATE__SUCCESS', CARD_DUPLICATE__FAILURE: 'CARD_DUPLICATE__FAILURE', diff --git a/client/src/models/Attachment.js b/client/src/models/Attachment.js index ca171f8e..de3b157b 100644 --- a/client/src/models/Attachment.js +++ b/client/src/models/Attachment.js @@ -28,6 +28,7 @@ export default class extends BaseModel { case ActionTypes.CORE_INITIALIZE: case ActionTypes.PROJECT_MANAGER_CREATE_HANDLE: case ActionTypes.BOARD_MEMBERSHIP_CREATE_HANDLE: + case ActionTypes.CARD_UPDATE_HANDLE: if (payload.attachments) { payload.attachments.forEach((attachment) => { Attachment.upsert(attachment); diff --git a/client/src/models/Card.js b/client/src/models/Card.js index 34b0b599..c0066634 100755 --- a/client/src/models/Card.js +++ b/client/src/models/Card.js @@ -180,7 +180,6 @@ export default class extends BaseModel { break; case ActionTypes.CARD_CREATE: case ActionTypes.CARD_UPDATE__SUCCESS: - case ActionTypes.CARD_UPDATE_HANDLE: Card.upsert(payload.card); break; @@ -202,8 +201,40 @@ export default class extends BaseModel { break; } - case ActionTypes.CARD_UPDATE: - Card.withId(payload.id).update(payload.data); + case ActionTypes.CARD_UPDATE: { + const cardModel = Card.withId(payload.id); + + // TODO: introduce separate action? + if (payload.data.boardId && payload.data.boardId !== cardModel.boardId) { + cardModel.deleteWithRelated(); + } else { + cardModel.update(payload.data); + } + + break; + } + case ActionTypes.CARD_UPDATE_HANDLE: + if (payload.isFetched) { + const cardModel = Card.withId(payload.card.id); + + if (cardModel) { + cardModel.deleteWithRelated(); + } + } + + Card.upsert(payload.card); + + if (payload.cardMemberships) { + payload.cardMemberships.forEach(({ cardId, userId }) => { + Card.withId(cardId).users.add(userId); + }); + } + + if (payload.cardLabels) { + payload.cardLabels.forEach(({ cardId, labelId }) => { + Card.withId(cardId).labels.add(labelId); + }); + } break; case ActionTypes.CARD_DUPLICATE: { diff --git a/client/src/models/Task.js b/client/src/models/Task.js index b990fe21..bb6b10be 100755 --- a/client/src/models/Task.js +++ b/client/src/models/Task.js @@ -27,6 +27,7 @@ export default class extends BaseModel { case ActionTypes.CORE_INITIALIZE: case ActionTypes.PROJECT_MANAGER_CREATE_HANDLE: case ActionTypes.BOARD_MEMBERSHIP_CREATE_HANDLE: + case ActionTypes.CARD_UPDATE_HANDLE: if (payload.tasks) { payload.tasks.forEach((task) => { Task.upsert(task); diff --git a/client/src/sagas/core/services/cards.js b/client/src/sagas/core/services/cards.js index a5bc725b..8b5d7480 100644 --- a/client/src/sagas/core/services/cards.js +++ b/client/src/sagas/core/services/cards.js @@ -81,9 +81,30 @@ export function* updateCurrentCard(data) { yield call(updateCard, cardId, data); } -// TODO: handle card transfer export function* handleCardUpdate(card) { - yield put(actions.handleCardUpdate(card)); + let fetch = false; + if (card.boardId) { + const prevCard = yield select(selectors.selectCardById, card.id); + fetch = !prevCard || prevCard.boardId !== card.boardId; + } + + let cardMemberships; + let cardLabels; + let tasks; + let attachments; + + if (fetch) { + try { + ({ + item: card, // eslint-disable-line no-param-reassign + included: { cardMemberships, cardLabels, tasks, attachments }, + } = yield call(request, api.getCard, card.id)); + } catch (error) { + fetch = false; + } + } + + yield put(actions.handleCardUpdate(card, fetch, cardMemberships, cardLabels, tasks, attachments)); } export function* moveCard(id, listId, index = 0) { diff --git a/server/api/helpers/cards/update-one.js b/server/api/helpers/cards/update-one.js index 1c1dddae..cd978b7e 100644 --- a/server/api/helpers/cards/update-one.js +++ b/server/api/helpers/cards/update-one.js @@ -204,6 +204,15 @@ module.exports = { ), ); + sails.sockets.broadcast( + `board:${inputs.record.boardId}`, + 'cardDelete', // TODO: introduce separate event + { + item: inputs.record, + }, + inputs.request, + ); + sails.sockets.broadcast(`board:${card.boardId}`, 'cardUpdate', { item: card, });