@mieweb/forms-renderer 2.1.3 → 2.1.4-prerelease.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +343 -343
- package/dist/blaze.js +5073 -5070
- package/dist/blaze.umd.cjs +87 -87
- package/dist/react.js +84 -83
- package/dist/standalone.js +5592 -5589
- package/dist/standalone.umd.cjs +89 -89
- package/package.json +2 -2
- package/dist/react.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,343 +1,343 @@
|
|
|
1
|
-
# @mieweb/forms-renderer
|
|
2
|
-
|
|
3
|
-
Display questionnaires with three integration options: React, standalone Web Component, or Meteor Blaze.
|
|
4
|
-
|
|
5
|
-
## Installation
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
npm install @mieweb/forms-renderer
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
**Requirements:** React 18+ and React DOM 18+ (except for standalone and Blaze integrations which bundle React)
|
|
12
|
-
|
|
13
|
-
## Quick Start
|
|
14
|
-
|
|
15
|
-
### React Component
|
|
16
|
-
|
|
17
|
-
```jsx
|
|
18
|
-
import { QuestionnaireRenderer } from '@mieweb/forms-renderer';
|
|
19
|
-
|
|
20
|
-
function MyForm() {
|
|
21
|
-
const formData = {
|
|
22
|
-
schemaType: 'mieforms-v1.0',
|
|
23
|
-
fields: [
|
|
24
|
-
{ id: 'name', fieldType: 'text', question: 'Your name?', answer: '' }
|
|
25
|
-
]
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
return <QuestionnaireRenderer formData={formData} />;
|
|
29
|
-
}
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
### Standalone Web Component
|
|
33
|
-
|
|
34
|
-
```html
|
|
35
|
-
<script type="module">
|
|
36
|
-
import '@mieweb/forms-renderer/standalone';
|
|
37
|
-
|
|
38
|
-
document.querySelector('questionnaire-renderer').formData = {
|
|
39
|
-
schemaType: 'mieforms-v1.0',
|
|
40
|
-
fields: [...]
|
|
41
|
-
};
|
|
42
|
-
</script>
|
|
43
|
-
|
|
44
|
-
<questionnaire-renderer></questionnaire-renderer>
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
### Meteor Blaze
|
|
48
|
-
|
|
49
|
-
```javascript
|
|
50
|
-
import '@mieweb/forms-renderer/blaze';
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
```handlebars
|
|
54
|
-
{{> questionnaireRenderer formData=myFormData}}
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
## Documentation
|
|
58
|
-
|
|
59
|
-
**[Full Documentation](https://questionnaire-builder.opensource.mieweb.org/docs/renderer/overview)**
|
|
60
|
-
|
|
61
|
-
For detailed information, see:
|
|
62
|
-
- [Quick Start Guide](https://questionnaire-builder.opensource.mieweb.org/docs/getting-started/quickstart-renderer)
|
|
63
|
-
- [Props Reference](https://questionnaire-builder.opensource.mieweb.org/docs/renderer/props)
|
|
64
|
-
- [Get Response](https://questionnaire-builder.opensource.mieweb.org/docs/renderer/get-response)
|
|
65
|
-
- [Web Component](https://questionnaire-builder.opensource.mieweb.org/docs/renderer/web-component)
|
|
66
|
-
- [Blaze Integration](https://questionnaire-builder.opensource.mieweb.org/docs/renderer/blaze)
|
|
67
|
-
|
|
68
|
-
## Examples
|
|
69
|
-
|
|
70
|
-
- [`example-react.jsx`](./examples/example-react.jsx)
|
|
71
|
-
- [`example-standalone.html`](./examples/example-standalone.html)
|
|
72
|
-
- [`blaze-example.html`](./examples/blaze-example.html)
|
|
73
|
-
|
|
74
|
-
## License
|
|
75
|
-
|
|
76
|
-
MIT
|
|
77
|
-
```html
|
|
78
|
-
<!DOCTYPE html>
|
|
79
|
-
<html>
|
|
80
|
-
<head>
|
|
81
|
-
<script type="module">
|
|
82
|
-
import '@mieweb/forms-renderer/standalone';
|
|
83
|
-
</script>
|
|
84
|
-
</head>
|
|
85
|
-
<body>
|
|
86
|
-
<form id="myForm">
|
|
87
|
-
<questionnaire-renderer></questionnaire-renderer>
|
|
88
|
-
<button type="submit">Submit</button>
|
|
89
|
-
</form>
|
|
90
|
-
|
|
91
|
-
<script>
|
|
92
|
-
const renderer = document.querySelector('questionnaire-renderer');
|
|
93
|
-
|
|
94
|
-
// Auto-detection enabled by default (or set explicitly)
|
|
95
|
-
// renderer.schemaType = 'mieforms'; // or 'surveyjs'
|
|
96
|
-
|
|
97
|
-
// Hide unsupported field types (default: true)
|
|
98
|
-
renderer.hideUnsupportedFields = true;
|
|
99
|
-
|
|
100
|
-
renderer.formData = {
|
|
101
|
-
schemaType: 'mieforms-v1.0',
|
|
102
|
-
fields: [
|
|
103
|
-
{
|
|
104
|
-
id: 'q-name',
|
|
105
|
-
fieldType: 'text',
|
|
106
|
-
question: 'Full Name',
|
|
107
|
-
answer: ''
|
|
108
|
-
}
|
|
109
|
-
]
|
|
110
|
-
};
|
|
111
|
-
|
|
112
|
-
document.getElementById('myForm').addEventListener('submit', (e) => {
|
|
113
|
-
e.preventDefault();
|
|
114
|
-
const fhir = renderer.getQuestionnaireResponse('q-1', 'patient-123');
|
|
115
|
-
console.log(fhir);
|
|
116
|
-
});
|
|
117
|
-
</script>
|
|
118
|
-
</body>
|
|
119
|
-
</html>
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
---
|
|
123
|
-
|
|
124
|
-
### 3. Blaze Component (for Meteor apps)
|
|
125
|
-
|
|
126
|
-
**Install:**
|
|
127
|
-
```bash
|
|
128
|
-
meteor npm install @mieweb/forms-renderer
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
**Usage:**
|
|
132
|
-
```javascript
|
|
133
|
-
// In your Meteor client code
|
|
134
|
-
import '@mieweb/forms-renderer/blaze';
|
|
135
|
-
|
|
136
|
-
// If the above doesn't work in your Meteor version, try:
|
|
137
|
-
// import '@mieweb/forms-renderer/dist/blaze.js';
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
**In your Blaze template:**
|
|
141
|
-
```handlebars
|
|
142
|
-
{{> questionnaireRenderer
|
|
143
|
-
formData=myFormData
|
|
144
|
-
hideUnsupportedFields=true
|
|
145
|
-
onChange=handleChange}}
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
**Helper example:**
|
|
149
|
-
```javascript
|
|
150
|
-
Template.myTemplate.helpers({
|
|
151
|
-
myFormData() {
|
|
152
|
-
return {
|
|
153
|
-
schemaType: 'mieforms-v1.0',
|
|
154
|
-
fields: [
|
|
155
|
-
{ id: 'q1', fieldType: 'text', question: 'Name?', answer: '' }
|
|
156
|
-
]
|
|
157
|
-
};
|
|
158
|
-
},
|
|
159
|
-
handleChange() {
|
|
160
|
-
return (updatedFormData) => {
|
|
161
|
-
console.log('Form changed:', updatedFormData);
|
|
162
|
-
};
|
|
163
|
-
}
|
|
164
|
-
});
|
|
165
|
-
```
|
|
166
|
-
|
|
167
|
-
---
|
|
168
|
-
|
|
169
|
-
## API Reference
|
|
170
|
-
|
|
171
|
-
### React Component Props
|
|
172
|
-
|
|
173
|
-
- `formData` - Form data object, YAML string, or JSON string (supports auto-parsing)
|
|
174
|
-
- `schemaType` - Optional: `'mieforms'` or `'surveyjs'` (auto-detected if not provided)
|
|
175
|
-
- `onChange` - Callback when answers change (receives complete form data object)
|
|
176
|
-
- `onQuestionnaireResponse` - Callback when answers change (receives FHIR `QuestionnaireResponse`)
|
|
177
|
-
- `questionnaireId` - Questionnaire identifier used in the generated `QuestionnaireResponse` (default: `'questionnaire-1'`)
|
|
178
|
-
- `subjectId` - Optional subject id used in the generated `QuestionnaireResponse` (`Patient/{subjectId}`)
|
|
179
|
-
- `className` - Additional CSS classes
|
|
180
|
-
- `fullHeight` - Full viewport height mode
|
|
181
|
-
- `hideUnsupportedFields` - Hide unsupported field types (default: `true`)
|
|
182
|
-
- `storeRef` - Optional ref to access the internal store instance (advanced)
|
|
183
|
-
|
|
184
|
-
### 🔄 Breaking Changes (v0.1.14)
|
|
185
|
-
|
|
186
|
-
**Prop Rename:**
|
|
187
|
-
```jsx
|
|
188
|
-
// ❌ Before
|
|
189
|
-
<QuestionnaireRenderer fields={fields} />
|
|
190
|
-
|
|
191
|
-
// ✅ After
|
|
192
|
-
<QuestionnaireRenderer formData={formData} />
|
|
193
|
-
```
|
|
194
|
-
|
|
195
|
-
**onChange Callback:**
|
|
196
|
-
```jsx
|
|
197
|
-
// ❌ Before
|
|
198
|
-
onChange={(fields) => console.log(fields)}
|
|
199
|
-
|
|
200
|
-
// ✅ After
|
|
201
|
-
onChange={(formData) => console.log(formData)}
|
|
202
|
-
// formData = { schemaType, ...metadata, fields: [...] }
|
|
203
|
-
```
|
|
204
|
-
|
|
205
|
-
**Default for hideUnsupportedFields:**
|
|
206
|
-
```jsx
|
|
207
|
-
// Before: default was false
|
|
208
|
-
// After: default is true
|
|
209
|
-
<QuestionnaireRenderer
|
|
210
|
-
formData={data}
|
|
211
|
-
hideUnsupportedFields={false} // Explicitly set if you want to show unsupported
|
|
212
|
-
/>
|
|
213
|
-
```
|
|
214
|
-
|
|
215
|
-
### React Helpers
|
|
216
|
-
|
|
217
|
-
**`buildQuestionnaireResponse(fields, questionnaireId, subjectId)`**
|
|
218
|
-
|
|
219
|
-
Returns a FHIR `QuestionnaireResponse` for a given `fields` array. In React, you’ll typically either:
|
|
220
|
-
|
|
221
|
-
- Use `onQuestionnaireResponse` to receive a ready-to-use response, or
|
|
222
|
-
- Use `onChange` and pass `formData.fields` into `buildQuestionnaireResponse`.
|
|
223
|
-
|
|
224
|
-
```jsx
|
|
225
|
-
import React from 'react';
|
|
226
|
-
import { QuestionnaireRenderer, buildQuestionnaireResponse } from '@mieweb/forms-renderer';
|
|
227
|
-
|
|
228
|
-
export function MyForm({ formData }) {
|
|
229
|
-
const [latestFields, setLatestFields] = React.useState([]);
|
|
230
|
-
|
|
231
|
-
const onSubmit = (e) => {
|
|
232
|
-
e.preventDefault();
|
|
233
|
-
const fhir = buildQuestionnaireResponse(latestFields, 'q-1', 'patient-123');
|
|
234
|
-
console.log(fhir);
|
|
235
|
-
};
|
|
236
|
-
|
|
237
|
-
return (
|
|
238
|
-
<form onSubmit={onSubmit}>
|
|
239
|
-
<QuestionnaireRenderer formData={formData} onChange={(fd) => setLatestFields(fd.fields)} />
|
|
240
|
-
<button type="submit">Submit</button>
|
|
241
|
-
</form>
|
|
242
|
-
);
|
|
243
|
-
}
|
|
244
|
-
```
|
|
245
|
-
|
|
246
|
-
### Web Component API
|
|
247
|
-
|
|
248
|
-
- `renderer.formData` - Set/get form data (property) - accepts object, YAML, or JSON string
|
|
249
|
-
- `renderer.onChange` - Set change callback (property)
|
|
250
|
-
- `renderer.schemaType` - Optional: `'mieforms'` or `'surveyjs'` (auto-detected if not set)
|
|
251
|
-
- `renderer.hideUnsupportedFields` - Boolean to hide unsupported types (default: `true`)
|
|
252
|
-
- `renderer.getQuestionnaireResponse(id, subjectId)` - Get FHIR response (method)
|
|
253
|
-
|
|
254
|
-
**Migration:**
|
|
255
|
-
```js
|
|
256
|
-
// ❌ Before
|
|
257
|
-
renderer.fields = [...];
|
|
258
|
-
|
|
259
|
-
// ✅ After
|
|
260
|
-
renderer.formData = { schemaType: 'mieforms-v1.0', fields: [...] };
|
|
261
|
-
```
|
|
262
|
-
|
|
263
|
-
### Blaze Component Data Context
|
|
264
|
-
|
|
265
|
-
- `formData` - Form data object (with `schemaType` and `fields`)
|
|
266
|
-
- `schemaType` - Optional: `'mieforms'` or `'surveyjs'` (auto-detected if not provided)
|
|
267
|
-
- `onChange` - Change callback function (receives complete form data object)
|
|
268
|
-
- `onQuestionnaireResponse` - Callback when answers change (receives FHIR `QuestionnaireResponse`)
|
|
269
|
-
- `questionnaireId` - Questionnaire identifier used in the generated `QuestionnaireResponse` (default: `'questionnaire-1'`)
|
|
270
|
-
- `subjectId` - Optional subject id used in the generated `QuestionnaireResponse` (`Patient/{subjectId}`)
|
|
271
|
-
- `hideUnsupportedFields` - Boolean to hide unsupported types (default: `true`)
|
|
272
|
-
- `fullHeight` - Boolean for full height mode
|
|
273
|
-
|
|
274
|
-
**Migration:**
|
|
275
|
-
```handlebars
|
|
276
|
-
<!-- ❌ Before -->
|
|
277
|
-
{{> questionnaireRenderer fields=myFields}}
|
|
278
|
-
|
|
279
|
-
<!-- ✅ After -->
|
|
280
|
-
{{> questionnaireRenderer formData=myFormData}}
|
|
281
|
-
```
|
|
282
|
-
|
|
283
|
-
## Field Types
|
|
284
|
-
|
|
285
|
-
- `text` - Single-line text input
|
|
286
|
-
- `longtext` - Multi-line text area
|
|
287
|
-
- `multitext` - Multiple labeled text inputs
|
|
288
|
-
- `boolean` - Yes/No button selection
|
|
289
|
-
- `radio` - Single selection
|
|
290
|
-
- `check` - Multiple selection
|
|
291
|
-
- `dropdown` - Dropdown selection
|
|
292
|
-
- `section` - Container for grouping
|
|
293
|
-
|
|
294
|
-
## Conditional Logic
|
|
295
|
-
|
|
296
|
-
Show/hide fields based on other answers:
|
|
297
|
-
```javascript
|
|
298
|
-
{
|
|
299
|
-
id: 'sec-pregnancy',
|
|
300
|
-
fieldType: 'section',
|
|
301
|
-
title: 'Pregnancy Information',
|
|
302
|
-
enableWhen: {
|
|
303
|
-
logic: 'AND',
|
|
304
|
-
conditions: [
|
|
305
|
-
{ targetId: 'q-gender', operator: 'equals', value: 'gender-female' }
|
|
306
|
-
]
|
|
307
|
-
},
|
|
308
|
-
fields: [
|
|
309
|
-
{
|
|
310
|
-
id: 'q-weeks',
|
|
311
|
-
fieldType: 'text',
|
|
312
|
-
question: 'Weeks gestation (if known)',
|
|
313
|
-
answer: '',
|
|
314
|
-
enableWhen: {
|
|
315
|
-
logic: 'AND',
|
|
316
|
-
conditions: [
|
|
317
|
-
{ targetId: 'q-pregnant', operator: 'equals', value: 'preg-yes' }
|
|
318
|
-
]
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
]
|
|
322
|
-
}
|
|
323
|
-
```
|
|
324
|
-
|
|
325
|
-
## FHIR Output
|
|
326
|
-
|
|
327
|
-
FHIR QuestionnaireResponse format:
|
|
328
|
-
|
|
329
|
-
```javascript
|
|
330
|
-
{
|
|
331
|
-
resourceType: 'QuestionnaireResponse',
|
|
332
|
-
questionnaire: 'demo-1',
|
|
333
|
-
status: 'completed',
|
|
334
|
-
authored: '2023-01-01T12:00:00Z',
|
|
335
|
-
item: [
|
|
336
|
-
{
|
|
337
|
-
linkId: 'q1',
|
|
338
|
-
text: 'What is your name?',
|
|
339
|
-
answer: [{ valueString: 'John Doe' }]
|
|
340
|
-
}
|
|
341
|
-
]
|
|
342
|
-
}
|
|
343
|
-
```
|
|
1
|
+
# @mieweb/forms-renderer
|
|
2
|
+
|
|
3
|
+
Display questionnaires with three integration options: React, standalone Web Component, or Meteor Blaze.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @mieweb/forms-renderer
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
**Requirements:** React 18+ and React DOM 18+ (except for standalone and Blaze integrations which bundle React)
|
|
12
|
+
|
|
13
|
+
## Quick Start
|
|
14
|
+
|
|
15
|
+
### React Component
|
|
16
|
+
|
|
17
|
+
```jsx
|
|
18
|
+
import { QuestionnaireRenderer } from '@mieweb/forms-renderer';
|
|
19
|
+
|
|
20
|
+
function MyForm() {
|
|
21
|
+
const formData = {
|
|
22
|
+
schemaType: 'mieforms-v1.0',
|
|
23
|
+
fields: [
|
|
24
|
+
{ id: 'name', fieldType: 'text', question: 'Your name?', answer: '' }
|
|
25
|
+
]
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
return <QuestionnaireRenderer formData={formData} />;
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Standalone Web Component
|
|
33
|
+
|
|
34
|
+
```html
|
|
35
|
+
<script type="module">
|
|
36
|
+
import '@mieweb/forms-renderer/standalone';
|
|
37
|
+
|
|
38
|
+
document.querySelector('questionnaire-renderer').formData = {
|
|
39
|
+
schemaType: 'mieforms-v1.0',
|
|
40
|
+
fields: [...]
|
|
41
|
+
};
|
|
42
|
+
</script>
|
|
43
|
+
|
|
44
|
+
<questionnaire-renderer></questionnaire-renderer>
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Meteor Blaze
|
|
48
|
+
|
|
49
|
+
```javascript
|
|
50
|
+
import '@mieweb/forms-renderer/blaze';
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
```handlebars
|
|
54
|
+
{{> questionnaireRenderer formData=myFormData}}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Documentation
|
|
58
|
+
|
|
59
|
+
**[Full Documentation](https://questionnaire-builder.opensource.mieweb.org/docs/renderer/overview)**
|
|
60
|
+
|
|
61
|
+
For detailed information, see:
|
|
62
|
+
- [Quick Start Guide](https://questionnaire-builder.opensource.mieweb.org/docs/getting-started/quickstart-renderer)
|
|
63
|
+
- [Props Reference](https://questionnaire-builder.opensource.mieweb.org/docs/renderer/props)
|
|
64
|
+
- [Get Response](https://questionnaire-builder.opensource.mieweb.org/docs/renderer/get-response)
|
|
65
|
+
- [Web Component](https://questionnaire-builder.opensource.mieweb.org/docs/renderer/web-component)
|
|
66
|
+
- [Blaze Integration](https://questionnaire-builder.opensource.mieweb.org/docs/renderer/blaze)
|
|
67
|
+
|
|
68
|
+
## Examples
|
|
69
|
+
|
|
70
|
+
- [`example-react.jsx`](./examples/example-react.jsx)
|
|
71
|
+
- [`example-standalone.html`](./examples/example-standalone.html)
|
|
72
|
+
- [`blaze-example.html`](./examples/blaze-example.html)
|
|
73
|
+
|
|
74
|
+
## License
|
|
75
|
+
|
|
76
|
+
MIT
|
|
77
|
+
```html
|
|
78
|
+
<!DOCTYPE html>
|
|
79
|
+
<html>
|
|
80
|
+
<head>
|
|
81
|
+
<script type="module">
|
|
82
|
+
import '@mieweb/forms-renderer/standalone';
|
|
83
|
+
</script>
|
|
84
|
+
</head>
|
|
85
|
+
<body>
|
|
86
|
+
<form id="myForm">
|
|
87
|
+
<questionnaire-renderer></questionnaire-renderer>
|
|
88
|
+
<button type="submit">Submit</button>
|
|
89
|
+
</form>
|
|
90
|
+
|
|
91
|
+
<script>
|
|
92
|
+
const renderer = document.querySelector('questionnaire-renderer');
|
|
93
|
+
|
|
94
|
+
// Auto-detection enabled by default (or set explicitly)
|
|
95
|
+
// renderer.schemaType = 'mieforms'; // or 'surveyjs'
|
|
96
|
+
|
|
97
|
+
// Hide unsupported field types (default: true)
|
|
98
|
+
renderer.hideUnsupportedFields = true;
|
|
99
|
+
|
|
100
|
+
renderer.formData = {
|
|
101
|
+
schemaType: 'mieforms-v1.0',
|
|
102
|
+
fields: [
|
|
103
|
+
{
|
|
104
|
+
id: 'q-name',
|
|
105
|
+
fieldType: 'text',
|
|
106
|
+
question: 'Full Name',
|
|
107
|
+
answer: ''
|
|
108
|
+
}
|
|
109
|
+
]
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
document.getElementById('myForm').addEventListener('submit', (e) => {
|
|
113
|
+
e.preventDefault();
|
|
114
|
+
const fhir = renderer.getQuestionnaireResponse('q-1', 'patient-123');
|
|
115
|
+
console.log(fhir);
|
|
116
|
+
});
|
|
117
|
+
</script>
|
|
118
|
+
</body>
|
|
119
|
+
</html>
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
### 3. Blaze Component (for Meteor apps)
|
|
125
|
+
|
|
126
|
+
**Install:**
|
|
127
|
+
```bash
|
|
128
|
+
meteor npm install @mieweb/forms-renderer
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
**Usage:**
|
|
132
|
+
```javascript
|
|
133
|
+
// In your Meteor client code
|
|
134
|
+
import '@mieweb/forms-renderer/blaze';
|
|
135
|
+
|
|
136
|
+
// If the above doesn't work in your Meteor version, try:
|
|
137
|
+
// import '@mieweb/forms-renderer/dist/blaze.js';
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
**In your Blaze template:**
|
|
141
|
+
```handlebars
|
|
142
|
+
{{> questionnaireRenderer
|
|
143
|
+
formData=myFormData
|
|
144
|
+
hideUnsupportedFields=true
|
|
145
|
+
onChange=handleChange}}
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
**Helper example:**
|
|
149
|
+
```javascript
|
|
150
|
+
Template.myTemplate.helpers({
|
|
151
|
+
myFormData() {
|
|
152
|
+
return {
|
|
153
|
+
schemaType: 'mieforms-v1.0',
|
|
154
|
+
fields: [
|
|
155
|
+
{ id: 'q1', fieldType: 'text', question: 'Name?', answer: '' }
|
|
156
|
+
]
|
|
157
|
+
};
|
|
158
|
+
},
|
|
159
|
+
handleChange() {
|
|
160
|
+
return (updatedFormData) => {
|
|
161
|
+
console.log('Form changed:', updatedFormData);
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## API Reference
|
|
170
|
+
|
|
171
|
+
### React Component Props
|
|
172
|
+
|
|
173
|
+
- `formData` - Form data object, YAML string, or JSON string (supports auto-parsing)
|
|
174
|
+
- `schemaType` - Optional: `'mieforms'` or `'surveyjs'` (auto-detected if not provided)
|
|
175
|
+
- `onChange` - Callback when answers change (receives complete form data object)
|
|
176
|
+
- `onQuestionnaireResponse` - Callback when answers change (receives FHIR `QuestionnaireResponse`)
|
|
177
|
+
- `questionnaireId` - Questionnaire identifier used in the generated `QuestionnaireResponse` (default: `'questionnaire-1'`)
|
|
178
|
+
- `subjectId` - Optional subject id used in the generated `QuestionnaireResponse` (`Patient/{subjectId}`)
|
|
179
|
+
- `className` - Additional CSS classes
|
|
180
|
+
- `fullHeight` - Full viewport height mode
|
|
181
|
+
- `hideUnsupportedFields` - Hide unsupported field types (default: `true`)
|
|
182
|
+
- `storeRef` - Optional ref to access the internal store instance (advanced)
|
|
183
|
+
|
|
184
|
+
### 🔄 Breaking Changes (v0.1.14)
|
|
185
|
+
|
|
186
|
+
**Prop Rename:**
|
|
187
|
+
```jsx
|
|
188
|
+
// ❌ Before
|
|
189
|
+
<QuestionnaireRenderer fields={fields} />
|
|
190
|
+
|
|
191
|
+
// ✅ After
|
|
192
|
+
<QuestionnaireRenderer formData={formData} />
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
**onChange Callback:**
|
|
196
|
+
```jsx
|
|
197
|
+
// ❌ Before
|
|
198
|
+
onChange={(fields) => console.log(fields)}
|
|
199
|
+
|
|
200
|
+
// ✅ After
|
|
201
|
+
onChange={(formData) => console.log(formData)}
|
|
202
|
+
// formData = { schemaType, ...metadata, fields: [...] }
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
**Default for hideUnsupportedFields:**
|
|
206
|
+
```jsx
|
|
207
|
+
// Before: default was false
|
|
208
|
+
// After: default is true
|
|
209
|
+
<QuestionnaireRenderer
|
|
210
|
+
formData={data}
|
|
211
|
+
hideUnsupportedFields={false} // Explicitly set if you want to show unsupported
|
|
212
|
+
/>
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### React Helpers
|
|
216
|
+
|
|
217
|
+
**`buildQuestionnaireResponse(fields, questionnaireId, subjectId)`**
|
|
218
|
+
|
|
219
|
+
Returns a FHIR `QuestionnaireResponse` for a given `fields` array. In React, you’ll typically either:
|
|
220
|
+
|
|
221
|
+
- Use `onQuestionnaireResponse` to receive a ready-to-use response, or
|
|
222
|
+
- Use `onChange` and pass `formData.fields` into `buildQuestionnaireResponse`.
|
|
223
|
+
|
|
224
|
+
```jsx
|
|
225
|
+
import React from 'react';
|
|
226
|
+
import { QuestionnaireRenderer, buildQuestionnaireResponse } from '@mieweb/forms-renderer';
|
|
227
|
+
|
|
228
|
+
export function MyForm({ formData }) {
|
|
229
|
+
const [latestFields, setLatestFields] = React.useState([]);
|
|
230
|
+
|
|
231
|
+
const onSubmit = (e) => {
|
|
232
|
+
e.preventDefault();
|
|
233
|
+
const fhir = buildQuestionnaireResponse(latestFields, 'q-1', 'patient-123');
|
|
234
|
+
console.log(fhir);
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
return (
|
|
238
|
+
<form onSubmit={onSubmit}>
|
|
239
|
+
<QuestionnaireRenderer formData={formData} onChange={(fd) => setLatestFields(fd.fields)} />
|
|
240
|
+
<button type="submit">Submit</button>
|
|
241
|
+
</form>
|
|
242
|
+
);
|
|
243
|
+
}
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
### Web Component API
|
|
247
|
+
|
|
248
|
+
- `renderer.formData` - Set/get form data (property) - accepts object, YAML, or JSON string
|
|
249
|
+
- `renderer.onChange` - Set change callback (property)
|
|
250
|
+
- `renderer.schemaType` - Optional: `'mieforms'` or `'surveyjs'` (auto-detected if not set)
|
|
251
|
+
- `renderer.hideUnsupportedFields` - Boolean to hide unsupported types (default: `true`)
|
|
252
|
+
- `renderer.getQuestionnaireResponse(id, subjectId)` - Get FHIR response (method)
|
|
253
|
+
|
|
254
|
+
**Migration:**
|
|
255
|
+
```js
|
|
256
|
+
// ❌ Before
|
|
257
|
+
renderer.fields = [...];
|
|
258
|
+
|
|
259
|
+
// ✅ After
|
|
260
|
+
renderer.formData = { schemaType: 'mieforms-v1.0', fields: [...] };
|
|
261
|
+
```
|
|
262
|
+
|
|
263
|
+
### Blaze Component Data Context
|
|
264
|
+
|
|
265
|
+
- `formData` - Form data object (with `schemaType` and `fields`)
|
|
266
|
+
- `schemaType` - Optional: `'mieforms'` or `'surveyjs'` (auto-detected if not provided)
|
|
267
|
+
- `onChange` - Change callback function (receives complete form data object)
|
|
268
|
+
- `onQuestionnaireResponse` - Callback when answers change (receives FHIR `QuestionnaireResponse`)
|
|
269
|
+
- `questionnaireId` - Questionnaire identifier used in the generated `QuestionnaireResponse` (default: `'questionnaire-1'`)
|
|
270
|
+
- `subjectId` - Optional subject id used in the generated `QuestionnaireResponse` (`Patient/{subjectId}`)
|
|
271
|
+
- `hideUnsupportedFields` - Boolean to hide unsupported types (default: `true`)
|
|
272
|
+
- `fullHeight` - Boolean for full height mode
|
|
273
|
+
|
|
274
|
+
**Migration:**
|
|
275
|
+
```handlebars
|
|
276
|
+
<!-- ❌ Before -->
|
|
277
|
+
{{> questionnaireRenderer fields=myFields}}
|
|
278
|
+
|
|
279
|
+
<!-- ✅ After -->
|
|
280
|
+
{{> questionnaireRenderer formData=myFormData}}
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
## Field Types
|
|
284
|
+
|
|
285
|
+
- `text` - Single-line text input
|
|
286
|
+
- `longtext` - Multi-line text area
|
|
287
|
+
- `multitext` - Multiple labeled text inputs
|
|
288
|
+
- `boolean` - Yes/No button selection
|
|
289
|
+
- `radio` - Single selection
|
|
290
|
+
- `check` - Multiple selection
|
|
291
|
+
- `dropdown` - Dropdown selection
|
|
292
|
+
- `section` - Container for grouping
|
|
293
|
+
|
|
294
|
+
## Conditional Logic
|
|
295
|
+
|
|
296
|
+
Show/hide fields based on other answers:
|
|
297
|
+
```javascript
|
|
298
|
+
{
|
|
299
|
+
id: 'sec-pregnancy',
|
|
300
|
+
fieldType: 'section',
|
|
301
|
+
title: 'Pregnancy Information',
|
|
302
|
+
enableWhen: {
|
|
303
|
+
logic: 'AND',
|
|
304
|
+
conditions: [
|
|
305
|
+
{ targetId: 'q-gender', operator: 'equals', value: 'gender-female' }
|
|
306
|
+
]
|
|
307
|
+
},
|
|
308
|
+
fields: [
|
|
309
|
+
{
|
|
310
|
+
id: 'q-weeks',
|
|
311
|
+
fieldType: 'text',
|
|
312
|
+
question: 'Weeks gestation (if known)',
|
|
313
|
+
answer: '',
|
|
314
|
+
enableWhen: {
|
|
315
|
+
logic: 'AND',
|
|
316
|
+
conditions: [
|
|
317
|
+
{ targetId: 'q-pregnant', operator: 'equals', value: 'preg-yes' }
|
|
318
|
+
]
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
]
|
|
322
|
+
}
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
## FHIR Output
|
|
326
|
+
|
|
327
|
+
FHIR QuestionnaireResponse format:
|
|
328
|
+
|
|
329
|
+
```javascript
|
|
330
|
+
{
|
|
331
|
+
resourceType: 'QuestionnaireResponse',
|
|
332
|
+
questionnaire: 'demo-1',
|
|
333
|
+
status: 'completed',
|
|
334
|
+
authored: '2023-01-01T12:00:00Z',
|
|
335
|
+
item: [
|
|
336
|
+
{
|
|
337
|
+
linkId: 'q1',
|
|
338
|
+
text: 'What is your name?',
|
|
339
|
+
answer: [{ valueString: 'John Doe' }]
|
|
340
|
+
}
|
|
341
|
+
]
|
|
342
|
+
}
|
|
343
|
+
```
|