@antv/g2
Version:
the Grammar of Graphics in Javascript
91 lines (79 loc) • 2.17 kB
text/typescript
import { Coordinate } from '@antv/coord';
import { DisplayObject } from '@antv/g';
import { Scale, G2Theme, G2ViewDescriptor } from '../runtime';
import { hide, show } from '../utils/style';
import { Composition as Spec } from '../spec';
import { Node } from './node';
import { defineProps } from './define';
import { compositionProps } from './props';
import { PropsOf } from './types';
export interface CompositionNode<T = any>
extends PropsOf<
typeof compositionProps,
any, // todo Remove this when update types of Spec.
CompositionNode & T
> {}
export class CompositionNode extends Node<Spec & { [key: string]: any }> {
protected _key: string;
/**
* Change current node data and its children data.
*/
changeData(data: any) {
const chart = this.getRoot();
if (!chart) return;
this.attr('data', data);
if (this.children?.length) {
this.children.forEach((child) => {
child.attr('data', data);
});
}
return chart?.render();
}
/**
* Get view instance by key.
*/
getView(): G2ViewDescriptor {
const chart = this.getRoot();
const { views } = chart.getContext();
if (!views?.length) return undefined;
return views.find((view) => view.key === this._key);
}
getScale(): Record<string, Scale> {
return this.getView()?.scale;
}
getScaleByChannel(channel: string): Scale {
const scale = this.getScale();
if (scale) return scale[channel];
return;
}
getCoordinate(): Coordinate {
return this.getView()?.coordinate;
}
getTheme(): G2Theme {
return this.getView()?.theme;
}
getGroup(): DisplayObject {
const key = this._key;
if (!key) return undefined;
const chart = this.getRoot();
const chartGroup = chart.getContext().canvas.getRoot();
return chartGroup.getElementById(key);
}
/**
* Show the view.
*/
show() {
const group = this.getGroup();
if (!group) return;
!group.isVisible() && show(group);
}
/**
* Hide the view.
*/
hide() {
const group = this.getGroup();
if (!group) return;
group.isVisible() && hide(group);
}
}