From f0da2f64ec174324fa89df2aee9252eca0680736 Mon Sep 17 00:00:00 2001 From: Erik Demaine Date: Sun, 6 Feb 2022 17:47:15 -0500 Subject: [PATCH] Move/kick all users in current room (#122) --- CHANGELOG.md | 3 +++ client/ConfirmButton.coffee | 7 ++++--- client/RoomList.coffee | 6 ++++-- client/RoomUsers.coffee | 29 +++++++++++++++++++++++------ lib/presence.coffee | 10 ++++++---- 5 files changed, 40 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 291d2d6..1638517 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,9 @@ instead of version numbers. * Admins can kick a user from the current room (e.g. to remove idle users). Users can still rejoin the room if they want, unless the room is locked. [[#122](https://github.com/edemaine/comingle/issues/122)] +* Admins can bulk move/kick all users from the current room + (including themselves), e.g., to move the discussion to the correct room. + [[#122](https://github.com/edemaine/comingle/issues/122)] ## 2022-02-05 diff --git a/client/ConfirmButton.coffee b/client/ConfirmButton.coffee index f6869ef..e4ae994 100644 --- a/client/ConfirmButton.coffee +++ b/client/ConfirmButton.coffee @@ -80,11 +80,12 @@ export LockButton = React.memo ({locked, ...props}) -> {...props}/> LockButton.displayName = 'LockButton' -export KickButton = React.memo (props) -> +export KickButton = React.memo ({plural, ...props}) -> + plural ?= '' } - help="User can still rejoin room, unless the room is locked. Useful for idle users." + help="User#{plural} can still rejoin room, unless the room is locked. Useful for idle users." {...props}/> KickButton.displayName = 'KickButton' diff --git a/client/RoomList.coffee b/client/RoomList.coffee index 67f1328..1f487af 100644 --- a/client/RoomList.coffee +++ b/client/RoomList.coffee @@ -391,8 +391,10 @@ export RoomInfo = React.memo ({room, search, presence, selected, selectRoom, lea locked = room.locked and not admin [collected, drop] = useDrop -> accept: 'move-user' - drop: (user) -> - Meteor.call 'presenceMove', user.id, room._id, getMeetingSecret meetingId + drop: (item) -> + console.log item + Meteor.call 'presenceMove', item.user, room._id, + getMeetingSecret meetingId collect: (monitor) -> isHover: Boolean monitor.isOver() and monitor.canDrop() hoverClass = if collected.isHover then ' list-group-item-warning' else '' diff --git a/client/RoomUsers.coffee b/client/RoomUsers.coffee index 72fd54d..405d5d4 100644 --- a/client/RoomUsers.coffee +++ b/client/RoomUsers.coffee @@ -45,7 +45,7 @@ export RoomUsers = React.memo ({className, room}) -> admin = useMeetingAdmin() [forceClose, setForceClose] = useState false onKick = (user) -> -> - Meteor.call 'presenceKick', user.id, room._id, getMeetingSecret room.meeting + Meteor.call 'presenceKick', user, room._id, getMeetingSecret room.meeting setForceClose not open}> @@ -57,9 +57,9 @@ export RoomUsers = React.memo ({className, room}) -> {if admin
+ user={user.id}/> + forceClose={forceClose} onClick={onKick user.id}/>
} @@ -78,19 +78,36 @@ export RoomUsers = React.memo ({className, room}) -> } + {if admin + users = (user.id for user in presence) + +
+ + +
+ + +   + all {users.length} user{if users.length == 1 then '' else 's'} + +
+ }
RoomUsers.displayName = 'RoomUsers' -export MoveButton = React.memo ({className, user}) -> +export MoveButton = React.memo ({className, user, plural}) -> + plural ?= '' [collected, drag, preview] = useDrag -> type: 'move-user' - item: user + item: {user} collect: (monitor) -> isDragging: Boolean monitor.isDragging() - Move User to Room + Move User{plural} to Room
Drag this icon to the desired room in the room list on the left.
diff --git a/lib/presence.coffee b/lib/presence.coffee index 31a5968..605b2e0 100644 --- a/lib/presence.coffee +++ b/lib/presence.coffee @@ -70,13 +70,15 @@ Meteor.methods Presence.remove id: presenceId presenceOp = (op) -> (presenceId, roomId, secret) -> - checkId presenceId + check presenceId, Match.OneOf [Match.Where validId], Match.Where validId return if @isSimulation room = checkRoom roomId checkMeetingSecret room.meeting, secret - PresenceStream.emit presenceId, - op: op - room: roomId + presenceId = [presenceId] unless Array.isArray presenceId + for id in presenceId + PresenceStream.emit id, + op: op + room: roomId Meteor.methods presenceKick: presenceOp 'kick'