@openmrs/esm-dispensing-app 1.6.2 → 1.6.3-pre.10

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 (194) hide show
  1. package/.turbo/cache/6dd55fe02e848786-meta.json +1 -0
  2. package/.turbo/cache/6dd55fe02e848786.tar.zst +0 -0
  3. package/.turbo/turbo-build.log +44 -0
  4. package/README.md +1 -0
  5. package/dist/1616.js +2 -0
  6. package/dist/{524.js.LICENSE.txt → 1616.js.LICENSE.txt} +9 -14
  7. package/dist/1616.js.map +1 -0
  8. package/dist/1637.js +1 -0
  9. package/dist/1637.js.map +1 -0
  10. package/dist/1644.js +1 -0
  11. package/dist/1901.js +1 -0
  12. package/dist/1905.js +1 -0
  13. package/dist/1905.js.map +1 -0
  14. package/dist/2016.js +1 -0
  15. package/dist/2511.js +1 -0
  16. package/dist/2511.js.map +1 -0
  17. package/dist/2757.js +1 -0
  18. package/dist/3574.js +1 -0
  19. package/dist/3652.js +1 -0
  20. package/dist/3935.js +2 -0
  21. package/dist/3935.js.map +1 -0
  22. package/dist/4272.js +1 -0
  23. package/dist/4378.js +1 -0
  24. package/dist/4460.js +1 -0
  25. package/dist/4705.js +1 -0
  26. package/dist/5240.js +1 -0
  27. package/dist/5336.js +1 -0
  28. package/dist/5673.js +1 -0
  29. package/dist/5711.js +1 -0
  30. package/dist/5737.js +1 -0
  31. package/dist/5833.js +1 -0
  32. package/dist/5962.js +1 -0
  33. package/dist/6497.js +1 -0
  34. package/dist/6566.js +1 -0
  35. package/dist/6582.js +1 -0
  36. package/dist/6582.js.map +1 -0
  37. package/dist/6727.js +1 -0
  38. package/dist/6868.js +2 -0
  39. package/dist/6868.js.LICENSE.txt +14 -0
  40. package/dist/6868.js.map +1 -0
  41. package/dist/6936.js +1 -0
  42. package/dist/6936.js.map +1 -0
  43. package/dist/6973.js +1 -0
  44. package/dist/6973.js.map +1 -0
  45. package/dist/7294.js +2 -0
  46. package/dist/7294.js.map +1 -0
  47. package/dist/7484.js +1 -0
  48. package/dist/7484.js.map +1 -0
  49. package/dist/7626.js +1 -0
  50. package/dist/7626.js.map +1 -0
  51. package/dist/7687.js +1 -0
  52. package/dist/7687.js.map +1 -0
  53. package/dist/7807.js +1 -0
  54. package/dist/7998.js +1 -0
  55. package/dist/8077.js +1 -0
  56. package/dist/8077.js.map +1 -0
  57. package/dist/8271.js +1 -0
  58. package/dist/8319.js +1 -0
  59. package/dist/8323.js +1 -0
  60. package/dist/8788.js +1 -0
  61. package/dist/8949.js +1 -0
  62. package/dist/8949.js.map +1 -0
  63. package/dist/9204.js +2 -0
  64. package/dist/{204.js.LICENSE.txt → 9204.js.LICENSE.txt} +2 -0
  65. package/dist/9204.js.map +1 -0
  66. package/dist/9261.js +1 -0
  67. package/dist/9579.js +1 -0
  68. package/dist/9870.js +2 -0
  69. package/dist/9870.js.LICENSE.txt +9 -0
  70. package/dist/9870.js.map +1 -0
  71. package/dist/main.js +1 -1
  72. package/dist/main.js.LICENSE.txt +21 -11
  73. package/dist/main.js.map +1 -1
  74. package/dist/openmrs-esm-dispensing-app.js +1 -1
  75. package/dist/openmrs-esm-dispensing-app.js.buildmanifest.json +455 -244
  76. package/dist/openmrs-esm-dispensing-app.js.map +1 -1
  77. package/dist/routes.json +1 -1
  78. package/jest.config.js +3 -1
  79. package/package.json +7 -4
  80. package/src/components/action-buttons.component.tsx +7 -0
  81. package/src/components/{action-buttons.component.test.tsx → action-buttons.test.tsx} +8 -7
  82. package/src/components/medication-card.component.tsx +3 -3
  83. package/src/components/medication-card.scss +8 -8
  84. package/src/components/medication-dispense-review.scss +16 -10
  85. package/src/components/medication-event.component.tsx +4 -4
  86. package/src/components/medication-event.scss +10 -5
  87. package/src/components/patient-details.component.tsx +4 -4
  88. package/src/components/patient-details.scss +12 -12
  89. package/src/components/prescription-actions/close-action-button.component.tsx +1 -1
  90. package/src/components/prescription-actions/dispense-action-button.component.tsx +4 -1
  91. package/src/components/prescription-actions/pause-action-button.component.tsx +1 -1
  92. package/src/conditions/conditions.component.tsx +93 -0
  93. package/src/conditions/conditions.resource.ts +100 -0
  94. package/src/conditions/conditions.scss +9 -0
  95. package/src/config-schema.ts +8 -0
  96. package/src/dashboard/dispensing-dashboard-link.component.tsx +1 -1
  97. package/src/dashboard/dispensing-dashboard.component.tsx +10 -4
  98. package/src/declarations.d.ts +0 -1
  99. package/src/diagnoses/diagnoses.component.tsx +92 -0
  100. package/src/diagnoses/diagnoses.resource.ts +30 -0
  101. package/src/diagnoses/diagnoses.scss +9 -0
  102. package/src/dispensing-tiles/dispensing-tile.component.tsx +20 -17
  103. package/src/dispensing-tiles/dispensing-tile.scss +8 -8
  104. package/src/dispensing-tiles/dispensing-tiles.scss +4 -5
  105. package/src/forms/close-dispense-form.workspace.tsx +25 -23
  106. package/src/forms/dispense-form.workspace.tsx +3 -0
  107. package/src/forms/forms.scss +5 -9
  108. package/src/forms/medication-dispense-review.component.tsx +235 -204
  109. package/src/forms/{medication-dispense-review.component.test.tsx → medication-dispense-review.test.tsx} +2 -1
  110. package/src/forms/pause-dispense-form.workspace.tsx +25 -23
  111. package/src/forms/stock-dispense/stock-dispense.component.tsx +10 -10
  112. package/src/history/history-and-comments.component.tsx +8 -1
  113. package/src/history/history-and-comments.scss +17 -15
  114. package/src/index.ts +3 -0
  115. package/src/location/location.resource.test.tsx +1 -0
  116. package/src/medication/medication.resource.tsx +1 -1
  117. package/src/patient/patient-info-cell.component.tsx +1 -1
  118. package/src/pharmacy-header/pharmacy-header.scss +11 -11
  119. package/src/prescriptions/prescription-actions.scss +0 -1
  120. package/src/prescriptions/prescription-details.component.tsx +6 -6
  121. package/src/prescriptions/prescription-details.scss +10 -10
  122. package/src/prescriptions/prescription-expanded.component.tsx +5 -9
  123. package/src/prescriptions/prescription-expanded.scss +6 -7
  124. package/src/prescriptions/prescription-tab-lists.component.tsx +5 -5
  125. package/src/prescriptions/prescriptions.scss +15 -29
  126. package/src/print-prescription/prescription-printout.component.tsx +1 -1
  127. package/src/routes.json +14 -0
  128. package/src/utils.ts +1 -1
  129. package/tools/setup-tests.ts +1 -0
  130. package/tools/update-openmrs-deps.mjs +42 -0
  131. package/translations/en.json +9 -1
  132. package/translations/es.json +23 -23
  133. package/translations/it.json +87 -87
  134. package/translations/ky.json +92 -0
  135. package/tsconfig.json +3 -2
  136. package/dist/16.js +0 -1
  137. package/dist/204.js +0 -2
  138. package/dist/204.js.map +0 -1
  139. package/dist/240.js +0 -1
  140. package/dist/261.js +0 -1
  141. package/dist/271.js +0 -1
  142. package/dist/272.js +0 -1
  143. package/dist/294.js +0 -2
  144. package/dist/294.js.map +0 -1
  145. package/dist/319.js +0 -1
  146. package/dist/323.js +0 -1
  147. package/dist/336.js +0 -1
  148. package/dist/378.js +0 -1
  149. package/dist/460.js +0 -1
  150. package/dist/484.js +0 -1
  151. package/dist/484.js.map +0 -1
  152. package/dist/497.js +0 -1
  153. package/dist/524.js +0 -2
  154. package/dist/524.js.map +0 -1
  155. package/dist/566.js +0 -1
  156. package/dist/574.js +0 -1
  157. package/dist/579.js +0 -1
  158. package/dist/626.js +0 -1
  159. package/dist/626.js.map +0 -1
  160. package/dist/637.js +0 -1
  161. package/dist/637.js.map +0 -1
  162. package/dist/644.js +0 -1
  163. package/dist/652.js +0 -1
  164. package/dist/673.js +0 -1
  165. package/dist/705.js +0 -1
  166. package/dist/711.js +0 -1
  167. package/dist/727.js +0 -1
  168. package/dist/737.js +0 -1
  169. package/dist/749.js +0 -1
  170. package/dist/749.js.map +0 -1
  171. package/dist/757.js +0 -1
  172. package/dist/77.js +0 -1
  173. package/dist/77.js.map +0 -1
  174. package/dist/788.js +0 -1
  175. package/dist/803.js +0 -1
  176. package/dist/803.js.map +0 -1
  177. package/dist/807.js +0 -1
  178. package/dist/833.js +0 -1
  179. package/dist/888.js +0 -1
  180. package/dist/888.js.map +0 -1
  181. package/dist/890.js +0 -1
  182. package/dist/890.js.map +0 -1
  183. package/dist/901.js +0 -1
  184. package/dist/905.js +0 -1
  185. package/dist/905.js.map +0 -1
  186. package/dist/935.js +0 -2
  187. package/dist/935.js.map +0 -1
  188. package/dist/962.js +0 -1
  189. package/src/root.scss +0 -50
  190. package/src/setup-tests.ts +0 -1
  191. /package/dist/{935.js.LICENSE.txt → 3935.js.LICENSE.txt} +0 -0
  192. /package/dist/{294.js.LICENSE.txt → 7294.js.LICENSE.txt} +0 -0
  193. /package/src/components/{medication-card.component.test.tsx → medication-card.test.tsx} +0 -0
  194. /package/{i18next-parser.config.js → tools/i18next-parser.config.js} +0 -0
