mirror of
https://github.com/SillyTavern/SillyTavern.git
synced 2024-12-13 10:00:36 +01:00
80f4bd4d9e
- (!) Refactor character list and filter redrawing to one global debounce - Refactor all places where character list and filters where redrawn to the correct usage (hope I didn't miss any) - Automatically redraw character list on each tag bulk edit - Fix tags not being sorted in bulk edit mutual tags list - Refactor bulk tag edit class to actually be an instance object - Remember scroll position on character list redraw - unless it's a full refresh
129 lines
4.1 KiB
JavaScript
129 lines
4.1 KiB
JavaScript
import { characters, getCharacters, handleDeleteCharacter, callPopup, characterGroupOverlay } from '../script.js';
|
|
import { BulkEditOverlay, BulkEditOverlayState } from './BulkEditOverlay.js';
|
|
|
|
|
|
let is_bulk_edit = false;
|
|
|
|
const enableBulkEdit = () => {
|
|
enableBulkSelect();
|
|
characterGroupOverlay.selectState();
|
|
// show the bulk edit option buttons
|
|
$('.bulkEditOptionElement').show();
|
|
is_bulk_edit = true;
|
|
characterGroupOverlay.updateSelectedCount(0);
|
|
};
|
|
|
|
const disableBulkEdit = () => {
|
|
disableBulkSelect();
|
|
characterGroupOverlay.browseState();
|
|
// hide the bulk edit option buttons
|
|
$('.bulkEditOptionElement').hide();
|
|
is_bulk_edit = false;
|
|
characterGroupOverlay.updateSelectedCount(0);
|
|
};
|
|
|
|
const toggleBulkEditMode = (isBulkEdit) => {
|
|
if (isBulkEdit) {
|
|
disableBulkEdit();
|
|
} else {
|
|
enableBulkEdit();
|
|
}
|
|
};
|
|
|
|
characterGroupOverlay.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);
|
|
}
|
|
|
|
/**
|
|
* Toggles the select state of all characters in bulk edit mode to selected. If all are selected, they'll be deselected.
|
|
*/
|
|
function onSelectAllButtonClick() {
|
|
console.log('Bulk select all button clicked');
|
|
const characters = Array.from(document.querySelectorAll('#' + BulkEditOverlay.containerId + ' .' + BulkEditOverlay.characterClass));
|
|
let atLeastOneSelected = false;
|
|
for (const character of characters) {
|
|
const checked = $(character).find('.bulk_select_checkbox:checked').length > 0;
|
|
if (!checked && character instanceof HTMLElement) {
|
|
characterGroupOverlay.toggleSingleCharacter(character);
|
|
atLeastOneSelected = true;
|
|
}
|
|
}
|
|
|
|
if (!atLeastOneSelected) {
|
|
// If none was selected, trigger click on all to deselect all of them
|
|
for(const character of characters) {
|
|
const checked = $(character).find('.bulk_select_checkbox:checked') ?? false;
|
|
if (checked && character instanceof HTMLElement) {
|
|
characterGroupOverlay.toggleSingleCharacter(character);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 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');
|
|
|
|
// We just let the button trigger the context menu delete option
|
|
await characterGroupOverlay.handleContextMenuDelete();
|
|
}
|
|
|
|
/**
|
|
* Enables bulk selection by adding a checkbox next to each character.
|
|
*/
|
|
function enableBulkSelect() {
|
|
$('#rm_print_characters_block .character_select').each((i, el) => {
|
|
// Prevent checkbox from adding multiple times (because of stage change callback)
|
|
if ($(el).find('.bulk_select_checkbox').length > 0) {
|
|
return;
|
|
}
|
|
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);
|
|
$('#bulkSelectAllButton').on('click', onSelectAllButtonClick);
|
|
$('#bulkDeleteButton').on('click', onDeleteButtonClick);
|
|
});
|