@mieweb/forms-renderer 2.1.3-alpha.0 → 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 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
+ ```