pipeline-task/wwwroot/step_panel.ui
yumoqing b556ab0cdc feat: task center - human task interaction, artifact view, restart capability
- Add human task dspy: human_complete, human_list, approval_approve, approval_reject
- Add task_restart.dspy for restarting completed/failed tasks
- Enhance task_detail.ui: inline human task forms, approval buttons, restart
- New step_panel.ui: view/modify step artifacts with cascade rerun
- Update task_list.ui: Tabular with search_form filter by pipeline/state
- Update index.ui: embed task list Tabular inline
- Update load_path.py: register new dspy/ui paths
2026-07-08 21:03:32 +08:00

118 lines
5.1 KiB
XML

{% set node_data = get_step_node_data(request) %}
{% set task_id = params_kw.get('task_id', '') %}
{% set step_name = params_kw.get('step_name', '') %}
{% set mode = params_kw.get('mode', 'view') %}
{
"widgettype": "VBox",
"options": {"width": "100%", "padding": "16px"},
"subwidgets": [
{
"widgettype": "HBox",
"options": {"width": "100%", "marginBottom": "16px", "gap": "12px", "alignItems": "center"},
"subwidgets": [
{
"widgettype": "Button",
"options": {"label": "← 返回任务详情"},
"binds": [{
"wid": "self", "event": "click", "actiontype": "urlwidget",
"target": "app.pipeline_task_content",
"options": {"url": "{{entire_url('task_detail.ui')}}?task_id={{task_id}}"},
"mode": "replace"
}]
},
{"widgettype": "Title", "options": {"text": "步骤产物: {{step_name}}", "cfontsize": 18}}
]
},
{% if node_data.success %}
{
"widgettype": "VBox",
"options": {"width": "100%"},
"subwidgets": [
{% if node_data.input %}
{
"widgettype": "VBox",
"options": {"width": "100%", "bgcolor": "var(--card-bg)", "padding": "16px", "marginBottom": "12px"},
"subwidgets": [
{"widgettype": "Text", "options": {"text": "📥 输入产物", "cfontsize": 15}},
{"widgettype": "Text", "options": {"text": "{{json.dumps(node_data.input, ensure_ascii=False)}}"}}
]
},
{% endif %}
{% if node_data.output %}
{
"widgettype": "VBox",
"options": {"width": "100%", "bgcolor": "var(--card-bg)", "padding": "16px", "marginBottom": "12px"},
"subwidgets": [
{"widgettype": "Text", "options": {"text": "📤 输出产物", "cfontsize": 15}},
{"widgettype": "Text", "options": {"text": "{{json.dumps(node_data.output, ensure_ascii=False)}}"}}
]
},
{% endif %}
{% if not node_data.input and not node_data.output %}
{"widgettype": "Text", "options": {"text": "该步骤暂无产物数据"}},
{% endif %}
{
"widgettype": "Filler"
}
]
},
{% else %}
{
"widgettype": "Text",
"options": {"text": "加载失败: {{node_data.message or '未知错误'}}"}
},
{% endif %}
{% if mode == 'edit' %}
{
"widgettype": "VBox",
"options": {"width": "100%", "bgcolor": "var(--card-bg)", "padding": "16px", "marginTop": "16px"},
"subwidgets": [
{"widgettype": "Text", "options": {"text": "修改产物并级联重跑", "cfontsize": 15}},
{
"widgettype": "Form",
"options": {
"name": "modify_form",
"submit_url": "{{entire_url('api/task_modify.dspy')}}",
"fields": [
{"name": "task_id", "uitype": "hide", "value": "{{task_id}}"},
{"name": "step_name", "uitype": "hide", "value": "{{step_name}}"},
{"name": "rerun_from", "uitype": "hide", "value": "node"},
{"name": "content", "uitype": "text", "label": "修改后的JSON产物", "placeholder": "留空则直接重跑此步骤及下游"}
]
},
"binds": [
{
"wid": "self", "event": "submited",
"actiontype": "script",
"target": "self",
"script": "var tid='{{task_id}}';alert('修改成功,产线继续执行');location.href='{{entire_url('task_detail.ui')}}?task_id='+tid"
}
]
}
]
},
{% else %}
{
"widgettype": "HBox",
"options": {"width": "100%", "marginTop": "16px", "gap": "8px"},
"subwidgets": [
{
"widgettype": "Button",
"options": {"label": "修改产物"},
"binds": [{
"wid": "self", "event": "click", "actiontype": "urlwidget",
"target": "app.pipeline_task_content",
"options": {"url": "{{entire_url('step_panel.ui')}}?task_id={{task_id}}&step_name={{step_name}}&mode=edit"},
"mode": "replace"
}]
},
{"widgettype": "Filler"}
]
},
{% endif %}
{"widgettype": "Filler"}
]
}