feat(chart): support fixed y-axis domains
All checks were successful
Package component / package (push) Successful in 9m22s
All checks were successful
Package component / package (push) Successful in 9m22s
This commit is contained in:
50
src/components/core/yDomain.ts
Normal file
50
src/components/core/yDomain.ts
Normal file
@@ -0,0 +1,50 @@
|
||||
import type { DisplaySeries, DisplayTrack } from './types'
|
||||
|
||||
export type WaveformYDomain = [number, number]
|
||||
|
||||
export function normalizeYDomain(
|
||||
domain: readonly [number, number] | undefined,
|
||||
): WaveformYDomain | undefined {
|
||||
if (
|
||||
!domain ||
|
||||
!Number.isFinite(domain[0]) ||
|
||||
!Number.isFinite(domain[1]) ||
|
||||
domain[0] === domain[1]
|
||||
) {
|
||||
return undefined
|
||||
}
|
||||
return domain[0] < domain[1] ? [domain[0], domain[1]] : [domain[1], domain[0]]
|
||||
}
|
||||
|
||||
export function resolveTrackFixedYDomain(
|
||||
track: Pick<DisplayTrack, 'id'>,
|
||||
yDomains?: Record<string, WaveformYDomain>,
|
||||
): WaveformYDomain | undefined {
|
||||
return normalizeYDomain(yDomains?.[track.id])
|
||||
}
|
||||
|
||||
export function resolveSeriesFixedYDomain(
|
||||
series: Pick<DisplaySeries, 'id'>,
|
||||
yDomain?: WaveformYDomain,
|
||||
yDomains?: Record<string, WaveformYDomain>,
|
||||
): WaveformYDomain | undefined {
|
||||
return normalizeYDomain(yDomains?.[series.id]) ?? normalizeYDomain(yDomain)
|
||||
}
|
||||
|
||||
export function hasFixedYDomainForTrack(
|
||||
track: Pick<DisplayTrack, 'id' | 'visibleSeries'>,
|
||||
yDomain?: WaveformYDomain,
|
||||
yDomains?: Record<string, WaveformYDomain>,
|
||||
): boolean {
|
||||
return Boolean(
|
||||
resolveTrackFixedYDomain(track, yDomains) ||
|
||||
track.visibleSeries.some((series) => resolveSeriesFixedYDomain(series, yDomain, yDomains)),
|
||||
)
|
||||
}
|
||||
|
||||
export function mergeYDomains(domains: readonly WaveformYDomain[]): WaveformYDomain {
|
||||
return [
|
||||
Math.min(...domains.map((domain) => domain[0])),
|
||||
Math.max(...domains.map((domain) => domain[1])),
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user