<template> <div> <v-chart :key="treeCounter" :option="options" style="height: 500px; width: 100%" @dblclick="onChartDblClick" @click="onChartClick" ref="chart" lazy ></v-chart> </div> </template> <script> // import { use } from "echarts/core"; import { TreemapChart } from "echarts/charts"; import { TitleComponent, TooltipComponent, ToolboxComponent, } from "echarts/components"; import { CanvasRenderer } from "echarts/renderers"; use([ TitleComponent, TooltipComponent, TreemapChart, CanvasRenderer, ToolboxComponent, ]); /** * @vue-prop {Array} [dataTreeMap=[]] - دادههای نمودار درختی * @vue-data {Array} [dataTest=[]] - دادههای نمودار درختی * @vue-data {Object} [options] - تنظیمات نمودار درختی * @vue-data {Object} [options.title] - عنوان نمودار * @vue-data {String} [options.title.text="تعداد افراد"] - متن عنوان * @vue-data {String} [options.title.left="leafDepth"] - موقعیت عنوان * @vue-data {Object} [options.series] - سریهای نمودار * @vue-data {String} [options.series.name="افراد"] - نام سری * @vue-data {String} [options.series.type="treemap"] - نوع نمودار * @vue-data {Number} [options.series.visibleMin=300] - حداقل مقدار قابل مشاهده * @vue-data {Array} [options.series.data=[]] - دادههای سری * @vue-data {Number} [options.series.leafDepth=2] - عمق برگ * @vue-data {Array} [options.series.levels] - سطوح نمودار * @vue-data {Object} [options.series.upperLabel] - برچسب بالایی * @vue-data {Boolean} [options.series.upperLabel.show=true] - نمایش برچسب بالایی * @vue-data {Number} [options.series.upperLabel.height=30] - ارتفاع برچسب بالایی */ export default { props: { dataChart: { default() { return []; }, type: Array, }, }, watch: { dataChart(navItem) { let data = this.organizeData(navItem); // let data = navItem; this.options.series[0].data = data; this.treeCounter++; }, }, data() { return { treeCounter: 1, // dataTest: [ // { // value: 1000, // name: "Root", // children: [ // { // value: 500, // name: "Child 1", // children: [ // { // value: 200, // name: "Child 1.1", // children: [ // { value: 50, name: "Child 1.1.1" }, // { value: 50, name: "Child 1.1.2" }, // { value: 50, name: "Child 1.1.3" }, // ], // }, // { // value: 200, // name: "Child 1.2", // children: [ // { value: 50, name: "Child 1.2.1" }, // { value: 50, name: "Child 1.2.2" }, // { value: 50, name: "Child 1.2.3" }, // ], // }, // { // value: 100, // name: "Child 1.3", // children: [ // { value: 30, name: "Child 1.3.1" }, // { value: 30, name: "Child 1.3.2" }, // { value: 30, name: "Child 1.3.3" }, // ], // }, // ], // }, // { // value: 300, // name: "Child 2", // children: [ // { // value: 100, // name: "Child 2.1", // children: [ // { value: 30, name: "Child 2.1.1" }, // { value: 30, name: "Child 2.1.2" }, // { value: 30, name: "Child 2.1.3" }, // ], // }, // { // value: 100, // name: "Child 2.2", // children: [ // { value: 30, name: "Child 2.2.1" }, // { value: 30, name: "Child 2.2.2" }, // { value: 30, name: "Child 2.2.3" }, // ], // }, // { // value: 100, // name: "Child 2.3", // children: [ // { value: 30, name: "Child 2.3.1" }, // { value: 30, name: "Child 2.3.2" }, // { value: 30, name: "Child 2.3.3" }, // ], // }, // ], // }, // { // value: 200, // name: "Child 3", // children: [ // { // value: 60, // name: "Child 3.1", // children: [ // { value: 20, name: "Child 3.1.1" }, // { value: 20, name: "Child 3.1.2" }, // { value: 20, name: "Child 3.1.3" }, // ], // }, // { // value: 60, // name: "Child 3.2", // children: [ // { value: 20, name: "Child 3.2.1" }, // { value: 20, name: "Child 3.2.2" }, // { value: 20, name: "Child 3.2.3" }, // ], // }, // { // value: 80, // name: "Child 3.3", // children: [ // { value: 30, name: "Child 3.3.1" }, // { value: 30, name: "Child 3.3.2" }, // { value: 30, name: "Child 3.3.3" }, // ], // }, // ], // }, // ], // }, // { // value: 1000, // name: "Root", // children: [ // { // value: 500, // name: "Child 1", // children: [ // { // value: 200, // name: "Child 1.1", // children: [ // { value: 50, name: "Child 1.1.1" }, // { value: 50, name: "Child 1.1.2" }, // { value: 50, name: "Child 1.1.3" }, // ], // }, // { // value: 200, // name: "Child 1.2", // children: [ // { value: 50, name: "Child 1.2.1" }, // { value: 50, name: "Child 1.2.2" }, // { value: 50, name: "Child 1.2.3" }, // ], // }, // { // value: 100, // name: "Child 1.3", // children: [ // { value: 30, name: "Child 1.3.1" }, // { value: 30, name: "Child 1.3.2" }, // { value: 30, name: "Child 1.3.3" }, // ], // }, // ], // }, // { // value: 300, // name: "Child 2", // children: [ // { // value: 100, // name: "Child 2.1", // children: [ // { value: 30, name: "Child 2.1.1" }, // { value: 30, name: "Child 2.1.2" }, // { value: 30, name: "Child 2.1.3" }, // ], // }, // { // value: 100, // name: "Child 2.2", // children: [ // { value: 30, name: "Child 2.2.1" }, // { value: 30, name: "Child 2.2.2" }, // { value: 30, name: "Child 2.2.3" }, // ], // }, // { // value: 100, // name: "Child 2.3", // children: [ // { value: 30, name: "Child 2.3.1" }, // { value: 30, name: "Child 2.3.2" }, // { value: 30, name: "Child 2.3.3" }, // ], // }, // ], // }, // { // value: 200, // name: "Child 3", // children: [ // { // value: 60, // name: "Child 3.1", // children: [ // { value: 20, name: "Child 3.1.1" }, // { value: 20, name: "Child 3.1.2" }, // { value: 20, name: "Child 3.1.3" }, // ], // }, // { // value: 60, // name: "Child 3.2", // children: [ // { value: 20, name: "Child 3.2.1" }, // { value: 20, name: "Child 3.2.2" }, // { value: 20, name: "Child 3.2.3" }, // ], // }, // { // value: 80, // name: "Child 3.3", // children: [ // { value: 30, name: "Child 3.3.1" }, // { value: 30, name: "Child 3.3.2" }, // { value: 30, name: "Child 3.3.3" }, // ], // }, // ], // }, // ], // }, // { // value: 1000, // name: "Root", // children: [ // { // value: 500, // name: "Child 1", // children: [ // { // value: 200, // name: "Child 1.1", // children: [ // { value: 50, name: "Child 1.1.1" }, // { value: 50, name: "Child 1.1.2" }, // { value: 50, name: "Child 1.1.3" }, // ], // }, // { // value: 200, // name: "Child 1.2", // children: [ // { value: 50, name: "Child 1.2.1" }, // { value: 50, name: "Child 1.2.2" }, // { value: 50, name: "Child 1.2.3" }, // ], // }, // { // value: 100, // name: "Child 1.3", // children: [ // { value: 30, name: "Child 1.3.1" }, // { value: 30, name: "Child 1.3.2" }, // { value: 30, name: "Child 1.3.3" }, // ], // }, // ], // }, // { // value: 300, // name: "Child 2", // children: [ // { // value: 100, // name: "Child 2.1", // children: [ // { value: 30, name: "Child 2.1.1" }, // { value: 30, name: "Child 2.1.2" }, // { value: 30, name: "Child 2.1.3" }, // ], // }, // { // value: 100, // name: "Child 2.2", // children: [ // { value: 30, name: "Child 2.2.1" }, // { value: 30, name: "Child 2.2.2" }, // { value: 30, name: "Child 2.2.3" }, // ], // }, // { // value: 100, // name: "Child 2.3", // children: [ // { value: 30, name: "Child 2.3.1" }, // { value: 30, name: "Child 2.3.2" }, // { value: 30, name: "Child 2.3.3" }, // ], // }, // ], // }, // { // value: 200, // name: "Child 3", // children: [ // { // value: 60, // name: "Child 3.1", // children: [ // { value: 20, name: "Child 3.1.1" }, // { value: 20, name: "Child 3.1.2" }, // { value: 20, name: "Child 3.1.3" }, // ], // }, // { // value: 60, // name: "Child 3.2", // children: [ // { value: 20, name: "Child 3.2.1" }, // { value: 20, name: "Child 3.2.2" }, // { value: 20, name: "Child 3.2.3" }, // ], // }, // { // value: 80, // name: "Child 3.3", // children: [ // { value: 30, name: "Child 3.3.1" }, // { value: 30, name: "Child 3.3.2" }, // { value: 30, name: "Child 3.3.3" }, // ], // }, // ], // }, // ], // }, // ], dataTest: [ { id: "1739", parent: "0", name: "پیامد زیرساختی ", value: 44, color: "#CD5C08", }, { id: "1740", parent: "0", name: "پیامدهای ساختاری نهادی", value: 123, color: "#F5E8B7", }, { id: "1741", parent: "0", name: "پیامدهای روبنایی", value: 53, color: "#E5CFF7", }, { id: "1744", parent: "0", name: "تست", value: 0, color: "#6A9C89", }, { id: "1747", parent: "0", name: "موضوع جدید تستی23", value: 0, color: "#5B0888", }, { id: "1748", parent: "0", name: "موضوع تستی با موبایل", value: 0, color: "#713ABE", }, { id: "787", parent: "757", name: "خودتأمینی", value: 0, }, { id: "774", parent: "771", name: "اشتغال", value: 0, }, { id: "849", parent: "780", name: "نظام توزیع", value: 0, }, { id: "793", parent: "781", name: "پسماند", value: 0, }, { id: "784", parent: "783", name: "اگرواکوسیستم", value: 0, }, { id: "786", parent: "785", name: "خودتأمینی", value: 0, }, { id: "788", parent: "785", name: "بازیافت آب", value: 0, }, { id: "1745", parent: "856", name: "هویت اجتماعی", value: 1, }, { id: "863", parent: "859", name: "مدیریت و حکمرانی", value: 5, }, { id: "864", parent: "859", name: "سازماندهی", value: 6, }, { id: "866", parent: "865", name: "روندهای دانشی", value: 6, }, { id: "867", parent: "865", name: "آموزش و تربیت", value: 4, }, { id: "869", parent: "868", name: "فضای کالبدی", value: 46, }, { id: "870", parent: "868", name: "نظام تولید ثروت", value: 24, }, { id: "871", parent: "868", name: "نظام توزیع", value: 11, }, { id: "1738", parent: "868", name: "تأمین انرژی", value: 0, }, { id: "873", parent: "872", name: "خانواده", value: 9, }, { id: "874", parent: "872", name: "نهاد اجتماعی بانوان", value: 3, }, { id: "881", parent: "875", name: "تأمین معیشت", value: 10, }, { id: "882", parent: "875", name: "نظام تغذیه", value: 18, }, { id: "883", parent: "875", name: "تکافل اجتماعی", value: 3, }, { id: "898", parent: "881", name: "تست تامین معیشت", value: 0, }, { id: "897", parent: "882", name: "امنیت غذایی", value: 7, }, { id: "887", parent: "885", name: "نشاط اجتماعی، تفریح و ورزش", value: 3, }, { id: "888", parent: "885", name: "کشاورزی", value: 28, }, { id: "889", parent: "885", name: "تولیدی و صنعتی", value: 12, }, { id: "856", parent: "1739", name: "هویت اجتماعی", value: 28, }, { id: "857", parent: "1739", name: "محور انگیزش اجتماعی", value: 14, }, { id: "858", parent: "1739", name: "فعالیت جهادی", value: 3, }, { id: "1746", parent: "1739", name: "موضوع تستی", value: 0, }, { id: "859", parent: "1740", name: "چرخه مشارکت مردمی", value: 18, }, { id: "865", parent: "1740", name: "چرخه دانش", value: 10, }, { id: "868", parent: "1740", name: "چرخه اقتصادی و فضای کالبدی", value: 82, }, { id: "872", parent: "1740", name: "بنیان جامعه", value: 12, }, { id: "875", parent: "1741", name: "ثمرات اقتصادی", value: 24, }, { id: "884", parent: "1741", name: "نظام سلامت", value: 7, }, { id: "885", parent: "1741", name: "فعالیت مؤثر اجتماعی", value: 44, }, { id: "890", parent: "1741", name: "گردشکری", value: 2, }, { id: "894", parent: "1741", name: "امنیت", value: 0, }, { id: "900", parent: "1741", name: "تعامل با محیط زیست", value: 19, }, { id: "0000000", parent: "0", name: "نامشخص", value: 11, color: "#CD5C08", }, ], options: { // title: { // // text: "تعداد افراد", // // subtext: '2016/04', // left: "leafDepth", // }, tooltip: {}, // toolbox: { // show: true, // feature: { // dataZoom: { // yAxisIndex: "none", // }, // dataView: { readOnly: false }, // // magicType: { type: ["line", "bar"] }, // restore: { show: true }, // saveAsImage: {}, // }, // }, series: [ { // name: "افراد", type: "treemap", visibleMin: 1, // visualDimension: 2, data: [], leafDepth: 1, // squareRatio: 0.15, levels: [ { visibleMin: 0, itemStyle: { borderColor: "#555", borderWidth: 4, gapWidth: 4, }, }, { colorSaturation: [0.3, 0.6], itemStyle: { borderColorSaturation: 0.7, gapWidth: 2, borderWidth: 2, }, }, { colorSaturation: [0.3, 0.5], itemStyle: { borderColorSaturation: 0.6, gapWidth: 1, }, }, { colorSaturation: [0.3, 0.5], }, ], // label: { // show: true, // formatter: "{b}", // }, upperLabel: { show: true, height: 30, }, }, ], }, value: 50, }; }, mounted() { let data = this.organizeData(this.dataChart); this.options.series[0].data = data; this.treeCounter++; }, methods: { /** * هنگامی که بر روی نمودار دوبل کلیک میشود، این متد اجرا میشود. * اطلاعات مربوط به رویداد دوبل کلیک را به کامپوننت والد ارسال میکند. * * @param {object} params - پارامترهای مربوط به رویداد دوبل کلیک */ onChartDblClick(params) { this.$emit("dblClick", params); }, // وقتی مشکل value درست شد // مقدار iپاک کنید organizeData(data) { const map = {}; const roots = []; let i = ""; data.forEach((item) => { i = this.value++; map[item.id] = { ...item, children: [], visibleMin: item.value === 0 ? 0 : undefined, value : i , }; }); data.forEach((item) => { if (item.parent === "0") { roots.push(map[item.id]); } else if (map[item.parent]) { map[item.parent].children.push(map[item.id]); } }); return roots; }, onChartClick(event) { const itemSelected = { name: event.data.name, y: event.data.value }; this.$emit("list", itemSelected); }, }, }; </script>