UNPKG

highcharts

Version:
266 lines (265 loc) 10.8 kB
/* * * * (c) 2009-2025 Øystein Moseng * * Default options for accessibility. * * License: www.highcharts.com/license * * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!! * * */ /* eslint-disable max-len */ /* * List of deprecated options: * * chart.description -> accessibility.description * chart.typeDescription -> accessibility.typeDescription * series.description -> series.accessibility.description * series.exposeElementToA11y -> series.accessibility.exposeAsGroupOnly * series.pointDescriptionFormatter -> * series.accessibility.pointDescriptionFormatter * series.accessibility.pointDescriptionFormatter -> * series.accessibility.point.descriptionFormatter * series.skipKeyboardNavigation -> * series.accessibility.keyboardNavigation.enabled * point.description -> point.accessibility.description !!!! WARNING: No longer deprecated and handled, removed for HC8. * axis.description -> axis.accessibility.description * * accessibility.pointDateFormat -> accessibility.point.dateFormat * accessibility.addTableShortcut -> Handled by screenReaderSection.beforeChartFormat * accessibility.pointDateFormatter -> accessibility.point.dateFormatter * accessibility.pointDescriptionFormatter -> accessibility.point.descriptionFormatter * accessibility.pointDescriptionThreshold -> accessibility.series.pointDescriptionEnabledThreshold * accessibility.pointNavigationThreshold -> accessibility.keyboardNavigation.seriesNavigation.pointNavigationEnabledThreshold * accessibility.pointValueDecimals -> accessibility.point.valueDecimals * accessibility.pointValuePrefix -> accessibility.point.valuePrefix * accessibility.pointValueSuffix -> accessibility.point.valueSuffix * accessibility.screenReaderSectionFormatter -> accessibility.screenReaderSection.beforeChartFormatter * accessibility.describeSingleSeries -> accessibility.series.describeSingleSeries * accessibility.seriesDescriptionFormatter -> accessibility.series.descriptionFormatter * accessibility.onTableAnchorClick -> accessibility.screenReaderSection.onViewDataTableClick * accessibility.axisRangeDateFormat -> accessibility.screenReaderSection.axisRangeDateFormat * accessibility.keyboardNavigation.skipNullPoints -> accessibility.keyboardNavigation.seriesNavigation.skipNullPoints * accessibility.keyboardNavigation.mode -> accessibility.keyboardNavigation.seriesNavigation.mode * * lang.accessibility.chartHeading -> no longer used, remove * lang.accessibility.legendItem -> lang.accessibility.legend.legendItem * lang.accessibility.legendLabel -> lang.accessibility.legend.legendLabel * lang.accessibility.mapZoomIn -> lang.accessibility.zoom.mapZoomIn * lang.accessibility.mapZoomOut -> lang.accessibility.zoom.mapZoomOut * lang.accessibility.resetZoomButton -> lang.accessibility.zoom.resetZoomButton * lang.accessibility.screenReaderRegionLabel -> lang.accessibility.screenReaderSection.beforeRegionLabel * lang.accessibility.rangeSelectorButton -> lang.accessibility.rangeSelector.buttonText * lang.accessibility.rangeSelectorMaxInput -> lang.accessibility.rangeSelector.maxInputLabel * lang.accessibility.rangeSelectorMinInput -> lang.accessibility.rangeSelector.minInputLabel * lang.accessibility.svgContainerEnd -> lang.accessibility.screenReaderSection.endOfChartMarker * lang.accessibility.viewAsDataTable -> lang.accessibility.table.viewAsDataTableButtonText * lang.accessibility.tableSummary -> lang.accessibility.table.tableSummary * */ /* eslint-enable max-len */ 'use strict'; import U from '../../Core/Utilities.js'; const { error, pick } = U; /* * * * Functions * * */ /* eslint-disable valid-jsdoc */ /** * Set a new option on a root prop, where the option is defined as an array of * suboptions. * @private * @param root * @param {Array<string>} optionAsArray * @param {*} val * @return {void} */ function traverseSetOption(root, optionAsArray, val) { let opt = root, prop, i = 0; for (; i < optionAsArray.length - 1; ++i) { prop = optionAsArray[i]; opt = opt[prop] = pick(opt[prop], {}); } opt[optionAsArray[optionAsArray.length - 1]] = val; } /** * If we have a clear root option node for old and new options and a mapping * between, we can use this generic function for the copy and warn logic. */ function deprecateFromOptionsMap(chart, rootOldAsArray, rootNewAsArray, mapToNewOptions) { /** * @private */ function getChildProp(root, propAsArray) { return propAsArray.reduce(function (acc, cur) { return acc[cur]; }, root); } const rootOld = getChildProp(chart.options, rootOldAsArray), rootNew = getChildProp(chart.options, rootNewAsArray); Object.keys(mapToNewOptions).forEach(function (oldOptionKey) { const val = rootOld[oldOptionKey]; if (typeof val !== 'undefined') { traverseSetOption(rootNew, mapToNewOptions[oldOptionKey], val); error(32, false, chart, { [rootOldAsArray.join('.') + '.' + oldOptionKey]: (rootNewAsArray.join('.') + '.' + mapToNewOptions[oldOptionKey].join('.')) }); } }); } /** * @private */ function copyDeprecatedChartOptions(chart) { const chartOptions = chart.options.chart, a11yOptions = chart.options.accessibility || {}; ['description', 'typeDescription'].forEach(function (prop) { if (chartOptions[prop]) { a11yOptions[prop] = chartOptions[prop]; error(32, false, chart, { [`chart.${prop}`]: `use accessibility.${prop}` }); } }); } /** * @private */ function copyDeprecatedAxisOptions(chart) { chart.axes.forEach(function (axis) { const opts = axis.options; if (opts && opts.description) { opts.accessibility = opts.accessibility || {}; opts.accessibility.description = opts.description; error(32, false, chart, { 'axis.description': 'use axis.accessibility.description' }); } }); } /** * @private */ function copyDeprecatedSeriesOptions(chart) { // Map of deprecated series options. New options are defined as // arrays of paths under series.options. const oldToNewSeriesOptions = { description: ['accessibility', 'description'], exposeElementToA11y: ['accessibility', 'exposeAsGroupOnly'], pointDescriptionFormatter: [ 'accessibility', 'point', 'descriptionFormatter' ], skipKeyboardNavigation: [ 'accessibility', 'keyboardNavigation', 'enabled' ], 'accessibility.pointDescriptionFormatter': [ 'accessibility', 'point', 'descriptionFormatter' ] }; chart.series.forEach(function (series) { // Handle series wide options Object.keys(oldToNewSeriesOptions).forEach(function (oldOption) { let optionVal = series.options[oldOption]; // Special case if (oldOption === 'accessibility.pointDescriptionFormatter') { optionVal = (series.options.accessibility && series.options.accessibility .pointDescriptionFormatter); } if (typeof optionVal !== 'undefined') { // Set the new option traverseSetOption(series.options, oldToNewSeriesOptions[oldOption], // Note that skipKeyboardNavigation has inverted option // value, since we set enabled rather than disabled oldOption === 'skipKeyboardNavigation' ? !optionVal : optionVal); error(32, false, chart, { [`series.${oldOption}`]: ('series.' + oldToNewSeriesOptions[oldOption].join('.')) }); } }); }); } /** * @private */ function copyDeprecatedTopLevelAccessibilityOptions(chart) { deprecateFromOptionsMap(chart, ['accessibility'], ['accessibility'], { pointDateFormat: ['point', 'dateFormat'], pointDateFormatter: ['point', 'dateFormatter'], pointDescriptionFormatter: ['point', 'descriptionFormatter'], pointDescriptionThreshold: [ 'series', 'pointDescriptionEnabledThreshold' ], pointNavigationThreshold: [ 'keyboardNavigation', 'seriesNavigation', 'pointNavigationEnabledThreshold' ], pointValueDecimals: ['point', 'valueDecimals'], pointValuePrefix: ['point', 'valuePrefix'], pointValueSuffix: ['point', 'valueSuffix'], screenReaderSectionFormatter: [ 'screenReaderSection', 'beforeChartFormatter' ], describeSingleSeries: ['series', 'describeSingleSeries'], seriesDescriptionFormatter: ['series', 'descriptionFormatter'], onTableAnchorClick: ['screenReaderSection', 'onViewDataTableClick'], axisRangeDateFormat: ['screenReaderSection', 'axisRangeDateFormat'] }); } /** * @private */ function copyDeprecatedKeyboardNavigationOptions(chart) { deprecateFromOptionsMap(chart, ['accessibility', 'keyboardNavigation'], ['accessibility', 'keyboardNavigation', 'seriesNavigation'], { skipNullPoints: ['skipNullPoints'], mode: ['mode'] }); } /** * @private */ function copyDeprecatedLangOptions(chart) { deprecateFromOptionsMap(chart, ['lang', 'accessibility'], ['lang', 'accessibility'], { legendItem: ['legend', 'legendItem'], legendLabel: ['legend', 'legendLabel'], mapZoomIn: ['zoom', 'mapZoomIn'], mapZoomOut: ['zoom', 'mapZoomOut'], resetZoomButton: ['zoom', 'resetZoomButton'], screenReaderRegionLabel: [ 'screenReaderSection', 'beforeRegionLabel' ], rangeSelectorButton: ['rangeSelector', 'buttonText'], rangeSelectorMaxInput: ['rangeSelector', 'maxInputLabel'], rangeSelectorMinInput: ['rangeSelector', 'minInputLabel'], svgContainerEnd: ['screenReaderSection', 'endOfChartMarker'], viewAsDataTable: ['table', 'viewAsDataTableButtonText'], tableSummary: ['table', 'tableSummary'] }); } /** * Copy options that are deprecated over to new options. Logs warnings to * console if deprecated options are used. * * @private */ function copyDeprecatedOptions(chart) { copyDeprecatedChartOptions(chart); copyDeprecatedAxisOptions(chart); if (chart.series) { copyDeprecatedSeriesOptions(chart); } copyDeprecatedTopLevelAccessibilityOptions(chart); copyDeprecatedKeyboardNavigationOptions(chart); copyDeprecatedLangOptions(chart); } /* * * * Default Export * * */ export default copyDeprecatedOptions;