diff --git a/wwwroot/index.ui b/wwwroot/index.ui index 8170c3b..00d0484 100644 --- a/wwwroot/index.ui +++ b/wwwroot/index.ui @@ -1,495 +1,161 @@ { - "widgettype": "VBox", - "options": { - "width": "100%", - "height": "100%", - "padding": "0" - }, - "subwidgets": [ - { - "widgettype": "HBox", - "options": { + "widgettype": "VBox", + "options": { "width": "100%", - "alignItems": "center", - "padding": "24px 24px 12px 24px", - "cheight": 6 - }, - "subwidgets": [ + "height": "100%", + "padding": "0" + }, + "subwidgets": [ { - "widgettype": "Title2", - "options": { - "text": "开发产线" - } + "widgettype": "HBox", + "options": { + "width": "100%", + "alignItems": "center", + "padding": "16px 24px 8px 24px", + "cheight": 6, + "gap": "12px" + }, + "subwidgets": [ + { "widgettype": "Title2", "options": { "text": "开发产线驾驶舱" } }, + { "widgettype": "Text", "options": { "text": "AI驱动的对话式开发", "cfontsize": 0.9, "color": "#94a3b8" } }, + { "widgettype": "Filler" }, + { + "widgettype": "Button", + "options": { "name": "refresh", "label": "刷新", "css": "small" }, + "binds": [{ + "wid": "self", "event": "click", "actiontype": "script", "target": "self", + "script": "var c=bricks.getWidgetById('chat_scroll');if(c)c.render({});var s=bricks.getWidgetById('stats_row');if(s)s.render({});" + }] + } + ] }, { - "widgettype": "Filler" + "widgettype": "HBox", + "options": { + "width": "100%", + "padding": "8px 24px 8px 24px", + "cheight": 4, + "gap": "16px" + }, + "subwidgets": [ + { + "widgettype": "urlwidget", + "id": "stats_row", + "options": { + "url": "{{entire_url('/pipeline-sdlc/api/cockpit_stats.dspy')}}", + "method": "GET" + } + } + ] }, { - "widgettype": "Text", - "options": { - "text": "项目管理、迭代跟踪、测试与部署", - "cfontsize": 1.2 - } + "widgettype": "VBox", + "options": { + "css": "filler", + "width": "100%", + "height": "100%", + "padding": "0 24px 0 24px", + "gap": "0" + }, + "subwidgets": [ + { + "widgettype": "VScrollPanel", + "id": "chat_scroll", + "options": { + "css": "filler", + "width": "100%", + "height": "100%", + "bgcolor": "#f8fafc", + "border": "1px solid #e2e8f0", + "borderBottom": "none", + "borderRadius": "8px 8px 0 0", + "padding": "16px" + }, + "subwidgets": [ + { + "widgettype": "VBox", + "options": { "alignItems": "center", "padding": "40px 0", "gap": "12px" }, + "subwidgets": [ + { "widgettype": "Text", "options": { "text": "选择一个迭代后,在下方输入你的需求。", "cfontsize": 1, "color": "#64748b" } }, + { "widgettype": "Text", "options": { "text": "Agent 将自动分析需求、生成设计、驱动产线执行。", "cfontsize": 0.85, "color": "#94a3b8" } } + ] + } + ] + }, + { + "widgettype": "VBox", + "options": { + "width": "100%", + "bgcolor": "#fff", + "border": "1px solid #e2e8f0", + "borderTop": "none", + "borderRadius": "0 0 8px 8px", + "padding": "10px 14px 10px 14px", + "gap": "6px" + }, + "subwidgets": [ + { + "widgettype": "HBox", + "id": "file_list", + "options": { + "width": "100%", + "wrap": "wrap", + "gap": "4px", + "minHeight": "0" + }, + "subwidgets": [] + }, + { + "widgettype": "VBox", + "id": "uitext_wrapper", + "options": { + "width": "100%" + }, + "binds": [ + { + "wid": "self", + "event": "render", + "actiontype": "script", + "target": "self", + "script": "if(!this._built){this._built=true;var c=this.dom_element;var ut=new bricks.UiText({name:'cockpit_input',placeholder:'输入需求或回复 Agent...'});ut.dom_element.style.cssText='width:100%;min-height:44px;max-height:160px;padding:10px 12px;border:1px solid #e2e8f0;border-radius:8px;font-size:14px;font-family:inherit;resize:none;outline:none;box-sizing:border-box;line-height:1.5';c.appendChild(ut.dom_element);ut.handleInput();this._uitext=ut;}" + } + ] + }, + { + "widgettype": "HBox", + "options": { + "width": "100%", + "alignItems": "center", + "gap": "8px", + "padding": "4px 0 0 0" + }, + "subwidgets": [ + { + "widgettype": "Button", + "options": { "name": "attach_btn", "label": "添加文件" }, + "binds": [ + { + "wid": "self", "event": "click", "actiontype": "script", "target": "self", + "script": "var inp=document.createElement('input');inp.type='file';inp.multiple=true;inp.onchange=function(){var list=document.getElementById('cockpit_file_bag');if(!list){list=document.createElement('div');list.id='cockpit_file_bag';list.style.cssText='display:flex;flex-wrap:wrap;gap:4px';var fl=bricks.getWidgetById('file_list');if(fl)fl.dom_element.appendChild(list);}for(var i=0;i×';list.appendChild(chip);}};inp.click();" + } + ] + }, + { "widgettype": "Filler" }, + { + "widgettype": "Button", + "options": { "name": "send_btn", "label": "发送", "css": "primary" }, + "binds": [ + { + "wid": "self", "event": "click", "actiontype": "script", "target": "self", + "script": "var ut=document.getElementsByName('cockpit_input')[0];var msg=ut?ut.value.trim():'';if(!msg){bricks.show_error({title:'提示',message:'请输入内容'});return;}var iter=bricks.getWidgetById('current_iteration_id');var iid=iter?iter.options.value:'';if(!iid){bricks.show_error({title:'提示',message:'请先选择迭代'});return;}var files=[];var bag=document.getElementById('cockpit_file_bag');if(bag){var chips=bag.querySelectorAll('[data-fn]');for(var j=0;j", - "width": "24px", - "height": "24px" - } - } - ] - }, - { - "widgettype": "Title3", - "options": { - "text": "驾驶舱", - "marginBottom": "4px" - } - }, - { - "widgettype": "Text", - "options": { - "text": "AI驱动的对话式开发", - "cfontsize": 0.9, - "color": "#94a3b8" - } - } - ] - }, - { - "widgettype": "VBox", - "options": { - "css": "card", - "cwidth": 23, - "cheight": 12, - "padding": "24px", - "cursor": "pointer", - "bgcolor": "#fff" - }, - "binds": [ - { - "wid": "self", - "event": "click", - "actiontype": "urlwidget", - "target": "app.main_content", - "options": { - "url": "{{entire_url('/pipeline-sdlc/sd_projects/')}}" - }, - "mode": "replace" - } - ], - "subwidgets": [ - { - "widgettype": "VBox", - "options": { - "width": "44px", - "height": "44px", - "bgcolor": "#EFF6FF", - "borderRadius": "12px", - "alignItems": "center", - "justifyContent": "center", - "marginBottom": "12px" - }, - "subwidgets": [ - { - "widgettype": "Svg", - "options": { - "svg": "", - "width": "24px", - "height": "24px" - } - } - ] - }, - { - "widgettype": "Title3", - "options": { - "text": "项目管理", - "marginBottom": "4px" - } - }, - { - "widgettype": "Text", - "options": { - "text": "创建与管理软件项目", - "cfontsize": 1.2 - } - } - ] - }, - { - "widgettype": "VBox", - "options": { - "css": "card", - "cwidth": 23, - "cheight": 12, - "padding": "24px", - "cursor": "pointer", - "bgcolor": "#fff" - }, - "binds": [ - { - "wid": "self", - "event": "click", - "actiontype": "urlwidget", - "target": "app.main_content", - "options": { - "url": "{{entire_url('/pipeline-sdlc/sd_iterations/')}}" - }, - "mode": "replace" - } - ], - "subwidgets": [ - { - "widgettype": "VBox", - "options": { - "width": "44px", - "height": "44px", - "bgcolor": "#F0FDF4", - "borderRadius": "12px", - "alignItems": "center", - "justifyContent": "center", - "marginBottom": "12px" - }, - "subwidgets": [ - { - "widgettype": "Svg", - "options": { - "svg": "", - "width": "24px", - "height": "24px" - } - } - ] - }, - { - "widgettype": "Title3", - "options": { - "text": "迭代管理", - "marginBottom": "4px" - } - }, - { - "widgettype": "Text", - "options": { - "text": "规划Sprint与迭代周期", - "cfontsize": 1.2 - } - } - ] - }, - { - "widgettype": "VBox", - "options": { - "css": "card", - "cwidth": 23, - "cheight": 12, - "padding": "24px", - "cursor": "pointer", - "bgcolor": "#fff" - }, - "binds": [ - { - "wid": "self", - "event": "click", - "actiontype": "urlwidget", - "target": "app.main_content", - "options": { - "url": "{{entire_url('/pipeline-sdlc/sd_test_plans/')}}" - }, - "mode": "replace" - } - ], - "subwidgets": [ - { - "widgettype": "VBox", - "options": { - "width": "44px", - "height": "44px", - "bgcolor": "#F5F3FF", - "borderRadius": "12px", - "alignItems": "center", - "justifyContent": "center", - "marginBottom": "12px" - }, - "subwidgets": [ - { - "widgettype": "Svg", - "options": { - "svg": "", - "width": "24px", - "height": "24px" - } - } - ] - }, - { - "widgettype": "Title3", - "options": { - "text": "测试计划", - "marginBottom": "4px" - } - }, - { - "widgettype": "Text", - "options": { - "text": "制定与跟踪测试计划", - "cfontsize": 1.2 - } - } - ] - }, - { - "widgettype": "VBox", - "options": { - "css": "card", - "cwidth": 23, - "cheight": 12, - "padding": "24px", - "cursor": "pointer", - "bgcolor": "#fff" - }, - "binds": [ - { - "wid": "self", - "event": "click", - "actiontype": "urlwidget", - "target": "app.main_content", - "options": { - "url": "{{entire_url('/pipeline-sdlc/sd_test_cases/')}}" - }, - "mode": "replace" - } - ], - "subwidgets": [ - { - "widgettype": "VBox", - "options": { - "width": "44px", - "height": "44px", - "bgcolor": "#FFF7ED", - "borderRadius": "12px", - "alignItems": "center", - "justifyContent": "center", - "marginBottom": "12px" - }, - "subwidgets": [ - { - "widgettype": "Svg", - "options": { - "svg": "", - "width": "24px", - "height": "24px" - } - } - ] - }, - { - "widgettype": "Title3", - "options": { - "text": "测试用例", - "marginBottom": "4px" - } - }, - { - "widgettype": "Text", - "options": { - "text": "编写与管理测试用例", - "cfontsize": 1.2 - } - } - ] - }, - { - "widgettype": "VBox", - "options": { - "css": "card", - "cwidth": 23, - "cheight": 12, - "padding": "24px", - "cursor": "pointer", - "bgcolor": "#fff" - }, - "binds": [ - { - "wid": "self", - "event": "click", - "actiontype": "urlwidget", - "target": "app.main_content", - "options": { - "url": "{{entire_url('/pipeline-sdlc/sd_bugs/')}}" - }, - "mode": "replace" - } - ], - "subwidgets": [ - { - "widgettype": "VBox", - "options": { - "width": "44px", - "height": "44px", - "bgcolor": "#FEF2F2", - "borderRadius": "12px", - "alignItems": "center", - "justifyContent": "center", - "marginBottom": "12px" - }, - "subwidgets": [ - { - "widgettype": "Svg", - "options": { - "svg": "", - "width": "24px", - "height": "24px" - } - } - ] - }, - { - "widgettype": "Title3", - "options": { - "text": "Bug管理", - "marginBottom": "4px" - } - }, - { - "widgettype": "Text", - "options": { - "text": "跟踪与修复项目缺陷", - "cfontsize": 1.2 - } - } - ] - }, - { - "widgettype": "VBox", - "options": { - "css": "card", - "cwidth": 23, - "cheight": 12, - "padding": "24px", - "cursor": "pointer", - "bgcolor": "#fff" - }, - "binds": [ - { - "wid": "self", - "event": "click", - "actiontype": "urlwidget", - "target": "app.main_content", - "options": { - "url": "{{entire_url('/pipeline-sdlc/sd_deploy_envs/')}}" - }, - "mode": "replace" - } - ], - "subwidgets": [ - { - "widgettype": "VBox", - "options": { - "width": "44px", - "height": "44px", - "bgcolor": "#F0FDFA", - "borderRadius": "12px", - "alignItems": "center", - "justifyContent": "center", - "marginBottom": "12px" - }, - "subwidgets": [ - { - "widgettype": "Svg", - "options": { - "svg": "", - "width": "24px", - "height": "24px" - } - } - ] - }, - { - "widgettype": "Title3", - "options": { - "text": "部署环境", - "marginBottom": "4px" - } - }, - { - "widgettype": "Text", - "options": { - "text": "配置开发测试生产环境", - "cfontsize": 1.2 - } - } - ] - } - ] - } - ] - }, - { - "widgettype": "VScrollPanel", - "id": "pipeline_sdlc_content", - "options": { - "css": "filler", - "width": "100%", - "height": "100%" - } - } - ] -} \ No newline at end of file + ] +} diff --git a/wwwroot/sd_cockpit/index.ui b/wwwroot/sd_cockpit/index.ui index 5368708..00d0484 100644 --- a/wwwroot/sd_cockpit/index.ui +++ b/wwwroot/sd_cockpit/index.ui @@ -147,7 +147,7 @@ "binds": [ { "wid": "self", "event": "click", "actiontype": "script", "target": "self", - "script": "var ut=document.getElementsByName('cockpit_input')[0];var msg=ut?ut.value.trim():'';if(!msg){bricks.show_error({title:'提示',message:'请输入内容'});return;}var iter=bricks.getWidgetById('current_iteration_id');var iid=iter?iter.options.value:'';if(!iid){bricks.show_error({title:'提示',message:'请先选择迭代'});return;}var files=[];var bag=document.getElementById('cockpit_file_bag');if(bag){var chips=bag.querySelectorAll('[data-fn]');for(var j=0;j