@openmrs/esm-stock-management-app 3.0.1-pre.818 → 3.0.1-pre.827
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.
- package/dist/10.js +1 -0
- package/dist/10.js.map +1 -0
- package/dist/165.js +1 -1
- package/dist/165.js.map +1 -1
- package/dist/20.js +1 -1
- package/dist/20.js.map +1 -1
- package/dist/642.js +1 -0
- package/dist/642.js.map +1 -0
- package/dist/675.js +1 -0
- package/dist/675.js.map +1 -0
- package/dist/{880.js → 727.js} +1 -1
- package/dist/727.js.map +1 -0
- package/dist/780.js +1 -0
- package/dist/780.js.map +1 -0
- package/dist/main.js +1 -1
- package/dist/main.js.map +1 -1
- package/dist/openmrs-esm-stock-management-app.js +1 -1
- package/dist/openmrs-esm-stock-management-app.js.buildmanifest.json +129 -56
- package/dist/openmrs-esm-stock-management-app.js.map +1 -1
- package/dist/routes.json +1 -1
- package/package.json +1 -1
- package/src/index.ts +8 -0
- package/src/routes.json +14 -0
- package/src/stock-items/add-stock-item/add-stock-action-button.component.tsx +2 -3
- package/src/stock-items/add-stock-item/add-stock-item.component.tsx +29 -20
- package/src/stock-items/add-stock-item/add-stock-item.scss +22 -3
- package/src/stock-items/add-stock-item/add-stock-item.test.tsx +11 -11
- package/src/stock-items/add-stock-item/packaging-units/packaging-units.component.tsx +9 -10
- package/src/stock-items/add-stock-item/packaging-units/packaging-units.resource.tsx +1 -1
- package/src/stock-items/add-stock-item/stock-item-details/stock-item-details.component.tsx +226 -214
- package/src/stock-items/add-stock-item/stock-item-details/stock-item-details.resource.tsx +7 -2
- package/src/stock-items/add-stock-item/stock-item-rules/add-stock-rule-button.component.tsx +6 -4
- package/src/stock-items/add-stock-item/stock-item-rules/add-stock-rules.component.tsx +162 -166
- package/src/stock-items/add-stock-item/stock-item-rules/add-stock-rules.scss +19 -11
- package/src/stock-items/add-stock-item/stock-item-rules/edit-stock-rule.component.tsx +8 -5
- package/src/stock-items/add-stock-item/transactions/printout/transactions-print-action.component.tsx +66 -3
- package/src/stock-items/add-stock-item/transactions/transactions.component.tsx +82 -71
- package/src/stock-items/add-stock-item/transactions/transactions.resource.tsx +7 -1
- package/src/stock-items/edit-stock-item/edit-stock-item-action-menu.component.tsx +2 -2
- package/src/stock-items/stock-item.utils.tsx +7 -50
- package/src/stock-items/stock-items-table.component.tsx +2 -2
- package/src/stock-items/stock-items-table.test.tsx +28 -23
- package/src/stock-items/stock-items.resource.ts +7 -5
- package/src/stock-operations/stock-operations-forms/stock-operation-stepper/stock-operation-stepper.component.tsx +1 -0
- package/dist/600.js +0 -1
- package/dist/600.js.map +0 -1
- package/dist/880.js.map +0 -1
@@ -29,6 +29,7 @@ const Transactions: React.FC<TransactionsProps> = ({ stockItemUuid }) => {
|
|
29
29
|
setStockItemUuid,
|
30
30
|
setLocationUuid,
|
31
31
|
binCardHeaders,
|
32
|
+
inventory,
|
32
33
|
} = useStockItemsTransactions(stockItemFilter);
|
33
34
|
|
34
35
|
useEffect(() => {
|
@@ -38,82 +39,87 @@ const Transactions: React.FC<TransactionsProps> = ({ stockItemUuid }) => {
|
|
38
39
|
const { control } = useForm({});
|
39
40
|
|
40
41
|
const tableRows = useMemo(() => {
|
41
|
-
return items?.map((stockItemTransaction) =>
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
42
|
+
return items?.map((stockItemTransaction) => {
|
43
|
+
const balance = inventory?.total ?? '';
|
44
|
+
|
45
|
+
return {
|
46
|
+
...stockItemTransaction,
|
47
|
+
id: stockItemTransaction?.uuid,
|
48
|
+
key: `key-${stockItemTransaction?.uuid}`,
|
49
|
+
uuid: `${stockItemTransaction?.uuid}`,
|
50
|
+
date: formatDisplayDate(stockItemTransaction?.dateCreated),
|
51
|
+
location:
|
52
|
+
stockItemTransaction.operationSourcePartyName && stockItemTransaction.operationDestinationPartyName ? (
|
53
|
+
stockItemTransaction.operationSourcePartyName === stockItemTransaction?.partyName ? (
|
54
|
+
stockItemTransaction.quantity > 0 ? (
|
55
|
+
<>
|
56
|
+
<span className="transaction-location">{stockItemTransaction.operationSourcePartyName}</span>
|
57
|
+
<ArrowLeft size={16} /> {stockItemTransaction.operationDestinationPartyName}
|
58
|
+
</>
|
59
|
+
) : (
|
60
|
+
<>
|
61
|
+
<span className="transaction-location">{stockItemTransaction.operationSourcePartyName}</span>
|
62
|
+
<ArrowLeft size={16} /> {stockItemTransaction.operationDestinationPartyName}
|
63
|
+
</>
|
64
|
+
)
|
65
|
+
) : stockItemTransaction.operationDestinationPartyName === stockItemTransaction?.partyName ? (
|
66
|
+
stockItemTransaction.quantity > 0 ? (
|
67
|
+
<>
|
68
|
+
<span className="transaction-location">{stockItemTransaction.operationDestinationPartyName}</span>
|
69
|
+
<ArrowLeft size={16} /> {stockItemTransaction.operationSourcePartyName}
|
70
|
+
</>
|
71
|
+
) : (
|
72
|
+
<>
|
73
|
+
<span className="transaction-location">{stockItemTransaction.operationDestinationPartyName}</span>
|
74
|
+
<ArrowLeft size={16} /> {stockItemTransaction.operationSourcePartyName}
|
75
|
+
</>
|
76
|
+
)
|
67
77
|
) : (
|
68
|
-
|
69
|
-
<span className="transaction-location">{stockItemTransaction.operationDestinationPartyName}</span>
|
70
|
-
<ArrowLeft size={16} /> {stockItemTransaction.operationSourcePartyName}
|
71
|
-
</>
|
78
|
+
stockItemTransaction?.partyName
|
72
79
|
)
|
73
80
|
) : (
|
74
81
|
stockItemTransaction?.partyName
|
75
|
-
)
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
batch: stockItemTransaction.stockBatchNo
|
84
|
-
? `${stockItemTransaction.stockBatchNo}${
|
85
|
-
stockItemTransaction.expiration ? ` (${formatDisplayDate(stockItemTransaction.expiration)})` : ''
|
86
|
-
}`
|
87
|
-
: '',
|
88
|
-
reference: (
|
89
|
-
<StockOperationReference
|
90
|
-
operationUuid={stockItemTransaction?.stockOperationUuid}
|
91
|
-
operationNumber={stockItemTransaction?.stockOperationNumber}
|
92
|
-
/>
|
93
|
-
),
|
94
|
-
status: stockItemTransaction?.stockOperationStatus ?? '',
|
95
|
-
in:
|
96
|
-
stockItemTransaction?.quantity >= 0
|
97
|
-
? `${stockItemTransaction?.quantity?.toLocaleString()} ${stockItemTransaction?.packagingUomName ?? ''} of ${
|
98
|
-
stockItemTransaction.packagingUomFactor
|
82
|
+
),
|
83
|
+
transaction: stockItemTransaction?.isPatientTransaction
|
84
|
+
? 'Patient Dispense'
|
85
|
+
: stockItemTransaction.stockOperationTypeName,
|
86
|
+
quantity: `${stockItemTransaction?.quantity?.toLocaleString()} ${stockItemTransaction?.packagingUomName ?? ''}`,
|
87
|
+
batch: stockItemTransaction.stockBatchNo
|
88
|
+
? `${stockItemTransaction.stockBatchNo}${
|
89
|
+
stockItemTransaction.expiration ? ` (${formatDisplayDate(stockItemTransaction.expiration)})` : ''
|
99
90
|
}`
|
100
91
|
: '',
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
92
|
+
reference: (
|
93
|
+
<StockOperationReference
|
94
|
+
operationUuid={stockItemTransaction?.stockOperationUuid}
|
95
|
+
operationNumber={stockItemTransaction?.stockOperationNumber}
|
96
|
+
/>
|
97
|
+
),
|
98
|
+
status: stockItemTransaction?.stockOperationStatus ?? '',
|
99
|
+
in:
|
100
|
+
stockItemTransaction?.quantity >= 0
|
101
|
+
? `${stockItemTransaction?.quantity?.toLocaleString()} ${stockItemTransaction?.packagingUomName ?? ''} of ${
|
102
|
+
stockItemTransaction.packagingUomFactor
|
103
|
+
}`
|
104
|
+
: '',
|
105
|
+
out:
|
106
|
+
stockItemTransaction?.quantity < 0
|
107
|
+
? `${(-1 * stockItemTransaction?.quantity)?.toLocaleString()} ${
|
108
|
+
stockItemTransaction?.packagingUomName ?? ''
|
109
|
+
} of ${stockItemTransaction.packagingUomFactor}`
|
110
|
+
: '',
|
111
|
+
totalin:
|
112
|
+
stockItemTransaction?.quantity >= 0
|
113
|
+
? `${stockItemTransaction?.quantity * Number(stockItemTransaction.packagingUomFactor)}`
|
114
|
+
: '',
|
115
|
+
totalout:
|
116
|
+
stockItemTransaction?.quantity < 0
|
117
|
+
? `${-1 * stockItemTransaction?.quantity * Number(stockItemTransaction.packagingUomFactor)}`
|
118
|
+
: '',
|
119
|
+
balance: `${balance} ${stockItemTransaction?.packagingUomName ?? ''}`,
|
120
|
+
};
|
121
|
+
});
|
122
|
+
}, [items, inventory]);
|
117
123
|
|
118
124
|
if (isLoading) {
|
119
125
|
return <DataTableSkeleton role="progressbar" />;
|
@@ -123,7 +129,12 @@ const Transactions: React.FC<TransactionsProps> = ({ stockItemUuid }) => {
|
|
123
129
|
<DataList
|
124
130
|
children={() => (
|
125
131
|
<>
|
126
|
-
<TransactionsPrintAction
|
132
|
+
<TransactionsPrintAction
|
133
|
+
columns={binCardHeaders}
|
134
|
+
data={tableRows}
|
135
|
+
itemUuid={stockItemUuid}
|
136
|
+
filter={stockItemFilter}
|
137
|
+
/>
|
127
138
|
<TransactionsLocationsFilter
|
128
139
|
onLocationIdChange={(q) => {
|
129
140
|
setLocationUuid(q);
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import { ResourceRepresentation } from '../../../core/api/api';
|
2
2
|
import { useEffect, useMemo, useState } from 'react';
|
3
|
-
import {
|
3
|
+
import { StockItemInventoryFilter, useStockItemInventory, useStockItemTransactions } from '../../stock-items.resource';
|
4
4
|
|
5
5
|
export function useStockItemsTransactions(filter?: StockItemInventoryFilter) {
|
6
6
|
const [stockItemFilter, setStockItemFilter] = useState<StockItemInventoryFilter>({
|
@@ -37,6 +37,7 @@ export function useStockItemsTransactions(filter?: StockItemInventoryFilter) {
|
|
37
37
|
}, [searchString, currentPage, currentPageSize, stockItemUuid, partyUuid, locationUuid, stockBatchUuid]);
|
38
38
|
|
39
39
|
const { items, isLoading, error } = useStockItemTransactions(stockItemFilter);
|
40
|
+
const { items: inventory } = useStockItemInventory(stockItemFilter);
|
40
41
|
|
41
42
|
const tableHeaders = useMemo(
|
42
43
|
() => [
|
@@ -102,6 +103,10 @@ export function useStockItemsTransactions(filter?: StockItemInventoryFilter) {
|
|
102
103
|
key: 'batch',
|
103
104
|
header: 'Batch',
|
104
105
|
},
|
106
|
+
{
|
107
|
+
key: 'balance',
|
108
|
+
header: 'Balance',
|
109
|
+
},
|
105
110
|
{
|
106
111
|
key: 'reference',
|
107
112
|
header: 'Reference',
|
@@ -131,5 +136,6 @@ export function useStockItemsTransactions(filter?: StockItemInventoryFilter) {
|
|
131
136
|
setPartyUuid,
|
132
137
|
setStockBatchUuid,
|
133
138
|
binCardHeaders,
|
139
|
+
inventory: inventory,
|
134
140
|
};
|
135
141
|
}
|
@@ -2,7 +2,7 @@ import React from 'react';
|
|
2
2
|
import { Button } from '@carbon/react';
|
3
3
|
import { useTranslation } from 'react-i18next';
|
4
4
|
import { type StockItemDTO } from '../../core/api/types/stockItem/StockItem';
|
5
|
-
import {
|
5
|
+
import { launchAddOrStockItemWorkspace } from '../stock-item.utils';
|
6
6
|
|
7
7
|
interface EditStockItemActionsMenuProps {
|
8
8
|
data: StockItemDTO;
|
@@ -17,7 +17,7 @@ const EditStockItemActionsMenu: React.FC<EditStockItemActionsMenuProps> = ({ dat
|
|
17
17
|
size="md"
|
18
18
|
onClick={() => {
|
19
19
|
data.isDrug = !!data.drugUuid;
|
20
|
-
|
20
|
+
launchAddOrStockItemWorkspace(t, data);
|
21
21
|
}}
|
22
22
|
iconDescription={t('editStockItem', 'Edit Stock Item')}
|
23
23
|
>
|
@@ -1,57 +1,14 @@
|
|
1
|
-
import
|
2
|
-
import { closeOverlay, launchOverlay } from '../core/components/overlay/hook';
|
3
|
-
import { type StockItemDTO } from '../core/api/types/stockItem/StockItem';
|
1
|
+
import { launchWorkspace } from '@openmrs/esm-framework';
|
4
2
|
import { type TFunction } from 'react-i18next';
|
5
|
-
import
|
6
|
-
import { type FetchResponse, showSnackbar } from '@openmrs/esm-framework';
|
7
|
-
import { createStockItem, updateStockItem } from './stock-items.resource';
|
8
|
-
|
9
|
-
export const addOrEditStockItem = async (t: TFunction, stockItem: StockItemDTO, isEditing = false) => {
|
10
|
-
try {
|
11
|
-
const response: FetchResponse<StockItemDTO> = await (isEditing ? updateStockItem : createStockItem)(stockItem);
|
12
|
-
|
13
|
-
if (response?.data) {
|
14
|
-
showSnackbar({
|
15
|
-
isLowContrast: true,
|
16
|
-
title: isEditing ? `${t('editStockItem', 'Edit Stock Item')}` : `${t('addStockItem', 'Add Stock Item')}`,
|
17
|
-
kind: 'success',
|
18
|
-
subtitle: isEditing
|
19
|
-
? `${t('stockItemEdited', 'Stock Item Edited Successfully')}`
|
20
|
-
: `${t('stockItemAdded', 'Stock Item Added Successfully')}`,
|
21
|
-
});
|
22
|
-
|
23
|
-
if (!isEditing) {
|
24
|
-
closeOverlay();
|
25
|
-
|
26
|
-
// launch edit dialog
|
27
|
-
const item = response.data;
|
28
|
-
item.isDrug = !!item.drugUuid;
|
29
|
-
launchAddOrEditDialog(t, item, true);
|
30
|
-
}
|
31
|
-
}
|
32
|
-
} catch (error) {
|
33
|
-
showSnackbar({
|
34
|
-
title: isEditing
|
35
|
-
? t('errorEditingStockItem', 'Error editing a stock Item')
|
36
|
-
: t('errorAddingStockItem', 'Error adding a stock Item'),
|
37
|
-
kind: 'error',
|
38
|
-
isLowContrast: true,
|
39
|
-
subtitle: error?.responseBody?.error?.message,
|
40
|
-
});
|
41
|
-
}
|
42
|
-
};
|
3
|
+
import { type StockItemDTO } from '../core/api/types/stockItem/StockItem';
|
43
4
|
|
44
|
-
export const
|
45
|
-
|
46
|
-
|
5
|
+
export const launchAddOrStockItemWorkspace = (t: TFunction, stockItem?: StockItemDTO) => {
|
6
|
+
launchWorkspace('stock-item-form-workspace', {
|
7
|
+
workspaceTitle: stockItem
|
47
8
|
? `${t('editItem', 'Edit {{name}}', {
|
48
9
|
name: stockItem?.drugName || stockItem.conceptName || '',
|
49
10
|
})} ${stockItem.isDrug ? '(Drug)' : '(Non Drug)'}`
|
50
11
|
: t('addItem', 'Add stock item'),
|
51
|
-
|
52
|
-
|
53
|
-
onSave={(stockItem) => addOrEditStockItem(t, stockItem, isEditing)}
|
54
|
-
isEditing={isEditing}
|
55
|
-
/>,
|
56
|
-
);
|
12
|
+
stockItem,
|
13
|
+
});
|
57
14
|
};
|
@@ -27,7 +27,7 @@ import { useTranslation } from 'react-i18next';
|
|
27
27
|
import { ResourceRepresentation } from '../core/api/api';
|
28
28
|
import AddStockItemActionButton from './add-stock-item/add-stock-action-button.component';
|
29
29
|
import FilterStockItems from './components/filter-stock-items/filter-stock-items.component';
|
30
|
-
import {
|
30
|
+
import { launchAddOrStockItemWorkspace } from './stock-item.utils';
|
31
31
|
import { useStockItemsPages } from './stock-items-table.resource';
|
32
32
|
import styles from './stock-items-table.scss';
|
33
33
|
import AddStockItemsBulktImportActionButton from './add-bulk-stock-item/add-stock-items-bulk-import-action-button.component';
|
@@ -144,7 +144,7 @@ const StockItemsTableComponent: React.FC<StockItemsTableProps> = () => {
|
|
144
144
|
size="md"
|
145
145
|
onClick={() => {
|
146
146
|
stockItem.isDrug = !!stockItem.drugUuid;
|
147
|
-
|
147
|
+
launchAddOrStockItemWorkspace(t, stockItem);
|
148
148
|
}}
|
149
149
|
iconDescription={t('editStockItem', 'Edit Stock Item')}
|
150
150
|
renderIcon={(props) => <Edit size={16} {...props} />}
|
@@ -4,7 +4,7 @@ import userEvent from '@testing-library/user-event';
|
|
4
4
|
import StockItemsTableComponent from './stock-items-table.component';
|
5
5
|
import { useStockItemsPages } from './stock-items-table.resource';
|
6
6
|
import { handleMutate } from '../utils';
|
7
|
-
import {
|
7
|
+
import { launchAddOrStockItemWorkspace } from './stock-item.utils';
|
8
8
|
|
9
9
|
jest.mock('./stock-items-table.resource', () => ({
|
10
10
|
useStockItemsPages: jest.fn(),
|
@@ -15,7 +15,7 @@ jest.mock('../utils', () => ({
|
|
15
15
|
}));
|
16
16
|
|
17
17
|
jest.mock('./stock-item.utils', () => ({
|
18
|
-
|
18
|
+
launchAddOrStockItemWorkspace: jest.fn(),
|
19
19
|
}));
|
20
20
|
|
21
21
|
jest.mock('react-i18next', () => ({
|
@@ -27,16 +27,18 @@ jest.mock('react-i18next', () => ({
|
|
27
27
|
describe('StockItemsTableComponent', () => {
|
28
28
|
const mockUseStockItemsPages = {
|
29
29
|
isLoading: false,
|
30
|
-
items: Array(25)
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
30
|
+
items: Array(25)
|
31
|
+
.fill(null)
|
32
|
+
.map((_, index) => ({
|
33
|
+
uuid: `item-${index}`,
|
34
|
+
commonName: `Test Item ${index}`,
|
35
|
+
drugUuid: index % 2 === 0 ? `drug-${index}` : null,
|
36
|
+
conceptName: `Concept ${index}`,
|
37
|
+
dispensingUnitName: `Unit ${index}`,
|
38
|
+
defaultStockOperationsUoMName: `UoM ${index}`,
|
39
|
+
reorderLevel: index * 10,
|
40
|
+
reorderLevelUoMName: 'Units',
|
41
|
+
})),
|
40
42
|
totalCount: 25,
|
41
43
|
currentPageSize: 10,
|
42
44
|
setPageSize: jest.fn(),
|
@@ -57,13 +59,13 @@ describe('StockItemsTableComponent', () => {
|
|
57
59
|
render(<StockItemsTableComponent />);
|
58
60
|
expect(screen.getByText('panelDescription')).toBeInTheDocument();
|
59
61
|
expect(screen.getByRole('searchbox')).toBeInTheDocument();
|
60
|
-
|
62
|
+
|
61
63
|
const user = userEvent.setup();
|
62
64
|
const menuButton = screen.getByTestId('stock-items-menu');
|
63
65
|
await user.click(menuButton);
|
64
|
-
|
66
|
+
|
65
67
|
await screen.findByText('Refresh');
|
66
|
-
|
68
|
+
|
67
69
|
expect(screen.getByText('type')).toBeInTheDocument();
|
68
70
|
expect(screen.getByText('genericName')).toBeInTheDocument();
|
69
71
|
expect(screen.getByText('commonName')).toBeInTheDocument();
|
@@ -87,9 +89,12 @@ describe('StockItemsTableComponent', () => {
|
|
87
89
|
const user = userEvent.setup();
|
88
90
|
const searchInput = screen.getByRole('searchbox');
|
89
91
|
await user.type(searchInput, 'test search');
|
90
|
-
await waitFor(
|
91
|
-
|
92
|
-
|
92
|
+
await waitFor(
|
93
|
+
() => {
|
94
|
+
expect(mockUseStockItemsPages.setSearchString).toHaveBeenCalledWith('test search');
|
95
|
+
},
|
96
|
+
{ timeout: 2000 },
|
97
|
+
);
|
93
98
|
});
|
94
99
|
|
95
100
|
it('updates pagination when page or page size changes', async () => {
|
@@ -106,12 +111,12 @@ describe('StockItemsTableComponent', () => {
|
|
106
111
|
|
107
112
|
it('triggers handleRefresh when refresh button is clicked', async () => {
|
108
113
|
render(<StockItemsTableComponent />);
|
109
|
-
|
114
|
+
|
110
115
|
const user = userEvent.setup();
|
111
116
|
const menuButton = screen.getByTestId('stock-items-menu');
|
112
117
|
expect(menuButton).toBeInTheDocument();
|
113
118
|
await user.click(menuButton);
|
114
|
-
|
119
|
+
|
115
120
|
const refreshButton = await screen.findByText('Refresh');
|
116
121
|
expect(refreshButton).toBeInTheDocument();
|
117
122
|
await user.click(refreshButton);
|
@@ -125,10 +130,10 @@ describe('StockItemsTableComponent', () => {
|
|
125
130
|
const user = userEvent.setup();
|
126
131
|
const editButtons = screen.getAllByLabelText('Edit Stock Item');
|
127
132
|
await user.click(editButtons[0]);
|
128
|
-
|
133
|
+
|
134
|
+
expect(launchAddOrStockItemWorkspace).toHaveBeenCalledWith(
|
129
135
|
expect.any(Function),
|
130
136
|
expect.objectContaining({ uuid: 'item-0' }),
|
131
|
-
true
|
132
137
|
);
|
133
138
|
});
|
134
|
-
});
|
139
|
+
});
|
@@ -10,6 +10,8 @@ import { type StockItemReference, type StockItemReferenceDTO } from '../core/api
|
|
10
10
|
import { type StockItemTransactionDTO } from '../core/api/types/stockItem/StockItemTransaction';
|
11
11
|
import { type StockRule } from '../core/api/types/stockItem/StockRule';
|
12
12
|
import { type StockOperationItemCost } from '../core/api/types/stockOperation/StockOperationItemCost';
|
13
|
+
import { z } from 'zod';
|
14
|
+
import { stockItemDetailsSchema, type StockItemFormData } from './validationSchema';
|
13
15
|
|
14
16
|
export interface StockItemFilter extends ResourceFilterCriteria {
|
15
17
|
isDrug?: string | null | undefined;
|
@@ -227,11 +229,11 @@ export function deleteStockItemPackagingUnit(id: string) {
|
|
227
229
|
}
|
228
230
|
|
229
231
|
// createStockItem
|
230
|
-
export function createStockItem(item:
|
232
|
+
export function createStockItem(item: StockItemFormData) {
|
231
233
|
const apiUrl = `${restBaseUrl}/stockmanagement/stockitem`;
|
232
234
|
const abortController = new AbortController();
|
233
235
|
delete item.isDrug;
|
234
|
-
return openmrsFetch(apiUrl, {
|
236
|
+
return openmrsFetch<StockItemDTO>(apiUrl, {
|
235
237
|
method: 'POST',
|
236
238
|
headers: {
|
237
239
|
'Content-Type': 'application/json',
|
@@ -242,12 +244,12 @@ export function createStockItem(item: StockItemDTO) {
|
|
242
244
|
}
|
243
245
|
|
244
246
|
// updateStockItem
|
245
|
-
export function updateStockItem(item:
|
246
|
-
const apiUrl = `${restBaseUrl}/stockmanagement/stockitem/${
|
247
|
+
export function updateStockItem(stockItemUuid: string, item: StockItemFormData) {
|
248
|
+
const apiUrl = `${restBaseUrl}/stockmanagement/stockitem/${stockItemUuid}`;
|
247
249
|
const abortController = new AbortController();
|
248
250
|
delete item.isDrug;
|
249
251
|
delete item.dateCreated;
|
250
|
-
return openmrsFetch(apiUrl, {
|
252
|
+
return openmrsFetch<StockItemDTO>(apiUrl, {
|
251
253
|
method: 'POST',
|
252
254
|
headers: {
|
253
255
|
'Content-Type': 'application/json',
|
@@ -35,6 +35,7 @@ const StockOperationStepper: React.FC<StockOperationStepperProps> = ({
|
|
35
35
|
className={`${styles.stepperItem} ${active ? styles.stepperItemActive : ''}`}
|
36
36
|
key={index}
|
37
37
|
onClick={!disabled ? () => onChange?.(index) : undefined}
|
38
|
+
aria-disabled={disabled}
|
38
39
|
>
|
39
40
|
<p className={styles.title}>{title}</p>
|
40
41
|
</li>
|