@medplum/react 0.9.35 → 0.9.37

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.
Files changed (40) hide show
  1. package/dist/cjs/QuestionnaireUtils.d.ts +1 -10
  2. package/dist/cjs/SearchFilterValueDisplay.d.ts +1 -1
  3. package/dist/cjs/auth/AuthenticationForm.d.ts +1 -0
  4. package/dist/cjs/index.js +49 -93
  5. package/dist/cjs/index.js.map +1 -1
  6. package/dist/cjs/index.min.js +1 -1
  7. package/dist/cjs/index.min.js.map +1 -1
  8. package/dist/esm/AddressInput.js.map +1 -1
  9. package/dist/esm/ContactPointInput.js +2 -1
  10. package/dist/esm/ContactPointInput.js.map +1 -1
  11. package/dist/esm/HumanNameInput.js.map +1 -1
  12. package/dist/esm/PlanDefinitionBuilder.js +2 -0
  13. package/dist/esm/PlanDefinitionBuilder.js.map +1 -1
  14. package/dist/esm/Popup.js +10 -0
  15. package/dist/esm/Popup.js.map +1 -1
  16. package/dist/esm/QuantityInput.js.map +1 -1
  17. package/dist/esm/QuestionnaireBuilder.js +9 -0
  18. package/dist/esm/QuestionnaireBuilder.js.map +1 -1
  19. package/dist/esm/QuestionnaireUtils.d.ts +1 -10
  20. package/dist/esm/QuestionnaireUtils.js +1 -78
  21. package/dist/esm/QuestionnaireUtils.js.map +1 -1
  22. package/dist/esm/RequestGroupDisplay.js +1 -0
  23. package/dist/esm/RequestGroupDisplay.js.map +1 -1
  24. package/dist/esm/ResourceTimeline.js.map +1 -1
  25. package/dist/esm/SearchControl.js +1 -0
  26. package/dist/esm/SearchControl.js.map +1 -1
  27. package/dist/esm/SearchFilterValueDisplay.d.ts +1 -1
  28. package/dist/esm/SearchFilterValueDisplay.js +11 -11
  29. package/dist/esm/SearchFilterValueDisplay.js.map +1 -1
  30. package/dist/esm/TimingInput.js.map +1 -1
  31. package/dist/esm/auth/AuthenticationForm.d.ts +1 -0
  32. package/dist/esm/auth/AuthenticationForm.js +14 -6
  33. package/dist/esm/auth/AuthenticationForm.js.map +1 -1
  34. package/dist/esm/auth/SignInForm.js +1 -1
  35. package/dist/esm/auth/SignInForm.js.map +1 -1
  36. package/dist/esm/index.js +1 -1
  37. package/dist/esm/index.min.js +1 -1
  38. package/dist/esm/index.min.js.map +1 -1
  39. package/package.json +5 -5
  40. package/stats.html +0 -4034
