diff --git a/wwwroot/index.ui b/wwwroot/index.ui index 8cda9b9..77a99e2 100644 --- a/wwwroot/index.ui +++ b/wwwroot/index.ui @@ -57,7 +57,7 @@ "widgettype": "Button", "id": "todo_badge", "options": { - "label": "", + "label": "🔔 待办", "css": "text", "color": "#fbbf24", "cfontsize": 0.85 diff --git a/wwwroot/todo_badge.js b/wwwroot/todo_badge.js index 3b0f29f..004acc9 100644 --- a/wwwroot/todo_badge.js +++ b/wwwroot/todo_badge.js @@ -3,7 +3,83 @@ (function(){ if (typeof bricks === 'undefined') return; - window.refreshTodo=function(){fetch('/pipeline-sdlc/api/project_human_count.dspy').then(function(r){return r.json()}).then(function(d){var n=(d&&d.count)||0;var b=bricks.getWidgetById&&bricks.getWidgetById('todo_badge',bricks.app);if(b&&b.text_w){b.text_w.set_text(n>0?('待办 '+n):'');}});};window.openMyTodos=function(){var pw=new bricks.PopupWindow({title:'我的待办',cwidth:70,cheight:40,auto_open:true});var vs=new bricks.VScrollPanel({css:'filler',padding:'12px',gap:'8px'});pw.content_w.add_widget(vs);fetch('/pipeline-sdlc/api/my_todos.dspy').then(function(r){return r.json()}).then(function(d){var todos=(d&&d.todos)||[];if(todos.length===0){vs.add_widget(new bricks.Text({text:'暂无待办',cfontsize:0.9,color:'#94a3b8'}));return;}todos.forEach(function(t){var src=t.source||'';var title=src==='question'?(t.question||''):(t.title||'');var label=src==='question'?'问题':(t.task_type==='bug_acceptance'?'Bug验收':'人类任务');var card=new bricks.VBox({bgcolor:'#fff',border:'1px solid #e2e8f0',borderRadius:'8px',padding:'10px 14px',gap:'6px',marginBottom:'4px'});var hdr=new bricks.HBox({alignItems:'center',gap:'8px'});hdr.add_widget(new bricks.Text({text:label,cfontsize:0.7,color:'#ffffff',padding:'1px 8px',style:{background:src==='question'?'#8b5cf6':(t.task_type==='bug_acceptance'?'#f0a040':'#2563eb'),borderRadius:'10px',fontWeight:'bold'}}));hdr.add_widget(new bricks.Text({text:title,cfontsize:0.9,color:'#1e293b',fontWeight:'bold'}));card.add_widget(hdr);if(t.project_name)card.add_widget(new bricks.Text({text:'项目:'+t.project_name,cfontsize:0.7,color:'#94a3b8'}));if(src==='human_task'&&t.task_type==='bug_acceptance'){var hb=new bricks.HBox({gap:'6px'});var okb=new bricks.Button({label:'通过',css:'small'});okb.set_click(function(){fetch('/pipeline-sdlc/api/bug_accept.dspy',{method:'POST',headers:{'Content-Type':'application/x-www-form-urlencoded'},body:'bug_id='+encodeURIComponent(t.bug_id)+'&accept=1'}).then(function(r){return r.json()}).then(function(d){alert(d.success?'验收通过,Bug已关闭':(d.error||'失败'));if(d.success){pw.destroy();refreshTodo();}});});var nob=new bricks.Button({label:'不通过',css:'small'});nob.set_click(function(){fetch('/pipeline-sdlc/api/bug_accept.dspy',{method:'POST',headers:{'Content-Type':'application/x-www-form-urlencoded'},body:'bug_id='+encodeURIComponent(t.bug_id)+'&accept=0'}).then(function(r){return r.json()}).then(function(d){alert(d.success?'验收不通过,Bug已重新打开':(d.error||'失败'));if(d.success){pw.destroy();refreshTodo();}});});hb.add_widget(okb);hb.add_widget(nob);card.add_widget(hb);}else if(src==='human_task'){var db=new bricks.Button({label:'处理',css:'small'});db.set_click(function(){var v=prompt('请输入处理结果:','');if(v===null)return;fetch('/pipeline-sdlc/api/human_task_complete.dspy',{method:'POST',headers:{'Content-Type':'application/x-www-form-urlencoded'},body:'human_task_id='+encodeURIComponent(t.id)+'&result_data='+encodeURIComponent(JSON.stringify({content:v}))}).then(function(r){return r.json()}).then(function(d){alert(d.success?'已提交,等待QC检查':(d.error||'失败'));if(d.success){pw.destroy();refreshTodo();}});});card.add_widget(db);}vs.add_widget(card);});});}; + window.refreshTodo = function(){ + fetch('/pipeline-sdlc/api/project_human_count.dspy') + .then(function(r){ return r.json(); }) + .then(function(d){ + var n = (d && d.count) || 0; + var b = bricks.getWidgetById && bricks.getWidgetById('todo_badge', bricks.app); + if (b && b.text_w) { + b.text_w.set_text(n > 0 ? ('🔔 待办 ' + n) : '🔔 待办'); + } + }); + }; + + window.openMyTodos = function(){ + var pw = new bricks.PopupWindow({title:'我的待办', width:'72%', height:'80%', auto_open:true}); + var vs = new bricks.VScrollPanel({css:'filler', padding:'12px', gap:'8px'}); + pw.content_w.add_widget(vs); + fetch('/pipeline-sdlc/api/my_todos.dspy') + .then(function(r){ return r.json(); }) + .then(function(d){ + var todos = (d && d.todos) || []; + if (todos.length === 0) { + vs.add_widget(new bricks.Text({text:'暂无待办', cfontsize:0.9, color:'#94a3b8'})); + return; + } + todos.forEach(function(t){ + var src = t.source || ''; + var title = src === 'question' ? (t.question || '') : (t.title || ''); + var label = src === 'question' ? '问题' : (t.task_type === 'bug_acceptance' ? 'Bug验收' : '人类任务'); + var card = new bricks.VBox({bgcolor:'#fff', border:'1px solid #e2e8f0', borderRadius:'8px', padding:'10px 14px', gap:'6px', marginBottom:'4px'}); + var hdr = new bricks.HBox({alignItems:'center', gap:'8px'}); + hdr.add_widget(new bricks.Text({text:label, cfontsize:0.7, color:'#ffffff', padding:'1px 8px', style:{background: src==='question' ? '#8b5cf6' : (t.task_type==='bug_acceptance' ? '#f0a040' : '#2563eb'), borderRadius:'10px', fontWeight:'bold'}})); + hdr.add_widget(new bricks.Text({text:title, cfontsize:0.9, color:'#1e293b', fontWeight:'bold'})); + card.add_widget(hdr); + if (t.project_name) { + card.add_widget(new bricks.Text({text:'项目:' + t.project_name, cfontsize:0.7, color:'#94a3b8'})); + } + if (src === 'human_task' && t.task_type === 'bug_acceptance') { + var hb = new bricks.HBox({gap:'6px'}); + var okb = new bricks.Button({label:'通过', css:'small'}); + okb.set_click(function(){ + fetch('/pipeline-sdlc/api/bug_accept.dspy', {method:'POST', headers:{'Content-Type':'application/x-www-form-urlencoded'}, body:'bug_id='+encodeURIComponent(t.bug_id)+'&accept=1'}) + .then(function(r){ return r.json(); }) + .then(function(d){ + alert(d.success ? '验收通过,Bug已关闭' : (d.error || '失败')); + if (d.success) { pw.destroy(); refreshTodo(); } + }); + }); + var nob = new bricks.Button({label:'不通过', css:'small'}); + nob.set_click(function(){ + fetch('/pipeline-sdlc/api/bug_accept.dspy', {method:'POST', headers:{'Content-Type':'application/x-www-form-urlencoded'}, body:'bug_id='+encodeURIComponent(t.bug_id)+'&accept=0'}) + .then(function(r){ return r.json(); }) + .then(function(d){ + alert(d.success ? '验收不通过,Bug已重新打开' : (d.error || '失败')); + if (d.success) { pw.destroy(); refreshTodo(); } + }); + }); + hb.add_widget(okb); + hb.add_widget(nob); + card.add_widget(hb); + } else if (src === 'human_task') { + var db = new bricks.Button({label:'处理', css:'small'}); + db.set_click(function(){ + var v = prompt('请输入处理结果:', ''); + if (v === null) return; + fetch('/pipeline-sdlc/api/human_task_complete.dspy', {method:'POST', headers:{'Content-Type':'application/x-www-form-urlencoded'}, body:'human_task_id='+encodeURIComponent(t.id)+'&result_data='+encodeURIComponent(JSON.stringify({content:v}))}) + .then(function(r){ return r.json(); }) + .then(function(d){ + alert(d.success ? '已提交,等待QC检查' : (d.error || '失败')); + if (d.success) { pw.destroy(); refreshTodo(); } + }); + }); + card.add_widget(db); + } + vs.add_widget(card); + }); + }); + }; // 等 app 初始化完成后启动定时刷新(.js 在 app.run 之前加载,故轮询等 app 就绪) function _start(){