@kenyaemr/esm-bed-management-app 1.0.1-pre.4 → 8.0.2

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 (177) hide show
  1. package/.turbo/turbo-build.log +36 -0
  2. package/README.md +6 -38
  3. package/dist/130.js +2 -0
  4. package/dist/{800.js.LICENSE.txt → 130.js.LICENSE.txt} +2 -0
  5. package/dist/130.js.map +1 -0
  6. package/dist/148.js +1 -0
  7. package/dist/148.js.map +1 -0
  8. package/dist/169.js +1 -0
  9. package/dist/169.js.map +1 -0
  10. package/dist/271.js +1 -0
  11. package/dist/319.js +1 -0
  12. package/dist/325.js +1 -0
  13. package/dist/325.js.map +1 -0
  14. package/dist/339.js +1 -0
  15. package/dist/339.js.map +1 -0
  16. package/dist/455.js +1 -1
  17. package/dist/455.js.LICENSE.txt +6 -0
  18. package/dist/455.js.map +1 -1
  19. package/dist/460.js +1 -0
  20. package/dist/501.js +1 -0
  21. package/dist/501.js.map +1 -0
  22. package/dist/542.js +1 -0
  23. package/dist/542.js.map +1 -0
  24. package/dist/574.js +1 -1
  25. package/dist/591.js +2 -0
  26. package/dist/{26.js.LICENSE.txt → 591.js.LICENSE.txt} +3 -3
  27. package/dist/591.js.map +1 -0
  28. package/dist/644.js +1 -0
  29. package/dist/757.js +1 -0
  30. package/dist/766.js +2 -0
  31. package/dist/{330.js.LICENSE.txt → 766.js.LICENSE.txt} +0 -9
  32. package/dist/766.js.map +1 -0
  33. package/dist/{294.js → 784.js} +2 -2
  34. package/dist/{294.js.map → 784.js.map} +1 -1
  35. package/dist/788.js +1 -0
  36. package/dist/807.js +1 -0
  37. package/dist/833.js +1 -0
  38. package/dist/main.js +1 -1
  39. package/dist/main.js.map +1 -1
  40. package/dist/openmrs-esm-bed-management-app.js +1 -0
  41. package/dist/{esm-kenyaemr-bed-management-app.js.buildmanifest.json → openmrs-esm-bed-management-app.js.buildmanifest.json} +202 -155
  42. package/dist/openmrs-esm-bed-management-app.js.map +1 -0
  43. package/dist/routes.json +1 -1
  44. package/jest.config.js +3 -0
  45. package/package-lock.json +5893 -0
  46. package/package.json +25 -83
  47. package/src/__mocks__/react-i18next.js +18 -14
  48. package/src/admin-card-link.component.tsx +7 -10
  49. package/src/bed-administration/bed-administration-form.component.tsx +65 -99
  50. package/src/bed-administration/bed-administration-table.component.tsx +68 -127
  51. package/src/bed-administration/bed-administration-table.scss +12 -16
  52. package/src/bed-administration/bed-administration-types.ts +8 -0
  53. package/src/bed-administration/bed-administration.resource.ts +16 -18
  54. package/src/bed-administration/edit-bed-form.component.tsx +20 -31
  55. package/src/bed-administration/new-bed-form.component.tsx +28 -44
  56. package/src/bed-tag/bed-tag-administration-table.component.tsx +192 -0
  57. package/src/bed-tag/bed-tags-admin-form.component.tsx +127 -0
  58. package/src/bed-tag/edit-tag-form.component.tsx +72 -0
  59. package/src/bed-tag/new-tag-form.component.tsx +76 -0
  60. package/src/bed-type/bed-type-admin-form.component.tsx +166 -0
  61. package/src/bed-type/bed-type-administration-table.component.tsx +198 -0
  62. package/src/bed-type/edit-bed-type.component.tsx +72 -0
  63. package/src/bed-type/new-bed-type-form.component.tsx +80 -0
  64. package/src/card-header/card-header.component.tsx +20 -0
  65. package/src/card-header/card-header.scss +45 -0
  66. package/src/config-schema.ts +9 -17
  67. package/src/declarations.d.ts +5 -5
  68. package/src/empty-state/empty-state.component.tsx +6 -21
  69. package/src/empty-state/empty-state.scss +10 -10
  70. package/src/header/header.component.tsx +14 -23
  71. package/src/header/header.scss +11 -11
  72. package/src/header/illustration.component.tsx +3 -3
  73. package/src/home.component.tsx +4 -4
  74. package/src/index.ts +26 -40
  75. package/src/left-panel/left-panel.component.tsx +7 -17
  76. package/src/left-panel/left-panel.scss +8 -7
  77. package/src/left-panel-link.component.tsx +14 -24
  78. package/src/root.component.tsx +14 -10
  79. package/src/root.scss +2 -2
  80. package/src/routes.json +12 -2
  81. package/src/setup-tests.ts +1 -1
  82. package/src/summary/summary.component.tsx +16 -30
  83. package/src/summary/summary.resource.ts +169 -60
  84. package/src/summary/summary.scss +31 -29
  85. package/src/types.ts +50 -29
  86. package/src/ward-card/ward-card.component.tsx +5 -12
  87. package/src/ward-card/ward-card.scss +2 -2
  88. package/src/ward-with-beds/ward-with-beds.component.tsx +28 -47
  89. package/src/ward-with-beds/ward-with-beds.scss +5 -5
  90. package/translations/am.json +51 -0
  91. package/translations/ar.json +51 -0
  92. package/translations/en.json +48 -4
  93. package/translations/es.json +51 -0
  94. package/translations/fr.json +51 -0
  95. package/translations/he.json +51 -0
  96. package/translations/km.json +51 -0
  97. package/translations/zh.json +51 -0
  98. package/translations/zh_CN.json +51 -0
  99. package/tsconfig.json +3 -21
  100. package/webpack.config.js +1 -1
  101. package/.editorconfig +0 -12
  102. package/.eslintignore +0 -2
  103. package/.eslintrc +0 -37
  104. package/.husky/pre-commit +0 -4
  105. package/.idea/inspectionProfiles/Project_Default.xml +0 -6
  106. package/.idea/modules.xml +0 -8
  107. package/.idea/vcs.xml +0 -6
  108. package/.prettierignore +0 -14
  109. package/.turbo.json +0 -18
  110. package/.yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs +0 -541
  111. package/.yarn/plugins/@yarnpkg/plugin-version.cjs +0 -550
  112. package/.yarn/versions/6816f0d4.yml +0 -0
  113. package/LICENSE +0 -373
  114. package/dist/187.js +0 -1
  115. package/dist/187.js.map +0 -1
  116. package/dist/207.js +0 -1
  117. package/dist/207.js.map +0 -1
  118. package/dist/26.js +0 -2
  119. package/dist/26.js.map +0 -1
  120. package/dist/283.js +0 -1
  121. package/dist/283.js.map +0 -1
  122. package/dist/330.js +0 -2
  123. package/dist/330.js.map +0 -1
  124. package/dist/352.js +0 -1
  125. package/dist/352.js.map +0 -1
  126. package/dist/404.js +0 -1
  127. package/dist/404.js.map +0 -1
  128. package/dist/558.js +0 -2
  129. package/dist/558.js.LICENSE.txt +0 -14
  130. package/dist/558.js.map +0 -1
  131. package/dist/629.js +0 -1
  132. package/dist/629.js.map +0 -1
  133. package/dist/707.js +0 -1
  134. package/dist/707.js.map +0 -1
  135. package/dist/800.js +0 -2
  136. package/dist/800.js.map +0 -1
  137. package/dist/884.js +0 -1
  138. package/dist/884.js.map +0 -1
  139. package/dist/933.js +0 -1
  140. package/dist/933.js.map +0 -1
  141. package/dist/959.js +0 -1
  142. package/dist/959.js.map +0 -1
  143. package/dist/esm-kenyaemr-bed-management-app.js +0 -1
  144. package/dist/esm-kenyaemr-bed-management-app.js.map +0 -1
  145. package/i18next-parser.config.js +0 -89
  146. package/src/assets/landing-page.png +0 -0
  147. package/src/assets/logo.svg +0 -1
  148. package/src/bed-admission/active-patients/active-patients-table.component.tsx +0 -299
  149. package/src/bed-admission/active-patients/active-visits.resource.ts +0 -171
  150. package/src/bed-admission/active-patients/admission-action-button-styles.scss +0 -0
  151. package/src/bed-admission/active-patients/admission-action-button.component.tsx +0 -26
  152. package/src/bed-admission/active-patients/index.tsx +0 -15
  153. package/src/bed-admission/active-patients/patient-queues.resource.ts +0 -136
  154. package/src/bed-admission/active-patients/styles.scss +0 -284
  155. package/src/bed-admission/active-patients/view-action-menu.component.tsx +0 -33
  156. package/src/bed-admission/admitted-patients/active-admissions.resource.ts +0 -121
  157. package/src/bed-admission/admitted-patients/admitted-patients-table.component.tsx +0 -280
  158. package/src/bed-admission/admitted-patients/admitted-patients.component.tsx +0 -22
  159. package/src/bed-admission/admitted-patients/location-combo-box.component.tsx +0 -55
  160. package/src/bed-admission/admitted-patients/styles.scss +0 -284
  161. package/src/bed-admission/bed-admission-tabs-styles.scss +0 -30
  162. package/src/bed-admission/bed-admission-tabs.component.tsx +0 -69
  163. package/src/bed-admission/bed-admission.component.tsx +0 -15
  164. package/src/bed-admission/bed-admission.resource.ts +0 -35
  165. package/src/bed-admission/bed-layout/bed-layout-list.component.tsx +0 -101
  166. package/src/bed-admission/bed-layout/bed-layout.component.tsx +0 -64
  167. package/src/bed-admission/bed-layout/bed-layout.scss +0 -118
  168. package/src/bed-admission/bed-layout/min-bed-layout.component.tsx +0 -26
  169. package/src/bed-admission/createDashboardLink.tsx +0 -47
  170. package/src/bed-admission/discharged-patients/discharged-patients.componet.tsx +0 -19
  171. package/src/bed-admission/helpers/functions.ts +0 -102
  172. package/src/bed-admission/types.ts +0 -133
  173. package/src/workspace/allocate-bed-workspace.component.tsx +0 -141
  174. package/src/workspace/allocate-bed.scss +0 -117
  175. package/src/workspace/overlay.component.tsx +0 -55
  176. package/src/workspace/overlay.scss +0 -96
  177. /package/dist/{294.js.LICENSE.txt → 784.js.LICENSE.txt} +0 -0
