R36: 榜单下载按钮移至 tab 组件右侧(重构 toolbar,tab 上移 page-toolbar)

- 用户反馈:下载按钮「靠近 tab 组件,不是筛选/搜索组件」
- 冲突排查:原 toolbar(s, false) 空态时 rank-toolbar 不渲染,若简单把按钮移进 rank-toolbar 会丢失 R33 设计的「空态也能看到更新按钮(首次抓取入口)」
- 重构 toolbar() 函数:
  - tab 始终在 page-toolbar 渲染(含空态/错误态)
  - rankUpdate 紧贴 tab 右侧(rank-tabs margin-left:auto 推右,按钮紧跟其后)
  - rank-toolbar 仅放筛选+翻页(withFilters 时)
- 复用 CSS:.page-toolbar .rank-tabs 紧凑样式(L603-604 已就绪)
- CDP 验证:tab+rankUpdate 都在 page-toolbar ✓;筛选保留 ✓
- 版本:data-pages.js x→y(CSS 不动)
This commit is contained in:
maogeigei committed 2026-09-03 17:41:24 +08:00
1 parent 373710c325
commit 82beea2ddc
3 files changed
+28 -15

No files matched your search

@@ -522,20 +522,13 @@ async function renderRanking(view) {
const st = { week: mkState(), hot: mkState(), likes: mkState() };
let tab = 'week';
const tabLabel = () => { const t = RANK_TABS.find(([k]) => k === tab); return t ? t[1] : ''; };
// tab 切换 + 赛道选择 + 时间切换 同一行(标题行只放 返回 | 标题,tab + 筛选放标题下一行 .rank-toolbar)
// 09-03 更新榜单按钮放标题行最右(.toolbar-right):三榜 tab 切换与空态(无本地数据文件)均可见,便于首次抓取
const toolbar = (s, withFilters) => `
<div class="page-toolbar">
${toolbarBack()}
<span class="page-title">热点数据</span>
<div class="toolbar-right">
<button class="btn btn-icon" id="rankUpdate" title="更新榜单数据:后台任务重新抓取三榜(账号周榜 5 赛道 / 视频热榜 / 点赞榜)最新一期并落盘;30 分钟内已更新会拦截防重复">${svgIcon('download', 16, 'currentColor')}</button>
</div>
// 09-03 tab 始终在 page-toolbar 渲染(含空态/错误态),下载按钮紧贴 tab 右侧;筛选+翻页放 rank-toolbar(withFilters 时)
const toolbar = (s, withFilters) => {
const tabsHtml = `<div class="rank-tabs" role="tablist" style="margin-left:auto">
${RANK_TABS.map(([k, label, tip]) => `<button class="rank-tab${k === tab ? ' active' : ''}" data-rank-tab="${k}"${tip ? ` title="${tip}"` : ''} role="tab">${label}</button>`).join('')}
</div>
${withFilters ? `<div class="rank-toolbar">
<div class="rank-tabs" role="tablist">
${RANK_TABS.map(([k, label, tip]) => `<button class="rank-tab${k === tab ? ' active' : ''}" data-rank-tab="${k}"${tip ? ` title="${tip}"` : ''} role="tab">${label}</button>`).join('')}
</div>
<button class="btn btn-icon" id="rankUpdate" title="更新榜单数据:后台任务重新抓取三榜(账号周榜 5 赛道 / 视频热榜 / 点赞榜)最新一期并落盘;30 分钟内已更新会拦截防重复">${svgIcon('download', 16, 'currentColor')}</button>`;
const filtersHtml = withFilters ? `<div class="rank-toolbar">
<div class="toolbar-right">
<select id="rankCat" class="input-select" title="赛道筛选">
<option value="">全部赛道</option>
@@ -545,7 +538,14 @@ async function renderRanking(view) {
<span class="pager-info" title="选择日期">${esc(s.date)}</span>
<button class="btn" id="rankNext" title="下一期">▶</button>
</div>
</div>` : ''}`;
</div>` : '';
return `<div class="page-toolbar">
${toolbarBack()}
<span class="page-title">热点数据</span>
${tabsHtml}
</div>
${filtersHtml}`;
};
// 标题列统一截断(作品标题很长):悬停 title 看全文
const titleTd = (text, url) => `<span class="rk-tl" title="${esc(String(text || '').replace(/"/g, '&quot;'))}">${url ? `<a class="link" data-ext="${esc(url)}">${esc(text)}</a>` : esc(text)}</span>`;
@@ -42,6 +42,6 @@
</div>
<script src="app.js?v=20260903v"></script>
<script src="data-pages.js?v=20260903x"></script>
<script src="data-pages.js?v=20260903y"></script>
</body>
</html>