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}}2>',
userJoinedThisCard: `<0>{{user}}0><1> joined this card1>`,
userLeftNewCommentToCard: '{{user}} left a new comment «{{comment}}» to <2>{{card}}2>',
+ userLeftThisCard: '<0>{{user}}0><1> left this card1>',
userMovedCardFromListToList: '{{user}} moved <2>{{card}}2> from {{fromList}} to {{toList}}',
userMovedThisCardFromListToList:
'<0>{{user}}0><1> moved this card from {{fromList}} to {{toList}}1>',
+ userRemovedUserFromThisCard:
+ '<0>{{actorUser}}0><1> removed {{removedUser}} from this card1>',
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}}2>',
userJoinedThisCard: `<0>{{user}}0><1> joined this card1>`,
userLeftNewCommentToCard: '{{user}} left a new comment «{{comment}}» to <2>{{card}}2>',
+ userLeftThisCard: '<0>{{user}}0><1> left this card1>',
userMovedCardFromListToList: '{{user}} moved <2>{{card}}2> from {{fromList}} to {{toList}}',
userMovedThisCardFromListToList:
'<0>{{user}}0><1> moved this card from {{fromList}} to {{toList}}1>',
+ userRemovedUserFromThisCard:
+ '<0>{{actorUser}}0><1> removed {{removedUser}} from this card1>',
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: {
// ╔═╗╦═╗╦╔╦╗╦╔╦╗╦╦ ╦╔═╗╔═╗