@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.
@@ -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.requestSchema('Questionnaire').then(setSchema).catch(console.log);
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
- setResponse({
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;