Update bindings.js

This commit is contained in:
2025-10-04 02:35:49 +08:00
committed by GitHub
parent b16c44edd7
commit 9ca486c8ae

View File

@@ -99,14 +99,11 @@ function updateApiProviderUI() {
} }
function bindAmily2ModalWorldBookSettings() { function bindAmily2ModalWorldBookSettings() {
if (!extension_settings[extensionName]) {
extension_settings[extensionName] = {};
}
const settings = extension_settings[extensionName]; const settings = extension_settings[extensionName];
// Initialize settings with unique keys
if (settings.amily2_wb_enabled === undefined) settings.amily2_wb_enabled = false;
if (settings.amily2_wb_source === undefined) settings.amily2_wb_source = 'character';
if (settings.amily2_wb_selected_worldbooks === undefined) settings.amily2_wb_selected_worldbooks = [];
if (settings.amily2_wb_selected_entries === undefined) settings.amily2_wb_selected_entries = {};
const enabledCheckbox = document.getElementById('amily2_wb_enabled'); const enabledCheckbox = document.getElementById('amily2_wb_enabled');
const optionsContainer = document.getElementById('amily2_wb_options_container'); const optionsContainer = document.getElementById('amily2_wb_options_container');
const sourceRadios = document.querySelectorAll('input[name="amily2_wb_source"]'); const sourceRadios = document.querySelectorAll('input[name="amily2_wb_source"]');
@@ -119,27 +116,23 @@ function bindAmily2ModalWorldBookSettings() {
return; return;
} }
const saveSelectedEntries = () => { // Ensure settings objects exist before reading
const selected = {}; if (settings.modal_amily2_wb_selected_worldbooks === undefined) {
entryListContainer.querySelectorAll('input[type="checkbox"]:checked').forEach(cb => { settings.modal_amily2_wb_selected_worldbooks = [];
const book = cb.dataset.book;
const uid = cb.dataset.uid;
if (!selected[book]) {
selected[book] = [];
} }
selected[book].push(uid); if (settings.modal_amily2_wb_selected_entries === undefined) {
}); settings.modal_amily2_wb_selected_entries = {};
settings.amily2_wb_selected_entries = selected; }
saveSettingsDebounced();
};
const renderWorldBookEntries = async () => { const renderWorldBookEntries = async () => {
entryListContainer.innerHTML = '<p class="notes">Loading entries...</p>'; entryListContainer.innerHTML = '<p class="notes">Loading entries...</p>';
const source = settings.amily2_wb_source || 'character'; const source = settings.modal_wbSource || 'character';
let bookNames = []; let bookNames = [];
if (source === 'manual') { if (source === 'manual') {
bookNames = settings.amily2_wb_selected_worldbooks || []; bookNames = settings.modal_amily2_wb_selected_worldbooks || [];
} else { } else {
if (this_chid !== undefined && this_chid >= 0 && characters[this_chid]) { if (this_chid !== undefined && this_chid >= 0 && characters[this_chid]) {
try { try {
@@ -189,7 +182,7 @@ function bindAmily2ModalWorldBookSettings() {
checkbox.dataset.book = entry.bookName; checkbox.dataset.book = entry.bookName;
checkbox.dataset.uid = entry.uid; checkbox.dataset.uid = entry.uid;
const isChecked = settings.amily2_wb_selected_entries[entry.bookName]?.includes(String(entry.uid)); const isChecked = settings.modal_amily2_wb_selected_entries[entry.bookName]?.includes(String(entry.uid));
checkbox.checked = !!isChecked; checkbox.checked = !!isChecked;
const label = document.createElement('label'); const label = document.createElement('label');
@@ -224,19 +217,7 @@ function bindAmily2ModalWorldBookSettings() {
checkbox.style.marginRight = '5px'; checkbox.style.marginRight = '5px';
checkbox.id = `amily2-wb-check-${bookName}`; checkbox.id = `amily2-wb-check-${bookName}`;
checkbox.value = bookName; checkbox.value = bookName;
checkbox.checked = settings.amily2_wb_selected_worldbooks.includes(bookName); checkbox.checked = settings.modal_amily2_wb_selected_worldbooks.includes(bookName);
checkbox.addEventListener('change', () => {
if (checkbox.checked) {
if (!settings.amily2_wb_selected_worldbooks.includes(bookName)) {
settings.amily2_wb_selected_worldbooks.push(bookName);
}
} else {
settings.amily2_wb_selected_worldbooks = settings.amily2_wb_selected_worldbooks.filter(name => name !== bookName);
}
saveSettingsDebounced();
renderWorldBookEntries();
});
const label = document.createElement('label'); const label = document.createElement('label');
label.htmlFor = `amily2-wb-check-${bookName}`; label.htmlFor = `amily2-wb-check-${bookName}`;
@@ -261,7 +242,7 @@ function bindAmily2ModalWorldBookSettings() {
optionsContainer.style.display = isEnabled ? 'block' : 'none'; optionsContainer.style.display = isEnabled ? 'block' : 'none';
if (isEnabled) { if (isEnabled) {
const isManual = settings.amily2_wb_source === 'manual'; const isManual = settings.modal_wbSource === 'manual';
manualSelectWrapper.style.display = isManual ? 'block' : 'none'; manualSelectWrapper.style.display = isManual ? 'block' : 'none';
renderWorldBookEntries(); renderWorldBookEntries();
if (isManual) { if (isManual) {
@@ -271,36 +252,171 @@ function bindAmily2ModalWorldBookSettings() {
}; };
// Initial state setup // Initial state setup
enabledCheckbox.checked = settings.amily2_wb_enabled; enabledCheckbox.checked = settings.modal_wbEnabled ?? false;
const source = settings.modal_wbSource ?? 'character';
sourceRadios.forEach(radio => { sourceRadios.forEach(radio => {
radio.checked = radio.value === settings.amily2_wb_source; radio.checked = radio.value === source;
}); });
updateVisibility(); updateVisibility();
// Event Listeners // Event Listeners
enabledCheckbox.addEventListener('change', () => { $(enabledCheckbox).off('change.amily2_wb').on('change.amily2_wb', () => {
settings.amily2_wb_enabled = enabledCheckbox.checked; extension_settings[extensionName].modal_wbEnabled = enabledCheckbox.checked;
saveSettingsDebounced(); saveSettingsDebounced();
updateVisibility(); updateVisibility();
}); });
sourceRadios.forEach(radio => { $(sourceRadios).off('change.amily2_wb').on('change.amily2_wb', (event) => {
radio.addEventListener('change', () => { if (event.target.checked) {
if (radio.checked) { extension_settings[extensionName].modal_wbSource = event.target.value;
settings.amily2_wb_source = radio.value;
saveSettingsDebounced(); saveSettingsDebounced();
updateVisibility(); updateVisibility();
} }
}); });
$(bookListContainer).off('change.amily2_wb').on('change.amily2_wb', (event) => {
if (event.target.type === 'checkbox' && event.target.id.startsWith('amily2-wb-check-')) {
const checkbox = event.target;
const bookName = checkbox.value;
if (!settings.modal_amily2_wb_selected_worldbooks) {
settings.modal_amily2_wb_selected_worldbooks = [];
}
if (checkbox.checked) {
if (!settings.modal_amily2_wb_selected_worldbooks.includes(bookName)) {
settings.modal_amily2_wb_selected_worldbooks.push(bookName);
}
} else {
const index = settings.modal_amily2_wb_selected_worldbooks.indexOf(bookName);
if (index > -1) {
settings.modal_amily2_wb_selected_worldbooks.splice(index, 1);
}
if (settings.modal_amily2_wb_selected_entries) {
delete settings.modal_amily2_wb_selected_entries[bookName];
}
}
saveSettingsDebounced();
renderWorldBookEntries();
}
}); });
entryListContainer.addEventListener('change', (event) => { $(entryListContainer).off('change.amily2_wb').on('change.amily2_wb', (event) => {
if (event.target.type === 'checkbox') { if (event.target.type === 'checkbox') {
saveSelectedEntries(); const checkbox = event.target;
const book = checkbox.dataset.book;
const uid = checkbox.dataset.uid;
if (!settings.modal_amily2_wb_selected_entries) {
settings.modal_amily2_wb_selected_entries = {};
} }
if (!settings.modal_amily2_wb_selected_entries[book]) {
settings.modal_amily2_wb_selected_entries[book] = [];
}
const entryIndex = settings.modal_amily2_wb_selected_entries[book].indexOf(uid);
if (checkbox.checked) {
if (entryIndex === -1) {
settings.modal_amily2_wb_selected_entries[book].push(uid);
}
} else {
if (entryIndex > -1) {
settings.modal_amily2_wb_selected_entries[book].splice(entryIndex, 1);
}
}
if (settings.modal_amily2_wb_selected_entries[book].length === 0) {
delete settings.modal_amily2_wb_selected_entries[book];
}
saveSettingsDebounced();
}
});
// Search and Select/Deselect All Logic
const bookSearchInput = document.getElementById('amily2_wb_book_search');
const bookSelectAllBtn = document.getElementById('amily2_wb_book_select_all');
const bookDeselectAllBtn = document.getElementById('amily2_wb_book_deselect_all');
const entrySearchInput = document.getElementById('amily2_wb_entry_search');
const entrySelectAllBtn = document.getElementById('amily2_wb_entry_select_all');
const entryDeselectAllBtn = document.getElementById('amily2_wb_entry_deselect_all');
bookSearchInput.addEventListener('input', () => {
const searchTerm = bookSearchInput.value.toLowerCase();
const items = bookListContainer.querySelectorAll('.checkbox-item');
items.forEach(item => {
const label = item.querySelector('label');
if (label.textContent.toLowerCase().includes(searchTerm)) {
item.style.display = 'flex';
} else {
item.style.display = 'none';
}
});
});
entrySearchInput.addEventListener('input', () => {
const searchTerm = entrySearchInput.value.toLowerCase();
const items = entryListContainer.querySelectorAll('.checkbox-item');
items.forEach(item => {
const label = item.querySelector('label');
if (label.textContent.toLowerCase().includes(searchTerm)) {
item.style.display = 'flex';
} else {
item.style.display = 'none';
}
});
});
bookSelectAllBtn.addEventListener('click', () => {
const checkboxes = bookListContainer.querySelectorAll('.checkbox-item input[type="checkbox"]');
checkboxes.forEach(checkbox => {
if (checkbox.parentElement.style.display !== 'none' && !checkbox.checked) {
$(checkbox).prop('checked', true).trigger('change');
}
});
});
bookDeselectAllBtn.addEventListener('click', () => {
const checkboxes = bookListContainer.querySelectorAll('.checkbox-item input[type="checkbox"]');
checkboxes.forEach(checkbox => {
if (checkbox.parentElement.style.display !== 'none' && checkbox.checked) {
$(checkbox).prop('checked', false).trigger('change');
}
});
});
entrySelectAllBtn.addEventListener('click', () => {
const checkboxes = entryListContainer.querySelectorAll('.checkbox-item input[type="checkbox"]');
checkboxes.forEach(checkbox => {
if (checkbox.parentElement.style.display !== 'none' && !checkbox.checked) {
$(checkbox).prop('checked', true).trigger('change');
}
});
});
entryDeselectAllBtn.addEventListener('click', () => {
const checkboxes = entryListContainer.querySelectorAll('.checkbox-item input[type="checkbox"]');
checkboxes.forEach(checkbox => {
if (checkbox.parentElement.style.display !== 'none' && checkbox.checked) {
$(checkbox).prop('checked', false).trigger('change');
}
});
}); });
console.log('[Amily2 Modal] World book settings bound successfully.'); console.log('[Amily2 Modal] World book settings bound successfully.');
document.addEventListener('renderAmily2WorldBook', () => {
console.log('[Amily2 Modal] Received render event from state update.');
updateVisibility();
});
eventSource.on(event_types.CHAT_CHANGED, () => {
console.log('[Amily2 Modal] Chat changed, re-rendering world book entries.');
if (document.getElementById('amily2_wb_options_container')?.style.display === 'block') {
renderWorldBookEntries();
}
});
} }
export function bindModalEvents() { export function bindModalEvents() {
@@ -342,7 +458,7 @@ export function bindModalEvents() {
if (!extension_settings[extensionName]) { if (!extension_settings[extensionName]) {
extension_settings[extensionName] = {}; extension_settings[extensionName] = {};
} }
extension_settings[extensionName] = { ...extension_settings[extensionName], [key]: value }; extension_settings[extensionName][key] = value;
saveSettingsDebounced(); saveSettingsDebounced();
console.log(`[Amily-谕令镌刻] [${key}] 的新状态已保存。`); console.log(`[Amily-谕令镌刻] [${key}] 的新状态已保存。`);
}; };
@@ -598,7 +714,7 @@ container
.off("change.amily2.checkbox") .off("change.amily2.checkbox")
.on( .on(
"change.amily2.checkbox", "change.amily2.checkbox",
'input[type="checkbox"][id^="amily2_"]', 'input[type="checkbox"][id^="amily2_"]:not([id^="amily2_wb_enabled"])',
function (event) { function (event) {
if (!pluginAuthStatus.authorized) return; if (!pluginAuthStatus.authorized) return;
@@ -666,7 +782,7 @@ container
.off("change.amily2.radio") .off("change.amily2.radio")
.on( .on(
"change.amily2.radio", "change.amily2.radio",
'input[type="radio"][name^="amily2_"]:not([name="amily2_icon_location"])', 'input[type="radio"][name^="amily2_"]:not([name="amily2_icon_location"]):not([name="amily2_wb_source"])',
function () { function () {
if (!pluginAuthStatus.authorized) return; if (!pluginAuthStatus.authorized) return;
const key = snakeToCamel(this.name.replace("amily2_", "")); const key = snakeToCamel(this.name.replace("amily2_", ""));