billboard.js
Version:
Re-usable easy interface JavaScript chart library, based on D3 v4+
1,381 lines (1,194 loc) • 37.3 kB
TypeScript
/**
* Copyright (c) 2017 ~ present NAVER Corp.
* billboard.js project is licensed under the MIT license
*/
import {Axis} from "./axis";
import {ChartTypes, d3Selection, DataItem, PrimitiveArray} from "./types";
import {Chart} from "./chart";
import {IArcData, IData, IDataPoint, IDataRow} from "../src/ChartInternal/data/IData";
import {
ArcOptions,
AreaOptions,
BarOptions,
BubbleOptions,
CandlestickOptions,
DonutOptions,
FunnelOptions,
GaugeOptions,
LineOptions,
PieOptions,
PolarOptions,
RadarOptions,
RadialGradientOptions,
ScatterOptions,
SplineOptions,
TreemapOptions
} from "./options.shape";
export type FormatFunction = (
this: Chart,
v: any,
id: string,
i: number,
texts: d3Selection
) => string;
export type PositionFunction = (
this: Chart,
type: "x" | "y",
v: number,
id: string,
i: number,
texts: d3Selection
) => number;
export interface ChartOptions {
/**
* Specify the CSS selector or the element which the chart will be set to. D3 selection object can be specified also.
* If other chart is set already, it will be replaced with the new one (only one chart can be set in one element).
* - **NOTE:** In case of element doesn't exist or not specified, will add a `<div>` element to the body.
*/
bindto?: string | HTMLElement | d3Selection | null | {
/**
* Specify the element where chart will be drawn.
*/
element?: string | HTMLElement | d3Selection;
/**
* Specify the class name of bind element.
* NOTE: When class name isn't bb, then you also need to update the default CSS to be rendered correctly.
*/
classname?: string;
};
/**
* Set chart background.
*/
background?: {
/**
* Specify the class name for background element.
*/
class?: string;
/**
* Specify the fill color for background element. (NOTE: Will be ignored if `imgUrl` option is set.)
*/
color?: string;
/**
* Specify the image url string for background.
*/
imgUrl?: string;
};
boost?: {
/**
* Avoid setting inline styles for each shape elements.
* - **NOTE:**
* - Will append <style> to the head tag and will add shpes' CSS rules dynamically.
* - For now, covers colors related properties (fill, stroke, etc.) only.
*/
useCssRule?: boolean;
/**
* Use Web Worker as possible for processing.
* - **NOTE:**
* - For now, only applies for data conversion at the initial time.
* - As of Web Worker's async nature, handling chart instance synchrously is not recommended.
*/
useWorker?: boolean;
};
size?: {
/**
* The desired width of the chart element.
* If this option is not specified, the width of the chart will be calculated by the size of the parent element it's appended to.
* Note: This option should be specified if possible because it can improve its performance because some size calculations will be skipped by an explicit value.
*/
width?: number;
/**
* The desired height of the chart element.
* If this option is not specified, the height of the chart will be calculated by the size of the parent element it's appended to.
*/
height?: number;
};
svg?: {
/**
* Set svg element's class name
*/
classname?: string;
};
/**
* Set padding of chart, and accepts object or boolean type.
* - `Object`: Specify each side's padding.
* - `false`: Remove padding completely and make shape to fully occupy the container element.
* - In this case, axes and subchart will be hidden.
* - To adjust some padding from this state, use `axis.[x|y].padding` option.
*/
padding?: boolean | {
/**
* Padding mode
* - `"fit"`: Reduce padding as much as possible to make chart fit to the container element for chart types w/axis.<br>When specified, all padding values will be relative from fitted value.
*/
mode?: "fit";
/**
* The padding on the top of the chart.
*/
top?: number;
/**
* The padding on the right of the chart.
*/
right?: number;
/**
* The padding on the bottom of the chart.
*/
bottom?: number;
/**
* The padding on the left of the chart.
*/
left?: number;
};
resize?: {
/**
* Indicate if the chart should automatically get resized when the window gets resized.
* - **NOTE:** Available options
* - true: Enables automatic resize.
* - false: Disables automatic resize.
* - "parent": Enables automatic resize when the parent node is resized.
* - "viewBox": Enables automatic resize, and size will be fixed based on the viewbox.
*/
auto?: boolean | "parent" | "viewBox";
/**
* Set resize timer option.
* - **NOTE:**
* - The resize function will be called using: true - `setTimeout()`, false - `requestIdleCallback()`.
* - Given number(delay in ms) value, resize function will be triggered using `setTimer()` with given delay.
*/
timer?: boolean | number;
};
color?: {
/**
* Set custom color pattern.
*
* Passing 'null' will not set a color for these elements, which requires the usage of custom CSS-based theming to work.
*/
pattern?: Array<(string|null)>;
/**
* color threshold for gauge and tooltip color
*/
threshold?: {
/**
* If set to value, the threshold will be based on the data value.
* Otherwise it'll be based on equation of the threshold.max option value.
*/
unit?: string;
/**
* Threshold values for each steps
*/
values?: number[];
/**
* The base value to determine threshold step value condition.
* When the given value is 15 and max 10, then the value for threshold is 15*100/10
*/
max?: number;
};
/**
* if defined, allows use svg's patterns to fill data area. It should return an array of SVGPatternElement.
* - NOTE: The pattern element's id will be defined as bb-colorize-pattern-$COLOR-VALUE.
* ex. When color pattern value is ['red', '#fff'] and defined 2 patterns,then ids for pattern elements are:
* - bb-colorize-pattern-red
* - bb-colorize-pattern-fff
*/
tiles?: (this: Chart) => SVGPathElement[];
/**
* Set the color value for each data point when mouse/touch onover event occurs.
*/
onover?: string | { [key: string]: string } | ((this: Chart, d: DataItem) => string);
};
interaction?: {
/**
* Indicate if the chart should have interactions.
* If false is set, all of interactions (showing/hiding tooltip, selection, mouse events, etc) will be disabled.
*/
enabled?: boolean;
/**
* Make brighter for the selected area (ex. 'pie' type data selected area)
*/
brighten?: boolean;
inputType?: {
/**
* enable or disable mouse interaction
*/
mouse?: boolean;
/**
* enable or disable touch interaction
*/
touch?: boolean | {
/**
* enable or disable to call event.preventDefault on touchstart & touchmove event.
* It's usually used to prevent document scrolling.
*/
preventDefault?: boolean | number;
};
},
/**
* Enable or disable "onout" event.
* When is disabled, defocus(hiding tooltip, focused gridline, etc.) event won't work.
*/
onout?: boolean;
};
transition?: {
/**
* Set duration of transition (in milliseconds) for chart animation.
* Note: If 0 or null set, transition will be skipped. So, this makes initial rendering faster especially in case you have a lot of data.
*/
duration?: number;
};
data?: Data;
axis?: Axis;
grid?: Grid;
/**
* Show rectangles inside the chart.
* This option accepts array including object that has axis, start, end and class. The keys start, end and class are optional.
* axis must be x, y or y2. start and end should be the value where regions start and end. If not specified, the edge values will be used.
* If timeseries x axis, date string, Date object and unixtime integer can be used. If class is set, the region element will have it as class.
*/
regions?: RegionOptions[];
legend?: LegendOptions;
tooltip?: TooltipOptions;
subchart?: SubchartOptions;
zoom?: ZoomOptions;
point?: PointOptions;
arc?: ArcOptions;
area?: AreaOptions;
bar?: BarOptions;
bubble?: BubbleOptions;
candlestick?: CandlestickOptions;
donut?: DonutOptions;
funnel?: FunnelOptions;
gauge?: GaugeOptions;
line?: LineOptions;
polar?: PolarOptions;
pie?: PieOptions;
radar?: RadarOptions;
scatter?: ScatterOptions;
spline?: SplineOptions;
treemap?: TreemapOptions;
/**
* Set a callback to execute when the chart is initialized.
*/
oninit?(this: Chart): void;
/**
* Set a callback to execute after the chart is initialized
*/
onafterinit?(this: Chart): void;
/**
* Set a callback to execute before the chart is initialized
*/
onbeforeinit?(this: Chart): void;
/**
* Set a callback which is executed when the chart is rendered. Basically, this callback will be called in each time when the chart is redrawed.
*/
onrendered?(this: Chart): void;
/**
* Set a callback to execute when the chart is clicked.
*/
onclick?(this: Chart, event: Event): void;
/**
* Set a callback to execute when mouse/touch enters the chart.
*/
onover?(this: Chart, event: Event): void;
/**
* Set a callback to execute when mouse/touch leaves the chart.
*/
onout?(this: Chart, event: Event): void;
/**
* Set a callback to execute when user resizes the screen.
*/
onresize?(this: Chart): void;
/**
* Set a callback to execute when screen resize finished.
*/
onresized?(this: Chart): void;
/**
* Set 'clip-path' attribute for chart element.
* When is false, chart node element is positioned after the axis node in DOM tree hierarchy.
* Is to make chart element positioned over axis element.
*/
clipPath?: boolean;
/**
* Set plugins
*/
plugins?: Array<InstanceType<any>>;
/**
* Control the render timing
*/
render?: {
/**
* Make to not render at initialization (enabled by default when bind element's visibility is hidden).
*/
lazy?: boolean;
/**
* Observe bind element's visibility(`display` or `visiblity` inline css property or class value) & render when is visible automatically (for IEs, only works IE11+).
* When set to **false**, call [`.flush()`](./Chart.html#flush) to render.
*/
observe?: boolean;
};
title?: {
/**
* Set the title text.
* If contains \n, it's used as line break allowing multiline title.
*/
text?: string;
padding?: {
/**
* Top padding value.
*/
top?: number;
/**
* Bottom padding value.
*/
bottom?: number;
/**
* Right padding value.
*/
right?: number;
/**
* Left padding value.
*/
left?: number;
};
/**
* Set the position. Default value is 'center'
*/
position?: "center" | "right" | "left";
};
}
export interface RegionOptions {
axis?: "x" | "y" | "y2";
start?: string | number | Date;
end?: string | number | Date;
class?: string;
label?: {
text?: string;
x?: number;
y?: number;
center?: "x" | "y" | "xy" | false;
color?: string;
rotated?: boolean;
}
}
export interface LegendOptions {
/**
* Show or hide legend.
*/
show?: boolean;
/**
* Hide legend
* If true given, all legend will be hidden. If string or array given, only the legend that has the id will be hidden.
*/
hide?: boolean | string[] | string;
/**
* Set to all items have same width size.
*/
equally?: boolean;
/**
* Change the position of legend.
* Currently bottom, right and inset are supported.
*/
position?: "bottom" | "right" | "inset";
/**
* Change inset legend attributes.
* This option accepts object that has the keys anchor, x, y and step.
* - anchor: decides the position of the legend. These anchors are available: top-left, top-right, bottom-left, bottom-right
* - x and y: set the position of the legend based on the anchor.
* - step: defines the max step the lagend has (e.g. If 2 set and legend has 3 legend item, the legend 2 columns).
*/
inset?: {
anchor?: "top-left" | "top-right" | "bottom-left" | "bottom-right";
x?: number;
y?: number;
step?: number;
};
item?: {
/**
* Tile settings for legend color display.
*/
tile?: {
/**
* Set width for 'rectangle' legend item tile element.
*/
width?: number;
/**
* Set height for 'rectangle' legend item tile element.
*/
height?: number;
/**
* Set legend item shape type.
*/
type?: "circle" | "rectangle";
/**
* Set the radius for 'circle' legend item tile type.
*/
r?: number;
};
/**
* Set legend item interaction.
* - **NOTE:**
* - This setting will not have effect on `.toggle()` method.
* - `legend.item.onXXX` listener options will work if set, regardless of this option value.
*/
interaction?: boolean | {
/**
* Set legend item to interact on double click.
* - **NOTE:**
* - Double clicking will make focused clicked dataseries only, hiding all others.
* - for single click case, `click + altKey(Win)/optionKey(Mac OS)` to have same effect.
* - To return initial state(which all dataseries are showing), double click current focused legend item again.
* - for single click case, `click + altKey(Win)/optionKey(Mac OS)` to have same effect.
* - In this case, default `click` interaction will be disabled.
*/
dblclick?: boolean;
};
/**
* Set click event handler to the legend item.
* - **NOTE:**
* - When set, default `click` interaction will be disabled.
* - When `interaction.dblclick=true` is set, will be called on double click.
*/
onclick?(this: Chart, id: string, visible: boolean): void;
/**
* Set mouseover event handler to the legend item.
* - **NOTE:** When set, default `mouseover` interaction will be disabled.
*/
onover?(this: Chart, id: string, visible: boolean): void;
/**
* Set mouseout event handler to the legend item.
* - **NOTE:** When set, default `mouseout` interaction will be disabled.
*/
onout?(this: Chart, id: string, visible: boolean): void;
};
/**
* Set legend templates
*/
contents?: {
/**
* Set CSS selector or element reference to bind legend items.
*/
bindto?: string | HTMLElement;
/**
* Set item's template.
* If set string value, within template the 'color' and 'title' can be replaced using template-like syntax string:
* {=COLOR}: data color value
* {=TITLE}: data title value
* If set function value, will pass following arguments to the given function:
* title {String}: data's id value
* color {String}: color string
* data {Array}: data array
*/
template?: ((this: Chart, title: string, color: string, data: DataItem[]) => void) | string;
};
/**
* Padding between legend elements.
*/
padding?: number;
/**
* Set formatter function for legend text.
*/
format?: (id: string, dataId?: string) => string;
/**
* Show full legend text value using system tooltip(via 'title' element).
*/
tooltip?: boolean;
/**
* Whether to use custom points in legend.
*/
usePoint?: boolean;
}
export interface TooltipOptions {
/**
* Show or hide tooltip.
*/
show?: boolean;
/**
* Make tooltip keep showing not hiding on interaction.
*/
doNotHide?: boolean;
/**
* Set if tooltip is grouped or not for the data points.
*/
grouped?: boolean;
format?: {
/**
* Set format for the title of tooltip. Specified function receives x of the data point to show.
*/
title?(this: Chart, x: any): string;
/**
* Set format for the name of each data in tooltip.
* Specified function receives name, ratio, id and index of the data point to show.
* ratio will be undefined if the chart is not donut/pie/gauge.
*/
name?(this: Chart, name: string, ratio: number, id: string, index: number): string;
/**
* Set format for the value of each data in tooltip. If undefined returned, the row of that value will be skipped to be called.
* - Will pass following arguments to the given function:
* - `value {string}`: Value of the data point
* - `ratio {number}`: Ratio of the data point in the `pie/donut/gauge` and `area/bar` when contains grouped data. Otherwise is `undefined`.
* - `id {string}`: id of the data point
* - `index {number}`: Index of the data point
*/
value?(this: Chart, value: number, ratio: number | undefined, id: string, index: number): string;
};
/**
* Set tooltip values order
* Available Values: desc, asc, any[], function (data1, data2) { ... }, null
*/
order?: string | any[] | ((this: Chart, data1: any, data2: any) => number) | null;
/**
* Set custom position function for the tooltip.
* This option can be used to modify the tooltip position by returning object that has top and left.
*/
position?: ((
this: Chart,
data: any,
width: number,
height: number,
element: any,
pos: {
x: number;
y: number;
xAxis?: number;
yAxis?: number | ((value: number, id?: string, axisId?: string) => number);
}
) => { top: number; left: number });
/**
* Set custom HTML for the tooltip.
* Specified function receives data, defaultTitleFormat, defaultValueFormat and color of the data point to show.
* If tooltip.grouped is true, data includes multiple data points.
*/
contents?: ((
this: Chart,
data: IDataRow[],
defaultTitleFormat: (x: Date|number|string) => number|string,
defaultValueFormat: (value: number, ratio: number|undefined, id: string) => number|string,
color: (d: IDataRow|IArcData|string) => string
) => string) | {
/**
* Set CSS selector or element reference to bind tooltip.
*/
bindto?: string | HTMLElement;
/**
* Within template, below syntax will be replaced using template-like syntax string:
* - {{ ... }}: the doubly curly brackets indicate loop block for data rows
* - {=CLASS_TOOLTIP}: default tooltip class name `bb-tooltip`.
* - {=CLASS_TOOLTIP_NAME}: default tooltip data class name (ex. `bb-tooltip-name-data1`)
* - {=TITLE}: title value
* - {=COLOR}: data color
* - {=VALUE}: data value
*/
template?: string;
/**
* Set additional text content within data loop, using template syntax.
* - NOTE: It should contain `{ key: Array, ... }` value
* - 'key' name is used as substitution within template as '{=KEY}'
* - The value array length should match with the data length
*/
text?: { [key: string]: string[] | number[] }
};
init?: {
/**
* Show tooltip at the initialization.
*/
show?: boolean;
/**
* Set x Axis index to be shown at the initialization.
*/
x?: number | string;
/**
* Set the position of tooltip at the initialization.
*/
position?: {
top?: number | string;
left?: number | string;
}
};
/**
* Set a callback that will be invoked before the tooltip is shown.
*/
onshow?(this: Chart, selectedData: DataItem[]): void;
/**
* Set a callback that will be invoked after the tooltip is shown
*/
onshown?(this: Chart, selectedData: DataItem[]): void;
/**
* Set a callback that will be invoked before the tooltip is hidden.
*/
onhide?(this: Chart, selectedData: DataItem[]): void;
/**
* Set a callback that will be invoked after the tooltip is hidden.
*/
onhidden?(this: Chart, selectedData: DataItem[]): void;
/**
* Set if tooltips on all visible charts with like x points are shown together when one is shown.
*/
linked?: boolean | {
/**
* Groping name for linked tooltip.
* If specified, linked tooltip will be groped interacting to be worked only with the same name.
*/
name?: string;
};
}
export interface SubchartOptions {
/**
* Show sub chart on the bottom of the chart.
*/
show?: boolean;
/**
* Show sub chart's handle.
*/
showHandle?: boolean;
size?: {
/**
* Change the height of the subchart.
*/
height: number;
};
axis?: {
x?: {
/**
* Show or hide x axis.
*/
show?: boolean;
tick?: {
/**
* Use custom format for x axis ticks - see 'axis.x.tick.format' option for details.
*/
format?: string
| ((this: Chart, x: Date) => string | number)
| ((this: Chart, index: number, categoryName: string) => string);
/**
* Show or hide x axis tick line.
*/
show?: boolean;
text?: {
/**
* Show or hide x axis tick text.
*/
show?: boolean;
/**
* * Set the first/last axis tick text to be positioned inside of the chart on non-rotated axis.
*/
inner?: boolean | {
first?: boolean;
last?: boolean;
}
};
};
};
};
init?: {
/**
* Set initial selection domain range.
*/
range?: [number, number];
};
/**
* Set callback for brush event.
* Specified function receives the current zoomed x domain.
*/
onbrush?(this: Chart, domain: any): void;
}
export interface ZoomOptions {
/**
* Enable zooming.
*/
enabled?: boolean;
/**
* Set zoom interaction type.
*/
type?: "wheel" | "drag";
/**
* Enable to rescale after zooming.
* If true set, y domain will be updated according to the zoomed region.
*/
rescale?: boolean;
/**
* Change zoom extent.
*/
extent?: [number, number];
x?: {
/**
* Set x Axis minimum zoom range
*/
min?: number | Date;
/**
* Set x Axis maximum zoom range
*/
max?: number | Date;
};
/**
* Set callback that is called when zooming starts.
* Specified function receives the zoom event.
*/
onzoomstart?(this: Chart, event: Event): void;
/**
* Set callback that is called when the chart is zooming.
* Specified function receives the zoomed domain.
*/
onzoom?(this: Chart, domain: any): void;
/**
* Set callback that is called when zooming ends.
* Specified function receives the zoomed domain.
*/
onzoomend?(this: Chart, domain: any): void;
/**
* Set to display zoom reset button for 'drag' type zoom
*/
resetButton?: boolean | {
/**
* Set callback when clicks the reset button. The callback will receive reset button element reference as argument.
*/
onclick?(this: Chart, button: HTMLElement): void;
/**
* Text value for zoom reset button.
*/
text?: string;
};
}
export interface PointOptions {
/**
* Whether to show each point in line.
*/
show?: boolean;
/**
* The radius size of each point.
*/
r?: number | ((this: Chart, d: DataItem) => number);
focus?: {
expand?: {
/**
* Whether to expand each point on focus.
*/
enabled?: boolean;
/**
* The radius size of each point on focus.
*/
r?: number;
};
/**
* Show point only when is focused.
*/
only?: boolean;
};
/**
* Set point opacity value.
*/
opacity?: number | null;
/**
* Set the radial gradient on point.
*/
radialGradient?: RadialGradientOptions;
select?: {
/**
* The radius size of each point on selected.
*/
r?: number;
};
/**
* The senstivity value for interaction boundary.
*
* - **Available Values:**
* - {number}: Absolute sensitivity value which is the distance from the data point in pixel.
* - "radius": sensitivity based on point's radius
* - Function: callback for each point to determine the sensitivity
*/
sensitivity?: number | "radius" | ((d: IDataPoint) => number);
/**
* The type of point to be drawn
* - NOTE: If chart has 'bubble' type, only circle can be used.
* For IE, non circle point expansions are not supported due to lack of transform support.
*
* - Available Values:
* - circle
* - rectangle
*/
type?: string;
/**
* The type of point or svg shape as string, to be drawn for each line
* - NOTE:
* This is an experimental feature and can have some unexpected behaviors.
* If chart has 'bubble' type, only circle can be used.
* For IE, non circle point expansions are not supported due to lack of transform support.
*
* - Available Values:
* - circle
* - rectangle
* - svg shape tag interpreted as string (ex. <polygon points='2.5 0 0 5 5 5'></polygon>)
*/
pattern?: string[];
}
export interface Grid {
/**
* Set 'grid & focus lines' to be positioned over grid lines and chart elements.
*/
front?: boolean;
focus?: {
/**
* Show edged focus grid line.
* **NOTE:** Available when [`tooltip.grouped=false`](#.tooltip) option is set.
*/
edge?: boolean;
/**
* Show grids when focus.
*/
show?: boolean;
/**
* Show y coordinate focus grid line.
* **NOTE:** Available when [`tooltip.grouped=false`](#.tooltip) option is set.
*/
y?: boolean;
};
lines?: {
/**
* Set grid lines to be positioned over chart elements.
*/
front?: boolean;
};
x?: {
/**
* Show grids along x axis.
*/
show?: boolean;
/**
* Show additional grid lines along x axis.
* This option accepts array including object that has value, text, position and class.
* text, position and class are optional. For position, start, middle and end (default) are available.
* If x axis is category axis, value can be category name.
* If x axis is timeseries axis, value can be date string, Date object and unixtime integer.
*/
lines?: GridLineOptions[];
};
y?: {
/**
* Show grids along y axis.
*/
show?: boolean;
/**
* Show additional grid lines along y axis.
* This option accepts array including object that has value, text, position and class.
*/
lines?: GridLineOptions[];
/**
* Number of y grids to be shown.
*/
ticks?: number;
};
}
export interface GridLineOptions {
value: string | number | Date;
text?: string;
axis?: string;
position?: string;
class?: string;
}
export interface Data {
/**
* Load a CSV or JSON file from a URL.
* Note that this will not work if loading via the "file://" protocol as most browsers with block XMLHTTPRequests.
*/
url?: string;
/**
* Load data from a multidimensional array, with the first element containing the data names, the following containing related data in that order.
*/
rows?: PrimitiveArray[];
/*
* Load data from a multidimensional array, with each element containing an array consisting of a datum name and associated data values.
*/
columns?: PrimitiveArray[];
/**
* XHR header value
* - NOTE: Should be used with data.url option
*/
headers?: Array<{ [key: string]: string; }>;
/**
* Hide each data when the chart appears.
* If true specified, all of data will be hidden. If multiple ids specified as an array, those will be hidden.
*/
hide?: boolean | string[];
/**
* Converts data id value
*/
idConverter?: (this: Chart, d: string) => string;
/**
* Parse a JSON object for data.
*/
json?: {};
/**
* Used if loading JSON via data.url
*/
mimeType?: string;
/**
* Choose which JSON object keys correspond to desired data.
*/
keys?: { x?: string; value: string[] };
/**
* Specify the key of x values in the data.
* We can show the data with non-index x values by th is option. This option is required when the type of x axis is timeseries.
* If this option is set on category axis, the values of the data
* on the key will be used for category names.
*/
x?: string;
/**
* Specify the keys of the x values for each data.
* This option can be used if we want to show the data that has different x values.
*/
xs?: { [key: string]: string };
/**
* Set a format to parse string specifed as x.
* Default is %Y-%m-%d
*/
xFormat?: string;
/**
* Set localtime format to parse x axis.
*/
xLocaltime?: boolean;
/**
* Sort on x axis.
*/
xSort?: boolean;
/**
* Set custom data name.
*/
names?: { [key: string]: string|null };
/**
* Set custom data class.
* If this option is specified, the element g for the data has an additional class that has the prefix billboard-target- (e.g. billboard-target-additional-data1-class).
*/
classes?: { [key: string]: string };
/**
* Set groups for the data for stacking.
*/
groups?: string[][];
/**
* Set how zero value will be treated on groups.<br>
* Possible values:
* - `zero`: 0 will be positioned at absolute axis zero point.
* - `positive`: 0 will be positioned at the top of a stack.
* - `negative`: 0 will be positioned at the bottom of a stack.
*/
groupsZeroAs?: "positive" | "negative" | "zero";
/**
* Set y axis the data related to. y and y2 can be used.
* - **NOTE:** If all data is related to one of the axes, the domain of axis without related data will be replaced by the domain from the axis with related data
*/
axes?: { [key: string]: string };
/**
* Set chart type at once.
* If this option is specified, the type will be applied to every data. This setting can be overwritten by data.types.
* - Available Values: area, area-line-range, area-spline, area-spline-range, area-step, area-step-range, bar, bubble, candlestick, donut, gauge, line, pie, radar, scatter, spline, step
*/
type?: ChartTypes;
/**
* Set chart type for each data.
* This setting overwrites data.type setting.
* - **NOTE:** `radar` and `treemap` type can't be combined with other types.
*/
types?: { [key: string]: ChartTypes };
/**
* Show labels on each data points or set formatter function for data labels.
* The formatter function receives 4 arguments such as v, id, i, j and it must return a string that will be shown as the label. The arguments are:
* - v is the value of the data point where the label is shown.
* - id is the id of the data where the label is shown.
* - i is the index of the data point where the label is shown.
* - j is the sub index of the data point where the label is shown.
*/
labels?: boolean | {
/**
* Centerize labels on `bar` shape. (**NOTE:** works only for 'bar' type)
*/
centered?: boolean;
/**
* Set label text background colors.
*/
backgroundColors?: string | { [key: string]: string };
/**
* Set label text colors.
*/
colors?: string |
{ [key: string]: string } |
((this: Chart, color: string, d: DataItem) => string);
/**
* The formatter function receives 4 arguments such as v, id, i, j and it **must return a string**(`\n` character will be used as line break) that will be shown as the label.<br><br>
* The arguments are:<br>
* - `v` is the value of the data point where the label is shown.
* - `id` is the id of the data where the label is shown.
* - `i` is the index of the data series point where the label is shown.
* - `texts` is the array of whole corresponding data series' text labels.<br><br>
* Formatter function can be defined for each data by specifying as an object and D3 formatter function can be set (ex. d3.format('$'))
*/
format?: FormatFunction | { [key: string]: FormatFunction };
/**
* Set each dataset position, relative the original.
*
* When function is specified, will receives 5 arguments such as `type, v, id, i, texts` and it must return a position number.<br><br>
* The arguments are:<br>
* - `type` coordinate type string, which will be 'x' or 'y'.
* - `v` is the value of the data point where the label is shown.
* - `id` is the id of the data where the label is shown.
* - `i` is the index of the data series point where the label is shown.
* - `texts` is the array of whole corresponding data series' text labels.<br><br>
*/
position?: PositionFunction | {
[key: string]: {
/**
* x coordinate position, relative the original.
*/
x?: number;
/**
* y coordinate position, relative the original.
*/
y?: number;
} | {
/**
* x coordinate position, relative the original.
*/
x?: number;
/**
* y coordinate position, relative the original.
*/
y?: number;
};
};
/**
* Rotate label text. Specify degree value in a range of `0 ~ 360`.
*/
rotate?: number;
};
/**
* Define the order of the data.
* This option changes the order of stacking the data and pieces of pie/donut. If null specified, it will be the order the data loaded.
* If function specified, it will be used to sort the data and it will recieve the data as argument.
*
* - Available Values: desc, asc, function (data1, data2) { ... }, null
* **NOTE**: order function, only works for Axis based types & Arc types, except `Radar` type.
*/
order?: "asc" | "desc" | ((this: Chart, a: IData, b: IData) => number) | null;
/**
* Define regions for each data.
* The values must be an array for each data and it should include an object that has start, end, style.
* If start is not set, the start will be the first data point. If end is not set, the end will be the last data point.
* Currently this option supports only line chart and dashed style. If this option specified, the line will be dashed only in the regions.
*/
regions?: {
[key: string]: Array<{
start?: number;
end?: number;
style?: {
dasharray?: string;
};
}>
};
/**
* Set color converter function.
* This option should a function and the specified function receives color (e.g. '#ff0000') and d that has data parameters like id, value, index, etc.
* And it must return a string that represents color (e.g. '#00ff00').
*/
color?(this: Chart, color: string, d: DataItem): string;
/**
* Set color for each data.
*/
colors?: {
[key: string]: string | ((this: Chart, d: DataItem) => string);
};
/**
* Set text label to be displayed when there's no data to show.
* - ex. Toggling all visible data to not be shown, unloading all current data, etc.
*/
empty?: { label: { text: string } };
selection?: {
/**
* Set data selection enabled
* If this option is set true, we can select the data points and get/set its state of selection by API (e.g. select, unselect, selected).
*/
enabled?: boolean;
/**
* Set grouped selection enabled.
* If this option set true, multiple data points that have same x value will be selected by one selection.
*/
grouped?: boolean;
/**
* Set multiple data points selection enabled.
* If this option set true, multile data points can have the selected state at the same time.
* If false set, only one data point can have the selected state and the others will be unselected when the new data point is selected.
*/
multiple?: boolean;
/**
* Enable to select data points by dragging. If this option set true, data points can be selected by dragging.
* NOTE: If this option set true, scrolling on the chart will be disabled because dragging event will handle the event.
*/
draggable?: boolean;
/**
* Set a callback for each data point to determine if it's selectable or not.
* The callback will receive d as an argument and it has some parameters like id, value, index. This callback should return boolean.
* @param d Data object
*/
isselectable?(this: Chart, d?: any): boolean;
};
filter?: (this: Chart,
v: Array<{
id: string;
id_org: string;
values: Array<{
x: number;
value: number;
id: string;
index: number;
}>
}>) => boolean;
stack?: {
/**
* Set the stacking to be normalized
* - NOTE: For stacking, 'data.groups' option should be set
* - y Axis will be set in percentage value (0 ~ 100%)
* - Must have postive values
*/
normalize?: boolean;
};
/**
* Set a callback for click event on each data point.
* This callback will be called when each data point clicked and will receive d and element as the arguments.
* - d is the data clicked and element is the element clicked. In this callback, this will be the Chart object.
*/
onclick?(this: Chart, d: DataItem, element: SVGElement): void;
/**
* Set a callback for mouse/touch over event on each data point.
* This callback will be called when mouse cursor or via touch moves onto each data point and will receive d as the argument.
* - d is the data where mouse cursor moves onto. In this callback, this will be the Chart object.
*/
onover?(this: Chart, d: DataItem, element?: SVGElement): void;
/**
* Set a callback for mouse/touch event on each data point.
* This callback will be called when mouse cursor moves out each data point and will receive d as the argument.
* - d is the data where mouse cursor moves out. In this callback, this will be the Chart object.
*/
onout?(this: Chart, d: DataItem, element?: SVGElement): void;
/**
* Set a callback for on data selection.
*/
onselected?(this: Chart, d: DataItem, element?: SVGElement): void;
/**
* Set a callback for on data un-selection.
*/
onunselected?(this: Chart, d: DataItem, element?: SVGElement): void;
/**
* Set a callback for minimum data
* - NOTE: For 'area-line-range', 'area-step-range' and 'area-spline-range', mid data will be taken for the comparison
*/
onmin?(this: Chart, d: DataItem[]): void;
/**
* Set a callback for maximum data
* - NOTE: For 'area-line-range', 'area-step-range' and 'area-spline-range', mid data will be taken for the comparison
*/
onmax?(this: Chart, d: DataItem[]): void;
/**
* Set a callback for when data is shown.
* The callback will receive shown data ids in array.
*/
onshown?(this: Chart, ids: string[]): void;
/**
* Set a callback for when data is hidden.
* The callback will receive hidden data ids in array.
*/
onhidden?(this: Chart, ids: string[]): void;
}