fhir-react 0.3.7 → 0.3.8

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 (138) hide show
  1. package/.circleci/config.yml +1 -1
  2. package/.eslintrc +10 -1
  3. package/.stylelintrc +6 -2
  4. package/README.md +19 -1
  5. package/build/index.js +15 -11
  6. package/build/style.css +7 -7
  7. package/package.json +55 -54
  8. package/src/assets/containers/AdverseEvent/adverse-event.svg +6 -0
  9. package/src/assets/containers/Generic/generic.svg +3 -0
  10. package/src/assets/containers/MedicationDispense/medication-dispense.svg +5 -0
  11. package/src/assets/containers/PractitionerRole/practitioner-role.svg +5 -0
  12. package/src/assets/containers/ReferralRequest/referral-request.svg +8 -0
  13. package/src/assets/containers/RelatedPerson/related-person.svg +6 -0
  14. package/src/components/containers/Accordion/Accordion.js +21 -13
  15. package/src/components/datatypes/CodeableConcept/CodeableConcept.js +6 -3
  16. package/src/components/datatypes/Coding/Coding.js +7 -3
  17. package/src/components/datatypes/Reference/Reference.js +7 -5
  18. package/src/components/datatypes/Telecom/Telecom.js +2 -3
  19. package/src/components/resources/AdverseEvent/AdverseEvent.js +81 -42
  20. package/src/components/resources/AdverseEvent/AdverseEvent.stories.js +12 -2
  21. package/src/components/resources/AdverseEvent/AdverseEvent.test.js +109 -2
  22. package/src/components/resources/AllergyIntolerance/AllergyIntolerance.js +7 -1
  23. package/src/components/resources/AllergyIntolerance/AllergyIntolerance.test.js +36 -1
  24. package/src/components/resources/Appointment/Appointment.js +2 -1
  25. package/src/components/resources/Appointment/Appointment.test.js +36 -1
  26. package/src/components/resources/Bundle/Bundle.css +7 -0
  27. package/src/components/resources/Bundle/Bundle.js +15 -11
  28. package/src/components/resources/Bundle/Bundle.stories.js +12 -78
  29. package/src/components/resources/Bundle/Bundle.test.js +0 -3
  30. package/src/components/resources/CarePlan/CarePlan.js +2 -1
  31. package/src/components/resources/CarePlan/CarePlan.test.js +42 -6
  32. package/src/components/resources/CareTeam/CareTeam.js +72 -50
  33. package/src/components/resources/CareTeam/CareTeam.stories.js +20 -3
  34. package/src/components/resources/CareTeam/CareTeam.test.js +109 -1
  35. package/src/components/resources/CareTeam/CareTeamParticipants.js +1 -1
  36. package/src/components/resources/Claim/Claim.js +2 -1
  37. package/src/components/resources/Claim/Claim.test.js +32 -1
  38. package/src/components/resources/ClaimResponse/AddedItem.js +61 -11
  39. package/src/components/resources/ClaimResponse/AddedItems.js +5 -9
  40. package/src/components/resources/ClaimResponse/ClaimResponse.js +137 -83
  41. package/src/components/resources/ClaimResponse/ClaimResponse.stories.js +15 -2
  42. package/src/components/resources/ClaimResponse/ClaimResponse.test.js +112 -1
  43. package/src/components/resources/ClaimResponse/Item.js +44 -9
  44. package/src/components/resources/ClaimResponse/Items.js +5 -4
  45. package/src/components/resources/Condition/Condition.js +3 -3
  46. package/src/components/resources/Condition/Condition.test.js +37 -4
  47. package/src/components/resources/Coverage/Coverage.js +2 -1
  48. package/src/components/resources/Coverage/Coverage.test.js +36 -1
  49. package/src/components/resources/Device/Device.js +2 -1
  50. package/src/components/resources/Device/Device.test.js +36 -1
  51. package/src/components/resources/DiagnosticReport/DiagnosticReport.js +7 -2
  52. package/src/components/resources/DiagnosticReport/DiagnosticReport.test.js +36 -1
  53. package/src/components/resources/DocumentReference/DocumentReference.js +7 -2
  54. package/src/components/resources/DocumentReference/DocumentReference.test.js +42 -1
  55. package/src/components/resources/Encounter/Encounter.js +2 -1
  56. package/src/components/resources/Encounter/Encounter.test.js +36 -1
  57. package/src/components/resources/ExplanationOfBenefit/ExplanationOfBenefit.js +2 -0
  58. package/src/components/resources/ExplanationOfBenefit/ExplanationOfBenefit.test.js +38 -1
  59. package/src/components/resources/FamilyMemberHistory/FamilyMemberHistory.js +7 -2
  60. package/src/components/resources/FamilyMemberHistory/FamilyMemberHistory.test.js +36 -1
  61. package/src/components/resources/Generic/Generic.js +20 -7
  62. package/src/components/resources/Generic/Generic.stories.js +2 -1
  63. package/src/components/resources/Generic/Generic.test.js +26 -7
  64. package/src/components/resources/Goal/Goal.js +2 -3
  65. package/src/components/resources/Goal/Goal.test.js +32 -1
  66. package/src/components/resources/Immunization/Immunization.js +2 -2
  67. package/src/components/resources/Immunization/Immunization.test.js +36 -1
  68. package/src/components/resources/List/DrugTierDefinitionExtension.js +79 -35
  69. package/src/components/resources/List/Entries.js +3 -3
  70. package/src/components/resources/List/List.js +135 -88
  71. package/src/components/resources/List/List.stories.js +38 -5
  72. package/src/components/resources/List/List.test.js +105 -1
  73. package/src/components/resources/Location/Location.js +65 -47
  74. package/src/components/resources/Location/Location.stories.js +11 -4
  75. package/src/components/resources/Location/Location.test.js +106 -4
  76. package/src/components/resources/Medication/Medication.js +2 -1
  77. package/src/components/resources/Medication/Medication.test.js +36 -1
  78. package/src/components/resources/MedicationAdministration/MedicationAdministration.js +86 -62
  79. package/src/components/resources/MedicationAdministration/MedicationAdministration.stories.js +7 -0
  80. package/src/components/resources/MedicationAdministration/MedicationAdministration.test.js +117 -1
  81. package/src/components/resources/MedicationDispense/DosageInstruction.js +25 -0
  82. package/src/components/resources/MedicationDispense/MedicationDispense.js +68 -68
  83. package/src/components/resources/MedicationDispense/MedicationDispense.stories.js +7 -0
  84. package/src/components/resources/MedicationDispense/MedicationDispense.test.js +108 -1
  85. package/src/components/resources/MedicationKnowledge/MedicationKnowledge.js +115 -66
  86. package/src/components/resources/MedicationKnowledge/MedicationKnowledge.stories.js +6 -0
  87. package/src/components/resources/MedicationKnowledge/MedicationKnowledge.test.js +110 -1
  88. package/src/components/resources/MedicationOrder/MedicationOrder.js +2 -3
  89. package/src/components/resources/MedicationOrder/MedicationOrder.test.js +35 -4
  90. package/src/components/resources/MedicationRequest/MedicationRequest.js +2 -1
  91. package/src/components/resources/MedicationRequest/MedicationRequest.test.js +33 -4
  92. package/src/components/resources/MedicationStatement/MedicationStatement.js +7 -2
  93. package/src/components/resources/MedicationStatement/MedicationStatement.test.js +36 -1
  94. package/src/components/resources/Observation/Observation.js +2 -1
  95. package/src/components/resources/Observation/Observation.test.js +30 -1
  96. package/src/components/resources/Organization/Organization.js +3 -2
  97. package/src/components/resources/Organization/Organization.test.js +36 -1
  98. package/src/components/resources/Patient/Patient.js +2 -0
  99. package/src/components/resources/Patient/Patient.test.js +31 -2
  100. package/src/components/resources/Practitioner/Practitioner.js +2 -1
  101. package/src/components/resources/Practitioner/Practitioner.test.js +36 -1
  102. package/src/components/resources/PractitionerRole/PractitionerRole.js +50 -29
  103. package/src/components/resources/PractitionerRole/PractitionerRole.stories.js +7 -0
  104. package/src/components/resources/PractitionerRole/PractitionerRole.test.js +108 -1
  105. package/src/components/resources/Procedure/Procedure.js +2 -2
  106. package/src/components/resources/Procedure/Procedure.test.js +30 -1
  107. package/src/components/resources/Questionnaire/Group.js +53 -0
  108. package/src/components/resources/Questionnaire/Items.js +45 -0
  109. package/src/components/resources/Questionnaire/Questionnaire.css +24 -5
  110. package/src/components/resources/Questionnaire/Questionnaire.js +31 -170
  111. package/src/components/resources/Questionnaire/Questionnaire.stories.js +8 -0
  112. package/src/components/resources/Questionnaire/Questionnaire.test.js +194 -15
  113. package/src/components/resources/Questionnaire/Questions.js +40 -0
  114. package/src/components/resources/Questionnaire/getQuestionText.js +20 -0
  115. package/src/components/resources/QuestionnaireResponse/Answers.js +59 -0
  116. package/src/components/resources/QuestionnaireResponse/Group.js +70 -0
  117. package/src/components/resources/QuestionnaireResponse/Items.js +45 -0
  118. package/src/components/resources/QuestionnaireResponse/QuestionnaireResponse.css +33 -8
  119. package/src/components/resources/QuestionnaireResponse/QuestionnaireResponse.js +52 -236
  120. package/src/components/resources/QuestionnaireResponse/QuestionnaireResponse.stories.js +8 -0
  121. package/src/components/resources/QuestionnaireResponse/QuestionnaireResponse.test.js +38 -3
  122. package/src/components/resources/QuestionnaireResponse/Questions.js +43 -0
  123. package/src/components/resources/QuestionnaireResponse/getQuestionText.js +22 -0
  124. package/src/components/resources/ReferralRequest/ReferralRequest.js +65 -40
  125. package/src/components/resources/ReferralRequest/ReferralRequest.test.js +111 -11
  126. package/src/components/resources/RelatedPerson/RelatedPerson.js +151 -0
  127. package/src/components/resources/RelatedPerson/RelatedPerson.stories.js +46 -0
  128. package/src/components/resources/RelatedPerson/RelatedPerson.test.js +156 -0
  129. package/src/components/resources/RelatedPerson/index.js +3 -0
  130. package/src/components/resources/ResearchStudy/ResearchStudy.js +160 -130
  131. package/src/components/resources/ResearchStudy/ResearchStudy.stories.js +2 -0
  132. package/src/components/resources/ResearchStudy/ResearchStudy.test.js +108 -1
  133. package/src/components/ui/index.js +22 -9
  134. package/src/fixtures/dstu2/resources/relatedPerson/example1.json +79 -0
  135. package/src/fixtures/example-icons.jsx +42 -0
  136. package/src/fixtures/r4/resources/relatedPerson/example1.json +64 -0
  137. package/src/fixtures/stu3/resources/relatedPerson/example1.json +43 -0
  138. package/src/style.scss +3 -1
