Markdown Components
Installation
npm install @semapps/markdown-components
You will also need to add this CSS file:
<link rel="stylesheet" href="https://unpkg.com/react-mde@11.5.0/lib/styles/css/react-mde-all.css" />
Components
MarkdownInput
This component allows you to enter Markdown content and preview it, using the React-mde editor.
import { Create, SimpleForm, TextInput } from 'react-admin';
import { MarkdownInput } from '@semapps/markdown-components';
export const MyCreate = (props) => (
<Create {...props}>
<SimpleForm>
<TextInput source="title" fullWidth />
<MarkdownInput source="description" fullWidth />
</SimpleForm>
</Create>
);
Please see React-mde documentation to know what other props can be passed.
MarkdownField
This component allows you to display Markdown content in HTML. It uses the markdown-to-jsx package.
import { Show, SimpleShowLayout, TextField } from 'react-admin';
import { MarkdownField } from '@semapps/markdown-components';
export const MyShow = (props) => (
<Show {...props}>
<SimpleShowLayout>
<TextField source="title" />
<MapField source="description" />
</SimpleShowLayout>
</Show>
);
Any other props are passed down to markdown-to-jsx options.
Rendering React components
By default, all top-level titles (#
) are converted to <LargeLabel>
.
You can change this by passing an overrides props.
You can also render arbitrary React components this way. All you need to do is pass the component definition.
import { Show, SimpleShowLayout, TextField } from 'react-admin';
import { MarkdownField } from '@semapps/markdown-components';
const SayHello = ({ who }) => ( <b>Hello {who} !</b> );
export const MyShow = (props) => (
<Show {...props}>
<SimpleShowLayout>
<TextField source="title" />
<MapField source="description" overrides={{ SayHello }} />
</SimpleShowLayout>
</Show>
);
Now if, in your Markdown document, you enter <SayHello who="World" >
, it will render as <b>Hello World !</b>
.
Hooks
useLoadLinks
This hook allows you to easily use React-mde suggestions to search for links to add to other resources.
import { Create, SimpleForm, TextInput } from 'react-admin';
import { MarkdownInput } from '@semapps/markdown-components';
export const MyCreate = (props) => {
const loadLinks = useLoadLinks('Page', 'title');
return (
<Create {...props}>
<SimpleForm>
<TextInput source="title" fullWidth />
<MarkdownInput source="description" loadSuggestions={loadLinks} suggestionTriggerCharacters="[" />
</SimpleForm>
</Create>
);
}
It takes 2 parameters:
- The type of resource to search (using React-Admin data provider)
- The field to use to display the title of the resource
At the moment it is only possible to search for a single type of resource.