diff --git a/src/lang/locale/en.ts b/src/lang/locale/en.ts index d72aca7..5059f39 100644 --- a/src/lang/locale/en.ts +++ b/src/lang/locale/en.ts @@ -245,7 +245,7 @@ export default { // RAG Section RAG: { - title: 'RAG', + title: 'RAG(advanced)', includePatterns: 'Include patterns', includePatternsDescription: 'If any patterns are specified, ONLY files matching at least one pattern will be included in indexing. One pattern per line. Uses glob patterns (e.g., "notes/*", "*.md"). Leave empty to include all files not excluded by exclude patterns. After changing this, use the command "Rebuild entire vault index" to apply changes.', testPatterns: 'Test patterns', @@ -269,7 +269,7 @@ export default { // AutoComplete Section AutoComplete: { // Basic AutoComplete Settings - title: 'AutoComplete', + title: 'AutoComplete(advanced)', enable: 'Enable', enableDescription: 'If disabled, nothing will trigger the extension or can result in an API call.', cacheCompletions: 'Cache completions', diff --git a/src/lang/locale/zh-cn.ts b/src/lang/locale/zh-cn.ts index 1dcc006..604afce 100644 --- a/src/lang/locale/zh-cn.ts +++ b/src/lang/locale/zh-cn.ts @@ -1,5 +1,3 @@ -// import { APPNAME, MINEXCALIDRAWVERSION } from "src/constants/constants"; - // 简体中文 export default { chat: { @@ -191,7 +189,7 @@ export default { }, Models: { chatModel: '聊天模型:', - autocompleteModel: '自动完成模型:', + autocompleteModel: '自动补全模型:', embeddingModel: '嵌入模型:', }, @@ -202,11 +200,11 @@ export default { temperatureDescription: '此参数影响采样中的随机性。较低的值会导致更重复和确定性的响应。较高的温度将导致更意外或创造性的响应。默认值:0.0,如果您不确定自己在做什么,请不要更改此值。', topP: 'TopP', topPDescription: '与 temperature 参数类似,Top P 参数影响采样中的随机性。降低该值将限制模型的标记选择为更可能的标记,而增加该值则会扩展模型对较低可能性标记的选择。默认值:1,如果您不确定自己在做什么,请不要更改此值。', - frequencyPenalty: '频率惩罚', + frequencyPenalty: 'frequencyPenalty', frequencyPenaltyDescription: '此参数根据标记在文本中出现的频率成比例地降低重复该标记的几率。这降低了在响应中重复完全相同文本的可能性。默认值:0.25', - presencePenalty: '存在惩罚', + presencePenalty: 'presencePenalty', presencePenaltyDescription: '此参数降低重复文本中任何已出现标记的几率。这增加了在响应中引入新主题的可能性。默认值:2', - maxTokens: '最大 Tokens', + maxTokens: 'maxTokens', maxTokensDescription: '此参数更改模型允许生成的最大 Tokens 数。默认值:4096', }, @@ -248,7 +246,7 @@ export default { // RAG 部分 RAG: { - title: 'RAG', + title: 'RAG(高级)', includePatterns: '包含模式', includePatternsDescription: '如果指定了任何模式,则只有匹配至少一个模式的文件才会被包含在索引中。每行一个模式。使用 glob 模式(例如,"notes/*", "*.md")。留空以包含所有未被排除模式排除的文件。更改后,请使用命令 "重建整个 Vault 索引" 来应用更改。', testPatterns: '测试模式', @@ -272,7 +270,7 @@ export default { // 自动完成部分 AutoComplete: { // 基本自动完成设置 - title: '自动完成', + title: '自动补全(高级)', enable: '启用', enableDescription: '如果禁用,任何操作都不会触发扩展或导致 API 调用。', cacheCompletions: '缓存补全', diff --git a/src/settings/SettingTab.tsx b/src/settings/SettingTab.tsx index ca78f8f..2500749 100644 --- a/src/settings/SettingTab.tsx +++ b/src/settings/SettingTab.tsx @@ -14,9 +14,9 @@ import InfioPlugin from '../main'; import { InfioSettings } from '../types/settings'; import { findFilesMatchingPatterns } from '../utils/glob-utils'; -import AdvancedSettings from './components/AdvancedSettings'; +// import AdvancedSettings from './components/AdvancedSettings'; import BasicAutoCompleteSettings from './components/BasicAutoCompleteSettings'; -import DangerZoneSettings from './components/DangerZoneSettings'; +// import DangerZoneSettings from './components/DangerZoneSettings'; import CustomProviderSettings from './components/ModelProviderSettings'; import PostprocessingSettings from './components/PostprocessingSettings'; import PreprocessingSettings from './components/PreprocessingSettings'; @@ -284,8 +284,55 @@ export class InfioSettingTab extends PluginSettingTab { } renderRAGSection(containerEl: HTMLElement): void { - new Setting(containerEl).setHeading().setName(t('settings.RAG.title')) - new Setting(containerEl) + // 创建一个折叠区域的容器 + const ragContainer = containerEl.createDiv("rag-settings-container"); + + // 创建标题元素,添加折叠控件 + const headerEl = ragContainer.createEl("div", { cls: "infio-collapsible-heading" }); + + // 添加展开/折叠指示器 + const toggleIcon = headerEl.createEl("span", { cls: "infio-toggle-icon" }); + toggleIcon.textContent = "▶"; // 默认为折叠状态,使用右箭头 + + // 添加标题文本 + const titleEl = headerEl.createEl("h3", { text: t('settings.RAG.title') }); + + // 创建内容容器 + const contentContainer = ragContainer.createEl("div", { cls: "infio-collapsible-content" }); + + // 默认设置为隐藏状态 + contentContainer.style.display = "none"; + + // 添加点击事件处理 + headerEl.addEventListener("click", () => { + if (contentContainer.style.display === "none") { + contentContainer.style.display = "block"; + toggleIcon.textContent = "▼"; // 展开状态使用下箭头 + toggleIcon.style.transform = "rotate(0deg)"; + } else { + contentContainer.style.display = "none"; + toggleIcon.textContent = "▶"; // 折叠状态使用右箭头 + toggleIcon.style.transform = "rotate(0deg)"; + } + }); + + // 添加样式 + headerEl.style.cursor = "pointer"; + headerEl.style.display = "flex"; + headerEl.style.alignItems = "center"; + headerEl.style.marginBottom = "10px"; + headerEl.style.padding = "6px 0"; + + toggleIcon.style.marginRight = "5px"; + toggleIcon.style.fontSize = "10px"; + toggleIcon.style.transition = "transform 0.15s ease"; + + titleEl.style.margin = "0"; + titleEl.style.fontSize = "16px"; + titleEl.style.fontWeight = "600"; + + // 以下是原有的设置内容,移动到内容容器中 + new Setting(contentContainer) .setName(t('settings.RAG.includePatterns')) .setDesc( t('settings.RAG.includePatternsDescription'), @@ -300,7 +347,7 @@ export class InfioSettingTab extends PluginSettingTab { new IncludedFilesModal(this.app, includedFiles, patterns).open() }), ) - new Setting(containerEl) + new Setting(contentContainer) .setClass('infio-chat-settings-textarea') .addTextArea((text) => text @@ -320,7 +367,7 @@ export class InfioSettingTab extends PluginSettingTab { }), ) - new Setting(containerEl) + new Setting(contentContainer) .setName(t('settings.RAG.excludePatterns')) .setDesc( t('settings.RAG.excludePatternsDescription'), @@ -335,7 +382,7 @@ export class InfioSettingTab extends PluginSettingTab { new ExcludedFilesModal(this.app, excludedFiles).open() }), ) - new Setting(containerEl) + new Setting(contentContainer) .setClass('infio-chat-settings-textarea') .addTextArea((text) => text @@ -355,7 +402,7 @@ export class InfioSettingTab extends PluginSettingTab { }), ) - new Setting(containerEl) + new Setting(contentContainer) .setName(t('settings.RAG.chunkSize')) .setDesc( t('settings.RAG.chunkSizeDescription'), @@ -378,7 +425,7 @@ export class InfioSettingTab extends PluginSettingTab { }), ) - new Setting(containerEl) + new Setting(contentContainer) .setName(t('settings.RAG.thresholdTokens')) .setDesc( t('settings.RAG.thresholdTokensDescription'), @@ -401,7 +448,7 @@ export class InfioSettingTab extends PluginSettingTab { }), ) - new Setting(containerEl) + new Setting(contentContainer) .setName(t('settings.RAG.minSimilarity')) .setDesc( t('settings.RAG.minSimilarityDescription'), @@ -424,7 +471,7 @@ export class InfioSettingTab extends PluginSettingTab { }), ) - new Setting(containerEl) + new Setting(contentContainer) .setName(t('settings.RAG.limit')) .setDesc( t('settings.RAG.limitDescription'), @@ -449,10 +496,58 @@ export class InfioSettingTab extends PluginSettingTab { } renderAutoCompleteSection(containerEl: HTMLElement): void { - // 创建一个专门的容器来存放 AutoComplete 相关的组件 - const autoCompleteDiv = containerEl.createDiv("auto-complete-section"); - this.autoCompleteContainer = autoCompleteDiv; - this.renderAutoCompleteContent(autoCompleteDiv); + // 创建一个折叠区域的容器 + const autoCompleteContainer = containerEl.createDiv("auto-complete-settings-container"); + + // 创建标题元素,添加折叠控件 + const headerEl = autoCompleteContainer.createEl("div", { cls: "infio-collapsible-heading" }); + + // 添加展开/折叠指示器 + const toggleIcon = headerEl.createEl("span", { cls: "infio-toggle-icon" }); + toggleIcon.textContent = "▶"; // 默认为折叠状态,使用右箭头 + + // 添加标题文本 + const titleEl = headerEl.createEl("h3", { text: t('settings.AutoComplete.title') }); + + // 创建内容容器 + const contentContainer = autoCompleteContainer.createEl("div", { cls: "infio-collapsible-content" }); + + // 保存容器引用 + this.autoCompleteContainer = contentContainer; + + // 默认设置为隐藏状态 + contentContainer.style.display = "none"; + + // 添加点击事件处理 + headerEl.addEventListener("click", () => { + if (contentContainer.style.display === "none") { + contentContainer.style.display = "block"; + toggleIcon.textContent = "▼"; // 展开状态使用下箭头 + toggleIcon.style.transform = "rotate(0deg)"; + } else { + contentContainer.style.display = "none"; + toggleIcon.textContent = "▶"; // 折叠状态使用右箭头 + toggleIcon.style.transform = "rotate(0deg)"; + } + }); + + // 添加样式 + headerEl.style.cursor = "pointer"; + headerEl.style.display = "flex"; + headerEl.style.alignItems = "center"; + headerEl.style.marginBottom = "10px"; + headerEl.style.padding = "6px 0"; + + toggleIcon.style.marginRight = "5px"; + toggleIcon.style.fontSize = "10px"; + toggleIcon.style.transition = "transform 0.15s ease"; + + titleEl.style.margin = "0"; + titleEl.style.fontSize = "16px"; + titleEl.style.fontWeight = "600"; + + // 在内容容器中渲染AutoComplete设置 + this.renderAutoCompleteContent(contentContainer); } private renderAutoCompleteContent(containerEl: HTMLElement): void { @@ -472,7 +567,7 @@ export class InfioSettingTab extends PluginSettingTab { const errors = new Map(); // AutoComplete base - new Setting(containerEl).setName(t('settings.AutoComplete.title')).setHeading(); + // new Setting(containerEl).setName(t('settings.AutoComplete.title')).setHeading(); this.renderComponent(containerEl, ); - // Danger zone - new Setting(containerEl).setName(t('settings.AutoComplete.dangerZone.title')).setHeading(); - this.renderComponent(containerEl, - { - new Notice(t('settings.AutoComplete.dangerZone.resetComplete')); - }} - /> - ); + // // Danger zone + // new Setting(containerEl).setName(t('settings.AutoComplete.dangerZone.title')).setHeading(); + // this.renderComponent(containerEl, + // { + // new Notice(t('settings.AutoComplete.dangerZone.resetComplete')); + // }} + // /> + // ); - // Advanced - if (this.plugin.settings.advancedMode) { - new Setting(containerEl).setName(t('settings.AutoComplete.advanced.title')).setHeading(); - this.renderComponent(containerEl, - - ); - } + // // Advanced + + // if (this.plugin.settings.advancedMode) { + // new Setting(containerEl).setName(t('settings.AutoComplete.advanced.title')).setHeading(); + // this.renderComponent(containerEl, + // + // ); + // } } private renderComponent(containerEl: HTMLElement, component: React.ReactNode) {