@@ -2,14 +2,14 @@ import React from 'react';
2
2
  import PropTypes from 'prop-types';
3
3
  import _get from 'lodash/get';
4
4
 
5
- import { Root, Header, Title, Badge, Body, Value } from '../../ui';
5
+ import { Root, Header, Badge, Body } from '../../ui';
6
6
  import Address from '../../datatypes/Address';
7
7
  import Telecom from '../../datatypes/Telecom';
8
8
  import CodeableConcept from '../../datatypes/CodeableConcept';
9
9
  import Reference from '../../datatypes/Reference';
10
+ import Accordion from '../../containers/Accordion';
10
11
 
11
- const Location = props => {
12
- const { fhirResource } = props;
12
+ const Location = ({ fhirResource, fhirIcons, onClick }) => {
13
13
  const name = _get(fhirResource, 'name');
14
14
  const status = _get(fhirResource, 'status');
15
15
  const description = _get(fhirResource, 'description');
@@ -19,52 +19,70 @@ const Location = props => {
19
19
  const physicalType = _get(fhirResource, 'physicalType');
20
20
  const mode = _get(fhirResource, 'mode');
21
21
  const managingOrganization = _get(fhirResource, 'managingOrganization');
22
+
23
+ const tableData = [
24
+ {
25
+ label: 'Type',
26
+ testId: 'type',
27
+ data: type && <CodeableConcept fhirData={type} isCursive />,
28
+ status: type,
29
+ },
30
+ {
31
+ label: 'Physical type',
32
+ testId: 'physicalType',
33
+ data: physicalType && (
34
+ <CodeableConcept fhirData={physicalType} isCursive />
35
+ ),
36
+ status: physicalType,
37
+ },
38
+ {
39
+ label: 'Location mode',
40
+ testId: 'mode',
41
+ data: mode,
42
+ status: mode,
43
+ },
44
+ {
45
+ label: 'Description',
46
+ testId: 'description',
47
+ data: description,
48
+ status: description,
49
+ },
50
+ {
51
+ label: 'Address',
52
+ testId: 'address',
53
+ data: address && <Address fhirData={address} />,
54
+ status: address,
55
+ },
56
+ {
57
+ label: 'Telecom',
58
+ testId: 'telecom',
59
+ data: telecom && <Telecom fhirData={telecom} noSystemData />,
60
+ status: telecom,
61
+ },
62
+ {
63
+ label: 'Managing organization',
64
+ testId: 'managingOrganization',
65
+ data: managingOrganization && (
66
+ <Reference fhirData={managingOrganization} />
67
+ ),
68
+ status: managingOrganization,
69
+ },
70
+ ];
71
+
22
72
  return (
23
73
  <Root name="Location">
24
- <Header>
25
- {name && <Title>{name}</Title>}
26
- {status && <Badge data-testid="status">{status}</Badge>}
27
- </Header>
28
- <Body>
29
- {type && (
30
- <Value label="Type" data-testid="type">
31
- <CodeableConcept fhirData={type} />
32
- </Value>
33
- )}
34
- {physicalType && (
35
- <Value label="Physical type" data-testid="physicalType">
36
- <CodeableConcept fhirData={physicalType} />
37
- </Value>
38
- )}
39
- {mode && (
40
- <Value label="Location mode" data-testid="mode">
41
- {mode}
42
- </Value>
43
- )}
44
- {description && (
45
- <Value label="Description" data-testid="description">
46
- {description}
47
- </Value>
48
- )}
49
- {address && (
50
- <Value label="Address" data-testid="address">
51
- <Address fhirData={address} />
52
- </Value>
53
- )}
54
- {telecom && (
55
- <Value label="Telecom" data-testid="telecom">
56
- <Telecom fhirData={telecom} />
57
- </Value>
58
- )}
59
- {managingOrganization && (
60
- <Value
61
- label="Managing organization"
62
- data-testid="managingOrganization"
63
- >
64
- <Reference fhirData={managingOrganization} />
65
- </Value>
66
- )}
67
- </Body>
74
+ <Accordion
75
+ headerContent={
76
+ <Header
77
+ resourceName="Location"
78
+ title={name}
79
+ badges={status && <Badge data-testid="status">{status}</Badge>}
80
+ icon={fhirIcons}
81
+ />
82
+ }
83
+ bodyContent={<Body tableData={tableData} />}
84
+ onClick={onClick}
85
+ />
68
86
  </Root>
69
87
  );
70
88
  };
@@ -7,6 +7,8 @@ import dstu2Example1 from '../../../fixtures/dstu2/resources/location/example1.j
7
7
  import stu3Example1 from '../../../fixtures/stu3/resources/location/example1.json';
8
8
  import r4Example1 from '../../../fixtures/r4/resources/location/example1.json';
9
9
  import r4Example2 from '../../../fixtures/r4/resources/location/example2.json';
10
+ import fhirIcons from '../../../fixtures/example-icons';
11
+ import LocationIcon from '../../../assets/containers/Location/location.svg';
10
12
 
11
13
  export default {
12
14
  title: 'Location',
@@ -14,20 +16,25 @@ export default {
14
16
 
15
17
  export const DefaultVisualizationDSTU2 = () => {
16
18
  const fhirResource = object('Resource', dstu2Example1);
17
- return <Location fhirResource={fhirResource} />;
19
+ return (
20
+ <Location
21
+ fhirResource={fhirResource}
22
+ fhirIcons={require('../../../assets/containers/Location/location.svg')}
23
+ />
24
+ );
18
25
  };
19
26
 
20
27
  export const ExampleOfSTU3 = () => {
21
28
  const fhirResource = object('Resource', stu3Example1);
22
- return <Location fhirResource={fhirResource} />;
29
+ return <Location fhirResource={fhirResource} fhirIcons={LocationIcon} />;
23
30
  };
24
31
 
25
32
  export const Example1OfR4 = () => {
26
33
  const fhirResource = object('Resource', r4Example1);
27
- return <Location fhirResource={fhirResource} />;
34
+ return <Location fhirResource={fhirResource} fhirIcons={fhirIcons} />;
28
35
  };
29
36
 
30
37
  export const Example2OfR4 = () => {
31
38
  const fhirResource = object('Resource', r4Example2);
32
- return <Location fhirResource={fhirResource} />;
39
+ return <Location fhirResource={fhirResource} fhirIcons={false} />;
33
40
  };
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { render } from '@testing-library/react';
2
+ import { fireEvent, render } from '@testing-library/react';
3
3
 
4
4
  import Location from './Location';
5
5
 
@@ -7,8 +7,81 @@ import dstu2Example1 from '../../../fixtures/dstu2/resources/location/example1.j
7
7
  import stu3Example1 from '../../../fixtures/stu3/resources/location/example1.json';
8
8
  import r4Example1 from '../../../fixtures/r4/resources/location/example1.json';
9
9
  import r4Example2 from '../../../fixtures/r4/resources/location/example2.json';
10
+ import fhirVersions from '../fhirResourceVersions';
11
+ import fhirIcons from '../../../fixtures/example-icons';
10
12
 
11
13
  describe('should render Location component properly', () => {
14
+ it('component without a fhirIcons props should render a default icon', () => {
15
+ const defaultProps = {
16
+ fhirVersion: fhirVersions.DSTU2,
17
+ fhirResource: dstu2Example1,
18
+ };
19
+
20
+ const { getByAltText } = render(<Location {...defaultProps} />);
21
+ const headerIcon = getByAltText('location');
22
+
23
+ expect(headerIcon.getAttribute('src')).toContain('IMAGE_MOCK');
24
+ });
25
+
26
+ it('component with a false as a fhirIcons props should render a placeholder', () => {
27
+ const defaultProps = {
28
+ fhirVersion: fhirVersions.DSTU2,
29
+ fhirResource: dstu2Example1,
30
+ fhirIcons: false,
31
+ };
32
+
33
+ const { getByTestId } = render(<Location {...defaultProps} />);
34
+ const headerIcon = getByTestId('placeholder');
35
+
36
+ expect(headerIcon).toBeTruthy();
37
+ });
38
+
39
+ it('component with the img as a fhirIcons props should render an img', () => {
40
+ const defaultProps = {
41
+ fhirVersion: fhirVersions.DSTU2,
42
+ fhirResource: dstu2Example1,
43
+ fhirIcons: (
44
+ <img
45
+ src={require('../assets/containers/Location/location.svg')}
46
+ alt="location marker"
47
+ />
48
+ ),
49
+ };
50
+
51
+ const { getByAltText } = render(<Location {...defaultProps} />);
52
+ const headerIcon = getByAltText('location marker');
53
+
54
+ expect(headerIcon.getAttribute('src')).toContain('IMAGE_MOCK');
55
+ });
56
+
57
+ it('component with the resources object as a fhirIcons props should render an img', () => {
58
+ const defaultProps = {
59
+ fhirVersion: fhirVersions.DSTU2,
60
+ fhirResource: dstu2Example1,
61
+ fhirIcons: fhirIcons,
62
+ };
63
+
64
+ const { getByAltText } = render(<Location {...defaultProps} />);
65
+ const headerIcon = getByAltText('location marker');
66
+
67
+ expect(headerIcon.getAttribute('src')).toContain('IMAGE_MOCK');
68
+ });
69
+
70
+ it('component with the url as a fhirIcons props should render an img', () => {
71
+ const avatarSrc =
72
+ 'https://www.gravatar.com/avatar/?s=50&r=any&default=identicon&forcedefault=1';
73
+ const defaultProps = {
74
+ fhirVersion: fhirVersions.DSTU2,
75
+ fhirResource: dstu2Example1,
76
+ fhirIcons: avatarSrc,
77
+ };
78
+
79
+ const { getByAltText } = render(<Location {...defaultProps} />);
80
+ const headerIcon = getByAltText('header icon');
81
+
82
+ expect(headerIcon.getAttribute('src')).toContain(avatarSrc);
83
+ });
84
+
12
85
  it('should render with DSTU2 source data', () => {
13
86
  const defaultProps = {
14
87
  fhirResource: dstu2Example1,
@@ -31,7 +104,7 @@ describe('should render Location component properly', () => {
31
104
 
32
105
  expect(getByTestId('address').textContent).toContain('Galapagosweg 91');
33
106
 
34
- expect(getByTestId('telecom').textContent).toContain('fax2329');
107
+ expect(getByTestId('telecom').textContent).toContain('2329');
35
108
 
36
109
  expect(queryByTestId('type')).toBeNull();
37
110
 
@@ -66,7 +139,7 @@ describe('should render Location component properly', () => {
66
139
 
67
140
  expect(getByTestId('address').textContent).toContain('Galapagosweg 91');
68
141
 
69
- expect(getByTestId('telecom').textContent).toContain('fax2329');
142
+ expect(getByTestId('telecom').textContent).toContain('2329');
70
143
 
71
144
  expect(queryByTestId('type')).toBeNull();
72
145
 
@@ -101,7 +174,7 @@ describe('should render Location component properly', () => {
101
174
 
102
175
  expect(getByTestId('address').textContent).toContain('Galapagosweg 91');
103
176
 
104
- expect(getByTestId('telecom').textContent).toContain('fax2329');
177
+ expect(getByTestId('telecom').textContent).toContain('2329');
105
178
 
106
179
  expect(queryByTestId('type')).toBeNull();
107
180
 
@@ -146,4 +219,33 @@ describe('should render Location component properly', () => {
146
219
  'Organization/f001',
147
220
  );
148
221
  });
222
+
223
+ it('should fire custom onClick function', () => {
224
+ const defaultProps = { fhirResource: r4Example1 };
225
+
226
+ const onClick = jest.fn();
227
+ const { getByRole } = render(
228
+ <Location {...defaultProps} onClick={onClick} />,
229
+ );
230
+ const accordion = getByRole('button');
231
+ fireEvent.click(accordion);
232
+
233
+ const attribute = accordion.getAttribute('data-bs-toggle');
234
+ expect(attribute).not.toEqual('collapse');
235
+ expect(onClick).toHaveBeenCalled();
236
+ });
237
+
238
+ it('should not fire custom onClick function', () => {
239
+ const defaultProps = { fhirResource: r4Example1 };
240
+
241
+ const onClick = 'test';
242
+ const { getByRole } = render(
243
+ <Location {...defaultProps} onClick={onClick} />,
244
+ );
245
+ const accordion = getByRole('button');
246
+ fireEvent.click(accordion);
247
+
248
+ const attribute = accordion.getAttribute('data-bs-toggle');
249
+ expect(attribute).toEqual('collapse');
250
+ });
149
251
  });
@@ -162,7 +162,7 @@ const Ingredient = props => {
162
162
  );
163
163
  };
164
164
 
165
- const Medication = ({ fhirResource, fhirVersion, fhirIcons }) => {
165
+ const Medication = ({ fhirResource, fhirVersion, fhirIcons, onClick }) => {
166
166
  let fhirResourceData = {};
167
167
  try {
168
168
  fhirResourceData = resourceDTO(fhirVersion, fhirResource);
@@ -273,6 +273,7 @@ const Medication = ({ fhirResource, fhirVersion, fhirIcons }) => {
273
273
  )}
274
274
  </Body>
275
275
  }
276
+ onClick={onClick}
276
277
  />
277
278
  </Root>
278
279
  );
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import { render } from '@testing-library/react';
2
+ import { fireEvent, render } from '@testing-library/react';
3
3
 
4
4
  import Medication from './Medication';
5
5
  import fhirVersions from '../fhirResourceVersions';
@@ -188,4 +188,39 @@ describe('should render Medication component properly', () => {
188
188
  expect(queryByTestId('product-images')).toBeNull();
189
189
  expect(getByTestId('product-ingredient').textContent).toContain('#sub04');
190
190
  });
191
+
192
+ it('should fire custom onClick function', () => {
193
+ const defaultProps = {
194
+ fhirResource: r4Example2,
195
+ fhirVersion: fhirVersions.R4,
196
+ };
197
+
198
+ const onClick = jest.fn();
199
+ const { getByRole } = render(
200
+ <Medication {...defaultProps} onClick={onClick} />,
201
+ );
202
+ const accordion = getByRole('button');
203
+ fireEvent.click(accordion);
204
+
205
+ const attribute = accordion.getAttribute('data-bs-toggle');
206
+ expect(attribute).not.toEqual('collapse');
207
+ expect(onClick).toHaveBeenCalled();
208
+ });
209
+
210
+ it('should not fire custom onClick function', () => {
211
+ const defaultProps = {
212
+ fhirResource: r4Example2,
213
+ fhirVersion: fhirVersions.R4,
214
+ };
215
+
216
+ const onClick = 'test';
217
+ const { getByRole } = render(
218
+ <Medication {...defaultProps} onClick={onClick} />,
219
+ );
220
+ const accordion = getByRole('button');
221
+ fireEvent.click(accordion);
222
+
223
+ const attribute = accordion.getAttribute('data-bs-toggle');
224
+ expect(attribute).toEqual('collapse');
225
+ });
191
226
  });
@@ -9,16 +9,16 @@ import fhirVersions from '../fhirResourceVersions';
9
9
  import {
10
10
  Root,
11
11
  Header,
12
- Title,
13
12
  Badge,
14
13
  Body,
15
- Value,
16
14
  MissingValue,
17
15
  TableHeader,
18
16
  Table,
19
17
  TableCell,
20
18
  TableRow,
19
+ ValueSection,
21
20
  } from '../../ui';
21
+ import Accordion from '../../containers/Accordion';
22
22
 
23
23
  const commonDTO = fhirResource => {
24
24
  const medicationReference = _get(fhirResource, 'medicationReference');
@@ -110,8 +110,12 @@ const resourceDTO = (fhirVersion, fhirResource) => {
110
110
  }
111
111
  };
112
112
 
113
- const MedicationAdministration = props => {
114
- const { fhirResource, fhirVersion } = props;
113
+ const MedicationAdministration = ({
114
+ fhirResource,
115
+ fhirVersion,
116
+ fhirIcons,
117
+ onClick,
118
+ }) => {
115
119
  let fhirResourceData = {};
116
120
  try {
117
121
  fhirResourceData = resourceDTO(fhirVersion, fhirResource);
@@ -130,66 +134,86 @@ const MedicationAdministration = props => {
130
134
  status,
131
135
  } = fhirResourceData;
132
136
 
137
+ const tableData = [
138
+ {
139
+ label: 'Patient',
140
+ testId: 'patient',
141
+ data: subject && <Reference fhirData={subject} />,
142
+ status: subject,
143
+ },
144
+ {
145
+ label: 'Practitioner',
146
+ testId: 'practitioner',
147
+ data: practitioner && <Reference fhirData={practitioner} />,
148
+ status: practitioner,
149
+ },
150
+ ];
151
+
152
+ const tableContentData = [
153
+ {
154
+ testId: 'periodTimeStart',
155
+ data: periodTimeStart ? (
156
+ <Date fhirData={periodTimeStart} />
157
+ ) : (
158
+ <MissingValue />
159
+ ),
160
+ },
161
+ {
162
+ testId: 'periodTimeEnd',
163
+ data: periodTimeEnd ? (
164
+ <Date fhirData={periodTimeEnd} />
165
+ ) : (
166
+ <MissingValue />
167
+ ),
168
+ },
169
+ {
170
+ testId: 'dosageRoute',
171
+ data: dosageRoute ? <Coding fhirData={dosageRoute} /> : <MissingValue />,
172
+ },
173
+ {
174
+ testId: 'dosageQuantity',
175
+ data: dosageQuantity ? dosageQuantity : <MissingValue />,
176
+ },
177
+ ];
178
+
133
179
  return (
134
180
  <Root name="MedicationAdministration">
135
- <Header>
136
- <Title>
137
- <Reference fhirData={medicationReference} />
138
- </Title>
139
- {status && <Badge data-testid="status">{status}</Badge>}
140
- </Header>
141
- <Body>
142
- {subject && (
143
- <Value label="Patient" data-testid="patient">
144
- <Reference fhirData={subject} />
145
- </Value>
146
- )}
147
- {practitioner && (
148
- <Value label="Practitioner" data-testid="practitioner">
149
- <Reference fhirData={practitioner} />
150
- </Value>
151
- )}
152
- <div className="overflow-auto">
153
- <Table>
154
- <thead>
155
- <TableRow>
156
- <TableHeader>Period start</TableHeader>
157
- <TableHeader>Period end</TableHeader>
158
- <TableHeader>Dosage route</TableHeader>
159
- <TableHeader>Dosage quantity</TableHeader>
160
- </TableRow>
161
- </thead>
162
- <tbody>
163
- <TableRow>
164
- <TableCell data-testid="periodTimeStart">
165
- {periodTimeStart ? (
166
- <Date fhirData={periodTimeStart} />
167
- ) : (
168
- <MissingValue />
169
- )}
170
- </TableCell>
171
- <TableCell data-testid="periodTimeEnd">
172
- {periodTimeEnd ? (
173
- <Date fhirData={periodTimeEnd} />
174
- ) : (
175
- <MissingValue />
176
- )}
177
- </TableCell>
178
- <TableCell data-testid="dosageRoute">
179
- {dosageRoute ? (
180
- <Coding fhirData={dosageRoute} />
181
- ) : (
182
- <MissingValue />
183
- )}
184
- </TableCell>
185
- <TableCell data-testid="dosageQuantity">
186
- {dosageQuantity ? dosageQuantity : <MissingValue />}
187
- </TableCell>
188
- </TableRow>
189
- </tbody>
190
- </Table>
191
- </div>
192
- </Body>
181
+ <Accordion
182
+ headerContent={
183
+ <Header
184
+ resourceName="MedicationAdministration"
185
+ title={<Reference fhirData={medicationReference} />}
186
+ badges={status && <Badge data-testid="status">{status}</Badge>}
187
+ icon={fhirIcons}
188
+ />
189
+ }
190
+ bodyContent={
191
+ <Body tableData={tableData}>
192
+ <ValueSection className="overflow-auto">
193
+ <Table>
194
+ <thead>
195
+ <TableRow>
196
+ <TableHeader>Period start</TableHeader>
197
+ <TableHeader>Period end</TableHeader>
198
+ <TableHeader>Dosage route</TableHeader>
199
+ <TableHeader>Dosage quantity</TableHeader>
200
+ </TableRow>
201
+ </thead>
202
+ <tbody className="border-top-0">
203
+ <TableRow>
204
+ {tableContentData.map((element, index) => (
205
+ <TableCell key={index} data-testid={element.testId}>
206
+ {element.data}
207
+ </TableCell>
208
+ ))}
209
+ </TableRow>
210
+ </tbody>
211
+ </Table>
212
+ </ValueSection>
213
+ </Body>
214
+ }
215
+ onClick={onClick}
216
+ />
193
217
  </Root>
194
218
  );
195
219
  };
@@ -9,6 +9,8 @@ import r4Example1 from '../../../fixtures/r4/resources/medicationAdministration/
9
9
  import r4Example2 from '../../../fixtures/r4/resources/medicationAdministration/example2.json';
10
10
  import r4Example3 from '../../../fixtures/r4/resources/medicationAdministration/example3.json';
11
11
  import fhirVersions from '../fhirResourceVersions';
12
+ import fhirIcons from '../../../fixtures/example-icons';
13
+ import MedicationAdministrationIcon from '../../../assets/containers/MedicationAdministration/medication-administration.svg';
12
14
 
13
15
  export default {
14
16
  title: 'MedicationAdministration',
@@ -20,6 +22,7 @@ export const DefaultVisualizationDSTU2 = () => {
20
22
  <MedicationAdministration
21
23
  fhirVersion={fhirVersions.DSTU2}
22
24
  fhirResource={fhirResource}
25
+ fhirIcons={require('../../../assets/containers/MedicationAdministration/medication-administration.svg')}
23
26
  />
24
27
  );
25
28
  };
@@ -30,6 +33,7 @@ export const ExampleOfSTU3 = () => {
30
33
  <MedicationAdministration
31
34
  fhirVersion={fhirVersions.STU3}
32
35
  fhirResource={fhirResource}
36
+ fhirIcons={MedicationAdministrationIcon}
33
37
  />
34
38
  );
35
39
  };
@@ -40,6 +44,7 @@ export const Example1OfR4 = () => {
40
44
  <MedicationAdministration
41
45
  fhirVersion={fhirVersions.R4}
42
46
  fhirResource={fhirResource}
47
+ fhirIcons={fhirIcons}
43
48
  />
44
49
  );
45
50
  };
@@ -50,6 +55,7 @@ export const Example2OfR4 = () => {
50
55
  <MedicationAdministration
51
56
  fhirVersion={fhirVersions.R4}
52
57
  fhirResource={fhirResource}
58
+ fhirIcons={false}
53
59
  />
54
60
  );
55
61
  };
@@ -60,6 +66,7 @@ export const Example3OfR4 = () => {
60
66
  <MedicationAdministration
61
67
  fhirVersion={fhirVersions.R4}
62
68
  fhirResource={fhirResource}
69
+ fhirIcons={'random text'}
63
70
  />
64
71
  );
65
72
  };