$ref
With $ref keyword schema can reference another schema or itself.
To make this work, all referred schemas must be in context by passing them to <RepositoryProvider />.
<RepositoryProvider
components={repo}
schemas={[jsonSchema1, jsonSchema2]}
>
// ...
</RepositoryProvider>
Next, repository should have component, which resolves $ref. Ready-to-go component is available within @autoviews/core package.
import {RefComponent} from '@autoviews/core';
repo.register('$ref', RefComponent);
To make AutoViews automatically render this component when facing $ref keyword, repo's getNodeType should return keyword as type:
new ComponentsRepo('example-repo', node => {
if ('$ref' in node) {
return '$ref';
}
return node.type;
});
note
Order of resolving types in getNodeType does matter. By placing $ref condition before returning node.type all references will be resolved at the beginning of processing each node.
Full example
import React from 'react';
import {
AutoView,
RepositoryProvider,
CoreSchemaMetaSchema,
createUISchema
} from '@autoviews/core';
import {Box} from '@mui/material';
import userSchema from './UserSchema.json';
import bookSchema from './BookSchema.json';
import data from './data.json';
import {repo} from './repo';
const uiSchema = createUISchema({
[repo.name]: {
'/properties/name': {
name: 'title'
}
}
});
const App = () => {
return (
<Box>
<RepositoryProvider
components={repo}
schemas={[userSchema, bookSchema] as CoreSchemaMetaSchema[]}
>
<AutoView
uiSchema={uiSchema}
schema={bookSchema as CoreSchemaMetaSchema}
data={data}
metadata={{'The Fellowship of the Ring': 'tfotr.jpg'}}
/>
</RepositoryProvider>
</Box>
);
};
export default App;