@openmrs/esm-patient-chart-app 11.3.1-pre.9283 → 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.
Files changed (63) hide show
  1. package/.turbo/turbo-build.log +9 -9
  2. package/dist/276.js +1 -1
  3. package/dist/276.js.map +1 -1
  4. package/dist/2761.js +1 -1
  5. package/dist/2761.js.map +1 -1
  6. package/dist/2859.js +1 -1
  7. package/dist/2859.js.map +1 -1
  8. package/dist/3119.js +1 -1
  9. package/dist/3119.js.map +1 -1
  10. package/dist/4300.js +1 -1
  11. package/dist/4727.js +1 -1
  12. package/dist/4727.js.map +1 -1
  13. package/dist/5048.js +1 -1
  14. package/dist/5048.js.map +1 -1
  15. package/dist/6568.js +1 -0
  16. package/dist/6568.js.map +1 -0
  17. package/dist/8260.js +1 -0
  18. package/dist/8260.js.map +1 -0
  19. package/dist/8454.js +1 -1
  20. package/dist/8454.js.map +1 -1
  21. package/dist/9329.js +1 -0
  22. package/dist/9329.js.map +1 -0
  23. package/dist/main.js +1 -1
  24. package/dist/main.js.map +1 -1
  25. package/dist/openmrs-esm-patient-chart-app.js +1 -1
  26. package/dist/openmrs-esm-patient-chart-app.js.buildmanifest.json +100 -100
  27. package/dist/openmrs-esm-patient-chart-app.js.map +1 -1
  28. package/dist/routes.json +1 -1
  29. package/package.json +2 -2
  30. package/src/actions-buttons/delete-visit.component.tsx +8 -3
  31. package/src/actions-buttons/stop-visit.component.tsx +1 -1
  32. package/src/clinical-views/encounter-list/{encounter-list-tabs.component.tsx → encounter-list-tabs.extension.tsx} +10 -6
  33. package/src/index.ts +4 -4
  34. package/src/mark-patient-deceased/mark-patient-deceased-form.test.tsx +2 -0
  35. package/src/patient-banner-tags/{visit-attribute-tags.component.tsx → visit-attribute-tags.extension.tsx} +6 -4
  36. package/src/patient-chart/patient-chart.component.tsx +39 -65
  37. package/src/patient-chart/patient-chart.resources.ts +108 -0
  38. package/src/visit/hooks/useDeleteVisit.test.tsx +39 -42
  39. package/src/visit/hooks/useDeleteVisit.tsx +33 -17
  40. package/src/visit/visit-form/visit-form.test.tsx +3 -9
  41. package/src/visit/visit-form/visit-form.workspace.tsx +17 -7
  42. package/src/visit/visit-prompt/delete-visit-dialog.component.tsx +10 -4
  43. package/src/visit/visit-prompt/delete-visit-dialog.test.tsx +20 -2
  44. package/src/visit/visit-prompt/end-visit-dialog.component.tsx +7 -1
  45. package/src/visit/visit-prompt/end-visit-dialog.test.tsx +19 -0
  46. package/src/visit/visits-widget/active-visit-buttons/active-visit-buttons.tsx +7 -6
  47. package/src/visit/visits-widget/{current-visit-summary.component.tsx → current-visit-summary.extension.tsx} +13 -20
  48. package/src/visit/visits-widget/current-visit-summary.test.tsx +45 -25
  49. package/src/visit/visits-widget/past-visits-components/encounters-table/encounters-table.component.tsx +4 -3
  50. package/src/visit/visits-widget/past-visits-components/encounters-table/encounters-table.resource.ts +0 -1
  51. package/src/visit/visits-widget/visit-context/retrospective-data-date-time-picker/retrospective-date-time-picker.component.tsx +6 -8
  52. package/src/visit/visits-widget/visit-context/{visit-context-header.component.tsx → visit-context-header.extension.tsx} +17 -15
  53. package/src/visit/visits-widget/visit-context/visit-context-header.test.tsx +35 -29
  54. package/src/visit/visits-widget/visit-context/visit-context-switcher.modal.tsx +13 -11
  55. package/src/visit/visits-widget/visit-context/visit-context-switcher.test.tsx +50 -30
  56. package/src/visit/visits-widget/visit.resource.tsx +1 -1
  57. package/translations/en.json +1 -3
  58. package/dist/2442.js +0 -1
  59. package/dist/2442.js.map +0 -1
  60. package/dist/3042.js +0 -1
  61. package/dist/3042.js.map +0 -1
  62. package/dist/4713.js +0 -1
  63. package/dist/4713.js.map +0 -1
