"use strict"; import { chartExportOptions } from "./chartExport.mjs"; /** * Format a computed aggregation result to make it suitable for a column chart * @param {Array} calendarDatesMonthsStrArr An array of unique calendar dates strings (in "YYYY-MM-DD" fromat) or unique calendar months strings (in "YYYY-MM" format) * @param {Array} aggregatedValuesArr An array of aggregated values * @returns {Array} An array of formatted aggregation values suitable for use in a column chart */ const formatAggregationResultForColumnChart = function ( calendarDatesMonthsStrArr, aggregatedValuesArr ) { if (!calendarDatesMonthsStrArr || !aggregatedValuesArr) return; // Create an array of Unix timestamp strings const timestampsArr = calendarDatesMonthsStrArr.map((calendarStr) => new Date(calendarStr).getTime() ); // Combine timestamp and value pairs // The timestamps array and values array have same lengths, use one for looping return timestampsArr.map((timestamp, i) => [ timestamp, aggregatedValuesArr[i], ]); }; /** * Creates an options object for each series drawn in a column chart * @param {Array} formattedAggregatedResultForColumnChart An array of formatted aggregated result array(s) from one or more datastreams * @param {Array} phenomenonNamesArr An array of phenomenon name(s) * @param {Array} phenomenonSymbolsArr An array of phenomenon symbol(s) * @returns {Array} An array made up of series options object(s) */ const createSeriesOptionsForColumnChart = function ( formattedAggregatedResultForColumnChart, phenomenonNamesArr, phenomenonSymbolsArr ) { // Create an array of seriesOptions objects // Assumes that the observation array of arrays, phenomenon names array and phenomenon symbols array are of equal length // Use one of the arrays for looping return formattedAggregatedResultForColumnChart.map( (formattedAggResArray, i) => { return { name: `${phenomenonNamesArr[i]} (${phenomenonSymbolsArr[i]})`, data: formattedAggResArray, turboThreshold: Number.MAX_VALUE, // #3404, remove after 4.0.5 release }; } ); }; /** * Draw a column chart using Highcharts library * @param {Array} formattedAggResultArraysForColumnChart An array made up of formatted aggregated result array(s) suitable for use in a column chart * @param {Object} extractedFormattedDatastreamProperties An object that contains arrays of formatted Datastream properties * @returns {undefined} */ const drawColumnChartHighcharts = function ( formattedAggResultArraysForColumnChart, extractedFormattedDatastreamProperties ) { // Arrays of datastream properties const { datastreamNamesArr, phenomenonNamesArr, unitOfMeasurementSymbolsArr, } = extractedFormattedDatastreamProperties; const seriesOptionsArr = createSeriesOptionsForColumnChart( formattedAggResultArraysForColumnChart, phenomenonNamesArr, unitOfMeasurementSymbolsArr ); Highcharts.chart("chart-column", { chart: { type: "column", zoomType: "x", }, title: { text: "Monthly Average Rainfall", }, subtitle: { text: "Source: WorldClimate.com", }, xAxis: { type: "datetime", crosshair: true, }, yAxis: { min: 0, title: { text: "Rainfall (mm)", }, }, tooltip: { headerFormat: ` {point.key} `, pointFormat: ` `, footerFormat: `
{series.name}: {point.y:.1f} mm
`, shared: true, useHTML: true, }, plotOptions: { column: { pointPadding: 0.2, borderWidth: 0, }, }, exporting: chartExportOptions, series: seriesOptionsArr, }); }; export { formatAggregationResultForColumnChart, drawColumnChartHighcharts };