@qxs-bns/components 0.0.62 → 0.0.64
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/area.vue2.mjs +1 -1
- package/es/src/data-chart/src/components/area.vue2.mjs.map +1 -1
- package/es/src/data-chart/src/components/area.vue3.mjs +1 -1
- package/es/src/data-chart/src/components/bar.vue.mjs +1 -1
- package/es/src/data-chart/src/components/bar.vue.mjs.map +1 -1
- package/es/src/data-chart/src/components/bar.vue2.mjs +1 -1
- package/es/src/data-chart/src/components/bar.vue2.mjs.map +1 -1
- package/es/src/data-chart/src/components/bar.vue3.mjs +2 -0
- package/es/src/data-chart/src/components/bar.vue3.mjs.map +1 -0
- package/es/src/data-chart/src/components/funnel.vue.mjs +1 -1
- package/es/src/data-chart/src/components/funnel.vue.mjs.map +1 -1
- package/es/src/data-chart/src/components/funnel.vue2.mjs +1 -1
- package/es/src/data-chart/src/components/funnel.vue2.mjs.map +1 -1
- package/es/src/data-chart/src/components/funnel.vue3.mjs +2 -0
- package/es/src/data-chart/src/components/funnel.vue3.mjs.map +1 -0
- 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/components/pie.vue.mjs +1 -1
- package/es/src/data-chart/src/components/pie.vue.mjs.map +1 -1
- package/es/src/data-chart/src/components/pie.vue2.mjs +1 -1
- package/es/src/data-chart/src/components/pie.vue2.mjs.map +1 -1
- package/es/src/data-chart/src/components/pie.vue3.mjs +2 -0
- package/es/src/data-chart/src/components/pie.vue3.mjs.map +1 -0
- package/es/src/data-chart/src/components/radar.vue.mjs +1 -1
- package/es/src/data-chart/src/components/radar.vue.mjs.map +1 -1
- package/es/src/data-chart/src/components/radar.vue2.mjs +1 -1
- package/es/src/data-chart/src/components/radar.vue2.mjs.map +1 -1
- package/es/src/data-chart/src/components/radar.vue3.mjs +2 -0
- package/es/src/data-chart/src/components/radar.vue3.mjs.map +1 -0
- package/es/src/data-chart/src/components/scatter-simple.vue.mjs +1 -1
- package/es/src/data-chart/src/components/scatter-simple.vue.mjs.map +1 -1
- package/es/src/data-chart/src/components/scatter-simple.vue2.mjs +1 -1
- package/es/src/data-chart/src/components/scatter-simple.vue2.mjs.map +1 -1
- package/es/src/data-chart/src/components/scatter-simple.vue3.mjs +2 -0
- package/es/src/data-chart/src/components/scatter-simple.vue3.mjs.map +1 -0
- package/es/src/data-chart/src/components/scatter.vue.mjs +1 -1
- package/es/src/data-chart/src/components/scatter.vue.mjs.map +1 -1
- package/es/src/data-chart/src/components/scatter.vue2.mjs +1 -1
- package/es/src/data-chart/src/components/scatter.vue2.mjs.map +1 -1
- package/es/src/data-chart/src/components/scatter.vue3.mjs +2 -0
- package/es/src/data-chart/src/components/scatter.vue3.mjs.map +1 -0
- 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/area.vue2.cjs +1 -1
- package/lib/src/data-chart/src/components/area.vue2.cjs.map +1 -1
- package/lib/src/data-chart/src/components/area.vue3.cjs +1 -1
- package/lib/src/data-chart/src/components/bar.vue.cjs +1 -1
- package/lib/src/data-chart/src/components/bar.vue.cjs.map +1 -1
- package/lib/src/data-chart/src/components/bar.vue2.cjs +1 -1
- package/lib/src/data-chart/src/components/bar.vue2.cjs.map +1 -1
- package/lib/src/data-chart/src/components/bar.vue3.cjs +2 -0
- package/lib/src/data-chart/src/components/bar.vue3.cjs.map +1 -0
- package/lib/src/data-chart/src/components/funnel.vue.cjs +1 -1
- package/lib/src/data-chart/src/components/funnel.vue.cjs.map +1 -1
- package/lib/src/data-chart/src/components/funnel.vue2.cjs +1 -1
- package/lib/src/data-chart/src/components/funnel.vue2.cjs.map +1 -1
- package/lib/src/data-chart/src/components/funnel.vue3.cjs +2 -0
- package/lib/src/data-chart/src/components/funnel.vue3.cjs.map +1 -0
- 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/components/pie.vue.cjs +1 -1
- package/lib/src/data-chart/src/components/pie.vue.cjs.map +1 -1
- package/lib/src/data-chart/src/components/pie.vue2.cjs +1 -1
- package/lib/src/data-chart/src/components/pie.vue2.cjs.map +1 -1
- package/lib/src/data-chart/src/components/pie.vue3.cjs +2 -0
- package/lib/src/data-chart/src/components/pie.vue3.cjs.map +1 -0
- package/lib/src/data-chart/src/components/radar.vue.cjs +1 -1
- package/lib/src/data-chart/src/components/radar.vue.cjs.map +1 -1
- package/lib/src/data-chart/src/components/radar.vue2.cjs +1 -1
- package/lib/src/data-chart/src/components/radar.vue2.cjs.map +1 -1
- package/lib/src/data-chart/src/components/radar.vue3.cjs +2 -0
- package/lib/src/data-chart/src/components/radar.vue3.cjs.map +1 -0
- package/lib/src/data-chart/src/components/scatter-simple.vue.cjs +1 -1
- package/lib/src/data-chart/src/components/scatter-simple.vue.cjs.map +1 -1
- package/lib/src/data-chart/src/components/scatter-simple.vue2.cjs +1 -1
- package/lib/src/data-chart/src/components/scatter-simple.vue2.cjs.map +1 -1
- package/lib/src/data-chart/src/components/scatter-simple.vue3.cjs +2 -0
- package/lib/src/data-chart/src/components/scatter-simple.vue3.cjs.map +1 -0
- package/lib/src/data-chart/src/components/scatter.vue.cjs +1 -1
- package/lib/src/data-chart/src/components/scatter.vue.cjs.map +1 -1
- package/lib/src/data-chart/src/components/scatter.vue2.cjs +1 -1
- package/lib/src/data-chart/src/components/scatter.vue2.cjs.map +1 -1
- package/lib/src/data-chart/src/components/scatter.vue3.cjs +2 -0
- package/lib/src/data-chart/src/components/scatter.vue3.cjs.map +1 -0
- 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/index.d.ts +4 -93
- package/types/src/data-chart/index.d.ts.map +1 -1
- package/types/src/data-chart/src/components/area.vue.d.ts +3 -1
- package/types/src/data-chart/src/components/area.vue.d.ts.map +1 -1
- package/types/src/data-chart/src/components/bar.vue.d.ts +2 -1
- package/types/src/data-chart/src/components/bar.vue.d.ts.map +1 -1
- package/types/src/data-chart/src/components/funnel.vue.d.ts +2 -1
- package/types/src/data-chart/src/components/funnel.vue.d.ts.map +1 -1
- package/types/src/data-chart/src/components/line.vue.d.ts +2 -1
- package/types/src/data-chart/src/components/line.vue.d.ts.map +1 -1
- package/types/src/data-chart/src/components/pie.vue.d.ts +2 -1
- package/types/src/data-chart/src/components/pie.vue.d.ts.map +1 -1
- package/types/src/data-chart/src/components/radar.vue.d.ts +2 -1
- package/types/src/data-chart/src/components/radar.vue.d.ts.map +1 -1
- package/types/src/data-chart/src/components/scatter-simple.vue.d.ts +2 -1
- package/types/src/data-chart/src/components/scatter-simple.vue.d.ts.map +1 -1
- package/types/src/data-chart/src/components/scatter.vue.d.ts +2 -1
- package/types/src/data-chart/src/components/scatter.vue.d.ts.map +1 -1
- package/types/src/data-chart/src/data-chart.vue.d.ts +6 -94
- package/types/src/data-chart/src/data-chart.vue.d.ts.map +1 -1
- package/types/src/data-chart/src/utils/useCharts.d.ts +8 -7
- package/types/src/data-chart/src/utils/useCharts.d.ts.map +1 -1
- package/types/tsconfig.tsbuildinfo +1 -1
@@ -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 { 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} = defineProps<{\n modelName?: string\n showTypeName?: IconRow['showTypeName']\n subShowType?: string\n data?: EChartData\n chartOptions?: EChartsOption\n jsCodeSnippet?: string\n}>()\n\nconst ns = useNamespace('data-chart')\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
|
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 = groupByDesc?.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 const dataValue = xGroupByDesc ? data.filter(item => item && item[xGroupByDesc!.colDesc!]) : 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","map","groupByDescItem","xAxis","dataValue","filter","item","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,EAAS,GAETC,EAA4D,KAChED,EAASF,GAAaI,IAAKC,IAQrBA,EAAgBC,QAClBH,EAAeE,GAEVA,IAGT,MAAME,EAAYJ,EAAeF,EAAKO,OAAOC,GAAQA,GAAQA,EAAKN,EAAcJ,UAAaE,EA0B7F,MAboB,CAClBF,QAASA,GAAW,GACpBW,UAAQd,EAAAc,UACRC,YAAUf,EAAAe,YACVR,aAAcA,GAAgB,CAC5BJ,QAAS,GACTC,YAAa,GACbY,cAAe,GACfN,OAAO,GAETN,YAAaE,EACbD,KAAMM,KAiCV,SAASM,IAEP,GAAqB,UAAjBjB,EAAAkB,aACF,OAAO,KAIT,MAAMC,EAAiBjD,EAAWkD,MAClC,OAAKD,GAKiC,mBAA3BA,EAAeE,QACjBF,EAAeE,UALf,IASX,QAKAC,EAAa,CACXC,WAnDF,WACE,GAA6B,IAAzBvB,OAASK,KAAKmB,OAGhB,YADAC,QAAQC,IAAI,QAGd,MAAMC,EAAMC,EAAmB5B,EAAAK,MAC/BwB,EAAY7B,EAAAc,UAAWa,EACzB,EA4CEvD,qBACAiD,QALcxB,EAAS,IAAMoB,KAM7BA,eAEFa,EAAQC,EA/CR,SAAezD,EAAuB0D,GAEpC,IAAIC,EADaC,EAAY,CAAA,EAAItC,EAAuBwB,MAAO9C,EAAQ0D,IAChD,CAAA,EAEvB,GAAIhC,EAAAmC,cACF,IAEEF,EAAOG,EAAepC,gBAAeiC,EACvC,OACOI,GACLZ,QAAQY,MAAM,UAAWA,EAC3B,CAGF,OAAOJ,CACT,eAoCEK,EASEC,EARK/D,EAAK0C,EAAAA,eAAY,SAClB,aAAJ/C,IAAID,EACHsE,IAAKtB,EAAAA,aACLuB,MAAKC,EAAA,CAAGC,EAAA3E,GAAG4E,EAAC,aACZ,gBAAe7B,EAAAA,YACf,aAAY4B,EAAA1C,GACZ,gBAAe4C,EAAAA,aACf,YAAWC,EAAAA"}
|
@@ -1,2 +1,2 @@
|
|
1
|
-
import*as e from"echarts";import{
|
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";function c(r){let{chartDOM:c,chartData:u,chartOptions:d,initBefore:f,initAfter:h,lazyLoad:p=!0}=r,g=null,v=!1,w=!1,m=null,y=null,D=!1;const b=window.devicePixelRatio||1;function x(){if(g&&!g.isDisposed()){try{g.dispose()}catch(e){console.warn("Error disposing chart:",e)}g=null}}function O(){if(!g||g.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;g=e.init(c.value,null,{devicePixelRatio:b,renderer:"svg"}),w=!0}return g}async function z(){await i();const{clientWidth:e,clientHeight:t}=c.value||{clientWidth:0,clientHeight:0};e>0&&t>0?(O(),h&&h(g),g&&!g.isDisposed()&&l(g,c)):function(){if(!c.value||"undefined"==typeof ResizeObserver)return;m=new ResizeObserver(e=>{for(const t of e){const{width:e,height:i}=t.contentRect;if(e>0&&i>0&&!w&&(!p||D)){O(),h&&h(g),g&&!g.isDisposed()&&l(g,c),m?.disconnect(),m=null;break}}}),m.observe(c.value)}()}async function k(){return w||!c.value?g:(await i(),p?(c.value&&"undefined"!=typeof IntersectionObserver&&(y=new IntersectionObserver(e=>{for(const t of e)if(t.isIntersecting&&!D){D=!0,z(),y?.disconnect(),y=null;break}},{threshold:0,rootMargin:"100px"}),y.observe(c.value)),g):(await z(),g))}function E(){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:u.value?.modelName,...d.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}}}}}]};v=!0,t([o,{notMerge:!0,replaceMerge:["xAxis","yAxis","series"],lazyUpdate:!1}])}})}const{isOutside:M}=o(c);return s(M,e=>{"boolean"==typeof e&&g&&!g.isDisposed()&&function(e){if(g&&!g.isDisposed())try{g.setOption({toolbox:{show:e}})}catch(e){console.warn("Error toggling toolbox:",e)}}(!e)},{debounce:200}),s(()=>d.value,async()=>{g&&!g.isDisposed()&&await async function(){for(var e=arguments.length,t=new Array(e),i=0;i<e;i++)t[i]=arguments[i];try{g&&!g.isDisposed()||await k(),g?.showLoading(),u.value?.data?.length?(!0===v&&(t[1]||(t[1]={}),t[1].notMerge=!0),v=!1):t=await E(),g?.setOption(...t)}catch(e){g&&!g.isDisposed()&&x(),O(),t=await E("配置项错误"),g?.setOption(...t)}finally{g?.hideLoading()}}(d.value)},{debounce:500,deep:!0,immediate:!0}),t(async()=>{f&&await f(),await i(),await k(),g&&!g.isDisposed()&&(h&&h(g),l(g,c))}),n(()=>{if(m&&(m.disconnect(),m=null),y&&(y.disconnect(),y=null),g&&!g.isDisposed())try{g.getZr()?.off("mousemove"),g.getZr()?.off("mouseout"),g.getZr()?.off("click"),g.off("click"),x()}catch(e){console.warn("Error during chart cleanup:",e)}}),{myChart:()=>g}}function l(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 u(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{c as useCharts,u as useDataToExcelJson,l 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 { SetOptionOpts } from 'echarts'\nimport type { Ref } from 'vue'\nimport type { EChartData, EChartsOption, IFormatPublicData } from './types'\nimport * as echarts from 'echarts'\nimport { onMounted, onUnmounted, ref } from 'vue'\n\n// 定义返回类型,避免导出内部类型\nexport interface UseChartsReturn {\n myChart: Ref<any>\n}\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 }: {\n chartDOM: Ref<HTMLElement | null>\n chartData: Ref<IFormatPublicData>\n chartOptions: Ref<EChartsOption>\n initBefore?: () => Promise<void>\n initAfter?: (e: any) => void\n}): UseChartsReturn {\n // 每个组件实例的独立状态 - 使用响应式引用\n const myChart = ref<any>(null)\n let isEmpty = false\n\n // 获取设备像素比\n const dpr = window.devicePixelRatio || 1\n\n function disposeChart() {\n if (myChart.value && !myChart.value.isDisposed()) {\n try {\n myChart.value.dispose()\n }\n catch (error) {\n console.warn('Error disposing chart:', error)\n }\n myChart.value = null\n }\n }\n\n function initChart() {\n if (!(myChart.value && !myChart.value.isDisposed())) {\n // 如果实例已被销毁,重新创建\n myChart.value = echarts.init(chartDOM.value, null, {\n devicePixelRatio: dpr,\n renderer: 'svg',\n })\n }\n return myChart.value\n }\n\n async function renderChart(...opt: [EChartsOption, SetOptionOpts?]) {\n try {\n myChart.value?.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.value?.setOption(...opt)\n }\n catch (error) {\n if (myChart.value && !myChart.value.isDisposed()) {\n disposeChart()\n }\n // 如果实例已被销毁,重新创建\n initChart()\n opt = await setEmpty('配置项错误')\n myChart.value?.setOption(...opt)\n } finally {\n myChart.value?.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.value && !myChart.value.isDisposed()) {\n try {\n myChart.value.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.value || myChart.value.isDisposed())) {\n return\n }\n toggleToolbox(!newVal)\n }, { debounce: 200 })\n\n watchDebounced(\n () => chartOptions.value,\n async () => {\n // 修改条件判断\n if (myChart.value && !myChart.value.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 initChart()\n if (initAfter) {\n initAfter(myChart.value)\n }\n // 修改条件判断\n if (myChart.value && !myChart.value.isDisposed()) {\n useResize(myChart.value, chartDOM)\n }\n })\n\n onUnmounted(() => {\n if (myChart.value && !myChart.value.isDisposed()) {\n try {\n // 清理所有事件监听器\n myChart.value.getZr()?.off('mousemove')\n myChart.value.getZr()?.off('mouseout')\n myChart.value.getZr()?.off('click')\n myChart.value.off('click')\n disposeChart()\n }\n catch (error) {\n console.warn('Error during chart cleanup:', error)\n }\n }\n })\n\n return {\n myChart,\n }\n}\n\nexport function useResize(myChart: any, 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","chartDOM","chartData","chartOptions","initBefore","initAfter","_ref","myChart","ref","isEmpty","dpr","window","devicePixelRatio","disposeChart","value","isDisposed","dispose","error","console","warn","initChart","echarts","init","renderer","setEmpty","subtext","Promise","resolve","img","Image","src","emptyImg","onload","aspectRatio","width","height","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","async","_len","arguments","length","opt","Array","_key","showLoading","data","hideLoading","renderChart","deep","immediate","onMounted","useResize","onUnmounted","getZr","off","useElementSize","resize","useDataToExcelJson","dataSource","desc","colDesc","groupByDesc","header","map","item","filter","v","json","headerItem"],"mappings":"wNAeO,SAASA,KAMI,IANMC,SAAEA,EAAAC,UAAUA,eAAWC,EAAAC,WAAcA,EAAAC,UAAYA,GAAUC,EAQnF,MAAMC,EAAUC,EAAS,MACzB,IAAIC,GAAU,EAGd,MAAMC,EAAMC,OAAOC,kBAAoB,EAEvC,SAASC,IACP,GAAIN,EAAQO,QAAUP,EAAQO,MAAMC,aAAc,CAChD,IACER,EAAQO,MAAME,SAChB,OACOC,GACLC,QAAQC,KAAK,yBAA0BF,EACzC,CACAV,EAAQO,MAAQ,IAClB,CACF,CAEA,SAASM,IAQP,OAPMb,EAAQO,QAAUP,EAAQO,MAAMC,eAEpCR,EAAQO,MAAQO,EAAQC,KAAKrB,EAASa,MAAO,KAAM,CACjDF,iBAAkBF,EAClBa,SAAU,SAGPhB,EAAQO,KACjB,CAiCA,SAASU,IAAoE,IAA3DC,yDAAU,OAC1B,OAAO,IAAIC,QAASC,IAClB,MAAMC,EAAM,IAAIC,MAChBD,EAAIE,IAAMC,EAEVH,EAAII,OAAS,KACX,MAAMC,EAAcL,EAAIM,MAAQN,EAAIO,OAE9BC,EAAqB,CACzBC,MAAO,CAAC,CACNC,KAAMpC,EAAUY,OAAOyB,aACpBpC,EAAaW,MAAMuB,OACrB,CACDZ,UACAe,IAAK,SACLC,KAAM,SACNH,KAAM,OACNI,SAAS,GACTC,aAAc,CACZC,SAAU,IAEZC,UAAW,CACTC,MAAO,SACPC,KAAM,CACJC,EAAG,CACDb,OAAQ,IAAMF,EACdC,MAAO,IACPe,gBAAiB,CACfC,MAAOnB,SAOnBtB,GAAU,EACVkB,EAAQ,CAACS,EAAK,CACZe,UAAU,EACVC,aAAc,CAAC,QAAS,QAAS,UACjCC,YAAY,OAIpB,CAkBA,MAAQC,UAAWC,GAAiBC,EAAkBvD,GAkDtD,OAjDAwD,EAAeF,EAAeG,IAEN,kBAAXA,GAA0BnD,EAAQO,QAASP,EAAQO,MAAMC,cAnBtE,SAAuB4C,GAErB,GAAIpD,EAAQO,QAAUP,EAAQO,MAAMC,aAClC,IACER,EAAQO,MAAM8C,UAAU,CACtBC,QAAS,CACPF,SAGN,OACO1C,GACLC,QAAQC,KAAK,0BAA2BF,EAC1C,CAEJ,CAQE6C,EAAeJ,IACd,CAAEK,SAAU,MAEfN,EACE,IAAMtD,EAAaW,MACnBkD,UAEMzD,EAAQO,QAAUP,EAAQO,MAAMC,oBAzGxCiD,iBAAoE,IAAA,IAAAC,EAAAC,UAAAC,OAAtCC,EAAA,IAAAC,MAAAJ,GAAAK,EAAA,EAAAA,EAAAL,EAAAK,IAAAF,EAAAE,GAAAJ,UAAAI,GAC5B,IACE/D,EAAQO,OAAOyD,cACXrE,EAAUY,OAAO0D,MAAML,SACT,IAAZ1D,IACG2D,EAAI,KACPA,EAAI,GAAK,CAAA,GAEXA,EAAI,GAAGjB,UAAW,GAEpB1C,GAAU,GAIV2D,QAAY5C,IAEdjB,EAAQO,OAAO8C,aAAaQ,EAC9B,OACOnD,GACDV,EAAQO,QAAUP,EAAQO,MAAMC,cAClCF,IAGFO,IACAgD,QAAY5C,EAAS,SACrBjB,EAAQO,OAAO8C,aAAaQ,EAC9B,CAAA,QACE7D,EAAQO,OAAO2D,aACjB,CACF,CA6EYC,CAAYvE,EAAaW,QAGnC,CAAEiD,SAAU,IAAKY,MAAM,EAAMC,WAAW,IAG1CC,EAAUb,UACJ5D,SACIA,IAERgB,IACIf,GACFA,EAAUE,EAAQO,OAGhBP,EAAQO,QAAUP,EAAQO,MAAMC,cAClC+D,EAAUvE,EAAQO,MAAOb,KAI7B8E,EAAY,KACV,GAAIxE,EAAQO,QAAUP,EAAQO,MAAMC,aAClC,IAEER,EAAQO,MAAMkE,SAASC,IAAI,aAC3B1E,EAAQO,MAAMkE,SAASC,IAAI,YAC3B1E,EAAQO,MAAMkE,SAASC,IAAI,SAC3B1E,EAAQO,MAAMmE,IAAI,SAClBpE,GACF,OACOI,GACLC,QAAQC,KAAK,8BAA+BF,EAC9C,IAIG,CACLV,UAEJ,CAEO,SAASuE,EAAUvE,EAAcN,GACtC,MAAMiC,MAAEA,EAAAC,OAAOA,GAAW+C,EAAejF,GACzCwD,EAAe,CAACvB,EAAOC,GAAS,KAC9B,GAAI5B,IAAYA,EAAQQ,aACtB,IACER,EAAQ4E,QACV,OACOlE,GACLC,QAAQC,KAAK,6BAA8BF,EAC7C,GAGN,CAEO,SAASmE,EAAmBC,GACjC,MAAQC,MAAMC,QAAEA,EAAU,GAACC,YAAGA,EAAc,IAAO,CAAA,EAAChB,KAAGA,EAAO,IAAOa,EAC/DI,EAAS,IAAID,EAAYE,IAAIC,GAAQA,EAAKJ,YAAaA,GAASK,UAAYC,GAC5EC,EAAOtB,EAAKkB,IAAKC,GACdF,EAAOC,IAAKK,GACVJ,EAAKI,IAAoC,KAGpD,MAAO,CAACN,KAAWK,EACrB"}
|
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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"}
|
package/lib/package.json.cjs
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
"use strict";exports.version="0.0.
|
1
|
+
"use strict";exports.version="0.0.64";
|
2
2
|
//# sourceMappingURL=package.json.cjs.map
|
@@ -1,2 +1,2 @@
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("vue"),
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("vue"),a=require("echarts"),t=require("../utils/config.cjs"),r=require("../utils/injectionKeys.cjs"),o=require("../utils/useCharts.cjs");function n(e){var a=Object.create(null);return e&&Object.keys(e).forEach(function(t){if("default"!==t){var r=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(a,t,r.get?r:{enumerable:!0,get:function(){return e[t]}})}}),a.default=e,Object.freeze(a)}var c=n(a);const s={class:"data-chart-area-wrap"};var i=e.defineComponent({name:"DataChartArea",__name:"area",props:{chartOptions:{type:null,required:!0},chartData:{type:Object,required:!1,default:()=>({colDesc:[],xGroupByDesc:{colDesc:"",groupByDesc:"",groupByValues:[],xAxis:!1},groupByDesc:[],data:[],modelName:""})},lazyLoad:{type:Boolean,required:!1,default:!0}},setup(a,{expose:n}){const i=e.inject(r.InjectionChartMerge,e=>e,!0);let l="中国";const u=e.ref({features:[],type:"FeatureCollection"}),m=e.ref(null),d=e.computed(()=>{try{const{xGroupByDesc:e,groupByDesc:t,colDesc:r,modelName:o,data:n}=a.chartData,c=[];r.forEach(e=>{n.forEach(a=>{c.push(Number(a[e]))})});const s={title:{text:o},tooltip:{formatter(e){let a=`${e.name}<br/>`;return s.series?.forEach(t=>{t.data?.forEach(r=>{r.name===e.name&&(a+=`${t.name}:${r.value}</br>`)}),a.includes(t.name)||(a+=`${t.name}:-</br>`)}),a}},visualMap:{min:Math.min(...c,0),max:Math.max(...c,0),text:["高","低"],realtime:!1,calculable:!0,inRange:{color:["#E8F4FD","#B8D4F7","#7BA4F0","#4A7BE8","#3562e1"]}},series:r?.map(a=>{const r=[],o=t.find(e=>e.colDesc===("中国"===l?"医院所在省":"医院所在市")),c={};n.map(t=>{const r=t[("中国"===l?e?.colDesc||"":o?.colDesc)||""],n=u.value.features?.find(({properties:{name:e}})=>e?.includes(r));return{name:n?.properties?.name||"",value:Number(t[a])}}).forEach(e=>{c[e.name]?c[e.name]=c[e.name]+e.value:c[e.name]=e.value});for(const e in c)r.push({name:e,value:c[e]});return{name:a,type:"map",map:l,data:r}})};return i(s,a.chartOptions)}catch(e){return console.error("Error computing area chart options:",e),{title:{text:"地图加载失败"},series:[]}}});async function p(e="中国"){try{const a=await t.getGeoJsonData({adcode:e});return a&&a.features&&0!==a.features.length?(u.value=a,l=e,void c.registerMap(e,a)):void console.error("Invalid GeoJSON data for:",e)}catch(a){if(console.error("Failed to register map for:",e,a),"中国"!==e)return console.log("Falling back to China map"),p("中国")}}const{myChart:h}=o.useCharts({chartDOM:m,chartOptions:d,chartData:e.computed(()=>a.chartData),initAfter:async function(e){try{await p(),e&&!e.isDisposed()&&(e.getZr()?.on("click",a=>{e?.showLoading(),a.target||"中国"===l||p("中国"),e.hideLoading()}),e.on("click",t=>{e?.showLoading();const r=a.chartData.groupByDesc?.some(e=>"医院所在市"===e.colDesc);"中国"===l&&r&&t.name&&p(t.name).then(()=>{e&&!e.isDisposed()&&e.setOption(d.value)}),e?.hideLoading()}))}catch(a){if(console.error("Failed to initialize map:",a),e&&!e.isDisposed())try{await p("中国")}catch(e){console.error("Failed to retry map registration:",e)}}},lazyLoad:a.lazyLoad});return n({myChart:h}),(a,t)=>(e.openBlock(),e.createElementBlock("div",s,[e.createCommentVNode(' <el-select\n v-if="isShowSelect"\n v-model="adcode"\n class="city-select"\n size="small"\n @change="selectChina"\n >\n <el-option\n v-for="item in selectList"\n :key="item.value"\n :label="item.label"\n :value="item.value"\n />\n </el-select> '),e.createElementVNode("div",{ref_key:"dataChartArea",ref:m,class:"data-chart-area"},null,512)]))}});exports.default=i;
|
2
2
|
//# sourceMappingURL=area.vue2.cjs.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"area.vue2.cjs","sources":["../../../../../../../packages/components/src/data-chart/src/components/area.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { ECharts } from 'echarts/types/dist/echarts'\nimport type { EChartsOption, GeoJson, IFormatPublicData } from '../utils/types'\nimport * as echarts from 'echarts'\nimport { getGeoJsonData } from '../utils/config'\nimport { InjectionChartMerge } from '../utils/injectionKeys'\nimport { useCharts } from '../utils/useCharts'\n\ndefineOptions({\n name: 'DataChartArea',\n})\n\nconst {\n chartOptions,\n chartData = {\n colDesc: [],\n xGroupByDesc: {\n colDesc: '',\n groupByDesc: '',\n groupByValues: [],\n xAxis: false,\n },\n groupByDesc: [],\n data: [],\n modelName: '',\n },\n} = defineProps<{\n chartOptions: EChartsOption\n chartData?: IFormatPublicData\n}>()\n\nconst merge = inject(InjectionChartMerge, (v: any) => v, true)\n\nlet adcode = '中国'\nconst currentGeoJson = ref<GeoJson>({\n features: [],\n type: 'FeatureCollection',\n})\nconst myChart = ref<ECharts | null>(null)\nconst dataChartArea = ref(null)\n\nconst areaChartOptions = computed<EChartsOption>(() => {\n try {\n const { xGroupByDesc, groupByDesc, colDesc, modelName, data } = chartData\n const allNums: number[] = []\n colDesc.forEach((item) => {\n data.forEach((dataItem) => {\n allNums.push(Number(dataItem[item]))\n })\n })\n const config = {\n title: {\n text: modelName,\n },\n tooltip: {\n formatter(params: { name: string }) {\n let res = `${params.name}<br/>`\n config.series?.forEach((colDescItem) => {\n colDescItem.data?.forEach((item) => {\n if (item.name === params.name) {\n res += `${colDescItem.name}:${item.value}</br>`\n }\n })\n if (!res.includes(colDescItem.name)) {\n res += `${colDescItem.name}:-</br>`\n }\n })\n return res\n },\n },\n visualMap: {\n min: Math.min(...allNums, 0),\n max: Math.max(...allNums, 0),\n text: ['高', '低'],\n realtime: false,\n calculable: true,\n inRange: {\n color: ['#E8F4FD', '#B8D4F7', '#7BA4F0', '#4A7BE8', '#3562e1']\n },\n },\n series: colDesc?.map((colDescItem) => {\n const seriesData = []\n const row = groupByDesc.find(item => item.colDesc === (adcode === '中国' ? '医院所在省' : '医院所在市'))\n // 先用省份数据,如果没有再用市级数据\n const arr: {\n [key: string]: number\n } = {}\n data.map((item) => {\n const sourceName = item[(adcode === '中国' ? (xGroupByDesc?.colDesc || '') : row?.colDesc) || '']\n const find = currentGeoJson.value.features?.find(({ properties: { name } }: { properties: { name?: string } }) => name?.includes(sourceName as string))\n return {\n name: find?.properties?.name || '',\n value: Number(item[colDescItem]),\n }\n }).forEach((item) => {\n if (!arr[item.name]) {\n arr[item.name] = item.value\n }\n else {\n arr[item.name] = arr[item.name] + item.value\n }\n })\n for (const key in arr) {\n seriesData.push({\n name: key,\n value: arr[key],\n })\n }\n return {\n name: colDescItem,\n type: 'map',\n map: adcode,\n data: seriesData,\n }\n }),\n }\n\n return merge(config, chartOptions)\n }\n catch (error) {\n console.error('Error computing area chart options:', error)\n return {\n title: { text: '地图加载失败' },\n series: [],\n }\n }\n})\n\nasync function initAfter(mc: ECharts | null) {\n myChart.value = mc\n try {\n await registerMap()\n // 添加判断,确保图表实例存在且未被销毁\n if (mc && !mc.isDisposed()) {\n // charts 监听事件\n mc.getZr()?.on('click', (params: { target: HTMLElement }) => {\n mc?.showLoading()\n if (!params.target && adcode !== '中国') {\n registerMap('中国')\n }\n mc.hideLoading()\n })\n mc.on('click', (params: { name: string }) => {\n mc?.showLoading()\n const flag = chartData.groupByDesc?.some(item => item.colDesc === '医院所在市')\n if (adcode === '中国' && flag && params.name) {\n registerMap(params.name).then(() => {\n if (mc && !mc.isDisposed()) {\n mc.setOption(areaChartOptions.value)\n }\n })\n }\n mc?.hideLoading()\n })\n }\n }\n catch (error) {\n console.error('Failed to initialize map:', error)\n // 如果初始化失败,尝试重新注册地图\n if (mc && !mc.isDisposed()) {\n try {\n await registerMap('中国')\n }\n catch (retryError) {\n console.error('Failed to retry map registration:', retryError)\n }\n }\n }\n}\n\n// function selectChina() {\n// registerMap(adcode)\n// }\nasync function registerMap(keyword = '中国') {\n try {\n const geoJson = await getGeoJsonData({ adcode: keyword })\n if (!geoJson || !geoJson.features || geoJson.features.length === 0) {\n console.error('Invalid GeoJSON data for:', keyword)\n return\n }\n currentGeoJson.value = geoJson\n adcode = keyword\n\n echarts.registerMap(keyword, geoJson as any)\n return\n }\n catch (error) {\n console.error('Failed to register map for:', keyword, error)\n // 如果注册失败,尝试使用默认的中国地图数据\n if (keyword !== '中国') {\n console.log('Falling back to China map')\n return registerMap('中国')\n }\n }\n}\nconst { myChart: areaMyChart } = useCharts({\n chartDOM: dataChartArea,\n chartOptions: areaChartOptions,\n chartData: computed(() => chartData),\n initAfter\n})\n\n// 暴露图表实例\ndefineExpose({\n myChart: areaMyChart\n})\n</script>\n\n<template>\n <div class=\"data-chart-area-wrap\">\n <!-- <el-select\n v-if=\"isShowSelect\"\n v-model=\"adcode\"\n class=\"city-select\"\n size=\"small\"\n @change=\"selectChina\"\n >\n <el-option\n v-for=\"item in selectList\"\n :key=\"item.value\"\n :label=\"item.label\"\n :value=\"item.value\"\n />\n </el-select> -->\n <div\n ref=\"dataChartArea\"\n class=\"data-chart-area\"\n />\n </div>\n</template>\n\n<style scoped lang=\"scss\">\n.data-chart-area-wrap {\n position: relative;\n\n .city-select {\n position: absolute;\n top: 10px;\n right: 100px;\n z-index: 1;\n width: 120px;\n }\n\n .data-chart-area {\n height: 100%;\n }\n}\n</style>\n"],"names":["merge","inject","InjectionChartMerge","v","adcode","currentGeoJson","ref","features","type","myChart","dataChartArea","areaChartOptions","computed","xGroupByDesc","groupByDesc","colDesc","modelName","data","__props","chartData","allNums","forEach","item","dataItem","push","Number","config","title","text","tooltip","formatter","params","res","name","series","colDescItem","value","includes","visualMap","min","Math","max","realtime","calculable","inRange","color","map","seriesData","row","find","arr","sourceName","properties","key","chartOptions","error","console","async","registerMap","keyword","geoJson","getGeoJsonData","length","echarts","log","areaMyChart","useCharts","chartDOM","initAfter","mc","isDisposed","getZr","on","showLoading","target","hideLoading","flag","some","then","setOption","retryError","__expose","_openBlock","_createElementBlock","_hoisted_1","_createCommentVNode","_createElementVNode","class"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"area.vue2.cjs","sources":["../../../../../../../packages/components/src/data-chart/src/components/area.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { ECharts } from 'echarts/types/dist/echarts'\nimport type { EChartsOption, GeoJson, IFormatPublicData } from '../utils/types'\nimport * as echarts from 'echarts'\nimport { getGeoJsonData } from '../utils/config'\nimport { InjectionChartMerge } from '../utils/injectionKeys'\nimport { useCharts } from '../utils/useCharts'\n\ndefineOptions({\n name: 'DataChartArea',\n})\n\nconst {\n chartOptions,\n chartData = {\n colDesc: [],\n xGroupByDesc: {\n colDesc: '',\n groupByDesc: '',\n groupByValues: [],\n xAxis: false,\n },\n groupByDesc: [],\n data: [],\n modelName: '',\n },\n lazyLoad = true,\n} = defineProps<{\n chartOptions: EChartsOption\n chartData?: IFormatPublicData\n lazyLoad?: boolean\n}>()\n\nconst merge = inject(InjectionChartMerge, (v: any) => v, true)\n\nlet adcode = '中国'\nconst currentGeoJson = ref<GeoJson>({\n features: [],\n type: 'FeatureCollection',\n})\nconst dataChartArea = ref(null)\n\nconst areaChartOptions = computed<EChartsOption>(() => {\n try {\n const { xGroupByDesc, groupByDesc, colDesc, modelName, data } = chartData\n const allNums: number[] = []\n colDesc.forEach((item) => {\n data.forEach((dataItem) => {\n allNums.push(Number(dataItem[item]))\n })\n })\n const config = {\n title: {\n text: modelName,\n },\n tooltip: {\n formatter(params: { name: string }) {\n let res = `${params.name}<br/>`\n config.series?.forEach((colDescItem) => {\n colDescItem.data?.forEach((item) => {\n if (item.name === params.name) {\n res += `${colDescItem.name}:${item.value}</br>`\n }\n })\n if (!res.includes(colDescItem.name)) {\n res += `${colDescItem.name}:-</br>`\n }\n })\n return res\n },\n },\n visualMap: {\n min: Math.min(...allNums, 0),\n max: Math.max(...allNums, 0),\n text: ['高', '低'],\n realtime: false,\n calculable: true,\n inRange: {\n color: ['#E8F4FD', '#B8D4F7', '#7BA4F0', '#4A7BE8', '#3562e1']\n },\n },\n series: colDesc?.map((colDescItem) => {\n const seriesData = []\n const row = groupByDesc.find(item => item.colDesc === (adcode === '中国' ? '医院所在省' : '医院所在市'))\n // 先用省份数据,如果没有再用市级数据\n const arr: {\n [key: string]: number\n } = {}\n data.map((item) => {\n const sourceName = item[(adcode === '中国' ? (xGroupByDesc?.colDesc || '') : row?.colDesc) || '']\n const find = currentGeoJson.value.features?.find(({ properties: { name } }: { properties: { name?: string } }) => name?.includes(sourceName as string))\n return {\n name: find?.properties?.name || '',\n value: Number(item[colDescItem]),\n }\n }).forEach((item) => {\n if (!arr[item.name]) {\n arr[item.name] = item.value\n }\n else {\n arr[item.name] = arr[item.name] + item.value\n }\n })\n for (const key in arr) {\n seriesData.push({\n name: key,\n value: arr[key],\n })\n }\n return {\n name: colDescItem,\n type: 'map',\n map: adcode,\n data: seriesData,\n }\n }),\n }\n\n return merge(config, chartOptions)\n }\n catch (error) {\n console.error('Error computing area chart options:', error)\n return {\n title: { text: '地图加载失败' },\n series: [],\n }\n }\n})\n\nasync function initAfter(mc: ECharts | null) {\n try {\n await registerMap()\n // 添加判断,确保图表实例存在且未被销毁\n if (mc && !mc.isDisposed()) {\n // charts 监听事件\n mc.getZr()?.on('click', (params: { target: HTMLElement }) => {\n mc?.showLoading()\n if (!params.target && adcode !== '中国') {\n registerMap('中国')\n }\n mc.hideLoading()\n })\n mc.on('click', (params: { name: string }) => {\n mc?.showLoading()\n const flag = chartData.groupByDesc?.some(item => item.colDesc === '医院所在市')\n if (adcode === '中国' && flag && params.name) {\n registerMap(params.name).then(() => {\n if (mc && !mc.isDisposed()) {\n mc.setOption(areaChartOptions.value)\n }\n })\n }\n mc?.hideLoading()\n })\n }\n }\n catch (error) {\n console.error('Failed to initialize map:', error)\n // 如果初始化失败,尝试重新注册地图\n if (mc && !mc.isDisposed()) {\n try {\n await registerMap('中国')\n }\n catch (retryError) {\n console.error('Failed to retry map registration:', retryError)\n }\n }\n }\n}\n\n// function selectChina() {\n// registerMap(adcode)\n// }\nasync function registerMap(keyword = '中国') {\n try {\n const geoJson = await getGeoJsonData({ adcode: keyword })\n if (!geoJson || !geoJson.features || geoJson.features.length === 0) {\n console.error('Invalid GeoJSON data for:', keyword)\n return\n }\n currentGeoJson.value = geoJson\n adcode = keyword\n\n echarts.registerMap(keyword, geoJson as any)\n return\n }\n catch (error) {\n console.error('Failed to register map for:', keyword, error)\n // 如果注册失败,尝试使用默认的中国地图数据\n if (keyword !== '中国') {\n console.log('Falling back to China map')\n return registerMap('中国')\n }\n }\n}\n\nconst { myChart } = useCharts({\n chartDOM: dataChartArea,\n chartOptions: areaChartOptions,\n chartData: computed(() => chartData),\n initAfter,\n lazyLoad\n})\n\n// 暴露 myChart 方法供父组件访问\ndefineExpose({\n myChart,\n})\n</script>\n\n<template>\n <div class=\"data-chart-area-wrap\">\n <!-- <el-select\n v-if=\"isShowSelect\"\n v-model=\"adcode\"\n class=\"city-select\"\n size=\"small\"\n @change=\"selectChina\"\n >\n <el-option\n v-for=\"item in selectList\"\n :key=\"item.value\"\n :label=\"item.label\"\n :value=\"item.value\"\n />\n </el-select> -->\n <div\n ref=\"dataChartArea\"\n class=\"data-chart-area\"\n />\n </div>\n</template>\n\n<style scoped lang=\"scss\">\n.data-chart-area-wrap {\n position: relative;\n\n .city-select {\n position: absolute;\n top: 10px;\n right: 100px;\n z-index: 1;\n width: 120px;\n }\n\n .data-chart-area {\n width: 100%;\n height: 100%;\n min-height: 300px;\n }\n}\n</style>\n"],"names":["merge","inject","InjectionChartMerge","v","adcode","currentGeoJson","ref","features","type","dataChartArea","areaChartOptions","computed","xGroupByDesc","groupByDesc","colDesc","modelName","data","__props","chartData","allNums","forEach","item","dataItem","push","Number","config","title","text","tooltip","formatter","params","res","name","series","colDescItem","value","includes","visualMap","min","Math","max","realtime","calculable","inRange","color","map","seriesData","row","find","arr","sourceName","properties","key","chartOptions","error","console","async","registerMap","keyword","geoJson","getGeoJsonData","length","echarts","log","myChart","useCharts","chartDOM","initAfter","mc","isDisposed","getZr","on","showLoading","target","hideLoading","flag","some","then","setOption","retryError","lazyLoad","__expose","_openBlock","_createElementBlock","_hoisted_1","_createCommentVNode","_createElementVNode","class"],"mappings":"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"}
|
@@ -1,2 +1,2 @@
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e="/* unplugin-vue-components disabled */\n.data-chart-area-wrap[data-v-51660d7b] {\n position: relative;\n}\n.data-chart-area-wrap .city-select[data-v-51660d7b] {\n position: absolute;\n top: 10px;\n right: 100px;\n z-index: 1;\n width: 120px;\n}\n.data-chart-area-wrap .data-chart-area[data-v-51660d7b] {\n height: 100%;\n}";require("../../../../node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.cjs").default(e),exports.default=e;
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e="/* unplugin-vue-components disabled */\n.data-chart-area-wrap[data-v-51660d7b] {\n position: relative;\n}\n.data-chart-area-wrap .city-select[data-v-51660d7b] {\n position: absolute;\n top: 10px;\n right: 100px;\n z-index: 1;\n width: 120px;\n}\n.data-chart-area-wrap .data-chart-area[data-v-51660d7b] {\n width: 100%;\n height: 100%;\n min-height: 300px;\n}";require("../../../../node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.cjs").default(e),exports.default=e;
|
2
2
|
//# sourceMappingURL=area.vue3.cjs.map
|
@@ -1,2 +1,2 @@
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("./bar.vue2.cjs");require("./bar.vue3.cjs");var r=require("../../../../_virtual/_plugin-vue_export-helper.cjs").default(e.default,[["__scopeId","data-v-c325b6e7"]]);exports.default=r;
|
2
2
|
//# sourceMappingURL=bar.vue.cjs.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"bar.vue.cjs","sources":[
|
1
|
+
{"version":3,"file":"bar.vue.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
@@ -1,2 +1,2 @@
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("vue"),a=require("lodash-es"),t=require("../utils/injectionKeys.cjs"),r=require("../utils/useCharts.cjs"),s=e.defineComponent({name:"DataChartBar",__name:"bar",props:{chartData:{type:Object,required:!0},subShowType:{type:String,required:!0,default:"bar-simple"},chartOptions:{type:null,required:!0},lazyLoad:{type:Boolean,required:!1,default:!0}},setup(s,{expose:l}){const c=e.inject(t.InjectionChartMerge,e=>e,!0),o=e.ref(null),i=e.computed(()=>{const{colDesc:e,xGroupByDesc:t,groupByDesc:r,data:l=[],modelName:o}=s.chartData,i=Array.from(new Set(l.map(e=>e[t.colDesc||""]))).filter(e=>null!=e)||[],n={...r.find(e=>!e.xAxis)||{groupByDesc:null,groupByValues:[],colDesc:"",xAxis:!1},groupByValues:a.uniq(l.map(e=>r.find(e=>!e.xAxis)?.colDesc?String(e[r.find(e=>!e.xAxis)?.colDesc||""]):""))},u=t?{...t,groupByValues:a.uniq(l.map(e=>t.colDesc?String(e[t.colDesc]):""))}:t,p={title:{text:o},xAxis:{name:"",type:"category",axisLabel:{interval:0,formatter:e=>e.length>5?`${e.substring(0,5)}...`:e},data:i},yAxis:{type:"value"},legend:{data:[]},dataZoom:[{type:"inside",disabled:i.length<15}]};if(1===r.length)p.series=e.map(e=>({name:e,data:l.map(a=>a[e]),type:"bar",emphasis:{focus:"series"},label:{show:!0,position:"inside"}})),p.legend.data=e;else if(2===r.length){const a=e.map(e=>n.groupByValues?.map(a=>{const t={name:`${a||"/"}-${e}`,type:"bar",stack:e,emphasis:{focus:"series"},data:[],label:{show:!0,position:"inside"}};return t.data=(u?.groupByValues||[]).map(e=>{let r=null;return l.forEach(s=>{n.colDesc&&s[n.colDesc]===a&&u?.colDesc&&s[u.colDesc]===e&&t.stack&&(r=s[t.stack]??null)}),r||""}).filter(e=>""!==e),t})||[]).flat();p.series=a,delete p.legend}function d(e,a,t,r){Array.isArray(e)?e.forEach(e=>{e&&(e.type=a,"category"===a&&(e.data=t||[],e.name=r||""))}):e&&(e.type=a,"category"===a&&(e.data=t||[],e.name=r||""))}switch(s.subShowType){case"bar-simple":case"default":d(p.xAxis,"category",i,t?.colDesc||""),d(p.yAxis,"value");break;case"bar-y-category":d(p.xAxis,"value"),d(p.yAxis,"category",i,t?.colDesc||"")}return c(p,s.chartOptions)}),{myChart:n}=r.useCharts({chartDOM:o,chartOptions:i,chartData:e.computed(()=>s.chartData),lazyLoad:s.lazyLoad});return l({myChart:n}),(a,t)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"dataChartBar",ref:o,class:"data-chart-bar"},null,512))}});exports.default=s;
|
2
2
|
//# sourceMappingURL=bar.vue2.cjs.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"bar.vue2.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
1
|
+
{"version":3,"file":"bar.vue2.cjs","sources":["../../../../../../../packages/components/src/data-chart/src/components/bar.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { LegendComponentOption, XAXisComponentOption, YAXisComponentOption } from 'echarts'\nimport type {\n EChartsOption,\n IFormatPublicData,\n SeriesOption,\n} from '../utils/types'\nimport { uniq } from 'lodash-es'\nimport { InjectionChartMerge } from '../utils/injectionKeys'\nimport { useCharts } from '../utils/useCharts'\n\n// 定义组件名称\ndefineOptions({\n name: 'DataChartBar',\n})\n\n// 定义组件属性\nconst {\n chartOptions,\n chartData,\n subShowType = 'bar-simple',\n lazyLoad = true,\n} = defineProps<{\n chartData: IFormatPublicData\n subShowType: string\n chartOptions: EChartsOption\n lazyLoad?: boolean\n}>()\n\n// 注入合并函数,并明确类型\nconst merge = inject(InjectionChartMerge, (v: any) => v, true) as (config: EChartsOption, chartOptions: EChartsOption) => EChartsOption\nconst dataChartBar = ref<HTMLElement | null>(null)\n\n// 计算图表选项\nconst barChartOptions = computed<EChartsOption>(() => {\n const { colDesc, xGroupByDesc, groupByDesc, data = [], modelName } = chartData\n\n const axisData = Array.from(new Set(data.map(item => item[xGroupByDesc.colDesc || '']))).filter(item => item !== undefined && item !== null) || []\n\n // 创建新的对象而不是修改原对象\n const yGroupByDesc = {\n ...groupByDesc.find(item => !item.xAxis) || {\n groupByDesc: null,\n groupByValues: [],\n colDesc: '',\n xAxis: false,\n },\n groupByValues: uniq(data.map(item => groupByDesc.find(item => !item.xAxis)?.colDesc ? String(item[groupByDesc.find(item => !item.xAxis)?.colDesc || '']) : '')),\n }\n\n // 创建新的 xGroupByDesc 对象\n const newXGroupByDesc = xGroupByDesc\n ? {\n ...xGroupByDesc,\n groupByValues: uniq(data.map(item => xGroupByDesc.colDesc ? String(item[xGroupByDesc.colDesc]) : '')),\n }\n : xGroupByDesc\n\n const config: EChartsOption = {\n title: {\n text: modelName,\n },\n xAxis: {\n name: '',\n type: 'category',\n axisLabel: {\n interval: 0, // 强制显示所有标签\n formatter(value: string) {\n const screenshotLength = 5\n return value.length > screenshotLength ? `${value.substring(0, screenshotLength)}...` : value // 截取前5个字符并添加省略号\n },\n },\n data: axisData,\n },\n yAxis: {\n type: 'value',\n },\n legend: {\n data: [],\n },\n dataZoom: [{\n type: 'inside',\n disabled: axisData.length < 15,\n }],\n }\n\n // 堆叠图\n if (groupByDesc.length === 1) {\n config.series = colDesc.map((yItem) => {\n return {\n name: yItem,\n data: data.map(item => item[yItem]),\n type: 'bar',\n emphasis: {\n focus: 'series',\n },\n label: {\n show: true,\n position: 'inside',\n },\n }\n });\n (config.legend as LegendComponentOption).data = colDesc\n }\n else if (groupByDesc.length === 2) {\n const arr = colDesc.map((colDescItem) => {\n return yGroupByDesc.groupByValues?.map((yGroupByDescItem) => {\n const obj: SeriesOption = {\n name: `${yGroupByDescItem || '/'}-${colDescItem}`,\n type: 'bar',\n stack: colDescItem,\n emphasis: {\n focus: 'series',\n },\n data: [],\n label: {\n show: true,\n position: 'inside',\n },\n }\n obj.data = (newXGroupByDesc?.groupByValues || []).map((xGroupByDescItem) => {\n let targetVal: number | string | null = null\n data.forEach((item) => {\n if (yGroupByDesc.colDesc && item[yGroupByDesc.colDesc] === yGroupByDescItem && newXGroupByDesc?.colDesc && item[newXGroupByDesc.colDesc] === xGroupByDescItem) {\n if (obj.stack) {\n targetVal = item[obj.stack] ?? null\n }\n }\n })\n return targetVal || ''\n }).filter(v => v !== '')\n return obj\n }) || []\n }).flat()\n\n config.series = arr\n delete config.legend\n }\n\n // 1. 定义轴类型\n type CategoryAxisOption = XAXisComponentOption & {\n type: 'category'\n data: (string | number)[]\n }\n\n // 2. 创建配置轴的辅助函数\n function configureAxis(\n axis: XAXisComponentOption | XAXisComponentOption[] | YAXisComponentOption | YAXisComponentOption[] | undefined,\n type: 'category' | 'value',\n data?: (string | number)[],\n name?: string,\n ) {\n if (Array.isArray(axis)) {\n axis.forEach((item) => {\n if (item) {\n item.type = type\n if (type === 'category') {\n (item as CategoryAxisOption).data = data || []\n item.name = name || ''\n }\n }\n })\n }\n else if (axis) {\n axis.type = type\n if (type === 'category') {\n (axis as CategoryAxisOption).data = data || []\n axis.name = name || ''\n }\n }\n }\n\n // 3. 使用配置函数\n switch (subShowType) {\n case 'bar-simple':\n case 'default':\n configureAxis(config.xAxis, 'category', axisData, xGroupByDesc?.colDesc || '')\n configureAxis(config.yAxis, 'value')\n break\n\n case 'bar-y-category':\n configureAxis(config.xAxis, 'value')\n configureAxis(config.yAxis, 'category', axisData, xGroupByDesc?.colDesc || '')\n break\n }\n\n return merge(config, chartOptions)\n})\n\nconst { myChart } = useCharts({\n chartDOM: dataChartBar,\n chartOptions: barChartOptions,\n chartData: computed(() => chartData),\n lazyLoad\n})\n\n// 暴露 myChart 方法供父组件访问\ndefineExpose({\n myChart,\n})\n</script>\n\n<template>\n <div\n ref=\"dataChartBar\"\n class=\"data-chart-bar\"\n />\n</template>\n\n<style scoped lang=\"scss\">\n.data-chart-bar {\n width: 100%;\n height: 100%;\n}\n</style>\n"],"names":["merge","inject","InjectionChartMerge","v","dataChartBar","ref","barChartOptions","computed","colDesc","xGroupByDesc","groupByDesc","data","modelName","__props","chartData","axisData","Array","from","Set","map","item","filter","yGroupByDesc","find","xAxis","groupByValues","uniq","String","newXGroupByDesc","config","title","text","name","type","axisLabel","interval","formatter","value","length","substring","yAxis","legend","dataZoom","disabled","series","yItem","emphasis","focus","label","show","position","arr","colDescItem","yGroupByDescItem","obj","stack","xGroupByDescItem","targetVal","forEach","flat","configureAxis","axis","isArray","subShowType","chartOptions","myChart","useCharts","chartDOM","lazyLoad","__expose","_createElementBlock","class"],"mappings":"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"}
|
@@ -0,0 +1,2 @@
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e="/* unplugin-vue-components disabled */\n.data-chart-bar[data-v-c325b6e7] {\n width: 100%;\n height: 100%;\n}";require("../../../../node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.cjs").default(e),exports.default=e;
|
2
|
+
//# sourceMappingURL=bar.vue3.cjs.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"bar.vue3.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
@@ -1,2 +1,2 @@
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("./funnel.vue2.cjs");require("./funnel.vue3.cjs");var r=require("../../../../_virtual/_plugin-vue_export-helper.cjs").default(e.default,[["__scopeId","data-v-c580cbe3"]]);exports.default=r;
|
2
2
|
//# sourceMappingURL=funnel.vue.cjs.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"funnel.vue.cjs","sources":[
|
1
|
+
{"version":3,"file":"funnel.vue.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
@@ -1,2 +1,2 @@
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("
|
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:"DataChartFunnel",__name:"funnel",props:{chartData:{type:Object,required:!0},chartOptions:{type:null,required:!0},lazyLoad:{type:Boolean,required:!1,default:!0}},setup(r,{expose:n}){const l=e.ref(),o=e.inject(t.InjectionChartMerge,e=>e,!0),s=e.computed(()=>{const{colDesc:e,xGroupByDesc:t,modelName:a,data:n}=r.chartData,l={title:{text:a},legend:{},series:e.map(e=>({name:e,type:"funnel",left:"10%",width:"80%",label:{formatter:"{c}"},labelLine:{show:!1},itemStyle:{opacity:.7},emphasis:{label:{position:"inside",formatter:`{b}${e}: {c}`}},data:n.map(a=>({name:a[t?.colDesc||""],value:a[e]||""}))}))};return 1!==e.length&&(l.legend.data=e),o(l,r.chartOptions)}),{myChart:c}=a.useCharts({chartDOM:l,chartOptions:s,chartData:e.computed(()=>r.chartData),lazyLoad:r.lazyLoad});return n({myChart:c}),(t,a)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"dataChartFunnel",ref:l,class:"data-chart-funnel"},null,512))}});exports.default=r;
|
2
2
|
//# sourceMappingURL=funnel.vue2.cjs.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"funnel.vue2.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
1
|
+
{"version":3,"file":"funnel.vue2.cjs","sources":["../../../../../../../packages/components/src/data-chart/src/components/funnel.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { LegendOption } from 'echarts/types/dist/shared'\nimport type { EChartsOption, IFormatPublicData } from '../utils/types'\nimport { InjectionChartMerge } from '../utils/injectionKeys'\nimport { useCharts } from '../utils/useCharts'\n\ndefineOptions({\n name: 'DataChartFunnel',\n})\nconst {\n chartOptions,\n chartData,\n lazyLoad = true,\n} = defineProps<{\n chartData: IFormatPublicData\n chartOptions: EChartsOption\n lazyLoad?: boolean\n}>()\nconst dataChartFunnel = ref()\nconst merge = inject(InjectionChartMerge, (v: any) => v, true)\nconst funnelChartOptions = computed<EChartsOption>(() => {\n const { colDesc, xGroupByDesc, modelName, data } = chartData\n\n const config = {\n title: {\n text: modelName,\n },\n legend: {},\n series: colDesc.map((item) => {\n return {\n name: item,\n type: 'funnel',\n left: '10%',\n width: '80%',\n label: {\n formatter: '{c}',\n },\n labelLine: {\n show: false,\n },\n itemStyle: {\n opacity: 0.7,\n },\n emphasis: {\n label: {\n position: 'inside',\n formatter: `{b}${item}: {c}`,\n },\n },\n data: data.map(yItem => ({\n name: yItem[xGroupByDesc?.colDesc || ''],\n value: yItem[item] || '',\n })),\n }\n }),\n }\n if (colDesc.length !== 1) {\n (config.legend as LegendOption).data = colDesc\n }\n return merge(config, chartOptions)\n})\n\nconst { myChart } = useCharts({\n chartDOM: dataChartFunnel,\n chartOptions: funnelChartOptions,\n chartData: computed(() => chartData),\n lazyLoad\n})\n\n// 暴露 myChart 方法供父组件访问\ndefineExpose({\n myChart,\n})\n</script>\n\n<template>\n <div\n ref=\"dataChartFunnel\"\n class=\"data-chart-funnel\"\n />\n</template>\n\n<style scoped lang=\"scss\">\n.data-chart-funnel {\n width: 100%;\n height: 100%;\n}\n</style>\n"],"names":["dataChartFunnel","ref","merge","inject","InjectionChartMerge","v","funnelChartOptions","computed","colDesc","xGroupByDesc","modelName","data","__props","chartData","config","title","text","legend","series","map","item","name","type","left","width","label","formatter","labelLine","show","itemStyle","opacity","emphasis","position","yItem","value","length","chartOptions","myChart","useCharts","chartDOM","lazyLoad","__expose","_createElementBlock","class"],"mappings":"qXAkBA,MAAMA,EAAkBC,EAAAA,MAClBC,EAAQC,EAAAA,OAAOC,EAAAA,oBAAsBC,GAAWA,GAAG,GACnDC,EAAqBC,EAAAA,SAAwB,KACjD,MAAMC,QAAEA,EAAAC,aAASA,EAAAC,UAAcA,EAAAC,KAAWA,GAASC,EAAAC,UAE7CC,EAAS,CACbC,MAAO,CACLC,KAAMN,GAERO,OAAQ,CAAA,EACRC,OAAQV,EAAQW,IAAKC,IACZ,CACLC,KAAMD,EACNE,KAAM,SACNC,KAAM,MACNC,MAAO,MACPC,MAAO,CACLC,UAAW,OAEbC,UAAW,CACTC,MAAM,GAERC,UAAW,CACTC,QAAS,IAEXC,SAAU,CACRN,MAAO,CACLO,SAAU,SACVN,UAAW,MAAMN,WAGrBT,KAAMA,EAAKQ,IAAIc,IAAA,CACbZ,KAAMY,EAAMxB,GAAcD,SAAW,IACrC0B,MAAOD,EAAMb,IAAS,UAQ9B,OAHuB,IAAnBZ,EAAQ2B,SACTrB,EAAOG,OAAwBN,KAAOH,GAElCN,EAAMY,EAAQF,EAAAwB,iBAGjBC,QAAEA,GAAYC,YAAU,CAC5BC,SAAUvC,EACVoC,aAAc9B,EACdO,UAAWN,EAAAA,SAAS,IAAMK,EAAAC,WAC1B2B,SAAO5B,EAAA4B,kBAITC,EAAa,CACXJ,kCAKAK,EAAAA,mBAGE,MAAA,SAFI,kBAAJzC,IAAID,EACJ2C,MAAM"}
|
@@ -0,0 +1,2 @@
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e="/* unplugin-vue-components disabled */\n.data-chart-funnel[data-v-c580cbe3] {\n width: 100%;\n height: 100%;\n}";require("../../../../node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.cjs").default(e),exports.default=e;
|
2
|
+
//# sourceMappingURL=funnel.vue3.cjs.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"funnel.vue3.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
@@ -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}},setup(r,{expose:s}){const n=e.ref(),
|
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:s}){const n=e.ref(),l=e.inject(t.InjectionChartMerge,e=>e,!0),c=15,i="Total",o=!0;const d=e.computed(()=>{const{colDesc:e,xGroupByDesc:t,groupByDesc:a,data:s,modelName:n}=r.chartData,d=Array.from(new Set(s?.map(e=>e[t?.colDesc||""]))).filter(e=>null!=e)||[],u=a?.find(e=>!e.xAxis),p={title:{text:n},legend:{data:[]},xAxis:{name:t?.colDesc||"",data:d},dataZoom:[{type:"inside",disabled:d.length<c}]};if(1===a?.length)p.series=e.map(e=>({name:e,type:"line",smooth:o,data:s.map(t=>t[e]).filter(e=>null!=e)})),p.legend.data=e;else if(2===a?.length){const a=[...new Set(s.map(e=>String(e[u?.colDesc||""])))];p.legend.data=a,p.series=a.map(a=>function(e,t,a,r,s,n){const l=[];return t.forEach(t=>{const c=a.find(a=>a[r?.colDesc]===t&&a[s?.colDesc]===e);c?l.push(c[n[0]]):l.push(0)}),{name:e,type:"line",smooth:o,stack:i,areaStyle:{},data:l}}(a,d,s,t,u,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:u}=a.useCharts({chartDOM:n,chartOptions:d,chartData:e.computed(()=>r.chartData),lazyLoad:r.lazyLoad});return s({myChart:u}),(t,a)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"dataChartLine",ref:n,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} = defineProps<{\n chartData: IFormatPublicData\n subShowType: string\n chartOptions: EChartsOption\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(0) // 或者其他默认值\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 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: data.map(item => item[yItem]).filter(item => item !== undefined && item !== null),\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})\nconst { myChart } = useCharts({\n chartDOM: dataChartLine,\n chartOptions: lineChartOptions,\n chartData: computed(() => chartData),\n})\n\n//
|
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(0) // 或者其他默认值\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 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: data.map(item => item[yItem]).filter(item => item !== undefined && item !== null),\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","xAxisData","Array","from","Set","map","item","filter","yGroupByDesc","find","xAxis","config","title","text","legend","name","dataZoom","type","disabled","length","series","yItem","smooth","legendData","String","legendDataItem","seriesData","forEach","xAxisItem","targetData","dataItem","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,UAC1DC,EAAYC,MAAMC,KAAK,IAAIC,IAAIP,GAAMQ,IAAIC,GAAQA,EAAKX,GAAcD,SAAW,OAAOa,OAAOD,GAAQA,UAAwC,GAC7IE,EAAeZ,GAAaa,KAAKH,IAASA,EAAKI,OAE/CC,EAAoD,CACxDC,MAAO,CAAEC,KAAMf,GACfgB,OAAQ,CAAEjB,KAAM,IAChBa,MAAO,CACLK,KAAMpB,GAAcD,SAAW,GAC/BG,KAAMI,GAERe,SAAU,CAAC,CACTC,KAAM,SACNC,SAAUjB,EAAUkB,OAAS5B,KAKjC,GAA4B,IAAxBK,GAAauB,OACfR,EAAOS,OAAS1B,EAAQW,IAAIgB,IAAA,CAC1BN,KAAMM,EACNJ,KAAM,OACNK,OAAQ/B,EACRM,KAAMA,EAAKQ,IAAIC,GAAQA,EAAKe,IAAQd,OAAOD,GAAQA,YAEpDK,EAAOG,OAAiCjB,KAAOH,OAClD,GACiC,IAAxBE,GAAauB,OAAc,CAClC,MAAMI,EAAa,IAAI,IAAInB,IAAIP,EAAKQ,IAAIC,GAAQkB,OAAOlB,EAAKE,GAAcd,SAAW,QACnFiB,EAAOG,OAAiCjB,KAAO0B,EAEjDZ,EAAOS,OAASG,EAAWlB,OAjE/B,SAA2BoB,EACzBxB,EACAJ,EACAF,EACAa,EACAd,GACA,MAAMgC,EAAkC,GAiBxC,OAfAzB,EAAU0B,QAASC,IACjB,MAAMC,EAAahC,EAChBY,KAAKqB,GACJA,EAASnC,GAAcD,WAAakC,GACjCE,EAAStB,GAAcd,WAAa+B,GAGvCI,EACFH,EAAWK,KAAKF,EAAWnC,EAAQ,KAGnCgC,EAAWK,KAAK,KAIb,CACLhB,KAAMU,EACNR,KAAM,OACNK,OAAQ/B,EACRyC,MAAOzC,EACP0C,UAAW,CAAA,EACXpC,KAAM6B,EAEV,CAmCMQ,CAAkBT,EAAgBxB,EAAWJ,EAAMF,EAAca,EAAcd,GAEnF,CAoBA,OAjBAiB,EAAOS,OAAST,EAAOS,QAAQf,IAAKC,IAClC,MAAM6B,EAAa,IAAK7B,GAExB,OAAQP,EAAAqC,aACN,IAAK,cAML,eACSD,EAAWF,gBAJpB,IAAK,aACHE,EAAWF,UAAY,CAAA,EAM3B,OAAOE,IAGFhD,EAAMwB,EAAQZ,EAAAsC,iBAGjBC,QAAEA,GAAYC,YAAU,CAC5BC,SAAUvD,EACVoD,aAAc7C,EACdQ,UAAWP,EAAAA,SAAS,IAAMM,EAAAC,WAC1ByC,SAAO1C,EAAA0C,kBAITC,EAAa,CACXJ,kCAKAK,EAAAA,mBAGE,MAAA,SAFI,gBAAJzD,IAAID,EACJ2D,MAAM"}
|
@@ -1,2 +1,2 @@
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("./pie.vue2.cjs");require("./pie.vue3.cjs");var r=require("../../../../_virtual/_plugin-vue_export-helper.cjs").default(e.default,[["__scopeId","data-v-b5a98608"]]);exports.default=r;
|
2
2
|
//# sourceMappingURL=pie.vue.cjs.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"pie.vue.cjs","sources":["../../../../../../../packages/components/src/data-chart/src/components/pie.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { PieSeriesOption } from 'echarts/charts'\nimport type { EChartsOption, IFormatPublicData } from '../utils/types'\nimport { orderBy } from 'lodash-es'\nimport { InjectionChartMerge } from '../utils/injectionKeys'\nimport { useCharts } from '../utils/useCharts'\n\ndefineOptions({\n name: 'DataChartPie',\n})\nconst {\n chartData,\n subShowType = 'pie-simple',\n chartOptions,\n} = defineProps<{\n chartData: IFormatPublicData\n subShowType: string\n chartOptions: EChartsOption\n}>()\nconst merge = inject(InjectionChartMerge, (v: any) => v, true)\n\nconst dataChartPie = ref(null)\nconst pieChartOptions = computed<EChartsOption>(() => {\n const { colDesc, xGroupByDesc, data, modelName } = chartData\n const colDescLength = colDesc.length\n const config = {\n title: { text: modelName },\n series: colDesc.map((item, index) => {\n const seriesItem: PieSeriesOption = {\n name: item,\n type: 'pie',\n center: ['50%', '50%'],\n data: [],\n emphasis: {\n itemStyle: {\n shadowBlur: 10,\n shadowOffsetX: 0,\n shadowColor: 'rgba(0, 0, 0, 0.5)',\n },\n },\n label: {\n formatter: '{b}:{c}({d}%)',\n rich: {\n b: {\n color: '#4C5058',\n fontSize: 14,\n fontWeight: 'bold',\n lineHeight: 33,\n },\n },\n },\n }\n\n let cutNum = 5\n const currentItemData = data.filter(row => row[item] !== undefined)\n const orderByData = orderBy(currentItemData, [item], ['desc'])\n // 总数\n const totalDesc = orderByData.reduce((prev, cur) => {\n const value = Number(cur[item]) || 0\n return Number.isNaN(value) ? prev : prev + value\n }, 0)\n if (currentItemData.length > cutNum) {\n while (cutNum < 9) {\n const headerData = orderByData.slice(0, cutNum)\n // 前 cutNum 个总数\n const headerTotal = headerData.reduce(\n (prev, cur) => prev + Number(cur[item]),\n 0,\n )\n // 前五总占比\n const headerScale = headerTotal / totalDesc\n if (headerScale > 0.9 || cutNum === 8) {\n const footerData = orderByData.slice(\n cutNum,\n orderByData.length - 1,\n )\n seriesItem.data = currentItemData\n .map((yItem) => {\n let obj = {}\n headerData.forEach((headerDataItem) => {\n if (JSON.stringify(headerDataItem) === JSON.stringify(yItem)) {\n obj = {\n name: xGroupByDesc?.colDesc\n ? yItem[xGroupByDesc.colDesc]\n : '',\n value: yItem[item],\n }\n }\n })\n return obj\n })\n .filter(v => v && Object.keys(v).length > 0)\n seriesItem.data.push({\n name: '其它',\n value: footerData.reduce(\n (prev, cur) => prev + Number(cur[item]),\n 0,\n ),\n })\n\n break\n }\n else {\n cutNum++\n }\n }\n }\n else {\n seriesItem.data = currentItemData.map(yItem => ({\n name: xGroupByDesc?.colDesc ? (yItem[xGroupByDesc.colDesc] || '') : '',\n value: Number(yItem[item] || 0),\n }))\n }\n\n if (colDescLength === 1) {\n seriesItem.center = ['50%', '60%']\n }\n else if (colDescLength === 2) {\n if (index === 0) {\n seriesItem.right = '40%'\n seriesItem.left = ''\n seriesItem.center = ['40%', '60%']\n }\n else {\n seriesItem.right = ''\n seriesItem.left = '40%'\n seriesItem.center = ['60%', '60%']\n }\n }\n else if (colDescLength === 3) {\n if (index === 0) {\n seriesItem.right = '40%'\n seriesItem.bottom = '50%'\n seriesItem.top = ''\n seriesItem.left = ''\n seriesItem.center = ['40%', '78%']\n }\n else if (index === 1) {\n seriesItem.right = ''\n seriesItem.bottom = '50%'\n seriesItem.top = ''\n seriesItem.left = '40%'\n seriesItem.center = ['60%', '78%']\n }\n else {\n seriesItem.right = '40%'\n seriesItem.bottom = ''\n seriesItem.top = '50%'\n seriesItem.left = ''\n seriesItem.center = ['40%', '60%']\n }\n }\n else if (colDescLength === 4) {\n if (index === 0) {\n seriesItem.right = '40%'\n seriesItem.bottom = '50%'\n seriesItem.top = ''\n seriesItem.left = ''\n seriesItem.center = ['40%', '78%']\n }\n else if (index === 1) {\n seriesItem.right = ''\n seriesItem.bottom = '50%'\n seriesItem.top = ''\n seriesItem.left = '40%'\n seriesItem.center = ['60%', '78%']\n }\n else if (index === 2) {\n seriesItem.right = '40%'\n seriesItem.bottom = ''\n seriesItem.top = '50%'\n seriesItem.left = ''\n seriesItem.center = ['40%', '60%']\n }\n else {\n seriesItem.right = ''\n seriesItem.bottom = ''\n seriesItem.top = '50%'\n seriesItem.left = '40%'\n seriesItem.center = ['60%', '60%']\n }\n }\n // 处理图表形状\n switch (subShowType) {\n case 'pie-borderRadius':\n seriesItem.radius = ['50%', '70%']\n break\n case 'pie-simple':\n seriesItem.radius = '50%'\n break\n default:\n seriesItem.radius = '50%'\n break\n }\n return seriesItem\n }),\n }\n\n return merge(config, chartOptions)\n})\n\nconst { myChart } = useCharts({\n chartDOM: dataChartPie,\n chartOptions: pieChartOptions,\n chartData: computed(() => chartData),\n})\n\n// 暴露图表实例\ndefineExpose({\n myChart\n})\n</script>\n\n<template>\n <div\n ref=\"dataChartPie\"\n class=\"data-chart-pie\"\n />\n</template>\n"],"names":["merge","inject","InjectionChartMerge","v","dataChartPie","ref","pieChartOptions","computed","colDesc","xGroupByDesc","data","modelName","__props","chartData","colDescLength","length","config","title","text","series","map","item","index","seriesItem","name","type","center","emphasis","itemStyle","shadowBlur","shadowOffsetX","shadowColor","label","formatter","rich","b","color","fontSize","fontWeight","lineHeight","cutNum","currentItemData","filter","row","orderByData","orderBy","totalDesc","reduce","prev","cur","value","Number","isNaN","headerData","slice","footerData","yItem","obj","forEach","headerDataItem","JSON","stringify","Object","keys","push","right","left","bottom","top","subShowType","radius","chartOptions","myChart","useCharts","chartDOM","__expose","_createElementBlock","class"],"mappings":"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"}
|
1
|
+
{"version":3,"file":"pie.vue.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
@@ -1,2 +1,2 @@
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("vue"),t=require("lodash-es"),r=require("../utils/injectionKeys.cjs"),a=require("../utils/useCharts.cjs"),o=e.defineComponent({name:"DataChartPie",__name:"pie",props:{chartData:{type:Object,required:!0},subShowType:{type:String,required:!0,default:"pie-simple"},chartOptions:{type:null,required:!0},lazyLoad:{type:Boolean,required:!1,default:!0}},setup(o,{expose:i}){const c=e.inject(r.InjectionChartMerge,e=>e,!0),l=e.ref(null),s=e.computed(()=>{const{colDesc:e,xGroupByDesc:r,data:a,modelName:i}=o.chartData,l=e.length,s={title:{text:i},series:e.map((e,i)=>{const c={name:e,type:"pie",center:["50%","50%"],data:[],emphasis:{itemStyle:{shadowBlur:10,shadowOffsetX:0,shadowColor:"rgba(0, 0, 0, 0.5)"}},label:{formatter:"{b}:{c}({d}%)",rich:{b:{color:"#4C5058",fontSize:14,fontWeight:"bold",lineHeight:33}}}};let s=5;const n=a.filter(t=>void 0!==t[e]),u=t.orderBy(n,[e],["desc"]),h=u.reduce((t,r)=>{const a=Number(r[e])||0;return Number.isNaN(a)?t:t+a},0);if(n.length>s)for(;s<9;){const t=u.slice(0,s);if(t.reduce((t,r)=>t+Number(r[e]),0)/h>.9||8===s){const a=u.slice(s,u.length-1);c.data=n.map(a=>{let o={};return t.forEach(t=>{JSON.stringify(t)===JSON.stringify(a)&&(o={name:r?.colDesc?a[r.colDesc]:"",value:a[e]})}),o}).filter(e=>e&&Object.keys(e).length>0),c.data.push({name:"其它",value:a.reduce((t,r)=>t+Number(r[e]),0)});break}s++}else c.data=n.map(t=>({name:r?.colDesc&&t[r.colDesc]||"",value:Number(t[e]||0)}));if(1===l?c.center=["50%","60%"]:2===l?0===i?(c.right="40%",c.left="",c.center=["40%","60%"]):(c.right="",c.left="40%",c.center=["60%","60%"]):3===l?0===i?(c.right="40%",c.bottom="50%",c.top="",c.left="",c.center=["40%","78%"]):1===i?(c.right="",c.bottom="50%",c.top="",c.left="40%",c.center=["60%","78%"]):(c.right="40%",c.bottom="",c.top="50%",c.left="",c.center=["40%","60%"]):4===l&&(0===i?(c.right="40%",c.bottom="50%",c.top="",c.left="",c.center=["40%","78%"]):1===i?(c.right="",c.bottom="50%",c.top="",c.left="40%",c.center=["60%","78%"]):2===i?(c.right="40%",c.bottom="",c.top="50%",c.left="",c.center=["40%","60%"]):(c.right="",c.bottom="",c.top="50%",c.left="40%",c.center=["60%","60%"])),"pie-borderRadius"===o.subShowType)c.radius=["50%","70%"];else c.radius="50%";return c})};return c(s,o.chartOptions)}),{myChart:n}=a.useCharts({chartDOM:l,chartOptions:s,chartData:e.computed(()=>o.chartData),lazyLoad:o.lazyLoad});return i({myChart:n}),(t,r)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"dataChartPie",ref:l,class:"data-chart-pie"},null,512))}});exports.default=o;
|
2
2
|
//# sourceMappingURL=pie.vue2.cjs.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"pie.vue2.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
1
|
+
{"version":3,"file":"pie.vue2.cjs","sources":["../../../../../../../packages/components/src/data-chart/src/components/pie.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { PieSeriesOption } from 'echarts/charts'\nimport type { EChartsOption, IFormatPublicData } from '../utils/types'\nimport { orderBy } from 'lodash-es'\nimport { InjectionChartMerge } from '../utils/injectionKeys'\nimport { useCharts } from '../utils/useCharts'\n\ndefineOptions({\n name: 'DataChartPie',\n})\nconst {\n chartData,\n subShowType = 'pie-simple',\n chartOptions,\n lazyLoad = true,\n} = defineProps<{\n chartData: IFormatPublicData\n subShowType: string\n chartOptions: EChartsOption\n lazyLoad?: boolean\n}>()\nconst merge = inject(InjectionChartMerge, (v: any) => v, true)\n\nconst dataChartPie = ref(null)\nconst pieChartOptions = computed<EChartsOption>(() => {\n const { colDesc, xGroupByDesc, data, modelName } = chartData\n const colDescLength = colDesc.length\n const config = {\n title: { text: modelName },\n series: colDesc.map((item, index) => {\n const seriesItem: PieSeriesOption = {\n name: item,\n type: 'pie',\n center: ['50%', '50%'],\n data: [],\n emphasis: {\n itemStyle: {\n shadowBlur: 10,\n shadowOffsetX: 0,\n shadowColor: 'rgba(0, 0, 0, 0.5)',\n },\n },\n label: {\n formatter: '{b}:{c}({d}%)',\n rich: {\n b: {\n color: '#4C5058',\n fontSize: 14,\n fontWeight: 'bold',\n lineHeight: 33,\n },\n },\n },\n }\n\n let cutNum = 5\n const currentItemData = data.filter(row => row[item] !== undefined)\n const orderByData = orderBy(currentItemData, [item], ['desc'])\n // 总数\n const totalDesc = orderByData.reduce((prev, cur) => {\n const value = Number(cur[item]) || 0\n return Number.isNaN(value) ? prev : prev + value\n }, 0)\n if (currentItemData.length > cutNum) {\n while (cutNum < 9) {\n const headerData = orderByData.slice(0, cutNum)\n // 前 cutNum 个总数\n const headerTotal = headerData.reduce(\n (prev, cur) => prev + Number(cur[item]),\n 0,\n )\n // 前五总占比\n const headerScale = headerTotal / totalDesc\n if (headerScale > 0.9 || cutNum === 8) {\n const footerData = orderByData.slice(\n cutNum,\n orderByData.length - 1,\n )\n seriesItem.data = currentItemData\n .map((yItem) => {\n let obj = {}\n headerData.forEach((headerDataItem) => {\n if (JSON.stringify(headerDataItem) === JSON.stringify(yItem)) {\n obj = {\n name: xGroupByDesc?.colDesc\n ? yItem[xGroupByDesc.colDesc]\n : '',\n value: yItem[item],\n }\n }\n })\n return obj\n })\n .filter(v => v && Object.keys(v).length > 0)\n seriesItem.data.push({\n name: '其它',\n value: footerData.reduce(\n (prev, cur) => prev + Number(cur[item]),\n 0,\n ),\n })\n\n break\n }\n else {\n cutNum++\n }\n }\n }\n else {\n seriesItem.data = currentItemData.map(yItem => ({\n name: xGroupByDesc?.colDesc ? (yItem[xGroupByDesc.colDesc] || '') : '',\n value: Number(yItem[item] || 0),\n }))\n }\n\n if (colDescLength === 1) {\n seriesItem.center = ['50%', '60%']\n }\n else if (colDescLength === 2) {\n if (index === 0) {\n seriesItem.right = '40%'\n seriesItem.left = ''\n seriesItem.center = ['40%', '60%']\n }\n else {\n seriesItem.right = ''\n seriesItem.left = '40%'\n seriesItem.center = ['60%', '60%']\n }\n }\n else if (colDescLength === 3) {\n if (index === 0) {\n seriesItem.right = '40%'\n seriesItem.bottom = '50%'\n seriesItem.top = ''\n seriesItem.left = ''\n seriesItem.center = ['40%', '78%']\n }\n else if (index === 1) {\n seriesItem.right = ''\n seriesItem.bottom = '50%'\n seriesItem.top = ''\n seriesItem.left = '40%'\n seriesItem.center = ['60%', '78%']\n }\n else {\n seriesItem.right = '40%'\n seriesItem.bottom = ''\n seriesItem.top = '50%'\n seriesItem.left = ''\n seriesItem.center = ['40%', '60%']\n }\n }\n else if (colDescLength === 4) {\n if (index === 0) {\n seriesItem.right = '40%'\n seriesItem.bottom = '50%'\n seriesItem.top = ''\n seriesItem.left = ''\n seriesItem.center = ['40%', '78%']\n }\n else if (index === 1) {\n seriesItem.right = ''\n seriesItem.bottom = '50%'\n seriesItem.top = ''\n seriesItem.left = '40%'\n seriesItem.center = ['60%', '78%']\n }\n else if (index === 2) {\n seriesItem.right = '40%'\n seriesItem.bottom = ''\n seriesItem.top = '50%'\n seriesItem.left = ''\n seriesItem.center = ['40%', '60%']\n }\n else {\n seriesItem.right = ''\n seriesItem.bottom = ''\n seriesItem.top = '50%'\n seriesItem.left = '40%'\n seriesItem.center = ['60%', '60%']\n }\n }\n // 处理图表形状\n switch (subShowType) {\n case 'pie-borderRadius':\n seriesItem.radius = ['50%', '70%']\n break\n case 'pie-simple':\n seriesItem.radius = '50%'\n break\n default:\n seriesItem.radius = '50%'\n break\n }\n return seriesItem\n }),\n }\n\n return merge(config, chartOptions)\n})\n\nconst { myChart } = useCharts({\n chartDOM: dataChartPie,\n chartOptions: pieChartOptions,\n chartData: computed(() => chartData),\n lazyLoad\n})\n\n// 暴露 myChart 方法供父组件访问\ndefineExpose({\n myChart,\n})\n</script>\n\n<template>\n <div\n ref=\"dataChartPie\"\n class=\"data-chart-pie\"\n />\n</template>\n\n<style scoped lang=\"scss\">\n.data-chart-pie {\n width: 100%;\n height: 100%;\n}\n</style>\n"],"names":["merge","inject","InjectionChartMerge","v","dataChartPie","ref","pieChartOptions","computed","colDesc","xGroupByDesc","data","modelName","__props","chartData","colDescLength","length","config","title","text","series","map","item","index","seriesItem","name","type","center","emphasis","itemStyle","shadowBlur","shadowOffsetX","shadowColor","label","formatter","rich","b","color","fontSize","fontWeight","lineHeight","cutNum","currentItemData","filter","row","orderByData","orderBy","totalDesc","reduce","prev","cur","value","Number","isNaN","headerData","slice","footerData","yItem","obj","forEach","headerDataItem","JSON","stringify","Object","keys","push","right","left","bottom","top","subShowType","radius","chartOptions","myChart","useCharts","chartDOM","lazyLoad","__expose","_createElementBlock","class"],"mappings":"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"}
|
@@ -0,0 +1,2 @@
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e="/* unplugin-vue-components disabled */\n.data-chart-pie[data-v-b5a98608] {\n width: 100%;\n height: 100%;\n}";require("../../../../node_modules/.pnpm/style-inject@0.3.0/node_modules/style-inject/dist/style-inject.es.cjs").default(e),exports.default=e;
|
2
|
+
//# sourceMappingURL=pie.vue3.cjs.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"pie.vue3.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
@@ -1,2 +1,2 @@
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("./radar.vue2.cjs");require("./radar.vue3.cjs");var r=require("../../../../_virtual/_plugin-vue_export-helper.cjs").default(e.default,[["__scopeId","data-v-dcb2eae6"]]);exports.default=r;
|
2
2
|
//# sourceMappingURL=radar.vue.cjs.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"radar.vue.cjs","sources":[
|
1
|
+
{"version":3,"file":"radar.vue.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|