veritatisquam
Version:
Carbon charting components, lerna monorepo
429 lines (399 loc) • 8.55 kB
text/typescript
import { Tools } from './tools';
import {
BaseChartOptions,
AxisChartOptions,
ScatterChartOptions,
LollipopChartOptions,
LineChartOptions,
BarChartOptions,
StackedBarChartOptions,
AreaChartOptions,
PieChartOptions,
GaugeChartOptions,
DonutChartOptions,
BubbleChartOptions,
RadarChartOptions,
ComboChartOptions,
TreemapChartOptions,
// Components
GridOptions,
RulerOptions,
AxesOptions,
TimeScaleOptions,
TooltipOptions,
LegendOptions,
StackedBarOptions,
MeterChartOptions,
ToolbarOptions,
ToolbarControl,
ZoomBarsOptions,
// ENUMS
Alignments,
GaugeTypes,
LegendPositions,
TruncationTypes,
ToolbarControlTypes,
ZoomBarTypes,
} from './interfaces';
import enUSLocaleObject from 'date-fns/locale/en-US/index';
/*
*****************************
* User configurable options *
*****************************
*/
/**
* Default truncation configuration
*/
const standardTruncationOptions = {
type: TruncationTypes.END_LINE,
threshold: 16,
numCharacter: 14,
};
/**
* Legend options
*/
const legend: LegendOptions = {
enabled: true,
position: LegendPositions.BOTTOM,
clickable: true,
truncation: standardTruncationOptions,
alignment: Alignments.LEFT,
order: null,
};
/**
* Grid options
*/
export const grid: GridOptions = {
x: {
// set enable to false will not draw grid and stroke of grid backdrop
enabled: true,
numberOfTicks: 15,
},
y: {
// set enable to false will not draw grid and stroke of grid backdrop
enabled: true,
numberOfTicks: 5,
},
};
/**
* Ruler options
*/
export const ruler: RulerOptions = {
// enable or disable ruler
enabled: true,
};
/**
* Tooltip options
*/
export const baseTooltip: TooltipOptions = {
enabled: true,
showTotal: true,
valueFormatter: (d) => d.toLocaleString(),
truncation: standardTruncationOptions,
};
// These options will be managed by Tools.mergeDefaultChartOptions
// by removing the ones the user is not providing,
// and by TwoDimensionalAxes.
const axes: AxesOptions = {
top: {
visible: true,
includeZero: true,
truncation: standardTruncationOptions,
},
bottom: {
visible: true,
includeZero: true,
truncation: standardTruncationOptions,
},
left: {
visible: true,
includeZero: true,
truncation: standardTruncationOptions,
},
right: {
visible: true,
includeZero: true,
truncation: standardTruncationOptions,
},
};
export const timeScale: TimeScaleOptions = {
addSpaceOnEdges: 1,
showDayName: false,
localeObject: enUSLocaleObject,
timeIntervalFormats: {
'15seconds': { primary: 'MMM d, pp', secondary: 'pp' },
minute: { primary: 'MMM d, p', secondary: 'p' },
'30minutes': { primary: 'MMM d, p', secondary: 'p' },
hourly: { primary: 'MMM d, hh a', secondary: 'hh a' },
daily: { primary: 'MMM d', secondary: 'd' },
weekly: { primary: 'eee, MMM d', secondary: 'eee' },
monthly: { primary: 'MMM yyyy', secondary: 'MMM' },
quarterly: { primary: "QQQ ''yy", secondary: 'QQQ' },
yearly: { primary: 'yyyy', secondary: 'yyyy' },
},
};
/**
* Base chart options common to any chart
*/
const chart: BaseChartOptions = {
width: null,
height: null,
resizable: true,
tooltip: baseTooltip,
legend,
style: {
prefix: 'cc',
},
data: {
groupMapsTo: 'group',
loading: false,
selectedGroups: [],
},
color: {
scale: null,
pairing: {
numberOfVariants: null,
option: 1,
},
gradient: {
enabled: false,
},
},
};
/**
* Options common to any chart with an axis
*/
const axisChart: AxisChartOptions = Tools.merge({}, chart, {
axes,
timeScale,
grid,
ruler,
zoomBar: {
zoomRatio: 0.4,
minZoomRatio: 0.01,
top: {
enabled: false,
type: ZoomBarTypes.GRAPH_VIEW,
},
} as ZoomBarsOptions,
toolbar: {
enabled: false,
numberOfIcons: 3,
controls: [],
} as ToolbarOptions,
} as AxisChartOptions);
/**
* options specific to simple bar charts
*/
const baseBarChart: BarChartOptions = Tools.merge({}, axisChart, {
bars: {
maxWidth: 16,
},
timeScale: Tools.merge(timeScale, {
addSpaceOnEdges: 1,
} as TimeScaleOptions),
} as BarChartOptions);
/**
* options specific to simple bar charts
*/
const simpleBarChart: BarChartOptions = Tools.merge(
{},
baseBarChart,
{} as BarChartOptions
);
/**
* options specific to simple bar charts
*/
const groupedBarChart: BarChartOptions = Tools.merge(
{},
baseBarChart,
{} as BarChartOptions
);
/**
* options specific to stacked bar charts
*/
const stackedBarChart: StackedBarChartOptions = Tools.merge({}, baseBarChart, {
bars: Tools.merge({}, baseBarChart.bars, {
dividerSize: 1.5,
} as StackedBarOptions),
} as BarChartOptions);
/**
* options specific to scatter charts
*/
const scatterChart: ScatterChartOptions = Tools.merge({}, axisChart, {
points: {
// default point radius to 4
radius: 4,
fillOpacity: 0.3,
filled: true,
enabled: true,
},
} as ScatterChartOptions);
/**
* options specific to lollipop charts
*/
const lollipopChart: LollipopChartOptions = scatterChart as LollipopChartOptions;
/**
* options specific to line charts
*/
const lineChart: LineChartOptions = Tools.merge({}, scatterChart, {
points: {
// default point radius to 3
radius: 3,
filled: false,
enabled: true,
},
} as LineChartOptions);
/**
* options specific to area charts
*/
const areaChart: AreaChartOptions = Tools.merge({}, lineChart, {
timeScale: Tools.merge(timeScale, {
addSpaceOnEdges: 0,
} as TimeScaleOptions),
} as LineChartOptions);
/**
* options specific to stacked area charts
*/
const stackedAreaChart = areaChart;
/**
* options specific to bubble charts
*/
const bubbleChart: BubbleChartOptions = Tools.merge({}, axisChart, {
bubble: {
radiusMapsTo: 'radius',
radiusRange: (chartSize, data) => {
const smallerChartDimension = Math.min(
chartSize.width,
chartSize.height
);
return [
(smallerChartDimension * 3) / 400,
(smallerChartDimension * 25) / 400,
];
},
fillOpacity: 0.2,
enabled: true
},
points: {
filled: true
}
} as BubbleChartOptions);
/**
* options specific to pie charts
*/
const pieChart: PieChartOptions = Tools.merge({}, chart, {
pie: {
labels: {
formatter: null,
},
alignment: Alignments.LEFT,
},
} as PieChartOptions);
/**
* options specific to gauge charts
*/
const gaugeChart: GaugeChartOptions = Tools.merge({}, chart, {
legend: {
enabled: false,
},
gauge: {
type: GaugeTypes.SEMI,
arcWidth: 16,
deltaArrow: {
size: (radius) => radius / 8,
enabled: true,
},
status: null,
numberSpacing: 10,
deltaFontSize: (radius) => radius / 8,
valueFontSize: (radius) => radius / 2.5,
numberFormatter: (number) =>
number.toFixed(2) % 1 !== 0
? number.toFixed(2).toLocaleString()
: number.toFixed().toLocaleString(),
alignment: Alignments.LEFT,
},
} as GaugeChartOptions);
/**
* options specific to donut charts
*/
const donutChart: DonutChartOptions = Tools.merge({}, pieChart, {
donut: {
center: {
numberFontSize: (radius) =>
Math.min((radius / 100) * 24, 24) + 'px',
titleFontSize: (radius) => Math.min((radius / 100) * 15, 15) + 'px',
titleYPosition: (radius) => Math.min((radius / 80) * 20, 20),
numberFormatter: (number) => Math.floor(number).toLocaleString(),
},
alignment: Alignments.LEFT,
},
} as DonutChartOptions);
const meterChart: MeterChartOptions = Tools.merge({}, chart, {
legend: {
enabled: false,
},
meter: {
height: 8,
statusBar: {
percentageIndicator: {
enabled: true,
},
},
},
} as MeterChartOptions);
/**
* options specific to radar charts
*/
const radarChart: RadarChartOptions = Tools.merge({}, chart, {
radar: {
axes: {
angle: 'key',
value: 'value',
},
alignment: Alignments.LEFT,
},
tooltip: {
gridline: {
enabled: true,
},
valueFormatter: (value) =>
value !== null && value !== undefined ? value : 'N/A',
},
} as RadarChartOptions);
/**
* options specific to combo charts
*/
const comboChart: ComboChartOptions = Tools.merge({}, baseBarChart, {
comboChartTypes: [],
} as ComboChartOptions);
/*
* options specific to treemap charts
*/
const treemapChart: TreemapChartOptions = Tools.merge({}, chart, {
data: Tools.merge(chart.data, {
groupMapsTo: 'name',
}),
} as TreemapChartOptions);
export const options = {
chart,
axisChart,
simpleBarChart,
groupedBarChart,
stackedBarChart,
bubbleChart,
lineChart,
areaChart,
stackedAreaChart,
scatterChart,
lollipopChart,
pieChart,
donutChart,
meterChart,
radarChart,
gaugeChart,
comboChart,
treemapChart,
};
export * from './configuration-non-customizable';