import type { MultiGridLegendParams, MultiBarsParams, MultiStackedBarsParams, MultiBarsTriangleParams, MultiLinesParams, MultiLineAreasParams, MultiDotsParams, MultiGroupAxisParams, MultiGridTooltipParams, MultiValueAxisParams, MultiStackedValueAxisParams, OverlappingValueAxesParams, OverlappingStackedValueAxesParams } from '../../lib/plugins-basic-types' import { measureTextWidth } from '../utils/commonUtils' export const DEFAULT_MULTI_GRID_LEGEND_PARAMS: MultiGridLegendParams = { // position: 'right', // justify: 'end', placement: 'bottom', padding: 28, backgroundFill: 'none', backgroundStroke: 'none', gap: 10, listRectWidth: 14, listRectHeight: 14, listRectRadius: 0, gridList: [ { listRectWidth: 14, listRectHeight: 14, listRectRadius: 0, } ], textColorType: 'primary' } export const DEFAULT_MULTI_GROUP_AXIS_PARAMS: MultiGroupAxisParams = { // labelAnchor: 'start', labelOffset: [0, 0], labelColorType: 'primary', axisLineVisible: true, axisLineColorType: 'primary', ticks: 'all', tickFormat: text => text, tickLineVisible: true, tickPadding: 20, tickFullLine: false, tickFullLineDasharray: 'none', tickColorType: 'secondary', tickTextRotate: 0, tickTextColorType: 'primary', gridIndexes: [0] } DEFAULT_MULTI_GROUP_AXIS_PARAMS.tickFormat.toString = () => `text => text` export const DEFAULT_MULTI_VALUE_AXIS_PARAMS: MultiValueAxisParams = { // labelAnchor: 'end', labelOffset: [0, 0], labelColorType: 'primary', axisLineVisible: false, axisLineColorType: 'primary', ticks: 4, // tickFormat: ',.0f', tickFormat: num => { if (num === null || Number.isNaN(num) == true) { return num || 0 } const parts = num.toString().split('.') parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',') return parts.join('.') }, tickLineVisible: true, tickPadding: 20, tickFullLine: true, tickFullLineDasharray: 'none', tickColorType: 'secondary', tickTextRotate: 0, tickTextColorType: 'primary', gridIndexes: 'all' } DEFAULT_MULTI_VALUE_AXIS_PARAMS.tickFormat.toString = () => `num => { if (num === null || Number.isNaN(num) == true) { return num || 0 } const parts = num.toString().split('.') parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',') return parts.join('.') }` export const DEFAULT_MULTI_STACKED_VALUE_AXIS_PARAMS: MultiStackedValueAxisParams = { ...DEFAULT_MULTI_VALUE_AXIS_PARAMS } export const DEFAULT_MULTI_BARS_PARAMS: MultiBarsParams = { barWidth: 0, barPadding: 1, barGroupPadding: 40, barRadius: false, gridIndexes: [0] } export const DEFAULT_MULTI_STACKED_BARS_PARAMS: MultiStackedBarsParams = { barWidth: 0, barGroupPadding: 10, barRadius: false, gridIndexes: [0] } export const DEFAULT_MULTI_BARS_TRIANGLE_PARAMS: MultiBarsTriangleParams = { barWidth: 0, barPadding: 1, barGroupPadding: 20, linearGradientOpacity: [1, 0], gridIndexes: [0] } export const DEFAULT_MULTI_LINES_PARAMS: MultiLinesParams = { lineCurve: 'curveLinear', lineWidth: 2, gridIndexes: [1] } export const DEFAULT_MULTI_LINE_AREAS_PARAMS: MultiLineAreasParams = { lineCurve: 'curveLinear', linearGradientOpacity: [1, 0], gridIndexes: [1] } export const DEFAULT_MULTI_DOTS_PARAMS: MultiDotsParams = { radius: 4, fillColorType: 'background', strokeColorType: 'label', strokeWidth: 2, onlyShowHighlighted: false, gridIndexes: [1] } export const DEFAULT_OVERLAPPING_VALUE_AXES_PARAMS: OverlappingValueAxesParams = { firstAxis: { // labelAnchor: 'end', labelOffset: [0, 0], labelColorType: 'primary', axisLineVisible: false, axisLineColorType: 'primary', ticks: 4, tickFormat: ',.0f', tickLineVisible: true, tickPadding: 20, tickFullLine: true, tickFullLineDasharray: 'none', tickColorType: 'secondary', tickTextRotate: 0, tickTextColorType: 'primary', }, secondAxis: { // labelAnchor: 'end', labelOffset: [0, 0], labelColorType: 'primary', axisLineVisible: false, axisLineColorType: 'primary', ticks: 4, tickFormat: ',.0f', tickLineVisible: true, tickPadding: 20, tickFullLine: true, tickFullLineDasharray: 'none', tickColorType: 'secondary', tickTextRotate: 0, tickTextColorType: 'primary', }, gridIndexes: [0, 1] } export const DEFAULT_OVERLAPPING_STACKED_VALUE_AXES_PARAMS: OverlappingStackedValueAxesParams = { ...DEFAULT_OVERLAPPING_VALUE_AXES_PARAMS } export const DEFAULT_MULTI_GRID_TOOLTIP_PARAMS: MultiGridTooltipParams = { backgroundColorType: 'background', strokeColorType: 'primary', backgroundOpacity: 0.8, textColorType: 'primary', offset: [20, 5], padding: 10, renderFn: (eventData, { styles, utils }) => { const bulletWidth = styles.textSizePx * 0.7 const offset = (styles.textSizePx / 2) - (bulletWidth / 2) const titleSvg = `${eventData.groupLabel}` const groupLabelTextWidth = utils.measureTextWidth(eventData.groupLabel, styles.textSizePx) const listTextWidth = eventData.group.reduce((acc, group) => { const text = `${group.seriesLabel}${utils.toCurrency(group.value)}` const _maxTextWidth = utils.measureTextWidth(text, styles.textSizePx) return _maxTextWidth > acc ? _maxTextWidth : acc }, 0) const maxTextWidth = Math.max(groupLabelTextWidth, listTextWidth) const lineEndX = maxTextWidth + styles.textSizePx * 3 const contentSvg = eventData.group .map((group, i) => { const y = i * styles.textSizePx * 1.5 const isHighlight = group.id === (eventData.datum && eventData.datum.id) return ` ${group.seriesLabel} ${utils.toCurrency(group.value)} ` }) .join('') return `${titleSvg} ${contentSvg}` } } DEFAULT_MULTI_GRID_TOOLTIP_PARAMS.renderFn.toString = () => `(eventData, { styles, utils }) => { const bulletWidth = styles.textSizePx * 0.7 const offset = (styles.textSizePx / 2) - (bulletWidth / 2) const titleSvg = \`\${eventData.groupLabel}\` const groupLabelTextWidth = utils.measureTextWidth(eventData.groupLabel, styles.textSizePx) const listTextWidth = eventData.group.reduce((acc, group) => { const text = \`\${group.seriesLabel}\${utils.toCurrency(group.value)}\` const _maxTextWidth = utils.measureTextWidth(text, styles.textSizePx) return _maxTextWidth > acc ? _maxTextWidth : acc }, 0) const maxTextWidth = Math.max(groupLabelTextWidth, listTextWidth) const lineEndX = maxTextWidth + styles.textSizePx * 3 const contentSvg = eventData.group .map((group, i) => { const y = i * styles.textSizePx * 1.5 const isHighlight = group.id === (eventData.datum && eventData.datum.id) return \` \${group.seriesLabel} \${utils.toCurrency(group.value)} \` }) .join('') return \`\${titleSvg} \${contentSvg}\` }`