diff --git a/sh_backmate_theme_adv_enterprise/static/src/xml/menu.xml b/sh_backmate_theme_adv_enterprise/static/src/xml/menu.xml index 25eee35e1..75508184b 100644 --- a/sh_backmate_theme_adv_enterprise/static/src/xml/menu.xml +++ b/sh_backmate_theme_adv_enterprise/static/src/xml/menu.xml @@ -55,7 +55,7 @@ onSelected="() => this.onNavBarDropdownItemSelection(menu)" > - + @@ -73,7 +73,7 @@ -
+
+
@@ -278,6 +296,7 @@ let grpFields=REPORT_CONFIG.groupBy.map(g=>({...g,active:true})); let grpExp={}; let fzCount=0; let dark=true; +let qcState={dim:'',val:'',type:'bar'}; function init(){ $('rptTitle').textContent = REPORT_CONFIG.title || '报表'; @@ -286,6 +305,7 @@ function init(){ initGrpExp(); buildColCheck(); buildGrpChips(); + initChartCtrls(); buildChartsUI(); r(); } @@ -297,7 +317,7 @@ function r(){ const dd=activeGrps.length>0?grpData(fd,activeGrps):fd; renderT(dd,fd); renderSum(fd); - renderCharts(fd); + renderCharts(); } function $(id){return document.getElementById(id)} function rf(){r()} @@ -311,41 +331,55 @@ function chartColors(){return dark?CHART_COLORS_DARK:CHART_COLORS_LIGHT} function chartGridColor(){return dark?'rgba(255,255,255,0.04)':'rgba(0,0,0,0.05)'} function chartTextColor(){return dark?'rgba(232,230,227,0.5)':'rgba(42,40,38,0.5)'} +function initChartCtrls(){ + const charts=REPORT_CONFIG.charts||[]; + const ctrls=$('chartCtrls'); + if(charts.length){if(ctrls)ctrls.style.display='none';return} + const numCols=COLS.filter(c=>{ + const vals=data.map(r=>parseFloat(r[c.k])); + return vals.some(v=>!isNaN(v)); + }); + if(!numCols.length){if(ctrls)ctrls.style.display='none';return} + if(!ctrls)return; + ctrls.style.display='flex'; + const dimSel=$('qcDimSel'); + const valSel=$('qcValSel'); + if(dimSel){ + dimSel.innerHTML=''+COLS.map(c=>``).join(''); + dimSel.value=qcState.dim; + } + if(valSel){ + valSel.innerHTML=''+numCols.map(c=>``).join(''); + valSel.value=qcState.val; + } + updateChartTypeBtns(); +} + +function updateChartTypeBtns(){ + ['bar','pie','doughnut','line','polarArea'].forEach(t=>{ + const btn=$(`btn${t==='bar'?'Bar':t==='pie'?'Pie':t==='doughnut'?'Doughnut':t==='line'?'Line':'Polar'}`); + if(btn)btn.classList.toggle('act',qcState.type===t); + }); +} + +function setChartType(type){ + qcState.type=type; + updateChartTypeBtns(); + renderCharts(); +} + +function updateQuickChart(){ + qcState.dim=$('qcDimSel')?$('qcDimSel').value:''; + qcState.val=$('qcValSel')?$('qcValSel').value:''; + renderCharts(); +} + function buildChartsUI(){ const charts=REPORT_CONFIG.charts||[]; - const cols=COLS; if(!charts.length){ - // No pre-configured charts, show default quick-select - const numCols=cols.filter(c=>{ - const vals=data.map(r=>parseFloat(r[c.k])); - return vals.some(v=>!isNaN(v)); - }); - if(!numCols.length){$('chartsArea').innerHTML='';return} - const txtCols=cols; - const html=` -
- 📊 快速图表: - - - -
- `; - $('chartsArea').innerHTML=html; + // Quick mode: just prepare an empty container; controls are in tb-r + $('chartsArea').innerHTML=''; }else{ - // Pre-configured charts from template let html=''; charts.forEach((ch,i)=>{ html+=`
${ch.title||'图表 '+ (i+1)}
`; @@ -354,9 +388,10 @@ function buildChartsUI(){ } } -function renderCharts(fd){ +function renderCharts(){ chartInstances.forEach(c=>c.destroy()); chartInstances=[]; + const fd=flt(); const charts=REPORT_CONFIG.charts||[]; if(charts.length){ charts.forEach((ch,i)=>{ @@ -374,7 +409,6 @@ function renderCharts(fd){ groups['_cnt_'+k]+=1; }else groups[k]+=1; }); - // Calculate avg if(vf&&ch.calc==='avg'){ Object.keys(groups).forEach(k=>{ if(k.startsWith('_cnt_'))return; @@ -409,11 +443,9 @@ function renderCharts(fd){ }; chartInstances.push(new Chart(el,cfg)); }); - }else if($('qcDimSel')&&$('qcDimSel').value&&$('qcValSel')&&$('qcValSel').value){ - // Quick chart - const dim=$('qcDimSel').value; - const val=$('qcValSel').value; - const tp=$('qcTypeSel')?$('qcTypeSel').value:'bar'; + }else{ + // Quick chart mode + const dim=qcState.dim, val=qcState.val, tp=qcState.type; if(!dim||!val)return; const groups={}; fd.forEach(r=>{ @@ -423,19 +455,11 @@ function renderCharts(fd){ }); const labels=Object.keys(groups).sort(); const values=labels.map(l=>groups[l]); - // Ensure chart canvas exists - let canvas=$('qcCanvas'); - if(!canvas){ - const wrap=$('chartsArea').querySelector('.chart-box'); - if(wrap){ - const div=document.createElement('div'); - div.style.height='260px'; - div.style.marginTop='8px'; - div.innerHTML=''; - wrap.appendChild(div); - canvas=$('qcCanvas'); - } - } + const wrap=$('qcChartWrap'); + if(!wrap)return; + wrap.style.display='block'; + wrap.innerHTML='
'; + const canvas=$('qcCanvas'); if(!canvas)return; const isPie=tp==='pie'||tp==='doughnut'||tp==='polarArea'; const cfg={ @@ -463,7 +487,6 @@ function renderCharts(fd){ chartInstances.push(new Chart(canvas,cfg)); } } -function qcRender(){r()} function buildFilters(){ const fltArea=$('fltArea'); @@ -935,7 +958,7 @@ function saveDataConfig(){ COLS.length=0;COLS.push(...REPORT_CONFIG.columns); D.length=0;D.push(...REPORT_CONFIG.data); data=D.map(r=>({...r})); - colVis=COLS.map((_,i)=>itrue); grpFields=REPORT_CONFIG.groupBy.map(g=>({...g,active:true})); grpExp={}; sCol=6;sAsc=false;