fix: replace Tree widget with VScrollPanel dir listing

This commit is contained in:
ymq 2026-08-12 12:37:49 +08:00
parent f28c152d89
commit fa9fc76bef

View File

@ -115,7 +115,7 @@
"event": "click",
"actiontype": "script",
"target": "self",
"script": "fetch('/pipeline-sdlc/api/cockpit_context.dspy').then(function(r){return r.json()}).then(function(d){var pid=d.project_id||'';var pn=d.project_name||'';if(!pid){var pw=new bricks.PopupWindow({title:'提示',cwidth:30,cheight:8,auto_open:true});pw.content_w.add_widget(new bricks.Text({text:'请先选择项目',cfontsize:1,color:'#64748b',padding:'20px'}));return;}var pw=new bricks.PopupWindow({title:pn+' - 工作空间',cwidth:80,cheight:36,auto_open:true});var hsplit=new bricks.Splitter({direction:'horizontal',split:'25%'});var left=new bricks.Tree({css:'filler',padding:'4px'});var right=new bricks.VScrollPanel({css:'filler',padding:'8px',gap:'4px'});var btnBar=new bricks.HBox({padding:'4px 8px',gap:'8px',cheight:2});var refreshBtn=new bricks.Button({label:'刷新',css:'small'});btnBar.add_widget(refreshBtn);var pathLabel=new bricks.Text({text:'',cfontsize:0.8,color:'#94a3b8'});btnBar.add_widget(pathLabel);var rightBox=new bricks.VBox({css:'filler',gap:'0'});rightBox.add_widget(btnBar);rightBox.add_widget(right);hsplit.add_widget(left);hsplit.add_widget(rightBox);pw.content_w.add_widget(hsplit);function loadTree(){fetch('/pipeline-sdlc/api/workspace_browse.dspy').then(function(r){return r.json()}).then(function(data){if(data.error){right.add_widget(new bricks.Text({text:data.error,color:'#f44336'}));return;}left.clear();function addNode(parent,node){var children=node.children||[];var files=node.files||[];var hasKids=children.length>0||files.length>0;var n=left.add_node(parent,{text:node.name,data:node});for(var i=0;i<children.length;i++) addNode(n,children[i]);if(!parent) left.expand_all();}addNode(null,data.tree);showFiles(data.tree);left.bind('selected',function(e){var node=e.node;var d=node.data;if(!d)return;pathLabel.set_text(d.path||'');showFiles(d);});refreshBtn.bind('click',function(){loadTree();});});}function showFiles(node){right.clear();var files=node.files||[];if(files.length===0){right.add_widget(new bricks.Text({text:'(空目录)',cfontsize:0.85,color:'#94a3b8'}));return;}for(var i=0;i<files.length;i++){var f=files[i];var row=new bricks.HBox({bgcolor:i%2?'#f8fafc':'#fff',padding:'6px 10px',alignItems:'center',gap:'8px',borderRadius:'4px'});var icon=f.is_text?'📄':f.is_media?'🎬':'📁';row.add_widget(new bricks.Text({text:icon,cfontsize:1.2}));var nameW=new bricks.Text({text:f.name,cfontsize:0.9,color:'#1e293b',css:'filler'});row.add_widget(nameW);var sizeW=new bricks.Text({text:(f.size/1024).toFixed(1)+'KB',cfontsize:0.75,color:'#94a3b8'});row.add_widget(sizeW);(function(fp,fn,ft){row.dom_element.style.cursor='pointer';row.dom_element.addEventListener('click',function(){if(ft){openFile(fp,fn);}else{showFiles(node);}});})(f.path,f.name,f.is_text);right.add_widget(row);}}function openFile(path,name){var fpw=new bricks.PopupWindow({title:name,cwidth:70,cheight:32,auto_open:true});var wterm=new bricks.Wterm({css:'filler',padding:'0'});fpw.content_w.add_widget(wterm);fetch('/pipeline-sdlc/api/workspace_file.dspy?action=read&path='+encodeURIComponent(path)).then(function(r){return r.json()}).then(function(d){if(d.error){wterm.write('Error: '+d.error);return;}wterm.write(d.content||'');var saveBtn=new bricks.Button({label:'保存'});fpw.content_w.add_widget(saveBtn);saveBtn.bind('click',function(){var content=wterm.get_value();fetch('/pipeline-sdlc/api/workspace_file.dspy',{method:'POST',headers:{'Content-Type':'application/x-www-form-urlencoded'},body:'action=save&path='+encodeURIComponent(path)+'&content='+encodeURIComponent(content)}).then(function(r){return r.json()}).then(function(d){if(d.success){saveBtn.set_text('已保存');setTimeout(function(){saveBtn.set_text('保存');},2000);}});});});}loadTree();});"
"script": "fetch('/pipeline-sdlc/api/cockpit_context.dspy').then(function(r){return r.json()}).then(function(d){var pid=d.project_id||'';var pn=d.project_name||'';if(!pid){var pw=new bricks.PopupWindow({title:'提示',cwidth:30,cheight:8,auto_open:true});pw.content_w.add_widget(new bricks.Text({text:'请先选择项目',cfontsize:1,color:'#64748b',padding:'20px'}));return;}var pw=new bricks.PopupWindow({title:pn+' - 工作空间',cwidth:80,cheight:36,auto_open:true});var hsplit=new bricks.Splitter({direction:'horizontal',split:'25%'});var left=new bricks.VScrollPanel({css:'filler',padding:'4px'});var right=new bricks.VScrollPanel({css:'filler',padding:'8px',gap:'4px'});var btnBar=new bricks.HBox({padding:'4px 8px',gap:'8px',cheight:2});var refreshBtn=new bricks.Button({label:'刷新',css:'small'});btnBar.add_widget(refreshBtn);var pathLabel=new bricks.Text({text:'',cfontsize:0.8,color:'#94a3b8'});btnBar.add_widget(pathLabel);var rightBox=new bricks.VBox({css:'filler',gap:'0'});rightBox.add_widget(btnBar);rightBox.add_widget(right);hsplit.add_widget(left);hsplit.add_widget(rightBox);pw.content_w.add_widget(hsplit);function loadTree(){fetch('/pipeline-sdlc/api/workspace_browse.dspy').then(function(r){return r.json()}).then(function(data){if(data.error){right.add_widget(new bricks.Text({text:data.error,color:'#f44336'}));return;}left.clear();function renderDir(dir,parent,level){var indent=level*16;var row=new bricks.HBox({padding:'3px 6px 3px '+(4+indent)+'px',alignItems:'center',gap:'4px',cursor:'pointer'});row.add_widget(new bricks.Text({text:'📁',cfontsize:1}));row.add_widget(new bricks.Text({text:dir.name,cfontsize:0.85}));row.dom_element.addEventListener('click',function(){pathLabel.set_text(dir.path);showFiles(dir);});(parent||left).add_widget(row);var children=dir.children||[];for(var i=0;i<children.length;i++) renderDir(children[i],parent||left,level+1);}renderDir(data.tree,null,0);showFiles(data.tree);refreshBtn.bind('click',function(){left.clear();loadTree();});});}function showFiles(node){right.clear();var files=node.files||[];if(files.length===0){right.add_widget(new bricks.Text({text:'(空目录)',cfontsize:0.85,color:'#94a3b8'}));return;}for(var i=0;i<files.length;i++){var f=files[i];var row=new bricks.HBox({bgcolor:i%2?'#f8fafc':'#fff',padding:'6px 10px',alignItems:'center',gap:'8px',borderRadius:'4px'});var icon=f.is_text?'📄':f.is_media?'🎬':'📁';row.add_widget(new bricks.Text({text:icon,cfontsize:1.2}));var nameW=new bricks.Text({text:f.name,cfontsize:0.9,color:'#1e293b',css:'filler'});row.add_widget(nameW);var sizeW=new bricks.Text({text:(f.size/1024).toFixed(1)+'KB',cfontsize:0.75,color:'#94a3b8'});row.add_widget(sizeW);(function(fp,fn,ft){row.dom_element.style.cursor='pointer';row.dom_element.addEventListener('click',function(){if(ft){openFile(fp,fn);}});})(f.path,f.name,f.is_text);right.add_widget(row);}}function openFile(path,name){var fpw=new bricks.PopupWindow({title:name,cwidth:70,cheight:32,auto_open:true});var wterm=new bricks.Wterm({css:'filler',padding:'0'});var saveBtn=new bricks.Button({label:'保存'});fpw.content_w.add_widget(wterm);fpw.content_w.add_widget(saveBtn);fetch('/pipeline-sdlc/api/workspace_file.dspy?action=read&path='+encodeURIComponent(path)).then(function(r){return r.json()}).then(function(d){if(d.error){wterm.write('Error: '+d.error);return;}wterm.write(d.content||'');saveBtn.bind('click',function(){var content=wterm.get_value();fetch('/pipeline-sdlc/api/workspace_file.dspy',{method:'POST',headers:{'Content-Type':'application/x-www-form-urlencoded'},body:'action=save&path='+encodeURIComponent(path)+'&content='+encodeURIComponent(content)}).then(function(r){return r.json()}).then(function(d){if(d.success){saveBtn.set_text('已保存');setTimeout(function(){saveBtn.set_text('保存');},2000);}});});});}loadTree();});"
}
]
}