import { Options, TickOrientation, TimeFormat, BrushOrientation, AxisFormat, CrosshairOrientation, KeyEvent, PanOrientation, ScrollPanOrientation, ScrollPanDirection, GridOptions, AxesOptions, CrosshairOptions, Margin } from '../types'; import lodashDefaultsDeep from 'lodash/defaultsDeep'; import lodashMap from 'lodash/map'; import lodashCloneDeep from 'lodash/cloneDeep'; import has from 'lodash/has'; const DEFAULT_TICK_COUNT = 4; const DEFAULT_SCROLL_PAN_STEP = 50; const DEFAULT_GRID_TICK_COUNT = 5; const DEFAULT_GRID_OPTIONS: GridOptions = { x: { enabled: true, ticksCount: DEFAULT_GRID_TICK_COUNT, }, y: { enabled: true, ticksCount: DEFAULT_GRID_TICK_COUNT, }, } const DEFAULT_AXES_OPTIONS: AxesOptions = { x: { isActive: true, ticksCount: DEFAULT_TICK_COUNT, format: AxisFormat.TIME }, y: { isActive: true, ticksCount: DEFAULT_TICK_COUNT, format: AxisFormat.NUMERIC }, y1: { isActive: false, ticksCount: DEFAULT_TICK_COUNT, format: AxisFormat.NUMERIC } } const DEFAULT_CROSSHAIR_OPTIONS = { orientation: CrosshairOrientation.VERTICAL, color: 'gray', } const DEFAULT_OPTIONS: Options = { zoomEvents: { mouse: { zoom: { isActive: true, keyEvent: KeyEvent.MAIN, orientation: BrushOrientation.HORIZONTAL }, pan: { isActive: true, keyEvent: KeyEvent.SHIFT, orientation: PanOrientation.HORIZONTAL }, doubleClick: { isActive: true, keyEvent: KeyEvent.MAIN, }, }, scroll: { zoom: { isActive: true, keyEvent: KeyEvent.MAIN, orientation: PanOrientation.BOTH, }, pan: { isActive: false, keyEvent: KeyEvent.SHIFT, panStep: DEFAULT_SCROLL_PAN_STEP, orientation: ScrollPanOrientation.HORIZONTAL, direction: ScrollPanDirection.BOTH, }, }, }, axis: DEFAULT_AXES_OPTIONS, grid: DEFAULT_GRID_OPTIONS, crosshair: DEFAULT_CROSSHAIR_OPTIONS, renderLegend: true, // remove options below renderTicksfromTimestamps: false, timeInterval: { timeFormat: TimeFormat.MINUTE }, } export class CoreOptions { _options: O; _defaults: Options = DEFAULT_OPTIONS; constructor(options: O) { this.setOptions(options); } public updateOptions(options: O): void { this.setOptions(options); } protected setOptions(options: O): void { this._options = lodashDefaultsDeep(lodashCloneDeep(options), this._defaults); } get allOptions(): O { return this._options; } get grid(): GridOptions { return this._options.grid; } get axis(): AxesOptions { return this._options.axis; } get crosshair(): CrosshairOptions { return this._options.crosshair; } get margin(): Margin { return this._options.margin; } // event callbacks callbackRenderStart(): void { if(has(this._options.eventsCallbacks, 'renderStart')) { this._options.eventsCallbacks.renderStart(); } } callbackRenderEnd(): void { if(has(this._options.eventsCallbacks, 'renderEnd')) { this._options.eventsCallbacks.renderStart(); } } callbackLegendClick(idx: number): void { if(has(this._options.eventsCallbacks, 'onLegendClick')) { this._options.eventsCallbacks.onLegendClick(idx); } } callbackLegendLabelClick(idx: number): void { if(has(this._options.eventsCallbacks, 'onLegendLabelClick')) { this._options.eventsCallbacks.onLegendLabelClick(idx); } } }