From 6385e53425c4707db48deb1b65271663fa02e6fe Mon Sep 17 00:00:00 2001 From: Emmy D'Anello <emmy.danello@animath.fr> Date: Sun, 28 Apr 2024 16:36:54 +0200 Subject: [PATCH] Users can only edit & delete their own messages (except for admin users) Signed-off-by: Emmy D'Anello <emmy.danello@animath.fr> --- chat/static/chat.js | 30 ++++++++++++++++++------------ chat/templates/chat/content.html | 7 ++++++- 2 files changed, 24 insertions(+), 13 deletions(-) diff --git a/chat/static/chat.js b/chat/static/chat.js index dcef533..30ce636 100644 --- a/chat/static/chat.js +++ b/chat/static/chat.js @@ -235,9 +235,18 @@ function redrawMessages() { fetchMoreButton.classList.remove('d-none') } +function removeAllPopovers() { + for (let popover of document.querySelectorAll('*[aria-describedby*="popover"]')) { + let instance = bootstrap.Popover.getInstance(popover) + if (instance) + instance.dispose() + } +} + function registerSendPrivateMessageContextMenu(message, element) { element.addEventListener('contextmenu', (menu_event) => { menu_event.preventDefault() + removeAllPopovers() const popover = bootstrap.Popover.getOrCreateInstance(element, { 'title': message['author'], 'content': `<a id="send-private-message-link-${message['id']}" class="nav-link" href="#" tabindex="0">Envoyer un message privé</a>`, @@ -247,7 +256,7 @@ function registerSendPrivateMessageContextMenu(message, element) { document.getElementById('send-private-message-link-' + message['id']).addEventListener('click', event => { event.preventDefault() - popover.hide() + popover.dispose() socket.send(JSON.stringify({ 'type': 'start_private_chat', 'user_id': message['author_id'], @@ -259,10 +268,13 @@ function registerSendPrivateMessageContextMenu(message, element) { function registerMessageContextMenu(message, element) { element.addEventListener('contextmenu', (menu_event) => { menu_event.preventDefault() + removeAllPopovers() let content = `<a id="send-private-message-link-msg-${message['id']}" class="nav-link" href="#" tabindex="0">Envoyer un message privé</a>` - content += `<hr class="my-1">` - content += `<a class="nav-link" href="#" tabindex="0">Modifier</a>` - content += `<a class="nav-link" href="#" tabindex="0">Supprimer</a>` + if (message['author_id'] === USER_ID || IS_ADMIN) { + content += `<hr class="my-1">` + content += `<a class="nav-link" href="#" tabindex="0">Modifier</a>` + content += `<a class="nav-link" href="#" tabindex="0">Supprimer</a>` + } const popover = bootstrap.Popover.getOrCreateInstance(element, { 'content': content, 'html': true, @@ -272,7 +284,7 @@ function registerMessageContextMenu(message, element) { document.getElementById('send-private-message-link-msg-' + message['id']).addEventListener('click', event => { event.preventDefault() - popover.hide() + popover.dispose() socket.send(JSON.stringify({ 'type': 'start_private_chat', 'user_id': message['author_id'], @@ -296,13 +308,7 @@ function toggleFullscreen() { } document.addEventListener('DOMContentLoaded', () => { - document.addEventListener('click', () => { - for (let popover of document.querySelectorAll('span[aria-describedby*="popover"]')) { - let instance = bootstrap.Popover.getInstance(popover) - if (instance) - instance.hide() - } - }) + document.addEventListener('click', removeAllPopovers) /** * Process the received data from the server. diff --git a/chat/templates/chat/content.html b/chat/templates/chat/content.html index b58e35a..2e1d8e1 100644 --- a/chat/templates/chat/content.html +++ b/chat/templates/chat/content.html @@ -87,4 +87,9 @@ </div> </form> </div> -</div> \ No newline at end of file +</div> + +<script> + const USER_ID = {{ request.user.id }} + const IS_ADMIN = {{ request.user.registration.is_admin|yesno:"true,false" }} +</script> \ No newline at end of file