mirror of
				https://github.com/SillyTavern/SillyTavern.git
				synced 2025-06-05 21:59:27 +02:00 
			
		
		
		
	#363 Non-blocking bookmark creation
This commit is contained in:
		| @@ -2452,7 +2452,7 @@ | |||||||
|     </div> |     </div> | ||||||
|  |  | ||||||
|     <div id="message_template" class="template_element"> |     <div id="message_template" class="template_element"> | ||||||
|         <div class="mes" mesid="${count_view_mes}" ch_name="${characterName}" is_user="${mes.is_user}" is_system="${mes.is_system}"> |         <div class="mes" mesid="" ch_name="" is_user="" is_system="" bookmark_link=""> | ||||||
|             <div class="for_checkbox"></div><input type="checkbox" class="del_checkbox"> |             <div class="for_checkbox"></div><input type="checkbox" class="del_checkbox"> | ||||||
|             <div class="mesAvatarWrapper"> |             <div class="mesAvatarWrapper"> | ||||||
|                 <div class="avatar"> |                 <div class="avatar"> | ||||||
| @@ -2467,6 +2467,7 @@ | |||||||
|                     <span class="name_text">${characterName}</span> |                     <span class="name_text">${characterName}</span> | ||||||
|  |  | ||||||
|                     <div class="mes_buttons"> |                     <div class="mes_buttons"> | ||||||
|  |                         <div title="Open bookmark chat" class="mes_bookmark fa-solid fa-bookmark"></div> | ||||||
|                         <div title="Generate Image" class="sd_message_gen fa-solid fa-paintbrush"></div> |                         <div title="Generate Image" class="sd_message_gen fa-solid fa-paintbrush"></div> | ||||||
|                         <div title="Narrate" class="mes_narrate fa-solid fa-bullhorn"></div> |                         <div title="Narrate" class="mes_narrate fa-solid fa-bullhorn"></div> | ||||||
|                         <div title="Prompt" class="mes_prompt fa-solid fa-square-poll-horizontal "></div> |                         <div title="Prompt" class="mes_prompt fa-solid fa-square-poll-horizontal "></div> | ||||||
|   | |||||||
| @@ -1069,9 +1069,15 @@ function messageFormatting(mes, ch_name, isSystem, isUser) { | |||||||
|     return mes; |     return mes; | ||||||
| } | } | ||||||
|  |  | ||||||
| function getMessageFromTemplate({ mesId, characterName, isUser, avatarImg, bias, isSystem, title, timerValue, timerTitle } = {}) { | function getMessageFromTemplate({ mesId, characterName, isUser, avatarImg, bias, isSystem, title, timerValue, timerTitle, bookmarkLink } = {}) { | ||||||
|     const mes = $('#message_template .mes').clone(); |     const mes = $('#message_template .mes').clone(); | ||||||
|     mes.attr({ 'mesid': mesId, 'ch_name': characterName, 'is_user': isUser, 'is_system': !!isSystem }); |     mes.attr({ | ||||||
|  |         'mesid': mesId, | ||||||
|  |         'ch_name': characterName, | ||||||
|  |         'is_user': isUser, | ||||||
|  |         'is_system': !!isSystem, | ||||||
|  |         'bookmark_link': bookmarkLink, | ||||||
|  |     }); | ||||||
|     mes.find('.avatar img').attr('src', avatarImg); |     mes.find('.avatar img').attr('src', avatarImg); | ||||||
|     mes.find('.ch_name .name_text').text(characterName); |     mes.find('.ch_name .name_text').text(characterName); | ||||||
|     mes.find('.mes_bias').html(bias); |     mes.find('.mes_bias').html(bias); | ||||||
| @@ -1105,15 +1111,7 @@ function addCopyToCodeBlocks(messageElement) { | |||||||
|             codeBlocks.get(i).appendChild(copyButton); |             codeBlocks.get(i).appendChild(copyButton); | ||||||
|             copyButton.addEventListener('pointerup', function (event) { |             copyButton.addEventListener('pointerup', function (event) { | ||||||
|                 navigator.clipboard.writeText(codeBlocks.get(i).innerText); |                 navigator.clipboard.writeText(codeBlocks.get(i).innerText); | ||||||
|                 const copiedMsg = document.createElement("div"); |                 toastr.info('Copied!', '', { timeOut: 2000 }); | ||||||
|                 copiedMsg.classList.add('code-copied'); |  | ||||||
|                 copiedMsg.innerText = "Copied!"; |  | ||||||
|                 copiedMsg.style.top = `${event.clientY - 55}px`; |  | ||||||
|                 copiedMsg.style.left = `${event.clientX - 55}px`; |  | ||||||
|                 document.body.append(copiedMsg); |  | ||||||
|                 setTimeout(() => { |  | ||||||
|                     document.body.removeChild(copiedMsg); |  | ||||||
|                 }, 1000); |  | ||||||
|             }); |             }); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @@ -1165,6 +1163,7 @@ function addOneMessage(mes, { type = "normal", insertAfter = null, scroll = true | |||||||
|         mes.is_user, |         mes.is_user, | ||||||
|     ); |     ); | ||||||
|     const bias = messageFormatting(mes.extra?.bias ?? ""); |     const bias = messageFormatting(mes.extra?.bias ?? ""); | ||||||
|  |     const bookmarkLink = mes?.extra?.bookmark_link ?? ''; | ||||||
|  |  | ||||||
|     let params = { |     let params = { | ||||||
|         mesId: count_view_mes, |         mesId: count_view_mes, | ||||||
| @@ -1174,6 +1173,7 @@ function addOneMessage(mes, { type = "normal", insertAfter = null, scroll = true | |||||||
|         bias: bias, |         bias: bias, | ||||||
|         isSystem: isSystem, |         isSystem: isSystem, | ||||||
|         title: title, |         title: title, | ||||||
|  |         bookmarkLink: bookmarkLink, | ||||||
|         ...formatGenerationTimer(mes.gen_started, mes.gen_finished), |         ...formatGenerationTimer(mes.gen_started, mes.gen_finished), | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
| @@ -6026,15 +6026,7 @@ $(document).ready(function () { | |||||||
|                     var edit_mes_id = $(this).closest(".mes").attr("mesid"); |                     var edit_mes_id = $(this).closest(".mes").attr("mesid"); | ||||||
|                     var text = chat[edit_mes_id]["mes"]; |                     var text = chat[edit_mes_id]["mes"]; | ||||||
|                     navigator.clipboard.writeText(text); |                     navigator.clipboard.writeText(text); | ||||||
|                     const copiedMsg = document.createElement("div"); |                     toastr.info('Copied!', '', { timeOut: 2000 }); | ||||||
|                     copiedMsg.classList.add('code-copied'); |  | ||||||
|                     copiedMsg.innerText = "Copied!"; |  | ||||||
|                     copiedMsg.style.top = `${event.clientY - 55}px`; |  | ||||||
|                     copiedMsg.style.left = `${event.clientX - 55}px`; |  | ||||||
|                     document.body.append(copiedMsg); |  | ||||||
|                     setTimeout(() => { |  | ||||||
|                         document.body.removeChild(copiedMsg); |  | ||||||
|                     }, 1000); |  | ||||||
|                 } catch (err) { |                 } catch (err) { | ||||||
|                     console.error('Failed to copy: ', err); |                     console.error('Failed to copy: ', err); | ||||||
|                 } |                 } | ||||||
| @@ -6220,8 +6212,9 @@ $(document).ready(function () { | |||||||
|         showSwipeButtons(); |         showSwipeButtons(); | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     $(document).on("click", ".mes_edit_copy", function () { |     $(document).on("click", ".mes_edit_copy", async function () { | ||||||
|         if (!confirm('Create a copy of this message?')) { |         const confirmation = await callPopup('Create a copy of this message?', 'confirm'); | ||||||
|  |         if (!confirmation) { | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -6241,8 +6234,9 @@ $(document).ready(function () { | |||||||
|     }); |     }); | ||||||
|  |  | ||||||
|  |  | ||||||
|     $(document).on("click", ".mes_edit_delete", function () { |     $(document).on("click", ".mes_edit_delete", async function () { | ||||||
|         if (!confirm("Are you sure you want to delete this message?")) { |         const confirmation = await callPopup("Are you sure you want to delete this message?", 'confirm'); | ||||||
|  |         if (!confirmation) { | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -6439,8 +6433,14 @@ $(document).ready(function () { | |||||||
|         select_rm_characters(); |         select_rm_characters(); | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     $(document).on("click", ".select_chat_block, .bookmark_link", async function () { |     $(document).on("click", ".select_chat_block, .bookmark_link, .mes_bookmark", async function () { | ||||||
|         let file_name = $(this).attr("file_name").replace(".jsonl", ""); |         let file_name = $(this).hasClass('mes_bookmark') | ||||||
|  |             ? $(this).closest('.mes').attr('bookmark_link') | ||||||
|  |             : $(this).attr("file_name").replace(".jsonl", ""); | ||||||
|  |  | ||||||
|  |         if (!file_name) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |  | ||||||
|         if (selected_group) { |         if (selected_group) { | ||||||
|             await openGroupChat(selected_group, file_name); |             await openGroupChat(selected_group, file_name); | ||||||
| @@ -6605,10 +6605,6 @@ $(document).ready(function () { | |||||||
|         }); |         }); | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     $('#chat').on('scroll', () => { |  | ||||||
|         $('.code-copied').css({ 'display': 'none' }); |  | ||||||
|     }); |  | ||||||
|  |  | ||||||
|     $(document).on('click', '.mes_img_enlarge', enlargeMessageImage); |     $(document).on('click', '.mes_img_enlarge', enlargeMessageImage); | ||||||
|     $(document).on('click', '.mes_img_delete', deleteMessageImage); |     $(document).on('click', '.mes_img_delete', deleteMessageImage); | ||||||
|  |  | ||||||
|   | |||||||
| @@ -124,6 +124,26 @@ function showBookmarksButtons() { | |||||||
| } | } | ||||||
|  |  | ||||||
| async function createNewBookmark() { | async function createNewBookmark() { | ||||||
|  |     if (!chat.length) { | ||||||
|  |         toastr.warning('The chat is empty.', 'Bookmark creation failed'); | ||||||
|  |         return; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     const mesId = chat.length - 1; | ||||||
|  |     const lastMes = chat[mesId]; | ||||||
|  |  | ||||||
|  |     if (typeof lastMes.extra !== 'object') { | ||||||
|  |         lastMes.extra = {}; | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (lastMes.extra.bookmark_link) { | ||||||
|  |         const confirm = await callPopup('Bookmark checkpoint for the last message already exists. Would you like to replace it?', 'confirm'); | ||||||
|  |  | ||||||
|  |         if (!confirm) { | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|     let name = await getBookmarkName(); |     let name = await getBookmarkName(); | ||||||
|  |  | ||||||
|     if (!name) { |     if (!name) { | ||||||
| @@ -139,9 +159,11 @@ async function createNewBookmark() { | |||||||
|         await saveChat(name, newMetadata); |         await saveChat(name, newMetadata); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     let mainMessage = stringFormat(system_messages[system_message_types.BOOKMARK_CREATED].mes, name, name); |     lastMes.extra['bookmark_link'] = name; | ||||||
|     sendSystemMessage(system_message_types.BOOKMARK_CREATED, mainMessage); |     $(`.mes[mesid="${mesId}"]`).attr('bookmark_link', name); | ||||||
|  |  | ||||||
|     await saveChatConditional(); |     await saveChatConditional(); | ||||||
|  |     toastr.success('Click the bookmark icon in the last message to open the checkpoint chat.', 'Bookmark created', { timeOut: 10000 }); | ||||||
| } | } | ||||||
|  |  | ||||||
| async function backToMainChat() { | async function backToMainChat() { | ||||||
|   | |||||||
| @@ -11,15 +11,7 @@ function openContextTemplateEditor() { | |||||||
| function copyTemplateParameter(event) { | function copyTemplateParameter(event) { | ||||||
|     const text = $(event.target).text(); |     const text = $(event.target).text(); | ||||||
|     navigator.clipboard.writeText(text); |     navigator.clipboard.writeText(text); | ||||||
|     const copiedMsg = document.createElement("div"); |     toastr.info('Copied!', '', { timeOut: 2000 }); | ||||||
|     copiedMsg.classList.add('code-copied'); |  | ||||||
|     copiedMsg.innerText = "Copied!"; |  | ||||||
|     copiedMsg.style.top = `${event.clientY - 55}px`; |  | ||||||
|     copiedMsg.style.left = `${event.clientX - 55}px`; |  | ||||||
|     document.body.append(copiedMsg); |  | ||||||
|     setTimeout(() => { |  | ||||||
|         document.body.removeChild(copiedMsg); |  | ||||||
|     }, 1000); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| jQuery(() => { | jQuery(() => { | ||||||
|   | |||||||
| @@ -2297,25 +2297,25 @@ input[type="range"]::-webkit-slider-thumb { | |||||||
|     margin-right: 30px; |     margin-right: 30px; | ||||||
| } | } | ||||||
|  |  | ||||||
| .mes_prompt, | .mes_buttons>div { | ||||||
| .mes_narrate, |  | ||||||
| .sd_message_gen, |  | ||||||
| .mes_copy, |  | ||||||
| .mes_edit { |  | ||||||
|     cursor: pointer; |     cursor: pointer; | ||||||
|     transition: 0.3s ease-in-out; |     transition: 0.3s ease-in-out; | ||||||
|     filter: drop-shadow(0px 0px 2px black); |     filter: drop-shadow(0px 0px 2px black); | ||||||
|     opacity: 0.2; |     opacity: 0.2; | ||||||
| } | } | ||||||
|  |  | ||||||
| .mes_edit:hover, | .mes_buttons>div:hover { | ||||||
| .mes_copy:hover, |  | ||||||
| .sd_message_gen:hover, |  | ||||||
| .mes_narrate:hover, |  | ||||||
| .mes_stop:hover { |  | ||||||
|     opacity: 1; |     opacity: 1; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | .mes_bookmark { | ||||||
|  |     display: none; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .mes:not([bookmark_link='']) .mes_bookmark { | ||||||
|  |     display: inline-block; | ||||||
|  | } | ||||||
|  |  | ||||||
| .mes_edit_buttons { | .mes_edit_buttons { | ||||||
|     display: none; |     display: none; | ||||||
|     flex-direction: row; |     flex-direction: row; | ||||||
| @@ -3611,17 +3611,6 @@ label[for="extensions_autoconnect"] { | |||||||
|     opacity: 0.8; |     opacity: 0.8; | ||||||
| } | } | ||||||
|  |  | ||||||
| .code-copied { |  | ||||||
|     position: absolute; |  | ||||||
|     z-index: 10000; |  | ||||||
|     font-size: var(--mainFontSize); |  | ||||||
|     color: var(--SmartThemeBodyColor); |  | ||||||
|     background-color: var(--SmartThemeFastUIBGColor); |  | ||||||
|     border-radius: 5px; |  | ||||||
|     padding: 6px; |  | ||||||
|     border: 1px solid var(--grey30a); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| .inline-drawer-icon { | .inline-drawer-icon { | ||||||
|     display: block; |     display: block; | ||||||
|     cursor: pointer; |     cursor: pointer; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user