@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.
- package/__mocks__/index.ts +1 -0
- package/__mocks__/operation-type.mock.ts +532 -0
- package/dist/155.js +1 -0
- package/dist/155.js.map +1 -0
- package/dist/172.js +1 -1
- package/dist/20.js +1 -1
- package/dist/290.js +1 -1
- package/dist/493.js +2 -0
- package/dist/493.js.map +1 -0
- package/dist/606.js +1 -1
- package/dist/627.js +1 -1
- package/dist/922.js +1 -0
- package/dist/922.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 +75 -51
- package/dist/openmrs-esm-stock-management-app.js.map +1 -1
- package/dist/routes.json +1 -1
- package/package.json +1 -1
- package/src/config-schema.ts +6 -0
- package/src/core/utils/utils.ts +29 -0
- package/src/index.ts +4 -0
- package/src/routes.json +9 -0
- package/src/stock-items/add-stock-item/transactions/printout/transactions-stockcard-printout.component.tsx +8 -12
- package/src/stock-items/add-stock-item/transactions/transactions.component.tsx +8 -12
- package/src/stock-items/stock-items.resource.ts +5 -5
- package/src/stock-lookups/stock-lookups.resource.ts +2 -2
- package/src/stock-operations/add-stock-operation/stock-operations-expanded-row/stock-items-table.scss +34 -0
- package/src/stock-operations/add-stock-operation/stock-operations-expanded-row/stock-items-table.tsx +111 -0
- package/src/stock-operations/add-stock-operation/stock-operations-expanded-row/stock-operation-expanded-row.component.tsx +87 -0
- package/src/stock-operations/add-stock-operation/stock-operations-expanded-row/stock-operation-expanded-row.scss +31 -0
- package/src/stock-operations/add-stock-operation/stock-operations-expanded-row/stock-operations-status.tsx +45 -0
- package/src/stock-operations/edit-stock-operation/edit-stock-operation-action-menu.component.tsx +41 -16
- package/src/stock-operations/stock-operation-reference.component.tsx +64 -0
- package/src/stock-operations/stock-operation-status/stock-operation-status-row.tsx +77 -0
- package/src/stock-operations/stock-operation-status/stock-operation-status.scss +32 -0
- package/src/stock-operations/stock-operation-status/stock-operation-status.tsx +45 -0
- package/src/stock-operations/stock-operation-types-selector/stock-operation-types-selector.component.tsx +30 -29
- package/src/stock-operations/stock-operation.utils.tsx +16 -79
- package/src/stock-operations/stock-operations-dialog/stock-operations-issue-stock-button.component.tsx +27 -39
- package/src/stock-operations/stock-operations-dialog/stock-operations-print-button.component.tsx +51 -59
- package/src/stock-operations/{stock-item-selector/stock-item-selector.resource.tsx → stock-operations-forms/hooks/useFilterableStockItems.ts} +4 -4
- package/src/stock-operations/stock-operations-forms/hooks/useFilteredOperationTypesByRoles.ts +30 -0
- package/src/stock-operations/stock-operations-forms/hooks/useOperationTypePermisions.ts +29 -0
- package/src/stock-operations/stock-operations-forms/hooks/useParties.ts +73 -0
- package/src/stock-operations/{users-selector/users-selector.resource.tsx → stock-operations-forms/hooks/useSearchUser.ts} +9 -7
- package/src/stock-operations/{batch-no-selector/batch-no-selector.resource.tsx → stock-operations-forms/hooks/useStockItemBatchNumbers.ts} +3 -3
- package/src/stock-operations/stock-operations-forms/hooks/useStockOperationLinks.ts +20 -0
- package/src/stock-operations/stock-operations-forms/input-components/batch-no-selector.component.tsx +72 -0
- package/src/stock-operations/stock-operations-forms/input-components/batch-no-selector.test.tsx +90 -0
- 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
- package/src/stock-operations/stock-operations-forms/input-components/qty-uim-selector.test.tsx +157 -0
- package/src/stock-operations/stock-operations-forms/input-components/quantity-uom-selector.component.tsx +53 -0
- package/src/stock-operations/stock-operations-forms/input-components/stock-item-search.component.tsx +79 -0
- package/src/stock-operations/stock-operations-forms/input-components/stock-operation-reason-selector.component.tsx +59 -0
- package/src/stock-operations/stock-operations-forms/input-components/stock-operation-reason-selector.test.tsx +216 -0
- package/src/stock-operations/{batch-no-selector → stock-operations-forms/input-components}/unique-batch-no-entry-input.component.tsx +12 -7
- package/src/stock-operations/stock-operations-forms/input-components/user-selector.test.tsx +110 -0
- package/src/stock-operations/stock-operations-forms/input-components/users-selector.component.tsx +111 -0
- package/src/stock-operations/stock-operations-forms/step1.test.tsx +303 -0
- package/src/stock-operations/stock-operations-forms/step2.test.tsx +254 -0
- package/src/stock-operations/stock-operations-forms/step3.test.tsx +223 -0
- package/src/stock-operations/stock-operations-forms/steps/base-operation-details-form-step.tsx +241 -0
- package/src/stock-operations/stock-operations-forms/steps/quantity-uom-cell.component.tsx +33 -0
- package/src/stock-operations/stock-operations-forms/steps/received-items.component.tsx +110 -0
- package/src/stock-operations/stock-operations-forms/steps/stock-availability-cell.component.tsx +51 -0
- package/src/stock-operations/stock-operations-forms/steps/stock-operation-item-batch-no-cell.component.tsx +40 -0
- package/src/stock-operations/stock-operations-forms/steps/stock-operation-item-cell.component.tsx +50 -0
- package/src/stock-operations/stock-operations-forms/steps/stock-operation-item-expiry-cell.component.tsx +41 -0
- package/src/stock-operations/stock-operations-forms/steps/stock-operation-items-form-step.component.tsx +281 -0
- package/src/stock-operations/stock-operations-forms/steps/stock-operation-items-form-step.scc.scss +64 -0
- package/src/stock-operations/stock-operations-forms/steps/stock-operation-submission-form-step.component.tsx +243 -0
- package/src/stock-operations/stock-operations-forms/stock-issue-form-initializer-with-related-requisition-operation.component.tsx +55 -0
- package/src/stock-operations/stock-operations-forms/stock-item-form/stock-item-form.scss +41 -0
- package/src/stock-operations/stock-operations-forms/stock-item-form/stock-item-form.workspace.tsx +211 -0
- package/src/stock-operations/stock-operations-forms/stock-operation-form-header.component.tsx +166 -0
- package/src/stock-operations/stock-operations-forms/stock-operation-form.component.tsx +205 -0
- package/src/stock-operations/stock-operations-forms/stock-operation-form.scss +111 -0
- package/src/stock-operations/stock-operations-forms/stock-operation-related-link.component.tsx +45 -0
- package/src/stock-operations/stock-operations-forms/stock-operation-stepper/stepper.scss +41 -0
- package/src/stock-operations/stock-operations-forms/stock-operation-stepper/stock-operation-stepper.component.tsx +52 -0
- package/src/stock-operations/stock-operations-forms/stock-operations-form-utils.ts +32 -0
- package/src/stock-operations/stock-operations-table.component.tsx +57 -92
- package/src/stock-operations/stock-operations.resource.ts +16 -13
- package/src/stock-operations/validation-schema.ts +72 -14
- package/dist/766.js +0 -2
- package/dist/766.js.map +0 -1
- package/dist/822.js +0 -1
- package/dist/822.js.map +0 -1
- package/src/stock-operations/add-stock-operation/add-stock-operation.component.tsx +0 -349
- package/src/stock-operations/add-stock-operation/add-stock-operation.resource.tsx +0 -27
- package/src/stock-operations/add-stock-operation/add-stock-operation.scss +0 -60
- package/src/stock-operations/add-stock-operation/add-stock-operation.test.tsx +0 -192
- package/src/stock-operations/add-stock-operation/add-stock-operation.utils.tsx +0 -152
- package/src/stock-operations/add-stock-operation/add-stock-utils.ts +0 -103
- package/src/stock-operations/add-stock-operation/base-operation-details.component.tsx +0 -439
- package/src/stock-operations/add-stock-operation/base-operation-details.scss +0 -30
- package/src/stock-operations/add-stock-operation/received-items.component.tsx +0 -93
- package/src/stock-operations/add-stock-operation/stock-item-search/stock-item-search.component.tsx +0 -70
- package/src/stock-operations/add-stock-operation/stock-items-addition-row.component.tsx +0 -357
- package/src/stock-operations/add-stock-operation/stock-items-addition-row.resource.tsx +0 -0
- package/src/stock-operations/add-stock-operation/stock-items-addition-row.scss +0 -12
- package/src/stock-operations/add-stock-operation/stock-items-addition-row.test.tsx +0 -10
- package/src/stock-operations/add-stock-operation/stock-items-addition.component.scss +0 -17
- package/src/stock-operations/add-stock-operation/stock-items-addition.component.tsx +0 -254
- package/src/stock-operations/add-stock-operation/stock-operation-context/useStockOperationContext.tsx +0 -16
- package/src/stock-operations/add-stock-operation/stock-operation-reference.component.tsx +0 -39
- package/src/stock-operations/add-stock-operation/stock-operation-related-link.component.tsx +0 -38
- package/src/stock-operations/add-stock-operation/stock-operation-status.component.tsx +0 -170
- package/src/stock-operations/add-stock-operation/stock-operation-submission.component.tsx +0 -189
- package/src/stock-operations/add-stock-operation/stock-operation-submission.test.tsx +0 -138
- package/src/stock-operations/add-stock-operation/types.ts +0 -55
- package/src/stock-operations/add-stock-operation/validationSchema.ts +0 -54
- package/src/stock-operations/batch-no-selector/batch-no-selector.component.tsx +0 -114
- package/src/stock-operations/batch-no-selector/batch-no-selector.scss +0 -0
- package/src/stock-operations/batch-no-selector/batch-no-selector.test.tsx +0 -101
- package/src/stock-operations/party-selector/party-selector.component.tsx +0 -59
- package/src/stock-operations/qty-uom-selector/qty-uom-selector.component.tsx +0 -65
- package/src/stock-operations/qty-uom-selector/qty-uom-selector.resource.tsx +0 -0
- package/src/stock-operations/qty-uom-selector/qty-uom-selector.scss +0 -0
- package/src/stock-operations/qty-uom-selector/qty-uom-selector.test.tsx +0 -10
- package/src/stock-operations/stock-item-selector/stock-item-selector.component.tsx +0 -69
- package/src/stock-operations/stock-item-selector/stock-item-selector.scss +0 -0
- package/src/stock-operations/stock-item-selector/stock-item-selector.test.tsx +0 -10
- package/src/stock-operations/stock-operation-reason-selector/stock-operation-reason-selector.component.tsx +0 -62
- package/src/stock-operations/users-selector/users-selector.component.tsx +0 -75
- /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;
|
package/src/stock-operations/stock-operations-forms/steps/stock-operation-item-cell.component.tsx
ADDED
@@ -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;
|
package/src/stock-operations/stock-operations-forms/steps/stock-operation-items-form-step.scc.scss
ADDED
@@ -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
|
+
}
|