@@ -2,7 +2,7 @@ import { IRowRendererOptions, Tree } from '@stoplight/tree-list';
22import cn from 'classnames' ;
33import * as React from 'react' ;
44
5- import { getNodeMetadata , metadataStore } from '../tree/metadata' ;
5+ import { getNodeMetadata , getSchemaNodeMetadata } from '../tree/metadata' ;
66import { GoToRefHandler , SchemaKind , SchemaTreeListNode } from '../types' ;
77import { getPrimaryType } from '../utils/getPrimaryType' ;
88import { Caret , Description , Divider , Property , Validations } from './shared' ;
@@ -21,12 +21,12 @@ const ROW_OFFSET = 7;
2121function isRequired ( treeNode : SchemaTreeListNode ) {
2222 if ( treeNode . parent === null ) return false ;
2323 try {
24- const { path } = getNodeMetadata ( treeNode ) ;
24+ const { path } = getSchemaNodeMetadata ( treeNode ) ;
2525 if ( path . length === 0 ) {
2626 return false ;
2727 }
2828
29- const { schema } = getNodeMetadata ( treeNode . parent ) ;
29+ const { schema } = getSchemaNodeMetadata ( treeNode . parent ) ;
3030
3131 return (
3232 getPrimaryType ( schema ) === SchemaKind . Object &&
@@ -38,13 +38,60 @@ function isRequired(treeNode: SchemaTreeListNode) {
3838 }
3939}
4040
41- export const SchemaRow : React . FunctionComponent < ISchemaRow > = ( { className , node, rowOptions , onGoToRef } ) => {
42- const metadata = getNodeMetadata ( node ) ;
41+ export const SchemaPropertyRow : typeof SchemaRow = ( { node, onGoToRef , rowOptions } ) => {
42+ const metadata = getSchemaNodeMetadata ( node ) ;
4343 const { schemaNode } = metadata ;
4444
45- const parentSchemaNode = ( node . parent !== null && metadataStore . get ( node . parent ) ?. schemaNode ) || null ;
45+ const parentSchemaNode =
46+ ( node . parent !== null && Tree . getLevel ( node . parent ) >= 0 && getSchemaNodeMetadata ( node . parent ) ?. schemaNode ) || null ;
4647 const description = 'annotations' in schemaNode ? schemaNode . annotations . description : null ;
4748
49+ return (
50+ < >
51+ { 'children' in node && Tree . getLevel ( node ) > 0 && (
52+ < Caret
53+ isExpanded = { ! ! rowOptions . isExpanded }
54+ style = { {
55+ left : ICON_DIMENSION * - 1 + ROW_OFFSET / - 2 ,
56+ width : ICON_DIMENSION ,
57+ height : ICON_DIMENSION ,
58+ } }
59+ size = { ICON_SIZE }
60+ />
61+ ) }
62+
63+ { node . parent !== null &&
64+ node . parent . children . length > 0 &&
65+ parentSchemaNode !== null &&
66+ 'combiner' in parentSchemaNode &&
67+ node . parent . children [ 0 ] !== node && < Divider kind = { parentSchemaNode . combiner } /> }
68+
69+ < div className = "flex-1 flex truncate" >
70+ < Property node = { node } onGoToRef = { onGoToRef } />
71+ { description && < Description value = { description } /> }
72+ </ div >
73+
74+ < Validations
75+ required = { isRequired ( node ) }
76+ validations = { {
77+ ...( 'annotations' in schemaNode &&
78+ schemaNode . annotations . default && { default : schemaNode . annotations . default } ) ,
79+ ...( 'validations' in schemaNode && schemaNode . validations ) ,
80+ } }
81+ />
82+ </ >
83+ ) ;
84+ } ;
85+ SchemaPropertyRow . displayName = 'JsonSchemaViewer.SchemaPropertyRow' ;
86+
87+ export const SchemaErrorRow : React . FunctionComponent < { message : string } > = ( { message } ) => (
88+ < span className = "text-red-5 dark:text-red-4" > { message } </ span >
89+ ) ;
90+ SchemaErrorRow . displayName = 'JsonSchemaViewer.SchemaErrorRow' ;
91+
92+ export const SchemaRow : React . FunctionComponent < ISchemaRow > = ( { className, node, rowOptions, onGoToRef } ) => {
93+ const metadata = getNodeMetadata ( node ) ;
94+
4895 return (
4996 < div className = { cn ( 'px-2 flex-1 w-full' , className ) } >
5097 < div
@@ -53,37 +100,11 @@ export const SchemaRow: React.FunctionComponent<ISchemaRow> = ({ className, node
53100 marginLeft : ICON_DIMENSION * Tree . getLevel ( node ) , // offset for spacing
54101 } }
55102 >
56- { 'children' in node && Tree . getLevel ( node ) > 0 && (
57- < Caret
58- isExpanded = { ! ! rowOptions . isExpanded }
59- style = { {
60- left : ICON_DIMENSION * - 1 + ROW_OFFSET / - 2 ,
61- width : ICON_DIMENSION ,
62- height : ICON_DIMENSION ,
63- } }
64- size = { ICON_SIZE }
65- />
103+ { 'schema' in metadata ? (
104+ < SchemaPropertyRow node = { node } onGoToRef = { onGoToRef } rowOptions = { rowOptions } />
105+ ) : (
106+ < SchemaErrorRow message = { metadata . error } />
66107 ) }
67-
68- { node . parent !== null &&
69- node . parent . children . length > 0 &&
70- parentSchemaNode !== null &&
71- 'combiner' in parentSchemaNode &&
72- node . parent . children [ 0 ] !== node && < Divider kind = { parentSchemaNode . combiner } /> }
73-
74- < div className = "flex-1 flex truncate" >
75- < Property node = { node } onGoToRef = { onGoToRef } />
76- { description && < Description value = { description } /> }
77- </ div >
78-
79- < Validations
80- required = { isRequired ( node ) }
81- validations = { {
82- ...( 'annotations' in schemaNode &&
83- schemaNode . annotations . default && { default : schemaNode . annotations . default } ) ,
84- ...( 'validations' in schemaNode && schemaNode . validations ) ,
85- } }
86- />
87108 </ div >
88109 </ div >
89110 ) ;
0 commit comments