<template> <div> <v-chart :key="jstreeCounter" :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} [dataPie=[]] - دادههای نمودار پای * @vue-prop {Object} [PieOptions={}] - گزینههای نمودار پای * * @vue-data {Number} [jstreeCounter=1] - شمارنده jstree * @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} [options.legend.right=0] - تراز راست راهنما * @vue-data {String} [options.legend.top="10%"] - تراز بالایی راهنما * @vue-data {String} [options.legend.orient="vertical"] - جهت راهنما * @vue-data {String} [options.legend.left="left"] - تراز چپ راهنما * @vue-data {Object} [options.legend.textStyle] - سبک متن راهنما * @vue-data {Function} [options.legend.formatter] - قالببندیکننده راهنما * @vue-data {Array} [options.series] - دادههای سریهای نمودار * @vue-data {Number} [options.series[].left=300] - تراز چپ سری نمودار * @vue-data {Object} [options.series[].label] - برچسب سری نمودار * @vue-data {Boolean} [options.series[].label.show=true] - نمایش برچسب * @vue-data {Number} [options.series[].label.fontSize=15] - اندازه فونت برچسب * @vue-data {String} [options.series[].label.fontFamily="sahel"] - فونت برچسب * @vue-data {Function} [options.series[].label.formatter] - قالببندیکننده برچسب * @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[].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 {String} [options.series[].emphasis.label.fontFamily="sahel"] - فونت برچسب تاکید * @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] - آفست سایهی آیتم تاکید در راستای x * @vue-data {String} [options.series[].emphasis.itemStyle.shadowColor="rgba(0, 0, 0, 0.5)"] - رنگ سایهی آیتم تاکید * @vue-data {Array} [options.series[].data] - دادههای سری نمودار * @vue-data {Number} [options.series[].data[].value=1048] - مقدار داده سری نمودار * @vue-data {String} [options.series[].data[].name="Search Engine"] - نام داده سری نمودار */ export default { props: { dataPie: { default() { return []; }, type: Array, }, PieOptions: { default() { return {}; }, type: Object, }, }, data() { return { jstreeCounter: 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: { right: 0, top: "10%", orient: "vertical", left: "left", textStyle: { fontFamily: "sahel" }, formatter: (name) => { const series = this.options.series[0]; const item = series.data.find((dataItem) => dataItem.name === name); if (item) { // اضافه کردن علامت درصد به نام مورد در راهنما return `${name} (${item.value}%)`; } return name; }, }, series: [ { left: 300, label: { show: true, fontSize: 15, fontFamily: "sahel", formatter: (params) => { // اضافه کردن علامت درصد به label return `${params.name}: ${params.value}%`; }, }, name: "Access From", type: "pie", radius: "50%", emphasis: { label: { show: true, fontSize: 20, fontWeight: "bold", fontFamily: "sahel", }, 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: { dataPie(newData) { const modifiedData = newData.map((item) => { return { name: item.name, value: item.y, }; }); this.$set(this.options.series[0], "data", modifiedData); this.jstreeCounter++; }, }, mounted() { const modifiedData = this.dataPie.map((item) => { return { name: item.name, value: item.y, }; }); this.options.series[0].data = modifiedData; if (this.PieOptions == {}) return; let option = this.options.series[0]; this.options.series[0] = { ...option, ...this.PieOptions }; }, methods: { /** * رویداد کلیک بر روی نمودار. * این متد زمانی فراخوانی میشود که کاربر بر روی یک مورد در نمودار کلیک میکند و اطلاعات مورد نظر را از آن مورد استخراج میکند و از طریق یک رویداد به خارج ارسال میکند. * * @param {object} event - رویداد کلیک بر روی نمودار * @param {string} event.name - نام مورد انتخاب شده * @param {number} event.value - مقدار مورد انتخاب شده */ onChartClick(event) { const itemSelected = { name: event.name, y: event.value }; this.$emit("list", itemSelected); }, }, }; </script> <style lang="scss"></style>