@@ -16,6 +16,7 @@ import {
1616 easeOutCubic ,
1717 error ,
1818 getMissingDatasetAttributes ,
19+ hasDeepProperty ,
1920 isFunction ,
2021 makeDonut ,
2122 objectIsEmpty ,
@@ -164,17 +165,44 @@ function prepareConfig() {
164165 userConfig: props .config ,
165166 defaultConfig: DEFAULT_CONFIG
166167 });
168+
169+ let finalConfig = {}
170+
167171 if (mergedConfig .theme ) {
168- return {
172+ finalConfig = {
169173 ... useNestedProp ({
170174 userConfig: themes .vue_ui_donut [mergedConfig .theme ] || props .config ,
171175 defaultConfig: mergedConfig
172176 }),
173177 customPalette: themePalettes[mergedConfig .theme ] || palette
174178 }
175179 } else {
176- return mergedConfig;
180+ finalConfig = mergedConfig;
181+ }
182+
183+ // ------------------------------ OVERRIDES -----------------------------------
184+
185+ if (props .config && hasDeepProperty (props .config , ' events.datapointEnter' )) {
186+ finalConfig .events .datapointEnter = props .config .events .datapointEnter ;
187+ } else {
188+ finalConfig .events .datapointEnter = null ;
189+ }
190+
191+ if (props .config && hasDeepProperty (props .config , ' events.datapointLeave' )) {
192+ finalConfig .events .datapointLeave = props .config .events .datapointLeave ;
193+ } else {
194+ finalConfig .events .datapointLeave = null ;
195+ }
196+
197+ if (props .config && hasDeepProperty (props .config , ' events.datapointClick' )) {
198+ finalConfig .events .datapointClick = props .config .events .datapointClick ;
199+ } else {
200+ finalConfig .events .datapointClick = null ;
177201 }
202+
203+ // ----------------------------------------------------------------------------
204+
205+ return finalConfig;
178206}
179207
180208const FINAL_CONFIG = computed ({
@@ -611,7 +639,20 @@ const dataTooltipSlot = ref(null);
611639
612640const useCustomFormat = ref (false );
613641
642+ function handleDatapointLeave ({ datapoint, seriesIndex }) {
643+ if (FINAL_CONFIG .value .events .datapointLeave ) {
644+ FINAL_CONFIG .value .events .datapointLeave ({ datapoint, seriesIndex });
645+ }
646+ isTooltip .value = false ;
647+ selectedSerie .value = null ;
648+ }
649+
614650function useTooltip ({ datapoint, relativeIndex, seriesIndex, show = false }) {
651+ console .log (datapoint)
652+ if (FINAL_CONFIG .value .events .datapointEnter ) {
653+ FINAL_CONFIG .value .events .datapointEnter ({ datapoint, seriesIndex });
654+ }
655+
615656 dataTooltipSlot .value = { datapoint, seriesIndex, config: FINAL_CONFIG .value , series: immutableSet .value };
616657 isTooltip .value = show;
617658 selectedSerie .value = relativeIndex;
@@ -788,6 +829,9 @@ function dashLabel(num) {
788829}
789830
790831function selectDatapoint (datapoint , index ) {
832+ if (FINAL_CONFIG .value .events .datapointClick ) {
833+ FINAL_CONFIG .value .events .datapointClick ({ datapoint, seriesIndex: datapoint .seriesIndex })
834+ }
791835 emit (' selectDatapoint' , { datapoint, index });
792836}
793837
@@ -1133,7 +1177,8 @@ defineExpose({
11331177 relativeIndex: i,
11341178 seriesIndex: arc.seriesIndex,
11351179 show: true
1136- })" @mouseleave =" isTooltip = false; selectedSerie = null" @click =" selectDatapoint(arc, i)" />
1180+ })"
1181+ @mouseleave =" handleDatapointLeave({ datapoint: arc, seriesIndex: arc.seriesIndex })" @click =" selectDatapoint(arc, i)" />
11371182 </g >
11381183 <g v-else >
11391184 <circle data-cy =" tooltip-trap" :cx =" svg.width / 2" :cy =" svg.height / 2" :r =" minSize"
@@ -1142,7 +1187,7 @@ defineExpose({
11421187 relativeIndex: 0,
11431188 seriesIndex: currentDonut[0].seriesIndex,
11441189 show: true
1145- })" @mouseleave =" isTooltip = false; selectedSerie = null "
1190+ })" @mouseleave =" handleDatapointLeave({ datapoint: currentDonut[0], seriesIndex: currentDonut[0].seriesIndex }) "
11461191 @click =" selectDatapoint(currentDonut[0], i)" />
11471192 </g >
11481193 </template >
@@ -1229,7 +1274,15 @@ defineExpose({
12291274 :cx =" calcMarkerOffsetX(arc).x" :cy =" calcMarkerOffsetY(arc) - 3.5" :fill =" arc.color"
12301275 :stroke =" FINAL_CONFIG.style.chart.backgroundColor" :stroke-width =" 1" :r =" 3"
12311276 :filter =" !FINAL_CONFIG.useBlurOnHover || [null, undefined].includes(selectedSerie) || selectedSerie === i ? `` : `url(#blur_${uid})`"
1232- @click =" selectDatapoint(arc, i)" />
1277+ @click =" selectDatapoint(arc, i)"
1278+ @mouseenter =" useTooltip({
1279+ datapoint: arc,
1280+ relativeIndex: i,
1281+ seriesIndex: arc.seriesIndex,
1282+ show: true
1283+ })"
1284+ @mouseleave =" handleDatapointLeave({ datapoint: arc, seriesIndex: arc.seriesIndex })"
1285+ />
12331286 </template >
12341287 <template v-if =" FINAL_CONFIG .type === ' polar' " >
12351288 <circle data-cy =" polar-label-marker" v-if =" isArcBigEnough(arc) && mutableConfig.dataLabels.show"
@@ -1238,7 +1291,14 @@ defineExpose({
12381291 :fill =" arc.color" :stroke =" FINAL_CONFIG.style.chart.backgroundColor" :stroke-width =" 1"
12391292 :r =" 3"
12401293 :filter =" !FINAL_CONFIG.useBlurOnHover || [null, undefined].includes(selectedSerie) || selectedSerie === i ? `` : `url(#blur_${uid})`"
1241- @click =" selectDatapoint(arc, i)"
1294+ @click =" selectDatapoint(arc, i)"
1295+ @mouseenter =" useTooltip({
1296+ datapoint: arc,
1297+ relativeIndex: i,
1298+ seriesIndex: arc.seriesIndex,
1299+ show: true
1300+ })"
1301+ @mouseleave =" handleDatapointLeave({ datapoint: arc, seriesIndex: arc.seriesIndex })"
12421302 :style =" {
12431303 transition: isFirstLoad || !FINAL_CONFIG.serieToggleAnimation.show ? 'none' : `all ${FINAL_CONFIG.serieToggleAnimation.durationMs}ms ease-in-out`
12441304 }"
@@ -1251,7 +1311,15 @@ defineExpose({
12511311 :fill =" FINAL_CONFIG.style.chart.layout.labels.percentage.color"
12521312 :font-size =" FINAL_CONFIG.style.chart.layout.labels.percentage.fontSize"
12531313 :style =" `font-weight:${FINAL_CONFIG.style.chart.layout.labels.percentage.bold ? 'bold' : ''}`"
1254- @click =" selectDatapoint(arc, i)" >
1314+ @click =" selectDatapoint(arc, i)"
1315+ @mouseenter =" useTooltip({
1316+ datapoint: arc,
1317+ relativeIndex: i,
1318+ seriesIndex: arc.seriesIndex,
1319+ show: true
1320+ })"
1321+ @mouseleave =" handleDatapointLeave({ datapoint: arc, seriesIndex: arc.seriesIndex })"
1322+ >
12551323 {{ displayArcPercentage(arc, noGhostDonut) }} {{
12561324 FINAL_CONFIG.style.chart.layout.labels.value.show ? `(${applyDataLabel(
12571325 FINAL_CONFIG.style.chart.layout.labels.value.formatter,
@@ -1271,7 +1339,15 @@ defineExpose({
12711339 :fill =" FINAL_CONFIG.style.chart.layout.labels.name.color"
12721340 :font-size =" FINAL_CONFIG.style.chart.layout.labels.name.fontSize"
12731341 :style =" `font-weight:${FINAL_CONFIG.style.chart.layout.labels.name.bold ? 'bold' : ''}`"
1274- @click =" selectDatapoint(arc, i)" >
1342+ @click =" selectDatapoint(arc, i)"
1343+ @mouseenter =" useTooltip({
1344+ datapoint: arc,
1345+ relativeIndex: i,
1346+ seriesIndex: arc.seriesIndex,
1347+ show: true
1348+ })"
1349+ @mouseleave =" handleDatapointLeave({ datapoint: arc, seriesIndex: arc.seriesIndex })"
1350+ >
12751351 {{ arc.name }}
12761352 </text >
12771353 </template >
@@ -1286,7 +1362,15 @@ defineExpose({
12861362 transition: isFirstLoad || !FINAL_CONFIG.serieToggleAnimation.show ? 'none' : `all ${FINAL_CONFIG.serieToggleAnimation.durationMs}ms ease-in-out`,
12871363 fontWeight: FINAL_CONFIG.style.chart.layout.labels.percentage.bold ? 'bold': 'normal'
12881364 }"
1289- @click =" selectDatapoint(arc, i)" >
1365+ @click =" selectDatapoint(arc, i)"
1366+ @mouseenter =" useTooltip({
1367+ datapoint: arc,
1368+ relativeIndex: i,
1369+ seriesIndex: arc.seriesIndex,
1370+ show: true
1371+ })"
1372+ @mouseleave =" handleDatapointLeave({ datapoint: arc, seriesIndex: arc.seriesIndex })"
1373+ >
12901374 {{ displayArcPercentage(arc, noGhostDonut) }} {{
12911375 FINAL_CONFIG.style.chart.layout.labels.value.show ? `(${applyDataLabel(
12921376 FINAL_CONFIG.style.chart.layout.labels.value.formatter,
@@ -1310,7 +1394,15 @@ defineExpose({
13101394 transition: isFirstLoad || !FINAL_CONFIG.serieToggleAnimation.show ? 'none' : `all ${FINAL_CONFIG.serieToggleAnimation.durationMs}ms ease-in-out`,
13111395 fontWeight: FINAL_CONFIG.style.chart.layout.labels.name.bold ? 'bold': 'normal'
13121396 }"
1313- @click =" selectDatapoint(arc, i)" >
1397+ @click =" selectDatapoint(arc, i)"
1398+ @mouseenter =" useTooltip({
1399+ datapoint: arc,
1400+ relativeIndex: i,
1401+ seriesIndex: arc.seriesIndex,
1402+ show: true
1403+ })"
1404+ @mouseleave =" handleDatapointLeave({ datapoint: arc, seriesIndex: arc.seriesIndex })"
1405+ >
13141406 {{ arc.name }}
13151407 </text >
13161408 </template >
0 commit comments