@openmrs/esm-stock-management-app 1.0.1-pre.783 → 1.0.1-pre.788

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 (128) hide show
  1. package/__mocks__/index.ts +1 -0
  2. package/__mocks__/operation-type.mock.ts +532 -0
  3. package/dist/155.js +1 -0
  4. package/dist/155.js.map +1 -0
  5. package/dist/172.js +1 -1
  6. package/dist/20.js +1 -1
  7. package/dist/290.js +1 -1
  8. package/dist/493.js +2 -0
  9. package/dist/493.js.map +1 -0
  10. package/dist/606.js +1 -1
  11. package/dist/627.js +1 -1
  12. package/dist/922.js +1 -0
  13. package/dist/922.js.map +1 -0
  14. package/dist/main.js +1 -1
  15. package/dist/main.js.map +1 -1
  16. package/dist/openmrs-esm-stock-management-app.js +1 -1
  17. package/dist/openmrs-esm-stock-management-app.js.buildmanifest.json +75 -51
  18. package/dist/openmrs-esm-stock-management-app.js.map +1 -1
  19. package/dist/routes.json +1 -1
  20. package/package.json +1 -1
  21. package/src/config-schema.ts +6 -0
  22. package/src/core/utils/utils.ts +29 -0
  23. package/src/index.ts +4 -0
  24. package/src/routes.json +9 -0
  25. package/src/stock-items/add-stock-item/transactions/printout/transactions-stockcard-printout.component.tsx +8 -12
  26. package/src/stock-items/add-stock-item/transactions/transactions.component.tsx +8 -12
  27. package/src/stock-items/stock-items.resource.ts +5 -5
  28. package/src/stock-lookups/stock-lookups.resource.ts +2 -2
  29. package/src/stock-operations/add-stock-operation/stock-operations-expanded-row/stock-items-table.scss +34 -0
  30. package/src/stock-operations/add-stock-operation/stock-operations-expanded-row/stock-items-table.tsx +111 -0
  31. package/src/stock-operations/add-stock-operation/stock-operations-expanded-row/stock-operation-expanded-row.component.tsx +87 -0
  32. package/src/stock-operations/add-stock-operation/stock-operations-expanded-row/stock-operation-expanded-row.scss +31 -0
  33. package/src/stock-operations/add-stock-operation/stock-operations-expanded-row/stock-operations-status.tsx +45 -0
  34. package/src/stock-operations/edit-stock-operation/edit-stock-operation-action-menu.component.tsx +41 -16
  35. package/src/stock-operations/stock-operation-reference.component.tsx +64 -0
  36. package/src/stock-operations/stock-operation-status/stock-operation-status-row.tsx +77 -0
  37. package/src/stock-operations/stock-operation-status/stock-operation-status.scss +32 -0
  38. package/src/stock-operations/stock-operation-status/stock-operation-status.tsx +45 -0
  39. package/src/stock-operations/stock-operation-types-selector/stock-operation-types-selector.component.tsx +30 -29
  40. package/src/stock-operations/stock-operation.utils.tsx +16 -79
  41. package/src/stock-operations/stock-operations-dialog/stock-operations-issue-stock-button.component.tsx +27 -39
  42. package/src/stock-operations/stock-operations-dialog/stock-operations-print-button.component.tsx +51 -59
  43. package/src/stock-operations/{stock-item-selector/stock-item-selector.resource.tsx → stock-operations-forms/hooks/useFilterableStockItems.ts} +4 -4
  44. package/src/stock-operations/stock-operations-forms/hooks/useFilteredOperationTypesByRoles.ts +30 -0
  45. package/src/stock-operations/stock-operations-forms/hooks/useOperationTypePermisions.ts +29 -0
  46. package/src/stock-operations/stock-operations-forms/hooks/useParties.ts +73 -0
  47. package/src/stock-operations/{users-selector/users-selector.resource.tsx → stock-operations-forms/hooks/useSearchUser.ts} +9 -7
  48. package/src/stock-operations/{batch-no-selector/batch-no-selector.resource.tsx → stock-operations-forms/hooks/useStockItemBatchNumbers.ts} +3 -3
  49. package/src/stock-operations/stock-operations-forms/hooks/useStockOperationLinks.ts +20 -0
  50. package/src/stock-operations/stock-operations-forms/input-components/batch-no-selector.component.tsx +72 -0
  51. package/src/stock-operations/stock-operations-forms/input-components/batch-no-selector.test.tsx +90 -0
  52. package/src/stock-operations/{add-stock-operation/stock-item-search/stock-item-search.scss → stock-operations-forms/input-components/input-components-styles.scss} +2 -2
  53. package/src/stock-operations/stock-operations-forms/input-components/qty-uim-selector.test.tsx +157 -0
  54. package/src/stock-operations/stock-operations-forms/input-components/quantity-uom-selector.component.tsx +53 -0
  55. package/src/stock-operations/stock-operations-forms/input-components/stock-item-search.component.tsx +79 -0
  56. package/src/stock-operations/stock-operations-forms/input-components/stock-operation-reason-selector.component.tsx +59 -0
  57. package/src/stock-operations/stock-operations-forms/input-components/stock-operation-reason-selector.test.tsx +216 -0
  58. package/src/stock-operations/{batch-no-selector → stock-operations-forms/input-components}/unique-batch-no-entry-input.component.tsx +12 -7
  59. package/src/stock-operations/stock-operations-forms/input-components/user-selector.test.tsx +110 -0
  60. package/src/stock-operations/stock-operations-forms/input-components/users-selector.component.tsx +111 -0
  61. package/src/stock-operations/stock-operations-forms/step1.test.tsx +303 -0
  62. package/src/stock-operations/stock-operations-forms/step2.test.tsx +254 -0
  63. package/src/stock-operations/stock-operations-forms/step3.test.tsx +223 -0
  64. package/src/stock-operations/stock-operations-forms/steps/base-operation-details-form-step.tsx +241 -0
  65. package/src/stock-operations/stock-operations-forms/steps/quantity-uom-cell.component.tsx +33 -0
  66. package/src/stock-operations/stock-operations-forms/steps/received-items.component.tsx +110 -0
  67. package/src/stock-operations/stock-operations-forms/steps/stock-availability-cell.component.tsx +51 -0
  68. package/src/stock-operations/stock-operations-forms/steps/stock-operation-item-batch-no-cell.component.tsx +40 -0
  69. package/src/stock-operations/stock-operations-forms/steps/stock-operation-item-cell.component.tsx +50 -0
  70. package/src/stock-operations/stock-operations-forms/steps/stock-operation-item-expiry-cell.component.tsx +41 -0
  71. package/src/stock-operations/stock-operations-forms/steps/stock-operation-items-form-step.component.tsx +281 -0
  72. package/src/stock-operations/stock-operations-forms/steps/stock-operation-items-form-step.scc.scss +64 -0
  73. package/src/stock-operations/stock-operations-forms/steps/stock-operation-submission-form-step.component.tsx +243 -0
  74. package/src/stock-operations/stock-operations-forms/stock-issue-form-initializer-with-related-requisition-operation.component.tsx +55 -0
  75. package/src/stock-operations/stock-operations-forms/stock-item-form/stock-item-form.scss +41 -0
  76. package/src/stock-operations/stock-operations-forms/stock-item-form/stock-item-form.workspace.tsx +211 -0
  77. package/src/stock-operations/stock-operations-forms/stock-operation-form-header.component.tsx +166 -0
  78. package/src/stock-operations/stock-operations-forms/stock-operation-form.component.tsx +205 -0
  79. package/src/stock-operations/stock-operations-forms/stock-operation-form.scss +111 -0
  80. package/src/stock-operations/stock-operations-forms/stock-operation-related-link.component.tsx +45 -0
  81. package/src/stock-operations/stock-operations-forms/stock-operation-stepper/stepper.scss +41 -0
  82. package/src/stock-operations/stock-operations-forms/stock-operation-stepper/stock-operation-stepper.component.tsx +52 -0
  83. package/src/stock-operations/stock-operations-forms/stock-operations-form-utils.ts +32 -0
  84. package/src/stock-operations/stock-operations-table.component.tsx +57 -92
  85. package/src/stock-operations/stock-operations.resource.ts +16 -13
  86. package/src/stock-operations/validation-schema.ts +72 -14
  87. package/dist/766.js +0 -2
  88. package/dist/766.js.map +0 -1
  89. package/dist/822.js +0 -1
  90. package/dist/822.js.map +0 -1
  91. package/src/stock-operations/add-stock-operation/add-stock-operation.component.tsx +0 -349
  92. package/src/stock-operations/add-stock-operation/add-stock-operation.resource.tsx +0 -27
  93. package/src/stock-operations/add-stock-operation/add-stock-operation.scss +0 -60
  94. package/src/stock-operations/add-stock-operation/add-stock-operation.test.tsx +0 -192
  95. package/src/stock-operations/add-stock-operation/add-stock-operation.utils.tsx +0 -152
  96. package/src/stock-operations/add-stock-operation/add-stock-utils.ts +0 -103
  97. package/src/stock-operations/add-stock-operation/base-operation-details.component.tsx +0 -439
  98. package/src/stock-operations/add-stock-operation/base-operation-details.scss +0 -30
  99. package/src/stock-operations/add-stock-operation/received-items.component.tsx +0 -93
  100. package/src/stock-operations/add-stock-operation/stock-item-search/stock-item-search.component.tsx +0 -70
  101. package/src/stock-operations/add-stock-operation/stock-items-addition-row.component.tsx +0 -357
  102. package/src/stock-operations/add-stock-operation/stock-items-addition-row.resource.tsx +0 -0
  103. package/src/stock-operations/add-stock-operation/stock-items-addition-row.scss +0 -12
  104. package/src/stock-operations/add-stock-operation/stock-items-addition-row.test.tsx +0 -10
  105. package/src/stock-operations/add-stock-operation/stock-items-addition.component.scss +0 -17
  106. package/src/stock-operations/add-stock-operation/stock-items-addition.component.tsx +0 -254
  107. package/src/stock-operations/add-stock-operation/stock-operation-context/useStockOperationContext.tsx +0 -16
  108. package/src/stock-operations/add-stock-operation/stock-operation-reference.component.tsx +0 -39
  109. package/src/stock-operations/add-stock-operation/stock-operation-related-link.component.tsx +0 -38
  110. package/src/stock-operations/add-stock-operation/stock-operation-status.component.tsx +0 -170
  111. package/src/stock-operations/add-stock-operation/stock-operation-submission.component.tsx +0 -189
  112. package/src/stock-operations/add-stock-operation/stock-operation-submission.test.tsx +0 -138
  113. package/src/stock-operations/add-stock-operation/types.ts +0 -55
  114. package/src/stock-operations/add-stock-operation/validationSchema.ts +0 -54
  115. package/src/stock-operations/batch-no-selector/batch-no-selector.component.tsx +0 -114
  116. package/src/stock-operations/batch-no-selector/batch-no-selector.scss +0 -0
  117. package/src/stock-operations/batch-no-selector/batch-no-selector.test.tsx +0 -101
  118. package/src/stock-operations/party-selector/party-selector.component.tsx +0 -59
  119. package/src/stock-operations/qty-uom-selector/qty-uom-selector.component.tsx +0 -65
  120. package/src/stock-operations/qty-uom-selector/qty-uom-selector.resource.tsx +0 -0
  121. package/src/stock-operations/qty-uom-selector/qty-uom-selector.scss +0 -0
  122. package/src/stock-operations/qty-uom-selector/qty-uom-selector.test.tsx +0 -10
  123. package/src/stock-operations/stock-item-selector/stock-item-selector.component.tsx +0 -69
  124. package/src/stock-operations/stock-item-selector/stock-item-selector.scss +0 -0
  125. package/src/stock-operations/stock-item-selector/stock-item-selector.test.tsx +0 -10
  126. package/src/stock-operations/stock-operation-reason-selector/stock-operation-reason-selector.component.tsx +0 -62
  127. package/src/stock-operations/users-selector/users-selector.component.tsx +0 -75
  128. /package/dist/{766.js.LICENSE.txt → 493.js.LICENSE.txt} +0 -0
