100 lines
3.3 KiB
JavaScript
100 lines
3.3 KiB
JavaScript
|
/* *
|
||
|
*
|
||
|
* (c) 2009-2020 Øystein Moseng
|
||
|
*
|
||
|
* Keyboard navigation handler base class definition
|
||
|
*
|
||
|
* License: www.highcharts.com/license
|
||
|
*
|
||
|
* !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
|
||
|
*
|
||
|
* */
|
||
|
'use strict';
|
||
|
import U from '../../parts/Utilities.js';
|
||
|
var find = U.find;
|
||
|
/**
|
||
|
* Options for the keyboard navigation handler.
|
||
|
*
|
||
|
* @interface Highcharts.KeyboardNavigationHandlerOptionsObject
|
||
|
*/ /**
|
||
|
* An array containing pairs of an array of keycodes, mapped to a handler
|
||
|
* function. When the keycode is received, the handler is called with the
|
||
|
* keycode as parameter.
|
||
|
* @name Highcharts.KeyboardNavigationHandlerOptionsObject#keyCodeMap
|
||
|
* @type {Array<Array<Array<number>, Function>>}
|
||
|
*/ /**
|
||
|
* Function to run on initialization of module.
|
||
|
* @name Highcharts.KeyboardNavigationHandlerOptionsObject#init
|
||
|
* @type {Function}
|
||
|
*/ /**
|
||
|
* Function to run before moving to next/prev module. Receives moving direction
|
||
|
* as parameter: +1 for next, -1 for previous.
|
||
|
* @name Highcharts.KeyboardNavigationHandlerOptionsObject#terminate
|
||
|
* @type {Function|undefined}
|
||
|
*/ /**
|
||
|
* Function to run to validate module. Should return false if module should not
|
||
|
* run, true otherwise. Receives chart as parameter.
|
||
|
* @name Highcharts.KeyboardNavigationHandlerOptionsObject#validate
|
||
|
* @type {Function|undefined}
|
||
|
*/
|
||
|
/* eslint-disable no-invalid-this, valid-jsdoc */
|
||
|
/**
|
||
|
* Define a keyboard navigation handler for use with a
|
||
|
* Highcharts.AccessibilityComponent instance. This functions as an abstraction
|
||
|
* layer for keyboard navigation, and defines a map of keyCodes to handler
|
||
|
* functions.
|
||
|
*
|
||
|
* @requires module:modules/accessibility
|
||
|
*
|
||
|
* @sample highcharts/accessibility/custom-component
|
||
|
* Custom accessibility component
|
||
|
*
|
||
|
* @class
|
||
|
* @name Highcharts.KeyboardNavigationHandler
|
||
|
*
|
||
|
* @param {Highcharts.Chart} chart
|
||
|
* The chart this module should act on.
|
||
|
*
|
||
|
* @param {Highcharts.KeyboardNavigationHandlerOptionsObject} options
|
||
|
* Options for the keyboard navigation handler.
|
||
|
*/
|
||
|
function KeyboardNavigationHandler(chart, options) {
|
||
|
this.chart = chart;
|
||
|
this.keyCodeMap = options.keyCodeMap || [];
|
||
|
this.validate = options.validate;
|
||
|
this.init = options.init;
|
||
|
this.terminate = options.terminate;
|
||
|
// Response enum
|
||
|
this.response = {
|
||
|
success: 1,
|
||
|
prev: 2,
|
||
|
next: 3,
|
||
|
noHandler: 4,
|
||
|
fail: 5 // Handler failed
|
||
|
};
|
||
|
}
|
||
|
KeyboardNavigationHandler.prototype = {
|
||
|
/**
|
||
|
* Find handler function(s) for key code in the keyCodeMap and run it.
|
||
|
*
|
||
|
* @function KeyboardNavigationHandler#run
|
||
|
* @param {global.KeyboardEvent} e
|
||
|
* @return {number} Returns a response code indicating whether the run was
|
||
|
* a success/fail/unhandled, or if we should move to next/prev module.
|
||
|
*/
|
||
|
run: function (e) {
|
||
|
var keyCode = e.which || e.keyCode, response = this.response.noHandler, handlerCodeSet = find(this.keyCodeMap, function (codeSet) {
|
||
|
return codeSet[0].indexOf(keyCode) > -1;
|
||
|
});
|
||
|
if (handlerCodeSet) {
|
||
|
response = handlerCodeSet[1].call(this, keyCode, e);
|
||
|
}
|
||
|
else if (keyCode === 9) {
|
||
|
// Default tab handler, move to next/prev module
|
||
|
response = this.response[e.shiftKey ? 'prev' : 'next'];
|
||
|
}
|
||
|
return response;
|
||
|
}
|
||
|
};
|
||
|
export default KeyboardNavigationHandler;
|