diff --git a/index.html b/index.html index 0a8631a..3531965 100644 --- a/index.html +++ b/index.html @@ -36,6 +36,11 @@ .sum-metric{color:var(--accent);font-weight:600;} .total-row td{position:sticky;top:33px;background:#eef2f7;font-weight:700;color:var(--head);border-top:2px solid #cbd5e1;z-index:1;} .total-row td.txt{text-align:left;} + th.sortable{cursor:pointer;user-select:none;} + th.sortable:hover{background:#374151;} + th .arrow{display:inline-block;width:10px;margin-left:3px;font-size:10px;color:#93c5fd;} + th.sort-asc .arrow::after{content:"\25B2";} + th.sort-desc .arrow::after{content:"\25BC";} @@ -75,20 +80,20 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + + + @@ -160,10 +165,32 @@ function currentFilter(d){ return true; } -function renderDetail(){ - var rows = ALL.filter(currentFilter).sort(function(a,b){ +var SORT_KEY='clicks', SORT_TYPE='num', SORT_DIR='desc'; + +function sortRows(rows){ + var k=SORT_KEY, type=SORT_TYPE, dir=(SORT_DIR==='asc'?1:-1); + return rows.sort(function(a,b){ + var va,vb; + if(type==='dt'){ va=dtKey(a.dt); vb=dtKey(b.dt); } + else if(type==='num'){ va=Number(a[k])||0; vb=Number(b[k])||0; } + else { va=String(a[k]||''); vb=String(b[k]||''); return dir*va.localeCompare(vb); } + if(vavb) return 1*dir; + // 次级排序:dt 降序、clicks 降序,保持稳定观感 return dtKey(b.dt)-dtKey(a.dt) || (b.clicks-a.clicks); }); +} + +function updateSortArrows(){ + document.querySelectorAll('#detailTable th.sortable').forEach(function(th){ + th.classList.remove('sort-asc','sort-desc'); + if(th.getAttribute('data-key')===SORT_KEY){ + th.classList.add(SORT_DIR==='asc'?'sort-asc':'sort-desc'); + } + }); +} + +function renderDetail(){ + var rows = sortRows(ALL.filter(currentFilter)); var tb=document.querySelector('#detailTable tbody'); if(!rows.length){ tb.innerHTML=''; } else { @@ -189,6 +216,7 @@ function renderDetail(){ } document.getElementById('detailNote').textContent='显示 '+rows.length+' / '+ALL.length+' 行'; renderTotal(rows); + updateSortArrows(); } function renderTotal(rows){ @@ -207,6 +235,15 @@ function renderTotal(rows){ document.getElementById('tEcpc').textContent=dec(ecpc,4); } +document.querySelectorAll('#detailTable th.sortable').forEach(function(th){ + th.addEventListener('click',function(){ + var k=th.getAttribute('data-key'), type=th.getAttribute('data-type'); + if(SORT_KEY===k){ SORT_DIR=(SORT_DIR==='asc'?'desc':'asc'); } + else { SORT_KEY=k; SORT_TYPE=type; SORT_DIR='desc'; } + renderDetail(); + }); +}); + document.getElementById('applyBtn').onclick=renderDetail; document.getElementById('resetBtn').onclick=function(){ ['fDtFrom','fDtTo','fRc','fCid'].forEach(function(id){document.getElementById(id).value='';});
dt融合后campaign id融合前campaign idadping_idsecond_channelaccountpkgclicksconversioncvrrevenuecostGPecpcdt融合后campaign id融合前campaign idadping_idsecond_channelaccountpkgclicksconversioncvrrevenuecostGPecpc
Total
无匹配数据