FEATURE: Allow user to leave a PM.

This commit is contained in:
Guo Xiang Tan
2017-10-10 16:26:56 +08:00
parent 79de10b212
commit 25c25ae423
11 changed files with 132 additions and 18 deletions

View File

@@ -231,7 +231,11 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, {
},
removeAllowedUser(user) {
return this.get('model.details').removeAllowedUser(user);
return this.get('model.details').removeAllowedUser(user).then(() => {
if (this.currentUser.id === user.id) {
this.transitionToRoute("userPrivateMessages", user);
}
});
},
removeAllowedGroup(group) {

View File

@@ -127,6 +127,7 @@ export default function transformPost(currentUser, site, post, prevPost, nextPos
postAtts.allowedGroups = details.allowed_groups;
postAtts.allowedUsers = details.allowed_users;
postAtts.canRemoveAllowedUsers = details.can_remove_allowed_users;
postAtts.canRemoveSelfId = details.can_remove_self_id;
postAtts.canInvite = details.can_invite_to;
}

View File

@@ -48,6 +48,7 @@ const icons = {
'split_topic': 'sign-out',
'invited_user': 'plus-circle',
'invited_group': 'plus-circle',
'user_left': 'minus-circle',
'removed_user': 'minus-circle',
'removed_group': 'minus-circle',
'public_topic': 'comment',

View File

@@ -36,8 +36,12 @@ createWidget('pm-remove-link', {
template: hbs`{{d-icon "times"}}`,
click() {
bootbox.confirm(I18n.t("private_message_info.remove_allowed_user", {name: this.attrs.username}), (confirmed) => {
if (confirmed) { this.sendWidgetAction('removeAllowedUser', this.attrs); }
const messageKey = this.attrs.isCurrentUser ? 'leave_message' : 'remove_allowed_user';
bootbox.confirm(I18n.t(`private_message_info.${messageKey}`, { name: this.attrs.user.username }), confirmed => {
if (confirmed) {
this.sendWidgetAction('removeAllowedUser', this.attrs.user);
}
});
}
});
@@ -49,11 +53,12 @@ createWidget('pm-map-user', {
const user = attrs.user;
const avatar = avatarFor('small', { template: user.avatar_template, username: user.username });
const link = h('a', { attributes: { href: user.get('path') } }, [ avatar, ' ', user.username ]);
const result = [link];
if (attrs.canRemoveAllowedUsers) {
const isCurrentUser = attrs.canRemoveSelfId === user.get('id');
if (attrs.canRemoveAllowedUsers || isCurrentUser) {
result.push(' ');
result.push(this.attach('pm-remove-link', user));
result.push(this.attach('pm-remove-link', { user, isCurrentUser } ));
}
return result;
@@ -67,12 +72,23 @@ export default createWidget('private-message-map', {
const participants = [];
if (attrs.allowedGroups.length) {
participants.push(attrs.allowedGroups.map(ag => this.attach('pm-map-user-group', {group: ag, canRemoveAllowedUsers: attrs.canRemoveAllowedUsers})));
participants.push(attrs.allowedGroups.map(ag => {
this.attach('pm-map-user-group', {
group: ag,
canRemoveAllowedUsers: attrs.canRemoveAllowedUsers
});
}));
}
if (attrs.allowedUsers.length) {
const allowedUsersLength = attrs.allowedUsers.length;
if (allowedUsersLength) {
participants.push(attrs.allowedUsers.map(au => {
return this.attach('pm-map-user', { user: au, canRemoveAllowedUsers: attrs.canRemoveAllowedUsers });
return this.attach('pm-map-user', {
user: au,
canRemoveAllowedUsers: attrs.canRemoveAllowedUsers,
canRemoveSelfId: attrs.canRemoveSelfId
});
}));
}

View File

@@ -439,9 +439,10 @@ class TopicsController < ApplicationController
def remove_allowed_user
params.require(:username)
topic = Topic.find_by(id: params[:topic_id])
guardian.ensure_can_remove_allowed_users!(topic)
user = User.find_by(username: params[:username])
guardian.ensure_can_remove_allowed_users!(topic, user)
if topic.remove_allowed_user(current_user, params[:username])
if topic.remove_allowed_user(current_user, user)
render json: success_json
else
render json: failed_json, status: 422

View File

@@ -709,14 +709,21 @@ SQL
end
def remove_allowed_user(removed_by, username)
if user = User.find_by(username: username)
user = username.is_a?(User) ? username : User.find_by(username: username)
if user
topic_user = topic_allowed_users.find_by(user_id: user.id)
if topic_user
topic_user.destroy
# we can not remove ourselves cause then we will end up adding
# ourselves in add_small_action
removed_by = Discourse.system_user if user.id == removed_by&.id
add_small_action(removed_by, "removed_user", user.username)
if user.id == removed_by&.id
removed_by = Discourse.system_user
add_small_action(removed_by, "user_left", user.username)
else
add_small_action(removed_by, "removed_user", user.username)
end
return true
end
end

View File

@@ -114,6 +114,7 @@ class TopicViewSerializer < ApplicationSerializer
result[:can_delete] = true if scope.can_delete?(object.topic)
result[:can_recover] = true if scope.can_recover_topic?(object.topic)
result[:can_remove_allowed_users] = true if scope.can_remove_allowed_users?(object.topic)
result[:can_remove_self_id] = scope.user.id if scope.can_remove_allowed_users?(object.topic, scope.user)
result[:can_invite_to] = true if scope.can_invite_to?(object.topic)
result[:can_invite_via_email] = true if scope.can_invite_via_email?(object.topic)
result[:can_create_post] = true if scope.can_create?(Post, object.topic)