@@ -0,0 +1,40 @@
1
+ import { InlineLoading } from '@carbon/react';
2
+ import React, { useMemo } from 'react';
3
+ import { useTranslation } from 'react-i18next';
4
+ import { StockOperationType } from '../../../core/api/types/stockOperation/StockOperationType';
5
+ import useOperationTypePermisions from '../hooks/useOperationTypePermisions';
6
+ import { useStockItemBatchNumbers } from '../hooks/useStockItemBatchNumbers';
7
+
8
+ type StockOperationitemBatchNoCellProps = {
9
+ operation: StockOperationType;
10
+ stockBatchUuid?: string;
11
+ batchNo?: string;
12
+ stockItemUuid: string;
13
+ };
14
+
15
+ const StockOperationItemBatchNoCell: React.FC<StockOperationitemBatchNoCellProps> = ({
16
+ operation,
17
+ batchNo,
18
+ stockBatchUuid,
19
+ stockItemUuid,
20
+ }) => {
21
+ const operationTypePermision = useOperationTypePermisions(operation);
22
+ const { isLoading, stockItemBatchNos } = useStockItemBatchNumbers(stockItemUuid);
23
+ const { t } = useTranslation();
24
+ const _batchno = useMemo(
25
+ () => stockItemBatchNos?.find((item) => item.uuid === stockBatchUuid)?.batchNo,
26
+ [stockItemBatchNos, stockBatchUuid],
27
+ );
28
+
29
+ if (isLoading) <InlineLoading description={t('loading', 'Loading')} iconDescription={t('loading', 'Loading')} />;
30
+
31
+ if (operationTypePermision.requiresBatchUuid && !operationTypePermision.requiresActualBatchInfo)
32
+ return <p>{_batchno ?? '--'}</p>;
33
+
34
+ if (operationTypePermision.requiresActualBatchInfo || operationTypePermision.requiresBatchUuid)
35
+ return <p>{batchNo ?? '--'}</p>;
36
+
37
+ return <p>--</p>;
38
+ };
39
+
40
+ export default StockOperationItemBatchNoCell;
@@ -0,0 +1,50 @@
1
+ import React, { useCallback, useEffect, useMemo } from 'react';
2
+ import { useStockItem } from '../../../stock-items/stock-items.resource';
3
+ import { useTranslation } from 'react-i18next';
4
+ import { showSnackbar, useConfig } from '@openmrs/esm-framework';
5
+ import { InlineLoading } from '@carbon/react';
6
+ import { StockItemDTO } from '../../../core/api/types/stockItem/StockItem';
7
+ import { URL_STOCK_ITEM } from '../../../constants';
8
+ import { Link } from 'react-router-dom';
9
+ import { ConfigObject } from '../../../config-schema';
10
+
11
+ type StockOperationItemCellProps = {
12
+ stockItemUuid: string;
13
+ };
14
+
15
+ const StockOperationItemCell: React.FC<StockOperationItemCellProps> = ({ stockItemUuid }) => {
16
+ const { isLoading, error, item } = useStockItem(stockItemUuid);
17
+ const { t } = useTranslation();
18
+ const { useItemCommonNameAsDisplay } = useConfig<ConfigObject>();
19
+ const commonName = useMemo(() => {
20
+ if (!useItemCommonNameAsDisplay) return;
21
+ const drugName = item?.drugName ? `(Drug name: ${item.drugName})` : undefined;
22
+ return `${item?.commonName || t('noCommonNameAvailable', 'No common name available') + (drugName ?? '')}`;
23
+ }, [item, useItemCommonNameAsDisplay, t]);
24
+
25
+ const drugName = useMemo(() => {
26
+ if (useItemCommonNameAsDisplay) return;
27
+ const commonName = item?.commonName ? `(Common name: ${item.commonName})` : undefined;
28
+ return `${item?.drugName || t('noDrugNameAvailable', 'No drug name available') + (commonName ?? '')}`;
29
+ }, [item, useItemCommonNameAsDisplay, t]);
30
+ useEffect(() => {
31
+ if (error) {
32
+ showSnackbar({
33
+ kind: 'error',
34
+ title: t('stockItemError', 'Error loading stock item'),
35
+ subtitle: error?.message,
36
+ });
37
+ }
38
+ }, [error, t]);
39
+
40
+ if (isLoading) return <InlineLoading status="active" iconDescription="Loading" />;
41
+ if (error) return <>--</>;
42
+
43
+ return (
44
+ <Link target={'_blank'} to={URL_STOCK_ITEM(stockItemUuid)}>
45
+ {useItemCommonNameAsDisplay ? commonName : drugName}
46
+ </Link>
47
+ );
48
+ };
49
+
50
+ export default StockOperationItemCell;
@@ -0,0 +1,41 @@
1
+ import { InlineLoading } from '@carbon/react';
2
+ import React, { useMemo } from 'react';
3
+ import { useTranslation } from 'react-i18next';
4
+ import { formatForDatePicker } from '../../../constants';
5
+ import { StockOperationType } from '../../../core/api/types/stockOperation/StockOperationType';
6
+ import useOperationTypePermisions from '../hooks/useOperationTypePermisions';
7
+ import { useStockItemBatchNumbers } from '../hooks/useStockItemBatchNumbers';
8
+
9
+ type StockoperationItemExpiryCellProps = {
10
+ operation: StockOperationType;
11
+ stockBatchUuid?: string;
12
+ expiration?: Date;
13
+ stockItemUuid: string;
14
+ };
15
+
16
+ const StockoperationItemExpiryCell: React.FC<StockoperationItemExpiryCellProps> = ({
17
+ operation,
18
+ stockItemUuid,
19
+ expiration,
20
+ stockBatchUuid,
21
+ }) => {
22
+ const operationTypePermision = useOperationTypePermisions(operation);
23
+ const { isLoading, stockItemBatchNos } = useStockItemBatchNumbers(stockItemUuid);
24
+ const { t } = useTranslation();
25
+ const _expiration = useMemo(
26
+ () => stockItemBatchNos?.find((item) => item.uuid === stockBatchUuid)?.expiration,
27
+ [stockItemBatchNos, stockBatchUuid],
28
+ );
29
+
30
+ if (isLoading) <InlineLoading description={t('loading', 'Loading')} iconDescription={t('loading', 'Loading')} />;
31
+
32
+ if (operationTypePermision.requiresBatchUuid && !operationTypePermision.requiresActualBatchInfo)
33
+ return <p>{_expiration ? formatForDatePicker(_expiration) : '--'}</p>;
34
+
35
+ if (operationTypePermision.requiresActualBatchInfo || operationTypePermision.requiresBatchUuid)
36
+ return <p>{expiration ? formatForDatePicker(expiration) : '--'}</p>;
37
+
38
+ return <p>--</p>;
39
+ };
40
+
41
+ export default StockoperationItemExpiryCell;
@@ -0,0 +1,281 @@
1
+ import {
2
+ Button,
3
+ DataTable,
4
+ Table,
5
+ TableBody,
6
+ TableCell,
7
+ TableContainer,
8
+ TableHead,
9
+ TableHeader,
10
+ TableRow,
11
+ } from '@carbon/react';
12
+ import { Edit, TrashCan } from '@carbon/react/icons';
13
+ import { isDesktop, launchWorkspace } from '@openmrs/esm-framework';
14
+ import React, { useCallback, useMemo } from 'react';
15
+ import { useFormContext } from 'react-hook-form';
16
+ import { useTranslation } from 'react-i18next';
17
+ import { StockOperationDTO } from '../../../core/api/types/stockOperation/StockOperationDTO';
18
+ import { StockOperationType } from '../../../core/api/types/stockOperation/StockOperationType';
19
+ import { getStockOperationUniqueId } from '../../stock-operation.utils';
20
+ import { BaseStockOperationItemFormData, StockOperationItemDtoSchema } from '../../validation-schema';
21
+ import useOperationTypePermisions from '../hooks/useOperationTypePermisions';
22
+ import StockItemSearch from '../input-components/stock-item-search.component';
23
+ import { StockItemFormProps } from '../stock-item-form/stock-item-form.workspace';
24
+ import QuantityUomCell from './quantity-uom-cell.component';
25
+ import StockAvailability from './stock-availability-cell.component';
26
+ import StockOperationItemBatchNoCell from './stock-operation-item-batch-no-cell.component';
27
+ import StockOperationItemCell from './stock-operation-item-cell.component';
28
+ import StockoperationItemExpiryCell from './stock-operation-item-expiry-cell.component';
29
+ import styles from './stock-operation-items-form-step.scc.scss';
30
+
31
+ type StockOperationItemsFormStepProps = {
32
+ stockOperation?: StockOperationDTO;
33
+ stockOperationType: StockOperationType;
34
+ onNext?: () => void;
35
+ onPrevious?: () => void;
36
+ };
37
+ const StockOperationItemsFormStep: React.FC<StockOperationItemsFormStepProps> = ({
38
+ stockOperationType,
39
+ stockOperation,
40
+ onNext,
41
+ onPrevious,
42
+ }) => {
43
+ const { t } = useTranslation();
44
+ const operationTypePermision = useOperationTypePermisions(stockOperationType);
45
+
46
+ const form = useFormContext<StockOperationItemDtoSchema>();
47
+ const observableOperationItems = form.watch('stockOperationItems');
48
+ const headers = useMemo(() => {
49
+ return [
50
+ {
51
+ key: 'item',
52
+ header: t('item', 'Item'),
53
+ styles: { width: '40% !important' },
54
+ },
55
+ {
56
+ key: 'itemDetails',
57
+ header: t('itemDetails', 'Item Details'),
58
+ styles: { width: '20% !important' },
59
+ },
60
+ ...(operationTypePermision.requiresBatchUuid || operationTypePermision.requiresActualBatchInfo
61
+ ? [
62
+ {
63
+ key: 'batch',
64
+ header: t('batchNo', 'Batch No'),
65
+ styles: { width: '15% !important' },
66
+ },
67
+ ]
68
+ : []),
69
+ ...(operationTypePermision.requiresActualBatchInfo
70
+ ? [
71
+ {
72
+ key: 'expiry',
73
+ header: t('expiry', 'Expiry'),
74
+ },
75
+ ]
76
+ : []),
77
+ ...(operationTypePermision.requiresBatchUuid
78
+ ? [
79
+ {
80
+ key: 'expiry',
81
+ header: t('expiry', 'Expiry'),
82
+ },
83
+ ]
84
+ : []),
85
+
86
+ {
87
+ key: 'quantity',
88
+ header: t('qty', 'Qty'),
89
+ },
90
+ {
91
+ key: 'quantityuom',
92
+ header: t('quantityUom', 'Qty UoM'),
93
+ },
94
+ ...(operationTypePermision.canCaptureQuantityPrice
95
+ ? [
96
+ {
97
+ key: 'purchasePrice',
98
+ header: t('purchasePrice', 'Purchase Price'),
99
+ },
100
+ ]
101
+ : []),
102
+ { key: 'actions', header: t('actions', 'Actions') },
103
+ ];
104
+ }, [operationTypePermision, t]);
105
+
106
+ const handleLaunchStockItem = useCallback(
107
+ (stockOperationItem?: BaseStockOperationItemFormData) => {
108
+ launchWorkspace('stock-operation-stock-items-form', {
109
+ workspaceTitle: t('stockItem', 'StockItem'),
110
+ ...({
111
+ stockOperationType,
112
+ stockOperationItem,
113
+ onSave: (data) => {
114
+ const items = (form.getValues('stockOperationItems') ?? []) as Array<BaseStockOperationItemFormData>;
115
+ const index = items.findIndex((i) => i.uuid === data.uuid);
116
+ if (index === -1) {
117
+ items.push(data);
118
+ } else {
119
+ items[index] = data;
120
+ }
121
+ form.setValue('stockOperationItems', items as any);
122
+ },
123
+ } as StockItemFormProps),
124
+ });
125
+ },
126
+ [stockOperationType, t, form],
127
+ );
128
+
129
+ const handleDeleteStockOperationItem = useCallback(
130
+ (item: BaseStockOperationItemFormData) => {
131
+ form.setValue('stockOperationItems', observableOperationItems.filter((i) => i.uuid !== item.uuid) as any);
132
+ },
133
+ [form, observableOperationItems],
134
+ );
135
+
136
+ const tableRows = useMemo(() => {
137
+ return observableOperationItems?.map((item) => {
138
+ const {
139
+ batchNo,
140
+ expiration,
141
+ quantity,
142
+ purchasePrice,
143
+ uuid,
144
+ stockItemUuid,
145
+ stockItemPackagingUOMUuid,
146
+ stockBatchUuid,
147
+ } = item;
148
+
149
+ return {
150
+ id: uuid,
151
+ item: stockItemUuid ? <StockOperationItemCell stockItemUuid={stockItemUuid} /> : '--',
152
+ itemDetails: stockItemUuid ? <StockAvailability stockItemUuid={stockItemUuid} /> : '--',
153
+ batch: (
154
+ <StockOperationItemBatchNoCell
155
+ operation={stockOperationType}
156
+ stockBatchUuid={stockBatchUuid}
157
+ batchNo={batchNo}
158
+ stockItemUuid={stockItemUuid}
159
+ />
160
+ ),
161
+ expiry: (
162
+ <StockoperationItemExpiryCell
163
+ operation={stockOperationType}
164
+ stockBatchUuid={stockBatchUuid}
165
+ expiration={expiration}
166
+ stockItemUuid={stockItemUuid}
167
+ />
168
+ ),
169
+ quantity: quantity?.toLocaleString(),
170
+ quantityuom: stockItemPackagingUOMUuid ? (
171
+ <QuantityUomCell stockItemPackagingUOMUuid={stockItemPackagingUOMUuid} stockItemUuid={stockItemUuid} />
172
+ ) : (
173
+ '--'
174
+ ),
175
+ purchasePrice: purchasePrice,
176
+ actions: (
177
+ <>
178
+ <Button
179
+ type="button"
180
+ size="sm"
181
+ className="submitButton clear-padding-margin"
182
+ iconDescription={'Edit'}
183
+ kind="ghost"
184
+ renderIcon={Edit}
185
+ onClick={() => {
186
+ handleLaunchStockItem(item);
187
+ }}
188
+ />
189
+ <Button
190
+ type="button"
191
+ size="sm"
192
+ className="submitButton clear-padding-margin"
193
+ iconDescription={'Delete'}
194
+ kind="ghost"
195
+ renderIcon={TrashCan}
196
+ onClick={() => {
197
+ handleDeleteStockOperationItem(item);
198
+ }}
199
+ />
200
+ </>
201
+ ),
202
+ };
203
+ });
204
+ }, [observableOperationItems, handleLaunchStockItem, handleDeleteStockOperationItem, stockOperationType]);
205
+
206
+ const headerTitle = t('stockoperationItems', 'Stock operation items');
207
+
208
+ return (
209
+ <div style={{ margin: '10px' }}>
210
+ <div className={styles.tableContainer}>
211
+ <div className={styles.heading}>
212
+ <h4>{headerTitle}</h4>
213
+ <div className={styles.btnSet}>
214
+ {typeof onPrevious === 'function' && (
215
+ <Button kind="secondary" onClick={onPrevious}>
216
+ {t('previous', 'Previous')}
217
+ </Button>
218
+ )}
219
+ {typeof onNext === 'function' && (
220
+ <Button kind="primary" onClick={onNext}>
221
+ {t('next', 'Next')}
222
+ </Button>
223
+ )}
224
+ </div>
225
+ </div>
226
+ <StockItemSearch
227
+ onSelectedItem={(stockItem) =>
228
+ handleLaunchStockItem({
229
+ uuid: `new-item-${getStockOperationUniqueId()}`,
230
+ stockItemUuid: stockItem.uuid,
231
+ hasExpiration: stockItem.hasExpiration,
232
+ purchasePrice: stockItem.purchasePrice,
233
+ })
234
+ }
235
+ />
236
+
237
+ <DataTable
238
+ rows={tableRows ?? []}
239
+ headers={headers}
240
+ isSortable={false}
241
+ useZebraStyles={true}
242
+ className={styles.dataTable}
243
+ render={({ rows, headers, getTableProps, getHeaderProps, getRowProps }) => (
244
+ <TableContainer>
245
+ <Table {...getTableProps()}>
246
+ <TableHead>
247
+ <TableRow>
248
+ {headers.map((header: any) => (
249
+ <TableHeader
250
+ {...getHeaderProps({
251
+ header,
252
+ isSortable: false,
253
+ })}
254
+ className={isDesktop ? styles.desktopHeader : styles.tabletHeader}
255
+ style={header?.styles}
256
+ key={`${header.key}`}
257
+ >
258
+ {header.header?.content ?? header?.header}
259
+ </TableHeader>
260
+ ))}
261
+ </TableRow>
262
+ </TableHead>
263
+ <TableBody>
264
+ {rows.map((row) => (
265
+ <TableRow {...getRowProps({ row })}>
266
+ {row.cells.map((cell) => (
267
+ <TableCell key={cell.id}>{cell.value}</TableCell>
268
+ ))}
269
+ </TableRow>
270
+ ))}
271
+ </TableBody>
272
+ </Table>
273
+ </TableContainer>
274
+ )}
275
+ ></DataTable>
276
+ </div>
277
+ </div>
278
+ );
279
+ };
280
+
281
+ export default StockOperationItemsFormStep;
@@ -0,0 +1,64 @@
1
+ @use '@carbon/colors';
2
+ @use '@carbon/layout';
3
+ @use '@carbon/type';
4
+ @import '~@openmrs/esm-styleguide/src/vars';
5
+
6
+ .tableContainer {
7
+ :global(.cds--data-table-content) {
8
+ height: calc(100vh - 150px);
9
+ }
10
+ }
11
+
12
+ .tableHeader {
13
+ width: 3% !important;
14
+ }
15
+
16
+ .tableBody {
17
+ display: flex;
18
+ flex-direction: row;
19
+ width: 3% !important;
20
+ gap: 8px;
21
+ }
22
+
23
+ .dataTable {
24
+ width: 100%;
25
+ }
26
+
27
+ .availability {
28
+ font-size: 0.875rem;
29
+
30
+ .outOfStock {
31
+ color: #da1e28;
32
+ }
33
+ }
34
+
35
+ .heading {
36
+ text-align: left;
37
+ text-transform: capitalize;
38
+ display: flex;
39
+ flex-direction: row;
40
+ justify-content: space-between;
41
+ align-items: center;
42
+ margin: layout.$spacing-03 0 layout.$spacing-03 0;
43
+
44
+ h4 {
45
+ @include type.type-style('heading-compact-02');
46
+ color: colors.$gray-70;
47
+
48
+ &:after {
49
+ content: '';
50
+ display: block;
51
+ width: 2rem;
52
+ padding-top: 3px;
53
+ border-bottom: 0.375rem solid;
54
+ @include brand-03(border-bottom-color);
55
+ }
56
+ }
57
+ }
58
+
59
+ .btnSet {
60
+ display: flex;
61
+ flex-direction: row;
62
+ gap: layout.$spacing-03;
63
+ align-items: center;
64
+ }