bizcharts
Version: 
bizcharts
491 lines (489 loc) • 16.1 kB
TypeScript
/// <reference types="react" />
import { View, Chart } from '@antv/g2/lib/chart';
import { ErrorBoundaryProps } from 'react-error-boundary';
import { ViewPadding, ScaleOption, Datum, SizeAttrCallback, AdjustOption, ColorAttrCallback, ShapeAttrCallback, StyleOption, LooseObject, StyleCallback, GeometryTooltipOption, TooltipCallback, AnimateOption, LabelOption, GeometryLabelCfg, LabelCallback, StateOption } from '@antv/g2/lib/interface';
export * from '@antv/g2/lib/interface';
export { View, Chart };
export interface IEvent {
    target?: any;
    view?: View;
    gEvent?: any;
    event?: any;
    x?: number;
    y?: number;
    clientX?: number;
    clientY?: number;
    type?: string;
    [key: string]: any;
}
export type FieldString = string;
export type ColorString = string;
export type ShapeString = string;
/** [min: number, max: number] */
export type SizeRange = [number, number];
export interface IChartProps extends IViewProps {
    forceUpdate?: boolean;
    /** 指定 chart 绘制的 DOM,可以传入 DOM id,也可以直接传入 dom 实例。 */
    container?: HTMLElement;
    /** 图表宽度。 */
    width?: number;
    /** 当数据量过大的时候,可以手动关闭此选项,避免对比数据带来的性能开销 */
    notCompareData?: boolean;
    /** 图表高度。 */
    height?: number;
    /**
     * 图表是否自适应容器宽高,默认为 false,用户需要手动设置 width 和 height。
     * 当 `autoFit: true` 时,会自动取图表容器的宽高,如果用户设置了 height,那么会以用户设置的 height 为准。
     */
    autoFit?: boolean;
    /** 设置设备像素比,默认取浏览器的值 `window.devicePixelRatio`。 */
    pixelRatio?: number;
    /**
     * 设置图表的内边距,使用方式参考 CSS 盒模型。
     * 下图黄色区域即为 padding 的范围。
     * 
     *
     * @example
     * 1. padding: 20
     * 2. padding: [ 10, 30, 30 ]
     */
    padding?: ViewPadding;
    /**
     * 是否开启局部刷新,默认开启。
     */
    localRefresh?: boolean;
    /**
     * chart 是否可见,默认为 true,设置为 false 则会隐藏。
     */
    visible?: boolean;
    /**
     * 配置图表默认交互,仅支持字符串形式。
     */
    defaultInteractions?: string[];
    /** 是否对超出坐标系范围的 Geometry 进行剪切 */
    limitInPlot?: boolean;
    /** 主题 */
    theme?: object | string;
    pure?: boolean;
    onMousedown?: EventFunc;
    onMouseup?: EventFunc;
    onDblclick?: EventFunc;
    onMouseenter?: EventFunc;
    onMouseout?: EventFunc;
    onMouseover?: EventFunc;
    onMousemove?: EventFunc;
    onMouseleave?: EventFunc;
    onContextmenu?: EventFunc;
    onClick?: EventFunc;
    onDragstart?: EventFunc;
    onDrag?: EventFunc;
    onDragend?: EventFunc;
    onDragover?: EventFunc;
    onDragenter?: EventFunc;
    onDragleave?: EventFunc;
    onDrop?: EventFunc;
    onBeforerender?: EventFunc;
    onAfterrender?: EventFunc;
    onBeforepaint?: EventFunc;
    onAfterpaint?: EventFunc;
    onBeforechangedata?: EventFunc;
    onAfterchangedata?: EventFunc;
    onBeforeclear?: EventFunc;
    onAfterclear?: EventFunc;
    onBeforedestroy?: EventFunc;
    onTouchstart?: EventFunc;
    onTouchmove?: EventFunc;
    onTouchend?: EventFunc;
    events?: {
        [EventName: string]: EventFunc;
    };
    /**
     * 发生错误的时候显示的内容, errorContent api已调整,
     * 请使用 ErrorBoundaryProps
     * @example ErrorBoundaryProps={{FallbackComponent: error => <div>{error}</div>}}
    */
    errorContent?: React.ReactElement<unknown, string | React.FunctionComponent<{}>>;
    [key: string]: any;
    /**
     *  ErrorBoundary 使用的是 react-error-boundary, 可通过ErrorBoundaryProps透传其属性
     *  @example ErrorBoundaryProps={{FallbackComponent: error => <div>{error}</div>}}
     */
    ErrorBoundaryProps?: ErrorBoundaryProps;
}
/**
 * @interface IViewProps
 * @extends {React.ComponentPropsWithRef<any>}
 */
