added a widget to allow markdown fields for rjsf (#461)
Co-authored-by: jasquat <jasquat@users.noreply.github.com>
This commit is contained in:
parent
f2cddc1e3b
commit
25540f32e0
|
@ -4,6 +4,7 @@ import { Form } from '../rjsf/carbon_theme';
|
||||||
import { DATE_RANGE_DELIMITER } from '../config';
|
import { DATE_RANGE_DELIMITER } from '../config';
|
||||||
import DateRangePickerWidget from '../rjsf/custom_widgets/DateRangePicker/DateRangePickerWidget';
|
import DateRangePickerWidget from '../rjsf/custom_widgets/DateRangePicker/DateRangePickerWidget';
|
||||||
import TypeaheadWidget from '../rjsf/custom_widgets/TypeaheadWidget/TypeaheadWidget';
|
import TypeaheadWidget from '../rjsf/custom_widgets/TypeaheadWidget/TypeaheadWidget';
|
||||||
|
import MarkDownFieldWidget from '../rjsf/custom_widgets/MarkDownFieldWidget/MarkDownFieldWidget';
|
||||||
|
|
||||||
type OwnProps = {
|
type OwnProps = {
|
||||||
id: string;
|
id: string;
|
||||||
|
@ -32,6 +33,7 @@ export default function CustomForm({
|
||||||
const rjsfWidgets = {
|
const rjsfWidgets = {
|
||||||
typeahead: TypeaheadWidget,
|
typeahead: TypeaheadWidget,
|
||||||
'date-range': DateRangePickerWidget,
|
'date-range': DateRangePickerWidget,
|
||||||
|
markdown: MarkDownFieldWidget,
|
||||||
};
|
};
|
||||||
|
|
||||||
const formatDateString = (dateString?: string) => {
|
const formatDateString = (dateString?: string) => {
|
||||||
|
|
|
@ -0,0 +1,75 @@
|
||||||
|
import MDEditor from '@uiw/react-md-editor';
|
||||||
|
import React, { useCallback } from 'react';
|
||||||
|
|
||||||
|
interface widgetArgs {
|
||||||
|
id: string;
|
||||||
|
value: any;
|
||||||
|
schema?: any;
|
||||||
|
uiSchema?: any;
|
||||||
|
disabled?: boolean;
|
||||||
|
readonly?: boolean;
|
||||||
|
rawErrors?: any;
|
||||||
|
onChange?: any;
|
||||||
|
autofocus?: any;
|
||||||
|
label?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
// NOTE: To properly validate that both start and end dates are specified
|
||||||
|
// use this pattern in schemaJson for that field:
|
||||||
|
// "pattern": "\\d{4}-\\d{2}-\\d{2}:::\\d{4}-\\d{2}-\\d{2}"
|
||||||
|
|
||||||
|
// eslint-disable-next-line sonarjs/cognitive-complexity
|
||||||
|
export default function MarkDownFieldWidget({
|
||||||
|
id,
|
||||||
|
value,
|
||||||
|
schema,
|
||||||
|
uiSchema,
|
||||||
|
disabled,
|
||||||
|
readonly,
|
||||||
|
onChange,
|
||||||
|
autofocus,
|
||||||
|
label,
|
||||||
|
rawErrors = [],
|
||||||
|
}: widgetArgs) {
|
||||||
|
let invalid = false;
|
||||||
|
let errorMessageForField = null;
|
||||||
|
|
||||||
|
let labelToUse = label;
|
||||||
|
if (uiSchema && uiSchema['ui:title']) {
|
||||||
|
labelToUse = uiSchema['ui:title'];
|
||||||
|
} else if (schema && schema.title) {
|
||||||
|
labelToUse = schema.title;
|
||||||
|
}
|
||||||
|
|
||||||
|
const onChangeLocal = useCallback(
|
||||||
|
(newValue: any) => {
|
||||||
|
onChange(newValue);
|
||||||
|
},
|
||||||
|
[onChange]
|
||||||
|
);
|
||||||
|
|
||||||
|
let helperText = null;
|
||||||
|
if (uiSchema && uiSchema['ui:help']) {
|
||||||
|
helperText = uiSchema['ui:help'];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!invalid && rawErrors && rawErrors.length > 0) {
|
||||||
|
invalid = true;
|
||||||
|
if ('validationErrorMessage' in schema) {
|
||||||
|
errorMessageForField = (schema as any).validationErrorMessage;
|
||||||
|
} else {
|
||||||
|
errorMessageForField = `${(labelToUse || '').replace(/\*$/, '')} ${
|
||||||
|
rawErrors[0]
|
||||||
|
}`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<MDEditor
|
||||||
|
height={500}
|
||||||
|
highlightEnable={false}
|
||||||
|
value={value}
|
||||||
|
onChange={onChangeLocal}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
Loading…
Reference in New Issue