EventBus: Add ability to tag events with arbitrary classification meta (#82087)

This commit is contained in:
Leon Sorokin 2024-02-08 16:15:32 -06:00 committed by GitHub
parent 829672759c
commit 930c8c5aa3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 30 additions and 12 deletions

View File

@ -19,10 +19,22 @@ export abstract class BusEventBase implements BusEvent {
readonly payload?: any;
readonly origin?: EventBus;
/** @internal */
tags?: Set<string>;
constructor() {
//@ts-ignore
this.type = this.__proto__.constructor.type;
}
/**
* @internal
* Tag event for finer-grained filtering in subscribers
*/
setTags(tags: string[]) {
this.tags = new Set(tags);
return this;
}
}
/**

View File

@ -139,6 +139,11 @@ export class GraphNG extends Component<GraphNGProps, GraphNGState> {
}
handleCursorUpdate(evt: DataHoverEvent | LegacyGraphHoverEvent) {
// ignore uplot-emitted events, since we already use uPlot's sync
if (evt.tags?.has('uplot')) {
return;
}
const time = evt.payload?.point?.time;
const u = this.plotInstance.current;
if (u && time) {

View File

@ -583,7 +583,9 @@ export const preparePlotConfigBuilder: UPlotConfigPrepFn<{
data: frame,
};
const hoverEvent = new DataHoverEvent(payload);
const hoverEvent = new DataHoverEvent(payload).setTags(['uplot']);
const clearEvent = new DataHoverClearEvent().setTags(['uplot']);
cursor.sync = {
key: eventsScope,
filters: {
@ -594,9 +596,7 @@ export const preparePlotConfigBuilder: UPlotConfigPrepFn<{
payload.rowIndex = dataIdx;
if (x < 0 && y < 0) {
payload.point[xScaleUnit] = null;
payload.point[yScaleKey] = null;
eventBus.publish(new DataHoverClearEvent());
eventBus.publish(clearEvent);
} else {
// convert the points
payload.point[xScaleUnit] = src.posToVal(x, xScaleKey);

View File

@ -180,6 +180,9 @@ export const preparePlotConfigBuilder: UPlotConfigPrepFn<UPlotConfigOptions> = (
data: frame,
};
const hoverEvent = new DataHoverEvent(payload).setTags(['uplot']);
const clearEvent = new DataHoverClearEvent().setTags(['uplot']);
builder.addHook('init', coreConfig.init);
builder.addHook('drawClear', coreConfig.drawClear);
@ -293,14 +296,12 @@ export const preparePlotConfigBuilder: UPlotConfigPrepFn<UPlotConfigOptions> = (
}
payload.rowIndex = dataIdx;
if (x < 0 && y < 0) {
payload.point[xScaleUnit] = null;
payload.point[FIXED_UNIT] = null;
eventBus.publish(new DataHoverClearEvent());
eventBus.publish(clearEvent);
} else {
payload.point[xScaleUnit] = src.posToVal(x, xScaleKey);
payload.point.panelRelY = y > 0 ? y / h : 1; // used for old graph panel to position tooltip
payload.down = undefined;
eventBus.publish(new DataHoverEvent(payload));
eventBus.publish(hoverEvent);
}
return true;
},

View File

@ -172,7 +172,9 @@ export function prepConfig(opts: PrepConfigOpts) {
},
data: dataRef.current?.heatmap,
};
const hoverEvent = new DataHoverEvent(payload);
const hoverEvent = new DataHoverEvent(payload).setTags(['uplot']);
const clearEvent = new DataHoverClearEvent().setTags(['uplot']);
let pendingOnleave: ReturnType<typeof setTimeout> | 0;
@ -209,9 +211,7 @@ export function prepConfig(opts: PrepConfigOpts) {
if (!pendingOnleave) {
pendingOnleave = setTimeout(() => {
onhover(null);
payload.rowIndex = undefined;
payload.point[xScaleUnit] = null;
eventBus.publish(hoverEvent);
eventBus.publish(clearEvent);
}, 100);
}
}