@@ -3,12 +3,13 @@ import { omit } from '@sim/utils/object'
33import { JSON_SCHEMA , load } from 'js-yaml'
44import { z } from 'zod'
55import {
6+ assertAnnotatable ,
67 CHART_TONES ,
78 type ChartHighlight ,
89 type ChartThreshold ,
910 valueAxisKey ,
1011} from '@/lib/charts/annotations'
11- import { parseChartSpec } from '@/lib/charts/spec'
12+ import { isTimeSeriesOption , parseChartSpec } from '@/lib/charts/spec'
1213import {
1314 type DashboardTimeRange ,
1415 parseDashboardCustomRange ,
@@ -307,7 +308,8 @@ function loadBoundedYaml(content: string, maxBytes: number, tooLarge: string): u
307308function validateDashboardBlocks (
308309 blocks : DashboardBlock [ ] ,
309310 defaults : DashboardSource | undefined ,
310- maxBlocks : number
311+ maxBlocks : number ,
312+ highlights : ChartHighlight [ ] | undefined
311313) : void {
312314 let count = 0
313315 const visit = ( children : DashboardBlock [ ] , depth : number ) : void => {
@@ -339,6 +341,8 @@ function validateDashboardBlocks(
339341 if ( ! chart . spec ) throw new Error ( chart . error )
340342 block . option = chart . spec . option
341343 if ( block . thresholds ) valueAxisKey ( block . option )
344+ if ( block . thresholds || ( highlights && isTimeSeriesOption ( block . option ) ) )
345+ assertAnnotatable ( block . option )
342346 }
343347 }
344348 }
@@ -353,7 +357,7 @@ export function parseDashboardSpec(content: string): ParseResult<DashboardSpec>
353357 const parsed = dashboardSchema . safeParse ( raw )
354358 if ( ! parsed . success )
355359 throw new Error ( describeSchemaIssues ( parsed . error . issues , BLOCK_KINDS ) . join ( '\n' ) )
356- validateDashboardBlocks ( parsed . data . blocks , parsed . data . source , 48 )
360+ validateDashboardBlocks ( parsed . data . blocks , parsed . data . source , 48 , parsed . data . highlights )
357361 return { spec : parsed . data }
358362 } catch ( error ) {
359363 return { error : getErrorMessage ( error , 'Invalid dashboard' ) }
@@ -371,7 +375,12 @@ export function parseDashboardEmbed(content: string): ParseResult<DashboardEmbed
371375 const parsed = dashboardEmbedSchema . safeParse ( raw )
372376 if ( ! parsed . success )
373377 throw new Error ( describeSchemaIssues ( parsed . error . issues , EMBED_BLOCK_KINDS ) . join ( '\n' ) )
374- validateDashboardBlocks ( parsed . data . blocks , parsed . data . source , MAX_DASHBOARD_EMBED_BLOCKS )
378+ validateDashboardBlocks (
379+ parsed . data . blocks ,
380+ parsed . data . source ,
381+ MAX_DASHBOARD_EMBED_BLOCKS ,
382+ parsed . data . highlights
383+ )
375384 return { spec : parsed . data }
376385 } catch ( error ) {
377386 return { error : getErrorMessage ( error , 'Invalid dashboard embed' ) }
0 commit comments