@highcharts/dashboards
Version:
Highcharts Dashboards framework
204 lines (203 loc) • 7.9 kB
JavaScript
/* *
*
* (c) 2009-2024 Highsoft AS
*
* License: www.highcharts.com/license
*
* !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
*
* Authors:
* - Karol Kolodziej
*
* */
/* eslint-disable require-jsdoc, max-len */
'use strict';
import U from '../../../Core/Utilities.js';
const { addEvent, removeEvent } = U;
/* *
*
* Constants
*
* */
const configs = {
emitters: {
highlightEmitter: function () {
if (this.type !== 'DataGrid') {
return;
}
const { dataGrid, board } = this;
const highlightOptions = this.sync.syncConfig.highlight;
if (!board || !dataGrid || !highlightOptions.enabled) {
return;
}
const { dataCursor: cursor } = board;
const onDataGridHover = (e) => {
const table = this.connector && this.connector.table;
if (table) {
const row = e.row;
const cell = row.querySelector(`.highcharts-datagrid-cell[data-original-data="${row.dataset.rowXIndex}"]`);
cursor.emitCursor(table, {
type: 'position',
row: parseInt(row.dataset.rowIndex, 10),
column: cell ? cell.dataset.columnName : void 0,
state: 'dataGrid.hoverRow'
});
}
};
const onDataGridMouseOut = () => {
const table = this.connector && this.connector.table;
if (table) {
cursor.emitCursor(table, {
type: 'position',
state: 'dataGrid.hoverOut'
});
}
};
addEvent(dataGrid.container, 'dataGridHover', onDataGridHover);
addEvent(dataGrid.container, 'mouseout', onDataGridMouseOut);
// Return a function that calls the callbacks
return function () {
removeEvent(dataGrid.container, 'dataGridHover', onDataGridHover);
removeEvent(dataGrid.container, 'mouseout', onDataGridMouseOut);
};
}
},
handlers: {
highlightHandler: function () {
const { board } = this;
const highlightOptions = this.sync.syncConfig.highlight;
if (!highlightOptions.enabled) {
return;
}
const handleCursor = (e) => {
const cursor = e.cursor;
if (cursor.type === 'position') {
const { row } = cursor;
const { dataGrid } = this;
if (row !== void 0 && dataGrid) {
const highlightedDataRow = dataGrid.container
.querySelector(`.highcharts-datagrid-row[data-row-index="${row}"]`);
if (highlightedDataRow) {
dataGrid.toggleRowHighlight(highlightedDataRow);
dataGrid.hoveredRow = highlightedDataRow;
}
}
}
};
const handleCursorOut = () => {
const { dataGrid } = this;
if (dataGrid) {
dataGrid.toggleRowHighlight(void 0);
}
};
const registerCursorListeners = () => {
const { dataCursor: cursor } = board;
if (!cursor) {
return;
}
const table = this.connector && this.connector.table;
if (!table) {
return;
}
cursor.addListener(table.id, 'point.mouseOver', handleCursor);
cursor.addListener(table.id, 'point.mouseOut', handleCursorOut);
};
const unregisterCursorListeners = () => {
const cursor = board.dataCursor;
const table = this.connector && this.connector.table;
if (!table) {
return;
}
cursor.removeListener(table.id, 'point.mouseOver', handleCursor);
cursor.removeListener(table.id, 'point.mouseOut', handleCursorOut);
};
if (board) {
registerCursorListeners();
return unregisterCursorListeners;
}
},
extremesHandler: function () {
const { board } = this;
const handleChangeExtremes = (e) => {
const cursor = e.cursor;
if (cursor.type === 'position' &&
this.dataGrid &&
typeof cursor?.row === 'number') {
const { row } = cursor;
this.dataGrid.scrollToRow(row);
}
};
const registerCursorListeners = () => {
const { dataCursor: cursor } = board;
if (!cursor) {
return;
}
const table = this.connector && this.connector.table;
if (!table) {
return;
}
cursor.addListener(table.id, 'xAxis.extremes.min', handleChangeExtremes);
};
const unregisterCursorListeners = () => {
const table = this.connector && this.connector.table;
const { dataCursor: cursor } = board;
if (!table) {
return;
}
cursor.removeListener(table.id, 'xAxis.extremes.min', handleChangeExtremes);
};
if (board) {
registerCursorListeners();
return unregisterCursorListeners;
}
},
visibilityHandler: function () {
const component = this, { board } = component;
const handleVisibilityChange = (e) => {
const cursor = e.cursor, dataGrid = component.dataGrid;
if (!(dataGrid && cursor.type === 'position' && cursor.column)) {
return;
}
const columnName = cursor.column;
dataGrid.update({
columns: {
[columnName]: {
show: cursor.state !== 'series.hide'
}
}
});
};
const registerCursorListeners = () => {
const { dataCursor: cursor } = board;
if (!cursor) {
return;
}
const table = this.connector && this.connector.table;
if (!table) {
return;
}
cursor.addListener(table.id, 'series.show', handleVisibilityChange);
cursor.addListener(table.id, 'series.hide', handleVisibilityChange);
};
const unregisterCursorListeners = () => {
const table = this.connector && this.connector.table;
const { dataCursor: cursor } = board;
if (!table) {
return;
}
cursor.removeListener(table.id, 'series.show', handleVisibilityChange);
cursor.removeListener(table.id, 'series.hide', handleVisibilityChange);
};
if (board) {
registerCursorListeners();
return unregisterCursorListeners;
}
}
}
};
const defaults = {
highlight: { emitter: configs.emitters.highlightEmitter, handler: configs.handlers.highlightHandler },
extremes: { handler: configs.handlers.extremesHandler },
visibility: { handler: configs.handlers.visibilityHandler }
};
export default defaults;