<template> <div> <v-chart :key="treeCounter" :option="options" ref="chart" @click="onChartClick" :style="{ height: $attrs.height, width: $attrs.width }" lazy ></v-chart> </div> </template> <script> // import { use } from "echarts/core"; import { PieChart } from "echarts/charts"; import { TitleComponent, TooltipComponent, LegendComponent, } from "echarts/components"; import { CanvasRenderer } from "echarts/renderers"; use([ TitleComponent, TooltipComponent, LegendComponent, PieChart, CanvasRenderer, ]); /** * @vue-prop {Array} [data=[]] - دادههای نمودار پای * @vue-prop {Object} [PieOptions={}] - تنظیمات نمودار پای * @vue-data {Number} [treeCounter=1] - شمارنده درخت * @vue-data {Object} [options] - تنظیمات نمودار * @vue-data {Object} [options.title] - عنوان * @vue-data {String} [options.title.left="center"] - موقعیت افقی عنوان * @vue-data {Object} [options.tooltip] - ابزارک * @vue-data {String} [options.tooltip.trigger="item"] - محرک * @vue-data {Function} [options.tooltip.formatter] - فرمتبندی کننده * @vue-data {Object} [options.legend] - افسانه * @vue-data {Number|String} [options.legend.right=0] - موقعیت افقی افسانه * @vue-data {Number|String} [options.legend.top="20%"] - موقعیت عمودی افسانه * @vue-data {String} [options.legend.orient="vertical"] - جهت * @vue-data {String} [options.legend.left="left"] - موقعیت افقی عنوان * @vue-data {Object} [options.legend.textStyle] - سبک متن * @vue-data {String} [options.legend.textStyle.fontFamily="sahel"] - فونت متن * @vue-data {Array} [options.series] - سریها * @vue-data {Number|String} [options.series.left=400] - موقعیت افقی سری * @vue-data {String} [options.series.name="Access From"] - نام سری * @vue-data {String} [options.series.type="pie"] - نوع سری * @vue-data {String} [options.series.radius="50%"] - شعاع سری * @vue-data {Object} [options.series.label] - برچسب * @vue-data {Boolean} [options.series.label.show=true] - نمایش برچسب * @vue-data {Number} [options.series.label.fontSize=12] - اندازه قلم برچسب * @vue-data {String} [options.series.label.fontFamily="sahel"] - فونت برچسب * @vue-data {Object} [options.series.emphasis] - تاکید * @vue-data {Object} [options.series.emphasis.label] - برچسب * @vue-data {Boolean} [options.series.emphasis.label.show=true] - نمایش برچسب تاکید شده * @vue-data {Number} [options.series.emphasis.label.fontSize=20] - اندازه قلم برچسب تاکید شده * @vue-data {String} [options.series.emphasis.label.fontWeight="bold"] - وزن قلم برچسب تاکید شده * @vue-data {Object} [options.series.emphasis.itemStyle] - سبک آیتم تاکید شده * @vue-data {Number} [options.series.emphasis.itemStyle.shadowBlur=10] - شعاع سایه * @vue-data {Number} [options.series.emphasis.itemStyle.shadowOffsetX=0] - آفست افقی سایه * @vue-data {String} [options.series.emphasis.itemStyle.shadowColor="rgba(0, 0, 0, 0.5)"] - رنگ سایه * @vue-data {Array} [options.series.data] - دادههای سری */ export default { props: { dataChart: { default() { return []; }, type: Array, }, PieOptions: { default() { return {}; }, type: Object, }, }, data() { return { treeCounter: 1, options: { title: { // text: "Referer of a Website", // subtext: "Fake Data", left: "center", }, tooltip: { trigger: "item", formatter: (params) => { return `${params.marker} ${params.name}: ${params.percent}<br/>`; }, }, legend: { show: window?.innerWidth >= 991 ? true : false, right: 0, top: "20%", orient: "vertical", left: "left", textStyle: { fontFamily: "sahel" }, }, series: [ { name: "Access From", type: "pie", radius: "50%", left: window?.innerWidth >= 991 ? 200 : "center", top: "center", width: "100%", height: "100%", right: null, bottom: null, label: { show: true, fontSize: 12, fontFamily: "sahel", }, emphasis: { label: { show: true, fontSize: 20, fontWeight: "bold", }, itemStyle: { shadowBlur: 10, shadowOffsetX: 0, shadowColor: "rgba(0, 0, 0, 0.5)", }, }, data: [ { value: 1048, name: "Search Engine" }, { value: 735, name: "Direct" }, { value: 580, name: "Email" }, { value: 484, name: "Union Ads" }, { value: 300, name: "Video Ads" }, ], }, ], }, }; }, watch: { dataChart(navItem) { this.dataChartHandler(navItem); }, }, beforeMount() { this.dataChartHandler(this.dataChart); }, mounted() { if (this.PieOptions == {}) return; let option = this.options.series[0]; this.options.series[0] = { ...option, ...this.PieOptions }; }, methods: { /** * هنگامی که بر روی نمودار کلیک میشود، این متد اجرا میشود. * اطلاعات مورد نظر کاربر را از رویداد دریافت کرده و آن را به کامپوننت والد ارسال میکند. * * @param {object} event - رویداد کلیک بر روی نمودار */ onChartClick(event) { const itemSelected = { name: event.name, y: event.value }; this.$emit("list", itemSelected); }, /** * پردازش دادههای نمودار. * دادههای ورودی را تغییر شکل میدهد و آنها را برای استفاده در نمودار آماده میکند. * * @param {Array} value - دادههای ورودی برای نمودار */ dataChartHandler(value) { const modifiedData = value.map((item) => { return { name: item.name, value: item.y, }; }); this.options.series[0].data = modifiedData; this.treeCounter++; }, }, }; </script> <style lang="scss"></style>