0
0

卫星模块获取功能已实现,仅简单测试,未深度测试

This commit is contained in:
xubing
2025-12-02 16:30:53 +08:00
parent 07acf9f617
commit 3f512e8646
9 changed files with 475 additions and 297 deletions

View File

@@ -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 => {