Implement data clean-up dialog (#4072)

* [wip] Add user data cleanup service

* Add clean-up report viewer

* Fix review comments

* Add function comments

* Implement item actions

* Fix UI styles

* Add placeholder for empty results, update category description view

* Add displayEmptyPlaceholder method to show message when results list is empty

* Adjust menu buttons row

* Delete char-scoped data bank attachments on character deletion

* Data Bank: Handle character attachments on rename

* Remove line breaks in description strings

* Drop the category when the last item is deleted

* Skip invalid hashes instead of bailing
This commit is contained in:
Cohee
2025-06-01 13:56:34 +03:00
committed by GitHub
parent 7f47f84c9f
commit 3ec9b1a099
15 changed files with 1475 additions and 62 deletions

View File

@@ -216,8 +216,37 @@ function cleanUpAttachments() {
}
}
/**
* Clean up character attachments when a character is deleted.
* @param {{character: import('../../char-data.js').v1CharData}} data Event data
*/
function cleanUpCharacterAttachments(data) {
const avatar = data?.character?.avatar;
if (!avatar) return;
if (Array.isArray(extension_settings?.character_attachments?.[avatar])) {
delete extension_settings.character_attachments[avatar];
saveSettingsDebounced();
}
}
/**
* Handle character rename event to update character attachments.
* @param {string} oldAvatar Old avatar name
* @param {string} newAvatar New avatar name
*/
function handleCharacterRename(oldAvatar, newAvatar) {
if (!oldAvatar || !newAvatar) return;
if (Array.isArray(extension_settings?.character_attachments?.[oldAvatar])) {
extension_settings.character_attachments[newAvatar] = extension_settings.character_attachments[oldAvatar];
delete extension_settings.character_attachments[oldAvatar];
saveSettingsDebounced();
}
}
jQuery(async () => {
eventSource.on(event_types.APP_READY, cleanUpAttachments);
eventSource.on(event_types.CHARACTER_DELETED, cleanUpCharacterAttachments);
eventSource.on(event_types.CHARACTER_RENAMED, handleCharacterRename);
const manageButton = await renderExtensionTemplateAsync('attachments', 'manage-button', {});
const attachButton = await renderExtensionTemplateAsync('attachments', 'attach-button', {});
$('#data_bank_wand_container').append(manageButton);