|
|
@ -19,21 +19,23 @@ import { |
|
|
EChartsOption, |
|
|
EChartsOption, |
|
|
EChartsSeriesItem, |
|
|
EChartsSeriesItem, |
|
|
EChartsTooltipTrigger, |
|
|
EChartsTooltipTrigger, |
|
|
EChartsTooltipWidgetSettings, getYAxis, |
|
|
EChartsTooltipWidgetSettings, |
|
|
measureThresholdLabelOffset |
|
|
measureThresholdLabelOffset |
|
|
} from '@home/components/widget/lib/chart/echarts-widget.models'; |
|
|
} from '@home/components/widget/lib/chart/echarts-widget.models'; |
|
|
import { |
|
|
import { |
|
|
autoDateFormat, AutoDateFormatSettings, |
|
|
autoDateFormat, |
|
|
|
|
|
AutoDateFormatSettings, |
|
|
ComponentStyle, |
|
|
ComponentStyle, |
|
|
Font, |
|
|
Font, |
|
|
simpleDateFormat, |
|
|
textStyle, |
|
|
textStyle, tsToFormatTimeUnit |
|
|
tsToFormatTimeUnit |
|
|
} from '@shared/models/widget-settings.models'; |
|
|
} from '@shared/models/widget-settings.models'; |
|
|
import { XAXisOption, YAXisOption } from 'echarts/types/dist/shared'; |
|
|
import { XAXisOption, YAXisOption } from 'echarts/types/dist/shared'; |
|
|
import { CustomSeriesOption, LineSeriesOption } from 'echarts/charts'; |
|
|
import { CustomSeriesOption, LineSeriesOption } from 'echarts/charts'; |
|
|
import { |
|
|
import { |
|
|
formatValue, |
|
|
formatValue, |
|
|
isDefinedAndNotNull, |
|
|
isDefinedAndNotNull, |
|
|
|
|
|
isFunction, |
|
|
isNumeric, |
|
|
isNumeric, |
|
|
isUndefined, |
|
|
isUndefined, |
|
|
isUndefinedOrNull, |
|
|
isUndefinedOrNull, |
|
|
@ -42,7 +44,6 @@ import { |
|
|
} from '@core/utils'; |
|
|
} from '@core/utils'; |
|
|
import { LinearGradientObject } from 'zrender/lib/graphic/LinearGradient'; |
|
|
import { LinearGradientObject } from 'zrender/lib/graphic/LinearGradient'; |
|
|
import tinycolor from 'tinycolor2'; |
|
|
import tinycolor from 'tinycolor2'; |
|
|
import Axis2D from 'echarts/types/src/coord/cartesian/Axis2D'; |
|
|
|
|
|
import { ValueAxisBaseOption } from 'echarts/types/src/coord/axisCommonTypes'; |
|
|
import { ValueAxisBaseOption } from 'echarts/types/src/coord/axisCommonTypes'; |
|
|
import { SeriesLabelOption } from 'echarts/types/src/util/types'; |
|
|
import { SeriesLabelOption } from 'echarts/types/src/util/types'; |
|
|
import { |
|
|
import { |
|
|
@ -320,6 +321,12 @@ export const defaultXAxisTicksFormat: AutoDateFormatSettings = { |
|
|
|
|
|
|
|
|
export type TimeSeriesChartYAxisId = 'default' | string; |
|
|
export type TimeSeriesChartYAxisId = 'default' | string; |
|
|
|
|
|
|
|
|
|
|
|
export type TimeSeriesChartTicksGenerator = |
|
|
|
|
|
(extent?: number[], interval?: number, niceTickExtent?: number[], intervalPrecision?: number) => {value: number}[]; |
|
|
|
|
|
|
|
|
|
|
|
export type TimeSeriesChartTicksFormatter = |
|
|
|
|
|
(value: any) => string; |
|
|
|
|
|
|
|
|
export interface TimeSeriesChartYAxisSettings extends TimeSeriesChartAxisSettings { |
|
|
export interface TimeSeriesChartYAxisSettings extends TimeSeriesChartAxisSettings { |
|
|
id?: TimeSeriesChartYAxisId; |
|
|
id?: TimeSeriesChartYAxisId; |
|
|
order?: number; |
|
|
order?: number; |
|
|
@ -329,8 +336,8 @@ export interface TimeSeriesChartYAxisSettings extends TimeSeriesChartAxisSetting |
|
|
splitNumber?: number; |
|
|
splitNumber?: number; |
|
|
min?: number | string; |
|
|
min?: number | string; |
|
|
max?: number | string; |
|
|
max?: number | string; |
|
|
intervalCalculator?: string; |
|
|
ticksGenerator?: TimeSeriesChartTicksGenerator | string; |
|
|
ticksFormatter?: string; |
|
|
ticksFormatter?: TimeSeriesChartTicksFormatter | string; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
export const timeSeriesChartYAxisValid = (axis: TimeSeriesChartYAxisSettings): boolean => |
|
|
export const timeSeriesChartYAxisValid = (axis: TimeSeriesChartYAxisSettings): boolean => |
|
|
@ -788,8 +795,6 @@ export interface TimeSeriesChartYAxis { |
|
|
decimals: number; |
|
|
decimals: number; |
|
|
settings: TimeSeriesChartYAxisSettings; |
|
|
settings: TimeSeriesChartYAxisSettings; |
|
|
option: YAXisOption & ValueAxisBaseOption; |
|
|
option: YAXisOption & ValueAxisBaseOption; |
|
|
intervalCalculator?: (axis: Axis2D) => number; |
|
|
|
|
|
ticksFormatter?: (value: any) => string; |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
export const createTimeSeriesYAxis = (units: string, |
|
|
export const createTimeSeriesYAxis = (units: string, |
|
|
@ -800,11 +805,37 @@ export const createTimeSeriesYAxis = (units: string, |
|
|
settings.tickLabelColor, darkMode, 'axis.tickLabel'); |
|
|
settings.tickLabelColor, darkMode, 'axis.tickLabel'); |
|
|
const yAxisNameStyle = createChartTextStyle(settings.labelFont, |
|
|
const yAxisNameStyle = createChartTextStyle(settings.labelFont, |
|
|
settings.labelColor, darkMode, 'axis.label'); |
|
|
settings.labelColor, darkMode, 'axis.label'); |
|
|
let ticksFormatter: (value: any) => string; |
|
|
|
|
|
if (settings.ticksFormatter && settings.ticksFormatter.length) { |
|
|
let ticksFormatter: TimeSeriesChartTicksFormatter; |
|
|
ticksFormatter = parseFunction(settings.ticksFormatter, ['value']); |
|
|
if (settings.ticksFormatter) { |
|
|
|
|
|
if (isFunction(settings.ticksFormatter)) { |
|
|
|
|
|
ticksFormatter = settings.ticksFormatter as TimeSeriesChartTicksFormatter; |
|
|
|
|
|
} else if (settings.ticksFormatter.length) { |
|
|
|
|
|
ticksFormatter = parseFunction(settings.ticksFormatter, ['value']); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
let ticksGenerator: TimeSeriesChartTicksGenerator; |
|
|
|
|
|
let minInterval: number; |
|
|
|
|
|
let interval: number; |
|
|
|
|
|
let splitNumber: number; |
|
|
|
|
|
if (settings.ticksGenerator) { |
|
|
|
|
|
if (isFunction(settings.ticksGenerator)) { |
|
|
|
|
|
ticksGenerator = settings.ticksGenerator as TimeSeriesChartTicksGenerator; |
|
|
|
|
|
} else if (settings.ticksGenerator.length) { |
|
|
|
|
|
ticksGenerator = parseFunction(settings.ticksGenerator, ['extent', 'interval', 'niceTickExtent', 'intervalPrecision']); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
const yAxis: TimeSeriesChartYAxis = { |
|
|
if (!ticksGenerator) { |
|
|
|
|
|
interval = settings.interval; |
|
|
|
|
|
if (isUndefinedOrNull(interval)) { |
|
|
|
|
|
if (isDefinedAndNotNull(settings.splitNumber)) { |
|
|
|
|
|
splitNumber = settings.splitNumber; |
|
|
|
|
|
} else { |
|
|
|
|
|
minInterval = (1 / Math.pow(10, decimals)); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
return { |
|
|
id: settings.id, |
|
|
id: settings.id, |
|
|
decimals, |
|
|
decimals, |
|
|
settings, |
|
|
settings, |
|
|
@ -818,6 +849,10 @@ export const createTimeSeriesYAxis = (units: string, |
|
|
scale: true, |
|
|
scale: true, |
|
|
min: settings.min, |
|
|
min: settings.min, |
|
|
max: settings.max, |
|
|
max: settings.max, |
|
|
|
|
|
minInterval, |
|
|
|
|
|
splitNumber, |
|
|
|
|
|
interval, |
|
|
|
|
|
ticksGenerator, |
|
|
name: settings.label, |
|
|
name: settings.label, |
|
|
nameLocation: 'middle', |
|
|
nameLocation: 'middle', |
|
|
nameRotate: settings.position === AxisPosition.left ? 90 : -90, |
|
|
nameRotate: settings.position === AxisPosition.left ? 90 : -90, |
|
|
@ -853,7 +888,8 @@ export const createTimeSeriesYAxis = (units: string, |
|
|
if (ticksFormatter) { |
|
|
if (ticksFormatter) { |
|
|
try { |
|
|
try { |
|
|
result = ticksFormatter(value); |
|
|
result = ticksFormatter(value); |
|
|
} catch (_e) {} |
|
|
} catch (_e) { |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
if (isUndefined(result)) { |
|
|
if (isUndefined(result)) { |
|
|
result = formatValue(value, decimals, units, false); |
|
|
result = formatValue(value, decimals, units, false); |
|
|
@ -869,54 +905,6 @@ export const createTimeSeriesYAxis = (units: string, |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
}; |
|
|
}; |
|
|
if (settings.intervalCalculator && settings.intervalCalculator.length) { |
|
|
|
|
|
yAxis.intervalCalculator = parseFunction(settings.intervalCalculator, ['axis']); |
|
|
|
|
|
} |
|
|
|
|
|
return yAxis; |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
export const updateYAxisIntervals = (chart: ECharts, |
|
|
|
|
|
yAxis: TimeSeriesChartYAxis, empty: boolean): boolean => { |
|
|
|
|
|
let changed = false; |
|
|
|
|
|
let interval: number; |
|
|
|
|
|
let splitNumber: number; |
|
|
|
|
|
let minInterval: number; |
|
|
|
|
|
if (!empty) { |
|
|
|
|
|
interval = calculateYAxisInterval(chart, yAxis); |
|
|
|
|
|
if (isUndefinedOrNull(interval)) { |
|
|
|
|
|
if (isDefinedAndNotNull(yAxis.settings.splitNumber)) { |
|
|
|
|
|
splitNumber = yAxis.settings.splitNumber; |
|
|
|
|
|
} else { |
|
|
|
|
|
minInterval = (1 / Math.pow(10, yAxis.decimals)); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
if (yAxis.option.interval !== interval) { |
|
|
|
|
|
yAxis.option.interval = interval; |
|
|
|
|
|
changed = true; |
|
|
|
|
|
} |
|
|
|
|
|
if (yAxis.option.splitNumber !== splitNumber) { |
|
|
|
|
|
yAxis.option.splitNumber = splitNumber; |
|
|
|
|
|
changed = true; |
|
|
|
|
|
} |
|
|
|
|
|
if (yAxis.option.minInterval !== minInterval) { |
|
|
|
|
|
yAxis.option.minInterval = minInterval; |
|
|
|
|
|
changed = true; |
|
|
|
|
|
} |
|
|
|
|
|
return changed; |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
const calculateYAxisInterval = (chart: ECharts, yAxis: TimeSeriesChartYAxis): number | undefined => { |
|
|
|
|
|
let interval = yAxis.settings.interval; |
|
|
|
|
|
if (yAxis.intervalCalculator) { |
|
|
|
|
|
const axis = getYAxis(chart, yAxis.id); |
|
|
|
|
|
if (axis) { |
|
|
|
|
|
try { |
|
|
|
|
|
interval = yAxis.intervalCalculator(axis); |
|
|
|
|
|
} catch (_e) {} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
return interval; |
|
|
|
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
export const createTimeSeriesXAxisOption = (settings: TimeSeriesChartXAxisSettings, |
|
|
export const createTimeSeriesXAxisOption = (settings: TimeSeriesChartXAxisSettings, |
|
|
|