diff --git a/ui/bindings.js b/ui/bindings.js index cd00232..ea60d92 100644 --- a/ui/bindings.js +++ b/ui/bindings.js @@ -6,11 +6,13 @@ import { fetchSupportedModels } from "../core/api.js"; import { setAvailableModels, populateModelDropdown, getLatestUpdateInfo } from "./state.js"; import { fixCommand, testReplyChecker } from "../core/commands.js"; +import { createDrawer } from '../ui/drawer.js'; +import { messageFormatting } from '/script.js'; export function bindModalEvents() { - const container = $("#amily2_drawer_content"); + const container = $("#amily2_drawer_content").length ? $("#amily2_drawer_content") : $("#amily2_chat_optimiser"); - if (container.data("events-bound")) return; + if (!container.length || container.data("events-bound")) return; const snakeToCamel = (s) => s.replace(/_([a-z])/g, (g) => g[1].toUpperCase()); const updateAndSaveSetting = (key, value) => { @@ -34,47 +36,46 @@ export function bindModalEvents() { } }); - container - .off("click.amily2.actions") - .on( - "click.amily2.actions", - "#amily2_refresh_models, #amily2_test, #amily2_fix_now", - async function () { - if (!pluginAuthStatus.authorized) return; - const button = $(this); - const originalHtml = button.html(); - button - .prop("disabled", true) - .html(' 处理中'); - try { - switch (this.id) { - case "amily2_refresh_models": - const models = await fetchSupportedModels(); - if (models.length > 0) { - setAvailableModels(models); + container + .off("click.amily2.actions") + .on( + "click.amily2.actions", + "#amily2_refresh_models, #amily2_test, #amily2_fix_now", + async function () { + if (!pluginAuthStatus.authorized) return; + const button = $(this); + const originalHtml = button.html(); + button + .prop("disabled", true) + .html(' 处理中'); + try { + switch (this.id) { + case "amily2_refresh_models": + const models = await fetchSupportedModels(); + if (models.length > 0) { + setAvailableModels(models); localStorage.setItem( "cached_models_amily2", JSON.stringify(models), ); - populateModelDropdown(); - } - break; - case "amily2_test": - await testReplyChecker(); - break; - case "amily2_fix_now": - await fixCommand(); - break; - } - } catch (error) { - console.error(`[Amily2-工部] 操作按钮 ${this.id} 执行失败:`, error); - toastr.error(`操作失败: ${error.message}`, "Amily2号"); - } finally { - button.prop("disabled", false).html(originalHtml); - } - }, - ); - + populateModelDropdown(); + } + break; + case "amily2_test": + await testReplyChecker(); + break; + case "amily2_fix_now": + await fixCommand(); + break; + } + } catch (error) { + console.error(`[Amily2-工部] 操作按钮 ${this.id} 执行失败:`, error); + toastr.error(`操作失败: ${error.message}`, "Amily2号"); + } finally { + button.prop("disabled", false).html(originalHtml); + } + }, + ); container .off("click.amily2.expand_editor") @@ -106,138 +107,149 @@ export function bindModalEvents() { dialogElement[0].showModal(); }); - container - .off("click.amily2.update") - .on("click.amily2.update", "#amily2_update_button", function() { - $("#amily2_update_indicator").hide(); + container + .off("click.amily2.update") + .on("click.amily2.update", "#amily2_update_button", function() { + $("#amily2_update_indicator").hide(); + const updateInfo = getLatestUpdateInfo(); + if (updateInfo && updateInfo.changelog) { + const formattedChangelog = messageFormatting(updateInfo.changelog); - const updateInfo = getLatestUpdateInfo(); - if (updateInfo && updateInfo.changelog) { - const dialogHtml = ` + + const dialogHtml = ` - `; - const dialogElement = $(dialogHtml).appendTo('body'); - const closeDialog = () => { dialogElement[0].close(); dialogElement.remove(); }; - dialogElement.find('.popup-button-ok').on('click', closeDialog); - dialogElement[0].showModal(); + `; + const dialogElement = $(dialogHtml).appendTo('body'); + const closeDialog = () => { dialogElement[0].close(); dialogElement.remove(); }; + dialogElement.find('.popup-button-ok').on('click', closeDialog); + dialogElement[0].showModal(); + } else { + toastr.info("未能获取到云端情报,请稍后再试。", "情报部回报"); + } + }); - } else { - toastr.info("未能获取到云端情报,请稍后再试。", "情报部回报"); - } - }); + container + .off("change.amily2.checkbox") + .on( + "change.amily2.checkbox", + 'input[type="checkbox"][id^="amily2_"]', + function () { + if (!pluginAuthStatus.authorized) return; + const key = snakeToCamel(this.id.replace("amily2_", "")); + updateAndSaveSetting(key, this.checked); + }, + ); - container - .off("change.amily2.checkbox") - .on( - "change.amily2.checkbox", - 'input[type="checkbox"][id^="amily2_"]', - function () { - if (!pluginAuthStatus.authorized) return; - const key = snakeToCamel(this.id.replace("amily2_", "")); - updateAndSaveSetting(key, this.checked); - }, - ); + container + .off("change.amily2.radio") + .on( + "change.amily2.radio", + 'input[type="radio"][name^="amily2_"]:not([name="amily2_icon_location"])', // 排除我们的特殊开关 + function () { + if (!pluginAuthStatus.authorized) return; + const key = snakeToCamel(this.name.replace("amily2_", "")); + const value = $(`input[name="${this.name}"]:checked`).val(); + updateAndSaveSetting(key, value); + }, + ); + container + .off("change.amily2.text") + .on("change.amily2.text", "#amily2_api_url, #amily2_api_key", function () { + if (!pluginAuthStatus.authorized) return; + const key = snakeToCamel(this.id.replace("amily2_", "")); + updateAndSaveSetting(key, this.value); + toastr.success(`配置 [${key}] 已自动保存!`, "Amily2号"); + }); - container - .off("change.amily2.radio") - .on( - "change.amily2.radio", - 'input[type="radio"][name^="amily2_"]', - function () { - if (!pluginAuthStatus.authorized) return; - const key = snakeToCamel(this.name.replace("amily2_", "")); - const value = $(`input[name="${this.name}"]:checked`).val(); - updateAndSaveSetting(key, value); - }, - ); + container + .off("change.amily2.select") + .on("change.amily2.select", "select#amily2_model", function () { + if (!pluginAuthStatus.authorized) return; + const key = snakeToCamel(this.id.replace("amily2_", "")); + updateAndSaveSetting(key, this.value); + populateModelDropdown(); + }); - container - .off("change.amily2.text") - .on("change.amily2.text", "#amily2_api_url, #amily2_api_key", function () { - if (!pluginAuthStatus.authorized) return; - const key = snakeToCamel(this.id.replace("amily2_", "")); - updateAndSaveSetting(key, this.value); - toastr.success(`配置 [${key}] 已自动保存!`, "Amily2号"); - }); + container + .off("input.amily2.range") + .on( + "input.amily2.range", + 'input[type="range"][id^="amily2_"]', + function () { + if (!pluginAuthStatus.authorized) return; + const key = snakeToCamel(this.id.replace("amily2_", "")); + const value = this.id.includes("temperature") + ? parseFloat(this.value) + : parseInt(this.value, 10); + $(`#${this.id}_value`).text(value); + updateAndSaveSetting(key, value); + }, + ); + const promptMap = { + mainPrompt: "#amily2_main_prompt", + systemPrompt: "#amily2_system_prompt", + summarizationPrompt: "#amily2_summarization_prompt", + outputFormatPrompt: "#amily2_output_format_prompt", + }; + const selector = "#amily2_prompt_selector"; + const editor = "#amily2_unified_editor"; + const unifiedSaveButton = "#amily2_unified_save_button"; - container - .off("change.amily2.select") - .on("change.amily2.select", "select#amily2_model", function () { - if (!pluginAuthStatus.authorized) return; - const key = snakeToCamel(this.id.replace("amily2_", "")); - updateAndSaveSetting(key, this.value); - populateModelDropdown(); - }); + function updateEditorView() { + if (!$(selector).length) return; + const selectedKey = $(selector).val(); + if (!selectedKey) return; + const content = extension_settings[extensionName][selectedKey] || ""; + $(editor).val(content); + } + container + .off("change.amily2.prompt_selector") + .on("change.amily2.prompt_selector", selector, updateEditorView); - container - .off("input.amily2.range") - .on( - "input.amily2.range", - 'input[type="range"][id^="amily2_"]', - function () { - if (!pluginAuthStatus.authorized) return; - const key = snakeToCamel(this.id.replace("amily2_", "")); - const value = this.id.includes("temperature") - ? parseFloat(this.value) - : parseInt(this.value, 10); - $(`#${this.id}_value`).text(value); - updateAndSaveSetting(key, value); - }, - ); + container + .off("click.amily2.unified_save") + .on("click.amily2.unified_save", unifiedSaveButton, function () { + const selectedKey = $(selector).val(); + if (!selectedKey) return; + const newContent = $(editor).val(); + updateAndSaveSetting(selectedKey, newContent); + toastr.success(`谕令 [${selectedKey}] 已镌刻!`, "Amily2号"); + }); + container + .off("click.amily2.unified_restore") + .on("click.amily2.unified_restore", "#amily2_unified_restore_button", function () { + const selectedKey = $(selector).val(); + if (!selectedKey) return; + const defaultValue = defaultSettings[selectedKey]; + $(editor).val(defaultValue); + updateAndSaveSetting(selectedKey, defaultValue); + toastr.success(`谕令 [${selectedKey}] 已成功恢复为帝国初始蓝图。`, "Amily2号"); + }); - const promptMap = { - mainPrompt: "#amily2_main_prompt", - systemPrompt: "#amily2_system_prompt", - summarizationPrompt: "#amily2_summarization_prompt", - outputFormatPrompt: "#amily2_output_format_prompt", - }; - const selector = "#amily2_prompt_selector"; - const editor = "#amily2_unified_editor"; - const unifiedSaveButton = "#amily2_unified_save_button"; + setTimeout(updateEditorView, 100); - function updateEditorView() { - const selectedKey = $(selector).val(); - if (!selectedKey) return; - const content = extension_settings[extensionName][selectedKey] || ""; - $(editor).val(content); - } - - - container - .off("change.amily2.prompt_selector") - .on("change.amily2.prompt_selector", selector, updateEditorView); - - container - .off("click.amily2.unified_save") - .on("click.amily2.unified_save", unifiedSaveButton, function () { - const selectedKey = $(selector).val(); - if (!selectedKey) return; - const newContent = $(editor).val(); - updateAndSaveSetting(selectedKey, newContent); - toastr.success(`谕令 [${selectedKey}] 已镌刻!`, "Amily2号"); - }); - - container - .off("click.amily2.unified_restore") - .on("click.amily2.unified_restore", "#amily2_unified_restore_button", function () { - const selectedKey = $(selector).val(); - if (!selectedKey) return; - const defaultValue = defaultSettings[selectedKey]; - $(editor).val(defaultValue); - updateAndSaveSetting(selectedKey, defaultValue); - toastr.success(`谕令 [${selectedKey}] 已成功恢复为帝国初始蓝图。`, "Amily2号"); - }); - - setTimeout(updateEditorView, 100); - - container.data("events-bound", true); + container.data("events-bound", true); } +$(document).on('change', 'input[name="amily2_icon_location"]', function() { + if (!pluginAuthStatus.authorized) return; + const newLocation = $(this).val(); + extension_settings[extensionName]['iconLocation'] = newLocation; + saveSettingsDebounced(); + console.log(`[Amily-禁卫军] 收到迁都指令 -> ${newLocation}。圣意已存档。`); + toastr.info(`正在将帝国徽记迁往 [${newLocation === 'topbar' ? '顶栏' : '扩展区'}]...`, "迁都令", { timeOut: 2000 }); + $('#amily2_main_drawer').remove(); + $(document).off("mousedown.amily2Drawer"); + $('#amily2_extension_frame').remove(); + + setTimeout(createDrawer, 50); +});