Add deletion control for attached videos
This commit is contained in:
+23
-13
@@ -6844,19 +6844,19 @@
|
||||
<div class="mes_reasoning"></div>
|
||||
</details>
|
||||
<div class="mes_text"></div>
|
||||
<div class="mes_img_container">
|
||||
<div class="mes_img_controls">
|
||||
<div title="Expand and zoom" class="right_menu_button fa-lg fa-solid fa-magnifying-glass mes_img_enlarge" data-i18n="[title]Expand and zoom"></div>
|
||||
<div title="Caption" class="right_menu_button fa-lg fa-solid fa-envelope-open-text mes_img_caption" data-i18n="[title]Caption"></div>
|
||||
<div title="Delete" class="right_menu_button fa-lg fa-solid fa-trash-can mes_img_delete" data-i18n="[title]Delete"></div>
|
||||
</div>
|
||||
<div class="mes_img_swipes">
|
||||
<div title="Swipe left" class="right_menu_button fa-lg fa-solid fa-chevron-left mes_img_swipe_left" data-i18n="[title]Swipe left"></div>
|
||||
<div class="mes_img_swipe_counter">1/1</div>
|
||||
<div title="Swipe right" class="right_menu_button fa-lg fa-solid fa-chevron-right mes_img_swipe_right" data-i18n="[title]Swipe right"></div>
|
||||
</div>
|
||||
<img class="mes_img" src="" />
|
||||
</div>
|
||||
<div class="mes_img_container">
|
||||
<div class="mes_img_controls">
|
||||
<div title="Expand and zoom" class="right_menu_button fa-lg fa-solid fa-magnifying-glass mes_img_enlarge" data-i18n="[title]Expand and zoom"></div>
|
||||
<div title="Caption" class="right_menu_button fa-lg fa-solid fa-envelope-open-text mes_img_caption" data-i18n="[title]Caption"></div>
|
||||
<div title="Delete" class="right_menu_button fa-lg fa-solid fa-trash-can mes_img_delete" data-i18n="[title]Delete"></div>
|
||||
</div>
|
||||
<div class="mes_img_swipes">
|
||||
<div title="Swipe left" class="right_menu_button fa-lg fa-solid fa-chevron-left mes_img_swipe_left" data-i18n="[title]Swipe left"></div>
|
||||
<div class="mes_img_swipe_counter">1/1</div>
|
||||
<div title="Swipe right" class="right_menu_button fa-lg fa-solid fa-chevron-right mes_img_swipe_right" data-i18n="[title]Swipe right"></div>
|
||||
</div>
|
||||
<img class="mes_img" src="" />
|
||||
</div>
|
||||
<div class="mes_bias"></div>
|
||||
</div>
|
||||
<div class="flex-container swipeRightBlock flexFlowColumn flexNoGap">
|
||||
@@ -7066,6 +7066,16 @@
|
||||
<div class="right_menu_button mes_file_delete fa-solid fa-trash-can" title="Remove the file" data-i18n="[title]Remove the file"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="message_video_template" class="template_element">
|
||||
<div class="mes_video_container">
|
||||
<div class="mes_video_controls">
|
||||
<div><!-- Placeholder --></div>
|
||||
<div title="Delete" class="right_menu_button fa-lg fa-solid fa-trash-can mes_video_delete" data-i18n="[title]Delete"></div>
|
||||
</div>
|
||||
<video class="mes_video" controls preload="metadata"></video>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="movingDivs">
|
||||
<div id="floatingPrompt" class="drawer-content flexGap5">
|
||||
|
||||
+5
-10
@@ -2505,16 +2505,11 @@ export function appendMediaToMessage(mes, messageElement, adjustScroll = true) {
|
||||
|
||||
// Add video to message
|
||||
if (mes.extra?.video) {
|
||||
const container = messageElement.find('.mes_block');
|
||||
const container = $('#message_video_template .mes_video_container').clone();
|
||||
messageElement.find('.mes_video_container').remove();
|
||||
messageElement.find('.mes_block').append(container);
|
||||
const chatHeight = $('#chat').prop('scrollHeight');
|
||||
|
||||
// Create video element if it doesn't exist
|
||||
let video = messageElement.find('.mes_video');
|
||||
if (video.length === 0) {
|
||||
video = $('<video class="mes_video" controls preload="metadata"></video>');
|
||||
container.append(video);
|
||||
}
|
||||
|
||||
const video = container.find('.mes_video');
|
||||
video.off('loadedmetadata').on('loadedmetadata', function () {
|
||||
if (!adjustScroll) {
|
||||
return;
|
||||
@@ -2527,7 +2522,7 @@ export function appendMediaToMessage(mes, messageElement, adjustScroll = true) {
|
||||
|
||||
video.attr('src', mes.extra?.video);
|
||||
} else {
|
||||
messageElement.find('.mes_video').remove();
|
||||
messageElement.find('.mes_video_container').remove();
|
||||
}
|
||||
|
||||
// Add file to message
|
||||
|
||||
@@ -893,6 +893,27 @@ async function deleteMessageImage() {
|
||||
await saveChatConditional();
|
||||
}
|
||||
|
||||
async function deleteMessageVideo() {
|
||||
const confirm = await Popup.show.confirm(t`Delete video from message?`, t`This action can't be undone.`);
|
||||
if (!confirm) {
|
||||
return;
|
||||
}
|
||||
|
||||
const mesBlock = $(this).closest('.mes');
|
||||
const mesId = mesBlock.attr('mesid');
|
||||
const message = chat[mesId];
|
||||
|
||||
if (!message?.extra?.video) {
|
||||
console.warn('Message has no video or it is empty');
|
||||
return;
|
||||
}
|
||||
|
||||
delete message.extra.video;
|
||||
mesBlock.find('.mes_video_container').remove();
|
||||
|
||||
await saveChatConditional();
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes file from the server.
|
||||
* @param {string} url Path to the file on the server
|
||||
@@ -1856,6 +1877,7 @@ export function initChatUtilities() {
|
||||
$(document).on('click', '.mes_img', expandMessageImage);
|
||||
$(document).on('click', '.mes_img_enlarge', expandAndZoomMessageImage);
|
||||
$(document).on('click', '.mes_img_delete', deleteMessageImage);
|
||||
$(document).on('click', '.mes_video_delete', deleteMessageVideo);
|
||||
|
||||
$('#file_form_input').on('change', async () => {
|
||||
const fileInput = document.getElementById('file_form_input');
|
||||
|
||||
+24
-10
@@ -5033,8 +5033,9 @@ a:hover {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* Message images */
|
||||
.mes .mes_img_container {
|
||||
/* Message images/video */
|
||||
.mes .mes_img_container,
|
||||
.mes .mes_video_container {
|
||||
max-width: 100%;
|
||||
/*to fit inside single window height of mobile landscape*/
|
||||
display: none;
|
||||
@@ -5044,8 +5045,12 @@ a:hover {
|
||||
padding: 0.5rem;
|
||||
}
|
||||
|
||||
.mes .mes_video_container:has(.mes_video[src]) {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.mes_img {
|
||||
border-radius: 10px;
|
||||
border-radius: 5px;
|
||||
max-width: 100%;
|
||||
max-height: 40vh;
|
||||
image-rendering: -webkit-optimize-contrast;
|
||||
@@ -5059,7 +5064,8 @@ a:hover {
|
||||
}
|
||||
|
||||
.mes_img_swipes,
|
||||
.mes_img_controls {
|
||||
.mes_img_controls,
|
||||
.mes_video_controls {
|
||||
position: absolute;
|
||||
top: 0.1em;
|
||||
left: 0;
|
||||
@@ -5070,6 +5076,8 @@ a:hover {
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 1em;
|
||||
z-index: 1;
|
||||
transition: opacity var(--animation-duration) ease-in-out;
|
||||
}
|
||||
|
||||
.mes_img_swipes {
|
||||
@@ -5078,7 +5086,8 @@ a:hover {
|
||||
}
|
||||
|
||||
.mes_img_swipes .right_menu_button,
|
||||
.mes_img_controls .right_menu_button {
|
||||
.mes_img_controls .right_menu_button,
|
||||
.mes_video_controls .right_menu_button {
|
||||
filter: brightness(90%);
|
||||
text-shadow: 1px 1px var(--SmartThemeShadowColor) !important;
|
||||
padding: 1px;
|
||||
@@ -5087,23 +5096,29 @@ a:hover {
|
||||
}
|
||||
|
||||
.mes_img_swipes .right_menu_button::before,
|
||||
.mes_img_controls .right_menu_button::before {
|
||||
.mes_img_controls .right_menu_button::before,
|
||||
.mes_video_controls .right_menu_button::before {
|
||||
/* Fix weird alignment with this font-awesome icons on focus */
|
||||
position: relative;
|
||||
top: 0.6125em;
|
||||
}
|
||||
|
||||
.mes_img_swipes .right_menu_button:hover,
|
||||
.mes_img_controls .right_menu_button:hover {
|
||||
.mes_img_controls .right_menu_button:hover,
|
||||
.mes_video_controls .right_menu_button:hover {
|
||||
filter: brightness(150%);
|
||||
}
|
||||
|
||||
/* It's better to show controls only when the video is not playing */
|
||||
/* but :playing pseudo-class is not supported in all browsers */
|
||||
/* .mes_video_container:focus-within .mes_video_controls:not(:has(.mes_video:playing)), */
|
||||
.mes_img_container:has(.mes_img.error) .mes_img_swipes,
|
||||
.mes_img_container:has(.mes_img.error) .mes_img_controls,
|
||||
.mes_img_container:hover .mes_img_swipes,
|
||||
.mes_img_container:focus-within .mes_img_swipes,
|
||||
.mes_img_container:hover .mes_img_controls,
|
||||
.mes_img_container:focus-within .mes_img_controls {
|
||||
.mes_img_container:focus-within .mes_img_controls,
|
||||
.mes_video_container:hover .mes_video_controls {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
@@ -5203,9 +5218,8 @@ body:not(.sd) .mes_img_swipes {
|
||||
.mes_video {
|
||||
max-width: 100%;
|
||||
max-height: 400px;
|
||||
border-radius: 8px;
|
||||
border-radius: 5px;
|
||||
background: #000;
|
||||
margin: 0.5rem;
|
||||
}
|
||||
|
||||
/* Ensure video controls are visible */
|
||||
|
||||
Reference in New Issue
Block a user