diff --git a/templates/admin.html b/templates/admin.html index 1e12c21..87aef15 100644 --- a/templates/admin.html +++ b/templates/admin.html @@ -223,20 +223,20 @@
-
-
- +
+
+
-
请输入有效的JSON格式配置信息
-
0 行 | 0 字符
+
0 行 | 0 字符
-
+
@@ -261,20 +261,20 @@
-
-
- +
+
+
-
请输入有效的JSON格式配置信息
-
0 行 | 0 字符
+
0 行 | 0 字符
-
+
@@ -489,160 +489,128 @@ } }); - // 添加Ace编辑器的CDN引用 - function loadAceEditor() { - if (typeof ace === 'undefined') { - // 如果ace未定义,直接初始化编辑器 - initAceEditor(); - } else { - initAceEditor(); - } + // json编辑器处理 + function initAceEditor(editorElement) { + const editor = ace.edit(editorElement); + const editorArea = editorElement.closest('.json-editor-area'); + const parentContainer = editorArea.closest('.mb-3'); // Get parent container + const configTextarea = editorArea.querySelector('.json-config-textarea'); + const lineCountSpan = parentContainer.querySelector('.json-line-count'); // Search from parent + const charCountSpan = parentContainer.querySelector('.json-char-count'); // Search from parent + + editor.setTheme("ace/theme/monokai"); + editor.session.setMode("ace/mode/json"); + editor.setOptions({ + fontSize: "12pt", + showPrintMargin: false, + enableBasicAutocompletion: true, + enableLiveAutocompletion: true + }); + + // 同步到隐藏的textarea并更新计数 + editor.getSession().on('change', function() { + const value = editor.getSession().getValue(); + configTextarea.value = value; + lineCountSpan.textContent = editor.getSession().getLength(); + charCountSpan.textContent = value.length; + }); + + // 触发一次change事件以初始化计数 + editor.getSession().setValue(configTextarea.value, -1); + + return editor; } + function setupJsonEditors() { + document.querySelectorAll('.ace-editor').forEach(editorElement => { + const editor = initAceEditor(editorElement); + const editorArea = editorElement.closest('.json-editor-area'); + const formatButton = editorArea.querySelector('.format-json-btn'); + const parentContainer = editorArea.closest('.mb-3'); // Get parent container + const errorDisplay = parentContainer.querySelector('.json-error'); // Search from parent - // json编辑器处理 - function initAceEditor() { - // 初始化编辑器 - const editor = ace.edit("jsonEditor"); - const editor1 = ace.edit("jsonEditor1"); - - // 配置两个编辑器 - const configureEditor = function(editor, configId, lineCountId, charCountId) { - editor.setTheme("ace/theme/monokai"); - editor.session.setMode("ace/mode/json"); - editor.setOptions({ - fontSize: "12pt", - showPrintMargin: false, - enableBasicAutocompletion: true, - enableLiveAutocompletion: true + // 格式化按钮事件 + formatButton.addEventListener('click', function() { + try { + const json = JSON.parse(editor.getSession().getValue()); + editor.setValue(JSON.stringify(json, null, 2), -1); + errorDisplay.textContent = ''; + errorDisplay.style.display = 'none'; + editorElement.classList.remove('border-danger'); + } catch (e) { + errorDisplay.textContent = '无效的JSON格式: ' + e.message; + errorDisplay.style.display = 'block'; + editorElement.classList.add('border-danger'); + } }); - // 同步到隐藏的textarea - editor.getSession().on('change', function() { - document.getElementById(configId).value = editor.getSession().getValue(); - document.getElementById(lineCountId).textContent = editor.getSession().getLength(); - document.getElementById(charCountId).textContent = editor.getSession().getValue().length; - }); - }; - - // 应用配置到两个编辑器 - configureEditor(editor, 'jsonConfig', 'jsonLineCount', 'jsonCharCount'); - configureEditor(editor1, 'jsonConfig1', 'jsonLineCount1', 'jsonCharCount1'); - - // 格式化按钮 - document.getElementById('formatJsonBtn').addEventListener('click', function() { - const activeEditor = document.activeElement.closest('#jsonEditor') ? editor : - document.activeElement.closest('#jsonEditor1') ? editor1 : editor; - const editorElement = activeEditor === editor ? 'jsonEditor' : 'jsonEditor1'; - - try { - const json = JSON.parse(activeEditor.getSession().getValue()); - activeEditor.setValue(JSON.stringify(json, null, 2), -1); - document.getElementById('jsonError').textContent = ''; - document.getElementById(editorElement).classList.remove('border-danger'); - } catch (e) { - document.getElementById('jsonError').textContent = '无效的JSON格式: ' + e.message; - document.getElementById('jsonError').style.display = 'block'; - document.getElementById(editorElement).classList.add('border-danger'); + // 默认设置一个空的JSON结构 + const emptyJson = { + "provider_name": "", + "config": {}, + "auth": {} + }; + const jsonString = JSON.stringify(emptyJson, null, 2); + if (!editor.getValue()) { + editor.setValue(jsonString, -1); } }); } document.addEventListener('DOMContentLoaded', function() { - loadAceEditor(); + setupJsonEditors(); // 初始化所有编辑器 }); - // 设置默认JSON模板 + // 设置默认JSON模板 (Add Modal specific) document.getElementById('driveType').addEventListener('change', function() { - const editor = ace.edit("jsonEditor"); + const addModalEditorArea = document.querySelector('#addAccountModal .json-editor-area'); + const editorElement = addModalEditorArea.querySelector('.ace-editor'); + const editor = ace.edit(editorElement); // Get the Ace editor instance const selectedType = this.value; if (selectedType) { let defaultJson = {}; - - // 获取所有网盘提供商数据 - const providers = JSON.parse('{{ providers | tojson }}'); - - // 查找选中的网盘提供商 + const providers = JSON.parse('{{ providers | tojson | safe }}'); // Use safe filter const selectedProvider = providers.find(provider => provider.provider_name === selectedType); if (selectedProvider && selectedProvider.config_vars) { - // 如果找到对应的提供商配置,直接使用 defaultJson = selectedProvider.config_vars; } else { - // 如果没有找到对应配置,使用默认模板 defaultJson = { "provider_name": selectedType, - "config": { - "api_key": "", - "secret_key": "", - "redirect_uri": "" - }, - "auth": { - "token": "", - "expires_in": 0 - } + "config": { "api_key": "", "secret_key": "", "redirect_uri": "" }, + "auth": { "token": "", "expires_in": 0 } }; } - - // 设置编辑器内容 editor.setValue(JSON.stringify(defaultJson, null, 2), -1); } }); - // 设置编辑用户驱动JSON模板 - document.getElementById('editudrivebtn').addEventListener('click', function() { - const editor = ace.edit("jsonEditor1"); - const selectedtid = this.getAttribute('tid'); - if (selectedtid) { - let defaultJson = {}; + // 设置编辑用户驱动JSON模板 (Edit Modal specific) + document.querySelectorAll('#editudrivebtn').forEach(button => { + button.addEventListener('click', function() { + const editModalEditorArea = document.querySelector('#editudriveModal .json-editor-area'); + const editorElement = editModalEditorArea.querySelector('.ace-editor'); + const editor = ace.edit(editorElement); // Get the Ace editor instance + const selectedtid = this.getAttribute('tid'); - // 获取所有网盘提供商数据 - const user_drives = JSON.parse('{{ alluser_drives | tojson }}'); - // 查找选中的网盘提供商 - console.log(typeof(selectedtid)); - const selectedUdrive = user_drives.find(user_drive => user_drive.id == selectedtid); - console.log(selectedtid,selectedUdrive) - if (selectedUdrive && selectedUdrive.login_config) { - // 如果找到对应的提供商配置,直接使用 - defaultJson = selectedUdrive.login_config; - } else { - // 如果没有找到对应配置,使用默认模板 - defaultJson = { - "provider_name": selectedtid, - "config": { - "api_key": "", - "secret_key": "", - "redirect_uri": "" - }, - "auth": { - "token": "", - "expires_in": 0 - } - }; + if (selectedtid) { + let defaultJson = {}; + const user_drives = JSON.parse('{{ alluser_drives | tojson | safe }}'); // Use safe filter + const selectedUdrive = user_drives.find(user_drive => user_drive.id == selectedtid); + + if (selectedUdrive && selectedUdrive.login_config) { + defaultJson = selectedUdrive.login_config; + } else { + defaultJson = { + "provider_name": selectedtid, // Keep provider_name for context if no config + "config": { "api_key": "", "secret_key": "", "redirect_uri": "" }, + "auth": { "token": "", "expires_in": 0 } + }; + } + editor.setValue(JSON.stringify(defaultJson, null, 2), -1); } - - // 设置编辑器内容 - editor.setValue(JSON.stringify(defaultJson, null, 2), -1); - } - }); - - // 初始化时设置一个空的JSON结构 - window.addEventListener('load', function() { - const editor = ace.edit("jsonEditor"); - const editor1 = ace.edit("jsonEditor1"); - const emptyJson = { - "provider_name": "", - "config": {}, - "auth": {} - }; - const jsonString = JSON.stringify(emptyJson, null, 2); - - // 为两个编辑器设置相同的初始值 - editor.setValue(jsonString, -1); - editor1.setValue(jsonString, -1); - document.getElementById('jsonConfig').value = jsonString; - document.getElementById('jsonConfig1').value = jsonString; + }); });