@openmrs/esm-stock-management-app 1.0.1-pre.788 → 1.0.1-pre.790
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/493.js +1 -1
- package/dist/493.js.map +1 -1
- package/dist/880.js +1 -0
- package/dist/880.js.map +1 -0
- package/dist/942.js +1 -0
- package/dist/942.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 +41 -41
- package/dist/routes.json +1 -1
- package/package.json +1 -1
- package/src/index.ts +15 -21
- package/src/routes.json +5 -4
- package/src/stock-operations/add-stock-operation/stock-operations-expanded-row/stock-operation-expanded-row.component.tsx +32 -3
- package/src/stock-operations/edit-stock-operation/edit-stock-operation-action-menu.component.tsx +2 -2
- package/src/stock-operations/stock-operation-actions.component.tsx +81 -0
- package/src/stock-operations/stock-operation-links.component.tsx +82 -0
- package/src/stock-operations/stock-operation-reference.component.tsx +2 -2
- package/src/stock-operations/stock-operation-types-selector/stock-operation-types-selector.component.tsx +2 -2
- package/src/stock-operations/stock-operation.utils.tsx +8 -13
- package/src/stock-operations/stock-operations-dialog/stock-operations-issue-stock-button.component.tsx +2 -2
- package/src/stock-operations/stock-operations-forms/step1.test.tsx +158 -17
- package/src/stock-operations/stock-operations-forms/step2.test.tsx +53 -8
- package/src/stock-operations/stock-operations-forms/step3.test.tsx +63 -10
- package/src/stock-operations/stock-operations-forms/steps/base-operation-details-form-step.tsx +11 -9
- package/src/stock-operations/stock-operations-forms/steps/received-items.component.tsx +8 -7
- package/src/stock-operations/stock-operations-forms/steps/stock-operation-item-cell.component.tsx +8 -9
- package/src/stock-operations/stock-operations-forms/steps/stock-operation-items-form-step.component.tsx +21 -46
- package/src/stock-operations/stock-operations-forms/steps/stock-operation-items-form-step.scc.scss +4 -18
- package/src/stock-operations/stock-operations-forms/steps/stock-operation-submission-form-step.component.tsx +20 -15
- package/src/stock-operations/stock-operations-forms/stock-issue-form-initializer-with-related-requisition-operation.component.tsx +20 -3
- package/src/stock-operations/stock-operations-forms/stock-item-form/stock-item-form.workspace.tsx +3 -5
- package/src/stock-operations/stock-operations-forms/stock-operation-form.component.tsx +99 -57
- package/src/stock-operations/stock-operations-forms/stock-operation-form.scss +5 -24
- package/src/stock-operations/stock-operations-forms/stock-operation-related-link.component.tsx +2 -2
- package/src/stock-operations/stock-operations-forms/stock-operation-stepper/stepper.scss +14 -11
- package/src/stock-operations/stock-operations-forms/stock-operation-stepper/stock-operation-stepper.component.tsx +2 -6
- package/src/stock-operations/stock-operations-table.scss +20 -0
- package/dist/155.js +0 -1
- package/dist/155.js.map +0 -1
- package/dist/922.js +0 -1
- package/dist/922.js.map +0 -1
- package/src/stock-operations/stock-operations-forms/stock-operation-form-header.component.tsx +0 -166
@@ -14,6 +14,7 @@ import {
|
|
14
14
|
Button,
|
15
15
|
} from '@carbon/react';
|
16
16
|
import styles from './stock-operation-items-form-step.scc.scss';
|
17
|
+
import { ArrowLeft } from '@carbon/react/icons';
|
17
18
|
|
18
19
|
const formatDate = (date: Date | string | null) => {
|
19
20
|
if (!date) return ' ';
|
@@ -68,13 +69,6 @@ const ReceivedItems: React.FC<ReceivedItemsProps> = ({ stockOperation, onPreviou
|
|
68
69
|
<div className={styles.tableContainer}>
|
69
70
|
<div className={styles.heading}>
|
70
71
|
<h4>{headerTitle}</h4>
|
71
|
-
<div className={styles.btnSet}>
|
72
|
-
{typeof onPrevious === 'function' && (
|
73
|
-
<Button kind="secondary" onClick={onPrevious}>
|
74
|
-
{t('previous', 'Previous')}
|
75
|
-
</Button>
|
76
|
-
)}
|
77
|
-
</div>
|
78
72
|
</div>
|
79
73
|
<DataTable rows={rows} headers={headers}>
|
80
74
|
{({ rows, headers, getHeaderProps, getTableProps, getRowProps }) => (
|
@@ -102,6 +96,13 @@ const ReceivedItems: React.FC<ReceivedItemsProps> = ({ stockOperation, onPreviou
|
|
102
96
|
</TableContainer>
|
103
97
|
)}
|
104
98
|
</DataTable>
|
99
|
+
<div className={styles.btnSet}>
|
100
|
+
{typeof onPrevious === 'function' && (
|
101
|
+
<Button kind="secondary" onClick={onPrevious} renderIcon={ArrowLeft} hasIconOnly data-testid="previous-btn">
|
102
|
+
{/* {t('previous', 'Previous')} */}
|
103
|
+
</Button>
|
104
|
+
)}
|
105
|
+
</div>
|
105
106
|
</div>
|
106
107
|
</div>
|
107
108
|
);
|
package/src/stock-operations/stock-operations-forms/steps/stock-operation-item-cell.component.tsx
CHANGED
@@ -1,12 +1,10 @@
|
|
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
1
|
import { InlineLoading } from '@carbon/react';
|
6
|
-
import {
|
7
|
-
import {
|
8
|
-
import {
|
2
|
+
import { ConfigurableLink, showSnackbar, useConfig } from '@openmrs/esm-framework';
|
3
|
+
import React, { useEffect, useMemo } from 'react';
|
4
|
+
import { useTranslation } from 'react-i18next';
|
9
5
|
import { ConfigObject } from '../../../config-schema';
|
6
|
+
import { URL_STOCK_ITEM } from '../../../constants';
|
7
|
+
import { useStockItem } from '../../../stock-items/stock-items.resource';
|
10
8
|
|
11
9
|
type StockOperationItemCellProps = {
|
12
10
|
stockItemUuid: string;
|
@@ -16,6 +14,7 @@ const StockOperationItemCell: React.FC<StockOperationItemCellProps> = ({ stockIt
|
|
16
14
|
const { isLoading, error, item } = useStockItem(stockItemUuid);
|
17
15
|
const { t } = useTranslation();
|
18
16
|
const { useItemCommonNameAsDisplay } = useConfig<ConfigObject>();
|
17
|
+
|
19
18
|
const commonName = useMemo(() => {
|
20
19
|
if (!useItemCommonNameAsDisplay) return;
|
21
20
|
const drugName = item?.drugName ? `(Drug name: ${item.drugName})` : undefined;
|
@@ -41,9 +40,9 @@ const StockOperationItemCell: React.FC<StockOperationItemCellProps> = ({ stockIt
|
|
41
40
|
if (error) return <>--</>;
|
42
41
|
|
43
42
|
return (
|
44
|
-
<
|
43
|
+
<ConfigurableLink target={'_blank'} to={window.spaBase + URL_STOCK_ITEM(stockItemUuid)}>
|
45
44
|
{useItemCommonNameAsDisplay ? commonName : drugName}
|
46
|
-
</
|
45
|
+
</ConfigurableLink>
|
47
46
|
);
|
48
47
|
};
|
49
48
|
|
@@ -9,8 +9,7 @@ import {
|
|
9
9
|
TableHeader,
|
10
10
|
TableRow,
|
11
11
|
} from '@carbon/react';
|
12
|
-
import { Edit, TrashCan } from '@carbon/react/icons';
|
13
|
-
import { isDesktop, launchWorkspace } from '@openmrs/esm-framework';
|
12
|
+
import { ArrowLeft, ArrowRight, Edit, TrashCan } from '@carbon/react/icons';
|
14
13
|
import React, { useCallback, useMemo } from 'react';
|
15
14
|
import { useFormContext } from 'react-hook-form';
|
16
15
|
import { useTranslation } from 'react-i18next';
|
@@ -20,7 +19,6 @@ import { getStockOperationUniqueId } from '../../stock-operation.utils';
|
|
20
19
|
import { BaseStockOperationItemFormData, StockOperationItemDtoSchema } from '../../validation-schema';
|
21
20
|
import useOperationTypePermisions from '../hooks/useOperationTypePermisions';
|
22
21
|
import StockItemSearch from '../input-components/stock-item-search.component';
|
23
|
-
import { StockItemFormProps } from '../stock-item-form/stock-item-form.workspace';
|
24
22
|
import QuantityUomCell from './quantity-uom-cell.component';
|
25
23
|
import StockAvailability from './stock-availability-cell.component';
|
26
24
|
import StockOperationItemBatchNoCell from './stock-operation-item-batch-no-cell.component';
|
@@ -33,12 +31,14 @@ type StockOperationItemsFormStepProps = {
|
|
33
31
|
stockOperationType: StockOperationType;
|
34
32
|
onNext?: () => void;
|
35
33
|
onPrevious?: () => void;
|
34
|
+
onLaunchItemsForm?: (stockOperationItem?: BaseStockOperationItemFormData) => void;
|
36
35
|
};
|
37
36
|
const StockOperationItemsFormStep: React.FC<StockOperationItemsFormStepProps> = ({
|
38
37
|
stockOperationType,
|
39
38
|
stockOperation,
|
40
39
|
onNext,
|
41
40
|
onPrevious,
|
41
|
+
onLaunchItemsForm,
|
42
42
|
}) => {
|
43
43
|
const { t } = useTranslation();
|
44
44
|
const operationTypePermision = useOperationTypePermisions(stockOperationType);
|
@@ -103,29 +103,6 @@ const StockOperationItemsFormStep: React.FC<StockOperationItemsFormStepProps> =
|
|
103
103
|
];
|
104
104
|
}, [operationTypePermision, t]);
|
105
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
106
|
const handleDeleteStockOperationItem = useCallback(
|
130
107
|
(item: BaseStockOperationItemFormData) => {
|
131
108
|
form.setValue('stockOperationItems', observableOperationItems.filter((i) => i.uuid !== item.uuid) as any);
|
@@ -183,7 +160,7 @@ const StockOperationItemsFormStep: React.FC<StockOperationItemsFormStepProps> =
|
|
183
160
|
kind="ghost"
|
184
161
|
renderIcon={Edit}
|
185
162
|
onClick={() => {
|
186
|
-
|
163
|
+
onLaunchItemsForm?.(item);
|
187
164
|
}}
|
188
165
|
/>
|
189
166
|
<Button
|
@@ -194,14 +171,14 @@ const StockOperationItemsFormStep: React.FC<StockOperationItemsFormStepProps> =
|
|
194
171
|
kind="ghost"
|
195
172
|
renderIcon={TrashCan}
|
196
173
|
onClick={() => {
|
197
|
-
|
174
|
+
onLaunchItemsForm?.(item);
|
198
175
|
}}
|
199
176
|
/>
|
200
177
|
</>
|
201
178
|
),
|
202
179
|
};
|
203
180
|
});
|
204
|
-
}, [observableOperationItems,
|
181
|
+
}, [observableOperationItems, onLaunchItemsForm, stockOperationType]);
|
205
182
|
|
206
183
|
const headerTitle = t('stockoperationItems', 'Stock operation items');
|
207
184
|
|
@@ -210,22 +187,10 @@ const StockOperationItemsFormStep: React.FC<StockOperationItemsFormStepProps> =
|
|
210
187
|
<div className={styles.tableContainer}>
|
211
188
|
<div className={styles.heading}>
|
212
189
|
<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
190
|
</div>
|
226
191
|
<StockItemSearch
|
227
192
|
onSelectedItem={(stockItem) =>
|
228
|
-
|
193
|
+
onLaunchItemsForm({
|
229
194
|
uuid: `new-item-${getStockOperationUniqueId()}`,
|
230
195
|
stockItemUuid: stockItem.uuid,
|
231
196
|
hasExpiration: stockItem.hasExpiration,
|
@@ -233,7 +198,6 @@ const StockOperationItemsFormStep: React.FC<StockOperationItemsFormStepProps> =
|
|
233
198
|
})
|
234
199
|
}
|
235
200
|
/>
|
236
|
-
|
237
201
|
<DataTable
|
238
202
|
rows={tableRows ?? []}
|
239
203
|
headers={headers}
|
@@ -245,13 +209,12 @@ const StockOperationItemsFormStep: React.FC<StockOperationItemsFormStepProps> =
|
|
245
209
|
<Table {...getTableProps()}>
|
246
210
|
<TableHead>
|
247
211
|
<TableRow>
|
248
|
-
{headers.map((header
|
212
|
+
{headers.map((header) => (
|
249
213
|
<TableHeader
|
250
214
|
{...getHeaderProps({
|
251
215
|
header,
|
252
216
|
isSortable: false,
|
253
217
|
})}
|
254
|
-
className={isDesktop ? styles.desktopHeader : styles.tabletHeader}
|
255
218
|
style={header?.styles}
|
256
219
|
key={`${header.key}`}
|
257
220
|
>
|
@@ -272,7 +235,19 @@ const StockOperationItemsFormStep: React.FC<StockOperationItemsFormStepProps> =
|
|
272
235
|
</Table>
|
273
236
|
</TableContainer>
|
274
237
|
)}
|
275
|
-
|
238
|
+
/>
|
239
|
+
<div className={styles.btnSet}>
|
240
|
+
{typeof onNext === 'function' && (
|
241
|
+
<Button kind="primary" onClick={onNext} renderIcon={ArrowRight}>
|
242
|
+
{t('next', 'Next')}
|
243
|
+
</Button>
|
244
|
+
)}
|
245
|
+
{typeof onPrevious === 'function' && (
|
246
|
+
<Button kind="secondary" onClick={onPrevious} renderIcon={ArrowLeft} hasIconOnly data-testid="previous-btn">
|
247
|
+
{/* {t('previous', 'Previous')} */}
|
248
|
+
</Button>
|
249
|
+
)}
|
250
|
+
</div>
|
276
251
|
</div>
|
277
252
|
</div>
|
278
253
|
);
|
package/src/stock-operations/stock-operations-forms/steps/stock-operation-items-form-step.scc.scss
CHANGED
@@ -3,23 +3,6 @@
|
|
3
3
|
@use '@carbon/type';
|
4
4
|
@import '~@openmrs/esm-styleguide/src/vars';
|
5
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
6
|
.dataTable {
|
24
7
|
width: 100%;
|
25
8
|
}
|
@@ -57,8 +40,11 @@
|
|
57
40
|
}
|
58
41
|
|
59
42
|
.btnSet {
|
43
|
+
width: 100%;
|
44
|
+
flex: 1;
|
60
45
|
display: flex;
|
61
|
-
flex-direction: row;
|
46
|
+
flex-direction: row-reverse;
|
62
47
|
gap: layout.$spacing-03;
|
63
48
|
align-items: center;
|
49
|
+
margin-top: layout.$spacing-03;
|
64
50
|
}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import { Button, Column, InlineLoading, RadioButton, RadioButtonGroup, Stack } from '@carbon/react';
|
2
|
-
import { Departure, ListChecked, Save, SendFilled } from '@carbon/react/icons';
|
2
|
+
import { ArrowLeft, ArrowRight, Departure, ListChecked, Save, SendFilled } from '@carbon/react/icons';
|
3
3
|
import { restBaseUrl, showSnackbar } from '@openmrs/esm-framework';
|
4
4
|
import React, { useCallback, useMemo, useState } from 'react';
|
5
5
|
import { useFormContext } from 'react-hook-form';
|
@@ -21,12 +21,14 @@ type StockOperationSubmissionFormStepProps = {
|
|
21
21
|
stockOperation?: StockOperationDTO;
|
22
22
|
stockOperationType: StockOperationType;
|
23
23
|
onNext?: () => void;
|
24
|
+
dismissWorkspace?: () => void;
|
24
25
|
};
|
25
26
|
const StockOperationSubmissionFormStep: React.FC<StockOperationSubmissionFormStepProps> = ({
|
26
27
|
onPrevious,
|
27
28
|
stockOperationType,
|
28
29
|
stockOperation,
|
29
30
|
onNext,
|
31
|
+
dismissWorkspace,
|
30
32
|
}) => {
|
31
33
|
const { t } = useTranslation();
|
32
34
|
const operationTypePermision = useOperationTypePermisions(stockOperationType);
|
@@ -95,6 +97,7 @@ const StockOperationSubmissionFormStep: React.FC<StockOperationSubmissionFormSte
|
|
95
97
|
: createStockOperation(payload as any));
|
96
98
|
result = resp.data; // Store the response data
|
97
99
|
handleMutate(`${restBaseUrl}/stockmanagement/stockoperation`);
|
100
|
+
dismissWorkspace?.();
|
98
101
|
showSnackbar({
|
99
102
|
isLowContrast: true,
|
100
103
|
title: stockOperation
|
@@ -117,7 +120,7 @@ const StockOperationSubmissionFormStep: React.FC<StockOperationSubmissionFormSte
|
|
117
120
|
}
|
118
121
|
})(); // Call handleSubmit to trigger validation and submission
|
119
122
|
return result; // Return the result after handleSubmit completes
|
120
|
-
}, [form, stockOperation, t, approvalRequired, isStockIssueOperation]);
|
123
|
+
}, [form, stockOperation, t, approvalRequired, isStockIssueOperation, dismissWorkspace]);
|
121
124
|
|
122
125
|
const handleComplete = useCallback(() => {
|
123
126
|
handleSave().then((operation) => {
|
@@ -143,18 +146,6 @@ const StockOperationSubmissionFormStep: React.FC<StockOperationSubmissionFormSte
|
|
143
146
|
? t('submitAndDispatch', 'Submit/Dispatch')
|
144
147
|
: t('submitAndComplete', 'Submit/Complete')}
|
145
148
|
</h4>
|
146
|
-
<div className={styles.btnSet}>
|
147
|
-
{typeof onPrevious === 'function' && (
|
148
|
-
<Button kind="secondary" onClick={onPrevious}>
|
149
|
-
Previous
|
150
|
-
</Button>
|
151
|
-
)}
|
152
|
-
{typeof onNext === 'function' && (
|
153
|
-
<Button kind="primary" onClick={onNext}>
|
154
|
-
Next
|
155
|
-
</Button>
|
156
|
-
)}
|
157
|
-
</div>
|
158
149
|
</div>
|
159
150
|
|
160
151
|
<Column>
|
@@ -163,7 +154,7 @@ const StockOperationSubmissionFormStep: React.FC<StockOperationSubmissionFormSte
|
|
163
154
|
legendText={t('doesThisTransactionRequireApproval', 'Does the transaction require approval ?')}
|
164
155
|
onChange={handleRadioButtonChange}
|
165
156
|
readOnly={!editable}
|
166
|
-
valueSelected={approvalRequired === true}
|
157
|
+
valueSelected={approvalRequired === true ? true : approvalRequired === false ? false : null}
|
167
158
|
>
|
168
159
|
<RadioButton value={true} id="rbgApprovelRequired-true" labelText={t('yes', 'Yes')} />
|
169
160
|
<RadioButton value={false} id="rbgApprovelRequired-false" labelText={t('no', 'No')} />
|
@@ -176,6 +167,7 @@ const StockOperationSubmissionFormStep: React.FC<StockOperationSubmissionFormSte
|
|
176
167
|
{!operationTypePermision.requiresDispatchAcknowledgement && !approvalRequired && (
|
177
168
|
<Button
|
178
169
|
name="complete"
|
170
|
+
data-testid="complete-button"
|
179
171
|
type="button"
|
180
172
|
style={{ margin: '4px' }}
|
181
173
|
className="submitButton"
|
@@ -191,6 +183,7 @@ const StockOperationSubmissionFormStep: React.FC<StockOperationSubmissionFormSte
|
|
191
183
|
name="dispatch"
|
192
184
|
type="button"
|
193
185
|
style={{ margin: '4px' }}
|
186
|
+
data-testid="dipatch-button"
|
194
187
|
className="submitButton"
|
195
188
|
kind="primary"
|
196
189
|
onClick={handleDispatch}
|
@@ -236,6 +229,18 @@ const StockOperationSubmissionFormStep: React.FC<StockOperationSubmissionFormSte
|
|
236
229
|
</Button>
|
237
230
|
</Column>
|
238
231
|
)}
|
232
|
+
<div className={styles.btnSet}>
|
233
|
+
{typeof onNext === 'function' && (
|
234
|
+
<Button kind="tertiary" onClick={onNext} renderIcon={ArrowRight}>
|
235
|
+
{t('next', 'Next')}
|
236
|
+
</Button>
|
237
|
+
)}
|
238
|
+
{typeof onPrevious === 'function' && (
|
239
|
+
<Button kind="tertiary" onClick={onPrevious} renderIcon={ArrowLeft} hasIconOnly data-testid="previous-btn">
|
240
|
+
{/* {t('previous', 'Previous')} */}
|
241
|
+
</Button>
|
242
|
+
)}
|
243
|
+
</div>
|
239
244
|
</Stack>
|
240
245
|
);
|
241
246
|
};
|
@@ -1,10 +1,12 @@
|
|
1
|
-
import { showSnackbar } from '@openmrs/esm-framework';
|
1
|
+
import { parseDate, showSnackbar } from '@openmrs/esm-framework';
|
2
2
|
import React, { useEffect, useMemo } from 'react';
|
3
3
|
import { useFormContext } from 'react-hook-form';
|
4
4
|
import { useTranslation } from 'react-i18next';
|
5
5
|
import { OperationType, StockOperationType } from '../../core/api/types/stockOperation/StockOperationType';
|
6
|
-
import {
|
6
|
+
import { useStockOperationAndItems } from '../stock-operations.resource';
|
7
7
|
import { getStockOperationItemFormSchema, StockOperationItemDtoSchema } from '../validation-schema';
|
8
|
+
import { pick } from '../../core/utils/utils';
|
9
|
+
import { Loading } from '@carbon/react';
|
8
10
|
|
9
11
|
type StockIssueFormInitializerWithRelatedRequisitionOperationProps = {
|
10
12
|
stockRequisitionUuid: string;
|
@@ -16,11 +18,12 @@ const StockIssueFormInitializerWithRelatedRequisitionOperation: React.FC<
|
|
16
18
|
> = ({ stockRequisitionUuid, stockOperationType }) => {
|
17
19
|
const form = useFormContext<StockOperationItemDtoSchema>();
|
18
20
|
const { t } = useTranslation();
|
19
|
-
const { error, items: stockOperation, isLoading } =
|
21
|
+
const { error, items: stockOperation, isLoading } = useStockOperationAndItems(stockRequisitionUuid);
|
20
22
|
const { setValue } = form;
|
21
23
|
const stockOperationItemFormSchema = useMemo(() => {
|
22
24
|
return getStockOperationItemFormSchema(OperationType.STOCK_ISSUE_OPERATION_TYPE);
|
23
25
|
}, []);
|
26
|
+
|
24
27
|
const items = form.watch('stockOperationItems');
|
25
28
|
// initialize form values with requisition values for Stock issue operation type
|
26
29
|
useEffect(() => {
|
@@ -30,6 +33,17 @@ const StockIssueFormInitializerWithRelatedRequisitionOperation: React.FC<
|
|
30
33
|
setValue('destinationUuid', stockOperation.destinationUuid);
|
31
34
|
setValue('requisitionStockOperationUuid', stockRequisitionUuid);
|
32
35
|
setValue('operationTypeUuid', stockOperationType.uuid);
|
36
|
+
setValue('responsiblePersonUuid', stockOperation.responsiblePersonUuid);
|
37
|
+
setValue('responsiblePersonOther', stockOperation.responsiblePersonOther);
|
38
|
+
setValue(
|
39
|
+
'stockOperationItems',
|
40
|
+
(stockOperation?.stockOperationItems?.map((item) =>
|
41
|
+
pick(
|
42
|
+
{ ...item, expiration: item.expiration ? parseDate(item.expiration as any) : undefined },
|
43
|
+
stockOperationItemFormSchema.keyof().options,
|
44
|
+
),
|
45
|
+
) ?? []) as any,
|
46
|
+
);
|
33
47
|
}
|
34
48
|
}, [stockOperation, stockOperationItemFormSchema, setValue, items, stockOperationType, stockRequisitionUuid]);
|
35
49
|
|
@@ -49,6 +63,9 @@ const StockIssueFormInitializerWithRelatedRequisitionOperation: React.FC<
|
|
49
63
|
});
|
50
64
|
}
|
51
65
|
}, [stockRequisitionUuid, error, t]);
|
66
|
+
|
67
|
+
if (isLoading) return <Loading active description="Loading" />;
|
68
|
+
|
52
69
|
return <React.Fragment />;
|
53
70
|
};
|
54
71
|
|
package/src/stock-operations/stock-operations-forms/stock-item-form/stock-item-form.workspace.tsx
CHANGED
@@ -30,10 +30,10 @@ export interface StockItemFormProps {
|
|
30
30
|
stockOperationType: StockOperationType;
|
31
31
|
stockOperationItem: BaseStockOperationItemFormData;
|
32
32
|
onSave?: (data: BaseStockOperationItemFormData) => void;
|
33
|
+
onBack?: () => void;
|
33
34
|
}
|
34
35
|
|
35
|
-
|
36
|
-
const StockItemForm: React.FC<Props> = ({ closeWorkspace, stockOperationType, stockOperationItem, onSave }) => {
|
36
|
+
const StockItemForm: React.FC<StockItemFormProps> = ({ stockOperationType, stockOperationItem, onSave, onBack }) => {
|
37
37
|
const operationType = useMemo(() => {
|
38
38
|
return operationFromString(stockOperationType.operationType);
|
39
39
|
}, [stockOperationType]);
|
@@ -65,8 +65,6 @@ const StockItemForm: React.FC<Props> = ({ closeWorkspace, stockOperationType, st
|
|
65
65
|
|
66
66
|
const onSubmit = (data: z.infer<typeof formschema>) => {
|
67
67
|
onSave?.(data);
|
68
|
-
closeWorkspace();
|
69
|
-
// Implementation of adding or updating itsms in items table
|
70
68
|
};
|
71
69
|
return (
|
72
70
|
<Form onSubmit={form.handleSubmit(onSubmit)} className={styles.form}>
|
@@ -197,7 +195,7 @@ const StockItemForm: React.FC<Props> = ({ closeWorkspace, stockOperationType, st
|
|
197
195
|
</Stack>
|
198
196
|
|
199
197
|
<ButtonSet className={styles.buttonSet}>
|
200
|
-
<Button className={styles.button} kind="secondary" onClick={
|
198
|
+
<Button className={styles.button} kind="secondary" onClick={onBack}>
|
201
199
|
{t('discard', 'Discard')}
|
202
200
|
</Button>
|
203
201
|
<Button className={styles.button} kind="primary" type="submit" disabled={form.formState.isSubmitting}>
|