卫星模块获取功能已实现,仅简单测试,未深度测试
This commit is contained in:
@@ -27,7 +27,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
||||
};
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.ConfigPanel = void 0;
|
||||
// src/panels/ConfigPanel.ts
|
||||
const vscode = __importStar(require("vscode"));
|
||||
const path = __importStar(require("path"));
|
||||
const fs = __importStar(require("fs"));
|
||||
@@ -72,7 +71,9 @@ class ConfigPanel {
|
||||
this.moduleFolders = [];
|
||||
this.currentModuleFolderFileTree = [];
|
||||
this.projectPaths = new Map();
|
||||
this.pendingUploadFolderId = null;
|
||||
// 上传相关:local 上传 / git 上传
|
||||
this.pendingUploadFolderId = null; // local -> git
|
||||
this.pendingGitUploadFolderId = null; // git -> repo(更新或新分支)
|
||||
// 仓库配置
|
||||
this.repoConfigs = [];
|
||||
// 状态管理
|
||||
@@ -99,7 +100,6 @@ class ConfigPanel {
|
||||
// =============================================
|
||||
generateUniqueId(prefix, existingItems) {
|
||||
let idNumber = 1;
|
||||
// 先找到当前最大的数字
|
||||
const existingIds = existingItems.map(item => item.id);
|
||||
const numberPattern = /\d+$/;
|
||||
for (const id of existingIds) {
|
||||
@@ -117,7 +117,6 @@ class ConfigPanel {
|
||||
// 仓库配置相关
|
||||
// =============================================
|
||||
getRepoConfigPath() {
|
||||
// 按你的需求:配置文件保存在插件安装位置
|
||||
return path.join(this.extensionUri.fsPath, 'dcsp-repos.json');
|
||||
}
|
||||
async loadRepoConfigs() {
|
||||
@@ -134,7 +133,6 @@ class ConfigPanel {
|
||||
}
|
||||
const parsed = JSON.parse(content);
|
||||
if (Array.isArray(parsed)) {
|
||||
// 兼容老格式:直接是数组
|
||||
this.repoConfigs = parsed;
|
||||
}
|
||||
else if (parsed && Array.isArray(parsed.repos)) {
|
||||
@@ -178,6 +176,9 @@ class ConfigPanel {
|
||||
vscode.window.showErrorMessage(`打开仓库配置文件失败: ${error}`);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 通用:弹出仓库选择弹窗(不区分“获取分支 / 上传”,使用 pendingXXX 做上下文判断)
|
||||
*/
|
||||
async openRepoSelect() {
|
||||
await this.loadRepoConfigs();
|
||||
if (!this.repoConfigs || this.repoConfigs.length === 0) {
|
||||
@@ -185,12 +186,17 @@ class ConfigPanel {
|
||||
}
|
||||
if (this.isWebviewDisposed)
|
||||
return;
|
||||
// 仅传递仓库名给前端,用于下拉选择
|
||||
this.panel.webview.postMessage({
|
||||
type: 'showRepoSelect',
|
||||
repos: this.repoConfigs.map(r => ({ name: r.name }))
|
||||
});
|
||||
}
|
||||
/**
|
||||
* 仓库选择确认后的统一入口
|
||||
* - local 上传:pendingUploadFolderId 有值
|
||||
* - git 上传:pendingGitUploadFolderId 有值
|
||||
* - 其余:当作“获取分支”处理
|
||||
*/
|
||||
async handleRepoSelectedForBranches(repoName) {
|
||||
await this.loadRepoConfigs();
|
||||
const repo = this.repoConfigs.find(r => r.name === repoName);
|
||||
@@ -198,34 +204,84 @@ class ConfigPanel {
|
||||
vscode.window.showErrorMessage(`在仓库配置中未找到名为 "${repoName}" 的仓库,请检查 dcsp-repos.json。`);
|
||||
return;
|
||||
}
|
||||
// ---------------------------------------------------
|
||||
// 1️⃣ 新逻辑:Local 上传(pendingUploadFolderId 不为空)
|
||||
// ---------------------------------------------------
|
||||
// 1️⃣ Local 模块上传(local -> git)
|
||||
if (this.pendingUploadFolderId) {
|
||||
const localFolderId = this.pendingUploadFolderId;
|
||||
this.pendingUploadFolderId = null; // 必须清空,避免影响其他操作
|
||||
this.pendingUploadFolderId = null;
|
||||
console.log("🚀 Local 上传流程:repo =", repoName, "folderId =", localFolderId);
|
||||
const folder = this.moduleFolders.find(f => f.id === localFolderId);
|
||||
if (!folder) {
|
||||
if (!folder || folder.type !== 'local') {
|
||||
vscode.window.showErrorMessage("未找到要上传的本地模块文件夹");
|
||||
return;
|
||||
}
|
||||
// 生成本地路径
|
||||
const fullPath = this.getModuleFolderFullPath(folder);
|
||||
if (!fullPath) {
|
||||
vscode.window.showErrorMessage("无法确定本地模块文件夹路径");
|
||||
return;
|
||||
}
|
||||
// 自动从本地文件夹名生成分支名
|
||||
const branchName = path.basename(fullPath);
|
||||
console.log("🌿 自动生成分支名:", branchName);
|
||||
// 正式执行上传
|
||||
console.log("🌿 Local 上传自动生成分支名:", branchName);
|
||||
await this.uploadLocalModuleFolder(localFolderId, repo.url, branchName);
|
||||
return;
|
||||
}
|
||||
// ---------------------------------------------------
|
||||
// 2️⃣ 旧逻辑:获取分支
|
||||
// ---------------------------------------------------
|
||||
// 2️⃣ Git 模块上传(git -> repo)
|
||||
if (this.pendingGitUploadFolderId) {
|
||||
const gitFolderId = this.pendingGitUploadFolderId;
|
||||
this.pendingGitUploadFolderId = null;
|
||||
console.log("🚀 Git 上传流程:repo =", repoName, "folderId =", gitFolderId);
|
||||
const folder = this.moduleFolders.find(f => f.id === gitFolderId);
|
||||
if (!folder || folder.type !== 'git') {
|
||||
vscode.window.showErrorMessage("未找到要上传的 Git 模块文件夹");
|
||||
return;
|
||||
}
|
||||
const newFolderName = folder.localPath.split('/').pop() ?? '';
|
||||
const oldFolderName = folder.originalFolderName ?? newFolderName;
|
||||
const isRenamed = newFolderName !== oldFolderName;
|
||||
const isSameRepo = !!folder.originalRepoUrl && folder.originalRepoUrl === repo.url;
|
||||
console.log('🔍 Git 上传判断:');
|
||||
console.log(' oldFolderName:', oldFolderName);
|
||||
console.log(' newFolderName:', newFolderName);
|
||||
console.log(' isRenamed :', isRenamed);
|
||||
console.log(' folderRepo :', folder.originalRepoUrl);
|
||||
console.log(' selectedRepo :', repo.url);
|
||||
console.log(' isSameRepo :', isSameRepo);
|
||||
const fullPath = this.getModuleFolderFullPath(folder);
|
||||
if (!fullPath) {
|
||||
vscode.window.showErrorMessage("无法确定 Git 模块文件夹路径");
|
||||
return;
|
||||
}
|
||||
// 2.1 未改名 + 还是原来的仓库 → 直接在原分支上 push(更新代码)
|
||||
if (!isRenamed && isSameRepo) {
|
||||
console.log('✅ 未改名 & 同仓库:执行原始 push 逻辑');
|
||||
await this.uploadGitModuleFolder(gitFolderId);
|
||||
return;
|
||||
}
|
||||
// 2.2 改了名字 或 换了仓库 → 使用“当前文件夹名”作为分支,推送到选中仓库
|
||||
console.log('🆕 名称改变或仓库改变:以文件夹名作为新分支上传');
|
||||
await vscode.window.withProgress({
|
||||
location: vscode.ProgressLocation.Notification,
|
||||
title: `正在上传 Git 仓库: ${folder.name}`,
|
||||
cancellable: false
|
||||
}, async (progress) => {
|
||||
try {
|
||||
progress.report({ increment: 0, message: '准备上传...' });
|
||||
await this.pushGitModuleFolderToRepoWithBranch(fullPath, repo.url, newFolderName);
|
||||
folder.uploaded = true;
|
||||
folder.originalFolderName = newFolderName;
|
||||
folder.originalRepoUrl = repo.url;
|
||||
await this.saveCurrentProjectData();
|
||||
progress.report({ increment: 100, message: '完成' });
|
||||
vscode.window.showInformationMessage(`✅ Git 仓库已上传到 ${repo.name} 的分支 ${newFolderName}`);
|
||||
this.updateWebview();
|
||||
}
|
||||
catch (error) {
|
||||
console.error('❌ Git 上传到新仓库/分支失败:', error);
|
||||
vscode.window.showErrorMessage(`推送失败: ${error.message || error}`);
|
||||
}
|
||||
});
|
||||
return;
|
||||
}
|
||||
// 3️⃣ 默认:获取分支(用于“获取仓库”-> 克隆)
|
||||
this.currentRepoForBranches = repo;
|
||||
await this.fetchBranchesForRepo(repo);
|
||||
}
|
||||
@@ -297,7 +353,9 @@ class ConfigPanel {
|
||||
// 上传功能
|
||||
'uploadGitModuleFolder': (data) => this.uploadGitModuleFolder(data.folderId, data.username, data.password),
|
||||
'openRepoSelectForUpload': (data) => this.handleOpenRepoSelectForUpload(data.folderId),
|
||||
'uploadLocalModuleFolder': (data) => this.uploadLocalModuleFolder(data.folderId, data.repoUrl, data.branchName)
|
||||
'uploadLocalModuleFolder': (data) => this.uploadLocalModuleFolder(data.folderId, data.repoUrl, data.branchName),
|
||||
'openRepoSelectForGitUpload': (data) => this.openRepoSelectForGitUpload(data.folderId),
|
||||
'repoSelectedForGitUpload': (data) => this.handleRepoSelectedForGitUpload(data.folderId, data.repoName)
|
||||
};
|
||||
const handler = messageHandlers[data.type];
|
||||
if (handler) {
|
||||
@@ -510,7 +568,6 @@ class ConfigPanel {
|
||||
async handleOpenRepoSelectForUpload(folderId) {
|
||||
console.log("📌 Local 上传:收到 openRepoSelectForUpload,folderId =", folderId);
|
||||
this.pendingUploadFolderId = folderId;
|
||||
// 复用你现有的仓库选择弹窗
|
||||
await this.openRepoSelect();
|
||||
}
|
||||
async deleteConfig(configId) {
|
||||
@@ -741,7 +798,9 @@ class ConfigPanel {
|
||||
name: displayName,
|
||||
type: 'git',
|
||||
localPath: relativePath,
|
||||
containerId: this.currentContainerId
|
||||
containerId: this.currentContainerId,
|
||||
originalFolderName: folderName,
|
||||
originalRepoUrl: url
|
||||
};
|
||||
await vscode.window.withProgress({
|
||||
location: vscode.ProgressLocation.Notification,
|
||||
@@ -948,6 +1007,10 @@ class ConfigPanel {
|
||||
// =============================================
|
||||
// 上传功能方法
|
||||
// =============================================
|
||||
/**
|
||||
* 旧的 Git 模块上传逻辑:直接在当前远程 / 当前分支上 commit + push
|
||||
* 现在只在“未改名 + 同仓库”的场景下被调用
|
||||
*/
|
||||
async uploadGitModuleFolder(folderId, username, password) {
|
||||
const folder = this.moduleFolders.find(f => f.id === folderId);
|
||||
if (!folder || folder.type !== 'git') {
|
||||
@@ -1011,6 +1074,8 @@ class ConfigPanel {
|
||||
progress.report({ increment: 100, message: '完成' });
|
||||
folder.type = 'git';
|
||||
folder.uploaded = true;
|
||||
folder.originalFolderName = branchName;
|
||||
folder.originalRepoUrl = repoUrl;
|
||||
await this.saveCurrentProjectData();
|
||||
vscode.window.showInformationMessage(`本地文件夹成功上传到 Git 仓库: ${folder.name} -> ${branchName}`);
|
||||
this.updateWebview();
|
||||
@@ -1030,6 +1095,56 @@ class ConfigPanel {
|
||||
}
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Git 模块以“当前文件夹名”为分支,推送到任意仓库 URL
|
||||
* 不修改现有 remote 配置,直接用 URL 形式 push
|
||||
*/
|
||||
async pushGitModuleFolderToRepoWithBranch(fullPath, repoUrl, branchName) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const { exec } = require('child_process');
|
||||
console.log('🚀 准备以新分支推送到仓库:', { fullPath, repoUrl, branchName });
|
||||
// 先检查是否有未提交修改
|
||||
exec('git status --porcelain', {
|
||||
cwd: fullPath,
|
||||
encoding: 'utf8'
|
||||
}, (statusError, statusStdout, statusStderr) => {
|
||||
if (statusError) {
|
||||
console.error('❌ 检查 Git 状态失败:', statusError);
|
||||
reject(new Error(`检查 Git 状态失败: ${statusStderr || statusError.message}`));
|
||||
return;
|
||||
}
|
||||
const hasChanges = !!statusStdout.trim();
|
||||
console.log('📋 有未提交更改?:', hasChanges, ', status =\n', statusStdout);
|
||||
const commands = [];
|
||||
// 获取完整的仓库历史
|
||||
commands.push('git fetch --unshallow');
|
||||
// 切换 / 创建分支
|
||||
commands.push(`git checkout -B "${branchName}"`);
|
||||
// 有变更就先提交
|
||||
if (hasChanges) {
|
||||
commands.push('git add .');
|
||||
commands.push(`git commit -m "Auto commit from DCSP - ${new Date().toLocaleString()}"`);
|
||||
}
|
||||
// 直接用 URL 形式推送,不依赖 remote 名称
|
||||
commands.push(`git push -u "${repoUrl}" "${branchName}" --force`);
|
||||
console.log('🧰 即将执行命令链:', commands.join(' && '));
|
||||
exec(commands.join(' && '), {
|
||||
cwd: fullPath,
|
||||
encoding: 'utf8'
|
||||
}, (error, stdout, stderr) => {
|
||||
console.log('📋 Git push stdout:', stdout);
|
||||
console.log('📋 Git push stderr:', stderr);
|
||||
if (error) {
|
||||
console.error('❌ Git 推送失败:', error);
|
||||
reject(new Error(stderr || error.message));
|
||||
return;
|
||||
}
|
||||
console.log('✅ Git 推送到指定仓库/分支成功');
|
||||
resolve();
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
// =============================================
|
||||
// Git 命令行工具方法
|
||||
// =============================================
|
||||
@@ -1079,7 +1194,7 @@ class ConfigPanel {
|
||||
return new Promise((resolve, reject) => {
|
||||
const { exec } = require('child_process');
|
||||
console.log('📁 初始化 Git 仓库...');
|
||||
exec(`git init && git checkout -b ${branchName}`, {
|
||||
exec(`git init && git checkout -b "${branchName}"`, {
|
||||
cwd: fullPath,
|
||||
encoding: 'utf8'
|
||||
}, (error, stdout, stderr) => {
|
||||
@@ -1097,7 +1212,7 @@ class ConfigPanel {
|
||||
return new Promise((resolve, reject) => {
|
||||
const { exec } = require('child_process');
|
||||
console.log('📡 添加远程仓库...');
|
||||
exec(`git remote add origin ${repoUrl}`, {
|
||||
exec(`git remote add origin "${repoUrl}"`, {
|
||||
cwd: fullPath,
|
||||
encoding: 'utf8'
|
||||
}, (error, stdout, stderr) => {
|
||||
@@ -1117,7 +1232,7 @@ class ConfigPanel {
|
||||
console.log('💾 提交初始文件...');
|
||||
const commands = [
|
||||
'git add .',
|
||||
`git commit -m "Initial commit from DCSP - ${new Date().toLocaleString()}"`,
|
||||
`git commit -m "Initial commit from DCSP - ${new Date().toLocaleString()}"`
|
||||
];
|
||||
exec(commands.join(' && '), {
|
||||
cwd: fullPath,
|
||||
@@ -1142,7 +1257,7 @@ class ConfigPanel {
|
||||
return new Promise((resolve, reject) => {
|
||||
const { exec } = require('child_process');
|
||||
console.log('🚀 强制推送到远程仓库...');
|
||||
exec(`git push -u origin ${branchName} --force`, {
|
||||
exec(`git push -u origin "${branchName}" --force`, {
|
||||
cwd: fullPath,
|
||||
encoding: 'utf8'
|
||||
}, (error, stdout, stderr) => {
|
||||
@@ -1552,6 +1667,11 @@ class ConfigPanel {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
async handleRepoSelectedForGitUpload(folderId, repoName) {
|
||||
// 兼容:如果前端用的是 repoSelectedForGitUpload 事件,则这里转成统一逻辑
|
||||
this.pendingGitUploadFolderId = folderId;
|
||||
await this.handleRepoSelectedForBranches(repoName);
|
||||
}
|
||||
// =============================================
|
||||
// 工具方法
|
||||
// =============================================
|
||||
@@ -1681,7 +1801,7 @@ class ConfigPanel {
|
||||
const newFullPath = path.join(path.dirname(fullPath), newName);
|
||||
try {
|
||||
await fs.promises.rename(fullPath, newFullPath);
|
||||
// 更新 localPath
|
||||
// 更新 localPath(注意:originalFolderName 不更新,用于判断“是否改名过”)
|
||||
folder.localPath = folder.localPath.replace(/\/[^/]+$/, '/' + newName);
|
||||
await this.saveCurrentProjectData();
|
||||
vscode.window.showInformationMessage(`已重命名文件夹: ${oldName} → ${newName}`);
|
||||
@@ -1706,6 +1826,11 @@ class ConfigPanel {
|
||||
console.error('更新 Webview 失败:', error);
|
||||
}
|
||||
}
|
||||
async openRepoSelectForGitUpload(folderId) {
|
||||
console.log('📌 Git 上传:收到 openRepoSelectForGitUpload,folderId =', folderId);
|
||||
this.pendingGitUploadFolderId = folderId;
|
||||
await this.openRepoSelect();
|
||||
}
|
||||
getWebviewContent() {
|
||||
switch (this.currentView) {
|
||||
case 'projects':
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -29,27 +29,29 @@ class ConfigView extends BaseView_1.BaseView {
|
||||
`).join('');
|
||||
// 生成模块文件夹的 HTML - 按类别分类显示
|
||||
const moduleFoldersHtml = moduleFolders.map((folder) => {
|
||||
const icon = folder.type === 'git' ? '📁' : '📁';
|
||||
const icon = '📁';
|
||||
// 根据类型和上传状态确定类别显示
|
||||
let category = folder.type === 'git' ? 'git' : 'local';
|
||||
if (folder.uploaded) {
|
||||
category += '(已上传)';
|
||||
}
|
||||
const fileName = folder.localPath.split('/').pop() || '';
|
||||
return `
|
||||
<tr>
|
||||
<td>
|
||||
<span class="editable clickable" onclick="renameModuleFolder('${folder.id}')">
|
||||
${icon} ${folder.name}
|
||||
</span>
|
||||
<!-- 左侧:📁 动力学仓库 / test,仅用于重命名 -->
|
||||
<span class="editable clickable" onclick="renameModuleFolder('${folder.id}', '${folder.name}')">
|
||||
${icon} ${folder.name}
|
||||
</span>
|
||||
</td>
|
||||
<td class="category-${folder.type}">${category}</td>
|
||||
<td>
|
||||
<span class="clickable"
|
||||
onclick="renameModuleFolder('${folder.id}', '${folder.localPath.split('/').pop()}')">
|
||||
📄 ${folder.localPath.split('/').pop()}
|
||||
</span>
|
||||
</td>
|
||||
|
||||
<!-- 右侧:文件/文件夹栏,只负责选择并打开文件,不再触发重命名 -->
|
||||
<span class="clickable"
|
||||
onclick="openTheModuleFolder('${folder.id}', '${folder.type}')">
|
||||
📄 ${fileName}
|
||||
</span>
|
||||
</td>
|
||||
<td>
|
||||
<button class="btn-upload" onclick="uploadModuleFolder('${folder.id}', '${folder.type}')" style="margin-right: 5px;">上传</button>
|
||||
<button class="btn-delete" onclick="deleteModuleFolder('${folder.id}')">删除</button>
|
||||
@@ -322,24 +324,23 @@ class ConfigView extends BaseView_1.BaseView {
|
||||
let branchTreeData = [];
|
||||
let selectedConfigs = new Set();
|
||||
|
||||
// 只负责“改名”的函数
|
||||
function renameModuleFolder(folderId, oldName) {
|
||||
showPromptDialog(
|
||||
'重命名模块文件夹',
|
||||
'请输入新的名称:',
|
||||
oldName,
|
||||
function(newName) {
|
||||
if (newName && newName.trim() && newName !== oldName) {
|
||||
vscode.postMessage({
|
||||
type: 'renameModuleFolder',
|
||||
folderId: folderId,
|
||||
newName: newName.trim()
|
||||
});
|
||||
}
|
||||
showPromptDialog(
|
||||
'重命名模块文件夹',
|
||||
'请输入新的名称:',
|
||||
oldName || '',
|
||||
function(newName) {
|
||||
if (newName && newName.trim() && newName !== oldName) {
|
||||
vscode.postMessage({
|
||||
type: 'renameModuleFolder',
|
||||
folderId: folderId,
|
||||
newName: newName.trim()
|
||||
});
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// 配置管理功能
|
||||
function editConfigName(configId, currentName) {
|
||||
@@ -368,7 +369,7 @@ class ConfigView extends BaseView_1.BaseView {
|
||||
});
|
||||
}
|
||||
|
||||
// 统一功能:打开模块文件夹
|
||||
// 统一功能:打开模块文件夹(这里只负责打开,而不是改名)
|
||||
function openTheModuleFolder(id, type) {
|
||||
console.log('📂 打开模块文件夹:', { id, type });
|
||||
vscode.postMessage({
|
||||
@@ -406,7 +407,6 @@ class ConfigView extends BaseView_1.BaseView {
|
||||
});
|
||||
},
|
||||
function() {
|
||||
// 用户取消删除
|
||||
console.log('❌ 用户取消删除配置文件');
|
||||
}
|
||||
);
|
||||
@@ -427,34 +427,23 @@ class ConfigView extends BaseView_1.BaseView {
|
||||
});
|
||||
},
|
||||
function() {
|
||||
// 用户取消删除
|
||||
console.log('❌ 用户取消删除模块文件夹');
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
// 上传模块文件夹功能
|
||||
// 上传模块文件夹功能(区分 local / git)
|
||||
function uploadModuleFolder(folderId, folderType) {
|
||||
console.log('📤 上传模块文件夹:', { folderId, folderType });
|
||||
|
||||
if (folderType === 'git') {
|
||||
// Git 类型:直接上传(相当于 push)
|
||||
showConfirmDialog(
|
||||
'确认上传',
|
||||
'确定要将 Git 文件夹的内容上传到远程仓库吗?这将执行 git push 操作。',
|
||||
function() {
|
||||
vscode.postMessage({
|
||||
type: 'uploadGitModuleFolder',
|
||||
folderId: folderId
|
||||
});
|
||||
},
|
||||
function() {
|
||||
console.log('❌ 用户取消上传 Git 文件夹');
|
||||
}
|
||||
);
|
||||
} else if (folderType === 'local') {
|
||||
// Local 类型:不再手动输入 URL,改为复用“获取仓库”弹窗
|
||||
// 后端将根据选择的仓库 + 本地文件夹名 自动确定 repoUrl 和 分支名
|
||||
// git 类型:先选仓库,然后后端根据是否改名/是否同仓库判断是更新原分支还是新分支上传
|
||||
vscode.postMessage({
|
||||
type: 'openRepoSelectForGitUpload',
|
||||
folderId: folderId
|
||||
});
|
||||
} else {
|
||||
// local 类型:走 local → git 的初始化上传逻辑
|
||||
vscode.postMessage({
|
||||
type: 'openRepoSelectForUpload',
|
||||
folderId: folderId
|
||||
@@ -497,12 +486,10 @@ class ConfigView extends BaseView_1.BaseView {
|
||||
branches: Array.from(selectedBranches)
|
||||
});
|
||||
|
||||
// 重置选择
|
||||
selectedBranches.clear();
|
||||
const checkboxes = document.querySelectorAll('input[type="checkbox"]');
|
||||
checkboxes.forEach(checkbox => checkbox.checked = false);
|
||||
|
||||
// 隐藏分支选择区域
|
||||
document.getElementById('branchSelectionContainer').innerHTML = '';
|
||||
}
|
||||
|
||||
@@ -511,7 +498,6 @@ class ConfigView extends BaseView_1.BaseView {
|
||||
const checkboxes = document.querySelectorAll('input[type="checkbox"]');
|
||||
checkboxes.forEach(checkbox => checkbox.checked = false);
|
||||
|
||||
// 隐藏分支选择区域
|
||||
document.getElementById('branchSelectionContainer').innerHTML = '';
|
||||
|
||||
vscode.postMessage({
|
||||
@@ -528,7 +514,6 @@ class ConfigView extends BaseView_1.BaseView {
|
||||
selectedConfigs.delete(configId);
|
||||
}
|
||||
|
||||
// 更新合并按钮状态
|
||||
updateMergeButtonState();
|
||||
console.log('选中的配置文件:', Array.from(selectedConfigs));
|
||||
}
|
||||
@@ -548,7 +533,6 @@ class ConfigView extends BaseView_1.BaseView {
|
||||
|
||||
console.log('🔄 开始合并选中的配置文件:', Array.from(selectedConfigs));
|
||||
|
||||
// 弹出新的合并对话框
|
||||
showMergeDialog();
|
||||
}
|
||||
|
||||
@@ -584,7 +568,6 @@ class ConfigView extends BaseView_1.BaseView {
|
||||
|
||||
document.body.appendChild(overlay);
|
||||
|
||||
// 自动聚焦到第一个输入框
|
||||
setTimeout(() => {
|
||||
const displayNameInput = document.getElementById('displayNameInput');
|
||||
if (displayNameInput) {
|
||||
@@ -619,7 +602,6 @@ class ConfigView extends BaseView_1.BaseView {
|
||||
folderName: folderName
|
||||
});
|
||||
|
||||
// 重置选择
|
||||
selectedConfigs.clear();
|
||||
const checkboxes = document.querySelectorAll('.config-checkbox');
|
||||
checkboxes.forEach(checkbox => checkbox.checked = false);
|
||||
@@ -689,7 +671,6 @@ class ConfigView extends BaseView_1.BaseView {
|
||||
let html = '<div class="branch-selection" style="margin: 10px 0; padding: 10px; background: var(--vscode-panel-background); border-radius: 4px;">';
|
||||
html += '<h4 class="branch-tree-title" style="margin: 0 0 8px 0;"><span class="tree-icon">🌳</span> 分支树</h4>';
|
||||
|
||||
// 展开/收起按钮
|
||||
html += '<div style="margin-bottom: 8px;">';
|
||||
html += '<button class="back-btn" onclick="expandAllBranches()" style="margin-right: 8px; padding: 2px 6px; font-size: 11px;">展开全部</button>';
|
||||
html += '<button class="back-btn" onclick="collapseAllBranches()" style="padding: 2px 6px; font-size: 11px;">收起全部</button>';
|
||||
@@ -714,7 +695,6 @@ class ConfigView extends BaseView_1.BaseView {
|
||||
const nodeId = node.fullName.replace(/[^a-zA-Z0-9-]/g, '-');
|
||||
|
||||
if (node.isLeaf) {
|
||||
// 叶子节点(实际分支)
|
||||
html += '<div class="branch-node branch-leaf" style="margin-left: ' + indent + 'px;">';
|
||||
html += '<input type="checkbox" id="branch-' + nodeId + '" class="branch-checkbox" ';
|
||||
html += (node.branch && node.branch.selected ? 'checked' : '') + ' onchange="toggleBranch(\\'' + node.fullName + '\\')">';
|
||||
@@ -725,7 +705,6 @@ class ConfigView extends BaseView_1.BaseView {
|
||||
html += '</span>';
|
||||
html += '</div>';
|
||||
} else {
|
||||
// 文件夹节点
|
||||
html += '<div class="branch-node" style="margin-left: ' + indent + 'px;">';
|
||||
html += '<span class="branch-expand" onclick="toggleBranchNode(\\'' + node.fullName + '\\')">';
|
||||
html += (node.expanded ? '🪵' : '🪵');
|
||||
@@ -744,18 +723,6 @@ class ConfigView extends BaseView_1.BaseView {
|
||||
return html;
|
||||
}
|
||||
|
||||
function countLeafNodes(nodes) {
|
||||
let count = 0;
|
||||
nodes.forEach(node => {
|
||||
if (node.isLeaf) {
|
||||
count++;
|
||||
} else if (node.children) {
|
||||
count += countLeafNodes(node.children);
|
||||
}
|
||||
});
|
||||
return count;
|
||||
}
|
||||
|
||||
// 对话框函数
|
||||
function showConfirmDialog(title, message, onConfirm, onCancel) {
|
||||
const overlay = document.createElement('div');
|
||||
@@ -853,7 +820,6 @@ class ConfigView extends BaseView_1.BaseView {
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
console.log('📄 ConfigView 页面加载完成');
|
||||
|
||||
// 为所有配置复选框添加事件监听
|
||||
document.addEventListener('change', function(event) {
|
||||
if (event.target.classList.contains('config-checkbox')) {
|
||||
const configId = event.target.getAttribute('data-id');
|
||||
@@ -868,7 +834,6 @@ class ConfigView extends BaseView_1.BaseView {
|
||||
generateBranchesTreeHtml(branches) {
|
||||
if (branches.length === 0)
|
||||
return '';
|
||||
// 构建分支树
|
||||
const branchTree = this.buildBranchTree(branches);
|
||||
let html = '<div class="branch-selection" style="margin: 10px 0; padding: 10px; background: var(--vscode-panel-background); border-radius: 4px;">';
|
||||
html += '<h4 class="branch-tree-title" style="margin: 0 0 8px 0;"><span class="tree-icon">🌳</span> 分支树</h4>';
|
||||
@@ -885,9 +850,6 @@ class ConfigView extends BaseView_1.BaseView {
|
||||
html += '</div></div>';
|
||||
return html;
|
||||
}
|
||||
/**
|
||||
* 构建分支树状结构
|
||||
*/
|
||||
buildBranchTree(branches) {
|
||||
const root = [];
|
||||
branches.forEach(branch => {
|
||||
@@ -904,31 +866,25 @@ class ConfigView extends BaseView_1.BaseView {
|
||||
fullName: fullName,
|
||||
isLeaf: isLeaf,
|
||||
children: [],
|
||||
level: i
|
||||
level: i,
|
||||
expanded: true
|
||||
};
|
||||
currentLevel.push(node);
|
||||
}
|
||||
if (isLeaf) {
|
||||
node.branch = branch;
|
||||
}
|
||||
else {
|
||||
node.expanded = node.expanded || true; // 默认展开
|
||||
}
|
||||
currentLevel = node.children;
|
||||
}
|
||||
});
|
||||
return root;
|
||||
}
|
||||
/**
|
||||
* 渲染分支树节点
|
||||
*/
|
||||
renderBranchTreeNodes(nodes, level) {
|
||||
let html = '';
|
||||
nodes.forEach(node => {
|
||||
const indent = level * 20;
|
||||
const nodeId = node.fullName.replace(/[^a-zA-Z0-9-]/g, '-');
|
||||
if (node.isLeaf) {
|
||||
// 叶子节点(实际分支)
|
||||
html += '<div class="branch-node branch-leaf" style="margin-left: ' + indent + 'px;">';
|
||||
html += '<input type="checkbox" id="branch-' + nodeId + '" class="branch-checkbox" ';
|
||||
html += (node.branch && node.branch.selected ? 'checked' : '') + ' onchange="toggleBranch(\'' + node.fullName + '\')">';
|
||||
@@ -940,7 +896,6 @@ class ConfigView extends BaseView_1.BaseView {
|
||||
html += '</div>';
|
||||
}
|
||||
else {
|
||||
// 文件夹节点
|
||||
html += '<div class="branch-node" style="margin-left: ' + indent + 'px;">';
|
||||
html += '<span class="branch-expand" onclick="toggleBranchNode(\'' + node.fullName + '\')">';
|
||||
html += (node.expanded ? '🪵' : '🪵');
|
||||
@@ -957,9 +912,6 @@ class ConfigView extends BaseView_1.BaseView {
|
||||
});
|
||||
return html;
|
||||
}
|
||||
/**
|
||||
* 计算叶子节点数量
|
||||
*/
|
||||
countLeafNodes(nodes) {
|
||||
let count = 0;
|
||||
nodes.forEach(node => {
|
||||
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user