Current File : /home/digitaw/www/wp-content/plugins/simple-history/js/simple-history-insights-sidebar.js
/**
 * JavaScript for Simple History Insights Sidebar Chart.
 *
 * Initializes Chart.js for the sidebar widget that displays
 * daily activity over the last 30 days.
 *
 * @param {jQuery} $ - jQuery instance.
 */
( function ( $ ) {
	$( function () {
		const ctx = $( '.SimpleHistory_SidebarChart_ChartCanvas' );

		if ( ! ctx.length ) {
			return;
		}

		const chartLabels = JSON.parse(
			$( '.SimpleHistory_SidebarChart_ChartLabels' ).val()
		);
		const chartLabelsToDates = JSON.parse(
			$( '.SimpleHistory_SidebarChart_ChartLabelsToDates' ).val()
		);
		const chartDatasetData = JSON.parse(
			$( '.SimpleHistory_SidebarChart_ChartDatasetData' ).val()
		);

		const color = getComputedStyle(
			document.documentElement
		).getPropertyValue( '--sh-color-blue' );

		// Create chart.
		const myChart = new window.Chart( ctx, {
			type: 'line',
			data: {
				labels: chartLabels,
				datasets: [
					{
						label: '',
						data: chartDatasetData,
						borderColor: color,
						backgroundColor: color,
						borderWidth: 2,
						pointRadius: 0,
					},
				],
			},
			options: {
				interaction: {
					intersect: false,
					mode: 'index',
				},
				scales: {
					y: {
						ticks: {
							beginAtZero: true,
						},
					},
					x: {
						display: false,
					},
				},
				plugins: {
					legend: {
						display: false,
					},
					// https://www.chartjs.org/docs/4.4.0/configuration/tooltip.html
					tooltip: {
						displayColors: false,
						callbacks: {
							label( context ) {
								const eventsCount = context.parsed.y;
								const label = `${ eventsCount } events`;
								return label;
							},
						},
					},
				},
				onClick: clickChart,
			},
		} );

		/**
		 * When chart is clicked determine what value/day was clicked
		 * and dispatch a custom event to the React app to handle the date filter.
		 *
		 * @param {Object} e - The click event object.
		 */
		function clickChart( e ) {
			// Get value of selected bar.
			// Use 'index' mode with intersect: false to match the tooltip behavior,
			// so clicking anywhere in the vertical area of a day will select that day.
			let label;
			const points = myChart.getElementsAtEventForMode(
				e,
				'index',
				{ intersect: false },
				true
			);
			if ( points.length ) {
				const firstPoint = points[ 0 ];
				// Label e.g. "Jun 25".
				label = myChart.data.labels[ firstPoint.index ];
			}

			// now we have the label which is like "July 23" or "23 juli" depending on language
			// look for that label value in chartLabelsToDates and there we get the date in format Y-m-d
			let labelDate;
			for ( const idx in chartLabelsToDates ) {
				if ( label === chartLabelsToDates[ idx ].label ) {
					labelDate = chartLabelsToDates[ idx ];
				}
			}

			if ( ! labelDate ) {
				return;
			}

			// Dispatch custom event for React app to handle the date filter.
			// The React app will listen for this event and update the date filter state.
			const event = new CustomEvent( 'SimpleHistory:chartDateClick', {
				detail: {
					// Date in Y-m-d format, e.g., "2024-10-05".
					date: labelDate.date,
				},
			} );

			window.dispatchEvent( event );
		}
	} );
} )( jQuery );