mirror of
https://github.com/SillyTavern/SillyTavern.git
synced 2024-12-16 11:19:40 +01:00
120 lines
3.5 KiB
JavaScript
120 lines
3.5 KiB
JavaScript
import { characters, getCharacters, handleDeleteCharacter, callPopup } from '../script.js';
|
|
import {BulkEditOverlay, BulkEditOverlayState} from './BulkEditOverlay.js';
|
|
|
|
|
|
let is_bulk_edit = false;
|
|
|
|
const enableBulkEdit = () => {
|
|
enableBulkSelect();
|
|
(new BulkEditOverlay()).selectState();
|
|
// show the delete button
|
|
$('#bulkDeleteButton').show();
|
|
is_bulk_edit = true;
|
|
};
|
|
|
|
const disableBulkEdit = () => {
|
|
disableBulkSelect();
|
|
(new BulkEditOverlay()).browseState();
|
|
// hide the delete button
|
|
$('#bulkDeleteButton').hide();
|
|
is_bulk_edit = false;
|
|
};
|
|
|
|
const toggleBulkEditMode = (isBulkEdit) => {
|
|
if (isBulkEdit) {
|
|
disableBulkEdit();
|
|
} else {
|
|
enableBulkEdit();
|
|
}
|
|
};
|
|
|
|
(new BulkEditOverlay()).addStateChangeCallback((state) => {
|
|
if (state === BulkEditOverlayState.select) enableBulkEdit();
|
|
if (state === BulkEditOverlayState.browse) disableBulkEdit();
|
|
});
|
|
|
|
/**
|
|
* Toggles bulk edit mode on/off when the edit button is clicked.
|
|
*/
|
|
function onEditButtonClick() {
|
|
console.log('Edit button clicked');
|
|
toggleBulkEditMode(is_bulk_edit);
|
|
}
|
|
|
|
/**
|
|
* Deletes the character with the given chid.
|
|
*
|
|
* @param {string} this_chid - The chid of the character to delete.
|
|
*/
|
|
async function deleteCharacter(this_chid) {
|
|
await handleDeleteCharacter('del_ch', this_chid, false);
|
|
}
|
|
|
|
/**
|
|
* Deletes all characters that have been selected via the bulk checkboxes.
|
|
*/
|
|
async function onDeleteButtonClick() {
|
|
console.log('Delete button clicked');
|
|
|
|
// Create a mapping of chid to avatar
|
|
let toDelete = [];
|
|
$('.bulk_select_checkbox:checked').each((i, el) => {
|
|
const chid = $(el).parent().attr('chid');
|
|
const avatar = characters[chid].avatar;
|
|
// Add the avatar to the list of avatars to delete
|
|
toDelete.push(avatar);
|
|
});
|
|
|
|
const confirm = await callPopup('<h3>Are you sure you want to delete these characters?</h3>You would need to delete the chat files manually.<br>', 'confirm');
|
|
|
|
if (!confirm) {
|
|
console.log('User cancelled delete');
|
|
return;
|
|
}
|
|
|
|
// Delete the characters
|
|
for (const avatar of toDelete) {
|
|
console.log(`Deleting character with avatar ${avatar}`);
|
|
await getCharacters();
|
|
|
|
//chid should be the key of the character with the given avatar
|
|
const chid = Object.keys(characters).find((key) => characters[key].avatar === avatar);
|
|
console.log(`Deleting character with chid ${chid}`);
|
|
await deleteCharacter(chid);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Enables bulk selection by adding a checkbox next to each character.
|
|
*/
|
|
function enableBulkSelect() {
|
|
$('#rm_print_characters_block .character_select').each((i, el) => {
|
|
const checkbox = $('<input type=\'checkbox\' class=\'bulk_select_checkbox\'>');
|
|
checkbox.on('change', () => {
|
|
// Do something when the checkbox is changed
|
|
});
|
|
$(el).prepend(checkbox);
|
|
});
|
|
$('#rm_print_characters_block').addClass('bulk_select');
|
|
// We also need to disable the default click event for the character_select divs
|
|
$(document).on('click', '.bulk_select_checkbox', function (event) {
|
|
event.stopImmediatePropagation();
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Disables bulk selection by removing the checkboxes.
|
|
*/
|
|
function disableBulkSelect() {
|
|
$('.bulk_select_checkbox').remove();
|
|
$('#rm_print_characters_block').removeClass('bulk_select');
|
|
}
|
|
|
|
/**
|
|
* Entry point that runs on page load.
|
|
*/
|
|
jQuery(() => {
|
|
$('#bulkEditButton').on('click', onEditButtonClick);
|
|
$('#bulkDeleteButton').on('click', onDeleteButtonClick);
|
|
});
|