@medplum/react 0.9.33 → 0.9.34
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/dist/cjs/QuestionnaireForm.d.ts +3 -1
- package/dist/cjs/index.js +48 -8
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/index.min.js +1 -1
- package/dist/cjs/index.min.js.map +1 -1
- package/dist/cjs/stories/QuestionnaireForm.stories.d.ts +1 -0
- package/dist/esm/QuestionnaireBuilder.js +1 -1
- package/dist/esm/QuestionnaireBuilder.js.map +1 -1
- package/dist/esm/QuestionnaireForm.d.ts +3 -1
- package/dist/esm/QuestionnaireForm.js +48 -9
- package/dist/esm/QuestionnaireForm.js.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.min.js +1 -1
- package/dist/esm/index.min.js.map +1 -1
- package/dist/esm/stories/QuestionnaireForm.stories.d.ts +1 -0
- package/package.json +5 -5
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
|
-
import { Questionnaire, QuestionnaireItem, QuestionnaireResponse, QuestionnaireResponseItem, Reference } from '@medplum/fhirtypes';
|
|
2
|
+
import { Questionnaire, QuestionnaireItem, QuestionnaireResponse, QuestionnaireResponseItem, QuestionnaireResponseItemAnswer, Reference } from '@medplum/fhirtypes';
|
|
3
3
|
import './QuestionnaireForm.css';
|
|
4
4
|
export interface QuestionnaireFormProps {
|
|
5
5
|
questionnaire: Questionnaire | Reference<Questionnaire>;
|
|
@@ -10,6 +10,8 @@ export interface QuestionnaireFormProps {
|
|
|
10
10
|
export declare function QuestionnaireForm(props: QuestionnaireFormProps): JSX.Element | null;
|
|
11
11
|
export interface QuestionnaireFormItemProps {
|
|
12
12
|
item: QuestionnaireItem;
|
|
13
|
+
answers: Record<string, QuestionnaireResponseItemAnswer>;
|
|
13
14
|
onChange: (newResponseItem: QuestionnaireResponseItem) => void;
|
|
14
15
|
}
|
|
15
16
|
export declare function QuestionnaireFormItem(props: QuestionnaireFormItemProps): JSX.Element | null;
|
|
17
|
+
export declare function isQuestionEnabled(item: QuestionnaireItem, answers: Record<string, QuestionnaireResponseItemAnswer>): boolean;
|
package/dist/cjs/index.js
CHANGED
|
@@ -5019,17 +5019,24 @@
|
|
|
5019
5019
|
const [schema, setSchema] = React.useState();
|
|
5020
5020
|
const questionnaire = useResource(props.questionnaire);
|
|
5021
5021
|
const [response, setResponse] = React.useState();
|
|
5022
|
+
const [answers, setAnswers] = React.useState({});
|
|
5022
5023
|
React.useEffect(() => {
|
|
5023
|
-
medplum
|
|
5024
|
+
medplum
|
|
5025
|
+
.requestSchema('Questionnaire')
|
|
5026
|
+
.then(() => medplum.requestSchema('QuestionnaireResponse'))
|
|
5027
|
+
.then(setSchema)
|
|
5028
|
+
.catch(console.log);
|
|
5024
5029
|
}, [medplum]);
|
|
5025
5030
|
React.useEffect(() => {
|
|
5026
5031
|
setResponse(questionnaire ? buildInitialResponse(questionnaire) : undefined);
|
|
5027
5032
|
}, [questionnaire]);
|
|
5028
5033
|
function setItems(newResponseItems) {
|
|
5029
|
-
|
|
5034
|
+
const newResponse = {
|
|
5030
5035
|
resourceType: 'QuestionnaireResponse',
|
|
5031
5036
|
item: newResponseItems,
|
|
5032
|
-
}
|
|
5037
|
+
};
|
|
5038
|
+
setResponse(newResponse);
|
|
5039
|
+
setAnswers(core.getQuestionnaireAnswers(newResponse));
|
|
5033
5040
|
}
|
|
5034
5041
|
if (!schema || !questionnaire) {
|
|
5035
5042
|
return null;
|
|
@@ -5040,7 +5047,7 @@
|
|
|
5040
5047
|
}
|
|
5041
5048
|
} },
|
|
5042
5049
|
questionnaire.title && React__default["default"].createElement("h1", null, questionnaire.title),
|
|
5043
|
-
questionnaire.item && React__default["default"].createElement(QuestionnaireFormItemArray, { items: questionnaire.item, onChange: setItems }),
|
|
5050
|
+
questionnaire.item && (React__default["default"].createElement(QuestionnaireFormItemArray, { items: questionnaire.item, answers: answers, onChange: setItems })),
|
|
5044
5051
|
React__default["default"].createElement(Button, { type: "submit", size: "large" }, props.submitButtonText || 'OK')));
|
|
5045
5052
|
}
|
|
5046
5053
|
function QuestionnaireFormItemArray(props) {
|
|
@@ -5052,11 +5059,14 @@
|
|
|
5052
5059
|
props.onChange(newResponseItems);
|
|
5053
5060
|
}
|
|
5054
5061
|
return (React__default["default"].createElement(React__default["default"].Fragment, null, props.items.map((item, index) => {
|
|
5062
|
+
if (!isQuestionEnabled(item, props.answers)) {
|
|
5063
|
+
return null;
|
|
5064
|
+
}
|
|
5055
5065
|
if (item.type === exports.QuestionnaireItemType.display) {
|
|
5056
5066
|
return React__default["default"].createElement("p", { key: item.linkId }, item.text);
|
|
5057
5067
|
}
|
|
5058
5068
|
if (item.type === exports.QuestionnaireItemType.group) {
|
|
5059
|
-
return (React__default["default"].createElement(QuestionnaireFormItem, { key: item.linkId, item: item, onChange: (newResponseItem) => setResponseItem(index, newResponseItem) }));
|
|
5069
|
+
return (React__default["default"].createElement(QuestionnaireFormItem, { key: item.linkId, item: item, answers: props.answers, onChange: (newResponseItem) => setResponseItem(index, newResponseItem) }));
|
|
5060
5070
|
}
|
|
5061
5071
|
if (item.type === exports.QuestionnaireItemType.boolean) {
|
|
5062
5072
|
const initial = item.initial && item.initial.length > 0 ? item.initial[0] : undefined;
|
|
@@ -5068,7 +5078,7 @@
|
|
|
5068
5078
|
}) })));
|
|
5069
5079
|
}
|
|
5070
5080
|
return (React__default["default"].createElement(FormSection, { key: item.linkId, htmlFor: item.linkId, title: item.text || '' },
|
|
5071
|
-
React__default["default"].createElement(QuestionnaireFormItem, { item: item, onChange: (newResponseItem) => setResponseItem(index, newResponseItem) })));
|
|
5081
|
+
React__default["default"].createElement(QuestionnaireFormItem, { item: item, answers: props.answers, onChange: (newResponseItem) => setResponseItem(index, newResponseItem) })));
|
|
5072
5082
|
})));
|
|
5073
5083
|
}
|
|
5074
5084
|
function QuestionnaireFormItem(props) {
|
|
@@ -5100,7 +5110,7 @@
|
|
|
5100
5110
|
case exports.QuestionnaireItemType.group:
|
|
5101
5111
|
return (React__default["default"].createElement("div", null,
|
|
5102
5112
|
React__default["default"].createElement("h3", null, item.text),
|
|
5103
|
-
item.item && React__default["default"].createElement(QuestionnaireFormItemArray, { items: item.item, onChange: onChangeItem })));
|
|
5113
|
+
item.item && (React__default["default"].createElement(QuestionnaireFormItemArray, { items: item.item, answers: props.answers, onChange: onChangeItem }))));
|
|
5104
5114
|
case exports.QuestionnaireItemType.boolean:
|
|
5105
5115
|
return (React__default["default"].createElement(Checkbox, { name: name, defaultValue: initial === null || initial === void 0 ? void 0 : initial.valueBoolean, onChange: (newValue) => onChangeAnswer({ valueBoolean: newValue }) }));
|
|
5106
5116
|
case exports.QuestionnaireItemType.decimal:
|
|
@@ -5211,6 +5221,35 @@
|
|
|
5211
5221
|
((_c = (_b = (_a = e.valueCodeableConcept) === null || _a === void 0 ? void 0 : _a.coding) === null || _b === void 0 ? void 0 : _b[0]) === null || _c === void 0 ? void 0 : _c.code) === 'drop-down';
|
|
5212
5222
|
}));
|
|
5213
5223
|
}
|
|
5224
|
+
function isQuestionEnabled(item, answers) {
|
|
5225
|
+
if (!item.enableWhen) {
|
|
5226
|
+
return true;
|
|
5227
|
+
}
|
|
5228
|
+
const enableBehavior = item.enableBehavior || 'any';
|
|
5229
|
+
for (const enableWhen of item.enableWhen) {
|
|
5230
|
+
const expectedAnswer = core.getTypedPropertyValue({
|
|
5231
|
+
type: 'QuestionnaireItemEnableWhen',
|
|
5232
|
+
value: enableWhen,
|
|
5233
|
+
}, 'answer[x]');
|
|
5234
|
+
const actualAnswer = core.getTypedPropertyValue({
|
|
5235
|
+
type: 'QuestionnaireResponseItemAnswer',
|
|
5236
|
+
value: answers[enableWhen.question],
|
|
5237
|
+
}, 'value[x]');
|
|
5238
|
+
const match = core.deepEquals(expectedAnswer, actualAnswer);
|
|
5239
|
+
if (enableBehavior === 'any' && match) {
|
|
5240
|
+
return true;
|
|
5241
|
+
}
|
|
5242
|
+
if (enableBehavior === 'all' && !match) {
|
|
5243
|
+
return false;
|
|
5244
|
+
}
|
|
5245
|
+
}
|
|
5246
|
+
if (enableBehavior === 'any') {
|
|
5247
|
+
return false;
|
|
5248
|
+
}
|
|
5249
|
+
else {
|
|
5250
|
+
return true;
|
|
5251
|
+
}
|
|
5252
|
+
}
|
|
5214
5253
|
|
|
5215
5254
|
function QuestionnaireBuilder(props) {
|
|
5216
5255
|
const medplum = useMedplum();
|
|
@@ -5307,7 +5346,7 @@
|
|
|
5307
5346
|
isChoiceQuestion(item) && (React__default["default"].createElement(AnswerBuilder, { options: item.answerOption, onChange: (newOptions) => changeProperty('answerOption', newOptions) })))) : (React__default["default"].createElement(React__default["default"].Fragment, null,
|
|
5308
5347
|
resource.title && React__default["default"].createElement("h1", null, resource.title),
|
|
5309
5348
|
item.text && React__default["default"].createElement("p", null, item.text),
|
|
5310
|
-
!isContainer && React__default["default"].createElement(QuestionnaireFormItem, { item: item, onChange: () => undefined }))),
|
|
5349
|
+
!isContainer && React__default["default"].createElement(QuestionnaireFormItem, { item: item, answers: {}, onChange: () => undefined }))),
|
|
5311
5350
|
item.item &&
|
|
5312
5351
|
item.item.map((i) => (React__default["default"].createElement("div", { key: i.id },
|
|
5313
5352
|
React__default["default"].createElement(ItemBuilder, { item: i, selectedKey: props.selectedKey, setSelectedKey: props.setSelectedKey, hoverKey: props.hoverKey, setHoverKey: props.setHoverKey, onChange: changeItem, onRemove: () => removeItem(i) })))),
|
|
@@ -6162,6 +6201,7 @@
|
|
|
6162
6201
|
exports.hasFilterOnField = hasFilterOnField;
|
|
6163
6202
|
exports.initRecaptcha = initRecaptcha;
|
|
6164
6203
|
exports.isChoiceQuestion = isChoiceQuestion;
|
|
6204
|
+
exports.isQuestionEnabled = isQuestionEnabled;
|
|
6165
6205
|
exports.isSortDescending = isSortDescending;
|
|
6166
6206
|
exports.movePage = movePage;
|
|
6167
6207
|
exports.parseForm = parseForm;
|