export interface IViewProps extends React.ComponentPropsWithRef<any> {
    /** 数据源配置。 */
    data?: any[];
    /** 列定义配置,用于配置数值的类型等,以 data 中的数据属性为 key。 */
    scale?: {
        [field: string]: ScaleOption;
    };
    /**
     * 设置图表的内边距,使用方式参考 CSS 盒模型。
     * @example
     * 1. padding: 20
     * 2. padding: [ 10, 30, 30 ]
     */
    padding?: ViewPadding;
    /** view 的绘制范围,起始点为左上角。 */
    region?: {
        start?: {
            x: number | string;
            y: number | string;
        };
        end?: {
            x: number | string;
            y: number | string;
        };
    };
    /**
    * @memberof IView
    * 设置数据筛选规则。
    *
    * ```ts
    * 3.x 写法
    * <View filter={[
    *   ['city', (value: any, datum: Datum) => value !== '杭州'],
    *   ['value', (value: any, datum: Datum) => value > 100]
    * ]} />
    *
    * <View filter={{
    *   'city': (value: any, datum: Datum) => value !== '杭州'],
    *   'value': (value: any, datum: Datum) => value > 100],
    * }} />
    *
    * // 删除 'city' 字段对应的筛选规则。
    * <View filter={{
    *  'city': null
    * }} />
    * ```
    *
    * @param filter [string, null | ((value: any, datum: Datum) => boolean)][] 或者 Record<string, (value: any, datum: Datum) => boolean>
    */
    filter?: [string, null | ((value: any, datum: Datum) => boolean)][] | Record<string, (value: any, datum: Datum) => boolean>;
    /** 其他 */
    [key: string]: any;
}
export interface IBaseGemoProps extends React.PropsWithRef<any> {
    /** 图形数据坐标 */
    position: string;
    /**
     * @example
     * ```typescript
     * // data: [{ x: 'A', y: 10, color: 'red' }, { x: 'B', y: 30, color: 'yellow' }]
     * <Geomy color={{
     *   fields: [ 'x' ],
     *   values: [ '#1890ff', '#5AD8A6' ],
     * }} />;
     *
     * // 使用 '#1890ff' 颜色渲染图形
     * <Geom color="#1890ff" />
     *
     * // 根据 x 字段的数据值进行颜色的映射,这时候会在内部调用默认的回调函数,读取默认提供的颜色进行数据值到颜色值的映射。
     * <Geom color="x" />
     *
     * // 将 'x' 字段的数据值映射至指定的颜色值 colors(可以是字符串也可以是数组),此时用于通常映射分类数据
     * <Geom color={['x', [ '#1890ff', '#5AD8A6' ]]} />
     *
     * // 使用回调函数进行颜色值的自定义;可以使用多个字段使用、*号连接
     * <Geom color={['x', (xVal) => {
     *   if (xVal === 'a') {
     *     return 'red';
     *   }
     *   return 'blue';
     * }]} />
     *
     * // 指定颜色的渐变路径,用于映射连续的数据
     * <Geom color={['x', '#BAE7FF-#1890FF-#0050B3']} />
     * ```
     * @type {(ColorString | [ FieldString, ColorString | ColorString[] | ColorAttrCallback ])}
     * @memberof IBaseGemo
     */
    color?: ColorString | FieldString | [FieldString, ColorString | ColorString[] | ColorAttrCallback];
    /**
     *
     * @example
     * ```typescript
     * // data: [{ x: 'A', y: 10, color: 'red' }, { x: 'B', y: 30, color: 'yellow' }]
     *
     * // 指定常量,将所有数据值映射到固定的 shape
     * <Geom shape="circle" />
     *
     * // 将指定的字段映射到内置的 shapes 数组中
     * <Geom shape="x" />
     *
     * // 将指定的字段映射到指定的 shapes 数组中
     * <Geom shape={['x', [ 'circle', 'diamond', 'square' ]]} />
     *
     * // 使用回调函数获取 shape,用于个性化的 shape 定制,可以根据单个或者多个字段确定
     * <Geom shape={[
     *   'x',
     *   (xVal) => {
     *     if (xVal === 'a') {
     *       return 'circle';
     *     }
     *     return 'diamond';
     *   }
     * ]} />
     * ```
     * @type {(ShapeString | FieldString | [ShapeString, ShapeString[] | ShapeAttrCallback])}
     * @memberof IBaseGemo
     */
    shape?: ShapeString | FieldString | [ShapeString, ShapeString[] | ShapeAttrCallback];
    /**
     *
     * @example
     * ```typescript
     * // data: [{ x: 'A', y: 10, color: 'red' }, { x: 'B', y: 30, color: 'yellow' }]
     *
     * // 直接指定像素大小
     * <Geom size={10} />
     *
     * // 指定映射到 size 的字段,使用内置的默认大小范围为 [1, 10]
     * <Geom size="x" />
     *
     * // 指定映射到 size 字段外,还提供了 size 的最大值和最小值范围
     * <Geom size={['x', [ 5, 30 ]]} />
     *
     * // 使用回调函数映射 size,用于个性化的 size 定制,可以使用多个字段进行映射
     * <Geom size={['x', (xVal) => {
     *   if (xVal === 'a') {
     *     return 10;
     *   }
     *   return 5;
     * }]} />
     * ```
     *
     * @type {( number | FieldString | [FieldString, SizeAttrCallback | SizeRange])}
     * @memberof IBaseGemo
     */
    size?: number | FieldString | [FieldString, SizeAttrCallback | SizeRange];
    /**
     * 设置数据调整方式。G2 目前内置了四种类型:
     * 1. dodge
     * 2. stack
     * 3. symmetric
     * 4. jitter
     *
     * **Tip**
     * + 对于 'dodge' 类型,可以额外进行如下属性的配置:
     * ```typescript
     * <Geom adjust={['dodge', {
     *   marginRatio: 0, // 取 0 到 1 范围的值(相对于每个柱子宽度),用于控制一个分组中柱子之间的间距
     *   dodgeBy: 'x', // 该属性只对 'dodge' 类型生效,声明以哪个数据字段为分组依据
     * }]}
     * ```
     *
     * + 对于 'stack' 类型,可以额外进行如下属性的配置:
     * ```typescript
     * <Geom adjust={{
     *   type: 'stack',
     *   reverseOrder: false, // 用于控制是否对数据进行反序操作
     * }} />
     * ```
     *
     * @example
     * ```typescript
     * <Geom adjust="stack" />
     *
     * <Geom adjust={{
     *   type: 'stack',
     *   reverseOrder: false,
     * }} />
     *
     * // 组合使用 adjust
     * <Geom adjust={[
     *   { type: 'stack' },
     *   { type: 'dodge', dodgeBy: 'x' },
     * ]} />
     * ```
     *
     * @type {('dodge' | 'stack' | 'symmetric' | 'jitter' | string | string[] | AdjustOption | AdjustOption[])}
     * @memberof IBaseGemo
     */
    adjust?: 'dodge' | 'stack' | 'symmetric' | 'jitter' | string | AdjustOption | AdjustOption[];
    /**
     *
     * 图形样式配置。
     *
     * @example
     * ```typescript
     * // 配置图形样式
     * <Geom style={{
     *   lineWidth: 2,
     *   stroke: '#1890ff',
     * }} />
     *
     * // 根据具体的数据进行详细配置
     * <Geom style={{
     *   fields: [ 'x', 'y' ], // 数据字段
     *   callback: (xVal, yVal) => {
     *     const style = { lineWidth: 2, stroke: '#1890ff' };
     *     if (xVal === 'a') {
     *       style.lineDash = [ 2, 2 ];
     *     }
     *     return style;
     *   },
     * }} />
     * ```
     * ```typescript
     * // 根据具体的数据进行详细配置 [FieldString, StyleCallback]
     * <Geom style={['x*y', (xVal, yVal) => {
     *   const style = { lineWidth: 2, stroke: '#1890ff' };
     *   if (xVal === 'a') {
     *     style.lineDash = [ 2, 2 ];
     *   }
     *   return style;
     * }]} />
     * ```
     *
     * @type {(StyleOption | LooseObject | [FieldString, StyleCallback])}
     * @memberof IBaseGemo
     */
    style?: StyleOption | LooseObject | [FieldString, StyleCallback];
    /**
     * 配置 Geometry 显示的 tooltip 内容。
     *
     * `tooltip={false}` 代表关闭 tooltip。
     * `tooltip={true}` 代表开启 tooltip。
     *
     * Geometry 默认允许 tooltip 展示,我们可以使用以下方法对 tooltip 的展示内容进行配置:
     *
     * @example
     * ```typescript
     * // data: [{x: 'a', y: 10}]
     * <Geom tooltip="x" />
     * ```
     *
     * ```typescript
     * <Geom tooltip={{
     *   fields: [ 'x', 'y' ],
     * }} />
     * ```
     * 方法同样支持数据映射及回调用法:
     *
     * @example
     * ```typescript
     * <Tooltip itemTpl="<li>{x}: {y}</li>" />
     *
     * <Line tooltip={{
     *     fields: [ 'x', 'y' ],
     *     callback: (x, y) => {
     *       return {
     *         x,
     *         y,
     *       };
     *     },
     *   }} />
     * // 等同于
     * <Line tooltip={['x*y', (x, y) => {
     *       return {
     *         x,
     *         y,
     *       };
     *     }]} />
     *
     * 其返回的值必须为对象,该值中的属性同 Tooltip 的 itemTpl 模板相对应,返回的变量可用于 itemTpl 的字符串模板。
     *
     *
     * @type {(GeometryTooltipOption | boolean | FieldString | [FieldString, TooltipCallback])}
     * @memberof IBaseGemo
     */
    tooltip?: GeometryTooltipOption | boolean | FieldString | [FieldString, TooltipCallback];
    /**
     * Geometry 动画配置。
     *
     * + `<Geom animate={false} />` 关闭动画
     * + `<Geom animate />` 开启动画,默认开启。
     *
     * 我们将动画分为四个场景:
     * 1. appear: 图表第一次加载时的入场动画;
     * 2. enter: 图表绘制完成,发生更新后,产生的新图形的进场动画;
     * 3. update: 图表绘制完成,数据发生变更后,有状态变更的图形的更新动画;
     * 4. leave: 图表绘制完成,数据发生变更后,被销毁图形的销毁动画。
     *
     * @example
     * ```typescript
     * <Geom animate={{
     *   enter: {
     *     duration: 1000, // enter 动画执行时间
     *   },
     *   leave: false, // 关闭 leave 销毁动画
     * }} />;
     * ```
     *
     *
     * @type {(AnimateOption | boolean)}
     * @memberof IBaseGemo
     */
    animate?: AnimateOption | boolean;
    /**
     *
     * Geometry label 配置。
     *
     * @example
     * ```ts
     * // data: [ {x: 1, y: 2, z: 'a'}, {x: 2, y: 2, z: 'b'} ]
     *
     * <Interval label="y" />
     *
  
     *
     * @type {(LabelOption | false | FieldString | [FieldString, GeometryLabelCfg | LabelCallback] | [FieldString, LabelCallback, GeometryLabelCfg])}
     * @memberof IBaseGemo
     */
    label?: LabelOption | false | FieldString | [FieldString, GeometryLabelCfg | LabelCallback] | [FieldString, LabelCallback, GeometryLabelCfg];
    /**
     *设置状态对应的样式。
     *
     * @example
     * ```ts
     * <Geom state={{
     *   selected: {
     *     animate: { duration: 100, easing: 'easeLinear' },
     *     style: {
     *       lineWidth: 2,
     *       stroke: '#000',
     *     },
     *   },
     * }} />
     * ```
     *
     * 如果图形 shape 是由多个 shape 组成,即为一个 G.Group 对象,那么针对 group 中的每个 shape,我们需要使用下列方式进行状态样式设置:
     * 如果我们为 group 中的每个 shape 设置了 'name' 属性(shape.set('name', 'xx')),则以 'name' 作为 key,否则默认以索引值(即 shape 的 添加顺序)为 key。
     *
     * ```ts
     * <Geom state={{
     *   selected: {
     *     style: {
     *       0: { lineWidth: 2 },
     *       1: { fillOpacity: 1 },
     *     }
     *   }
     * }} />
     * ```
     *
     * @type {StateOption}
     * @memberof IBaseGemo
     */
    state?: StateOption;
    /**
     * 用来设置默认选中的图形元素,或者做条件样式。
     * 在图表绘制后执行。
     * <Geom setElements={(elements) => {
     *   elements.forEach(ele => {
     *     const data = elements.data;
     *     if (data.id = 'xx') {
     *       ele.setState('selected', true); // 默认选中
     *     }
     *   })
     *  }} />
     * @type (elements:Element[]) => {}
     * @memberof IBaseGemoProps
     */
    setElements?: (elements: Element[]) => {};
    [key: string]: any;
}
export type EventFunc = (IEvent: any) => any;