@openmrs/esm-patient-forms-app 11.3.1-pre.9294 → 11.3.1-pre.9296

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.
@@ -2,25 +2,9 @@ import React from 'react';
2
2
  import { render, screen } from '@testing-library/react';
3
3
  import { BehaviorSubject } from 'rxjs';
4
4
  import { ExtensionSlot, useConnectivity, useFeatureFlag } from '@openmrs/esm-framework';
5
- import { useVisitOrOfflineVisit } from '@openmrs/esm-patient-common-lib';
6
5
  import { mockPatient } from 'tools';
7
6
  import FormEntry from './form-entry.workspace';
8
7
 
9
- const testProps = {
10
- closeWorkspace: jest.fn(),
11
- closeWorkspaceWithSavedChanges: jest.fn(),
12
- promptBeforeClosing: jest.fn(),
13
- patientUuid: mockPatient.id,
14
- patient: mockPatient,
15
- formInfo: { formUuid: 'some-form-uuid' },
16
- mutateForm: jest.fn(),
17
- setTitle: jest.fn(),
18
- };
19
-
20
- const mockFormEntrySub = jest.fn();
21
- const mockUseConnectivity = jest.mocked(useConnectivity);
22
- const mockUseVisitOrOfflineVisit = useVisitOrOfflineVisit as jest.Mock;
23
-
24
8
  const mockCurrentVisit = {
25
9
  uuid: '17f512b4-d264-4113-a6fe-160cb38cb46e',
26
10
  encounters: [],
@@ -30,7 +14,7 @@ const mockCurrentVisit = {
30
14
  display: 'Facility Visit',
31
15
  },
32
16
  attributes: [],
33
- startDatetime: new Date('2021-03-16T08:16:00.000+0000'),
17
+ startDatetime: '2021-03-16T08:16:00.000+0000',
34
18
  stopDatetime: null,
35
19
  location: {
36
20
  uuid: '6351fcf4-e311-4a19-90f9-35667d99a8af',
@@ -39,15 +23,26 @@ const mockCurrentVisit = {
39
23
  },
40
24
  };
41
25
 
42
- jest.mock('@openmrs/esm-patient-common-lib', () => ({
43
- useVisitOrOfflineVisit: jest.fn(),
44
- }));
26
+ const testProps = {
27
+ closeWorkspace: jest.fn(),
28
+ closeWorkspaceWithSavedChanges: jest.fn(),
29
+ promptBeforeClosing: jest.fn(),
30
+ patientUuid: mockPatient.id,
31
+ patient: mockPatient,
32
+ formInfo: { formUuid: 'some-form-uuid' },
33
+ mutateForm: jest.fn(),
34
+ setTitle: jest.fn(),
35
+ visitContext: mockCurrentVisit,
36
+ mutateVisitContext: null,
37
+ };
38
+
39
+ const mockFormEntrySub = jest.fn();
40
+ const mockUseConnectivity = jest.mocked(useConnectivity);
45
41
 
46
42
  const mockExtensionSlot = jest.mocked(ExtensionSlot);
47
43
 
48
44
  describe('FormEntry', () => {
49
45
  it('renders an extension where the form entry widget plugs in', async () => {
50
- mockUseVisitOrOfflineVisit.mockReturnValue({ currentVisit: mockCurrentVisit });
51
46
  mockUseConnectivity.mockReturnValue(true);
52
47
  mockFormEntrySub.mockReturnValue(
53
48
  new BehaviorSubject({ encounterUuid: null, formUuid: 'some-form-uuid', patient: mockPatient }),
@@ -1,10 +1,9 @@
1
1
  import React, { useEffect, useMemo, useState } from 'react';
2
2
  import { useSWRConfig } from 'swr';
3
- import { ExtensionSlot, useConnectivity, useVisit } from '@openmrs/esm-framework';
3
+ import { ExtensionSlot, useConnectivity } from '@openmrs/esm-framework';
4
4
  import {
5
5
  clinicalFormsWorkspace,
6
6
  invalidateVisitAndEncounterData,
7
- useVisitOrOfflineVisit,
8
7
  type DefaultPatientWorkspaceProps,
9
8
  type FormEntryProps,
10
9
  } from '@openmrs/esm-patient-common-lib';
@@ -24,23 +23,23 @@ const FormEntry: React.FC<FormEntryComponentProps> = ({
24
23
  promptBeforeClosing,
25
24
  mutateForm,
26
25
  formInfo,
26
+ visitContext,
27
+ mutateVisitContext,
27
28
  }) => {
28
29
  const { encounterUuid, formUuid, visitStartDatetime, visitStopDatetime, visitTypeUuid, visitUuid, additionalProps } =
29
30
  formInfo || {};
30
- const { currentVisit } = useVisitOrOfflineVisit(patientUuid);
31
31
  const [showForm, setShowForm] = useState(true);
32
32
  const isOnline = useConnectivity();
33
- const { mutate: mutateCurrentVisit } = useVisit(patientUuid);
34
33
  const { mutate: globalMutate } = useSWRConfig();
35
34
 
36
35
  const state = useMemo(
37
36
  () => ({
38
37
  view: 'form',
39
38
  formUuid: formUuid ?? null,
40
- visitUuid: visitUuid ?? currentVisit?.uuid ?? null,
41
- visitTypeUuid: visitTypeUuid ?? currentVisit?.visitType?.uuid ?? null,
42
- visitStartDatetime: visitStartDatetime ?? currentVisit?.startDatetime ?? null,
43
- visitStopDatetime: visitStopDatetime ?? currentVisit?.stopDatetime ?? null,
39
+ visitUuid: visitUuid ?? visitContext?.uuid ?? null,
40
+ visitTypeUuid: visitTypeUuid ?? visitContext?.visitType?.uuid ?? null,
41
+ visitStartDatetime: visitStartDatetime ?? visitContext?.startDatetime ?? null,
42
+ visitStopDatetime: visitStopDatetime ?? visitContext?.stopDatetime ?? null,
44
43
  isOffline: !isOnline,
45
44
  patientUuid: patientUuid ?? null,
46
45
  patient,
@@ -52,7 +51,7 @@ const FormEntry: React.FC<FormEntryComponentProps> = ({
52
51
  closeWorkspaceWithSavedChanges: () => {
53
52
  typeof mutateForm === 'function' && mutateForm();
54
53
  // Update current visit data for critical components
55
- mutateCurrentVisit();
54
+ mutateVisitContext?.();
56
55
 
57
56
  // Also invalidate visit history and encounter tables since form submission may create/update encounters
58
57
  invalidateVisitAndEncounterData(globalMutate, patientUuid);
@@ -68,15 +67,15 @@ const FormEntry: React.FC<FormEntryComponentProps> = ({
68
67
  clinicalFormsWorkspaceName,
69
68
  closeWorkspace,
70
69
  closeWorkspaceWithSavedChanges,
71
- currentVisit?.startDatetime,
72
- currentVisit?.stopDatetime,
73
- currentVisit?.uuid,
74
- currentVisit?.visitType?.uuid,
70
+ visitContext?.startDatetime,
71
+ visitContext?.stopDatetime,
72
+ visitContext?.uuid,
73
+ visitContext?.visitType?.uuid,
75
74
  encounterUuid,
76
75
  formUuid,
77
76
  globalMutate,
78
77
  isOnline,
79
- mutateCurrentVisit,
78
+ mutateVisitContext,
80
79
  mutateForm,
81
80
  patient,
82
81
  patientUuid,
@@ -8,7 +8,6 @@ import {
8
8
  type Form,
9
9
  launchFormEntryOrHtmlForms,
10
10
  mapFormsToHtmlFormEntryForms,
11
- useVisitOrOfflineVisit,
12
11
  } from '@openmrs/esm-patient-common-lib';
13
12
  import type { ConfigObject } from '../config-schema';
14
13
  import { useForms } from '../hooks/use-forms';
@@ -26,17 +25,17 @@ const FormsDashboard: React.FC<FormsDashboardProps> = ({
26
25
  clinicalFormsWorkspaceName,
27
26
  formEntryWorkspaceName,
28
27
  htmlFormEntryWorkspaceName,
28
+ visitContext,
29
29
  }) => {
30
30
  const { t } = useTranslation();
31
31
  const config = useConfig<ConfigObject>();
32
32
  const isOnline = useConnectivity();
33
- const { currentVisit } = useVisitOrOfflineVisit(patientUuid);
34
33
  const {
35
34
  data: forms,
36
35
  allForms,
37
36
  error,
38
37
  mutateForms,
39
- } = useForms(patientUuid, currentVisit?.uuid, undefined, undefined, !isOnline, config.orderBy);
38
+ } = useForms(patientUuid, visitContext?.uuid, undefined, undefined, !isOnline, config.orderBy);
40
39
 
41
40
  const htmlFormEntryForms = useMemo(() => {
42
41
  return mapFormsToHtmlFormEntryForms(allForms, config.htmlFormEntryForms);
@@ -48,11 +47,11 @@ const FormsDashboard: React.FC<FormsDashboardProps> = ({
48
47
  htmlFormEntryForms,
49
48
  patientUuid,
50
49
  form,
51
- currentVisit?.uuid,
50
+ visitContext?.uuid,
52
51
  encounterUuid,
53
- currentVisit?.visitType.uuid,
54
- currentVisit?.startDatetime,
55
- currentVisit?.stopDatetime,
52
+ visitContext?.visitType.uuid,
53
+ visitContext?.startDatetime,
54
+ visitContext?.stopDatetime,
56
55
  mutateForms,
57
56
  clinicalFormsWorkspaceName,
58
57
  formEntryWorkspaceName,
@@ -60,7 +59,7 @@ const FormsDashboard: React.FC<FormsDashboardProps> = ({
60
59
  );
61
60
  },
62
61
  [
63
- currentVisit,
62
+ visitContext,
64
63
  htmlFormEntryForms,
65
64
  mutateForms,
66
65
  patientUuid,
@@ -1,15 +1,12 @@
1
1
  import React from 'react';
2
2
  import { render, screen } from '@testing-library/react';
3
- import { getDefaultsFromConfigSchema, launchWorkspace, useConfig } from '@openmrs/esm-framework';
4
- import { useVisitOrOfflineVisit } from '@openmrs/esm-patient-common-lib';
3
+ import { getDefaultsFromConfigSchema, useConfig } from '@openmrs/esm-framework';
5
4
  import { configSchema, type ConfigObject } from '../config-schema';
6
5
  import { mockCurrentVisit } from '__mocks__';
7
6
  import FormsDashboard from './forms-dashboard.component';
8
7
  import { mockPatient } from 'tools';
9
8
 
10
9
  const mockUseConfig = jest.mocked(useConfig<ConfigObject>);
11
- const mockLaunchWorkspace = jest.mocked(launchWorkspace);
12
- const mockUseVisitOrOfflineVisit = useVisitOrOfflineVisit as jest.Mock;
13
10
 
14
11
  jest.mock('../hooks/use-forms', () => ({
15
12
  useForms: jest.fn().mockReturnValueOnce({
@@ -20,24 +17,10 @@ jest.mock('../hooks/use-forms', () => ({
20
17
  }),
21
18
  }));
22
19
 
23
- jest.mock('@openmrs/esm-patient-common-lib', () => {
24
- const originalModule = jest.requireActual('@openmrs/esm-patient-common-lib');
25
-
26
- return {
27
- ...originalModule,
28
- useVisitOrOfflineVisit: jest.fn(),
29
- };
30
- });
31
-
32
20
  mockUseConfig.mockReturnValue({ ...getDefaultsFromConfigSchema(configSchema), htmlFormEntryForms: [] });
33
21
 
34
22
  describe('FormsDashboard', () => {
35
23
  test('renders an empty state if there are no forms persisted on the server', async () => {
36
- mockUseVisitOrOfflineVisit.mockReturnValue({
37
- currentVisit: mockCurrentVisit,
38
- error: null,
39
- });
40
-
41
24
  render(
42
25
  <FormsDashboard
43
26
  promptBeforeClosing={jest.fn()}
@@ -46,6 +29,8 @@ describe('FormsDashboard', () => {
46
29
  patientUuid={mockPatient.id}
47
30
  patient={mockPatient}
48
31
  setTitle={jest.fn()}
32
+ visitContext={mockCurrentVisit}
33
+ mutateVisitContext={null}
49
34
  />,
50
35
  );
51
36
 
@@ -1,9 +1,5 @@
1
1
  import React from 'react';
2
- import {
3
- type DefaultPatientWorkspaceProps,
4
- type FormEntryProps,
5
- useVisitOrOfflineVisit,
6
- } from '@openmrs/esm-patient-common-lib';
2
+ import { type DefaultPatientWorkspaceProps, type FormEntryProps } from '@openmrs/esm-patient-common-lib';
7
3
  import HtmlFormEntryWrapper from './html-form-entry-wrapper.component';
8
4
 
9
5
  interface HtmlFormEntryComponentProps extends DefaultPatientWorkspaceProps {
@@ -12,12 +8,11 @@ interface HtmlFormEntryComponentProps extends DefaultPatientWorkspaceProps {
12
8
 
13
9
  const HtmlFormEntry: React.FC<HtmlFormEntryComponentProps> = ({
14
10
  patientUuid,
15
- patient,
16
11
  closeWorkspaceWithSavedChanges,
17
12
  promptBeforeClosing,
18
13
  formInfo,
14
+ visitContext,
19
15
  }) => {
20
- const { currentVisit } = useVisitOrOfflineVisit(patientUuid);
21
16
  const { encounterUuid, visitUuid, htmlForm } = formInfo || {};
22
17
 
23
18
  // we always want to prompt the user before closing/hiding the workspace because we can't guarantee maintaining the state of the form
@@ -30,8 +25,8 @@ const HtmlFormEntry: React.FC<HtmlFormEntryComponentProps> = ({
30
25
  const url = `${window.openmrsBase}/htmlformentryui/htmlform/${uiPage}.page?`;
31
26
  const searchParams = new URLSearchParams();
32
27
  searchParams.append('patientId', patientUuid);
33
- if (visitUuid || currentVisit?.uuid) {
34
- searchParams.append('visitId', visitUuid ?? currentVisit?.uuid);
28
+ if (visitUuid || visitContext?.uuid) {
29
+ searchParams.append('visitId', visitUuid ?? visitContext?.uuid);
35
30
  }
36
31
  if (encounterUuid) {
37
32
  searchParams.append('encounterId', encounterUuid);