diff --git a/public/scripts/RossAscends-mods.js b/public/scripts/RossAscends-mods.js index 420f33236..03eb44855 100644 --- a/public/scripts/RossAscends-mods.js +++ b/public/scripts/RossAscends-mods.js @@ -2,21 +2,21 @@ esversion: 6 import { encode } from "../scripts/gpt-2-3-tokenizer/mod.js"; import { - Generate, - this_chid, - characters, - online_status, - main_api, - api_server, - nai_settings, - api_server_textgenerationwebui, - is_send_press, + Generate, + this_chid, + characters, + online_status, + main_api, + api_server, + nai_settings, + api_server_textgenerationwebui, + is_send_press, } from "../script.js"; import { fast_ui_mode, - pin_examples, + pin_examples, } from "./power-user.js"; import { LoadLocal, SaveLocal, ClearLocal, CheckLocal, LoadLocalBool } from "./f-localStorage.js"; @@ -49,15 +49,15 @@ var RA_AC_retries = 1; const observerConfig = { childList: true, subtree: true }; const observer = new MutationObserver(function (mutations) { - mutations.forEach(function (mutation) { - if (mutation.target.id === "online_status_text2" || + mutations.forEach(function (mutation) { + if (mutation.target.id === "online_status_text2" || mutation.target.id === "online_status_text3" || mutation.target.classList.contains("online_status_text4")) { - RA_checkOnlineStatus(); - } else if (mutation.target.parentNode === SelectedCharacterTab) { - setTimeout(RA_CountCharTokens, 200); - } - }); + RA_checkOnlineStatus(); + } else if (mutation.target.parentNode === SelectedCharacterTab) { + setTimeout(RA_CountCharTokens, 200); + } + }); }); observer.observe(document.documentElement, observerConfig); @@ -68,360 +68,374 @@ observer.observe(document.documentElement, observerConfig); //Does not break old characters/chats, as the code just uses whatever timestamp exists in the chat. //New chats made with characters will use this new formatting. export function humanizedDateTime() { - let baseDate = new Date(Date.now()); - let humanYear = baseDate.getFullYear(); - let humanMonth = baseDate.getMonth() + 1; - let humanDate = baseDate.getDate(); - let humanHour = (baseDate.getHours() < 10 ? "0" : "") + baseDate.getHours(); - let humanMinute = - (baseDate.getMinutes() < 10 ? "0" : "") + baseDate.getMinutes(); - let humanSecond = - (baseDate.getSeconds() < 10 ? "0" : "") + baseDate.getSeconds(); - let humanMillisecond = - (baseDate.getMilliseconds() < 10 ? "0" : "") + baseDate.getMilliseconds(); - let HumanizedDateTime = - humanYear + "-" + humanMonth + "-" + humanDate + " @" + humanHour + "h " + humanMinute + "m " + humanSecond + "s " + humanMillisecond + "ms"; - return HumanizedDateTime; + let baseDate = new Date(Date.now()); + let humanYear = baseDate.getFullYear(); + let humanMonth = baseDate.getMonth() + 1; + let humanDate = baseDate.getDate(); + let humanHour = (baseDate.getHours() < 10 ? "0" : "") + baseDate.getHours(); + let humanMinute = + (baseDate.getMinutes() < 10 ? "0" : "") + baseDate.getMinutes(); + let humanSecond = + (baseDate.getSeconds() < 10 ? "0" : "") + baseDate.getSeconds(); + let humanMillisecond = + (baseDate.getMilliseconds() < 10 ? "0" : "") + baseDate.getMilliseconds(); + let HumanizedDateTime = + humanYear + "-" + humanMonth + "-" + humanDate + " @" + humanHour + "h " + humanMinute + "m " + humanSecond + "s " + humanMillisecond + "ms"; + return HumanizedDateTime; } // triggers: -$("#rm_button_create").on("click", function () { //when "+New Character" is clicked - $(SelectedCharacterTab).children("h2").html(''); // empty nav's 3rd panel tab +$("#rm_button_create").on("click", function () { //when "+New Character" is clicked + $(SelectedCharacterTab).children("h2").html(''); // empty nav's 3rd panel tab - //empty temp vars to store new char data for counting - create_save_name = ""; - create_save_description = ""; - create_save_personality = ""; - create_save_first_message = ""; - create_save_scenario = ""; - create_save_mes_example = ""; - $("#result_info").html('Type to start counting tokens!'); + //empty temp vars to store new char data for counting + create_save_name = ""; + create_save_description = ""; + create_save_personality = ""; + create_save_first_message = ""; + create_save_scenario = ""; + create_save_mes_example = ""; + $("#result_info").html('Type to start counting tokens!'); }); -$("#rm_ch_create_block").on("input", function () { RA_CountCharTokens(); }); //when any input is made to the create/edit character form textareas -$("#character_popup").on("input", function () { RA_CountCharTokens(); }); //when any input is made to the advanced editing popup textareas +$("#rm_ch_create_block").on("input", function () { RA_CountCharTokens(); }); //when any input is made to the create/edit character form textareas +$("#character_popup").on("input", function () { RA_CountCharTokens(); }); //when any input is made to the advanced editing popup textareas //function: function RA_CountCharTokens() { - $("#result_info").html(""); - //console.log('RA_TC -- starting with this_chid = ' + this_chid); - if (document.getElementById('name_div').style.display == "block") { //if new char + $("#result_info").html(""); + //console.log('RA_TC -- starting with this_chid = ' + this_chid); + if (document.getElementById('name_div').style.display == "block") { //if new char - $("#form_create").on("input", function () { //fill temp vars with form_create values - create_save_name = $("#character_name_pole").val(); - create_save_description = $("#description_textarea").val(); - create_save_first_message = $("#firstmessage_textarea").val(); - }); - $("#character_popup").on("input", function () { //fill temp vars with advanced popup values - create_save_personality = $("#personality_textarea").val(); - create_save_scenario = $("#scenario_pole").val(); - create_save_mes_example = $("#mes_example_textarea").val(); + $("#form_create").on("input", function () { //fill temp vars with form_create values + create_save_name = $("#character_name_pole").val(); + create_save_description = $("#description_textarea").val(); + create_save_first_message = $("#firstmessage_textarea").val(); + }); + $("#character_popup").on("input", function () { //fill temp vars with advanced popup values + create_save_personality = $("#personality_textarea").val(); + create_save_scenario = $("#scenario_pole").val(); + create_save_mes_example = $("#mes_example_textarea").val(); - }); + }); - //count total tokens, including those that will be removed from context once chat history is long - count_tokens = encode(JSON.stringify( - create_save_name + - create_save_description + - create_save_personality + - create_save_scenario + - create_save_first_message + - create_save_mes_example - )).length; + //count total tokens, including those that will be removed from context once chat history is long + count_tokens = encode(JSON.stringify( + create_save_name + + create_save_description + + create_save_personality + + create_save_scenario + + create_save_first_message + + create_save_mes_example + )).length; - //count permanent tokens that will never get flushed out of context - perm_tokens = encode(JSON.stringify( - create_save_name + - create_save_description + - create_save_personality + - create_save_scenario - )).length; + //count permanent tokens that will never get flushed out of context + perm_tokens = encode(JSON.stringify( + create_save_name + + create_save_description + + create_save_personality + + create_save_scenario + )).length; - } else { - if (this_chid !== undefined && this_chid !== "invalid-safety-id") { // if we are counting a valid pre-saved char + } else { + if (this_chid !== undefined && this_chid !== "invalid-safety-id") { // if we are counting a valid pre-saved char - //same as above, all tokens including temporary ones - count_tokens = encode( - JSON.stringify( - characters[this_chid].description + - characters[this_chid].personality + - characters[this_chid].scenario + - characters[this_chid].first_mes + - characters[this_chid].mes_example - )).length; + //same as above, all tokens including temporary ones + count_tokens = encode( + JSON.stringify( + characters[this_chid].description + + characters[this_chid].personality + + characters[this_chid].scenario + + characters[this_chid].first_mes + + characters[this_chid].mes_example + )).length; - //permanent tokens count - perm_tokens = encode( - JSON.stringify( - characters[this_chid].name + - characters[this_chid].description + - characters[this_chid].personality + - characters[this_chid].scenario + - (pin_examples ? characters[this_chid].mes_example : '') // add examples to permanent if they are pinned - )).length; - } else { console.log("RA_TC -- no valid char found, closing."); } // if neither, probably safety char or some error in loading - } - // display the counted tokens - if (count_tokens < 1024 && perm_tokens < 1024) { - $("#result_info").html(count_tokens + " Tokens (" + perm_tokens + " Permanent Tokens)"); //display normal if both counts are under 1024 - } else { $("#result_info").html("" + count_tokens + " Tokens (" + perm_tokens + " Permanent Tokens)(TOO MANY)"); } //warn if either are over 1024 + //permanent tokens count + perm_tokens = encode( + JSON.stringify( + characters[this_chid].name + + characters[this_chid].description + + characters[this_chid].personality + + characters[this_chid].scenario + + (pin_examples ? characters[this_chid].mes_example : '') // add examples to permanent if they are pinned + )).length; + } else { console.log("RA_TC -- no valid char found, closing."); } // if neither, probably safety char or some error in loading + } + // display the counted tokens + if (count_tokens < 1024 && perm_tokens < 1024) { + $("#result_info").html(count_tokens + " Tokens (" + perm_tokens + " Permanent Tokens)"); //display normal if both counts are under 1024 + } else { $("#result_info").html("" + count_tokens + " Tokens (" + perm_tokens + " Permanent Tokens)(TOO MANY)"); } //warn if either are over 1024 } //Auto Load Last Charcter -- (fires when active_character is defined and auto_load_chat is true) async function RA_autoloadchat() { - if (document.getElementById('CharID0') !== null) { - //console.log('char list loaded! clicking activeChar'); - var CharToAutoLoad = document.getElementById('CharID' + LoadLocal('ActiveChar')); - if (CharToAutoLoad != null) { - CharToAutoLoad.click(); - } else { - console.log(CharToAutoLoad + ' ActiveChar local var - not found: ' + LoadLocal('ActiveChar')); - } - RestoreNavTab(); - } else { - //console.log('no char list yet..'); - setTimeout(RA_autoloadchat, 100); // if the charcter list hadn't been loaded yet, try again. - } + if (document.getElementById('CharID0') !== null) { + //console.log('char list loaded! clicking activeChar'); + var CharToAutoLoad = document.getElementById('CharID' + LoadLocal('ActiveChar')); + let autoLoadGroup = document.querySelector(`.group_select[grid="${LoadLocal('ActiveGroup')}"]`); + if (CharToAutoLoad != null) { + CharToAutoLoad.click(); + } + else if (autoLoadGroup != null) { + autoLoadGroup.click(); + } + else { + console.log(CharToAutoLoad + ' ActiveChar local var - not found: ' + LoadLocal('ActiveChar')); + } + RestoreNavTab(); + } else { + //console.log('no char list yet..'); + setTimeout(RA_autoloadchat, 100); // if the charcter list hadn't been loaded yet, try again. + } } //only triggers when AutoLoadChat is enabled, consider adding this as an independent feature later. function RestoreNavTab() { - if ($('#rm_button_selected_ch').children("h2").text() !== '') { //check for a change in the character edit tab name - //console.log('detected ALC char finished loaded, proceeding to restore tab.'); - $(SelectedNavTab).click(); //click to restore saved tab when name has changed (signalling char load is done) - } else { - setTimeout(RestoreNavTab, 100); //if not changed yet, check again after 100ms - } + if ($('#rm_button_selected_ch').children("h2").text() !== '') { //check for a change in the character edit tab name + //console.log('detected ALC char finished loaded, proceeding to restore tab.'); + $(SelectedNavTab).click(); //click to restore saved tab when name has changed (signalling char load is done) + } else { + setTimeout(RestoreNavTab, 100); //if not changed yet, check again after 100ms + } } //changes input bar and send button display depending on connection status function RA_checkOnlineStatus() { - if (online_status == "no_connection") { - $("#send_textarea").attr("placeholder", "Not connected to API!"); //Input bar placeholder tells users they are not connected - $("#send_form").css("background-color", "rgba(100,0,0,0.5)"); //entire input form area is red when not connected - $("#send_but").css("display", "none"); //send button is hidden when not connected; - $("#API-status-top").addClass("redOverlayGlow"); - connection_made = false; - } else { - if (online_status !== undefined && online_status !== "no_connection") { - $("#send_textarea").attr("placeholder", "Type a message..."); //on connect, placeholder tells user to type message - const formColor = fast_ui_mode ? "var(--black90a)": "var(--black60a)"; - $("#send_form").css("background-color", formColor); //on connect, form BG changes to transprent black - $("#API-status-top").removeClass("redOverlayGlow"); - connection_made = true; - retry_delay = 100; - RA_AC_retries = 1; + if (online_status == "no_connection") { + $("#send_textarea").attr("placeholder", "Not connected to API!"); //Input bar placeholder tells users they are not connected + $("#send_form").css("background-color", "rgba(100,0,0,0.5)"); //entire input form area is red when not connected + $("#send_but").css("display", "none"); //send button is hidden when not connected; + $("#API-status-top").addClass("redOverlayGlow"); + connection_made = false; + } else { + if (online_status !== undefined && online_status !== "no_connection") { + $("#send_textarea").attr("placeholder", "Type a message..."); //on connect, placeholder tells user to type message + const formColor = fast_ui_mode ? "var(--black90a)" : "var(--black60a)"; + $("#send_form").css("background-color", formColor); //on connect, form BG changes to transprent black + $("#API-status-top").removeClass("redOverlayGlow"); + connection_made = true; + retry_delay = 100; + RA_AC_retries = 1; - if (!is_send_press && !(selected_group && is_group_generating)) { - $("#send_but").css("display", "inline"); //on connect, send button shows - } - } - } + if (!is_send_press && !(selected_group && is_group_generating)) { + $("#send_but").css("display", "inline"); //on connect, send button shows + } + } + } } //Auto-connect to API (when set to kobold, API URL exists, and auto_connect is true) function RA_autoconnect(PrevApi) { - if (online_status === "no_connection" && LoadLocalBool('AutoConnectEnabled')) { - switch (main_api) { - case 'kobold': - if (api_server && isUrlOrAPIKey(api_server)) { - $("#api_button").click(); + if (online_status === "no_connection" && LoadLocalBool('AutoConnectEnabled')) { + switch (main_api) { + case 'kobold': + if (api_server && isUrlOrAPIKey(api_server)) { + $("#api_button").click(); - } - break; - case 'novel': - if (nai_settings.api_key_novel) { - $("#api_button_novel").click(); + } + break; + case 'novel': + if (nai_settings.api_key_novel) { + $("#api_button_novel").click(); - } - break; - case 'textgenerationwebui': - if (api_server_textgenerationwebui && isUrlOrAPIKey(api_server_textgenerationwebui)) { - $("#api_button_textgenerationwebui").click(); + } + break; + case 'textgenerationwebui': + if (api_server_textgenerationwebui && isUrlOrAPIKey(api_server_textgenerationwebui)) { + $("#api_button_textgenerationwebui").click(); - } - break; - case 'openai': - if (oai_settings.api_key_openai) { - $("#api_button_openai").click(); + } + break; + case 'openai': + if (oai_settings.api_key_openai) { + $("#api_button_openai").click(); - } - } + } + } - if (!connection_made) { + if (!connection_made) { - RA_AC_retries++; - retry_delay = Math.min(retry_delay * 2, 30000); // double retry delay up to to 30 secs - //console.log('connection attempts: ' + RA_AC_retries + ' delay: ' + (retry_delay / 1000) + 's'); - setTimeout(RA_autoconnect, retry_delay); - } - } + RA_AC_retries++; + retry_delay = Math.min(retry_delay * 2, 30000); // double retry delay up to to 30 secs + //console.log('connection attempts: ' + RA_AC_retries + ' delay: ' + (retry_delay / 1000) + 's'); + setTimeout(RA_autoconnect, retry_delay); + } + } } function isUrlOrAPIKey(string) { - try { - new URL(string); - return true; - } catch (_) { - // return pattern.test(string); - } + try { + new URL(string); + return true; + } catch (_) { + // return pattern.test(string); + } } $("document").ready(function () { // initial status check setTimeout(RA_checkOnlineStatus, 100); - // read the state of AutoConnect and AutoLoadChat. - $(AutoConnectCheckbox).prop("checked", LoadLocalBool("AutoConnectEnabled")); - $(AutoLoadChatCheckbox).prop("checked", LoadLocalBool("AutoLoadChatEnabled")); + // read the state of AutoConnect and AutoLoadChat. + $(AutoConnectCheckbox).prop("checked", LoadLocalBool("AutoConnectEnabled")); + $(AutoLoadChatCheckbox).prop("checked", LoadLocalBool("AutoLoadChatEnabled")); - if (LoadLocalBool('AutoLoadChatEnabled') == true) { RA_autoloadchat(); } - //Autoconnect on page load if enabled, or when api type is changed - if (LoadLocalBool("AutoConnectEnabled") == true) { RA_autoconnect(); } - $("#main_api").change(function () { - var PrevAPI = main_api; - RA_autoconnect(PrevAPI); - }); - $("#api_button").click(function () { setTimeout(RA_checkOnlineStatus, 100); }); + if (LoadLocalBool('AutoLoadChatEnabled') == true) { RA_autoloadchat(); } + //Autoconnect on page load if enabled, or when api type is changed + if (LoadLocalBool("AutoConnectEnabled") == true) { RA_autoconnect(); } + $("#main_api").change(function () { + var PrevAPI = main_api; + RA_autoconnect(PrevAPI); + }); + $("#api_button").click(function () { setTimeout(RA_checkOnlineStatus, 100); }); - //toggle pin class when lock toggle clicked - $(PanelPin).on("click", function () { - SaveLocal("NavLockOn", $(PanelPin).prop("checked")); - if ($(PanelPin).prop("checked") == true) { - console.log('adding pin class to right nav'); - $(RightNavPanel).addClass('pinnedOpen'); - } else { - console.log('removing pin class from right nav'); - $(RightNavPanel).removeClass('pinnedOpen'); + //toggle pin class when lock toggle clicked + $(PanelPin).on("click", function () { + SaveLocal("NavLockOn", $(PanelPin).prop("checked")); + if ($(PanelPin).prop("checked") == true) { + console.log('adding pin class to right nav'); + $(RightNavPanel).addClass('pinnedOpen'); + } else { + console.log('removing pin class from right nav'); + $(RightNavPanel).removeClass('pinnedOpen'); if ($(RightNavPanel).hasClass('openDrawer') && $('.openDrawer').length > 1) { $(RightNavPanel).slideToggle(200, "swing"); $(rightNavDrawerIcon).toggleClass('openIcon closedIcon'); $(RightNavPanel).toggleClass('openDrawer closedDrawer'); } - } - }); + } + }); - // read the state of Nav Lock and apply to rightnav classlist - $(PanelPin).prop('checked', LoadLocalBool("NavLockOn")); - if (LoadLocalBool("NavLockOn") == true) { - //console.log('setting pin class via local var'); - $(RightNavPanel).addClass('pinnedOpen'); - } - if ($(PanelPin).prop('checked' == true)) { - console.log('setting pin class via checkbox state'); - $(RightNavPanel).addClass('pinnedOpen'); - } + // read the state of Nav Lock and apply to rightnav classlist + $(PanelPin).prop('checked', LoadLocalBool("NavLockOn")); + if (LoadLocalBool("NavLockOn") == true) { + //console.log('setting pin class via local var'); + $(RightNavPanel).addClass('pinnedOpen'); + } + if ($(PanelPin).prop('checked' == true)) { + console.log('setting pin class via checkbox state'); + $(RightNavPanel).addClass('pinnedOpen'); + } - //save state of nav being open or closed - $("#rightNavDrawerIcon").on("click", function () { - if (!$("#rightNavDrawerIcon").hasClass('openIcon')) { - SaveLocal('NavOpened', 'true'); - } else { SaveLocal('NavOpened', 'false'); } - }); + //save state of nav being open or closed + $("#rightNavDrawerIcon").on("click", function () { + if (!$("#rightNavDrawerIcon").hasClass('openIcon')) { + SaveLocal('NavOpened', 'true'); + } else { SaveLocal('NavOpened', 'false'); } + }); - if (LoadLocalBool("NavLockOn") == true && LoadLocalBool("NavOpened") == true) { - $("#rightNavDrawerIcon").click(); - } else { - console.log('didnt see reason to open nav on load: ' + - LoadLocalBool("NavLockOn") - + ' nav open pref' + - LoadLocalBool("NavOpened" == true)); - } + if (LoadLocalBool("NavLockOn") == true && LoadLocalBool("NavOpened") == true) { + $("#rightNavDrawerIcon").click(); + } else { + console.log('didnt see reason to open nav on load: ' + + LoadLocalBool("NavLockOn") + + ' nav open pref' + + LoadLocalBool("NavOpened" == true)); + } - //save AutoConnect and AutoLoadChat prefs - $(AutoConnectCheckbox).on("change", function () { SaveLocal("AutoConnectEnabled", $(AutoConnectCheckbox).prop("checked")); }); - $(AutoLoadChatCheckbox).on("change", function () { SaveLocal("AutoLoadChatEnabled", $(AutoLoadChatCheckbox).prop("checked")); }); + //save AutoConnect and AutoLoadChat prefs + $(AutoConnectCheckbox).on("change", function () { SaveLocal("AutoConnectEnabled", $(AutoConnectCheckbox).prop("checked")); }); + $(AutoLoadChatCheckbox).on("change", function () { SaveLocal("AutoLoadChatEnabled", $(AutoLoadChatCheckbox).prop("checked")); }); - $(SelectedCharacterTab).click(function () { SaveLocal('SelectedNavTab', 'rm_button_selected_ch'); }); - $("#rm_button_characters").click(function () { //if char list is clicked, in addition to saving it... - SaveLocal('SelectedNavTab', 'rm_button_characters'); - characters.sort(Intl.Collator().compare); // we sort the list - }); - // when a char is selected from the list, save them as the auto-load character for next page load - $(document).on("click", ".character_select", function () { SaveLocal('ActiveChar', $(this).attr('chid')); }); + $(SelectedCharacterTab).click(function () { SaveLocal('SelectedNavTab', 'rm_button_selected_ch'); }); + $("#rm_button_characters").click(function () { //if char list is clicked, in addition to saving it... + SaveLocal('SelectedNavTab', 'rm_button_characters'); + characters.sort(Intl.Collator().compare); // we sort the list + }); - //this makes the chat input text area resize vertically to match the text size (limited by CSS at 50% window height) - $('#send_textarea').on('input', function () { - this.style.height = '40px'; - this.style.height = (this.scrollHeight) + 'px'; - }); + // when a char is selected from the list, save them as the auto-load character for next page load + $(document).on("click", ".character_select", function () { + SaveLocal('ActiveChar', $(this).attr('chid')); + SaveLocal('ActiveGroup', null); + }); - //Regenerate if user swipes on the last mesage in chat + $(document).on("click", ".group_select", function () { + SaveLocal('ActiveChar', null); + SaveLocal('ActiveGroup', $(this).data('id')); + }); - document.addEventListener('swiped-left', function (e) { - var SwipeButR = $('.swipe_right:last'); - var SwipeTargetMesClassParent = e.target.closest('.last_mes'); - if (SwipeTargetMesClassParent !== null) { - if (SwipeButR.css('display') === 'flex') { - SwipeButR.click(); - } - } - }); - document.addEventListener('swiped-right', function (e) { - var SwipeButL = $('.swipe_left:last'); - var SwipeTargetMesClassParent = e.target.closest('.last_mes'); - if (SwipeTargetMesClassParent !== null) { - if (SwipeButL.css('display') === 'flex') { - SwipeButL.click(); - } - } - }); + //this makes the chat input text area resize vertically to match the text size (limited by CSS at 50% window height) + $('#send_textarea').on('input', function () { + this.style.height = '40px'; + this.style.height = (this.scrollHeight) + 'px'; + }); - function isInputElementInFocus() { - return $(document.activeElement).is(":input"); - } + //Regenerate if user swipes on the last mesage in chat - //Additional hotkeys CTRL+ENTER and CTRL+UPARROW - document.addEventListener("keydown", (event) => { - if (event.ctrlKey && event.key == "Enter") { - // Ctrl+Enter for Regeneration Last Response - if (is_send_press == false) { + document.addEventListener('swiped-left', function (e) { + var SwipeButR = $('.swipe_right:last'); + var SwipeTargetMesClassParent = e.target.closest('.last_mes'); + if (SwipeTargetMesClassParent !== null) { + if (SwipeButR.css('display') === 'flex') { + SwipeButR.click(); + } + } + }); + document.addEventListener('swiped-right', function (e) { + var SwipeButL = $('.swipe_left:last'); + var SwipeTargetMesClassParent = e.target.closest('.last_mes'); + if (SwipeTargetMesClassParent !== null) { + if (SwipeButL.css('display') === 'flex') { + SwipeButL.click(); + } + } + }); - $('#option_regenerate').click(); - $('#options').hide(); - //setTimeout(function () { $('#chat').click(); }, 50) //needed to remove the options menu popping up.. - //Generate("regenerate"); - } - } - if (event.ctrlKey && event.key == "ArrowUp") { - //Ctrl+UpArrow for Connect to last server - console.log(main_api); - if (online_status === "no_connection") { - if (main_api == "kobold") { - document.getElementById("api_button").click(); - } - if (main_api == "novel") { - document.getElementById("api_button_novel").click(); - } - if (main_api == "textgenerationwebui") { - document.getElementById("api_button_textgenerationwebui").click(); - } - } - } - if (event.ctrlKey && event.key == "ArrowLeft") { //for debug, show all local stored vars - CheckLocal(); - } - if (event.ctrlKey && event.key == "ArrowRight") { //for debug, empty local storage state - ClearLocal(); - } - if (event.key == "ArrowLeft") { //swipes left - if ( - $(".swipe_left:last").css('display') === 'flex' && - $("#send_textarea").val() === '' && - $("#character_popup").css("display") === "none" && - $("#shadow_select_chat_popup").css("display") === "none" && - !isInputElementInFocus() - ) { - $('.swipe_left:last').click(); - } - } - if (event.key == "ArrowRight") { //swipes right - if ( - $(".swipe_right:last").css('display') === 'flex' && - $("#send_textarea").val() === '' && - $("#character_popup").css("display") === "none" && - $("#shadow_select_chat_popup").css("display") === "none" && - !isInputElementInFocus() - ) { - $('.swipe_right:last').click(); - } - } - }); + function isInputElementInFocus() { + return $(document.activeElement).is(":input"); + } + + //Additional hotkeys CTRL+ENTER and CTRL+UPARROW + document.addEventListener("keydown", (event) => { + if (event.ctrlKey && event.key == "Enter") { + // Ctrl+Enter for Regeneration Last Response + if (is_send_press == false) { + + $('#option_regenerate').click(); + $('#options').hide(); + //setTimeout(function () { $('#chat').click(); }, 50) //needed to remove the options menu popping up.. + //Generate("regenerate"); + } + } + if (event.ctrlKey && event.key == "ArrowUp") { + //Ctrl+UpArrow for Connect to last server + console.log(main_api); + if (online_status === "no_connection") { + if (main_api == "kobold") { + document.getElementById("api_button").click(); + } + if (main_api == "novel") { + document.getElementById("api_button_novel").click(); + } + if (main_api == "textgenerationwebui") { + document.getElementById("api_button_textgenerationwebui").click(); + } + } + } + if (event.ctrlKey && event.key == "ArrowLeft") { //for debug, show all local stored vars + CheckLocal(); + } + if (event.ctrlKey && event.key == "ArrowRight") { //for debug, empty local storage state + ClearLocal(); + } + if (event.key == "ArrowLeft") { //swipes left + if ( + $(".swipe_left:last").css('display') === 'flex' && + $("#send_textarea").val() === '' && + $("#character_popup").css("display") === "none" && + $("#shadow_select_chat_popup").css("display") === "none" && + !isInputElementInFocus() + ) { + $('.swipe_left:last').click(); + } + } + if (event.key == "ArrowRight") { //swipes right + if ( + $(".swipe_right:last").css('display') === 'flex' && + $("#send_textarea").val() === '' && + $("#character_popup").css("display") === "none" && + $("#shadow_select_chat_popup").css("display") === "none" && + !isInputElementInFocus() + ) { + $('.swipe_right:last').click(); + } + } + }); }); diff --git a/public/scripts/group-chats.js b/public/scripts/group-chats.js index 3638abe33..9a945af5d 100644 --- a/public/scripts/group-chats.js +++ b/public/scripts/group-chats.js @@ -180,6 +180,7 @@ function printGroups() { for (let group of groups) { const template = $("#group_list_template .group_select").clone(); template.data("id", group.id); + template.attr("grid", group.id); template.find(".ch_name").text(group.name); $("#rm_print_characters_block").prepend(template); updateGroupAvatar(group);