fixed editing members
This commit is contained in:
Binary file not shown.
@@ -296,25 +296,57 @@ def edit_conversation(conversation_id):
|
|||||||
'member_ids': [member.id for member in conversation.members]
|
'member_ids': [member.id for member in conversation.members]
|
||||||
}
|
}
|
||||||
|
|
||||||
# Get members from the form data
|
# Update name and description from form data
|
||||||
member_ids = request.form.getlist('members')
|
conversation.name = form.name.data
|
||||||
|
conversation.description = form.description.data
|
||||||
|
|
||||||
|
# Get members from the form data and convert to integers
|
||||||
|
member_ids = [int(id) for id in request.form.getlist('members')]
|
||||||
|
|
||||||
# Update members
|
# Update members
|
||||||
current_member_ids = {str(user.id) for user in conversation.members}
|
current_member_ids = {user.id for user in conversation.members}
|
||||||
new_member_ids = set(member_ids)
|
new_member_ids = set(member_ids)
|
||||||
|
|
||||||
# Remove members that are no longer in the list
|
# Remove members that are no longer in the list
|
||||||
for member_id in current_member_ids - new_member_ids:
|
members_to_remove = current_member_ids - new_member_ids
|
||||||
if int(member_id) != conversation.created_by: # Don't remove the creator
|
for member_id in members_to_remove:
|
||||||
|
if member_id != conversation.created_by: # Don't remove the creator
|
||||||
user = User.query.get(member_id)
|
user = User.query.get(member_id)
|
||||||
if user:
|
if user:
|
||||||
conversation.members.remove(user)
|
conversation.members.remove(user)
|
||||||
|
# Create notification for removed user
|
||||||
|
create_notification(
|
||||||
|
notif_type='conversation_invite_removed',
|
||||||
|
user_id=user.id,
|
||||||
|
sender_id=current_user.id,
|
||||||
|
details={
|
||||||
|
'message': f'You have been removed from conversation "{conversation.name}"',
|
||||||
|
'conversation_id': conversation.id,
|
||||||
|
'conversation_name': conversation.name,
|
||||||
|
'removed_by': f"{current_user.username} {current_user.last_name}",
|
||||||
|
'timestamp': datetime.utcnow().isoformat()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
# Add new members
|
# Add new members
|
||||||
for member_id in new_member_ids - current_member_ids:
|
members_to_add = new_member_ids - current_member_ids
|
||||||
|
for member_id in members_to_add:
|
||||||
user = User.query.get(member_id)
|
user = User.query.get(member_id)
|
||||||
if user and user not in conversation.members:
|
if user and user not in conversation.members:
|
||||||
conversation.members.append(user)
|
conversation.members.append(user)
|
||||||
|
# Create notification for the invited user
|
||||||
|
create_notification(
|
||||||
|
notif_type='conversation_invite',
|
||||||
|
user_id=user.id,
|
||||||
|
sender_id=current_user.id,
|
||||||
|
details={
|
||||||
|
'message': f'You have been invited to join conversation "{conversation.name}"',
|
||||||
|
'conversation_id': conversation.id,
|
||||||
|
'conversation_name': conversation.name,
|
||||||
|
'invited_by': f"{current_user.username} {current_user.last_name}",
|
||||||
|
'timestamp': datetime.utcnow().isoformat()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
@@ -336,7 +368,7 @@ def edit_conversation(conversation_id):
|
|||||||
)
|
)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
|
|
||||||
flash('Conversation members updated successfully!', 'success')
|
flash('Conversation updated successfully!', 'success')
|
||||||
|
|
||||||
# Check if redirect parameter is provided
|
# Check if redirect parameter is provided
|
||||||
redirect_url = request.args.get('redirect')
|
redirect_url = request.args.get('redirect')
|
||||||
|
|||||||
@@ -28,6 +28,15 @@ $(document).ready(function() {
|
|||||||
var creatorId = document.querySelector('.member-row').dataset.userId;
|
var creatorId = document.querySelector('.member-row').dataset.userId;
|
||||||
addedMembers.add(creatorId);
|
addedMembers.add(creatorId);
|
||||||
|
|
||||||
|
// If in edit mode, add existing members to the set
|
||||||
|
if (document.querySelector('.member-row[data-user-id]')) {
|
||||||
|
document.querySelectorAll('.member-row[data-user-id]').forEach(function(row) {
|
||||||
|
var memberId = String(row.dataset.userId);
|
||||||
|
console.log('Adding existing member:', memberId);
|
||||||
|
addedMembers.add(memberId);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Shows an alert modal with the specified message.
|
* Shows an alert modal with the specified message.
|
||||||
* @function
|
* @function
|
||||||
@@ -45,7 +54,7 @@ $(document).ready(function() {
|
|||||||
* @event
|
* @event
|
||||||
*/
|
*/
|
||||||
$('#addMemberBtn').click(function() {
|
$('#addMemberBtn').click(function() {
|
||||||
var selectedUserId = $('#user_id').val();
|
var selectedUserId = String($('#user_id').val());
|
||||||
var selectedUserName = $('#user_id option:selected').text();
|
var selectedUserName = $('#user_id option:selected').text();
|
||||||
var selectedUserEmail = $('#user_id option:selected').data('email') || '';
|
var selectedUserEmail = $('#user_id option:selected').data('email') || '';
|
||||||
var selectedUserAvatar = $('#user_id option:selected').data('avatar') || "/static/default-avatar.png";
|
var selectedUserAvatar = $('#user_id option:selected').data('avatar') || "/static/default-avatar.png";
|
||||||
@@ -60,6 +69,7 @@ $(document).ready(function() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
console.log('Adding new member:', selectedUserId);
|
||||||
// Add to the set of added members
|
// Add to the set of added members
|
||||||
addedMembers.add(selectedUserId);
|
addedMembers.add(selectedUserId);
|
||||||
|
|
||||||
@@ -77,14 +87,6 @@ $(document).ready(function() {
|
|||||||
.append($('<button type="button" class="btn btn-remove-member ms-2">')
|
.append($('<button type="button" class="btn btn-remove-member ms-2">')
|
||||||
.append($('<i class="fas fa-user-minus me-1"></i>'))
|
.append($('<i class="fas fa-user-minus me-1"></i>'))
|
||||||
.append('Remove')
|
.append('Remove')
|
||||||
.click(function() {
|
|
||||||
$(this).closest('.list-group-item').remove();
|
|
||||||
addedMembers.delete(selectedUserId);
|
|
||||||
// Re-enable the option in the dropdown
|
|
||||||
$('#user_id option[value="' + selectedUserId + '"]').prop('disabled', false);
|
|
||||||
$('#user_id').trigger('change');
|
|
||||||
updateHiddenInputs();
|
|
||||||
})
|
|
||||||
);
|
);
|
||||||
|
|
||||||
// Add to the list
|
// Add to the list
|
||||||
@@ -103,6 +105,8 @@ $(document).ready(function() {
|
|||||||
// Remove any existing members inputs
|
// Remove any existing members inputs
|
||||||
$('#conversationForm input[name="members"]').remove();
|
$('#conversationForm input[name="members"]').remove();
|
||||||
|
|
||||||
|
console.log('Current members in Set:', Array.from(addedMembers));
|
||||||
|
|
||||||
// Add new hidden inputs for each member
|
// Add new hidden inputs for each member
|
||||||
addedMembers.forEach(function(memberId) {
|
addedMembers.forEach(function(memberId) {
|
||||||
var input = $('<input>')
|
var input = $('<input>')
|
||||||
@@ -115,4 +119,28 @@ $(document).ready(function() {
|
|||||||
|
|
||||||
// Initialize hidden inputs
|
// Initialize hidden inputs
|
||||||
updateHiddenInputs();
|
updateHiddenInputs();
|
||||||
|
|
||||||
|
// Add click handler for remove buttons (both existing and new)
|
||||||
|
$(document).on('click', '.btn-remove-member', function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
var memberRow = $(this).closest('.member-row');
|
||||||
|
var memberId = String(memberRow.data('user-id'));
|
||||||
|
|
||||||
|
console.log('Removing member:', memberId);
|
||||||
|
console.log('Current members before removal:', Array.from(addedMembers));
|
||||||
|
|
||||||
|
// Don't allow removing the creator
|
||||||
|
if (memberId === creatorId) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
memberRow.remove();
|
||||||
|
addedMembers.delete(memberId);
|
||||||
|
console.log('Current members after removal:', Array.from(addedMembers));
|
||||||
|
|
||||||
|
// Re-enable the option in the dropdown
|
||||||
|
$('#user_id option[value="' + memberId + '"]').prop('disabled', false);
|
||||||
|
$('#user_id').trigger('change');
|
||||||
|
updateHiddenInputs();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
@@ -135,6 +135,23 @@
|
|||||||
</div>
|
</div>
|
||||||
<span class="badge badge-creator ms-2"><i class="fas fa-user"></i> Creator</span>
|
<span class="badge badge-creator ms-2"><i class="fas fa-user"></i> Creator</span>
|
||||||
</div>
|
</div>
|
||||||
|
{% if edit_mode %}
|
||||||
|
<!-- Render existing members -->
|
||||||
|
{% for member in conversation.members %}
|
||||||
|
{% if member.id != current_user.id %}
|
||||||
|
<div class="list-group-item d-flex align-items-center member-row" data-user-id="{{ member.id }}">
|
||||||
|
<img class="member-avatar" src="{{ url_for('profile_pic', filename=member.profile_picture) if member.profile_picture else url_for('static', filename='default-avatar.png') }}">
|
||||||
|
<div class="flex-grow-1">
|
||||||
|
<div class="fw-bold">{{ member.username }} {{ member.last_name }}</div>
|
||||||
|
<div class="text-muted small">{{ member.email }}</div>
|
||||||
|
</div>
|
||||||
|
<button type="button" class="btn btn-remove-member ms-2">
|
||||||
|
<i class="fas fa-user-minus me-1"></i>Remove
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user