-
Notifications
You must be signed in to change notification settings - Fork 7
/
SForms.jsx
86 lines (70 loc) · 2.69 KB
/
SForms.jsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import React, { forwardRef, useEffect, useState } from 'react';
import PropTypes from 'prop-types';
import { FormGenContextProvider } from '../contexts/FormGenContext';
import { FormQuestionsProvider } from '../contexts/FormQuestionsContext';
import { ConfigurationContextProvider } from '../contexts/ConfigurationContext';
import FormGenerator from '../model/FormGenerator';
import FormManager from './FormManager';
import { FormUtils } from '../s-forms';
import { Card } from 'react-bootstrap';
import "@triply/yasgui/build/yasgui.min.css";
const SForms = forwardRef((props, ref) => {
const [loading, setLoading] = useState(true);
const [formProperties, setFormProperties] = useState(null);
const [form, setForm] = useState(null);
useEffect(() => {
const initialiseSForms = async () => {
const intl = props.options.intl;
const [formProperties, structure] = await FormGenerator.constructForm(props.form, intl);
if (formProperties.formQuestions.some((step) => FormUtils.isWizardStep(step))) {
formProperties.formQuestions[0].visited = true;
}
setFormProperties(formProperties);
setForm(structure);
setLoading(false);
};
initialiseSForms();
}, [props.form]);
if (loading) {
return props.loader || <Card className="p-3 font-italic">Loading SForms...</Card>;
}
const _getComponentMappingFunction = (components, form) => {
return (question, defaultComponent) => {
if (!components) {
return defaultComponent;
}
for (let { component, mapRule } of components) {
if (mapRule(question, form)) {
return component;
}
}
return defaultComponent;
};
}
const _mapComponent = _getComponentMappingFunction(props.componentMapRules, form);
return (
<ConfigurationContextProvider
components={props.components}
componentsOptions={props.componentsOptions}
mapComponent={_mapComponent}
options={props.options}
>
<FormGenContextProvider fetchTypeAheadValues={props.fetchTypeAheadValues}>
<FormQuestionsProvider data={form} formQuestions={formProperties.formQuestions} isFormValid={props.isFormValid}>
<FormManager ref={ref} modalView={props.options && props.options.modalView} mapComponent={_mapComponent} />
</FormQuestionsProvider>
</FormGenContextProvider>
</ConfigurationContextProvider>
);
});
SForms.propTypes = {
form: PropTypes.object.isRequired,
options: PropTypes.object.isRequired,
componentMapRules: PropTypes.array,
components: PropTypes.object,
componentsOptions: PropTypes.object,
fetchTypeAheadValues: PropTypes.func,
isFormValid: PropTypes.func,
loader: PropTypes.element
};
export default SForms;