@qxs-bns/components 0.0.64 → 0.0.65
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/es/package.json.mjs +1 -1
- package/es/src/data-chart/src/components/line.vue2.mjs +1 -1
- package/es/src/data-chart/src/components/line.vue2.mjs.map +1 -1
- package/es/src/data-chart/src/data-chart.vue.mjs +1 -1
- package/es/src/data-chart/src/data-chart.vue.mjs.map +1 -1
- package/es/src/data-chart/src/utils/useCharts.mjs +1 -1
- package/es/src/data-chart/src/utils/useCharts.mjs.map +1 -1
- package/lib/package.json.cjs +1 -1
- package/lib/src/data-chart/src/components/line.vue2.cjs +1 -1
- package/lib/src/data-chart/src/components/line.vue2.cjs.map +1 -1
- package/lib/src/data-chart/src/data-chart.vue.cjs +1 -1
- package/lib/src/data-chart/src/data-chart.vue.cjs.map +1 -1
- package/lib/src/data-chart/src/utils/useCharts.cjs +1 -1
- package/lib/src/data-chart/src/utils/useCharts.cjs.map +1 -1
- package/package.json +1 -1
- package/types/src/data-chart/src/components/line.vue.d.ts.map +1 -1
- package/types/src/data-chart/src/data-chart.vue.d.ts.map +1 -1
- package/types/src/data-chart/src/utils/useCharts.d.ts.map +1 -1
- package/types/tsconfig.tsbuildinfo +1 -1
package/es/package.json.mjs
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
var r="0.0.
|
1
|
+
var r="0.0.65";export{r as version};
|
2
2
|
//# sourceMappingURL=package.json.mjs.map
|
@@ -1,2 +1,2 @@
|
|
1
|
-
import{defineComponent as e,ref as a,inject as t,computed as r,createElementBlock as
|
1
|
+
import{defineComponent as e,ref as a,inject as t,computed as r,createElementBlock as n,openBlock as s}from"vue";import{InjectionChartMerge as l}from"../utils/injectionKeys.mjs";import{useCharts as o}from"../utils/useCharts.mjs";var c=e({name:"DataChartLine",__name:"line",props:{chartData:{type:Object,required:!0},subShowType:{type:String,required:!0,default:"line-simple"},chartOptions:{type:null,required:!0},lazyLoad:{type:Boolean,required:!1,default:!0}},setup(e,{expose:c}){const i=a(),d=t(l,e=>e,!0),p=15,u="Total",h=!0;const m=r(()=>{const{colDesc:a,xGroupByDesc:t,groupByDesc:r,data:n,modelName:s}=e.chartData;n&&0!==n.length||console.warn("[LineChart] 数据为空,图表将显示空状态"),a&&0!==a.length||console.warn("[LineChart] colDesc 为空,无法生成图表系列"),t?.colDesc||console.warn("[LineChart] xGroupByDesc.colDesc 为空,无法生成 X 轴数据");const l=Array.from(new Set(n?.map(e=>e[t?.colDesc||""]))).filter(e=>null!=e)||[],o=r?.find(e=>!e.xAxis),c={title:{text:s},legend:{data:[]},xAxis:{name:t?.colDesc||"",data:l},dataZoom:[{type:"inside",disabled:l.length<p}]};if(1===r?.length)c.series=a.map(e=>({name:e,type:"line",smooth:h,data:l.map(a=>{const r=n.find(e=>e[t?.colDesc||""]===a);return r?r[e]??null:null})})),c.legend.data=a;else if(2===r?.length){const e=[...new Set(n.map(e=>String(e[o?.colDesc||""])))];c.legend.data=e,c.series=e.map(e=>function(e,a,t,r,n,s){const l=[];return a.forEach(a=>{const o=t.find(t=>t[r?.colDesc]===a&&t[n?.colDesc]===e);o&&void 0!==o[s[0]]&&null!==o[s[0]]?l.push(o[s[0]]):l.push(null)}),{name:e,type:"line",smooth:h,stack:u,areaStyle:{},data:l}}(e,l,n,t,o,a))}return c.series=c.series?.map(a=>{const t={...a};switch(e.subShowType){case"line-simple":default:delete t.areaStyle;break;case"area-basic":t.areaStyle={}}return t}),d(c,e.chartOptions)}),{myChart:y}=o({chartDOM:i,chartOptions:m,chartData:r(()=>e.chartData),lazyLoad:e.lazyLoad});return c({myChart:y}),(e,a)=>(s(),n("div",{ref_key:"dataChartLine",ref:i,class:"data-chart-line"},null,512))}});export{c as default};
|
2
2
|
//# sourceMappingURL=line.vue2.mjs.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"line.vue2.mjs","sources":["../../../../../../../packages/components/src/data-chart/src/components/line.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { LegendComponentOption } from 'echarts'\nimport type { EChartsOption, IFormatPublicData } from '../utils/types'\nimport { InjectionChartMerge } from '../utils/injectionKeys'\nimport { useCharts } from '../utils/useCharts'\n\ndefineOptions({\n name: 'DataChartLine',\n})\nconst {\n chartData,\n subShowType = 'line-simple',\n chartOptions,\n lazyLoad = true,\n} = defineProps<{\n chartData: IFormatPublicData\n subShowType: string\n chartOptions: EChartsOption\n lazyLoad?: boolean\n}>()\nconst dataChartLine = ref()\nconst merge = inject(InjectionChartMerge, (v: any) => v, true)\n\n// 抽取类型定义\ninterface SeriesItem {\n name: string\n type: 'line'\n stack?: string\n smooth?: boolean\n areaStyle?: Record<string, any>\n data: Array<string | number>\n}\n\n// 将配置提取为常量\nconst CHART_CONSTANTS = {\n MIN_ZOOM_LENGTH: 15,\n STACK_NAME: 'Total',\n SMOOTH: true,\n} as const\n\n// 提取处理图表系列数据的函数\nfunction processSeriesData(legendDataItem: string,\n xAxisData: (string | number)[],\n data: any[],\n xGroupByDesc: any,\n yGroupByDesc: any,\n colDesc: string[]): SeriesItem {\n const seriesData: (string | number)[] = []\n\n xAxisData.forEach((xAxisItem) => {\n const targetData = data\n .find(dataItem =>\n dataItem[xGroupByDesc?.colDesc] === xAxisItem\n && dataItem[yGroupByDesc?.colDesc] === legendDataItem,\n )\n\n if (targetData) {\n seriesData.push(targetData[colDesc[0]])\n }\n else {\n seriesData.push(
|
1
|
+
{"version":3,"file":"line.vue2.mjs","sources":["../../../../../../../packages/components/src/data-chart/src/components/line.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { LegendComponentOption } from 'echarts'\nimport type { EChartsOption, IFormatPublicData } from '../utils/types'\nimport { InjectionChartMerge } from '../utils/injectionKeys'\nimport { useCharts } from '../utils/useCharts'\n\ndefineOptions({\n name: 'DataChartLine',\n})\nconst {\n chartData,\n subShowType = 'line-simple',\n chartOptions,\n lazyLoad = true,\n} = defineProps<{\n chartData: IFormatPublicData\n subShowType: string\n chartOptions: EChartsOption\n lazyLoad?: boolean\n}>()\nconst dataChartLine = ref()\nconst merge = inject(InjectionChartMerge, (v: any) => v, true)\n\n// 抽取类型定义\ninterface SeriesItem {\n name: string\n type: 'line'\n stack?: string\n smooth?: boolean\n areaStyle?: Record<string, any>\n data: Array<string | number | null>\n}\n\n// 将配置提取为常量\nconst CHART_CONSTANTS = {\n MIN_ZOOM_LENGTH: 15,\n STACK_NAME: 'Total',\n SMOOTH: true,\n} as const\n\n// 提取处理图表系列数据的函数\nfunction processSeriesData(legendDataItem: string,\n xAxisData: (string | number)[],\n data: any[],\n xGroupByDesc: any,\n yGroupByDesc: any,\n colDesc: string[]): SeriesItem {\n const seriesData: (string | number | null)[] = []\n\n xAxisData.forEach((xAxisItem) => {\n const targetData = data\n .find(dataItem =>\n dataItem[xGroupByDesc?.colDesc] === xAxisItem\n && dataItem[yGroupByDesc?.colDesc] === legendDataItem,\n )\n\n if (targetData && targetData[colDesc[0]] !== undefined && targetData[colDesc[0]] !== null) {\n seriesData.push(targetData[colDesc[0]])\n }\n else {\n seriesData.push(null) // 使用 null 而不是 0,让 ECharts 自动处理空值\n }\n })\n\n return {\n name: legendDataItem,\n type: 'line',\n smooth: CHART_CONSTANTS.SMOOTH,\n stack: CHART_CONSTANTS.STACK_NAME,\n areaStyle: {},\n data: seriesData,\n }\n}\n\nconst lineChartOptions = computed<EChartsOption>(() => {\n const { colDesc, xGroupByDesc, groupByDesc, data, modelName } = chartData\n\n // 数据验证\n if (!data || data.length === 0) {\n console.warn('[LineChart] 数据为空,图表将显示空状态')\n }\n\n if (!colDesc || colDesc.length === 0) {\n console.warn('[LineChart] colDesc 为空,无法生成图表系列')\n }\n\n if (!xGroupByDesc?.colDesc) {\n console.warn('[LineChart] xGroupByDesc.colDesc 为空,无法生成 X 轴数据')\n }\n\n const xAxisData = Array.from(new Set(data?.map(item => item[xGroupByDesc?.colDesc || '']))).filter(item => item !== undefined && item !== null) || []\n const yGroupByDesc = groupByDesc?.find(item => !item.xAxis)\n\n const config: EChartsOption & { series?: SeriesItem[] } = {\n title: { text: modelName },\n legend: { data: [] },\n xAxis: {\n name: xGroupByDesc?.colDesc || '',\n data: xAxisData,\n },\n dataZoom: [{\n type: 'inside',\n disabled: xAxisData.length < CHART_CONSTANTS.MIN_ZOOM_LENGTH,\n }],\n }\n\n // 处理系列数据\n if (groupByDesc?.length === 1) {\n config.series = colDesc.map(yItem => ({\n name: yItem,\n type: 'line',\n smooth: CHART_CONSTANTS.SMOOTH,\n data: xAxisData.map(xValue => {\n const dataItem = data.find(item => item[xGroupByDesc?.colDesc || ''] === xValue)\n return dataItem ? (dataItem[yItem] ?? null) : null\n }),\n }));\n (config.legend as LegendComponentOption).data = colDesc\n }\n else if (groupByDesc?.length === 2) {\n const legendData = [...new Set(data.map(item => String(item[yGroupByDesc?.colDesc || ''])))]\n ;(config.legend as LegendComponentOption).data = legendData\n\n config.series = legendData.map(legendDataItem =>\n processSeriesData(legendDataItem, xAxisData, data, xGroupByDesc, yGroupByDesc, colDesc),\n )\n }\n\n // 处理图表展示类型\n config.series = config.series?.map((item) => {\n const seriesItem = { ...item }\n\n switch (subShowType) {\n case 'line-simple':\n delete seriesItem.areaStyle\n break\n case 'area-basic':\n seriesItem.areaStyle = {}\n break\n default:\n delete seriesItem.areaStyle\n }\n\n return seriesItem\n })\n\n return merge(config, chartOptions)\n})\n\nconst { myChart } = useCharts({\n chartDOM: dataChartLine,\n chartOptions: lineChartOptions,\n chartData: computed(() => chartData),\n lazyLoad\n})\n\n// 暴露 myChart 方法供父组件访问\ndefineExpose({\n myChart,\n})\n</script>\n\n<template>\n <div\n ref=\"dataChartLine\"\n class=\"data-chart-line\"\n />\n</template>\n\n<style scoped lang=\"scss\">\n.data-chart-line {\n width: 100%;\n height: 100%;\n}\n</style>\n"],"names":["dataChartLine","ref","merge","inject","InjectionChartMerge","v","CHART_CONSTANTS","lineChartOptions","computed","colDesc","xGroupByDesc","groupByDesc","data","modelName","__props","chartData","length","console","warn","xAxisData","Array","from","Set","map","item","filter","yGroupByDesc","find","xAxis","config","title","text","legend","name","dataZoom","type","disabled","series","yItem","smooth","xValue","dataItem","legendData","String","legendDataItem","seriesData","forEach","xAxisItem","targetData","push","stack","areaStyle","processSeriesData","seriesItem","subShowType","chartOptions","myChart","useCharts","chartDOM","lazyLoad","__expose","_createElementBlock","class"],"mappings":"geAoBA,MAAMA,EAAgBC,IAChBC,EAAQC,EAAOC,EAAsBC,GAAWA,GAAG,GAanDC,EACa,GADbA,EAEQ,QAFRA,GAGI,EAqCV,MAAMC,EAAmBC,EAAwB,KAC/C,MAAMC,QAAEA,EAAAC,aAASA,EAAAC,YAAcA,OAAaC,EAAAC,UAAMA,GAAcC,EAAAC,UAG3DH,GAAwB,IAAhBA,EAAKI,QAChBC,QAAQC,KAAK,6BAGVT,GAA8B,IAAnBA,EAAQO,QACtBC,QAAQC,KAAK,mCAGVR,GAAcD,SACjBQ,QAAQC,KAAK,kDAGf,MAAMC,EAAYC,MAAMC,KAAK,IAAIC,IAAIV,GAAMW,IAAIC,GAAQA,EAAKd,GAAcD,SAAW,OAAOgB,OAAOD,GAAQA,UAAwC,GAC7IE,EAAef,GAAagB,KAAKH,IAASA,EAAKI,OAE/CC,EAAoD,CACxDC,MAAO,CAAEC,KAAMlB,GACfmB,OAAQ,CAAEpB,KAAM,IAChBgB,MAAO,CACLK,KAAMvB,GAAcD,SAAW,GAC/BG,KAAMO,GAERe,SAAU,CAAC,CACTC,KAAM,SACNC,SAAUjB,EAAUH,OAASV,KAKjC,GAA4B,IAAxBK,GAAaK,OACfa,EAAOQ,OAAS5B,EAAQc,IAAIe,IAAA,CAC1BL,KAAMK,EACNH,KAAM,OACNI,OAAQjC,EACRM,KAAMO,EAAUI,IAAIiB,IAClB,MAAMC,EAAW7B,EAAKe,KAAKH,GAAQA,EAAKd,GAAcD,SAAW,MAAQ+B,GACzE,OAAOC,EAAYA,EAASH,IAAU,KAAQ,UAGjDT,EAAOG,OAAiCpB,KAAOH,OAClD,GACiC,IAAxBE,GAAaK,OAAc,CAClC,MAAM0B,EAAa,IAAI,IAAIpB,IAAIV,EAAKW,IAAIC,GAAQmB,OAAOnB,EAAKE,GAAcjB,SAAW,QACnFoB,EAAOG,OAAiCpB,KAAO8B,EAEjDb,EAAOQ,OAASK,EAAWnB,OAlF/B,SAA2BqB,EACzBzB,EACAP,EACAF,EACAgB,EACAjB,GACA,MAAMoC,EAAyC,GAiB/C,OAfA1B,EAAU2B,QAASC,IACjB,MAAMC,EAAapC,EAChBe,KAAKc,GACJA,EAAS/B,GAAcD,WAAasC,GACjCN,EAASf,GAAcjB,WAAamC,GAGvCI,QAAyC,IAA3BA,EAAWvC,EAAQ,KAAgD,OAA3BuC,EAAWvC,EAAQ,IAC3EoC,EAAWI,KAAKD,EAAWvC,EAAQ,KAGnCoC,EAAWI,KAAK,QAIb,CACLhB,KAAMW,EACNT,KAAM,OACNI,OAAQjC,EACR4C,MAAO5C,EACP6C,UAAW,CAAA,EACXvC,KAAMiC,EAEV,CAoDMO,CAAkBR,EAAgBzB,EAAWP,EAAMF,EAAcgB,EAAcjB,GAEnF,CAoBA,OAjBAoB,EAAOQ,OAASR,EAAOQ,QAAQd,IAAKC,IAClC,MAAM6B,EAAa,IAAK7B,GAExB,OAAQV,EAAAwC,aACN,IAAK,cAML,eACSD,EAAWF,gBAJpB,IAAK,aACHE,EAAWF,UAAY,CAAA,EAM3B,OAAOE,IAGFnD,EAAM2B,EAAQf,EAAAyC,iBAGjBC,QAAEA,GAAYC,EAAU,CAC5BC,SAAU1D,EACVuD,aAAchD,EACdQ,UAAWP,EAAS,IAAMM,EAAAC,WAC1B4C,SAAO7C,EAAA6C,kBAITC,EAAa,CACXJ,wBAKAK,EAGE,MAAA,SAFI,gBAAJ5D,IAAID,EACJ8D,MAAM"}
|
@@ -1,2 +1,2 @@
|
|
1
|
-
import{defineComponent as e,ref as t,computed as o,provide as r,createBlock as
|
1
|
+
import{defineComponent as e,ref as t,computed as o,provide as r,createBlock as s,openBlock as a,resolveDynamicComponent as m,unref as p,normalizeClass as n}from"vue";import{useNamespace as i}from"@qxs-bns/hooks";import{JsonToExcel as l}from"@qxs-bns/utils";import{cloneDeep as u,merge as c}from"lodash-es";import*as d from"./analyze.mjs";import f from"./components/area.vue.mjs";import y from"./components/bar.vue.mjs";import h from"./components/card.vue.mjs";import j from"./components/funnel.vue.mjs";import v from"./components/line.vue.mjs";import g from"./components/pie.vue.mjs";import b from"./components/radar.vue.mjs";import w from"./components/scatter-simple.vue.mjs";import D from"./components/scatter.vue.mjs";import x from"./components/table.vue.mjs";import*as C from"./utils/config.mjs";import{defaultChartOption as S}from"./utils/config.mjs";import{InjectionChartMerge as T}from"./utils/injectionKeys.mjs";import{safeEvalConfig as q}from"./utils/safe-eval.mjs";import*as N from"./utils/types.mjs";import{useDataToExcelJson as B}from"./utils/useCharts.mjs";var z=e({name:"QxsDataChart",__name:"data-chart",props:{modelName:{type:String,required:!1,default:""},showTypeName:{type:String,required:!1,default:"table"},subShowType:{type:String,required:!1},data:{type:Object,required:!1,default:()=>({data:[],desc:{colDesc:[],showDesc:{showType:0,chartOptions:"{}",jsCodeSnippet:""},groupByDesc:[]}})},chartOptions:{type:null,required:!1,default:()=>({})},jsCodeSnippet:{type:String,required:!1,default:""},lazyLoad:{type:Boolean,required:!1,default:!0}},setup(e,{expose:z}){const O=i("data-chart"),k=t(null),_={analyze:d,config:C,types:N},A={table:x,bar:y,line:v,pie:g,radar:b,scatter:D,funnel:j,area:f,card:h,"scatter-simple":w},L=o(()=>u(S[e.showTypeName])),Q=o(()=>{const{desc:{colDesc:t=[],groupByDesc:o=[]}={},data:r=[]}=e.data;let s=[],a=null;const m=o;s=m?.map(e=>(e.xAxis&&(a=e),e))||[];const p=a&&a.colDesc?r.filter(e=>{const t=a.colDesc;return e&&t&&void 0!==e[t]&&null!==e[t]}):r;return{colDesc:t||[],modelName:e.modelName,subShowType:e.subShowType,xGroupByDesc:a||{colDesc:"",groupByDesc:"",groupByValues:[],xAxis:!1},groupByDesc:s,data:p}});function E(){if("table"===e.showTypeName)return null;const t=k.value;return t&&"function"==typeof t.myChart?t.myChart():null}return z({exportExal:function(){if(0===e.data.data.length)return void console.log("暂无数据");const t=B(e.data);l(e.modelName,t)},QxsDataChartConfig:_,myChart:o(()=>E()),getMyChart:E}),r(T,function(t,o){let r=c({},L.value,t,o)||{};if(e.jsCodeSnippet)try{r=q(e.jsCodeSnippet,r)}catch(e){console.error("代码执行失败:",e)}return r}),(e,t)=>(a(),s(m(A[e.showTypeName]),{ref_key:"myChartRef",ref:k,key:e.showTypeName,class:n([p(O).e("wrapper")]),"sub-show-type":e.subShowType,"chart-data":p(Q),"chart-options":e.chartOptions,"lazy-load":e.lazyLoad},null,8,["class","sub-show-type","chart-data","chart-options","lazy-load"]))}});export{z as default};
|
2
2
|
//# sourceMappingURL=data-chart.vue.mjs.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"data-chart.vue.mjs","sources":["../../../../../../packages/components/src/data-chart/src/data-chart.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { EChartData, EChartsOption, IconRow, IFormatPublicData } from './utils/types'\nimport type { ECharts } from 'echarts'\nimport { useNamespace } from '@qxs-bns/hooks'\nimport { JsonToExcel } from '@qxs-bns/utils'\nimport { cloneDeep, merge as lodashMerge } from 'lodash-es'\nimport * as analyze from './analyze'\nimport Area from './components/area.vue'\nimport Bar from './components/bar.vue'\nimport Card from './components/card.vue'\nimport Funnel from './components/funnel.vue'\nimport Line from './components/line.vue'\nimport Pie from './components/pie.vue'\nimport Radar from './components/radar.vue'\nimport ScatterSimple from './components/scatter-simple.vue'\nimport Scatter from './components/scatter.vue'\nimport Table from './components/table.vue'\nimport * as config from './utils/config'\nimport { defaultChartOption } from './utils/config'\nimport { InjectionChartMerge } from './utils/injectionKeys'\nimport { safeEvalConfig } from './utils/safe-eval'\nimport * as types from './utils/types'\nimport { useDataToExcelJson } from './utils/useCharts'\n\ndefineOptions({\n name: 'QxsDataChart',\n})\nconst {\n showTypeName = 'table',\n subShowType,\n modelName = '',\n data: propData = {\n data: [],\n desc: {\n colDesc: [],\n showDesc: {\n showType: 0,\n chartOptions: '{}',\n jsCodeSnippet: '',\n },\n groupByDesc: [],\n },\n },\n chartOptions = {},\n jsCodeSnippet = '',\n lazyLoad = true,\n} = defineProps<{\n modelName?: string\n showTypeName?: IconRow['showTypeName']\n subShowType?: string\n data?: EChartData\n chartOptions?: EChartsOption\n jsCodeSnippet?: string\n lazyLoad?: boolean\n}>()\n\nconst ns = useNamespace('data-chart')\n\n// 子组件引用\nconst myChartRef = ref<any>(null)\n\nconst QxsDataChartConfig = {\n analyze,\n config,\n types,\n}\nconst coms: {\n [key: string]: any\n} = {\n 'table': Table,\n 'bar': Bar,\n 'line': Line,\n 'pie': Pie,\n 'radar': Radar,\n 'scatter': Scatter,\n 'funnel': Funnel,\n 'area': Area,\n 'card': Card,\n 'scatter-simple': ScatterSimple,\n}\n\nconst defaultChartOptionCopy = computed(() => {\n return cloneDeep(defaultChartOption[showTypeName])\n})\n\nconst formatPublicData = computed<IFormatPublicData>(() => {\n const { desc: { colDesc = [], groupByDesc = [] } = {}, data = [] } = propData\n\n // 处理 X 轴数据\n let xValue = []\n\n let xGroupByDesc: EChartData['desc']['groupByDesc'][0] | null = null\n xValue =
|
1
|
+
{"version":3,"file":"data-chart.vue.mjs","sources":["../../../../../../packages/components/src/data-chart/src/data-chart.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { EChartData, EChartsOption, IconRow, IFormatPublicData } from './utils/types'\nimport type { ECharts } from 'echarts'\nimport { useNamespace } from '@qxs-bns/hooks'\nimport { JsonToExcel } from '@qxs-bns/utils'\nimport { cloneDeep, merge as lodashMerge } from 'lodash-es'\nimport * as analyze from './analyze'\nimport Area from './components/area.vue'\nimport Bar from './components/bar.vue'\nimport Card from './components/card.vue'\nimport Funnel from './components/funnel.vue'\nimport Line from './components/line.vue'\nimport Pie from './components/pie.vue'\nimport Radar from './components/radar.vue'\nimport ScatterSimple from './components/scatter-simple.vue'\nimport Scatter from './components/scatter.vue'\nimport Table from './components/table.vue'\nimport * as config from './utils/config'\nimport { defaultChartOption } from './utils/config'\nimport { InjectionChartMerge } from './utils/injectionKeys'\nimport { safeEvalConfig } from './utils/safe-eval'\nimport * as types from './utils/types'\nimport { useDataToExcelJson } from './utils/useCharts'\n\ndefineOptions({\n name: 'QxsDataChart',\n})\nconst {\n showTypeName = 'table',\n subShowType,\n modelName = '',\n data: propData = {\n data: [],\n desc: {\n colDesc: [],\n showDesc: {\n showType: 0,\n chartOptions: '{}',\n jsCodeSnippet: '',\n },\n groupByDesc: [],\n },\n },\n chartOptions = {},\n jsCodeSnippet = '',\n lazyLoad = true,\n} = defineProps<{\n modelName?: string\n showTypeName?: IconRow['showTypeName']\n subShowType?: string\n data?: EChartData\n chartOptions?: EChartsOption\n jsCodeSnippet?: string\n lazyLoad?: boolean\n}>()\n\nconst ns = useNamespace('data-chart')\n\n// 子组件引用\nconst myChartRef = ref<any>(null)\n\nconst QxsDataChartConfig = {\n analyze,\n config,\n types,\n}\nconst coms: {\n [key: string]: any\n} = {\n 'table': Table,\n 'bar': Bar,\n 'line': Line,\n 'pie': Pie,\n 'radar': Radar,\n 'scatter': Scatter,\n 'funnel': Funnel,\n 'area': Area,\n 'card': Card,\n 'scatter-simple': ScatterSimple,\n}\n\nconst defaultChartOptionCopy = computed(() => {\n return cloneDeep(defaultChartOption[showTypeName])\n})\n\nconst formatPublicData = computed<IFormatPublicData>(() => {\n const { desc: { colDesc = [], groupByDesc = [] } = {}, data = [] } = propData\n\n // 处理 X 轴数据\n let xValue: EChartData['desc']['groupByDesc'] = []\n\n let xGroupByDesc: EChartData['desc']['groupByDesc'][0] | null = null\n const typedGroupByDesc = groupByDesc as EChartData['desc']['groupByDesc']\n xValue = typedGroupByDesc?.map((groupByDescItem) => {\n // if (groupByDescItem.colValues) {\n // groupByDescItem.colValuesDesc = {}\n // groupByDescItem.colValues.split(',')?.forEach((item) => {\n // const [key, value] = item.split(':')\n // groupByDescItem.colValuesDesc[key] = value\n // })\n // }\n if (groupByDescItem.xAxis) {\n xGroupByDesc = groupByDescItem\n }\n return groupByDescItem\n }) || []\n\n // 修复数据过滤逻辑,避免因为字段不存在导致数据被过滤掉\n const dataValue = xGroupByDesc && (xGroupByDesc as EChartData['desc']['groupByDesc'][0]).colDesc\n ? data.filter(item => {\n const colDescKey = (xGroupByDesc as EChartData['desc']['groupByDesc'][0]).colDesc\n return item && colDescKey && (item[colDescKey] !== undefined && item[colDescKey] !== null)\n })\n : data\n\n // if (xGroupByDesc && xGroupByDesc.colValuesDesc && Object.keys(xGroupByDesc.colValuesDesc).length) {\n // const { colDesc: colDescItem, colValuesDesc } = xGroupByDesc\n // console.log('colDesc: colDescItem, colValuesDesc: ', colDescItem, colValuesDesc)\n // dataValue = dataValue.map((item) => {\n // if (typeof item[colDescItem] === 'number') {\n // item[colDescItem] = colValuesDesc[item[colDescItem]]\n // }\n // return item\n // })\n // }\n\n const mergeConfig = {\n colDesc: colDesc || [],\n modelName,\n subShowType,\n xGroupByDesc: xGroupByDesc || {\n colDesc: '',\n groupByDesc: '',\n groupByValues: [],\n xAxis: false,\n },\n groupByDesc: xValue,\n data: dataValue,\n }\n return mergeConfig\n})\n\n// 导出数据\nfunction exportExal() {\n if (propData.data.length === 0) {\n // useMessage.error('暂无数据')\n console.log('暂无数据')\n return\n }\n const arr = useDataToExcelJson(propData)\n JsonToExcel(modelName, arr)\n}\nfunction merge(config: EChartsOption, defaultConfig: EChartsOption) {\n const mergeOpt = lodashMerge({}, defaultChartOptionCopy.value, config, defaultConfig)\n let conf = mergeOpt || {}\n\n if (jsCodeSnippet) {\n try {\n // 使用安全的配置处理函数\n conf = safeEvalConfig(jsCodeSnippet, conf)\n }\n catch (error) {\n console.error('代码执行失败:', error)\n }\n }\n\n return conf\n}\n\n// 获取内部 myChart 实例的方法\nfunction getMyChart(): ECharts | null {\n // 对于 table 类型,没有 myChart 实例\n if (showTypeName === 'table') {\n return null\n }\n\n // 尝试从子组件获取 myChart 实例\n const childComponent = myChartRef.value\n if (!childComponent) {\n return null\n }\n\n // 检查子组件是否有 myChart 方法(来自 useCharts)\n if (typeof childComponent.myChart === 'function') {\n return childComponent.myChart()\n }\n\n return null\n}\n\n// 为了保持向后兼容,提供 myChart 计算属性\nconst myChart = computed(() => getMyChart())\n\ndefineExpose({\n exportExal,\n QxsDataChartConfig,\n myChart,\n getMyChart,\n})\nprovide(InjectionChartMerge, merge)\n</script>\n\n<template>\n <component\n :is=\"coms[showTypeName]\"\n ref=\"myChartRef\"\n :key=\"showTypeName\"\n :class=\"[ns.e('wrapper')]\"\n :sub-show-type=\"subShowType\"\n :chart-data=\"formatPublicData\"\n :chart-options=\"chartOptions\"\n :lazy-load=\"lazyLoad\"\n />\n</template>\n"],"names":["ns","useNamespace","myChartRef","ref","QxsDataChartConfig","analyze","config","types","coms","table","Table","bar","Bar","line","Line","pie","Pie","radar","Radar","scatter","Scatter","funnel","Funnel","area","Area","card","Card","ScatterSimple","defaultChartOptionCopy","computed","cloneDeep","defaultChartOption","__props","formatPublicData","desc","colDesc","groupByDesc","data","xValue","xGroupByDesc","typedGroupByDesc","map","groupByDescItem","xAxis","dataValue","filter","item","colDescKey","modelName","subShowType","groupByValues","getMyChart","showTypeName","childComponent","value","myChart","__expose","exportExal","length","console","log","arr","useDataToExcelJson","JsonToExcel","provide","InjectionChartMerge","defaultConfig","conf","lodashMerge","jsCodeSnippet","safeEvalConfig","error","_createBlock","_resolveDynamicComponent","key","class","_normalizeClass","_unref","e","chartOptions","lazyLoad"],"mappings":"gjDAwDA,MAAMA,EAAKC,EAAa,cAGlBC,EAAaC,EAAS,MAEtBC,EAAqB,CACzBC,UACAC,SACAC,SAEIC,EAEF,CACFC,MAASC,EACTC,IAAOC,EACPC,KAAQC,EACRC,IAAOC,EACPC,MAASC,EACTC,QAAWC,EACXC,OAAUC,EACVC,KAAQC,EACRC,KAAQC,EACR,iBAAkBC,GAGdC,EAAyBC,EAAS,IAC/BC,EAAUC,EAAmBC,kBAGhCC,EAAmBJ,EAA4B,KACnD,MAAQK,MAAMC,QAAEA,EAAU,eAAIC,EAAc,IAAO,CAAA,EAACC,KAAGA,EAAO,IAAOL,EAAAK,KAGrE,IAAIC,EAA4C,GAE5CC,EAA4D,KAChE,MAAMC,EAAmBJ,EACzBE,EAASE,GAAkBC,IAAKC,IAQ1BA,EAAgBC,QAClBJ,EAAeG,GAEVA,KACH,GAGN,MAAME,EAAYL,GAAiBA,EAAsDJ,QACrFE,EAAKQ,OAAOC,IACV,MAAMC,EAAcR,EAAsDJ,QAC1E,OAAOW,GAAQC,QAAoC,IAArBD,EAAKC,IAAkD,OAArBD,EAAKC,KAEvEV,EA0BJ,MAboB,CAClBF,QAASA,GAAW,GACpBa,UAAQhB,EAAAgB,UACRC,YAAUjB,EAAAiB,YACVV,aAAcA,GAAgB,CAC5BJ,QAAS,GACTC,YAAa,GACbc,cAAe,GACfP,OAAO,GAETP,YAAaE,EACbD,KAAMO,KAiCV,SAASO,IAEP,GAAqB,UAAjBnB,EAAAoB,aACF,OAAO,KAIT,MAAMC,EAAiBnD,EAAWoD,MAClC,OAAKD,GAKiC,mBAA3BA,EAAeE,QACjBF,EAAeE,UALf,IASX,QAKAC,EAAa,CACXC,WAnDF,WACE,GAA6B,IAAzBzB,OAASK,KAAKqB,OAGhB,YADAC,QAAQC,IAAI,QAGd,MAAMC,EAAMC,EAAmB9B,EAAAK,MAC/B0B,EAAY/B,EAAAgB,UAAWa,EACzB,EA4CEzD,qBACAmD,QALc1B,EAAS,IAAMsB,KAM7BA,eAEFa,EAAQC,EA/CR,SAAe3D,EAAuB4D,GAEpC,IAAIC,EADaC,EAAY,CAAA,EAAIxC,EAAuB0B,MAAOhD,EAAQ4D,IAChD,CAAA,EAEvB,GAAIlC,EAAAqC,cACF,IAEEF,EAAOG,EAAetC,gBAAemC,EACvC,OACOI,GACLZ,QAAQY,MAAM,UAAWA,EAC3B,CAGF,OAAOJ,CACT,eAoCEK,EASEC,EARKjE,EAAK4C,EAAAA,eAAY,SAClB,aAAJjD,IAAID,EACHwE,IAAKtB,EAAAA,aACLuB,MAAKC,EAAA,CAAGC,EAAA7E,GAAG8E,EAAC,aACZ,gBAAe7B,EAAAA,YACf,aAAY4B,EAAA5C,GACZ,gBAAe8C,EAAAA,aACf,YAAWC,EAAAA"}
|
@@ -1,2 +1,2 @@
|
|
1
|
-
import*as e from"echarts";import{onMounted as t,nextTick as i,onUnmounted as n}from"vue";import{useMouseInElement as o,watchDebounced as s,useElementSize as r}from"@vueuse/core";import a from"../components/empty.svg.mjs";
|
1
|
+
import*as e from"echarts";import{onMounted as t,nextTick as i,onUnmounted as n}from"vue";import{useMouseInElement as o,watchDebounced as s,useElementSize as r}from"@vueuse/core";import a from"../components/empty.svg.mjs";var c=Object.defineProperty,l=(e,t,i)=>((e,t,i)=>t in e?c(e,t,{enumerable:!0,configurable:!0,writable:!0,value:i}):e[t]=i)(e,"symbol"!=typeof t?t+"":t,i);const u=new class{constructor(){l(this,"observer",null),l(this,"callbacks",new Map)}createObserver(){return"undefined"==typeof IntersectionObserver?null:new IntersectionObserver(e=>{for(const t of e)if(t.isIntersecting){const e=this.callbacks.get(t.target);e&&(e(),this.unobserve(t.target))}},{threshold:0,rootMargin:"200px"})}observe(e,t){this.observer||(this.observer=this.createObserver()),this.observer&&(this.callbacks.set(e,t),this.observer.observe(e))}unobserve(e){this.observer&&(this.observer.unobserve(e),this.callbacks.delete(e))}disconnect(){this.observer&&(this.observer.disconnect(),this.callbacks.clear(),this.observer=null)}};function h(r){let{chartDOM:c,chartData:l,chartOptions:h,initBefore:d,initAfter:v,lazyLoad:p=!0}=r,b=null,g=!1,w=null,m=[];const y=window.devicePixelRatio||1;function D(){if(b){try{b.isDisposed()||b.dispose()}catch(e){console.warn("Error disposing chart:",e)}b=null}}function x(){if(!b||b.isDisposed()){if(!c.value)return console.warn("[ECharts] DOM element not found"),null;const{clientWidth:t,clientHeight:i}=c.value;if(0===t||0===i)return console.warn("[ECharts] Container has zero size. Width:",t,"Height:",i,". Skipping initialization."),null;b=e.init(c.value,null,{devicePixelRatio:y,renderer:"svg"})}return b}function O(){c.value&&u.unobserve(c.value)}function k(){if(m.length>0)return;const{isOutside:e}=o(c),t=s(e,e=>{"boolean"==typeof e&&b&&!b.isDisposed()&&function(e){if(b&&!b.isDisposed())try{b.setOption({toolbox:{show:e}})}catch(e){console.warn("Error toggling toolbox:",e)}}(!e)},{debounce:200}),i=s(()=>h.value,async()=>{await async function(){for(var e=arguments.length,t=new Array(e),i=0;i<e;i++)t[i]=arguments[i];try{b&&!b.isDisposed()||await E(),b?.showLoading(),l.value?.data?.length?(!0===g&&(t[1]||(t[1]={}),t[1].notMerge=!0),g=!1):t=await M(),b?.setOption(...t)}catch(e){b&&!b.isDisposed()&&D(),x(),t=await M("配置项错误"),b?.setOption(...t)}finally{b?.hideLoading()}}(h.value)},{debounce:500,deep:!0,immediate:!0});m.push(t,i)}async function z(){await i();const{clientWidth:e,clientHeight:t}=c.value||{clientWidth:0,clientHeight:0};if(e>0&&t>0){x()&&(v&&v(b),b&&!b.isDisposed()&&f(b,c),k()),O()}else!function(){if(!c.value||"undefined"==typeof ResizeObserver)return;w=new ResizeObserver(e=>{for(const t of e){const{width:e,height:i}=t.contentRect;if(e>0&&i>0){x()&&(v&&v(b),b&&!b.isDisposed()&&f(b,c),k()),w?.disconnect(),w=null,O();break}}}),w.observe(c.value)}()}async function E(){return c.value?(await i(),p?(c.value&&u.observe(c.value,()=>{z()}),b):(await z(),b)):b}function M(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"暂无数据";return new Promise(t=>{const i=new Image;i.src=a,i.onload=()=>{const n=i.width/i.height,o={title:[{text:l.value?.modelName,...h.value.title},{subtext:e,top:"center",left:"center",text:"{a|}",itemGap:-20,subtextStyle:{fontSize:14},textStyle:{align:"center",rich:{a:{height:100/n,width:100,backgroundColor:{image:a}}}}}]};g=!0,t([o,{notMerge:!0,replaceMerge:["xAxis","yAxis","series"],lazyUpdate:!1}])}})}return t(async()=>{d&&await d(),await i(),await E(),b&&!b.isDisposed()&&(v&&v(b),f(b,c),k())}),n(()=>{if(m.forEach(e=>e()),m=[],w&&(w.disconnect(),w=null),O(),b&&!b.isDisposed())try{b.getZr()?.off("mousemove"),b.getZr()?.off("mouseout"),b.getZr()?.off("click"),b.off("click"),D()}catch(e){console.warn("Error during chart cleanup:",e)}}),{myChart:()=>b}}function f(e,t){const{width:i,height:n}=r(t);s([i,n],()=>{if(e&&!e.isDisposed())try{e.resize()}catch(e){console.warn("Error during chart resize:",e)}})}function d(e){const{desc:{colDesc:t=[],groupByDesc:i=[]}={},data:n=[]}=e,o=[...i.map(e=>e.colDesc),...t].filter(e=>e),s=n.map(e=>o.map(t=>e[t]||""));return[o,...s]}export{h as useCharts,d as useDataToExcelJson,f as useResize};
|
2
2
|
//# sourceMappingURL=useCharts.mjs.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"useCharts.mjs","sources":["../../../../../../../packages/components/src/data-chart/src/utils/useCharts.ts"],"sourcesContent":["import type { ECharts, SetOptionOpts } from 'echarts'\nimport type { Ref } from 'vue'\nimport type { EChartData, EChartsOption, IFormatPublicData } from './types'\nimport * as echarts from 'echarts'\nimport { onMounted, onUnmounted, nextTick } from 'vue'\nimport { useMouseInElement, useElementSize, watchDebounced } from '@vueuse/core'\n\n// 使用别名路径导入 SVG\nimport emptyImg from '../components/empty.svg'\n\nexport function useCharts({ chartDOM, chartData, chartOptions, initBefore, initAfter, lazyLoad = true }: {\n chartDOM: Ref<HTMLElement | null>\n chartData: Ref<IFormatPublicData>\n chartOptions: Ref<EChartsOption>\n initBefore?: () => Promise<void>\n initAfter?: (e: ECharts | null) => void\n lazyLoad?: boolean\n}) {\n // 每个组件实例的独立状态\n let myChart: ECharts | null = null\n let isEmpty = false\n let isInitialized = false\n let resizeObserver: ResizeObserver | null = null\n let intersectionObserver: IntersectionObserver | null = null\n let isInViewport = false\n\n // 获取设备像素比\n const dpr = window.devicePixelRatio || 1\n\n function disposeChart() {\n if (myChart && !myChart.isDisposed()) {\n try {\n myChart.dispose()\n }\n catch (error) {\n console.warn('Error disposing chart:', error)\n }\n myChart = null\n }\n }\n\n function initChart() {\n if (!(myChart && !myChart.isDisposed())) {\n // 检查 DOM 元素是否存在\n if (!chartDOM.value) {\n console.warn('[ECharts] DOM element not found')\n return null\n }\n\n // 检查容器尺寸\n const { clientWidth, clientHeight } = chartDOM.value\n if (clientWidth === 0 || clientHeight === 0) {\n // 如果容器没有尺寸,返回 null 而不是强制初始化\n console.warn('[ECharts] Container has zero size. Width:', clientWidth, 'Height:', clientHeight, '. Skipping initialization.')\n return null\n }\n\n // 创建 ECharts 实例\n myChart = echarts.init(chartDOM.value, null, {\n devicePixelRatio: dpr,\n renderer: 'svg',\n })\n\n isInitialized = true\n }\n return myChart\n }\n\n // 开始初始化流程\n async function startInitialization() {\n // 等待 DOM 渲染完成\n await nextTick()\n\n // 检查容器是否已经有尺寸\n const { clientWidth, clientHeight } = chartDOM.value || { clientWidth: 0, clientHeight: 0 }\n if (clientWidth > 0 && clientHeight > 0) {\n // 直接初始化\n initChart()\n if (initAfter) {\n initAfter(myChart)\n }\n if (myChart && !myChart.isDisposed()) {\n useResize(myChart, chartDOM)\n }\n } else {\n // 如果没有尺寸,使用 ResizeObserver 等待\n setupResizeObserver()\n }\n }\n\n // 使用 IntersectionObserver 监听元素是否进入可视区域\n function setupIntersectionObserver() {\n if (!chartDOM.value || typeof IntersectionObserver === 'undefined') {\n return\n }\n\n intersectionObserver = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting && !isInViewport) {\n isInViewport = true\n // 进入可视区域,开始初始化流程\n startInitialization()\n // 停止观察,避免重复初始化\n intersectionObserver?.disconnect()\n intersectionObserver = null\n break\n }\n }\n },\n {\n // 当元素有任何部分进入可视区域时触发\n threshold: 0,\n // 可以设置 rootMargin 来提前触发,比如提前 100px\n rootMargin: '100px'\n }\n )\n\n intersectionObserver.observe(chartDOM.value)\n }\n\n // 使用 ResizeObserver 监听容器尺寸变化\n function setupResizeObserver() {\n if (!chartDOM.value || typeof ResizeObserver === 'undefined') {\n return\n }\n\n resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect\n if (width > 0 && height > 0 && !isInitialized && (!lazyLoad || isInViewport)) {\n // 容器有尺寸了,且满足懒加载条件,可以安全初始化\n initChart()\n if (initAfter) {\n initAfter(myChart)\n }\n // 设置 resize 监听\n if (myChart && !myChart.isDisposed()) {\n useResize(myChart, chartDOM)\n }\n // 初始化后停止观察\n resizeObserver?.disconnect()\n resizeObserver = null\n break\n }\n }\n })\n\n resizeObserver.observe(chartDOM.value)\n }\n\n // 安全的初始化函数\n async function safeInitChart() {\n if (isInitialized || !chartDOM.value) {\n return myChart\n }\n\n // 等待 DOM 渲染完成\n await nextTick()\n\n // 如果启用了懒加载,先检查是否在可视区域\n if (lazyLoad) {\n setupIntersectionObserver()\n return myChart\n }\n\n // 非懒加载模式,直接开始初始化流程\n await startInitialization()\n\n return myChart\n }\n\n async function renderChart(...opt: [EChartsOption, SetOptionOpts?]) {\n try {\n // 确保图表已初始化\n if (!myChart || myChart.isDisposed()) {\n await safeInitChart()\n }\n\n myChart?.showLoading()\n if (chartData.value?.data?.length) {\n if (isEmpty === true) {\n if (!opt[1]) {\n opt[1] = {}\n }\n opt[1].notMerge = true\n }\n isEmpty = false\n }\n else {\n // 数据为空时保持原有配置\n opt = await setEmpty()\n }\n myChart?.setOption(...opt)\n }\n catch (error) {\n if (myChart && !myChart.isDisposed()) {\n disposeChart()\n }\n // 如果实例已被销毁,重新创建\n initChart()\n opt = await setEmpty('配置项错误')\n myChart?.setOption(...opt)\n } finally {\n myChart?.hideLoading()\n }\n }\n\n function setEmpty(subtext = '暂无数据'): Promise<[EChartsOption, SetOptionOpts]> {\n return new Promise((resolve) => {\n const img = new Image()\n img.src = emptyImg\n\n img.onload = () => {\n const aspectRatio = img.width / img.height\n\n const obj: EChartsOption = {\n title: [{\n text: chartData.value?.modelName,\n ...chartOptions.value.title,\n }, {\n subtext,\n top: 'center',\n left: 'center',\n text: '{a|}',\n itemGap: -20,\n subtextStyle: {\n fontSize: 14,\n },\n textStyle: {\n align: 'center',\n rich: {\n a: {\n height: 100 / aspectRatio,\n width: 100,\n backgroundColor: {\n image: emptyImg,\n },\n },\n },\n },\n }],\n }\n isEmpty = true\n resolve([obj, {\n notMerge: true,\n replaceMerge: ['xAxis', 'yAxis', 'series'],\n lazyUpdate: false,\n }])\n }\n })\n }\n\n function toggleToolbox(show: boolean) {\n // 修改条件判断,移除 isDisposed 检查\n if (myChart && !myChart.isDisposed()) {\n try {\n myChart.setOption({\n toolbox: {\n show,\n },\n })\n }\n catch (error) {\n console.warn('Error toggling toolbox:', error)\n }\n }\n }\n\n const { isOutside: mouseInChart } = useMouseInElement(chartDOM)\n watchDebounced(mouseInChart, (newVal) => {\n // 修改条件判断\n if (typeof newVal !== 'boolean' || (!myChart || myChart.isDisposed())) {\n return\n }\n toggleToolbox(!newVal)\n }, { debounce: 200 })\n\n watchDebounced(\n () => chartOptions.value,\n async () => {\n // 修改条件判断\n if (myChart && !myChart.isDisposed()) {\n await renderChart(chartOptions.value)\n }\n },\n { debounce: 500, deep: true, immediate: true },\n )\n\n onMounted(async () => {\n if (initBefore) {\n await initBefore()\n }\n\n // 等待 DOM 渲染完成\n await nextTick()\n\n // 使用安全的初始化函数\n await safeInitChart()\n\n // 如果图表已经初始化(容器有尺寸),调用 initAfter 和设置 resize\n if (myChart && !myChart.isDisposed()) {\n if (initAfter) {\n initAfter(myChart)\n }\n useResize(myChart, chartDOM)\n }\n })\n\n onUnmounted(() => {\n // 清理 ResizeObserver\n if (resizeObserver) {\n resizeObserver.disconnect()\n resizeObserver = null\n }\n\n // 清理 IntersectionObserver\n if (intersectionObserver) {\n intersectionObserver.disconnect()\n intersectionObserver = null\n }\n\n if (myChart && !myChart.isDisposed()) {\n try {\n // 清理所有事件监听器\n myChart.getZr()?.off('mousemove')\n myChart.getZr()?.off('mouseout')\n myChart.getZr()?.off('click')\n myChart.off('click')\n disposeChart()\n }\n catch (error) {\n console.warn('Error during chart cleanup:', error)\n }\n }\n })\n\n return {\n myChart: () => myChart,\n }\n}\n\nexport function useResize(myChart: ECharts, chartDOM: Ref<HTMLElement | null>) {\n const { width, height } = useElementSize(chartDOM)\n watchDebounced([width, height], () => {\n if (myChart && !myChart.isDisposed()) {\n try {\n myChart.resize()\n }\n catch (error) {\n console.warn('Error during chart resize:', error)\n }\n }\n })\n}\n\nexport function useDataToExcelJson(dataSource: EChartData) {\n const { desc: { colDesc = [], groupByDesc = [] } = {}, data = [] } = dataSource\n const header = [...groupByDesc.map(item => item.colDesc), ...colDesc].filter(v => v) as string[]\n const json = data.map((item) => {\n return header.map((headerItem) => {\n return item[headerItem as keyof typeof item] || ''\n })\n })\n return [header, ...json]\n}\n"],"names":["useCharts","_ref","chartDOM","chartData","chartOptions","initBefore","initAfter","lazyLoad","myChart","isEmpty","isInitialized","resizeObserver","intersectionObserver","isInViewport","dpr","window","devicePixelRatio","disposeChart","isDisposed","dispose","error","console","warn","initChart","value","clientWidth","clientHeight","echarts","init","renderer","async","startInitialization","nextTick","useResize","ResizeObserver","entries","entry","width","height","contentRect","disconnect","observe","setupResizeObserver","safeInitChart","IntersectionObserver","isIntersecting","threshold","rootMargin","setEmpty","subtext","Promise","resolve","img","Image","src","emptyImg","onload","aspectRatio","obj","title","text","modelName","top","left","itemGap","subtextStyle","fontSize","textStyle","align","rich","a","backgroundColor","image","notMerge","replaceMerge","lazyUpdate","isOutside","mouseInChart","useMouseInElement","watchDebounced","newVal","show","setOption","toolbox","toggleToolbox","debounce","_len","arguments","length","opt","Array","_key","showLoading","data","hideLoading","renderChart","deep","immediate","onMounted","onUnmounted","getZr","off","useElementSize","resize","useDataToExcelJson","dataSource","desc","colDesc","groupByDesc","header","map","item","filter","v","json","headerItem"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"useCharts.mjs","sources":["../../../../../../../packages/components/src/data-chart/src/utils/useCharts.ts"],"sourcesContent":["import type { ECharts, SetOptionOpts } from 'echarts'\nimport type { Ref } from 'vue'\nimport type { EChartData, EChartsOption, IFormatPublicData } from './types'\nimport * as echarts from 'echarts'\nimport { onMounted, onUnmounted, nextTick } from 'vue'\nimport { useMouseInElement, useElementSize, watchDebounced } from '@vueuse/core'\n\n// 使用别名路径导入 SVG\nimport emptyImg from '../components/empty.svg'\n\n// 全局 IntersectionObserver 管理器\nclass IntersectionObserverManager {\n private observer: IntersectionObserver | null = null\n private callbacks = new Map<Element, () => void>()\n\n private createObserver() {\n if (typeof IntersectionObserver === 'undefined') {\n return null\n }\n\n return new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n const callback = this.callbacks.get(entry.target)\n if (callback) {\n callback()\n // 执行回调后移除监听,避免重复初始化\n this.unobserve(entry.target)\n }\n }\n }\n },\n {\n threshold: 0,\n rootMargin: '200px'\n }\n )\n }\n\n observe(element: Element, callback: () => void) {\n if (!this.observer) {\n this.observer = this.createObserver()\n }\n\n if (this.observer) {\n this.callbacks.set(element, callback)\n this.observer.observe(element)\n }\n }\n\n unobserve(element: Element) {\n if (this.observer) {\n this.observer.unobserve(element)\n this.callbacks.delete(element)\n }\n }\n\n disconnect() {\n if (this.observer) {\n this.observer.disconnect()\n this.callbacks.clear()\n this.observer = null\n }\n }\n}\n\n// 全局单例实例\nconst globalIntersectionObserver = new IntersectionObserverManager()\n\nexport function useCharts({ chartDOM, chartData, chartOptions, initBefore, initAfter, lazyLoad = true }: {\n chartDOM: Ref<HTMLElement | null>\n chartData: Ref<IFormatPublicData>\n chartOptions: Ref<EChartsOption>\n initBefore?: () => Promise<void>\n initAfter?: (e: ECharts | null) => void\n lazyLoad?: boolean\n}) {\n // 每个组件实例的独立状态\n let myChart: ECharts | null = null\n let isEmpty = false\n let resizeObserver: ResizeObserver | null = null\n let watchStopHandles: Array<() => void> = [] // 存储 watch 停止函数\n\n // 获取设备像素比\n const dpr = window.devicePixelRatio || 1\n\n function disposeChart() {\n if (myChart) {\n try {\n if (!myChart.isDisposed()) {\n myChart.dispose()\n }\n }\n catch (error) {\n console.warn('Error disposing chart:', error)\n }\n myChart = null\n }\n }\n\n function initChart() {\n if (!(myChart && !myChart.isDisposed())) {\n // 检查 DOM 元素是否存在\n if (!chartDOM.value) {\n console.warn('[ECharts] DOM element not found')\n return null\n }\n\n // 检查容器尺寸\n const { clientWidth, clientHeight } = chartDOM.value\n if (clientWidth === 0 || clientHeight === 0) {\n // 如果容器没有尺寸,返回 null 而不是强制初始化\n console.warn('[ECharts] Container has zero size. Width:', clientWidth, 'Height:', clientHeight, '. Skipping initialization.')\n return null\n }\n\n // 创建 ECharts 实例\n myChart = echarts.init(chartDOM.value, null, {\n devicePixelRatio: dpr,\n renderer: 'svg',\n })\n }\n return myChart\n }\n\n // 清理所有观察器\n function cleanupObservers() {\n // 从全局观察器中移除当前元素\n if (chartDOM.value) {\n globalIntersectionObserver.unobserve(chartDOM.value)\n }\n }\n\n // 初始化 watchDebounced 监听器\n function setupWatchers() {\n if (watchStopHandles.length > 0) {\n return // 已经设置过了,避免重复设置\n }\n\n // 鼠标悬停监听\n const { isOutside: mouseInChart } = useMouseInElement(chartDOM)\n const stopMouseWatch = watchDebounced(mouseInChart, (newVal) => {\n if (typeof newVal !== 'boolean' || (!myChart || myChart.isDisposed())) {\n return\n }\n toggleToolbox(!newVal)\n }, { debounce: 200 })\n\n // 图表选项监听\n const stopOptionsWatch = watchDebounced(\n () => chartOptions.value,\n async () => {\n await renderChart(chartOptions.value)\n },\n { debounce: 500, deep: true, immediate: true },\n )\n\n watchStopHandles.push(stopMouseWatch, stopOptionsWatch)\n }\n\n // 开始初始化流程\n async function startInitialization() {\n // 等待 DOM 渲染完成\n await nextTick()\n\n // 检查容器是否已经有尺寸\n const { clientWidth, clientHeight } = chartDOM.value || { clientWidth: 0, clientHeight: 0 }\n if (clientWidth > 0 && clientHeight > 0) {\n // 直接初始化\n const chart = initChart()\n if (chart) {\n if (initAfter) {\n initAfter(myChart)\n }\n if (myChart && !myChart.isDisposed()) {\n useResize(myChart, chartDOM)\n }\n // 图表初始化成功后,设置监听器\n setupWatchers()\n }\n // 初始化成功后清理观察器\n cleanupObservers()\n } else {\n // 如果没有尺寸,使用 ResizeObserver 等待\n setupResizeObserver()\n }\n }\n\n // 使用全局 IntersectionObserver 监听元素是否进入可视区域\n function setupIntersectionObserver() {\n if (!chartDOM.value) {\n return\n }\n\n // 使用全局观察器,避免重复创建\n globalIntersectionObserver.observe(chartDOM.value, () => {\n startInitialization()\n })\n }\n\n\n\n // 使用 ResizeObserver 监听容器尺寸变化\n function setupResizeObserver() {\n if (!chartDOM.value || typeof ResizeObserver === 'undefined') {\n return\n }\n\n resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect\n if (width > 0 && height > 0) {\n // 容器有尺寸了,可以安全初始化\n const chart = initChart()\n if (chart) {\n if (initAfter) {\n initAfter(myChart)\n }\n // 设置 resize 监听\n if (myChart && !myChart.isDisposed()) {\n useResize(myChart, chartDOM)\n }\n // 图表初始化成功后,设置监听器\n setupWatchers()\n }\n // 初始化后停止观察并清理其他观察器\n resizeObserver?.disconnect()\n resizeObserver = null\n cleanupObservers()\n break\n }\n }\n })\n\n resizeObserver.observe(chartDOM.value)\n }\n\n // 安全的初始化函数\n async function safeInitChart() {\n if (!chartDOM.value) {\n return myChart\n }\n\n // 等待 DOM 渲染完成\n await nextTick()\n\n // 如果启用了懒加载\n if (lazyLoad) {\n // 直接设置 IntersectionObserver,让它检测元素是否进入可视区域\n setupIntersectionObserver()\n return myChart\n }\n\n // 非懒加载模式,直接开始初始化流程\n await startInitialization()\n\n return myChart\n }\n\n async function renderChart(...opt: [EChartsOption, SetOptionOpts?]) {\n try {\n // 确保图表已初始化\n if (!myChart || myChart.isDisposed()) {\n await safeInitChart()\n }\n\n myChart?.showLoading()\n if (chartData.value?.data?.length) {\n if (isEmpty === true) {\n if (!opt[1]) {\n opt[1] = {}\n }\n opt[1].notMerge = true\n }\n isEmpty = false\n }\n else {\n // 数据为空时保持原有配置\n opt = await setEmpty()\n }\n myChart?.setOption(...opt)\n }\n catch (error) {\n if (myChart && !myChart.isDisposed()) {\n disposeChart()\n }\n // 如果实例已被销毁,重新创建\n initChart()\n opt = await setEmpty('配置项错误')\n myChart?.setOption(...opt)\n } finally {\n myChart?.hideLoading()\n }\n }\n\n function setEmpty(subtext = '暂无数据'): Promise<[EChartsOption, SetOptionOpts]> {\n return new Promise((resolve) => {\n const img = new Image()\n img.src = emptyImg\n\n img.onload = () => {\n const aspectRatio = img.width / img.height\n\n const obj: EChartsOption = {\n title: [{\n text: chartData.value?.modelName,\n ...chartOptions.value.title,\n }, {\n subtext,\n top: 'center',\n left: 'center',\n text: '{a|}',\n itemGap: -20,\n subtextStyle: {\n fontSize: 14,\n },\n textStyle: {\n align: 'center',\n rich: {\n a: {\n height: 100 / aspectRatio,\n width: 100,\n backgroundColor: {\n image: emptyImg,\n },\n },\n },\n },\n }],\n }\n isEmpty = true\n resolve([obj, {\n notMerge: true,\n replaceMerge: ['xAxis', 'yAxis', 'series'],\n lazyUpdate: false,\n }])\n }\n })\n }\n\n function toggleToolbox(show: boolean) {\n // 修改条件判断,移除 isDisposed 检查\n if (myChart && !myChart.isDisposed()) {\n try {\n myChart.setOption({\n toolbox: {\n show,\n },\n })\n }\n catch (error) {\n console.warn('Error toggling toolbox:', error)\n }\n }\n }\n\n // 移除这里的 watchDebounced 调用,改为在图表初始化后调用\n\n onMounted(async () => {\n if (initBefore) {\n await initBefore()\n }\n\n // 等待 DOM 渲染完成\n await nextTick()\n\n // 使用安全的初始化函数\n await safeInitChart()\n\n // 如果图表已经初始化(容器有尺寸),调用 initAfter 和设置 resize\n if (myChart && !myChart.isDisposed()) {\n if (initAfter) {\n initAfter(myChart)\n }\n useResize(myChart, chartDOM)\n // 图表初始化成功后,设置监听器\n setupWatchers()\n }\n })\n\n onUnmounted(() => {\n // 停止所有 watch 监听器\n watchStopHandles.forEach(stop => stop())\n watchStopHandles = []\n\n // 清理 ResizeObserver\n if (resizeObserver) {\n resizeObserver.disconnect()\n resizeObserver = null\n }\n\n // 清理全局 IntersectionObserver 中的当前元素\n cleanupObservers()\n\n if (myChart && !myChart.isDisposed()) {\n try {\n // 清理所有事件监听器\n myChart.getZr()?.off('mousemove')\n myChart.getZr()?.off('mouseout')\n myChart.getZr()?.off('click')\n myChart.off('click')\n disposeChart()\n }\n catch (error) {\n console.warn('Error during chart cleanup:', error)\n }\n }\n })\n\n return {\n myChart: () => myChart,\n }\n}\n\nexport function useResize(myChart: ECharts, chartDOM: Ref<HTMLElement | null>) {\n const { width, height } = useElementSize(chartDOM)\n watchDebounced([width, height], () => {\n if (myChart && !myChart.isDisposed()) {\n try {\n myChart.resize()\n }\n catch (error) {\n console.warn('Error during chart resize:', error)\n }\n }\n })\n}\n\nexport function useDataToExcelJson(dataSource: EChartData) {\n const { desc: { colDesc = [], groupByDesc = [] } = {}, data = [] } = dataSource\n const header = [...groupByDesc.map(item => item.colDesc), ...colDesc].filter(v => v) as string[]\n const json = data.map((item) => {\n return header.map((headerItem) => {\n return item[headerItem as keyof typeof item] || ''\n })\n })\n return [header, ...json]\n}\n"],"names":["globalIntersectionObserver","constructor","__publicField","this","Map","createObserver","IntersectionObserver","entries","entry","isIntersecting","callback","callbacks","get","target","unobserve","threshold","rootMargin","observe","element","observer","set","delete","disconnect","clear","useCharts","_ref","chartDOM","chartData","chartOptions","initBefore","initAfter","lazyLoad","myChart","isEmpty","resizeObserver","watchStopHandles","dpr","window","devicePixelRatio","disposeChart","isDisposed","dispose","error","console","warn","initChart","value","clientWidth","clientHeight","echarts","init","renderer","cleanupObservers","setupWatchers","length","isOutside","mouseInChart","useMouseInElement","stopMouseWatch","watchDebounced","newVal","show","setOption","toolbox","toggleToolbox","debounce","stopOptionsWatch","async","_len","arguments","opt","Array","_key","safeInitChart","showLoading","data","notMerge","setEmpty","hideLoading","renderChart","deep","immediate","push","startInitialization","nextTick","useResize","ResizeObserver","width","height","contentRect","setupResizeObserver","subtext","Promise","resolve","img","Image","src","emptyImg","onload","aspectRatio","obj","title","text","modelName","top","left","itemGap","subtextStyle","fontSize","textStyle","align","rich","a","backgroundColor","image","replaceMerge","lazyUpdate","onMounted","onUnmounted","forEach","stop","getZr","off","useElementSize","resize","useDataToExcelJson","dataSource","desc","colDesc","groupByDesc","header","map","item","filter","v","json","headerItem"],"mappings":"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"}
|
package/lib/package.json.cjs
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
"use strict";exports.version="0.0.
|
1
|
+
"use strict";exports.version="0.0.65";
|
2
2
|
//# sourceMappingURL=package.json.cjs.map
|
@@ -1,2 +1,2 @@
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("vue"),t=require("../utils/injectionKeys.cjs"),a=require("../utils/useCharts.cjs"),r=e.defineComponent({name:"DataChartLine",__name:"line",props:{chartData:{type:Object,required:!0},subShowType:{type:String,required:!0,default:"line-simple"},chartOptions:{type:null,required:!0},lazyLoad:{type:Boolean,required:!1,default:!0}},setup(r,{expose:
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("vue"),t=require("../utils/injectionKeys.cjs"),a=require("../utils/useCharts.cjs"),r=e.defineComponent({name:"DataChartLine",__name:"line",props:{chartData:{type:Object,required:!0},subShowType:{type:String,required:!0,default:"line-simple"},chartOptions:{type:null,required:!0},lazyLoad:{type:Boolean,required:!1,default:!0}},setup(r,{expose:n}){const s=e.ref(),l=e.inject(t.InjectionChartMerge,e=>e,!0),c=15,o="Total",i=!0;const u=e.computed(()=>{const{colDesc:e,xGroupByDesc:t,groupByDesc:a,data:n,modelName:s}=r.chartData;n&&0!==n.length||console.warn("[LineChart] 数据为空,图表将显示空状态"),e&&0!==e.length||console.warn("[LineChart] colDesc 为空,无法生成图表系列"),t?.colDesc||console.warn("[LineChart] xGroupByDesc.colDesc 为空,无法生成 X 轴数据");const u=Array.from(new Set(n?.map(e=>e[t?.colDesc||""]))).filter(e=>null!=e)||[],d=a?.find(e=>!e.xAxis),p={title:{text:s},legend:{data:[]},xAxis:{name:t?.colDesc||"",data:u},dataZoom:[{type:"inside",disabled:u.length<c}]};if(1===a?.length)p.series=e.map(e=>({name:e,type:"line",smooth:i,data:u.map(a=>{const r=n.find(e=>e[t?.colDesc||""]===a);return r?r[e]??null:null})})),p.legend.data=e;else if(2===a?.length){const a=[...new Set(n.map(e=>String(e[d?.colDesc||""])))];p.legend.data=a,p.series=a.map(a=>function(e,t,a,r,n,s){const l=[];return t.forEach(t=>{const c=a.find(a=>a[r?.colDesc]===t&&a[n?.colDesc]===e);c&&void 0!==c[s[0]]&&null!==c[s[0]]?l.push(c[s[0]]):l.push(null)}),{name:e,type:"line",smooth:i,stack:o,areaStyle:{},data:l}}(a,u,n,t,d,e))}return p.series=p.series?.map(e=>{const t={...e};switch(r.subShowType){case"line-simple":default:delete t.areaStyle;break;case"area-basic":t.areaStyle={}}return t}),l(p,r.chartOptions)}),{myChart:d}=a.useCharts({chartDOM:s,chartOptions:u,chartData:e.computed(()=>r.chartData),lazyLoad:r.lazyLoad});return n({myChart:d}),(t,a)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"dataChartLine",ref:s,class:"data-chart-line"},null,512))}});exports.default=r;
|
2
2
|
//# sourceMappingURL=line.vue2.cjs.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"line.vue2.cjs","sources":["../../../../../../../packages/components/src/data-chart/src/components/line.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { LegendComponentOption } from 'echarts'\nimport type { EChartsOption, IFormatPublicData } from '../utils/types'\nimport { InjectionChartMerge } from '../utils/injectionKeys'\nimport { useCharts } from '../utils/useCharts'\n\ndefineOptions({\n name: 'DataChartLine',\n})\nconst {\n chartData,\n subShowType = 'line-simple',\n chartOptions,\n lazyLoad = true,\n} = defineProps<{\n chartData: IFormatPublicData\n subShowType: string\n chartOptions: EChartsOption\n lazyLoad?: boolean\n}>()\nconst dataChartLine = ref()\nconst merge = inject(InjectionChartMerge, (v: any) => v, true)\n\n// 抽取类型定义\ninterface SeriesItem {\n name: string\n type: 'line'\n stack?: string\n smooth?: boolean\n areaStyle?: Record<string, any>\n data: Array<string | number>\n}\n\n// 将配置提取为常量\nconst CHART_CONSTANTS = {\n MIN_ZOOM_LENGTH: 15,\n STACK_NAME: 'Total',\n SMOOTH: true,\n} as const\n\n// 提取处理图表系列数据的函数\nfunction processSeriesData(legendDataItem: string,\n xAxisData: (string | number)[],\n data: any[],\n xGroupByDesc: any,\n yGroupByDesc: any,\n colDesc: string[]): SeriesItem {\n const seriesData: (string | number)[] = []\n\n xAxisData.forEach((xAxisItem) => {\n const targetData = data\n .find(dataItem =>\n dataItem[xGroupByDesc?.colDesc] === xAxisItem\n && dataItem[yGroupByDesc?.colDesc] === legendDataItem,\n )\n\n if (targetData) {\n seriesData.push(targetData[colDesc[0]])\n }\n else {\n seriesData.push(
|
1
|
+
{"version":3,"file":"line.vue2.cjs","sources":["../../../../../../../packages/components/src/data-chart/src/components/line.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { LegendComponentOption } from 'echarts'\nimport type { EChartsOption, IFormatPublicData } from '../utils/types'\nimport { InjectionChartMerge } from '../utils/injectionKeys'\nimport { useCharts } from '../utils/useCharts'\n\ndefineOptions({\n name: 'DataChartLine',\n})\nconst {\n chartData,\n subShowType = 'line-simple',\n chartOptions,\n lazyLoad = true,\n} = defineProps<{\n chartData: IFormatPublicData\n subShowType: string\n chartOptions: EChartsOption\n lazyLoad?: boolean\n}>()\nconst dataChartLine = ref()\nconst merge = inject(InjectionChartMerge, (v: any) => v, true)\n\n// 抽取类型定义\ninterface SeriesItem {\n name: string\n type: 'line'\n stack?: string\n smooth?: boolean\n areaStyle?: Record<string, any>\n data: Array<string | number | null>\n}\n\n// 将配置提取为常量\nconst CHART_CONSTANTS = {\n MIN_ZOOM_LENGTH: 15,\n STACK_NAME: 'Total',\n SMOOTH: true,\n} as const\n\n// 提取处理图表系列数据的函数\nfunction processSeriesData(legendDataItem: string,\n xAxisData: (string | number)[],\n data: any[],\n xGroupByDesc: any,\n yGroupByDesc: any,\n colDesc: string[]): SeriesItem {\n const seriesData: (string | number | null)[] = []\n\n xAxisData.forEach((xAxisItem) => {\n const targetData = data\n .find(dataItem =>\n dataItem[xGroupByDesc?.colDesc] === xAxisItem\n && dataItem[yGroupByDesc?.colDesc] === legendDataItem,\n )\n\n if (targetData && targetData[colDesc[0]] !== undefined && targetData[colDesc[0]] !== null) {\n seriesData.push(targetData[colDesc[0]])\n }\n else {\n seriesData.push(null) // 使用 null 而不是 0,让 ECharts 自动处理空值\n }\n })\n\n return {\n name: legendDataItem,\n type: 'line',\n smooth: CHART_CONSTANTS.SMOOTH,\n stack: CHART_CONSTANTS.STACK_NAME,\n areaStyle: {},\n data: seriesData,\n }\n}\n\nconst lineChartOptions = computed<EChartsOption>(() => {\n const { colDesc, xGroupByDesc, groupByDesc, data, modelName } = chartData\n\n // 数据验证\n if (!data || data.length === 0) {\n console.warn('[LineChart] 数据为空,图表将显示空状态')\n }\n\n if (!colDesc || colDesc.length === 0) {\n console.warn('[LineChart] colDesc 为空,无法生成图表系列')\n }\n\n if (!xGroupByDesc?.colDesc) {\n console.warn('[LineChart] xGroupByDesc.colDesc 为空,无法生成 X 轴数据')\n }\n\n const xAxisData = Array.from(new Set(data?.map(item => item[xGroupByDesc?.colDesc || '']))).filter(item => item !== undefined && item !== null) || []\n const yGroupByDesc = groupByDesc?.find(item => !item.xAxis)\n\n const config: EChartsOption & { series?: SeriesItem[] } = {\n title: { text: modelName },\n legend: { data: [] },\n xAxis: {\n name: xGroupByDesc?.colDesc || '',\n data: xAxisData,\n },\n dataZoom: [{\n type: 'inside',\n disabled: xAxisData.length < CHART_CONSTANTS.MIN_ZOOM_LENGTH,\n }],\n }\n\n // 处理系列数据\n if (groupByDesc?.length === 1) {\n config.series = colDesc.map(yItem => ({\n name: yItem,\n type: 'line',\n smooth: CHART_CONSTANTS.SMOOTH,\n data: xAxisData.map(xValue => {\n const dataItem = data.find(item => item[xGroupByDesc?.colDesc || ''] === xValue)\n return dataItem ? (dataItem[yItem] ?? null) : null\n }),\n }));\n (config.legend as LegendComponentOption).data = colDesc\n }\n else if (groupByDesc?.length === 2) {\n const legendData = [...new Set(data.map(item => String(item[yGroupByDesc?.colDesc || ''])))]\n ;(config.legend as LegendComponentOption).data = legendData\n\n config.series = legendData.map(legendDataItem =>\n processSeriesData(legendDataItem, xAxisData, data, xGroupByDesc, yGroupByDesc, colDesc),\n )\n }\n\n // 处理图表展示类型\n config.series = config.series?.map((item) => {\n const seriesItem = { ...item }\n\n switch (subShowType) {\n case 'line-simple':\n delete seriesItem.areaStyle\n break\n case 'area-basic':\n seriesItem.areaStyle = {}\n break\n default:\n delete seriesItem.areaStyle\n }\n\n return seriesItem\n })\n\n return merge(config, chartOptions)\n})\n\nconst { myChart } = useCharts({\n chartDOM: dataChartLine,\n chartOptions: lineChartOptions,\n chartData: computed(() => chartData),\n lazyLoad\n})\n\n// 暴露 myChart 方法供父组件访问\ndefineExpose({\n myChart,\n})\n</script>\n\n<template>\n <div\n ref=\"dataChartLine\"\n class=\"data-chart-line\"\n />\n</template>\n\n<style scoped lang=\"scss\">\n.data-chart-line {\n width: 100%;\n height: 100%;\n}\n</style>\n"],"names":["dataChartLine","ref","merge","inject","InjectionChartMerge","v","CHART_CONSTANTS","lineChartOptions","computed","colDesc","xGroupByDesc","groupByDesc","data","modelName","__props","chartData","length","console","warn","xAxisData","Array","from","Set","map","item","filter","yGroupByDesc","find","xAxis","config","title","text","legend","name","dataZoom","type","disabled","series","yItem","smooth","xValue","dataItem","legendData","String","legendDataItem","seriesData","forEach","xAxisItem","targetData","push","stack","areaStyle","processSeriesData","seriesItem","subShowType","chartOptions","myChart","useCharts","chartDOM","lazyLoad","__expose","_createElementBlock","class"],"mappings":"6aAoBA,MAAMA,EAAgBC,EAAAA,MAChBC,EAAQC,EAAAA,OAAOC,EAAAA,oBAAsBC,GAAWA,GAAG,GAanDC,EACa,GADbA,EAEQ,QAFRA,GAGI,EAqCV,MAAMC,EAAmBC,EAAAA,SAAwB,KAC/C,MAAMC,QAAEA,EAAAC,aAASA,EAAAC,YAAcA,OAAaC,EAAAC,UAAMA,GAAcC,EAAAC,UAG3DH,GAAwB,IAAhBA,EAAKI,QAChBC,QAAQC,KAAK,6BAGVT,GAA8B,IAAnBA,EAAQO,QACtBC,QAAQC,KAAK,mCAGVR,GAAcD,SACjBQ,QAAQC,KAAK,kDAGf,MAAMC,EAAYC,MAAMC,KAAK,IAAIC,IAAIV,GAAMW,IAAIC,GAAQA,EAAKd,GAAcD,SAAW,OAAOgB,OAAOD,GAAQA,UAAwC,GAC7IE,EAAef,GAAagB,KAAKH,IAASA,EAAKI,OAE/CC,EAAoD,CACxDC,MAAO,CAAEC,KAAMlB,GACfmB,OAAQ,CAAEpB,KAAM,IAChBgB,MAAO,CACLK,KAAMvB,GAAcD,SAAW,GAC/BG,KAAMO,GAERe,SAAU,CAAC,CACTC,KAAM,SACNC,SAAUjB,EAAUH,OAASV,KAKjC,GAA4B,IAAxBK,GAAaK,OACfa,EAAOQ,OAAS5B,EAAQc,IAAIe,IAAA,CAC1BL,KAAMK,EACNH,KAAM,OACNI,OAAQjC,EACRM,KAAMO,EAAUI,IAAIiB,IAClB,MAAMC,EAAW7B,EAAKe,KAAKH,GAAQA,EAAKd,GAAcD,SAAW,MAAQ+B,GACzE,OAAOC,EAAYA,EAASH,IAAU,KAAQ,UAGjDT,EAAOG,OAAiCpB,KAAOH,OAClD,GACiC,IAAxBE,GAAaK,OAAc,CAClC,MAAM0B,EAAa,IAAI,IAAIpB,IAAIV,EAAKW,IAAIC,GAAQmB,OAAOnB,EAAKE,GAAcjB,SAAW,QACnFoB,EAAOG,OAAiCpB,KAAO8B,EAEjDb,EAAOQ,OAASK,EAAWnB,OAlF/B,SAA2BqB,EACzBzB,EACAP,EACAF,EACAgB,EACAjB,GACA,MAAMoC,EAAyC,GAiB/C,OAfA1B,EAAU2B,QAASC,IACjB,MAAMC,EAAapC,EAChBe,KAAKc,GACJA,EAAS/B,GAAcD,WAAasC,GACjCN,EAASf,GAAcjB,WAAamC,GAGvCI,QAAyC,IAA3BA,EAAWvC,EAAQ,KAAgD,OAA3BuC,EAAWvC,EAAQ,IAC3EoC,EAAWI,KAAKD,EAAWvC,EAAQ,KAGnCoC,EAAWI,KAAK,QAIb,CACLhB,KAAMW,EACNT,KAAM,OACNI,OAAQjC,EACR4C,MAAO5C,EACP6C,UAAW,CAAA,EACXvC,KAAMiC,EAEV,CAoDMO,CAAkBR,EAAgBzB,EAAWP,EAAMF,EAAcgB,EAAcjB,GAEnF,CAoBA,OAjBAoB,EAAOQ,OAASR,EAAOQ,QAAQd,IAAKC,IAClC,MAAM6B,EAAa,IAAK7B,GAExB,OAAQV,EAAAwC,aACN,IAAK,cAML,eACSD,EAAWF,gBAJpB,IAAK,aACHE,EAAWF,UAAY,CAAA,EAM3B,OAAOE,IAGFnD,EAAM2B,EAAQf,EAAAyC,iBAGjBC,QAAEA,GAAYC,YAAU,CAC5BC,SAAU1D,EACVuD,aAAchD,EACdQ,UAAWP,EAAAA,SAAS,IAAMM,EAAAC,WAC1B4C,SAAO7C,EAAA6C,kBAITC,EAAa,CACXJ,kCAKAK,EAAAA,mBAGE,MAAA,SAFI,gBAAJ5D,IAAID,EACJ8D,MAAM"}
|
@@ -1,2 +1,2 @@
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("vue"),t=require("@qxs-bns/hooks"),r=require("@qxs-bns/utils"),a=require("lodash-es"),s=require("./analyze.cjs"),o=require("./components/area.vue.cjs"),u=require("./components/bar.vue.cjs"),n=require("./components/card.vue.cjs"),c=require("./components/funnel.vue.cjs"),l=require("./components/line.vue.cjs"),i=require("./components/pie.vue.cjs"),p=require("./components/radar.vue.cjs"),d=require("./components/scatter-simple.vue.cjs"),y=require("./components/scatter.vue.cjs"),f=require("./components/table.vue.cjs"),m=require("./utils/config.cjs"),h=require("./utils/injectionKeys.cjs"),q=require("./utils/safe-eval.cjs"),j=require("./utils/types.cjs"),v=require("./utils/useCharts.cjs"),C=e.defineComponent({name:"QxsDataChart",__name:"data-chart",props:{modelName:{type:String,required:!1,default:""},showTypeName:{type:String,required:!1,default:"table"},subShowType:{type:String,required:!1},data:{type:Object,required:!1,default:()=>({data:[],desc:{colDesc:[],showDesc:{showType:0,chartOptions:"{}",jsCodeSnippet:""},groupByDesc:[]}})},chartOptions:{type:null,required:!1,default:()=>({})},jsCodeSnippet:{type:String,required:!1,default:""},lazyLoad:{type:Boolean,required:!1,default:!0}},setup(C,{expose:g}){const
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("vue"),t=require("@qxs-bns/hooks"),r=require("@qxs-bns/utils"),a=require("lodash-es"),s=require("./analyze.cjs"),o=require("./components/area.vue.cjs"),u=require("./components/bar.vue.cjs"),n=require("./components/card.vue.cjs"),c=require("./components/funnel.vue.cjs"),l=require("./components/line.vue.cjs"),i=require("./components/pie.vue.cjs"),p=require("./components/radar.vue.cjs"),d=require("./components/scatter-simple.vue.cjs"),y=require("./components/scatter.vue.cjs"),f=require("./components/table.vue.cjs"),m=require("./utils/config.cjs"),h=require("./utils/injectionKeys.cjs"),q=require("./utils/safe-eval.cjs"),j=require("./utils/types.cjs"),v=require("./utils/useCharts.cjs"),C=e.defineComponent({name:"QxsDataChart",__name:"data-chart",props:{modelName:{type:String,required:!1,default:""},showTypeName:{type:String,required:!1,default:"table"},subShowType:{type:String,required:!1},data:{type:Object,required:!1,default:()=>({data:[],desc:{colDesc:[],showDesc:{showType:0,chartOptions:"{}",jsCodeSnippet:""},groupByDesc:[]}})},chartOptions:{type:null,required:!1,default:()=>({})},jsCodeSnippet:{type:String,required:!1,default:""},lazyLoad:{type:Boolean,required:!1,default:!0}},setup(C,{expose:g}){const D=t.useNamespace("data-chart"),b=e.ref(null),x={analyze:s,config:m,types:j},w={table:f.default,bar:u.default,line:l.default,pie:i.default,radar:p.default,scatter:y.default,funnel:c.default,area:o.default,card:n.default,"scatter-simple":d.default},S=e.computed(()=>a.cloneDeep(m.defaultChartOption[C.showTypeName])),T=e.computed(()=>{const{desc:{colDesc:e=[],groupByDesc:t=[]}={},data:r=[]}=C.data;let a=[],s=null;const o=t;a=o?.map(e=>(e.xAxis&&(s=e),e))||[];const u=s&&s.colDesc?r.filter(e=>{const t=s.colDesc;return e&&t&&void 0!==e[t]&&null!==e[t]}):r;return{colDesc:e||[],modelName:C.modelName,subShowType:C.subShowType,xGroupByDesc:s||{colDesc:"",groupByDesc:"",groupByValues:[],xAxis:!1},groupByDesc:a,data:u}});function N(){if("table"===C.showTypeName)return null;const e=b.value;return e&&"function"==typeof e.myChart?e.myChart():null}return g({exportExal:function(){if(0===C.data.data.length)return void console.log("暂无数据");const e=v.useDataToExcelJson(C.data);r.JsonToExcel(C.modelName,e)},QxsDataChartConfig:x,myChart:e.computed(()=>N()),getMyChart:N}),e.provide(h.InjectionChartMerge,function(e,t){let r=a.merge({},S.value,e,t)||{};if(C.jsCodeSnippet)try{r=q.safeEvalConfig(C.jsCodeSnippet,r)}catch(e){console.error("代码执行失败:",e)}return r}),(t,r)=>(e.openBlock(),e.createBlock(e.resolveDynamicComponent(w[t.showTypeName]),{ref_key:"myChartRef",ref:b,key:t.showTypeName,class:e.normalizeClass([e.unref(D).e("wrapper")]),"sub-show-type":t.subShowType,"chart-data":e.unref(T),"chart-options":t.chartOptions,"lazy-load":t.lazyLoad},null,8,["class","sub-show-type","chart-data","chart-options","lazy-load"]))}});exports.default=C;
|
2
2
|
//# sourceMappingURL=data-chart.vue.cjs.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"data-chart.vue.cjs","sources":["../../../../../../packages/components/src/data-chart/src/data-chart.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { EChartData, EChartsOption, IconRow, IFormatPublicData } from './utils/types'\nimport type { ECharts } from 'echarts'\nimport { useNamespace } from '@qxs-bns/hooks'\nimport { JsonToExcel } from '@qxs-bns/utils'\nimport { cloneDeep, merge as lodashMerge } from 'lodash-es'\nimport * as analyze from './analyze'\nimport Area from './components/area.vue'\nimport Bar from './components/bar.vue'\nimport Card from './components/card.vue'\nimport Funnel from './components/funnel.vue'\nimport Line from './components/line.vue'\nimport Pie from './components/pie.vue'\nimport Radar from './components/radar.vue'\nimport ScatterSimple from './components/scatter-simple.vue'\nimport Scatter from './components/scatter.vue'\nimport Table from './components/table.vue'\nimport * as config from './utils/config'\nimport { defaultChartOption } from './utils/config'\nimport { InjectionChartMerge } from './utils/injectionKeys'\nimport { safeEvalConfig } from './utils/safe-eval'\nimport * as types from './utils/types'\nimport { useDataToExcelJson } from './utils/useCharts'\n\ndefineOptions({\n name: 'QxsDataChart',\n})\nconst {\n showTypeName = 'table',\n subShowType,\n modelName = '',\n data: propData = {\n data: [],\n desc: {\n colDesc: [],\n showDesc: {\n showType: 0,\n chartOptions: '{}',\n jsCodeSnippet: '',\n },\n groupByDesc: [],\n },\n },\n chartOptions = {},\n jsCodeSnippet = '',\n lazyLoad = true,\n} = defineProps<{\n modelName?: string\n showTypeName?: IconRow['showTypeName']\n subShowType?: string\n data?: EChartData\n chartOptions?: EChartsOption\n jsCodeSnippet?: string\n lazyLoad?: boolean\n}>()\n\nconst ns = useNamespace('data-chart')\n\n// 子组件引用\nconst myChartRef = ref<any>(null)\n\nconst QxsDataChartConfig = {\n analyze,\n config,\n types,\n}\nconst coms: {\n [key: string]: any\n} = {\n 'table': Table,\n 'bar': Bar,\n 'line': Line,\n 'pie': Pie,\n 'radar': Radar,\n 'scatter': Scatter,\n 'funnel': Funnel,\n 'area': Area,\n 'card': Card,\n 'scatter-simple': ScatterSimple,\n}\n\nconst defaultChartOptionCopy = computed(() => {\n return cloneDeep(defaultChartOption[showTypeName])\n})\n\nconst formatPublicData = computed<IFormatPublicData>(() => {\n const { desc: { colDesc = [], groupByDesc = [] } = {}, data = [] } = propData\n\n // 处理 X 轴数据\n let xValue = []\n\n let xGroupByDesc: EChartData['desc']['groupByDesc'][0] | null = null\n xValue =
|
1
|
+
{"version":3,"file":"data-chart.vue.cjs","sources":["../../../../../../packages/components/src/data-chart/src/data-chart.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { EChartData, EChartsOption, IconRow, IFormatPublicData } from './utils/types'\nimport type { ECharts } from 'echarts'\nimport { useNamespace } from '@qxs-bns/hooks'\nimport { JsonToExcel } from '@qxs-bns/utils'\nimport { cloneDeep, merge as lodashMerge } from 'lodash-es'\nimport * as analyze from './analyze'\nimport Area from './components/area.vue'\nimport Bar from './components/bar.vue'\nimport Card from './components/card.vue'\nimport Funnel from './components/funnel.vue'\nimport Line from './components/line.vue'\nimport Pie from './components/pie.vue'\nimport Radar from './components/radar.vue'\nimport ScatterSimple from './components/scatter-simple.vue'\nimport Scatter from './components/scatter.vue'\nimport Table from './components/table.vue'\nimport * as config from './utils/config'\nimport { defaultChartOption } from './utils/config'\nimport { InjectionChartMerge } from './utils/injectionKeys'\nimport { safeEvalConfig } from './utils/safe-eval'\nimport * as types from './utils/types'\nimport { useDataToExcelJson } from './utils/useCharts'\n\ndefineOptions({\n name: 'QxsDataChart',\n})\nconst {\n showTypeName = 'table',\n subShowType,\n modelName = '',\n data: propData = {\n data: [],\n desc: {\n colDesc: [],\n showDesc: {\n showType: 0,\n chartOptions: '{}',\n jsCodeSnippet: '',\n },\n groupByDesc: [],\n },\n },\n chartOptions = {},\n jsCodeSnippet = '',\n lazyLoad = true,\n} = defineProps<{\n modelName?: string\n showTypeName?: IconRow['showTypeName']\n subShowType?: string\n data?: EChartData\n chartOptions?: EChartsOption\n jsCodeSnippet?: string\n lazyLoad?: boolean\n}>()\n\nconst ns = useNamespace('data-chart')\n\n// 子组件引用\nconst myChartRef = ref<any>(null)\n\nconst QxsDataChartConfig = {\n analyze,\n config,\n types,\n}\nconst coms: {\n [key: string]: any\n} = {\n 'table': Table,\n 'bar': Bar,\n 'line': Line,\n 'pie': Pie,\n 'radar': Radar,\n 'scatter': Scatter,\n 'funnel': Funnel,\n 'area': Area,\n 'card': Card,\n 'scatter-simple': ScatterSimple,\n}\n\nconst defaultChartOptionCopy = computed(() => {\n return cloneDeep(defaultChartOption[showTypeName])\n})\n\nconst formatPublicData = computed<IFormatPublicData>(() => {\n const { desc: { colDesc = [], groupByDesc = [] } = {}, data = [] } = propData\n\n // 处理 X 轴数据\n let xValue: EChartData['desc']['groupByDesc'] = []\n\n let xGroupByDesc: EChartData['desc']['groupByDesc'][0] | null = null\n const typedGroupByDesc = groupByDesc as EChartData['desc']['groupByDesc']\n xValue = typedGroupByDesc?.map((groupByDescItem) => {\n // if (groupByDescItem.colValues) {\n // groupByDescItem.colValuesDesc = {}\n // groupByDescItem.colValues.split(',')?.forEach((item) => {\n // const [key, value] = item.split(':')\n // groupByDescItem.colValuesDesc[key] = value\n // })\n // }\n if (groupByDescItem.xAxis) {\n xGroupByDesc = groupByDescItem\n }\n return groupByDescItem\n }) || []\n\n // 修复数据过滤逻辑,避免因为字段不存在导致数据被过滤掉\n const dataValue = xGroupByDesc && (xGroupByDesc as EChartData['desc']['groupByDesc'][0]).colDesc\n ? data.filter(item => {\n const colDescKey = (xGroupByDesc as EChartData['desc']['groupByDesc'][0]).colDesc\n return item && colDescKey && (item[colDescKey] !== undefined && item[colDescKey] !== null)\n })\n : data\n\n // if (xGroupByDesc && xGroupByDesc.colValuesDesc && Object.keys(xGroupByDesc.colValuesDesc).length) {\n // const { colDesc: colDescItem, colValuesDesc } = xGroupByDesc\n // console.log('colDesc: colDescItem, colValuesDesc: ', colDescItem, colValuesDesc)\n // dataValue = dataValue.map((item) => {\n // if (typeof item[colDescItem] === 'number') {\n // item[colDescItem] = colValuesDesc[item[colDescItem]]\n // }\n // return item\n // })\n // }\n\n const mergeConfig = {\n colDesc: colDesc || [],\n modelName,\n subShowType,\n xGroupByDesc: xGroupByDesc || {\n colDesc: '',\n groupByDesc: '',\n groupByValues: [],\n xAxis: false,\n },\n groupByDesc: xValue,\n data: dataValue,\n }\n return mergeConfig\n})\n\n// 导出数据\nfunction exportExal() {\n if (propData.data.length === 0) {\n // useMessage.error('暂无数据')\n console.log('暂无数据')\n return\n }\n const arr = useDataToExcelJson(propData)\n JsonToExcel(modelName, arr)\n}\nfunction merge(config: EChartsOption, defaultConfig: EChartsOption) {\n const mergeOpt = lodashMerge({}, defaultChartOptionCopy.value, config, defaultConfig)\n let conf = mergeOpt || {}\n\n if (jsCodeSnippet) {\n try {\n // 使用安全的配置处理函数\n conf = safeEvalConfig(jsCodeSnippet, conf)\n }\n catch (error) {\n console.error('代码执行失败:', error)\n }\n }\n\n return conf\n}\n\n// 获取内部 myChart 实例的方法\nfunction getMyChart(): ECharts | null {\n // 对于 table 类型,没有 myChart 实例\n if (showTypeName === 'table') {\n return null\n }\n\n // 尝试从子组件获取 myChart 实例\n const childComponent = myChartRef.value\n if (!childComponent) {\n return null\n }\n\n // 检查子组件是否有 myChart 方法(来自 useCharts)\n if (typeof childComponent.myChart === 'function') {\n return childComponent.myChart()\n }\n\n return null\n}\n\n// 为了保持向后兼容,提供 myChart 计算属性\nconst myChart = computed(() => getMyChart())\n\ndefineExpose({\n exportExal,\n QxsDataChartConfig,\n myChart,\n getMyChart,\n})\nprovide(InjectionChartMerge, merge)\n</script>\n\n<template>\n <component\n :is=\"coms[showTypeName]\"\n ref=\"myChartRef\"\n :key=\"showTypeName\"\n :class=\"[ns.e('wrapper')]\"\n :sub-show-type=\"subShowType\"\n :chart-data=\"formatPublicData\"\n :chart-options=\"chartOptions\"\n :lazy-load=\"lazyLoad\"\n />\n</template>\n"],"names":["ns","useNamespace","myChartRef","ref","QxsDataChartConfig","analyze","config","types","coms","table","Table","bar","Bar","line","Line","pie","Pie","radar","Radar","scatter","Scatter","funnel","Funnel","area","Area","card","Card","ScatterSimple","defaultChartOptionCopy","computed","cloneDeep","defaultChartOption","__props","formatPublicData","desc","colDesc","groupByDesc","data","xValue","xGroupByDesc","typedGroupByDesc","map","groupByDescItem","xAxis","dataValue","filter","item","colDescKey","modelName","subShowType","groupByValues","getMyChart","showTypeName","childComponent","value","myChart","__expose","exportExal","length","console","log","arr","useDataToExcelJson","JsonToExcel","provide","InjectionChartMerge","defaultConfig","conf","lodashMerge","jsCodeSnippet","safeEvalConfig","error","_createBlock","_resolveDynamicComponent","key","class","_normalizeClass","_unref","e","chartOptions","lazyLoad"],"mappings":"kxCAwDA,MAAMA,EAAKC,EAAAA,aAAa,cAGlBC,EAAaC,EAAAA,IAAS,MAEtBC,EAAqB,CACzBC,UACAC,SACAC,SAEIC,EAEF,CACFC,MAASC,EAAAA,QACTC,IAAOC,EAAAA,QACPC,KAAQC,EAAAA,QACRC,IAAOC,EAAAA,QACPC,MAASC,EAAAA,QACTC,QAAWC,EAAAA,QACXC,OAAUC,EAAAA,QACVC,KAAQC,EAAAA,QACRC,KAAQC,EAAAA,QACR,iBAAkBC,EAAAA,SAGdC,EAAyBC,EAAAA,SAAS,IAC/BC,YAAUC,EAAAA,mBAAmBC,kBAGhCC,EAAmBJ,EAAAA,SAA4B,KACnD,MAAQK,MAAMC,QAAEA,EAAU,eAAIC,EAAc,IAAO,CAAA,EAACC,KAAGA,EAAO,IAAOL,EAAAK,KAGrE,IAAIC,EAA4C,GAE5CC,EAA4D,KAChE,MAAMC,EAAmBJ,EACzBE,EAASE,GAAkBC,IAAKC,IAQ1BA,EAAgBC,QAClBJ,EAAeG,GAEVA,KACH,GAGN,MAAME,EAAYL,GAAiBA,EAAsDJ,QACrFE,EAAKQ,OAAOC,IACV,MAAMC,EAAcR,EAAsDJ,QAC1E,OAAOW,GAAQC,QAAoC,IAArBD,EAAKC,IAAkD,OAArBD,EAAKC,KAEvEV,EA0BJ,MAboB,CAClBF,QAASA,GAAW,GACpBa,UAAQhB,EAAAgB,UACRC,YAAUjB,EAAAiB,YACVV,aAAcA,GAAgB,CAC5BJ,QAAS,GACTC,YAAa,GACbc,cAAe,GACfP,OAAO,GAETP,YAAaE,EACbD,KAAMO,KAiCV,SAASO,IAEP,GAAqB,UAAjBnB,EAAAoB,aACF,OAAO,KAIT,MAAMC,EAAiBnD,EAAWoD,MAClC,OAAKD,GAKiC,mBAA3BA,EAAeE,QACjBF,EAAeE,UALf,IASX,QAKAC,EAAa,CACXC,WAnDF,WACE,GAA6B,IAAzBzB,OAASK,KAAKqB,OAGhB,YADAC,QAAQC,IAAI,QAGd,MAAMC,EAAMC,EAAAA,mBAAmB9B,EAAAK,MAC/B0B,cAAY/B,EAAAgB,UAAWa,EACzB,EA4CEzD,qBACAmD,QALc1B,EAAAA,SAAS,IAAMsB,KAM7BA,eAEFa,EAAAA,QAAQC,EAAAA,oBA/CR,SAAe3D,EAAuB4D,GAEpC,IAAIC,EADaC,EAAAA,MAAY,CAAA,EAAIxC,EAAuB0B,MAAOhD,EAAQ4D,IAChD,CAAA,EAEvB,GAAIlC,EAAAqC,cACF,IAEEF,EAAOG,EAAAA,eAAetC,gBAAemC,EACvC,OACOI,GACLZ,QAAQY,MAAM,UAAWA,EAC3B,CAGF,OAAOJ,CACT,yBAoCEK,cASEC,EAAAA,wBARKjE,EAAK4C,EAAAA,eAAY,SAClB,aAAJjD,IAAID,EACHwE,IAAKtB,EAAAA,aACLuB,MAAKC,EAAAA,eAAA,CAAGC,EAAAA,MAAA7E,GAAG8E,EAAC,aACZ,gBAAe7B,EAAAA,YACf,aAAY4B,EAAAA,MAAA5C,GACZ,gBAAe8C,EAAAA,aACf,YAAWC,EAAAA"}
|
@@ -1,2 +1,2 @@
|
|
1
|
-
"use strict";var e=require("echarts"),t=require("vue"),n=require("@vueuse/core"),i=require("../components/empty.svg.cjs");function
|
1
|
+
"use strict";var e=require("echarts"),t=require("vue"),n=require("@vueuse/core"),i=require("../components/empty.svg.cjs");function r(e){var t=Object.create(null);return e&&Object.keys(e).forEach(function(n){if("default"!==n){var i=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,i.get?i:{enumerable:!0,get:function(){return e[n]}})}}),t.default=e,Object.freeze(t)}var s=r(e),o=Object.defineProperty,a=(e,t,n)=>((e,t,n)=>t in e?o(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n)(e,"symbol"!=typeof t?t+"":t,n);const c=new class{constructor(){a(this,"observer",null),a(this,"callbacks",new Map)}createObserver(){return"undefined"==typeof IntersectionObserver?null:new IntersectionObserver(e=>{for(const t of e)if(t.isIntersecting){const e=this.callbacks.get(t.target);e&&(e(),this.unobserve(t.target))}},{threshold:0,rootMargin:"200px"})}observe(e,t){this.observer||(this.observer=this.createObserver()),this.observer&&(this.callbacks.set(e,t),this.observer.observe(e))}unobserve(e){this.observer&&(this.observer.unobserve(e),this.callbacks.delete(e))}disconnect(){this.observer&&(this.observer.disconnect(),this.callbacks.clear(),this.observer=null)}};function l(e,t){const{width:i,height:r}=n.useElementSize(t);n.watchDebounced([i,r],()=>{if(e&&!e.isDisposed())try{e.resize()}catch(e){console.warn("Error during chart resize:",e)}})}exports.useCharts=function(e){let{chartDOM:r,chartData:o,chartOptions:a,initBefore:u,initAfter:h,lazyLoad:d=!0}=e,f=null,v=!1,b=null,p=[];const g=window.devicePixelRatio||1;function w(){if(f){try{f.isDisposed()||f.dispose()}catch(e){console.warn("Error disposing chart:",e)}f=null}}function y(){if(!f||f.isDisposed()){if(!r.value)return console.warn("[ECharts] DOM element not found"),null;const{clientWidth:e,clientHeight:t}=r.value;if(0===e||0===t)return console.warn("[ECharts] Container has zero size. Width:",e,"Height:",t,". Skipping initialization."),null;f=s.init(r.value,null,{devicePixelRatio:g,renderer:"svg"})}return f}function m(){r.value&&c.unobserve(r.value)}function D(){if(p.length>0)return;const{isOutside:e}=n.useMouseInElement(r),t=n.watchDebounced(e,e=>{"boolean"==typeof e&&f&&!f.isDisposed()&&function(e){if(f&&!f.isDisposed())try{f.setOption({toolbox:{show:e}})}catch(e){console.warn("Error toggling toolbox:",e)}}(!e)},{debounce:200}),i=n.watchDebounced(()=>a.value,async()=>{await async function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];try{f&&!f.isDisposed()||await O(),f?.showLoading(),o.value?.data?.length?(!0===v&&(t[1]||(t[1]={}),t[1].notMerge=!0),v=!1):t=await k(),f?.setOption(...t)}catch(e){f&&!f.isDisposed()&&w(),y(),t=await k("配置项错误"),f?.setOption(...t)}finally{f?.hideLoading()}}(a.value)},{debounce:500,deep:!0,immediate:!0});p.push(t,i)}async function x(){await t.nextTick();const{clientWidth:e,clientHeight:n}=r.value||{clientWidth:0,clientHeight:0};if(e>0&&n>0){y()&&(h&&h(f),f&&!f.isDisposed()&&l(f,r),D()),m()}else!function(){if(!r.value||"undefined"==typeof ResizeObserver)return;b=new ResizeObserver(e=>{for(const t of e){const{width:e,height:n}=t.contentRect;if(e>0&&n>0){y()&&(h&&h(f),f&&!f.isDisposed()&&l(f,r),D()),b?.disconnect(),b=null,m();break}}}),b.observe(r.value)}()}async function O(){return r.value?(await t.nextTick(),d?(r.value&&c.observe(r.value,()=>{x()}),f):(await x(),f)):f}function k(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"暂无数据";return new Promise(t=>{const n=new Image;n.src=i.default,n.onload=()=>{const r=n.width/n.height,s={title:[{text:o.value?.modelName,...a.value.title},{subtext:e,top:"center",left:"center",text:"{a|}",itemGap:-20,subtextStyle:{fontSize:14},textStyle:{align:"center",rich:{a:{height:100/r,width:100,backgroundColor:{image:i.default}}}}}]};v=!0,t([s,{notMerge:!0,replaceMerge:["xAxis","yAxis","series"],lazyUpdate:!1}])}})}return t.onMounted(async()=>{u&&await u(),await t.nextTick(),await O(),f&&!f.isDisposed()&&(h&&h(f),l(f,r),D())}),t.onUnmounted(()=>{if(p.forEach(e=>e()),p=[],b&&(b.disconnect(),b=null),m(),f&&!f.isDisposed())try{f.getZr()?.off("mousemove"),f.getZr()?.off("mouseout"),f.getZr()?.off("click"),f.off("click"),w()}catch(e){console.warn("Error during chart cleanup:",e)}}),{myChart:()=>f}},exports.useDataToExcelJson=function(e){const{desc:{colDesc:t=[],groupByDesc:n=[]}={},data:i=[]}=e,r=[...n.map(e=>e.colDesc),...t].filter(e=>e),s=i.map(e=>r.map(t=>e[t]||""));return[r,...s]},exports.useResize=l;
|
2
2
|
//# sourceMappingURL=useCharts.cjs.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"useCharts.cjs","sources":["../../../../../../../packages/components/src/data-chart/src/utils/useCharts.ts"],"sourcesContent":["import type { ECharts, SetOptionOpts } from 'echarts'\nimport type { Ref } from 'vue'\nimport type { EChartData, EChartsOption, IFormatPublicData } from './types'\nimport * as echarts from 'echarts'\nimport { onMounted, onUnmounted, nextTick } from 'vue'\nimport { useMouseInElement, useElementSize, watchDebounced } from '@vueuse/core'\n\n// 使用别名路径导入 SVG\nimport emptyImg from '../components/empty.svg'\n\nexport function useCharts({ chartDOM, chartData, chartOptions, initBefore, initAfter, lazyLoad = true }: {\n chartDOM: Ref<HTMLElement | null>\n chartData: Ref<IFormatPublicData>\n chartOptions: Ref<EChartsOption>\n initBefore?: () => Promise<void>\n initAfter?: (e: ECharts | null) => void\n lazyLoad?: boolean\n}) {\n // 每个组件实例的独立状态\n let myChart: ECharts | null = null\n let isEmpty = false\n let isInitialized = false\n let resizeObserver: ResizeObserver | null = null\n let intersectionObserver: IntersectionObserver | null = null\n let isInViewport = false\n\n // 获取设备像素比\n const dpr = window.devicePixelRatio || 1\n\n function disposeChart() {\n if (myChart && !myChart.isDisposed()) {\n try {\n myChart.dispose()\n }\n catch (error) {\n console.warn('Error disposing chart:', error)\n }\n myChart = null\n }\n }\n\n function initChart() {\n if (!(myChart && !myChart.isDisposed())) {\n // 检查 DOM 元素是否存在\n if (!chartDOM.value) {\n console.warn('[ECharts] DOM element not found')\n return null\n }\n\n // 检查容器尺寸\n const { clientWidth, clientHeight } = chartDOM.value\n if (clientWidth === 0 || clientHeight === 0) {\n // 如果容器没有尺寸,返回 null 而不是强制初始化\n console.warn('[ECharts] Container has zero size. Width:', clientWidth, 'Height:', clientHeight, '. Skipping initialization.')\n return null\n }\n\n // 创建 ECharts 实例\n myChart = echarts.init(chartDOM.value, null, {\n devicePixelRatio: dpr,\n renderer: 'svg',\n })\n\n isInitialized = true\n }\n return myChart\n }\n\n // 开始初始化流程\n async function startInitialization() {\n // 等待 DOM 渲染完成\n await nextTick()\n\n // 检查容器是否已经有尺寸\n const { clientWidth, clientHeight } = chartDOM.value || { clientWidth: 0, clientHeight: 0 }\n if (clientWidth > 0 && clientHeight > 0) {\n // 直接初始化\n initChart()\n if (initAfter) {\n initAfter(myChart)\n }\n if (myChart && !myChart.isDisposed()) {\n useResize(myChart, chartDOM)\n }\n } else {\n // 如果没有尺寸,使用 ResizeObserver 等待\n setupResizeObserver()\n }\n }\n\n // 使用 IntersectionObserver 监听元素是否进入可视区域\n function setupIntersectionObserver() {\n if (!chartDOM.value || typeof IntersectionObserver === 'undefined') {\n return\n }\n\n intersectionObserver = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting && !isInViewport) {\n isInViewport = true\n // 进入可视区域,开始初始化流程\n startInitialization()\n // 停止观察,避免重复初始化\n intersectionObserver?.disconnect()\n intersectionObserver = null\n break\n }\n }\n },\n {\n // 当元素有任何部分进入可视区域时触发\n threshold: 0,\n // 可以设置 rootMargin 来提前触发,比如提前 100px\n rootMargin: '100px'\n }\n )\n\n intersectionObserver.observe(chartDOM.value)\n }\n\n // 使用 ResizeObserver 监听容器尺寸变化\n function setupResizeObserver() {\n if (!chartDOM.value || typeof ResizeObserver === 'undefined') {\n return\n }\n\n resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect\n if (width > 0 && height > 0 && !isInitialized && (!lazyLoad || isInViewport)) {\n // 容器有尺寸了,且满足懒加载条件,可以安全初始化\n initChart()\n if (initAfter) {\n initAfter(myChart)\n }\n // 设置 resize 监听\n if (myChart && !myChart.isDisposed()) {\n useResize(myChart, chartDOM)\n }\n // 初始化后停止观察\n resizeObserver?.disconnect()\n resizeObserver = null\n break\n }\n }\n })\n\n resizeObserver.observe(chartDOM.value)\n }\n\n // 安全的初始化函数\n async function safeInitChart() {\n if (isInitialized || !chartDOM.value) {\n return myChart\n }\n\n // 等待 DOM 渲染完成\n await nextTick()\n\n // 如果启用了懒加载,先检查是否在可视区域\n if (lazyLoad) {\n setupIntersectionObserver()\n return myChart\n }\n\n // 非懒加载模式,直接开始初始化流程\n await startInitialization()\n\n return myChart\n }\n\n async function renderChart(...opt: [EChartsOption, SetOptionOpts?]) {\n try {\n // 确保图表已初始化\n if (!myChart || myChart.isDisposed()) {\n await safeInitChart()\n }\n\n myChart?.showLoading()\n if (chartData.value?.data?.length) {\n if (isEmpty === true) {\n if (!opt[1]) {\n opt[1] = {}\n }\n opt[1].notMerge = true\n }\n isEmpty = false\n }\n else {\n // 数据为空时保持原有配置\n opt = await setEmpty()\n }\n myChart?.setOption(...opt)\n }\n catch (error) {\n if (myChart && !myChart.isDisposed()) {\n disposeChart()\n }\n // 如果实例已被销毁,重新创建\n initChart()\n opt = await setEmpty('配置项错误')\n myChart?.setOption(...opt)\n } finally {\n myChart?.hideLoading()\n }\n }\n\n function setEmpty(subtext = '暂无数据'): Promise<[EChartsOption, SetOptionOpts]> {\n return new Promise((resolve) => {\n const img = new Image()\n img.src = emptyImg\n\n img.onload = () => {\n const aspectRatio = img.width / img.height\n\n const obj: EChartsOption = {\n title: [{\n text: chartData.value?.modelName,\n ...chartOptions.value.title,\n }, {\n subtext,\n top: 'center',\n left: 'center',\n text: '{a|}',\n itemGap: -20,\n subtextStyle: {\n fontSize: 14,\n },\n textStyle: {\n align: 'center',\n rich: {\n a: {\n height: 100 / aspectRatio,\n width: 100,\n backgroundColor: {\n image: emptyImg,\n },\n },\n },\n },\n }],\n }\n isEmpty = true\n resolve([obj, {\n notMerge: true,\n replaceMerge: ['xAxis', 'yAxis', 'series'],\n lazyUpdate: false,\n }])\n }\n })\n }\n\n function toggleToolbox(show: boolean) {\n // 修改条件判断,移除 isDisposed 检查\n if (myChart && !myChart.isDisposed()) {\n try {\n myChart.setOption({\n toolbox: {\n show,\n },\n })\n }\n catch (error) {\n console.warn('Error toggling toolbox:', error)\n }\n }\n }\n\n const { isOutside: mouseInChart } = useMouseInElement(chartDOM)\n watchDebounced(mouseInChart, (newVal) => {\n // 修改条件判断\n if (typeof newVal !== 'boolean' || (!myChart || myChart.isDisposed())) {\n return\n }\n toggleToolbox(!newVal)\n }, { debounce: 200 })\n\n watchDebounced(\n () => chartOptions.value,\n async () => {\n // 修改条件判断\n if (myChart && !myChart.isDisposed()) {\n await renderChart(chartOptions.value)\n }\n },\n { debounce: 500, deep: true, immediate: true },\n )\n\n onMounted(async () => {\n if (initBefore) {\n await initBefore()\n }\n\n // 等待 DOM 渲染完成\n await nextTick()\n\n // 使用安全的初始化函数\n await safeInitChart()\n\n // 如果图表已经初始化(容器有尺寸),调用 initAfter 和设置 resize\n if (myChart && !myChart.isDisposed()) {\n if (initAfter) {\n initAfter(myChart)\n }\n useResize(myChart, chartDOM)\n }\n })\n\n onUnmounted(() => {\n // 清理 ResizeObserver\n if (resizeObserver) {\n resizeObserver.disconnect()\n resizeObserver = null\n }\n\n // 清理 IntersectionObserver\n if (intersectionObserver) {\n intersectionObserver.disconnect()\n intersectionObserver = null\n }\n\n if (myChart && !myChart.isDisposed()) {\n try {\n // 清理所有事件监听器\n myChart.getZr()?.off('mousemove')\n myChart.getZr()?.off('mouseout')\n myChart.getZr()?.off('click')\n myChart.off('click')\n disposeChart()\n }\n catch (error) {\n console.warn('Error during chart cleanup:', error)\n }\n }\n })\n\n return {\n myChart: () => myChart,\n }\n}\n\nexport function useResize(myChart: ECharts, chartDOM: Ref<HTMLElement | null>) {\n const { width, height } = useElementSize(chartDOM)\n watchDebounced([width, height], () => {\n if (myChart && !myChart.isDisposed()) {\n try {\n myChart.resize()\n }\n catch (error) {\n console.warn('Error during chart resize:', error)\n }\n }\n })\n}\n\nexport function useDataToExcelJson(dataSource: EChartData) {\n const { desc: { colDesc = [], groupByDesc = [] } = {}, data = [] } = dataSource\n const header = [...groupByDesc.map(item => item.colDesc), ...colDesc].filter(v => v) as string[]\n const json = data.map((item) => {\n return header.map((headerItem) => {\n return item[headerItem as keyof typeof item] || ''\n })\n })\n return [header, ...json]\n}\n"],"names":["useResize","myChart","chartDOM","width","height","useElementSize","watchDebounced","isDisposed","resize","error","console","warn","_ref","chartData","chartOptions","initBefore","initAfter","lazyLoad","isEmpty","isInitialized","resizeObserver","intersectionObserver","isInViewport","dpr","window","devicePixelRatio","disposeChart","dispose","initChart","value","clientWidth","clientHeight","echarts","init","renderer","async","startInitialization","nextTick","ResizeObserver","entries","entry","contentRect","disconnect","observe","setupResizeObserver","safeInitChart","IntersectionObserver","isIntersecting","threshold","rootMargin","setEmpty","subtext","Promise","resolve","img","Image","src","emptyImg","onload","aspectRatio","obj","title","text","modelName","top","left","itemGap","subtextStyle","fontSize","textStyle","align","rich","a","backgroundColor","image","notMerge","replaceMerge","lazyUpdate","isOutside","mouseInChart","useMouseInElement","newVal","show","setOption","toolbox","toggleToolbox","debounce","_len","arguments","length","opt","Array","_key","showLoading","data","hideLoading","renderChart","deep","immediate","onMounted","onUnmounted","getZr","off","dataSource","desc","colDesc","groupByDesc","header","map","item","filter","v","json","headerItem"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"useCharts.cjs","sources":["../../../../../../../packages/components/src/data-chart/src/utils/useCharts.ts"],"sourcesContent":["import type { ECharts, SetOptionOpts } from 'echarts'\nimport type { Ref } from 'vue'\nimport type { EChartData, EChartsOption, IFormatPublicData } from './types'\nimport * as echarts from 'echarts'\nimport { onMounted, onUnmounted, nextTick } from 'vue'\nimport { useMouseInElement, useElementSize, watchDebounced } from '@vueuse/core'\n\n// 使用别名路径导入 SVG\nimport emptyImg from '../components/empty.svg'\n\n// 全局 IntersectionObserver 管理器\nclass IntersectionObserverManager {\n private observer: IntersectionObserver | null = null\n private callbacks = new Map<Element, () => void>()\n\n private createObserver() {\n if (typeof IntersectionObserver === 'undefined') {\n return null\n }\n\n return new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (entry.isIntersecting) {\n const callback = this.callbacks.get(entry.target)\n if (callback) {\n callback()\n // 执行回调后移除监听,避免重复初始化\n this.unobserve(entry.target)\n }\n }\n }\n },\n {\n threshold: 0,\n rootMargin: '200px'\n }\n )\n }\n\n observe(element: Element, callback: () => void) {\n if (!this.observer) {\n this.observer = this.createObserver()\n }\n\n if (this.observer) {\n this.callbacks.set(element, callback)\n this.observer.observe(element)\n }\n }\n\n unobserve(element: Element) {\n if (this.observer) {\n this.observer.unobserve(element)\n this.callbacks.delete(element)\n }\n }\n\n disconnect() {\n if (this.observer) {\n this.observer.disconnect()\n this.callbacks.clear()\n this.observer = null\n }\n }\n}\n\n// 全局单例实例\nconst globalIntersectionObserver = new IntersectionObserverManager()\n\nexport function useCharts({ chartDOM, chartData, chartOptions, initBefore, initAfter, lazyLoad = true }: {\n chartDOM: Ref<HTMLElement | null>\n chartData: Ref<IFormatPublicData>\n chartOptions: Ref<EChartsOption>\n initBefore?: () => Promise<void>\n initAfter?: (e: ECharts | null) => void\n lazyLoad?: boolean\n}) {\n // 每个组件实例的独立状态\n let myChart: ECharts | null = null\n let isEmpty = false\n let resizeObserver: ResizeObserver | null = null\n let watchStopHandles: Array<() => void> = [] // 存储 watch 停止函数\n\n // 获取设备像素比\n const dpr = window.devicePixelRatio || 1\n\n function disposeChart() {\n if (myChart) {\n try {\n if (!myChart.isDisposed()) {\n myChart.dispose()\n }\n }\n catch (error) {\n console.warn('Error disposing chart:', error)\n }\n myChart = null\n }\n }\n\n function initChart() {\n if (!(myChart && !myChart.isDisposed())) {\n // 检查 DOM 元素是否存在\n if (!chartDOM.value) {\n console.warn('[ECharts] DOM element not found')\n return null\n }\n\n // 检查容器尺寸\n const { clientWidth, clientHeight } = chartDOM.value\n if (clientWidth === 0 || clientHeight === 0) {\n // 如果容器没有尺寸,返回 null 而不是强制初始化\n console.warn('[ECharts] Container has zero size. Width:', clientWidth, 'Height:', clientHeight, '. Skipping initialization.')\n return null\n }\n\n // 创建 ECharts 实例\n myChart = echarts.init(chartDOM.value, null, {\n devicePixelRatio: dpr,\n renderer: 'svg',\n })\n }\n return myChart\n }\n\n // 清理所有观察器\n function cleanupObservers() {\n // 从全局观察器中移除当前元素\n if (chartDOM.value) {\n globalIntersectionObserver.unobserve(chartDOM.value)\n }\n }\n\n // 初始化 watchDebounced 监听器\n function setupWatchers() {\n if (watchStopHandles.length > 0) {\n return // 已经设置过了,避免重复设置\n }\n\n // 鼠标悬停监听\n const { isOutside: mouseInChart } = useMouseInElement(chartDOM)\n const stopMouseWatch = watchDebounced(mouseInChart, (newVal) => {\n if (typeof newVal !== 'boolean' || (!myChart || myChart.isDisposed())) {\n return\n }\n toggleToolbox(!newVal)\n }, { debounce: 200 })\n\n // 图表选项监听\n const stopOptionsWatch = watchDebounced(\n () => chartOptions.value,\n async () => {\n await renderChart(chartOptions.value)\n },\n { debounce: 500, deep: true, immediate: true },\n )\n\n watchStopHandles.push(stopMouseWatch, stopOptionsWatch)\n }\n\n // 开始初始化流程\n async function startInitialization() {\n // 等待 DOM 渲染完成\n await nextTick()\n\n // 检查容器是否已经有尺寸\n const { clientWidth, clientHeight } = chartDOM.value || { clientWidth: 0, clientHeight: 0 }\n if (clientWidth > 0 && clientHeight > 0) {\n // 直接初始化\n const chart = initChart()\n if (chart) {\n if (initAfter) {\n initAfter(myChart)\n }\n if (myChart && !myChart.isDisposed()) {\n useResize(myChart, chartDOM)\n }\n // 图表初始化成功后,设置监听器\n setupWatchers()\n }\n // 初始化成功后清理观察器\n cleanupObservers()\n } else {\n // 如果没有尺寸,使用 ResizeObserver 等待\n setupResizeObserver()\n }\n }\n\n // 使用全局 IntersectionObserver 监听元素是否进入可视区域\n function setupIntersectionObserver() {\n if (!chartDOM.value) {\n return\n }\n\n // 使用全局观察器,避免重复创建\n globalIntersectionObserver.observe(chartDOM.value, () => {\n startInitialization()\n })\n }\n\n\n\n // 使用 ResizeObserver 监听容器尺寸变化\n function setupResizeObserver() {\n if (!chartDOM.value || typeof ResizeObserver === 'undefined') {\n return\n }\n\n resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect\n if (width > 0 && height > 0) {\n // 容器有尺寸了,可以安全初始化\n const chart = initChart()\n if (chart) {\n if (initAfter) {\n initAfter(myChart)\n }\n // 设置 resize 监听\n if (myChart && !myChart.isDisposed()) {\n useResize(myChart, chartDOM)\n }\n // 图表初始化成功后,设置监听器\n setupWatchers()\n }\n // 初始化后停止观察并清理其他观察器\n resizeObserver?.disconnect()\n resizeObserver = null\n cleanupObservers()\n break\n }\n }\n })\n\n resizeObserver.observe(chartDOM.value)\n }\n\n // 安全的初始化函数\n async function safeInitChart() {\n if (!chartDOM.value) {\n return myChart\n }\n\n // 等待 DOM 渲染完成\n await nextTick()\n\n // 如果启用了懒加载\n if (lazyLoad) {\n // 直接设置 IntersectionObserver,让它检测元素是否进入可视区域\n setupIntersectionObserver()\n return myChart\n }\n\n // 非懒加载模式,直接开始初始化流程\n await startInitialization()\n\n return myChart\n }\n\n async function renderChart(...opt: [EChartsOption, SetOptionOpts?]) {\n try {\n // 确保图表已初始化\n if (!myChart || myChart.isDisposed()) {\n await safeInitChart()\n }\n\n myChart?.showLoading()\n if (chartData.value?.data?.length) {\n if (isEmpty === true) {\n if (!opt[1]) {\n opt[1] = {}\n }\n opt[1].notMerge = true\n }\n isEmpty = false\n }\n else {\n // 数据为空时保持原有配置\n opt = await setEmpty()\n }\n myChart?.setOption(...opt)\n }\n catch (error) {\n if (myChart && !myChart.isDisposed()) {\n disposeChart()\n }\n // 如果实例已被销毁,重新创建\n initChart()\n opt = await setEmpty('配置项错误')\n myChart?.setOption(...opt)\n } finally {\n myChart?.hideLoading()\n }\n }\n\n function setEmpty(subtext = '暂无数据'): Promise<[EChartsOption, SetOptionOpts]> {\n return new Promise((resolve) => {\n const img = new Image()\n img.src = emptyImg\n\n img.onload = () => {\n const aspectRatio = img.width / img.height\n\n const obj: EChartsOption = {\n title: [{\n text: chartData.value?.modelName,\n ...chartOptions.value.title,\n }, {\n subtext,\n top: 'center',\n left: 'center',\n text: '{a|}',\n itemGap: -20,\n subtextStyle: {\n fontSize: 14,\n },\n textStyle: {\n align: 'center',\n rich: {\n a: {\n height: 100 / aspectRatio,\n width: 100,\n backgroundColor: {\n image: emptyImg,\n },\n },\n },\n },\n }],\n }\n isEmpty = true\n resolve([obj, {\n notMerge: true,\n replaceMerge: ['xAxis', 'yAxis', 'series'],\n lazyUpdate: false,\n }])\n }\n })\n }\n\n function toggleToolbox(show: boolean) {\n // 修改条件判断,移除 isDisposed 检查\n if (myChart && !myChart.isDisposed()) {\n try {\n myChart.setOption({\n toolbox: {\n show,\n },\n })\n }\n catch (error) {\n console.warn('Error toggling toolbox:', error)\n }\n }\n }\n\n // 移除这里的 watchDebounced 调用,改为在图表初始化后调用\n\n onMounted(async () => {\n if (initBefore) {\n await initBefore()\n }\n\n // 等待 DOM 渲染完成\n await nextTick()\n\n // 使用安全的初始化函数\n await safeInitChart()\n\n // 如果图表已经初始化(容器有尺寸),调用 initAfter 和设置 resize\n if (myChart && !myChart.isDisposed()) {\n if (initAfter) {\n initAfter(myChart)\n }\n useResize(myChart, chartDOM)\n // 图表初始化成功后,设置监听器\n setupWatchers()\n }\n })\n\n onUnmounted(() => {\n // 停止所有 watch 监听器\n watchStopHandles.forEach(stop => stop())\n watchStopHandles = []\n\n // 清理 ResizeObserver\n if (resizeObserver) {\n resizeObserver.disconnect()\n resizeObserver = null\n }\n\n // 清理全局 IntersectionObserver 中的当前元素\n cleanupObservers()\n\n if (myChart && !myChart.isDisposed()) {\n try {\n // 清理所有事件监听器\n myChart.getZr()?.off('mousemove')\n myChart.getZr()?.off('mouseout')\n myChart.getZr()?.off('click')\n myChart.off('click')\n disposeChart()\n }\n catch (error) {\n console.warn('Error during chart cleanup:', error)\n }\n }\n })\n\n return {\n myChart: () => myChart,\n }\n}\n\nexport function useResize(myChart: ECharts, chartDOM: Ref<HTMLElement | null>) {\n const { width, height } = useElementSize(chartDOM)\n watchDebounced([width, height], () => {\n if (myChart && !myChart.isDisposed()) {\n try {\n myChart.resize()\n }\n catch (error) {\n console.warn('Error during chart resize:', error)\n }\n }\n })\n}\n\nexport function useDataToExcelJson(dataSource: EChartData) {\n const { desc: { colDesc = [], groupByDesc = [] } = {}, data = [] } = dataSource\n const header = [...groupByDesc.map(item => item.colDesc), ...colDesc].filter(v => v) as string[]\n const json = data.map((item) => {\n return header.map((headerItem) => {\n return item[headerItem as keyof typeof item] || ''\n })\n })\n return [header, ...json]\n}\n"],"names":["globalIntersectionObserver","constructor","__publicField","this","Map","createObserver","IntersectionObserver","entries","entry","isIntersecting","callback","callbacks","get","target","unobserve","threshold","rootMargin","observe","element","observer","set","delete","disconnect","clear","useResize","myChart","chartDOM","width","height","useElementSize","watchDebounced","isDisposed","resize","error","console","warn","_ref","chartData","chartOptions","initBefore","initAfter","lazyLoad","isEmpty","resizeObserver","watchStopHandles","dpr","window","devicePixelRatio","disposeChart","dispose","initChart","value","clientWidth","clientHeight","echarts","init","renderer","cleanupObservers","setupWatchers","length","isOutside","mouseInChart","useMouseInElement","stopMouseWatch","newVal","show","setOption","toolbox","toggleToolbox","debounce","stopOptionsWatch","async","_len","arguments","opt","Array","_key","safeInitChart","showLoading","data","notMerge","setEmpty","hideLoading","renderChart","deep","immediate","push","startInitialization","nextTick","ResizeObserver","contentRect","setupResizeObserver","subtext","Promise","resolve","img","Image","src","emptyImg","onload","aspectRatio","obj","title","text","modelName","top","left","itemGap","subtextStyle","fontSize","textStyle","align","rich","a","backgroundColor","image","replaceMerge","lazyUpdate","onMounted","onUnmounted","forEach","stop","getZr","off","dataSource","desc","colDesc","groupByDesc","header","map","item","filter","v","json","headerItem"],"mappings":"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"}
|
package/package.json
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"line.vue.d.ts","sourceRoot":"","sources":["../../../../../../../packages/components/src/data-chart/src/components/line.vue"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"line.vue.d.ts","sourceRoot":"","sources":["../../../../../../../packages/components/src/data-chart/src/components/line.vue"],"names":[],"mappings":"AAkLA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAOtE,KAAK,WAAW,GAAG;IACjB,SAAS,EAAE,iBAAiB,CAAA;IAC5B,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,aAAa,CAAA;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAC;;;;AA4LF,wBAOG"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"data-chart.vue.d.ts","sourceRoot":"","sources":["../../../../../../packages/components/src/data-chart/src/data-chart.vue"],"names":[],"mappings":"AAAA,
|
1
|
+
{"version":3,"file":"data-chart.vue.d.ts","sourceRoot":"","sources":["../../../../../../packages/components/src/data-chart/src/data-chart.vue"],"names":[],"mappings":"AAAA,OAwNO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,EAAqB,MAAM,eAAe,CAAA;AAC1F,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAItC,OAAO,KAAK,OAAO,MAAM,WAAW,CAAA;AAWpC,OAAO,KAAK,MAAM,MAAM,gBAAgB,CAAA;AAIxC,OAAO,KAAK,KAAK,MAAM,eAAe,CAAA;AAMtC,KAAK,WAAW,GAAG;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;IACtC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,YAAY,CAAC,EAAE,aAAa,CAAA;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,CAAC;AA6GF,iBAAS,UAAU,SAQlB;AAmBD,iBAAS,UAAU,IAAI,OAAO,GAAG,IAAI,CAkBpC;;;;;;;;;;;AAuED,wBAOG"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"useCharts.d.ts","sourceRoot":"","sources":["../../../../../../../packages/components/src/data-chart/src/utils/useCharts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAiB,MAAM,SAAS,CAAA;AACrD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAC9B,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;
|
1
|
+
{"version":3,"file":"useCharts.d.ts","sourceRoot":"","sources":["../../../../../../../packages/components/src/data-chart/src/utils/useCharts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAiB,MAAM,SAAS,CAAA;AACrD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAA;AAC9B,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAoE3E,wBAAgB,SAAS,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,QAAe,EAAE,EAAE;IACvG,QAAQ,EAAE,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,CAAA;IACjC,SAAS,EAAE,GAAG,CAAC,iBAAiB,CAAC,CAAA;IACjC,YAAY,EAAE,GAAG,CAAC,aAAa,CAAC,CAAA;IAChC,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAChC,SAAS,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI,KAAK,IAAI,CAAA;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;;EAgVA;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,QAY5E;AAED,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,UAAU,yBASxD"}
|