@@ -1,4 +1,4 @@
1
- import { Questionnaire, QuestionnaireItem } from '@medplum/fhirtypes';
1
+ import { QuestionnaireItem } from '@medplum/fhirtypes';
2
2
  export declare enum QuestionnaireItemType {
3
3
  group = "group",
4
4
  display = "display",
@@ -18,13 +18,4 @@ export declare enum QuestionnaireItemType {
18
18
  reference = "reference",
19
19
  quantity = "quantity"
20
20
  }
21
- /**
22
- * Adds initial values to a questionnaire resource from key value pairs.
23
- * The values map uses "linkId" as key.
24
- * The value depends on the questionnaire item type.
25
- * @param questionnaire The original questionnaire.
26
- * @param values Key value pairs for initial values.
27
- * @returns Rewritten questionnaire with initial values.
28
- */
29
- export declare function addQuestionnaireInitialValues(questionnaire: Questionnaire, values: Record<string, string>): Questionnaire;
30
21
  export declare function isChoiceQuestion(item: QuestionnaireItem): boolean;
@@ -4,4 +4,4 @@ export interface SearchFilterValueDisplayProps {
4
4
  readonly resourceType: string;
5
5
  readonly filter: Filter;
6
6
  }
7
- export declare function SearchFilterValueDisplay(props: SearchFilterValueDisplayProps): JSX.Element | null;
7
+ export declare function SearchFilterValueDisplay(props: SearchFilterValueDisplayProps): JSX.Element;
@@ -6,6 +6,7 @@ export interface AuthenticationFormProps {
6
6
  readonly scope?: string;
7
7
  readonly nonce?: string;
8
8
  readonly googleClientId?: string;
9
+ readonly generatePkce?: boolean;
9
10
  readonly codeChallenge?: string;
10
11
  readonly codeChallengeMethod?: string;
11
12
  readonly onForgotPassword?: () => void;
package/dist/cjs/index.js CHANGED
@@ -724,9 +724,16 @@
724
724
  const googleClientId = getGoogleClientId(props.googleClientId);
725
725
  const [outcome, setOutcome] = React.useState();
726
726
  const issues = getIssuesForExpression(outcome, undefined);
727
+ function startPkce() {
728
+ return __awaiter(this, void 0, void 0, function* () {
729
+ if (props.generatePkce) {
730
+ yield medplum.startPkce();
731
+ }
732
+ });
733
+ }
727
734
  return (React__default["default"].createElement(Form, { style: { maxWidth: 400 }, onSubmit: (formData) => {
728
- medplum
729
- .startLogin({
735
+ startPkce()
736
+ .then(() => medplum.startLogin({
730
737
  projectId: props.projectId,
731
738
  clientId: props.clientId,
732
739
  scope: props.scope,
@@ -736,7 +743,7 @@
736
743
  email: formData.email,
737
744
  password: formData.password,
738
745
  remember: formData.remember === 'true',
739
- })
746
+ }))
740
747
  .then(props.handleAuthResponse)
741
748
  .catch(setOutcome);
742
749
  } },
@@ -748,8 +755,8 @@
748
755
  googleClientId && (React__default["default"].createElement(React__default["default"].Fragment, null,
749
756
  React__default["default"].createElement("div", { className: "medplum-signin-google-container" },
750
757
  React__default["default"].createElement(GoogleButton, { googleClientId: googleClientId, handleGoogleCredential: (response) => {
751
- medplum
752
- .startGoogleLogin({
758
+ startPkce()
759
+ .then(() => medplum.startGoogleLogin({
753
760
  projectId: props.projectId,
754
761
  clientId: props.clientId,
755
762
  scope: props.scope,
@@ -758,7 +765,7 @@
758
765
  codeChallengeMethod: props.codeChallengeMethod,
759
766
  googleClientId: response.clientId,
760
767
  googleCredential: response.credential,
761
- })
768
+ }))
762
769
  .then(props.handleAuthResponse)
763
770
  .catch(setOutcome);
764
771
  } })),
@@ -909,7 +916,7 @@
909
916
  }
910
917
  return (React__default["default"].createElement(Document, { width: 450 }, (() => {
911
918
  if (!login) {
912
- return (React__default["default"].createElement(AuthenticationForm, { projectId: props.projectId, clientId: props.clientId, scope: props.scope, nonce: props.nonce, googleClientId: props.googleClientId, codeChallenge: props.codeChallenge, codeChallengeMethod: props.codeChallengeMethod, onForgotPassword: props.onForgotPassword, onRegister: props.onRegister, handleAuthResponse: handleAuthResponse }, props.children));
919
+ return (React__default["default"].createElement(AuthenticationForm, { projectId: props.projectId, clientId: props.clientId, scope: props.scope, nonce: props.nonce, googleClientId: props.googleClientId, generatePkce: !props.onCode, codeChallenge: props.codeChallenge, codeChallengeMethod: props.codeChallengeMethod, onForgotPassword: props.onForgotPassword, onRegister: props.onRegister, handleAuthResponse: handleAuthResponse }, props.children));
913
920
  }
914
921
  else if (memberships) {
915
922
  return React__default["default"].createElement(ChooseProfileForm, { login: login, memberships: memberships, handleAuthResponse: handleAuthResponse });
@@ -1703,7 +1710,8 @@
1703
1710
  React__default["default"].createElement("option", null, "pager"),
1704
1711
  React__default["default"].createElement("option", null, "phone"),
1705
1712
  React__default["default"].createElement("option", null, "other"),
1706
- React__default["default"].createElement("option", null, "sms")),
1713
+ React__default["default"].createElement("option", null, "sms"),
1714
+ React__default["default"].createElement("option", null, "url")),
1707
1715
  React__default["default"].createElement(Select, { defaultValue: contactPoint === null || contactPoint === void 0 ? void 0 : contactPoint.use, onChange: setUse, testid: "use" },
1708
1716
  React__default["default"].createElement("option", null),
1709
1717
  React__default["default"].createElement("option", null, "home"),
@@ -2572,9 +2580,19 @@
2572
2580
  props.onClose();
2573
2581
  }
2574
2582
  }
2583
+ function handleScroll(e) {
2584
+ var _a;
2585
+ if ((_a = propsRef.current) === null || _a === void 0 ? void 0 : _a.visible) {
2586
+ killEvent(e);
2587
+ }
2588
+ }
2575
2589
  document.addEventListener('click', handleClick, true);
2590
+ window.addEventListener('wheel', handleScroll, { passive: false });
2591
+ window.addEventListener('touchmove', handleScroll, true);
2576
2592
  return () => {
2577
2593
  document.removeEventListener('click', handleClick, true);
2594
+ window.removeEventListener('wheel', handleScroll);
2595
+ window.removeEventListener('touchmove', handleScroll, true);
2578
2596
  };
2579
2597
  }, [props]);
2580
2598
  // Listen for changes in the location
@@ -3734,15 +3752,16 @@
3734
3752
 
3735
3753
  function SearchFilterValueDisplay(props) {
3736
3754
  var _a, _b;
3737
- const medplum = useMedplum();
3738
- const schema = medplum.getSchema();
3739
- const searchParam = (_b = (_a = schema.types[props.resourceType]) === null || _a === void 0 ? void 0 : _a.searchParams) === null || _b === void 0 ? void 0 : _b[props.filter.code];
3740
- const filter = props.filter;
3741
- if ((searchParam === null || searchParam === void 0 ? void 0 : searchParam.type) === 'reference') {
3742
- return React__default["default"].createElement(ResourceName, { value: { reference: filter.value } });
3743
- }
3744
- if (props.filter.code === '_lastUpdated' || (searchParam === null || searchParam === void 0 ? void 0 : searchParam.type) === 'datetime') {
3745
- return React__default["default"].createElement(React__default["default"].Fragment, null, core.formatDateTime(filter.value));
3755
+ const { resourceType, filter } = props;
3756
+ const searchParam = (_b = (_a = core.globalSchema.types[resourceType]) === null || _a === void 0 ? void 0 : _a.searchParams) === null || _b === void 0 ? void 0 : _b[filter.code];
3757
+ if (searchParam) {
3758
+ if (searchParam.type === 'reference') {
3759
+ return React__default["default"].createElement(ResourceName, { value: { reference: filter.value } });
3760
+ }
3761
+ const searchParamDetails = core.getSearchParameterDetails(resourceType, searchParam);
3762
+ if (filter.code === '_lastUpdated' || searchParamDetails.type === core.SearchParameterType.DATETIME) {
3763
+ return React__default["default"].createElement(React__default["default"].Fragment, null, core.formatDateTime(filter.value));
3764
+ }
3746
3765
  }
3747
3766
  return React__default["default"].createElement(React__default["default"].Fragment, null, filter.value);
3748
3767
  }
@@ -4205,6 +4224,7 @@
4205
4224
  }
4206
4225
  }
4207
4226
  React.useEffect(() => {
4227
+ setSchemaLoaded(false);
4208
4228
  medplum
4209
4229
  .requestSchema(props.search.resourceType)
4210
4230
  .then(() => setSchemaLoaded(true))
@@ -4834,6 +4854,8 @@
4834
4854
  return (React__default["default"].createElement(React__default["default"].Fragment, null,
4835
4855
  React__default["default"].createElement(FormSection, { title: "Title", htmlFor: `actionTitle-${action.id}` },
4836
4856
  React__default["default"].createElement(Input, { name: `actionTitle-${action.id}`, defaultValue: action.title, onChange: (newValue) => changeProperty('title', newValue) })),
4857
+ React__default["default"].createElement(FormSection, { title: "Description", htmlFor: `actionDescription-${action.id}` },
4858
+ React__default["default"].createElement(Input, { name: `actionDescription-${action.id}`, defaultValue: action.description, onChange: (newValue) => changeProperty('description', newValue) })),
4837
4859
  React__default["default"].createElement(FormSection, { title: "Type of Action", description: "The type of the action to be performed.", htmlFor: `actionType-${action.id}` },
4838
4860
  React__default["default"].createElement(Select, { name: `actionType-${action.id}`, defaultValue: actionType, onChange: setActionType },
4839
4861
  React__default["default"].createElement("option", null),
@@ -4948,81 +4970,6 @@
4948
4970
  QuestionnaireItemType["reference"] = "reference";
4949
4971
  QuestionnaireItemType["quantity"] = "quantity";
4950
4972
  })(exports.QuestionnaireItemType || (exports.QuestionnaireItemType = {}));
4951
- /**
4952
- * Adds initial values to a questionnaire resource from key value pairs.
4953
- * The values map uses "linkId" as key.
4954
- * The value depends on the questionnaire item type.
4955
- * @param questionnaire The original questionnaire.
4956
- * @param values Key value pairs for initial values.
4957
- * @returns Rewritten questionnaire with initial values.
4958
- */
4959
- function addQuestionnaireInitialValues(questionnaire, values) {
4960
- return Object.assign(Object.assign({}, questionnaire), { item: addInitialValuesToItemArray(questionnaire.item, values) });
4961
- }
4962
- function addInitialValuesToItemArray(items, values) {
4963
- if (!items) {
4964
- return undefined;
4965
- }
4966
- return items.map((item) => addInitialValueToItem(item, values));
4967
- }
4968
- function addInitialValueToItem(item, values) {
4969
- const { linkId, type } = item;
4970
- if (!linkId || !type) {
4971
- return item;
4972
- }
4973
- if (type === 'group') {
4974
- return Object.assign(Object.assign({}, item), { item: addInitialValuesToItemArray(item.item, values) });
4975
- }
4976
- const suppliedValue = values[linkId];
4977
- if (!suppliedValue) {
4978
- return item;
4979
- }
4980
- let initialValue = undefined;
4981
- switch (type) {
4982
- case core.PropertyType.boolean:
4983
- initialValue = { valueBoolean: suppliedValue === 'true' };
4984
- break;
4985
- case core.PropertyType.code:
4986
- case core.PropertyType.Coding:
4987
- initialValue = { valueCoding: { code: suppliedValue } };
4988
- break;
4989
- case core.PropertyType.date:
4990
- initialValue = { valueDate: suppliedValue };
4991
- break;
4992
- case core.PropertyType.dateTime:
4993
- case core.PropertyType.instant:
4994
- initialValue = { valueDateTime: suppliedValue };
4995
- break;
4996
- case core.PropertyType.decimal:
4997
- initialValue = { valueDecimal: parseFloat(suppliedValue) };
4998
- break;
4999
- case core.PropertyType.integer:
5000
- case core.PropertyType.positiveInt:
5001
- case core.PropertyType.unsignedInt:
5002
- initialValue = { valueInteger: parseInt(suppliedValue) };
5003
- break;
5004
- case core.PropertyType.SystemString:
5005
- case core.PropertyType.string:
5006
- case core.PropertyType.markdown:
5007
- initialValue = { valueString: suppliedValue };
5008
- break;
5009
- case core.PropertyType.time:
5010
- initialValue = { valueTime: suppliedValue };
5011
- break;
5012
- case core.PropertyType.uri:
5013
- case core.PropertyType.url:
5014
- initialValue = { valueUri: suppliedValue };
5015
- break;
5016
- case core.PropertyType.canonical:
5017
- case core.PropertyType.Reference:
5018
- initialValue = { valueReference: { reference: suppliedValue } };
5019
- break;
5020
- }
5021
- if (!initialValue) {
5022
- return item;
5023
- }
5024
- return Object.assign(Object.assign({}, item), { initial: [initialValue] });
5025
- }
5026
4973
  function isChoiceQuestion(item) {
5027
4974
  return item.type === 'choice' || item.type === 'open-choice';
5028
4975
  }
@@ -5456,6 +5403,15 @@
5456
5403
  if (!items) {
5457
5404
  return undefined;
5458
5405
  }
5406
+ items.forEach((item) => {
5407
+ var _a, _b;
5408
+ if ((_a = item.id) === null || _a === void 0 ? void 0 : _a.match(/^id-\d+$/)) {
5409
+ nextId = Math.max(nextId, parseInt(item.id.substring(3)) + 1);
5410
+ }
5411
+ if ((_b = item.linkId) === null || _b === void 0 ? void 0 : _b.match(/^q\d+$/)) {
5412
+ nextLinkId = Math.max(nextLinkId, parseInt(item.linkId.substring(1)) + 1);
5413
+ }
5414
+ });
5459
5415
  return items.map((item) => (Object.assign(Object.assign({}, item), { id: item.id || generateId(), item: ensureQuestionnaireItemKeys(item.item), answerOption: ensureQuestionnaireOptionKeys(item.answerOption) })));
5460
5416
  }
5461
5417
  function ensureQuestionnaireOptionKeys(options) {
@@ -5493,6 +5449,7 @@
5493
5449
  React__default["default"].createElement("div", { className: "medplum-request-group-task-checkmark" }, (task === null || task === void 0 ? void 0 : task.status) === 'completed' ? '🗹' : '☐'),
5494
5450
  React__default["default"].createElement("div", { className: "medplum-request-group-task-details" },
5495
5451
  React__default["default"].createElement("div", { className: "medplum-request-group-task-title" }, action.title),
5452
+ action.description && React__default["default"].createElement("div", null, action.description),
5496
5453
  React__default["default"].createElement("div", null,
5497
5454
  "Last edited by\u00A0",
5498
5455
  React__default["default"].createElement(ResourceName, { value: (_e = task === null || task === void 0 ? void 0 : task.meta) === null || _e === void 0 ? void 0 : _e.author }),
@@ -6193,7 +6150,6 @@
6193
6150
  exports.addLastMonthFilter = addLastMonthFilter;
6194
6151
  exports.addMissingFilter = addMissingFilter;
6195
6152
  exports.addNextMonthFilter = addNextMonthFilter;
6196
- exports.addQuestionnaireInitialValues = addQuestionnaireInitialValues;
6197
6153
  exports.addThisMonthFilter = addThisMonthFilter;
6198
6154
  exports.addTodayFilter = addTodayFilter;
6199
6155
  exports.addTomorrowFilter = addTomorrowFilter;