Move persona buttons to right panel - Move all buttons from the persona list to the right panel, to the already existing ones - Common CSS class/style for '.buttons_block' - Common CSS style for a red button - Refactored a few persona buttons' functionalities

2344d98e203f324e0e630ef3daa8c762c3bfc875

Wolfsblvt <wolfsblvt@gmail.com>

4 files changed, +60 -71Ignore whitespace
public/index.html+17 -15
@@ -4957,14 +4957,16 @@
4957 <div class="persona_management_current_persona">4957 <div class="persona_management_current_persona">
4958 <h4 class="standoutHeader" data-i18n="Current Persona">Current Persona</h4>4958 <h4 class="standoutHeader" data-i18n="Current Persona">Current Persona</h4>
49594959
4960 <h4 data-i18n="Name">Name</h4>4960 <div id="persona_controls" class="flex-container">
4961 <div class="change_name">4961 <h5 id="your_name" class="persona_name">[Persona Name]</h5>
4962 <input id="your_name" name="your_name" data-i18n="[placeholder]Enter your name" placeholder="Enter your name" class="text_pole wide100p" value="" autocomplete="off">4962 <div class="persona_controls_buttons_block buttons_block">
4963 <div id="your_name_button" class="menu_button fa-solid fa-check" title="Click to set a new User Name" data-i18n="[title]Click to set a new User Name">4963 <div id="persona_rename_button" class="menu_button fa-solid fa-pencil" title="Rename Persona / Bind Name To Avatar" data-i18n="[title]Rename Persona / Bind Name To Avatar"></div>
4964 </div>4964 <div id="sync_name_button" class="menu_button fa-solid fa-sync" title="Click to set user name for all messages" data-i18n="[title]Click to set user name for all messages"></div>
4965 <div id="sync_name_button" class="menu_button fa-solid fa-sync" title="Click to set user name for all messages" data-i18n="[title]Click to set user name for all messages">4965 <div id="persona_lore_button" class="menu_button fa-solid fa-globe" title="Persona Lore&#10;Alt+Click to open the lorebook" data-i18n="[title]Persona Lore Alt+Click to open the lorebook"></div>
4966 </div>4966
4967 <div id="persona_lore_button" class="menu_button fa-solid fa-globe" title="Persona Lore&#10;Alt+Click to open the lorebook" data-i18n="[title]Persona Lore Alt+Click to open the lorebook">4967 <div id="persona_set_image_button" class="menu_button fa-solid fa-image" title="Change Persona Image" data-i18n="[title]Change Persona Image"></div>
4968 <div id="persona_duplicate_button" class="menu_button fa-solid fa-clone" title="Duplicate Persona" data-i18n="[title]Duplicate Persona"></div>
4969 <div id="persona_delete_button" class="menu_button fa-solid fa-skull red_button" title="Delete Persona" data-i18n="[title]Delete Persona"></div>
4968 </div>4970 </div>
4969 </div>4971 </div>
49704972
@@ -5109,13 +5111,13 @@
5109 </div>5111 </div>
5110 </div>5112 </div>
5111 <div class="flex-container flexFlowColumn expander flexNoGap">5113 <div class="flex-container flexFlowColumn expander flexNoGap">
5112 <div id="avatar_div" class="avatar_div alignitemsflexstart justifySpaceBetween flexnowrap">5114 <div id="avatar_div" class="avatar_div buttons_block alignitemsflexstart justifySpaceBetween flexnowrap">
5113 <label id="avatar_div_div" class="add_avatar avatar" for="add_avatar_button" title="Click to select a new avatar for this character" data-i18n="[title]Click to select a new avatar for this character">5115 <label id="avatar_div_div" class="add_avatar avatar" for="add_avatar_button" title="Click to select a new avatar for this character" data-i18n="[title]Click to select a new avatar for this character">
5114 <img id="avatar_load_preview" src="img/ai4.png" alt="avatar">5116 <img id="avatar_load_preview" src="img/ai4.png" alt="avatar">
5115 <input hidden type="file" id="add_avatar_button" name="avatar" accept="image/*">5117 <input hidden type="file" id="add_avatar_button" name="avatar" accept="image/*">
5116 </label>5118 </label>
5117 <div class="flex-container" id="avatar_controls">5119 <div class="flex-container" id="avatar_controls">
5118 <div class="form_create_bottom_buttons_block">5120 <div class="form_create_bottom_buttons_block buttons_block">
5119 <div id="rm_button_back" class="menu_button fa-solid fa-left-long "></div>5121 <div id="rm_button_back" class="menu_button fa-solid fa-left-long "></div>
5120 <!-- <div id="renameCharButton" class="menu_button fa-solid fa-user-pen" title="Rename Character"></div> -->5122 <!-- <div id="renameCharButton" class="menu_button fa-solid fa-user-pen" title="Rename Character"></div> -->
5121 <div id="favorite_button" class="menu_button fa-solid fa-star" title="Add to Favorites" data-i18n="[title]Add to Favorites"></div>5123 <div id="favorite_button" class="menu_button fa-solid fa-star" title="Add to Favorites" data-i18n="[title]Add to Favorites"></div>
@@ -5131,7 +5133,7 @@
5131 <label for="create_button" id="create_button_label" class="menu_button fa-solid fa-user-check" title="Create Character" data-i18n="[title]Create Character">5133 <label for="create_button" id="create_button_label" class="menu_button fa-solid fa-user-check" title="Create Character" data-i18n="[title]Create Character">
5132 <input type="submit" id="create_button" name="create_button">5134 <input type="submit" id="create_button" name="create_button">
5133 </label>5135 </label>
5134 <div id="delete_button" class="menu_button fa-solid fa-skull " title="Delete Character" data-i18n="[title]Delete Character"></div>5136 <div id="delete_button" class="menu_button fa-solid fa-skull red_button" title="Delete Character" data-i18n="[title]Delete Character"></div>
5135 </div>5137 </div>
5136 <label class="flex1 height100p" for="char-management-dropdown">5138 <label class="flex1 height100p" for="char-management-dropdown">
5137 <select id="char-management-dropdown" class="text_pole">5139 <select id="char-management-dropdown" class="text_pole">
@@ -5469,23 +5471,23 @@
5469 <div class="wide100p character_name_block">5471 <div class="wide100p character_name_block">
5470 <span class="ch_name flex1"></span>5472 <span class="ch_name flex1"></span>
5471 <div class="avatar-buttons">5473 <div class="avatar-buttons">
5472 <button class="menu_button bind_user_name" title="Bind user name to that avatar" data-i18n="[title]Bind user name to that avatar">5474 <!-- <button class="menu_button bind_user_name" title="Bind user name to that avatar" data-i18n="[title]Bind user name to that avatar">
5473 <i class="fa-fw fa-solid fa-user-edit fa-sm"></i>5475 <i class="fa-fw fa-solid fa-user-edit fa-sm"></i>
5474 </button>5476 </button>
5475 <button class="menu_button set_persona_image" title="Change persona image" data-i18n="[title]Change persona image">5477 <button class="menu_button set_persona_image" title="Change persona image" data-i18n="[title]Change persona image">
5476 <i class="fa-fw fa-solid fa-image fa-sm"></i>5478 <i class="fa-fw fa-solid fa-image fa-sm"></i>
5477 </button>5479 </button>
5478 <!--5480
5479 <button class="menu_button set_default_persona" title="Select this as default persona for the new chats." data-i18n="[title]Select this as default persona for the new chats.">5481 <button class="menu_button set_default_persona" title="Select this as default persona for the new chats." data-i18n="[title]Select this as default persona for the new chats.">
5480 <i class="fa-fw fa-solid fa-crown fa-sm"></i>5482 <i class="fa-fw fa-solid fa-crown fa-sm"></i>
5481 </button>5483 </button>
5482 -->5484
5483 <button class="menu_button duplicate_persona" title="Duplicate persona" data-i18n="[title]Duplicate persona">5485 <button class="menu_button duplicate_persona" title="Duplicate persona" data-i18n="[title]Duplicate persona">
5484 <i class="fa-fw fa-solid fa-clone fa-sm"></i>5486 <i class="fa-fw fa-solid fa-clone fa-sm"></i>
5485 </button>5487 </button>
5486 <button class="menu_button delete_avatar" title="Delete persona" data-i18n="[title]Delete persona">5488 <button class="menu_button delete_avatar" title="Delete persona" data-i18n="[title]Delete persona">
5487 <i class="fa-fw fa-solid fa-trash-alt fa-sm"></i>5489 <i class="fa-fw fa-solid fa-trash-alt fa-sm"></i>
5488 </button>5490 </button> -->
5489 </div>5491 </div>
5490 </div>5492 </div>
5491 <div class="ch_description"></div>5493 <div class="ch_description"></div>
public/script.js+2 -2
@@ -6810,7 +6810,7 @@ export function setUserName(value, { toastPersonaNameChange = true } = {}) {
6810 if (name1 === undefined || name1 == '')6810 if (name1 === undefined || name1 == '')
6811 name1 = default_user_name;6811 name1 = default_user_name;
6812 console.log(`User name changed to ${name1}`);6812 console.log(`User name changed to ${name1}`);
6813 $('#your_name').val(name1);6813 $('#your_name').text(name1);
6814 if (toastPersonaNameChange && power_user.persona_show_notifications) {6814 if (toastPersonaNameChange && power_user.persona_show_notifications) {
6815 toastr.success(t`Your messages will now be sent as ${name1}`, t`Persona Changed`);6815 toastr.success(t`Your messages will now be sent as ${name1}`, t`Persona Changed`);
6816 }6816 }
@@ -6864,7 +6864,7 @@ export async function getSettings() {
6864 settings = JSON.parse(data.settings);6864 settings = JSON.parse(data.settings);
6865 if (settings.username !== undefined && settings.username !== '') {6865 if (settings.username !== undefined && settings.username !== '') {
6866 name1 = settings.username;6866 name1 = settings.username;
6867 $('#your_name').val(name1);6867 $('#your_name').text(name1);
6868 }6868 }
68696869
6870 await setUserControls(data.enable_accounts);6870 await setUserControls(data.enable_accounts);
public/scripts/personas.js+24 -38
@@ -466,6 +466,8 @@ const countPersonaDescriptionTokens = debounce(async () => {
466}, debounce_timeout.relaxed);466}, debounce_timeout.relaxed);
467467
468export function setPersonaDescription() {468export function setPersonaDescription() {
469 $('#your_name').text(name1);
470
469 if (power_user.persona_description_position === persona_description_positions.AFTER_CHAR) {471 if (power_user.persona_description_position === persona_description_positions.AFTER_CHAR) {
470 power_user.persona_description_position = persona_description_positions.IN_PROMPT;472 power_user.persona_description_position = persona_description_positions.IN_PROMPT;
471 }473 }
@@ -674,9 +676,8 @@ async function updatePersonaNameIfExists(avatarId, newName) {
674 saveSettingsDebounced();676 saveSettingsDebounced();
675}677}
676678
677async function bindUserNameToPersona(e) {679async function bindUserNameToPersona() {
678 e?.stopPropagation();680 const avatarId = user_avatar;
679 const avatarId = $(this).closest('.avatar-container').find('.avatar').attr('imgfile');
680681
681 if (!avatarId) {682 if (!avatarId) {
682 console.warn('No avatar id found');683 console.warn('No avatar id found');
@@ -719,6 +720,7 @@ async function bindUserNameToPersona(e) {
719 if (isCurrentPersona) {720 if (isCurrentPersona) {
720 console.log(`Auto-updating user name to ${personaName}`);721 console.log(`Auto-updating user name to ${personaName}`);
721 setUserName(personaName);722 setUserName(personaName);
723 await updatePersonaNameIfExists(user_avatar, personaName);
722 }724 }
723 } else {725 } else {
724 // If the user clicked ok, but didn't enter a name, delete the persona726 // If the user clicked ok, but didn't enter a name, delete the persona
@@ -730,6 +732,8 @@ async function bindUserNameToPersona(e) {
730 saveSettingsDebounced();732 saveSettingsDebounced();
731 await getUserAvatars(true, avatarId);733 await getUserAvatars(true, avatarId);
732 setPersonaDescription();734 setPersonaDescription();
735
736 retriggerFirstMessageOnEmptyChat();
733}737}
734738
735function selectCurrentPersona({ toastPersonaNameChange = true } = {}) {739function selectCurrentPersona({ toastPersonaNameChange = true } = {}) {
@@ -969,22 +973,15 @@ async function lockPersona(type = 'chat') {
969}973}
970974
971975
972async function deleteUserAvatar(e) {976async function deleteUserAvatar() {
973 e?.stopPropagation();977 const avatarId = user_avatar;
974 const avatarId = $(this).closest('.avatar-container').find('.avatar').attr('imgfile');
975978
976 if (!avatarId) {979 if (!avatarId) {
977 console.warn('No avatar id found');980 console.warn('No avatar id found');
978 return;981 return;
979 }982 }
980983 const confirm = await Popup.show.confirm(t`Delete Persona`,
981 if (avatarId == user_avatar) {984 t`Are you sure you want to delete this avatar?` + '<br />' + t`All information associated with its linked persona will be lost.`);
982 console.warn(`User tried to delete their current avatar ${avatarId}`);
983 toastr.warning(t`You cannot delete the avatar you are currently using`, t`Persona Warning`);
984 return;
985 }
986
987 const confirm = await Popup.show.confirm(t`Are you sure you want to delete this avatar?`, t`All information associated with its linked persona will be lost.`);
988985
989 if (!confirm) {986 if (!confirm) {
990 console.debug('User cancelled deleting avatar');987 console.debug('User cancelled deleting avatar');
@@ -1016,8 +1013,9 @@ async function deleteUserAvatar(e) {
1016 }1013 }
10171014
1018 saveSettingsDebounced();1015 saveSettingsDebounced();
1019 await getUserAvatars();1016
1020 updatePersonaLockIcons();1017 // Use the existing mechanism to re-render the persona list and choose the next persona here
1018 await loadPersonaForCurrentChat({ doRender: true });
1021 }1019 }
1022}1020}
10231021
@@ -1237,9 +1235,9 @@ function updatePersonaLockIcons() {
1237 $('#lock_persona_to_char i.icon').toggleClass('fa-unlock', !hasCharLock);1235 $('#lock_persona_to_char i.icon').toggleClass('fa-unlock', !hasCharLock);
1238}1236}
12391237
1240async function loadPersonaForCurrentChat() {1238async function loadPersonaForCurrentChat({ doRender = false } = {}) {
1241 // Cache persona list to check if they exist1239 // Cache persona list to check if they exist
1242 const userAvatars = await getUserAvatars(false);1240 const userAvatars = await getUserAvatars(doRender);
12431241
1244 // Define a persona for this chat1242 // Define a persona for this chat
1245 let chatPersona = '';1243 let chatPersona = '';
@@ -1500,9 +1498,8 @@ async function duplicatePersona(avatarId) {
1500}1498}
15011499
1502export function initPersonas() {1500export function initPersonas() {
1503 $(document).on('click', '.bind_user_name', bindUserNameToPersona);
1504 $(document).on('click', '.set_default_persona', toggleDefaultPersonaClicked);1501 $(document).on('click', '.set_default_persona', toggleDefaultPersonaClicked);
1505 $(document).on('click', '.delete_avatar', deleteUserAvatar);1502 $('#persona_delete_button').on('click', deleteUserAvatar);
1506 $('#lock_persona_default').on('click', () => togglePersonaLock('default'));1503 $('#lock_persona_default').on('click', () => togglePersonaLock('default'));
1507 $('#lock_user_name').on('click', () => togglePersonaLock('chat'));1504 $('#lock_user_name').on('click', () => togglePersonaLock('chat'));
1508 $('#lock_persona_to_char').on('click', () => togglePersonaLock('character'));1505 $('#lock_persona_to_char').on('click', () => togglePersonaLock('character'));
@@ -1548,11 +1545,13 @@ export function initPersonas() {
1548 retriggerFirstMessageOnEmptyChat();1545 retriggerFirstMessageOnEmptyChat();
1549 });1546 });
15501547
1551 $('#your_name_button').click(async function () {1548 $('#persona_rename_button').click(async function () {
1552 const userName = String($('#your_name').val()).trim();1549 const userName = String($('#your_name').val()).trim();
1553 setUserName(userName);1550 setUserName(userName);
1554 await updatePersonaNameIfExists(user_avatar, userName);1551 await updatePersonaNameIfExists(user_avatar, userName);
1555 retriggerFirstMessageOnEmptyChat();1552 retriggerFirstMessageOnEmptyChat();
1553 // TODO: Do both binding and/or rename?
1554 //bindUserNameToPersona();
1556 });1555 });
15571556
1558 $(document).on('click', '#user_avatar_block .avatar_upload', function () {1557 $(document).on('click', '#user_avatar_block .avatar_upload', function () {
@@ -1560,28 +1559,15 @@ export function initPersonas() {
1560 $('#avatar_upload_file').trigger('click');1559 $('#avatar_upload_file').trigger('click');
1561 });1560 });
15621561
1563 $(document).on('click', '#user_avatar_block .duplicate_persona', function (e) {1562 $('#persona_duplicate_button').on('click', () => duplicatePersona(user_avatar));
1564 e.stopPropagation();
1565 const avatarId = $(this).closest('.avatar-container').find('.avatar').attr('imgfile');
1566
1567 if (!avatarId) {
1568 console.log('no imgfile');
1569 return;
1570 }
1571
1572 duplicatePersona(avatarId);
1573 });
1574
1575 $(document).on('click', '#user_avatar_block .set_persona_image', function (e) {
1576 e.stopPropagation();
1577 const avatarId = $(this).closest('.avatar-container').find('.avatar').attr('imgfile');
15781563
1579 if (!avatarId) {1564 $('#persona_set_image_button').on('click', function () {
1565 if (!user_avatar) {
1580 console.log('no imgfile');1566 console.log('no imgfile');
1581 return;1567 return;
1582 }1568 }
15831569
1584 $('#avatar_upload_overwrite').val(avatarId);1570 $('#avatar_upload_overwrite').val(user_avatar);
1585 $('#avatar_upload_file').trigger('click');1571 $('#avatar_upload_file').trigger('click');
1586 });1572 });
15871573
public/style.css+17 -16
@@ -2919,6 +2919,16 @@ select option:not(:checked) {
2919 filter: grayscale(0.5);2919 filter: grayscale(0.5);
2920}2920}
29212921
2922#persona_controls .persona_name {
2923 text-overflow: ellipsis;
2924 overflow: hidden;
2925 text-align: left;
2926 white-space: nowrap;
2927 margin-right: 10px;
2928 font-size: calc(var(--mainFontSize) * 1.25);
2929 color: var(--grey50);
2930}
2931
2922input[type=search]::-webkit-search-cancel-button {2932input[type=search]::-webkit-search-cancel-button {
2923 -webkit-appearance: none;2933 -webkit-appearance: none;
2924 height: 1em;2934 height: 1em;
@@ -3395,12 +3405,7 @@ grammarly-extension {
3395 cursor: pointer;3405 cursor: pointer;
3396}3406}
33973407
3398#rm_characters_block .form_create_bottom_buttons_block {3408.buttons_block {
3399 justify-content: space-evenly !important;
3400 flex-grow: 0;
3401}
3402
3403.form_create_bottom_buttons_block {
3404 display: flex;3409 display: flex;
3405 flex: 1;3410 flex: 1;
3406 gap: 5px;3411 gap: 5px;
@@ -3409,18 +3414,21 @@ grammarly-extension {
3409 flex-wrap: wrap;3414 flex-wrap: wrap;
3410}3415}
34113416
3412.form_create_bottom_buttons_block .menu_button {3417.buttons_block .menu_button {
3413 display: flex;3418 display: flex;
3414 justify-content: center;3419 justify-content: center;
3415 align-items: center;3420 align-items: center;
3421 padding: 5px;
3422 margin: 0;
3423 filter: grayscale(0.5);
3416}3424}
34173425
3418#delete_button,3426.red_button,
3419.redWarningBG {3427.redWarningBG {
3420 background-color: var(--crimson70a) !important;3428 background-color: var(--crimson70a) !important;
3421}3429}
34223430
3423#delete_button:hover,3431.red_button:hover,
3424.redWarningBG:hover {3432.redWarningBG:hover {
3425 background-color: var(--fullred) !important;3433 background-color: var(--fullred) !important;
3426}3434}
@@ -3614,13 +3622,6 @@ grammarly-extension {
3614 min-width: calc(1.25em + 12px);3622 min-width: calc(1.25em + 12px);
3615}3623}
36163624
3617.avatar_div .menu_button,
3618.form_create_bottom_buttons_block .menu_button {
3619 padding: 5px;
3620 margin: 0;
3621 filter: grayscale(0.5);
3622}
3623
3624.menu_button:hover,3625.menu_button:hover,
3625.menu_button.active {3626.menu_button.active {
3626 background-color: var(--white30a);3627 background-color: var(--white30a);