@@ -9,12 +9,13 @@ import {
9
9
  OpenmrsDatePicker,
10
10
  useDebounce,
11
11
  useOnVisible,
12
- useVisitContextStore,
13
12
  type Visit,
14
13
  } from '@openmrs/esm-framework';
14
+ import { invalidateVisitByUuid, usePatientChartStore } from '@openmrs/esm-patient-common-lib';
15
15
  import { useInfiniteVisits } from '../visit.resource';
16
16
  import VisitContextInfo from './visit-context-info.component';
17
17
  import styles from './visit-context-switcher.scss';
18
+ import { useSWRConfig } from 'swr';
18
19
 
19
20
  interface VisitContextSwitcherProps {
20
21
  patientUuid: string;
@@ -37,10 +38,9 @@ const VisitContextSwitcherModal: React.FC<VisitContextSwitcherProps> = ({
37
38
  { toStartDate: dayjs(maxStartDateDebounced).endOf('day').toISOString() },
38
39
  rep,
39
40
  );
40
- const { patientUuid: selectedVisitPatientUuid, manuallySetVisitUuid, setVisitContext } = useVisitContextStore();
41
- const [selectedVisit, setSelectedVisit] = useState<string>(
42
- selectedVisitPatientUuid === patientUuid ? manuallySetVisitUuid : null,
43
- );
41
+ const { visitContext, setVisitContext } = usePatientChartStore(patientUuid);
42
+ const [selectedVisitUuid, setSelectedVisitUuid] = useState<string>(visitContext?.uuid ?? null);
43
+ const { mutate: globalMutate } = useSWRConfig();
44
44
 
45
45
  const onScrollToEnd = useCallback(() => {
46
46
  if (hasMore) {
@@ -71,7 +71,7 @@ const VisitContextSwitcherModal: React.FC<VisitContextSwitcherProps> = ({
71
71
  <ModalBody>
72
72
  {error ? (
73
73
  <ErrorState headerTitle={t('visits', 'visits')} error={error} />
74
- ) : visits?.length == 0 ? (
74
+ ) : visits?.length === 0 ? (
75
75
  <Tile className={styles.tile}>
76
76
  <div className={styles.tileContent}>
77
77
  <p className={styles.content}>{t('noVisitsToDisplay', 'No visits to display')}</p>
@@ -85,8 +85,8 @@ const VisitContextSwitcherModal: React.FC<VisitContextSwitcherProps> = ({
85
85
  <VisitCardRow
86
86
  key={visit.uuid}
87
87
  visit={visit}
88
- setSelectedVisit={setSelectedVisit}
89
- isSelected={selectedVisit === visit.uuid}
88
+ setSelectedVisit={setSelectedVisitUuid}
89
+ isSelected={selectedVisitUuid === visit.uuid}
90
90
  />
91
91
  );
92
92
  })}
@@ -104,9 +104,11 @@ const VisitContextSwitcherModal: React.FC<VisitContextSwitcherProps> = ({
104
104
  {t('cancel', 'Cancel')}
105
105
  </Button>
106
106
  <Button
107
- disabled={selectedVisit === null || isLoading}
107
+ disabled={selectedVisitUuid === null || isLoading}
108
108
  onClick={() => {
109
- setVisitContext(visits.find((v) => v.uuid === selectedVisit));
109
+ const selectedVisit = visits.find((v) => v.uuid === selectedVisitUuid);
110
+ const mutateVisitContext = () => invalidateVisitByUuid(globalMutate, selectedVisit.uuid);
111
+ setVisitContext(selectedVisit, mutateVisitContext);
110
112
  onAfterVisitSelected?.();
111
113
  closeModal();
112
114
  }}
@@ -125,7 +127,7 @@ interface VisitCardRowProps {
125
127
  }
126
128
 
127
129
  /**
128
- * A clickable row within the the visit context switcher to select a visit. This
130
+ * A clickable row within the visit context switcher to select a visit. This
129
131
  * has slightly different UX than a regular radio button, as the entire card
130
132
  * (not just the radio button and the label) is clickable
131
133
  */
@@ -1,46 +1,49 @@
1
1
  import React from 'react';
2
2
  import { render, screen } from '@testing-library/react';
3
- import { useVisitContextStore } from '@openmrs/esm-framework';
3
+ import userEvent from '@testing-library/user-event';
4
4
  import { useSystemVisitSetting } from '@openmrs/esm-patient-common-lib';
5
5
  import { mockCurrentVisit, mockVisit2, mockVisit3 } from '__mocks__';
6
6
  import { useInfiniteVisits } from '../visit.resource';
7
7
  import VisitContextSwitcherModal from './visit-context-switcher.modal';
8
8
 
9
- const mockUseSystemVisitSetting = jest.fn(useSystemVisitSetting).mockReturnValue({
10
- errorFetchingSystemVisitSetting: null,
11
- isLoadingSystemVisitSetting: false,
12
- systemVisitEnabled: true,
13
- });
14
-
15
- jest.mocked(useVisitContextStore).mockReturnValue({
16
- manuallySetVisitUuid: null,
17
- mutateVisitCallbacks: {},
18
- patientUuid: null,
19
- setVisitContext: jest.fn(),
20
- mutateVisit: jest.fn(),
21
- });
22
-
23
- const mockUseInfiniteVisits = jest.fn(useInfiniteVisits).mockReturnValue({
24
- visits: [mockCurrentVisit, mockVisit2, mockVisit3],
25
- error: null,
26
- mutate: jest.fn(),
27
- isValidating: false,
28
- isLoading: false,
29
- totalCount: 3,
30
- hasMore: false,
31
- loadMore: jest.fn(),
32
- nextUri: '',
33
- });
34
-
35
- jest.mock('@openmrs/esm-patient-common-lib/src/useSystemVisitSetting', () => ({
36
- useSystemVisitSetting: () => mockUseSystemVisitSetting(),
37
- }));
9
+ const mockUseInfiniteVisits = jest.fn(useInfiniteVisits);
38
10
 
39
11
  jest.mock('../visit.resource', () => ({
40
12
  useInfiniteVisits: () => mockUseInfiniteVisits('some-uuid'),
41
13
  }));
42
14
 
15
+ const mockSetVisitContext = jest.fn();
16
+ const mockUseSystemVisitSetting = jest.fn(useSystemVisitSetting);
17
+
18
+ jest.mock('@openmrs/esm-patient-common-lib', () => ({
19
+ ...jest.requireActual('@openmrs/esm-patient-common-lib'),
20
+ useSystemVisitSetting: jest.fn(),
21
+ usePatientChartStore: jest.fn(() => ({
22
+ visitContext: null,
23
+ setVisitContext: mockSetVisitContext,
24
+ })),
25
+ }));
26
+
43
27
  describe('VisitContextSwitcherModal', () => {
28
+ beforeEach(() => {
29
+ mockUseInfiniteVisits.mockReturnValue({
30
+ visits: [mockCurrentVisit, mockVisit2, mockVisit3],
31
+ error: null,
32
+ mutate: jest.fn(),
33
+ isValidating: false,
34
+ isLoading: false,
35
+ totalCount: 3,
36
+ hasMore: false,
37
+ loadMore: jest.fn(),
38
+ nextUri: '',
39
+ });
40
+ mockUseSystemVisitSetting.mockReturnValue({
41
+ errorFetchingSystemVisitSetting: null,
42
+ isLoadingSystemVisitSetting: false,
43
+ systemVisitEnabled: true,
44
+ });
45
+ });
46
+
44
47
  it('should display a list of past visits', () => {
45
48
  mockUseSystemVisitSetting.mockReturnValueOnce({
46
49
  systemVisitEnabled: false,
@@ -53,6 +56,23 @@ describe('VisitContextSwitcherModal', () => {
53
56
  // visit type - only check the visitType div elements
54
57
  expect(screen.getAllByText('Facility Visit', { selector: '.visitType' })).toHaveLength(3);
55
58
  });
59
+
60
+ it('should call setVisitContext when continue button is clicked with selected visit', async () => {
61
+ const user = userEvent.setup();
62
+
63
+ renderVisitContextSwitcherModal();
64
+
65
+ // Select a visit by clicking on the first visit card
66
+ const firstVisitRadio = screen.getAllByRole('radio', { name: /Facility Visit/ })[0];
67
+ await user.click(firstVisitRadio);
68
+
69
+ // Click the continue button
70
+ const continueButton = screen.getByRole('button', { name: /continue/i });
71
+ await user.click(continueButton);
72
+
73
+ // Verify setVisitContext was called with the selected visit
74
+ expect(mockSetVisitContext).toHaveBeenCalledWith(mockCurrentVisit, expect.any(Function));
75
+ });
56
76
  });
57
77
 
58
78
  function renderVisitContextSwitcherModal() {
@@ -53,7 +53,7 @@ export function deleteVisit(visitUuid: string) {
53
53
  }
54
54
 
55
55
  export function restoreVisit(visitUuid: string) {
56
- return openmrsFetch(`${restBaseUrl}/visit/${visitUuid}`, {
56
+ return openmrsFetch<Visit>(`${restBaseUrl}/visit/${visitUuid}`, {
57
57
  headers: {
58
58
  'content-type': 'application/json',
59
59
  },
@@ -1,5 +1,6 @@
1
1
  {
2
2
  "actions": "Actions",
3
+ "activeVisits__lower": "active visits",
3
4
  "addingToVisit": "Adding to:",
4
5
  "additionalVisitInformationUpdatedSuccessfully": "Additional visit information updated successfully",
5
6
  "addVisit": "Add visit",
@@ -75,7 +76,6 @@
75
76
  "errorUpdatingVisitAttribute": "Could not update {{attributeName}} attribute",
76
77
  "errorUpdatingVisitDetails": "Error updating visit details",
77
78
  "errorWhenRestoringVisit": "Error occurred when restoring {{visit}}",
78
- "failedToLoadCurrentVisit": "Failed loading current visit",
79
79
  "fieldRequired": "This field is required",
80
80
  "filterByEncounterType": "Filter by encounter type",
81
81
  "form": "Form name",
@@ -85,7 +85,6 @@
85
85
  "indication": "Indication",
86
86
  "inThePast": "In the past",
87
87
  "loading": "Loading",
88
- "loadingVisit": "Loading current visit...",
89
88
  "markAliveSuccessfully": "Patient marked alive successfully",
90
89
  "markDeceasedWarning": "Marking the patient as deceased will end any active visits for this patient",
91
90
  "markPatientAlive": "Mark patient alive",
@@ -99,7 +98,6 @@
99
98
  "nextPage": "Next page",
100
99
  "no": "No",
101
100
  "noActiveVisit": "No Active Visit",
102
- "noActiveVisitMessage": "active visit",
103
101
  "noActiveVisitNoRDEText": "You can't add data to the patient chart without an active visit. Would you like to start a new visit?",
104
102
  "noDiagnosesFound": "No diagnoses found",
105
103
  "noEncountersToDisplay": "No encounters to display",