diff --git a/client/src/components/activities/Activities/Item.jsx b/client/src/components/activities/Activities/Item.jsx index 181e5970..e1901076 100755 --- a/client/src/components/activities/Activities/Item.jsx +++ b/client/src/components/activities/Activities/Item.jsx @@ -113,6 +113,36 @@ const Item = React.memo(({ id }) => { ); + break; + case ActivityTypes.REMOVE_MEMBER_FROM_CARD: + contentNode = + user.id === activity.data.user.id ? ( + + {userName} + {' left this card'} + + ) : ( + + {userName} + + {' removed '} + {activity.data.user.name} + {' from this card'} + + + ); + break; default: contentNode = null; diff --git a/client/src/constants/Enums.js b/client/src/constants/Enums.js index 0cfcf20a..02f591cf 100755 --- a/client/src/constants/Enums.js +++ b/client/src/constants/Enums.js @@ -91,6 +91,7 @@ export const ActivityTypes = { CREATE_CARD: 'createCard', MOVE_CARD: 'moveCard', ADD_MEMBER_TO_CARD: 'addMemberToCard', + REMOVE_MEMBER_FROM_CARD: 'removeMemberFromCard', }; export const NotificationTypes = { diff --git a/client/src/locales/en-GB/core.js b/client/src/locales/en-GB/core.js index d19b63a2..688eebf2 100644 --- a/client/src/locales/en-GB/core.js +++ b/client/src/locales/en-GB/core.js @@ -291,9 +291,12 @@ export default { userAddedYouToCard: '{{user}} added you to <2>{{card}}', userJoinedThisCard: `<0>{{user}}<1> joined this card`, userLeftNewCommentToCard: '{{user}} left a new comment «{{comment}}» to <2>{{card}}', + userLeftThisCard: '<0>{{user}}<1> left this card', userMovedCardFromListToList: '{{user}} moved <2>{{card}} from {{fromList}} to {{toList}}', userMovedThisCardFromListToList: '<0>{{user}}<1> moved this card from {{fromList}} to {{toList}}', + userRemovedUserFromThisCard: + '<0>{{actorUser}}<1> removed {{removedUser}} from this card', username: 'Username', users: 'Users', viewer: 'Viewer', diff --git a/client/src/locales/en-US/core.js b/client/src/locales/en-US/core.js index 468eb945..50487bd3 100644 --- a/client/src/locales/en-US/core.js +++ b/client/src/locales/en-US/core.js @@ -286,9 +286,12 @@ export default { userAddedYouToCard: '{{user}} added you to <2>{{card}}', userJoinedThisCard: `<0>{{user}}<1> joined this card`, userLeftNewCommentToCard: '{{user}} left a new comment «{{comment}}» to <2>{{card}}', + userLeftThisCard: '<0>{{user}}<1> left this card', userMovedCardFromListToList: '{{user}} moved <2>{{card}} from {{fromList}} to {{toList}}', userMovedThisCardFromListToList: '<0>{{user}}<1> moved this card from {{fromList}} to {{toList}}', + userRemovedUserFromThisCard: + '<0>{{actorUser}}<1> removed {{removedUser}} from this card', username: 'Username', users: 'Users', viewer: 'Viewer', diff --git a/server/api/controllers/card-memberships/create.js b/server/api/controllers/card-memberships/create.js index c5750764..e0199150 100755 --- a/server/api/controllers/card-memberships/create.js +++ b/server/api/controllers/card-memberships/create.js @@ -76,7 +76,7 @@ module.exports = { const isBoardMember = await sails.helpers.users.isBoardMember(user.id, board.id); if (!isBoardMember) { - throw Errors.USER_NOT_FOUND; + throw Errors.USER_NOT_FOUND; // Forbidden } const cardMembership = await sails.helpers.cardMemberships.createOne diff --git a/server/api/controllers/card-memberships/delete.js b/server/api/controllers/card-memberships/delete.js index 73857573..ec70c435 100755 --- a/server/api/controllers/card-memberships/delete.js +++ b/server/api/controllers/card-memberships/delete.js @@ -70,7 +70,10 @@ module.exports = { throw Errors.USER_NOT_CARD_MEMBER; } + const user = await User.qm.getOneById(cardMembership.userId); + cardMembership = await sails.helpers.cardMemberships.deleteOne.with({ + user, project, board, list, diff --git a/server/api/helpers/actions/create-one.js b/server/api/helpers/actions/create-one.js index ca23d358..ed35b5e7 100644 --- a/server/api/helpers/actions/create-one.js +++ b/server/api/helpers/actions/create-one.js @@ -142,8 +142,8 @@ module.exports = { user: values.user, }); - if (action.type !== Action.Types.CREATE_CARD) { - if (action.type === Action.Types.ADD_MEMBER_TO_CARD) { + if (Action.INTERNAL_NOTIFIABLE_TYPES.includes(action.type)) { + if (Action.PERSONAL_NOTIFIABLE_TYPES.includes(action.type)) { if (values.user !== action.data.user.id) { await sails.helpers.notifications.createOne.with({ values: { @@ -195,23 +195,25 @@ module.exports = { }), ), ); + } + } - const notificationServices = await NotificationService.qm.getByBoardId(inputs.board.id); + if (Action.EXTERNAL_NOTIFIABLE_TYPES.includes(action.type)) { + const notificationServices = await NotificationService.qm.getByBoardId(inputs.board.id); - if (notificationServices.length > 0) { - const services = notificationServices.map((notificationService) => - _.pick(notificationService, ['url', 'format']), - ); + if (notificationServices.length > 0) { + const services = notificationServices.map((notificationService) => + _.pick(notificationService, ['url', 'format']), + ); - buildAndSendNotifications( - services, - inputs.board, - values.card, - action, - values.user, - sails.helpers.utils.makeTranslator(), - ); - } + buildAndSendNotifications( + services, + inputs.board, + values.card, + action, + values.user, + sails.helpers.utils.makeTranslator(), + ); } } diff --git a/server/api/helpers/card-memberships/delete-one.js b/server/api/helpers/card-memberships/delete-one.js index f9ed0470..659bb90a 100644 --- a/server/api/helpers/card-memberships/delete-one.js +++ b/server/api/helpers/card-memberships/delete-one.js @@ -9,6 +9,10 @@ module.exports = { type: 'ref', required: true, }, + user: { + type: 'ref', + required: true, + }, project: { type: 'ref', required: true, @@ -52,6 +56,7 @@ module.exports = { buildData: () => ({ item: cardMembership, included: { + users: [inputs.user], projects: [inputs.project], boards: [inputs.board], lists: [inputs.list], @@ -75,6 +80,20 @@ module.exports = { }, }); } + + await sails.helpers.actions.createOne.with({ + values: { + type: Action.Types.REMOVE_MEMBER_FROM_CARD, + data: { + user: _.pick(inputs.user, ['id', 'name']), + }, + user: inputs.actorUser, + card: inputs.card, + }, + project: inputs.project, + board: inputs.board, + list: inputs.list, + }); } return cardMembership; diff --git a/server/api/models/Action.js b/server/api/models/Action.js index 6fd8711f..888d34f1 100755 --- a/server/api/models/Action.js +++ b/server/api/models/Action.js @@ -14,10 +14,18 @@ const Types = { CREATE_CARD: 'createCard', MOVE_CARD: 'moveCard', ADD_MEMBER_TO_CARD: 'addMemberToCard', + REMOVE_MEMBER_FROM_CARD: 'removeMemberFromCard', }; +const INTERNAL_NOTIFIABLE_TYPES = [Types.MOVE_CARD, Types.ADD_MEMBER_TO_CARD]; +const EXTERNAL_NOTIFIABLE_TYPES = [Types.CREATE_CARD, Types.MOVE_CARD]; +const PERSONAL_NOTIFIABLE_TYPES = [Types.ADD_MEMBER_TO_CARD]; + module.exports = { Types, + INTERNAL_NOTIFIABLE_TYPES, + EXTERNAL_NOTIFIABLE_TYPES, + PERSONAL_NOTIFIABLE_TYPES, attributes: { // ╔═╗╦═╗╦╔╦╗╦╔╦╗╦╦ ╦╔═╗╔═╗