@@ -1,9 +1,20 @@
1
1
  import React, { useEffect, useState } from 'react';
2
2
  import dayjs from 'dayjs';
3
3
  import { useTranslation } from 'react-i18next';
4
- import { ComboBox, Dropdown, NumberInput, Stack, TextArea } from '@carbon/react';
5
- import { OpenmrsDatePicker, useLayoutType, useConfig, useSession, userHasAccess } from '@openmrs/esm-framework';
6
- import { getConceptCodingUuid, getMedicationReferenceOrCodeableConcept, getOpenMRSMedicineDrugName } from '../utils';
4
+ import { ComboBox, Dropdown, NumberInput, Stack, TextArea } from '@carbon/react';
5
+ import {
6
+ OpenmrsDatePicker,
7
+ useLayoutType,
8
+ useConfig,
9
+ useSession,
10
+ userHasAccess,
11
+ ResponsiveWrapper,
12
+ } from '@openmrs/esm-framework';
13
+ import {
14
+ getConceptCodingUuid,
15
+ getMedicationReferenceOrCodeableConcept,
16
+ getOpenMRSMedicineDrugName,
17
+ } from '../utils';
7
18
  import { useMedicationCodeableConcept, useMedicationFormulations } from '../medication/medication.resource';
8
19
  import { useMedicationRequest, usePrescriptionDetails } from '../medication-request/medication-request.resource';