@@ -1,22 +0,0 @@
1
- import React from "react";
2
- import AdmittedPatientsTable from "./admitted-patients-table.component";
3
- interface AdmittedPatientsListProps {
4
- status: string;
5
- setPatientCount: (value: number) => void;
6
- }
7
-
8
- const AdmittedPatientsList: React.FC<AdmittedPatientsListProps> = ({
9
- status,
10
- setPatientCount,
11
- }) => {
12
- return (
13
- <>
14
- <AdmittedPatientsTable
15
- status={status}
16
- setPatientCount={setPatientCount}
17
- />
18
- </>
19
- );
20
- };
21
-
22
- export default AdmittedPatientsList;
@@ -1,55 +0,0 @@
1
- import React, { useState } from "react";
2
- import { ComboBox, FormGroup } from "@carbon/react";
3
- import { useTranslation } from "react-i18next";
4
- import { useLocationsByTag } from "../../summary/summary.resource";
5
- import { useConfig, useSession } from "@openmrs/esm-framework";
6
-
7
- const LocationComboBox = ({ setLocationUuid }) => {
8
- const { t } = useTranslation();
9
- const {
10
- admissionLocationTagUuid,
11
- restrictWardAdministrationToLoginLocation,
12
- } = useConfig();
13
- const session = useSession();
14
- const [selectedLocationId] = useState("");
15
-
16
- const { data: admissionLocations } = useLocationsByTag(
17
- admissionLocationTagUuid
18
- );
19
-
20
- const filterLocationNames = (location) => {
21
- return (
22
- location.item.display
23
- ?.toLowerCase()
24
- .includes(location?.inputValue?.toLowerCase()) ?? []
25
- );
26
- };
27
-
28
- return (
29
- <FormGroup>
30
- <ComboBox
31
- aria-label={t("location", "Locations")}
32
- id="location"
33
- label={t("location", "Locations")}
34
- shouldFilterItem={filterLocationNames}
35
- items={admissionLocations}
36
- onChange={({ selectedItem }) => {
37
- setLocationUuid(selectedItem?.uuid ?? "");
38
- }}
39
- selectedItem={admissionLocations?.find(
40
- (location) => location?.uuid === selectedLocationId
41
- )}
42
- itemToString={(location) => location?.display ?? ""}
43
- placeholder={t("selectNewLocation", "Select an admission location")}
44
- title={selectedLocationId}
45
- initialSelectedItem={
46
- restrictWardAdministrationToLoginLocation
47
- ? session.sessionLocation
48
- : ""
49
- }
50
- />
51
- </FormGroup>
52
- );
53
- };
54
-
55
- export default LocationComboBox;
@@ -1,284 +0,0 @@
1
- @use '@carbon/type';
2
- @use '@carbon/colors';
3
- @use '@carbon/styles/scss/spacing';
4
- @import '~@openmrs/esm-styleguide/src/vars';
5
-
6
- .container {
7
- background-color: $ui-01;
8
- }
9
-
10
- .displayFlex {
11
- display: flex;
12
- }
13
-
14
- .section {
15
- border-right: 1px solid colors.$gray-20;
16
- }
17
-
18
- .activePatientsTable tr:last-of-type {
19
- td {
20
- border-bottom: none;
21
- }
22
- }
23
-
24
- .headerContainer {
25
- display: flex;
26
- justify-content: space-between;
27
- align-items: center;
28
- background-color: $ui-background;
29
- }
30
-
31
- .headerButtons {
32
- display: flex;
33
- flex-flow: column;
34
- }
35
-
36
- .heading {
37
- font-size: 20px;
38
- font-weight: bold;
39
- }
40
-
41
- .filterContainer {
42
- :global(.cds--dropdown__wrapper--inline) {
43
- gap: 0;
44
- }
45
-
46
- :global(.cds--list-box__menu-icon) {
47
- height: 1rem;
48
- }
49
-
50
- :global(.cds--dropdown--inline) :global(.cds--list-box__field) {
51
- min-width: 12rem;
52
- }
53
- }
54
-
55
- .tooltip :global(.cds--tooltip__trigger.cds--tooltip__trigger--definition) {
56
- border-bottom: none;
57
- }
58
-
59
- .tag {
60
- margin: 0.25rem 0;
61
- }
62
-
63
- .priorityTag {
64
- @extend .tag;
65
- @include type.type-style('label-01');
66
- color: #943d00;
67
- background-color: #ffc9a3;
68
- }
69
-
70
- .backgroundDataFetchingIndicator {
71
- align-items: center;
72
- display: flex;
73
- flex: 1 1 0%;
74
- justify-content: center;
75
- }
76
-
77
- .search {
78
- max-width: 16rem;
79
-
80
- input {
81
- background-color: $ui-02 !important;
82
- }
83
- }
84
-
85
- .tableContainer {
86
- background-color: $ui-01;
87
- margin: 0 spacing.$spacing-05;
88
- padding: 0;
89
-
90
- a {
91
- text-decoration: none;
92
- }
93
-
94
- th {
95
- color: $text-02;
96
- }
97
-
98
- :global(.cds--data-table) {
99
- background-color: $ui-03;
100
- }
101
-
102
- :global(.cds--data-table-content) {
103
- display: contents;
104
- }
105
-
106
- .toolbarContent {
107
- height: spacing.$spacing-07;
108
- margin-bottom: spacing.$spacing-02;
109
- }
110
- }
111
-
112
- .emptyRow {
113
- padding: 0 1rem;
114
- display: flex;
115
- align-items: center;
116
- }
117
-
118
- .activeVisitsTable tr:last-of-type {
119
- td {
120
- border-bottom: none;
121
- }
122
- }
123
-
124
- .expandedActiveVisitRow {
125
- :global(.cds--tab-content) {
126
- padding: 0.5rem 0;
127
- }
128
-
129
- td {
130
- padding: 0.5rem;
131
-
132
- >div {
133
- max-height: max-content !important;
134
- background-color: $ui-02;
135
- }
136
- }
137
-
138
- th[colspan] td[colspan]>div:first-child {
139
- padding: 0 1rem;
140
- }
141
- }
142
-
143
- .hiddenRow {
144
- display: none;
145
- }
146
-
147
- .content {
148
- @include type.type-style('heading-compact-02');
149
- color: $text-02;
150
- margin-bottom: 0.5rem;
151
- }
152
-
153
- .helper {
154
- @include type.type-style('body-compact-01');
155
- color: $text-02;
156
- }
157
-
158
- .separator {
159
- @include type.type-style('body-compact-02');
160
- color: $text-02;
161
- width: 80%;
162
- margin: 1.5rem auto;
163
- overflow: hidden;
164
- text-align: center;
165
-
166
- &::before,
167
- &::after {
168
- background-color: $text-03;
169
- content: '';
170
- display: inline-block;
171
- height: 1px;
172
- position: relative;
173
- vertical-align: middle;
174
- width: 50%;
175
- }
176
-
177
- &::before {
178
- right: 0.5rem;
179
- margin-left: -50%;
180
- }
181
-
182
- &::after {
183
- left: 0.5rem;
184
- margin-right: -50%;
185
- }
186
- }
187
-
188
- .tileContainer {
189
- background-color: $ui-02;
190
- border-top: 1px solid $ui-03;
191
- padding: 5rem 0;
192
- }
193
-
194
- .tile {
195
- margin: auto;
196
- width: fit-content;
197
- }
198
-
199
- .tileContent {
200
- display: flex;
201
- flex-direction: column;
202
- align-items: center;
203
- }
204
-
205
- .menuItem {
206
- max-width: none;
207
- }
208
-
209
- .desktopHeading {
210
- h4 {
211
- @include type.type-style('heading-compact-02');
212
- color: $text-02;
213
- }
214
- }
215
-
216
- .tabletHeading {
217
- h4 {
218
- @include type.type-style('heading-03');
219
- color: $text-02;
220
- }
221
- }
222
-
223
- .desktopHeading,
224
- .tabletHeading {
225
- text-align: left;
226
- text-transform: capitalize;
227
- margin-bottom: spacing.$spacing-05;
228
-
229
- h4:after {
230
- content: '';
231
- display: block;
232
- width: 2rem;
233
- padding-top: 3px;
234
- border-bottom: 0.375rem solid var(--brand-03);
235
- }
236
- }
237
-
238
- .statusContainer {
239
- display: flex;
240
- align-items: center;
241
-
242
- svg {
243
- margin-right: 0.5rem;
244
- }
245
- }
246
-
247
- .visitType {
248
- @include type.type-style('heading-compact-02');
249
- }
250
-
251
- .headerBtnContainer {
252
- background-color: $ui-background;
253
- text-align: right;
254
- }
255
-
256
- .addPatientToListBtn {
257
- margin-left: spacing.$spacing-05;
258
- height: spacing.$spacing-09;
259
- }
260
-
261
- .editIcon {
262
- color: $interactive-01;
263
- margin-top: 0.5rem;
264
- cursor: pointer;
265
- }
266
-
267
- .expandedLabQueueVisitRow {
268
- :global(.cds--tab-content) {
269
- padding: 0.5rem 0;
270
- }
271
-
272
- td {
273
- padding: 0.5rem;
274
-
275
- >div {
276
- max-height: max-content !important;
277
- background-color: $ui-02;
278
- }
279
- }
280
-
281
- th[colspan] td[colspan]>div:first-child {
282
- padding: 0 1rem;
283
- }
284
- }
@@ -1,30 +0,0 @@
1
- @import '~@openmrs/esm-styleguide/src/vars';
2
-
3
- .tabsContainer {
4
- :global(.cds--tabs__nav-item--selected) {
5
- box-shadow: inset 0 2px 0 0 var(--brand-03) !important;
6
-
7
- }
8
- }
9
-
10
- .tab {
11
- min-width: 8rem;
12
-
13
- &:active,
14
- &:focus {
15
- outline: none !important;
16
- }
17
-
18
- }
19
-
20
- .container {
21
- background-color: $ui-01;
22
- }
23
-
24
- .cardContainer {
25
- background-color: $ui-02;
26
- display: grid;
27
- grid-template-columns: repeat(3, minmax(0, 1fr));
28
- justify-content: space-between;
29
- padding: 1rem;
30
- }
@@ -1,69 +0,0 @@
1
- import { Tab, TabList, TabPanel, TabPanels, Tabs } from "@carbon/react";
2
- import React, { useState } from "react";
3
- import styles from "./bed-admission-tabs-styles.scss";
4
- import { useTranslation } from "react-i18next";
5
- import ActivePatientsTable from "./active-patients/active-patients-table.component";
6
- import AdmittedPatientsList from "./admitted-patients/admitted-patients.component";
7
- import DischargedPatientsList from "./discharged-patients/discharged-patients.componet";
8
- import WardCard from "../ward-card/ward-card.component";
9
-
10
- const BedAdmissionTabs: React.FC = () => {
11
- const { t } = useTranslation();
12
- const [admittedCount, setAdmittedCount] = useState(0);
13
- const [toAdmitCount, setToAdmitCount] = useState(0);
14
- const [toDischargeCount, setToDischargeCount] = useState(0);
15
-
16
- return (
17
- <>
18
- <div className={styles.cardContainer}>
19
- <WardCard
20
- label="patients"
21
- headerLabel="To Admit"
22
- value={admittedCount}
23
- />
24
- <WardCard
25
- label="patients"
26
- headerLabel="Admitted"
27
- value={toAdmitCount}
28
- />
29
- <WardCard
30
- label="patients"
31
- headerLabel="To Discharge"
32
- value={toDischargeCount}
33
- />
34
- </div>
35
- <div className={styles.container}>
36
- <Tabs>
37
- <TabList contained fullWidth className={styles.tabsContainer}>
38
- <Tab className={styles.tab}>
39
- {t("toAdmit", `To Admit (${admittedCount})`)}
40
- </Tab>
41
- <Tab className={styles.tab}>
42
- {t("admitted", `Admitted (${toAdmitCount})`)}
43
- </Tab>
44
- <Tab className={styles.tab}>
45
- {t("discharged", `To Discharge (0)`)}
46
- </Tab>
47
- </TabList>
48
- <TabPanels>
49
- <TabPanel>
50
- <ActivePatientsTable
51
- status="pending"
52
- setPatientCount={setAdmittedCount}
53
- />
54
- </TabPanel>
55
- <TabPanel>
56
- <AdmittedPatientsList
57
- status="completed"
58
- setPatientCount={setToAdmitCount}
59
- />
60
- </TabPanel>
61
- <TabPanel></TabPanel>
62
- </TabPanels>
63
- </Tabs>
64
- </div>
65
- </>
66
- );
67
- };
68
-
69
- export default BedAdmissionTabs;
@@ -1,15 +0,0 @@
1
- import React from "react";
2
- import { BrowserRouter, Route, Routes } from "react-router-dom";
3
- import ActivePatientsHome from "./active-patients";
4
-
5
- const BedAdmission: React.FC = () => {
6
- return (
7
- <BrowserRouter basename={window.getOpenmrsSpaBase()}>
8
- <Routes>
9
- <Route path="/home/bed-admission" element={<ActivePatientsHome />} />
10
- </Routes>
11
- </BrowserRouter>
12
- );
13
- };
14
-
15
- export default BedAdmission;
@@ -1,35 +0,0 @@
1
- import { FetchResponse, openmrsFetch } from "@openmrs/esm-framework";
2
-
3
- export async function assignPatientBed(
4
- requestPayload,
5
- bedId
6
- ): Promise<FetchResponse> {
7
- const abortController = new AbortController();
8
- abortController.abort();
9
- const response: FetchResponse = await openmrsFetch(
10
- `/ws/rest/v1/beds/${bedId}`,
11
- {
12
- method: "POST",
13
- headers: { "Content-Type": "application/json" },
14
- body: requestPayload,
15
- }
16
- );
17
- return response;
18
- }
19
-
20
- export async function endPatientQueue(
21
- queueStatus,
22
- queueUuid
23
- ): Promise<FetchResponse> {
24
- const abortController = new AbortController();
25
- abortController.abort();
26
- const response: FetchResponse = await openmrsFetch(
27
- `/ws/rest/v1/patientqueue/${queueUuid}`,
28
- {
29
- method: "POST",
30
- headers: { "Content-Type": "application/json" },
31
- body: queueStatus,
32
- }
33
- );
34
- return response;
35
- }
@@ -1,101 +0,0 @@
1
- import React, { useState } from "react";
2
- import { Column, InlineLoading, Grid } from "@carbon/react";
3
- import { ErrorState } from "@openmrs/esm-patient-common-lib";
4
- import { useTranslation } from "react-i18next";
5
- import BedLayout from "./bed-layout.component";
6
- import styles from "./bed-layout.scss";
7
- import EmptyState from "../../empty-state/empty-state.component";
8
- import MinBedLayout from "./min-bed-layout.component";
9
- import { useAdmissionLocationBedLayout } from "../../summary/summary.resource";
10
- import { patientDetailsProps } from "../types";
11
- interface BedLayoutListProps {
12
- locationUuid: string;
13
- handleClick: (e) => void;
14
- patientDetails: patientDetailsProps;
15
- }
16
-
17
- const BedLayoutList: React.FC<BedLayoutListProps> = React.memo(
18
- ({ locationUuid, handleClick, patientDetails }) => {
19
- const { t } = useTranslation();
20
- const [selectedBed, setSelectedBed] = useState(null);
21
- const {
22
- data: bedData,
23
- isLoading,
24
- error,
25
- } = useAdmissionLocationBedLayout(locationUuid);
26
-
27
- const getLayoutClass = (status: string) =>
28
- status === "AVAILABLE" ? styles.available : styles.occupied;
29
-
30
- if (isLoading) {
31
- return (
32
- <div className={styles.loadingContainer}>
33
- <InlineLoading
34
- status="active"
35
- iconDescription={t("loading", "Loading")}
36
- description={t("loading", "Loading...")}
37
- />
38
- </div>
39
- );
40
- }
41
-
42
- if (error) {
43
- return (
44
- <div className={styles.errorContainer}>
45
- <ErrorState
46
- headerTitle={t(
47
- "errorFetchingbedInformation",
48
- "Error fetching bed information"
49
- )}
50
- error={error}
51
- />
52
- </div>
53
- );
54
- }
55
-
56
- if (locationUuid === undefined) {
57
- return (
58
- <div className={styles.errorContainer}>
59
- <EmptyState
60
- msg={t("noWardSelected", "No ward has been selected")}
61
- helper=""
62
- />
63
- </div>
64
- );
65
- }
66
- if (locationUuid !== undefined && !bedData?.length) {
67
- return (
68
- <div className={styles.errorContainer}>
69
- <EmptyState
70
- msg={t("noBedItems", "No bed to display in this ward")}
71
- helper=""
72
- />
73
- </div>
74
- );
75
- }
76
- return (
77
- <>
78
- <MinBedLayout />
79
- <Grid>
80
- {bedData?.map((bed) => (
81
- <Column key={bed.bedNumber} lg={5} md={5} sm={5}>
82
- <BedLayout
83
- handleBedAssignment={() => {
84
- setSelectedBed(bed.bedId);
85
- handleClick(bed);
86
- }}
87
- bedPillowStyles={styles.pillow}
88
- layOutStyles={`${styles.bed} ${getLayoutClass(bed.status)}`}
89
- isBedSelected={selectedBed === bed.bedId}
90
- patientDetails={patientDetails}
91
- bedDetails={bed}
92
- />
93
- </Column>
94
- ))}
95
- </Grid>
96
- </>
97
- );
98
- }
99
- );
100
-
101
- export default BedLayoutList;
@@ -1,64 +0,0 @@
1
- import React, { useRef } from "react";
2
- import classnames from "classnames";
3
- import styles from "./bed-layout.scss";
4
- import { patientDetailsProps } from "../types";
5
- import { BedDetails } from "../../types";
6
-
7
- interface BedProps {
8
- handleBedAssignment?: () => void;
9
- isBedSelected?: boolean;
10
- layOutStyles?: string;
11
- bedPillowStyles?: string;
12
- patientDetails?: patientDetailsProps;
13
- bedDetails?: BedDetails;
14
- }
15
-
16
- const BedLayout: React.FC<BedProps> = ({
17
- layOutStyles,
18
- bedPillowStyles,
19
- handleBedAssignment,
20
- isBedSelected,
21
- bedDetails,
22
- patientDetails,
23
- }) => {
24
- const bedRef = useRef(null);
25
-
26
- return (
27
- <>
28
- <div
29
- ref={bedRef}
30
- role="button"
31
- tabIndex={0}
32
- onClick={() => handleBedAssignment()}
33
- className={classnames(styles.bedLayout, {
34
- [layOutStyles]: layOutStyles,
35
- [styles.bedLayoutSelected]:
36
- isBedSelected ||
37
- (bedDetails &&
38
- bedDetails.patient &&
39
- bedDetails.patient.uuid === patientDetails.patientUuid),
40
- })}
41
- >
42
- <div
43
- className={classnames(styles.bedPillow, {
44
- [bedPillowStyles]: bedPillowStyles,
45
- })}
46
- ></div>
47
- <div style={{ display: "grid" }}>
48
- <span className={styles.bedNumber}>
49
- {bedDetails && bedDetails.bedNumber}
50
- </span>
51
- <span className={styles.bedNumber}>
52
- {bedDetails &&
53
- bedDetails.patient &&
54
- bedDetails.patient.uuid === patientDetails.patientUuid
55
- ? bedDetails.patient.identifiers[0].identifier
56
- : ""}
57
- </span>
58
- </div>
59
- </div>
60
- </>
61
- );
62
- };
63
-
64
- export default BedLayout;