Files
SoonDesign/frontend-web/pages/admin/assets/js/components/tabs.js
T
24kycj 88c6ce8ccc 重构 monorepo 并完善网页端订阅与首页体验
- 迁移为 frontend-web、frontend-electron、backend-web 与 docker 部署结构
- 网页端:订阅门禁二次弹窗、套餐/支付组件化、顶栏分组对齐
- 首页:最近文件与模板库布局优化,缩略图对齐,下载与删除操作
- 新增管理后台、支付与云端文件 API,更新 README 与项目规范

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-08 18:17:39 +08:00

41 lines
1.6 KiB
JavaScript

(function () {
'use strict';
var I = function () { return window.AdminI18n; };
function html(id, tabs, panels, activeId) {
activeId = activeId || (tabs[0] && tabs[0].id);
var nav = tabs.map(function (t) {
var cls = t.id === activeId ? ' soon-admin-tabs__tab is-active' : ' soon-admin-tabs__tab';
return '<button type="button" class="' + cls.trim() + '" data-tab="' + I().esc(t.id) + '">' +
I().esc(t.label) + '</button>';
}).join('');
var body = tabs.map(function (t) {
var vis = t.id === activeId ? ' is-active' : '';
return '<div class="soon-admin-tabs__panel' + vis + '" data-panel="' + I().esc(t.id) + '">' +
(panels[t.id] || '') + '</div>';
}).join('');
return '<div class="soon-admin-tabs" id="' + I().esc(id) + '">' +
'<nav class="soon-admin-tabs__nav" role="tablist">' + nav + '</nav>' +
'<div class="soon-admin-tabs__body">' + body + '</div></div>';
}
function bind(root, onChange) {
if (!root) return;
root.querySelectorAll('.soon-admin-tabs__tab').forEach(function (btn) {
btn.onclick = function () {
var tabId = btn.dataset.tab;
root.querySelectorAll('.soon-admin-tabs__tab').forEach(function (b) {
b.classList.toggle('is-active', b.dataset.tab === tabId);
});
root.querySelectorAll('.soon-admin-tabs__panel').forEach(function (p) {
p.classList.toggle('is-active', p.dataset.panel === tabId);
});
if (typeof onChange === 'function') onChange(tabId);
};
});
}
window.AdminTabs = { html: html, bind: bind };
})();