ymq af178f98ad fix: 机构远程空间配置表单取值/赋值 bug + get 支持 owner_type
根因:bricks.Form.getValue() 返回 FormData 对象(非普通对象),v.remote_host=undefined 传空值报格式非法;setValue 是 InlineForm 方法,Form 无此方法导致加载失败
- 取值 getValue→_getValue(返回 {name:value} 普通对象)
- 加载遍历 name_inputs 逐个 setValue
- work_env.dspy get 加 owner_type 参数,org 页面加载 org 级(原 user 级优先导致看不到 org 配置)
2026-08-14 15:15:24 +08:00

120 lines
5.5 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{
"widgettype": "VBox",
"options": {"width": "100%", "height": "100%", "padding": "24px", "gap": "16px"},
"subwidgets": [
{
"widgettype": "Html",
"options": {
"html": "<script>setTimeout(function(){fetch('/pipeline-sdlc/api/work_env.dspy?action=get&owner_type=org').then(function(r){return r.json()}).then(function(d){if(d.ok&&d.env){var f=bricks.getWidgetById('remote_form',bricks.app);if(f){var env=d.env||{};for(var k in env){if(f.name_inputs&&f.name_inputs[k]){f.name_inputs[k].setValue(env[k]);}}}}})},300);</script>",
"height": "0",
"width": "0"
}
},
{
"widgettype": "Title3",
"options": {"text": "机构远程空间配置"}
},
{
"widgettype": "Text",
"options": {
"text": "设置机构的远程工作空间。远程模式下,机构所有用户的工作目录与沙箱命令都在远程主机执行(远程主机需部署 bwrap。",
"cfontsize": 0.9,
"color": "#64748b"
}
},
{
"widgettype": "VBox",
"options": {"bgcolor": "#fff", "border": "1px solid #e2e8f0", "borderRadius": "12px", "padding": "20px", "gap": "12px"},
"subwidgets": [
{
"widgettype": "Form",
"id": "remote_form",
"options": {
"name": "remote_form",
"cols": 2,
"fields": [
{
"name": "mode",
"uitype": "code",
"label": "工作模式",
"cwidth": 12,
"data": [
{"value": "local", "text": "本地bwrap 沙箱)"},
{"value": "remote", "text": "远程SSH + bwrap 沙箱)"}
],
"valueField": "value",
"textField": "text"
},
{
"name": "remote_host",
"uitype": "str",
"label": "远程主机",
"cwidth": 24,
"placeholder": "例如 192.168.1.10 或 remote.example.com"
},
{
"name": "remote_port",
"uitype": "str",
"label": "远程端口",
"cwidth": 8,
"value": "22"
},
{
"name": "remote_user",
"uitype": "str",
"label": "远程用户",
"cwidth": 12
},
{
"name": "remote_dir",
"uitype": "str",
"label": "远程目录",
"cwidth": 24,
"placeholder": "相对路径,从远程用户 home 目录开始,例如 work/pipeline"
}
]
}
},
{
"widgettype": "HBox",
"options": {"gap": "12px"},
"subwidgets": [
{
"widgettype": "Button",
"id": "save_btn",
"options": {"label": "保存配置"},
"binds": [{
"wid": "self", "event": "click", "actiontype": "script", "target": "self",
"script": "var f=bricks.getWidgetById('remote_form',bricks.app);var v=f?f._getValue():{};var body=new URLSearchParams();body.append('action','set');body.append('owner_type','org');body.append('mode',v.mode||'local');body.append('remote_host',v.remote_host||'');body.append('remote_port',v.remote_port||'22');body.append('remote_user',v.remote_user||'');body.append('remote_dir',v.remote_dir||'');fetch('/pipeline-sdlc/api/work_env.dspy',{method:'POST',body:body}).then(function(r){return r.json()}).then(function(d){if(d.ok){bricks.show_message({title:'成功',message:'远程空间配置已保存'});}else{bricks.show_error({title:'失败',message:d.error||'未知错误'});}});"
}]
},
{
"widgettype": "Button",
"id": "test_btn",
"options": {"label": "测试远程连接"},
"binds": [{
"wid": "self", "event": "click", "actiontype": "script", "target": "self",
"script": "var f=bricks.getWidgetById('remote_form',bricks.app);var v=f?f._getValue():{};var body=new URLSearchParams();body.append('action','ensure_remote_bwrap');body.append('remote_host',v.remote_host||'');body.append('remote_port',v.remote_port||'22');body.append('remote_user',v.remote_user||'');fetch('/pipeline-sdlc/api/work_env.dspy',{method:'POST',body:body}).then(function(r){return r.json()}).then(function(d){if(d.ok){bricks.show_message({title:'连接成功',message:'远程 bwrap 位置: '+(d.location||'unknown')});}else{bricks.show_error({title:'连接失败',message:d.error||'未知错误'});}});"
}]
},
{
"widgettype": "Button",
"id": "pubkey_btn",
"options": {"label": "获取机构公钥"},
"binds": [{
"wid": "self", "event": "click", "actiontype": "script", "target": "self",
"script": "fetch('/pipeline-sdlc/api/work_env.dspy?action=get_org_pubkey').then(function(r){return r.json()}).then(function(d){if(d.ok){var t=bricks.getWidgetById('pubkey_text',bricks.app);if(t)t.set_text('机构公钥(复制到远程主机 ~/.ssh/authorized_keys\\n'+d.pubkey);}else{bricks.show_error({title:'失败',message:d.error||'未知错误'});}});"
}]
}
]
},
{
"widgettype": "Text",
"id": "pubkey_text",
"options": {"text": "", "whiteSpace": "pre-wrap", "cfontsize": 0.85, "color": "#334155"}
}
]
}
]
}