pipeline-app/wwwroot/todo_badge.js

95 lines
5.4 KiB
JavaScript
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.

// 待办角标:1 分钟定时刷新 + 点击打开待办列表
// 由 HTML shell 自动加载(configuredServer.get_js_files 收集 wwwroot 下 .js,在 bricks.js 之后引入)
(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:'我的待办', 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(){
if (bricks.app && bricks.getWidgetById){
setInterval(function(){ window.refreshTodo(); }, 60000);
setTimeout(function(){ window.refreshTodo(); }, 800);
} else {
setTimeout(_start, 300);
}
}
setTimeout(_start, 300);
})();