pipeline-app/wwwroot/index_tab.js
yumoqing 6cc8afba82 fix(tabpanel): 菜单重新点击时刷新 tab 内容,修复只切 tab 不更新数据
open_tab 对已存在的 tab 用缓存 content_buffer 直接 switch_content(不重新加载),
当前 tab 重新点击则直接 return,导致菜单重新点击时 tab 高亮变了但内容陈旧。
修复:已存在 tab 默认刷新(delete 缓存后重新 widgetBuild 重新请求 url 构建),
desc.refresh === false 时保留「用缓存不刷新」的旧行为。
2026-08-20 17:51:28 +08:00

80 lines
3.7 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.

// pipeline-app 首页 TabPanel 动态 tab 支持
// 由 HTML shell 自动加载configuredServer.get_js_files 收集 wwwroot 下 .js
(function(){
if (typeof bricks === 'undefined' || !bricks.TabPanel) return;
if (bricks.TabPanel.prototype._dyn_patched) return;
bricks.TabPanel.prototype._dyn_patched = true;
// 修复原生 add_tab 的 bugthis.add_removeable 不存在(应为 toolbar.add_removable
// 且 createTool 内部已调用 add_removable这里只需创建 tool 按钮
bricks.TabPanel.prototype.add_tab = function(desc){
this.toolbar.createTool(desc);
};
// 异步加载 tab 的 content不阻塞 open_tab401 会触发登录框,等登录后重试)
bricks.TabPanel.prototype._load_tab_content = async function(desc){
if (this.content_buffer[desc.name]){
if (this.cur_tab_name === desc.name) this.switch_content(this.content_buffer[desc.name]);
return;
}
var w = await bricks.widgetBuild(desc.content, this, {});
this.content_buffer[desc.name] = w;
if (w && this.cur_tab_name === desc.name) this.switch_content(w);
};
// 动态打开 tab已存在opts.items 同名)则切换,不存在则新增。
// 同步返回:立即创建/切换 + 高亮 tab 按钮content 交由 _load_tab_content 异步加载,
// 避免 await widgetBuild 被 401 登录框阻塞导致 tab 不切换。
bricks.TabPanel.prototype.open_tab = function(desc){
var existing = null;
for (var i=0;i<this.opts.items.length;i++){
if (this.opts.items[i].name === desc.name){ existing = this.opts.items[i]; break; }
}
if (existing){
// 已存在的 tab切换 + 刷新内容。重新点击菜单时数据已变,
// 若只切 tab 用缓存 content_buffer 会显示陈旧数据。默认刷新(重新构建),
// desc.refresh === false 时保留「用缓存不刷新」的旧行为。
var need_refresh = desc.refresh !== false;
if (desc.name !== this.cur_tab_name){
this.cur_tab_name = desc.name;
if (this.toolbar && this.toolbar.click) this.toolbar.click(desc.name);
}
if (need_refresh){
delete this.content_buffer[desc.name];
this._load_tab_content(existing);
} else {
var w = this.content_buffer[desc.name];
if (w) this.switch_content(w);
else this._load_tab_content(existing);
}
return;
}
// 新增
desc.content = desc.content || {"widgettype":"urlwidget","options":{"url":desc.url}};
this.opts.items.push(desc);
if (this.add_tab) this.add_tab(desc);
this.cur_tab_name = desc.name;
if (this.toolbar && this.toolbar.click) this.toolbar.click(desc.name);
this._load_tab_content(desc);
};
// 修复 show_tabcontent 的 bugcur_tab_name 赋值用了未定义变量 name
bricks.TabPanel.prototype.show_tabcontent = async function(event){
var tdesc = event.params;
if (tdesc.name === this.cur_tab_name) return;
var items = this.opts.items;
for (var i=0;i<items.length;i++){
if (tdesc.name === items[i].name){
var w = this.content_buffer[tdesc.name];
if (!w){
var c = items[i].content || {"widgettype":"urlwidget","options":{"url":items[i].url}};
w = await bricks.widgetBuild(c, this, {});
if (w) this.content_buffer[tdesc.name] = w;
}
if (w){ this.cur_tab_name = tdesc.name; this.switch_content(w); }
return;
}
}
};
})();