9
20
  import {
@@ -22,12 +33,14 @@ interface MedicationDispenseReviewProps {
22
33
  medicationDispense: MedicationDispense;
23
34
  updateMedicationDispense: Function;
24
35
  quantityRemaining: number;
36
+ quantityDispensed: number;
25
37
  }
26
38
 
27
39
  const MedicationDispenseReview: React.FC<MedicationDispenseReviewProps> = ({
28
40
  medicationDispense,
29
41
  updateMedicationDispense,
30
42
  quantityRemaining,
43
+ quantityDispensed,
31
44
  }) => {
32
45
  const { t } = useTranslation();
33
46
  const config = useConfig<PharmacyConfig>();
@@ -206,97 +219,115 @@ const MedicationDispenseReview: React.FC<MedicationDispenseReviewProps> = ({
206
219
  editAction={userCanModify && allowEditing ? () => setIsEditingFormulation(true) : null}
207
220
  />
208
221
  ) : (
209
- <Dropdown
210
- id="medicationFormulation"
211
- light={isTablet}
212
- items={medicationFormulations}
213
- itemToString={(item: Medication) => getOpenMRSMedicineDrugName(item)}
214
- initialSelectedItem={{
215
- ...medicationFormulations?.find(
216
- (formulation) => formulation.id === medicationDispense.medicationReference?.reference.split('/')[1],
217
- ),
218
- }}
219
- onChange={({ selectedItem }) => {
220
- updateMedicationDispense({
221
- ...medicationDispense,
222
- medicationCodeableConcept: undefined,
223
- medicationReference: {
224
- reference: 'Medication/' + selectedItem?.id,
225
- display: getOpenMRSMedicineDrugName(selectedItem),
226
- },
227
- });
228
- setIsEditingFormulation(false);
229
- }}
230
- required
231
- />
232
- )}
233
-
234
- {isSubstitution && (
235
- <div className={styles.dispenseDetailsContainer}>
236
- <ComboBox
237
- className={styles.substitutionType}
238
- id="substitutionType"
239
- light={isTablet}
240
- items={substitutionTypes}
241
- titleText={t('substitutionType', 'Type of substitution')}
242
- itemToString={(item) => item?.text}
222
+ <ResponsiveWrapper>
223
+ <Dropdown
224
+ id="medicationFormulation"
225
+ items={medicationFormulations}
226
+ itemToString={(item: Medication) => getOpenMRSMedicineDrugName(item)}
243
227
  initialSelectedItem={{
244
- id: medicationDispense.substitution.type?.coding[0]?.code,
245
- text: medicationDispense.substitution.type?.text,
228
+ ...medicationFormulations?.find(
229
+ (formulation) => formulation.id === medicationDispense.medicationReference?.reference.split('/')[1],
230
+ ),
246
231
  }}
247
232
  onChange={({ selectedItem }) => {
248
233
  updateMedicationDispense({
249
234
  ...medicationDispense,
250
- substitution: {
251
- ...medicationDispense.substitution,
252
- type: {
253
- coding: [
254
- {
255
- code: selectedItem?.id,
256
- },
257
- ],
258
- },
235
+ medicationCodeableConcept: undefined,
236
+ medicationReference: {
237
+ reference: 'Medication/' + selectedItem?.id,
238
+ display: getOpenMRSMedicineDrugName(selectedItem),
259
239
  },
260
240
  });
241
+ setIsEditingFormulation(false);
261
242
  }}
243
+ required
262
244
  />
263
- </div>
245
+ </ResponsiveWrapper>
264
246
  )}
265
247
 
266
248
  {isSubstitution && (
267
249
  <div className={styles.dispenseDetailsContainer}>
268
- <ComboBox
269
- className={styles.substitutionReason}
270
- id="substitutionReason"
271
- light={isTablet}
272
- items={substitutionReasons}
273
- titleText={t('substitutionReason', 'Reason for substitution')}
274
- itemToString={(item) => item?.text}
275
- initialSelectedItem={{
276
- id: medicationDispense.substitution.reason[0]?.coding[0]?.code,
277
- text: medicationDispense.substitution.reason[0]?.text,
278
- }}
279
- onChange={({ selectedItem }) => {
280
- updateMedicationDispense({
281
- ...medicationDispense,
282
- substitution: {
283
- ...medicationDispense.substitution,
284
- reason: [
285
- {
250
+ <ResponsiveWrapper>
251
+ <ComboBox
252
+ className={styles.substitutionType}
253
+ id="substitutionType"
254
+ items={substitutionTypes}
255
+ titleText={t('substitutionType', 'Type of substitution')}
256
+ itemToString={(item) => item?.text}
257
+ initialSelectedItem={{
258
+ id: medicationDispense.substitution.type?.coding[0]?.code,
259
+ text: medicationDispense.substitution.type?.text,
260
+ }}
261
+ onChange={({ selectedItem }) => {
262
+ updateMedicationDispense({
263
+ ...medicationDispense,
264
+ substitution: {
265
+ ...medicationDispense.substitution,
266
+ type: {
286
267
  coding: [
287
268
  {
288
269
  code: selectedItem?.id,
289
270
  },
290
271
  ],
291
272
  },
292
- ],
293
- },
294
- });
295
- }}
296
- />
273
+ },
274
+ });
275
+ }}
276
+ />
277
+ </ResponsiveWrapper>
297
278
  </div>
298
279
  )}
299
280
 
281
+ {isSubstitution && (
282
+ <div className={styles.dispenseDetailsContainer}>
283
+ <ResponsiveWrapper>
284
+ <ComboBox
285
+ className={styles.substitutionReason}
286
+ id="substitutionReason"
287
+ items={substitutionReasons}
288
+ titleText={t('substitutionReason', 'Reason for substitution')}
289
+ itemToString={(item) => item?.text}
290
+ initialSelectedItem={{
291
+ id: medicationDispense.substitution.reason[0]?.coding[0]?.code,
292
+ text: medicationDispense.substitution.reason[0]?.text,
293
+ }}
294
+ onChange={({ selectedItem }) => {
295
+ updateMedicationDispense({
296
+ ...medicationDispense,
297
+ substitution: {
298
+ ...medicationDispense.substitution,
299
+ reason: [
300
+ {
301
+ coding: [
302
+ {
303
+ code: selectedItem?.id,
304
+ },
305
+ ],
306
+ },
307
+ ],
308
+ },
309
+ });
310
+ }}
311
+ />
312
+ </ResponsiveWrapper>
313
+ </div>
314
+ )}
315
+ <ResponsiveWrapper>
316
+ <div>
317
+ <p className={styles.quantitySummary}>
318
+ {t('quantityPrescribed', 'Quantity Prescribed')}:{medicationDispense.quantity.value}
319
+ </p>
320
+ <p className={styles.quantitySummary}>
321
+ {t('quantityDispensed', 'Quantity Dispensed')}: {quantityDispensed}
322
+ </p>
323
+ {config.dispenseBehavior.restrictTotalQuantityDispensed ? (
324
+ <p className={styles.quantitySummary}>
325
+ {t('quantityRemaining', 'Quantity Remaining to Dispense')}:{quantityRemaining}
326
+ </p>
327
+ ) : null}
328
+ </div>
329
+ </ResponsiveWrapper>
330
+
300
331
  <div className={styles.dispenseDetailsContainer}>
301
332
  <NumberInput
302
333
  allowEmpty={false}
@@ -305,14 +336,10 @@ const MedicationDispenseReview: React.FC<MedicationDispenseReviewProps> = ({
305
336
  id="quantity"
306
337
  invalidText={t('numberIsNotValid', 'Number is not valid')}
307
338
  label={
308
- t('quantity', 'Quantity') +
309
- (config.dispenseBehavior.restrictTotalQuantityDispensed
310
- ? ' (' + t('maxQuantityRemaining', 'Maximum quantity remaining:') + ' ' + quantityRemaining + ')'
311
- : '')
339
+ <div style={{ display: 'flex', alignItems: 'center', gap: '0.5rem' }}>{t('quantity', 'Quantity')}</div>
312
340
  }
313
341
  min={0}
314
342
  max={config.dispenseBehavior.restrictTotalQuantityDispensed ? quantityRemaining : undefined}
315
- value={medicationDispense.quantity.value}
316
343
  onChange={(e) => {
317
344
  updateMedicationDispense({
318
345
  ...medicationDispense,
@@ -323,30 +350,30 @@ const MedicationDispenseReview: React.FC<MedicationDispenseReviewProps> = ({
323
350
  });
324
351
  }}
325
352
  />
326
-
327
- <ComboBox
328
- id="quantityUnits"
329
- disabled={!userCanModify || !allowEditing}
330
- light={isTablet}
331
- items={drugDispensingUnits}
332
- titleText={t('drugDispensingUnit', 'Dispensing unit')}
333
- itemToString={(item) => item?.text}
334
- initialSelectedItem={{
335
- id: medicationDispense.quantity.code,
336
- text: medicationDispense.quantity.unit,
337
- }}
338
- onChange={({ selectedItem }) => {
339
- updateMedicationDispense({
340
- ...medicationDispense,
341
- // note that we specifically recreate doesQuantity to overwrite any unit or system properties that may have been set
342
- quantity: {
343
- value: medicationDispense.quantity.value,
344
- code: selectedItem?.id,
345
- },
346
- });
347
- }}
348
- required
349
- />
353
+ <ResponsiveWrapper>
354
+ <ComboBox
355
+ id="quantityUnits"
356
+ disabled={!userCanModify || !allowEditing}
357
+ items={drugDispensingUnits}
358
+ titleText={t('drugDispensingUnit', 'Dispensing unit')}
359
+ itemToString={(item) => item?.text}
360
+ initialSelectedItem={{
361
+ id: medicationDispense.quantity.code,
362
+ text: medicationDispense.quantity.unit,
363
+ }}
364
+ onChange={({ selectedItem }) => {
365
+ updateMedicationDispense({
366
+ ...medicationDispense,
367
+ // note that we specifically recreate doesQuantity to overwrite any unit or system properties that may have been set
368
+ quantity: {
369
+ value: medicationDispense.quantity.value,
370
+ code: selectedItem?.id,
371
+ },
372
+ });
373
+ }}
374
+ required
375
+ />
376
+ </ResponsiveWrapper>
350
377
  </div>
351
378
 
352
379
  <div className={styles.dispenseDetailsContainer}>
@@ -380,49 +407,83 @@ const MedicationDispenseReview: React.FC<MedicationDispenseReviewProps> = ({
380
407
  }}
381
408
  />
382
409
 
383
- <ComboBox
384
- id="dosingUnits"
385
- disabled={!userCanModify || !allowEditing}
386
- light={isTablet}
387
- items={drugDosingUnits}
388
- titleText={t('doseUnit', 'Dose unit')}
389
- itemToString={(item) => item?.text}
390
- initialSelectedItem={{
391
- id: medicationDispense.dosageInstruction[0].doseAndRate[0].doseQuantity?.code,
392
- text: medicationDispense.dosageInstruction[0].doseAndRate[0].doseQuantity?.unit,
393
- }}
394
- onChange={({ selectedItem }) => {
395
- updateMedicationDispense({
396
- ...medicationDispense,
397
- dosageInstruction: [
398
- {
399
- ...medicationDispense.dosageInstruction[0],
400
- doseAndRate: [
401
- {
402
- doseQuantity: {
403
- // note that we specifically recreate doesQuantity to overwrite any unit or system properties that may have been set
404
- value: medicationDispense.dosageInstruction[0].doseAndRate[0].doseQuantity?.value,
405
- code: selectedItem?.id,
410
+ <ResponsiveWrapper>
411
+ <ComboBox
412
+ id="dosingUnits"
413
+ disabled={!userCanModify || !allowEditing}
414
+ items={drugDosingUnits}
415
+ titleText={t('doseUnit', 'Dose unit')}
416
+ itemToString={(item) => item?.text}
417
+ initialSelectedItem={{
418
+ id: medicationDispense.dosageInstruction[0].doseAndRate[0].doseQuantity?.code,
419
+ text: medicationDispense.dosageInstruction[0].doseAndRate[0].doseQuantity?.unit,
420
+ }}
421
+ onChange={({ selectedItem }) => {
422
+ updateMedicationDispense({
423
+ ...medicationDispense,
424
+ dosageInstruction: [
425
+ {
426
+ ...medicationDispense.dosageInstruction[0],
427
+ doseAndRate: [
428
+ {
429
+ doseQuantity: {
430
+ // note that we specifically recreate doesQuantity to overwrite any unit or system properties that may have been set
431
+ value: medicationDispense.dosageInstruction[0].doseAndRate[0].doseQuantity?.value,
432
+ code: selectedItem?.id,
433
+ },
406
434
  },
435
+ ],
436
+ },
437
+ ],
438
+ });
439
+ }}
440
+ required
441
+ />
442
+ </ResponsiveWrapper>
443
+
444
+ <ResponsiveWrapper>
445
+ <ComboBox
446
+ id="editRoute"
447
+ disabled={!userCanModify || !allowEditing}
448
+ items={drugRoutes}
449
+ initialSelectedItem={{
450
+ id: medicationDispense.dosageInstruction[0].route?.coding[0]?.code,
451
+ text: medicationDispense.dosageInstruction[0].route?.text,
452
+ }}
453
+ titleText={t('route', 'Route')}
454
+ itemToString={(item) => item?.text}
455
+ onChange={({ selectedItem }) => {
456
+ updateMedicationDispense({
457
+ ...medicationDispense,
458
+ dosageInstruction: [
459
+ {
460
+ ...medicationDispense.dosageInstruction[0],
461
+ route: {
462
+ coding: [
463
+ {
464
+ code: selectedItem?.id,
465
+ },
466
+ ],
407
467
  },
408
- ],
409
- },
410
- ],
411
- });
412
- }}
413
- required
414
- />
468
+ },
469
+ ],
470
+ });
471
+ }}
472
+ required
473
+ />
474
+ </ResponsiveWrapper>
475
+ </div>
415
476
 
477
+ <ResponsiveWrapper>
416
478
  <ComboBox
417
- id="editRoute"
479
+ id="frequency"
418
480
  disabled={!userCanModify || !allowEditing}
419
- light={isTablet}
420
- items={drugRoutes}
481
+ items={orderFrequencies}
421
482
  initialSelectedItem={{
422
- id: medicationDispense.dosageInstruction[0].route?.coding[0]?.code,
423
- text: medicationDispense.dosageInstruction[0].route?.text,
483
+ id: medicationDispense.dosageInstruction[0].timing?.code?.coding[0]?.code,
484
+ text: medicationDispense.dosageInstruction[0].timing?.code?.text,
424
485
  }}
425
- titleText={t('route', 'Route')}
486
+ titleText={t('frequency', 'Frequency')}
426
487
  itemToString={(item) => item?.text}
427
488
  onChange={({ selectedItem }) => {
428
489
  updateMedicationDispense({
@@ -430,12 +491,15 @@ const MedicationDispenseReview: React.FC<MedicationDispenseReviewProps> = ({
430
491
  dosageInstruction: [
431
492
  {
432
493
  ...medicationDispense.dosageInstruction[0],
433
- route: {
434
- coding: [
435
- {
436
- code: selectedItem?.id,
437
- },
438
- ],
494
+ timing: {
495
+ ...medicationDispense.dosageInstruction[0].timing,
496
+ code: {
497
+ coding: [
498
+ {
499
+ code: selectedItem?.id,
500
+ },
501
+ ],
502
+ },
439
503
  },
440
504
  },
441
505
  ],
@@ -443,41 +507,7 @@ const MedicationDispenseReview: React.FC<MedicationDispenseReviewProps> = ({
443
507
  }}
444
508
  required
445
509
  />
446
- </div>
447
-
448
- <ComboBox
449
- id="frequency"
450
- disabled={!userCanModify || !allowEditing}
451
- light={isTablet}
452
- items={orderFrequencies}
453
- initialSelectedItem={{
454
- id: medicationDispense.dosageInstruction[0].timing?.code?.coding[0]?.code,
455
- text: medicationDispense.dosageInstruction[0].timing?.code?.text,
456
- }}
457
- titleText={t('frequency', 'Frequency')}
458
- itemToString={(item) => item?.text}
459
- onChange={({ selectedItem }) => {
460
- updateMedicationDispense({
461
- ...medicationDispense,
462
- dosageInstruction: [
463
- {
464
- ...medicationDispense.dosageInstruction[0],
465
- timing: {
466
- ...medicationDispense.dosageInstruction[0].timing,
467
- code: {
468
- coding: [
469
- {
470
- code: selectedItem?.id,
471
- },
472
- ],
473
- },
474
- },
475
- },
476
- ],
477
- });
478
- }}
479
- required
480
- />
510
+ </ResponsiveWrapper>
481
511
 
482
512
  <TextArea
483
513
  labelText={t('patientInstructions', 'Patient instructions')}
@@ -514,33 +544,34 @@ const MedicationDispenseReview: React.FC<MedicationDispenseReviewProps> = ({
514
544
  value={dayjs(medicationDispense.whenHandedOver).toDate()}></OpenmrsDatePicker>
515
545
 
516
546
  {providers && (
517
- <ComboBox
518
- id="dispenser"
519
- light={isTablet}
520
- initialSelectedItem={
521
- medicationDispense?.performer[0].actor.reference
522
- ? providers.find(
523
- (provider) => provider.uuid === medicationDispense?.performer[0].actor.reference.split('/')[1],
524
- )
525
- : null
526
- }
527
- onChange={({ selectedItem }) => {
528
- updateMedicationDispense({
529
- ...medicationDispense,
530
- performer: [
531
- {
532
- actor: {
533
- reference: `Practitioner/${selectedItem?.uuid}`,
547
+ <ResponsiveWrapper>
548
+ <ComboBox
549
+ id="dispenser"
550
+ initialSelectedItem={
551
+ medicationDispense?.performer[0].actor.reference
552
+ ? providers.find(
553
+ (provider) => provider.uuid === medicationDispense?.performer[0].actor.reference.split('/')[1],
554
+ )
555
+ : null
556
+ }
557
+ onChange={({ selectedItem }) => {
558
+ updateMedicationDispense({
559
+ ...medicationDispense,
560
+ performer: [
561
+ {
562
+ actor: {
563
+ reference: `Practitioner/${selectedItem?.uuid}`,
564
+ },
534
565
  },
535
- },
536
- ],
537
- });
538
- }}
539
- items={providers}
540
- itemToString={(item) => item?.person?.display}
541
- required
542
- titleText={t('dispensedBy', 'Dispensed by')}
543
- />
566
+ ],
567
+ });
568
+ }}
569
+ items={providers}
570
+ itemToString={(item) => item?.person?.display}
571
+ required
572
+ titleText={t('dispensedBy', 'Dispensed by')}
573
+ />
574
+ </ResponsiveWrapper>
544
575
  )}
545
576
  </Stack>
546
577
  </div>
@@ -1,8 +1,8 @@
1
1
  import React from 'react';
2
2
  import { render } from '@testing-library/react';
3
+ import { useConfig } from '@openmrs/esm-framework';
3
4
  import { type MedicationDispense, MedicationDispenseStatus } from '../types';
4
5
  import MedicationDispenseReview from './medication-dispense-review.component';
5
- import { useConfig } from '@openmrs/esm-framework';
6
6
 
7
7
  const mockUseConfig = jest.mocked(useConfig);
8
8
 
@@ -132,6 +132,7 @@ describe('Medication Dispense Review Component tests', () => {
132
132
  medicationDispense={medicationDispense}
133
133
  updateMedicationDispense={mockUpdate}
134
134
  quantityRemaining={30}
135
+ quantityDispensed={30}
135
136
  />,
136
137
  );
137
138
 
@@ -5,6 +5,7 @@ import {
5
5
  type DefaultWorkspaceProps,
6
6
  ExtensionSlot,
7
7
  getCoreTranslation,
8
+ ResponsiveWrapper,
8
9
  showSnackbar,
9
10
  useConfig,
10
11
  useLayoutType,
@@ -152,29 +153,30 @@ const PauseDispenseForm: React.FC<PauseDispenseFormProps> = ({
152
153
  )}
153
154
  {patient && <ExtensionSlot name="patient-header-slot" state={bannerState} />}
154
155
  <section className={styles.formGroup}>
155
- <ComboBox
156
- id="reasonForPause"
157
- light={isTablet}
158
- items={reasonsForPause}
159
- titleText={t('reasonForPause', 'Reason for pause')}
160
- itemToString={(item) => item?.text}
161
- initialSelectedItem={{
162
- id: medicationDispense.statusReasonCodeableConcept?.coding[0]?.code,
163
- text: medicationDispense.statusReasonCodeableConcept?.text,
164
- }}
165
- onChange={({ selectedItem }) => {
166
- setMedicationDispensePayload({
167
- ...medicationDispensePayload,
168
- statusReasonCodeableConcept: {
169
- coding: [
170
- {
171
- code: selectedItem?.id,
172
- },
173
- ],
174
- },
175
- });
176
- }}
177
- />
156
+ <ResponsiveWrapper>
157
+ <ComboBox
158
+ id="reasonForPause"
159
+ items={reasonsForPause}
160
+ titleText={t('reasonForPause', 'Reason for pause')}
161
+ itemToString={(item) => item?.text}
162
+ initialSelectedItem={{
163
+ id: medicationDispense.statusReasonCodeableConcept?.coding[0]?.code,
164
+ text: medicationDispense.statusReasonCodeableConcept?.text,
165
+ }}
166
+ onChange={({ selectedItem }) => {
167
+ setMedicationDispensePayload({
168
+ ...medicationDispensePayload,
169
+ statusReasonCodeableConcept: {
170
+ coding: [
171
+ {
172
+ code: selectedItem?.id,
173
+ },
174
+ ],
175
+ },
176
+ });
177
+ }}
178
+ />
179
+ </ResponsiveWrapper>
178
180
  </section>
179
181
  </div>
180
182
  <section className={styles.buttonGroup}>
@@ -1,9 +1,10 @@
1
1
  import React from 'react';
2
+ import { useTranslation } from 'react-i18next';
2
3
  import { ComboBox, InlineLoading, InlineNotification, Layer } from '@carbon/react';
4
+ import { formatDate, useConfig } from '@openmrs/esm-framework';
3
5
  import { type MedicationDispense, type InventoryItem } from '../../types';
6
+ import { type PharmacyConfig } from '../../config-schema';
4
7
  import { useDispenseStock } from './stock.resource';
5
- import { formatDate } from '@openmrs/esm-framework';
6
- import { useTranslation } from 'react-i18next';
7
8
 
8
9
  type StockDispenseProps = {
9
10
  medicationDispense: MedicationDispense;
@@ -13,17 +14,13 @@ type StockDispenseProps = {
13
14
 
14
15
  const StockDispense: React.FC<StockDispenseProps> = ({ medicationDispense, updateInventoryItem }) => {
15
16
  const { t } = useTranslation();
17
+ const config = useConfig<PharmacyConfig>();
18
+
16
19
  const drugUuid = medicationDispense?.medicationReference?.reference?.split('/')[1];
17
20
  const { inventoryItems, error, isLoading } = useDispenseStock(drugUuid);
18
- const validInventoryItems = inventoryItems.filter((item) => isValidBatch(medicationDispense, item));
19
- const validInventoryItemss = inventoryItems
21
+ const validInventoryItems = inventoryItems
20
22
  .filter((item) => isValidBatch(medicationDispense, item))
21
- .sort((a, b) => {
22
- const dateA = new Date(a.expiration);
23
- const dateB = new Date(b.expiration);
24
-
25
- return dateA.getDate() - dateB.getDate();
26
- });
23
+ .sort((a, b) => new Date(a.expiration).getTime() - new Date(b.expiration).getTime());
27
24
 
28
25
  function parseDate(dateString) {
29
26
  return new Date(dateString);
@@ -31,6 +28,9 @@ const StockDispense: React.FC<StockDispenseProps> = ({ medicationDispense, updat
31
28
 
32
29
  //check whether the drug will expire before the medication period ends
33
30
  function isValidBatch(medicationToDispense, inventoryItem) {
31
+ if (typeof config !== 'undefined' && !config.validateBatch) {
32
+ return true;
33
+ }
34
34
  if (medicationToDispense?.dosageInstruction && medicationToDispense?.dosageInstruction.length > 0) {
35
35
  return medicationToDispense.dosageInstruction.some((instruction) => {
36
36
  if (