@openmrs/esm-stock-management-app 3.1.1-pre.1179 → 3.1.1-pre.1184
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/.husky/pre-commit +0 -5
- package/.husky/pre-push +0 -3
- package/dist/130.js +1 -1
- package/dist/130.js.map +1 -1
- package/dist/2177.js +1 -1
- package/dist/2177.js.map +1 -1
- package/dist/3220.js +1 -1
- package/dist/3220.js.map +1 -1
- package/dist/4300.js +1 -1
- package/dist/4732.js +1 -1
- package/dist/4732.js.map +1 -1
- package/dist/5125.js +1 -1
- package/dist/5125.js.map +1 -1
- package/dist/5333.js +1 -1
- package/dist/5333.js.map +1 -1
- package/dist/5609.js +1 -1
- package/dist/5609.js.map +1 -1
- package/dist/6184.js +1 -1
- package/dist/6184.js.map +1 -1
- package/dist/6757.js +1 -1
- package/dist/6757.js.map +1 -1
- package/dist/8161.js +1 -1
- package/dist/8161.js.map +1 -1
- package/dist/9186.js +1 -1
- package/dist/9186.js.map +1 -1
- package/dist/main.js +1 -1
- package/dist/main.js.map +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/constants.ts +2 -3
- package/src/core/components/carbon/controlled-combo-box.component.tsx +12 -9
- package/src/core/components/carbon/controlled-radio-button-group.component.tsx +21 -16
- package/src/core/components/table/table.component.tsx +26 -17
- package/src/core/components/table/table.scss +4 -0
- package/src/core/components/table/types.ts +12 -0
- package/src/core/components/tabs/vertical-tabs.component.tsx +2 -6
- package/src/declarations.d.ts +0 -3
- package/src/stock-home/stock-home-inventory-card.component.tsx +2 -2
- package/src/stock-items/add-stock-item/add-stock-item.component.tsx +1 -1
- package/src/stock-items/add-stock-item/batch-information/batch-information-locations/batch-information-locations-filter.component.tsx +0 -3
- package/src/stock-items/add-stock-item/batch-information/batch-information.component.tsx +4 -4
- package/src/stock-items/add-stock-item/dispensing-package-measurement/dispensing-package-measurement.component.tsx +2 -5
- package/src/stock-items/add-stock-item/drug-selector/drug-selector.component.tsx +4 -8
- package/src/stock-items/add-stock-item/packaging-units/packaging-units-delete.modal.tsx +2 -2
- package/src/stock-items/add-stock-item/packaging-units/packaging-units.component.tsx +32 -18
- package/src/stock-items/add-stock-item/packaging-units-concept-selector/packaging-units-concept-selector.component.tsx +2 -5
- package/src/stock-items/add-stock-item/preferred-vendor-selector/preferred-vendor-selector.component.tsx +0 -3
- package/src/stock-items/add-stock-item/stock-item-category-selector/stock-item-category-selector.component.tsx +2 -5
- package/src/stock-items/add-stock-item/stock-item-details/stock-item-details.component.tsx +10 -10
- package/src/stock-items/add-stock-item/stock-item-references/stock-item-references.component.tsx +36 -27
- package/src/stock-items/add-stock-item/stock-item-references/stock-references-selector.component.tsx +2 -5
- package/src/stock-items/add-stock-item/stock-item-rules/add-stock-rules.component.tsx +16 -16
- package/src/stock-items/add-stock-item/stock-item-rules/stock-item-rules.component.tsx +10 -9
- package/src/stock-items/add-stock-item/stock-item-rules/stock-rules-filter.component.tsx +8 -3
- package/src/stock-items/add-stock-item/stock-item-units-edit/stock-item-units-edit.component.tsx +2 -2
- package/src/stock-items/add-stock-item/transactions/printout/printable-bincard-transaction-header.component.tsx +5 -5
- package/src/stock-items/add-stock-item/transactions/printout/printable-stockcard-transaction-header.component.tsx +3 -3
- package/src/stock-items/add-stock-item/transactions/printout/transactions-print-action.component.tsx +2 -5
- package/src/stock-items/add-stock-item/transactions/printout/transactions-print-bincard-preview.modal.tsx +1 -1
- package/src/stock-items/add-stock-item/transactions/transaction-filters/transaction-locations-filter.component.tsx +0 -3
- package/src/stock-items/components/filter-stock-items/filter-stock-items.component.tsx +6 -4
- package/src/stock-items/edit-stock-item/edit-stock-item-action-menu.component.tsx +1 -1
- package/src/stock-items/stock-items-table.component.tsx +21 -15
- package/src/stock-items/stock-items-table.resource.ts +1 -1
- package/src/stock-items/stock-items.resource.ts +1 -2
- package/src/stock-locations/add-locations-form.workspace.tsx +9 -11
- package/src/stock-locations/location-admin-form.component.tsx +9 -4
- package/src/stock-locations/stock-locations-table.component.tsx +3 -3
- package/src/stock-lookups/stock-lookups.resource.ts +2 -2
- package/src/stock-management-admin-card-link.component.tsx +1 -1
- package/src/stock-operations/add-stock-operation/stock-operations-expanded-row/stock-items-table.tsx +12 -8
- package/src/stock-operations/add-stock-operation/stock-operations-expanded-row/stock-operation-expanded-row.component.tsx +4 -4
- package/src/stock-operations/edit-stock-operation/edit-stock-operation-action-menu.component.tsx +6 -7
- package/src/stock-operations/stock-operation-operations-filter/stock-operation-operations-filter.component.tsx +7 -3
- package/src/stock-operations/stock-operation-sources-filter/stock-operation-sources-filter.component.tsx +8 -4
- package/src/stock-operations/stock-operation-statuses-filter/stock-operation-statuses-filter.component.tsx +16 -14
- package/src/stock-operations/stock-operation-types-selector/stock-operation-types-selector.component.tsx +4 -4
- package/src/stock-operations/stock-operations-filters.component.tsx +4 -2
- package/src/stock-operations/stock-operations-forms/input-components/batch-no-selector.component.tsx +2 -2
- package/src/stock-operations/stock-operations-forms/input-components/batch-no-selector.test.tsx +1 -1
- package/src/stock-operations/stock-operations-forms/input-components/qty-uim-selector.test.tsx +1 -1
- package/src/stock-operations/stock-operations-forms/input-components/quantity-uom-selector.component.tsx +3 -3
- package/src/stock-operations/stock-operations-forms/input-components/stock-item-search.component.tsx +3 -4
- package/src/stock-operations/stock-operations-forms/input-components/stock-operation-reason-selector.component.tsx +3 -3
- package/src/stock-operations/stock-operations-forms/input-components/users-selector.component.tsx +6 -6
- package/src/stock-operations/stock-operations-forms/step2.test.tsx +1 -5
- package/src/stock-operations/stock-operations-forms/steps/base-operation-details-form-step.tsx +15 -16
- package/src/stock-operations/stock-operations-forms/steps/quantity-uom-cell.component.tsx +1 -1
- package/src/stock-operations/stock-operations-forms/steps/received-items.component.tsx +2 -2
- package/src/stock-operations/stock-operations-forms/steps/stock-operation-items-form-step.component.tsx +24 -21
- package/src/stock-operations/stock-operations-forms/steps/stock-operation-submission-form-step.component.tsx +4 -4
- package/src/stock-operations/stock-operations-forms/stock-item-form/stock-item-form.workspace.tsx +60 -53
- package/src/stock-operations/stock-operations-forms/stock-operation-form.component.tsx +17 -12
- package/src/stock-operations/stock-operations-modal/stock-operations-completed-dispatch-button.component.tsx +1 -1
- package/src/stock-operations/stock-operations-modal/stock-operations-issue-stock-button.component.tsx +1 -1
- package/src/stock-operations/stock-operations-modal/stock-operations-print-button.component.tsx +6 -2
- package/src/stock-operations/stock-operations-modal/stock-operations-reject-button.component.tsx +4 -5
- package/src/stock-operations/stock-operations-modal/stock-operations.modal.tsx +4 -2
- package/src/stock-operations/stock-operations-table.component.tsx +16 -12
- package/src/stock-operations/stock-operations-table.resource.ts +1 -0
- package/src/stock-reports/generate-report/create-stock-report.workspace.tsx +31 -35
- package/src/stock-reports/report-list/stock-reports.component.tsx +5 -9
- package/src/stock-reports/stock-reports.resource.ts +1 -1
- package/src/stock-sources/add-stock-sources/add-stock-sources.workspace.tsx +6 -6
- package/src/stock-sources/stock-sources-items-table.component.tsx +14 -10
- package/src/stock-user-role-scopes/add-stock-user-scope/add-stock-user-role-scope.workspace.tsx +52 -53
- package/src/stock-user-role-scopes/delete-stock-user-scope/delete-stock-user-scope.component.tsx +1 -1
- package/src/stock-user-role-scopes/delete-stock-user-scope.modal.tsx +4 -1
- package/src/stock-user-role-scopes/stock-user-role-scopes-items-table.component.tsx +8 -12
- package/translations/en.json +105 -71
- package/src/core/components/carbon/controlled-dropdown.component.tsx +0 -37
|
@@ -1,14 +1,16 @@
|
|
|
1
|
-
import styles from './stock-rules-filter.scss';
|
|
2
|
-
import { Dropdown, DropdownSkeleton } from '@carbon/react';
|
|
3
1
|
import React from 'react';
|
|
2
|
+
import { Dropdown, DropdownSkeleton } from '@carbon/react';
|
|
3
|
+
import { useTranslation } from 'react-i18next';
|
|
4
4
|
import { useStockRules } from './stock-rules.resource';
|
|
5
5
|
import { ResourceRepresentation } from '../../../core/api/api';
|
|
6
|
+
import styles from './stock-rules-filter.scss';
|
|
6
7
|
|
|
7
8
|
interface StockRulesFilterProps {
|
|
8
9
|
stockItemUuid: string;
|
|
9
10
|
}
|
|
10
11
|
|
|
11
12
|
const StockRulesFilter: React.FC<StockRulesFilterProps> = ({ stockItemUuid }) => {
|
|
13
|
+
const { t } = useTranslation();
|
|
12
14
|
const { items, isLoading, error } = useStockRules({
|
|
13
15
|
v: ResourceRepresentation.Default,
|
|
14
16
|
totalCount: true,
|
|
@@ -18,15 +20,18 @@ const StockRulesFilter: React.FC<StockRulesFilterProps> = ({ stockItemUuid }) =>
|
|
|
18
20
|
if (isLoading || error) {
|
|
19
21
|
return <DropdownSkeleton />;
|
|
20
22
|
}
|
|
23
|
+
|
|
21
24
|
return (
|
|
22
25
|
<>
|
|
23
26
|
<div className={styles.filterContainer}>
|
|
24
27
|
<Dropdown
|
|
25
28
|
id="stockRulesFiter"
|
|
26
29
|
items={[...items.results]}
|
|
27
|
-
itemToString={(item) => (item ? item.
|
|
30
|
+
itemToString={(item) => (item ? item.name : t('notSet', 'Not Set'))}
|
|
28
31
|
type="inline"
|
|
29
32
|
size="sm"
|
|
33
|
+
label={t('filterStockRules', 'Filter stock rules')}
|
|
34
|
+
titleText={t('stockRules', 'Stock rules')}
|
|
30
35
|
/>
|
|
31
36
|
</div>
|
|
32
37
|
</>
|
package/src/stock-items/add-stock-item/stock-item-units-edit/stock-item-units-edit.component.tsx
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { useTranslation } from 'react-i18next';
|
|
3
|
+
import { NumberInputSkeleton } from '@carbon/react';
|
|
3
4
|
import { useStockItem } from '../../stock-items.resource';
|
|
4
|
-
import DispensingPackageMeasurement from '../dispensing-package-measurement/dispensing-package-measurement.component';
|
|
5
5
|
import { type Control, type FormState } from 'react-hook-form';
|
|
6
6
|
import { type StockItemFormData } from '../../validationSchema';
|
|
7
7
|
import ControlledNumberInput from '../../../core/components/carbon/controlled-number-input.component';
|
|
8
|
-
import
|
|
8
|
+
import DispensingPackageMeasurement from '../dispensing-package-measurement/dispensing-package-measurement.component';
|
|
9
9
|
|
|
10
10
|
interface StockItemUnitsEditProps {
|
|
11
11
|
stockItemUuid: string;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import
|
|
3
|
-
import { useConfig } from '@openmrs/esm-framework';
|
|
2
|
+
import { startCase } from 'lodash-es';
|
|
4
3
|
import { useTranslation } from 'react-i18next';
|
|
5
|
-
import
|
|
4
|
+
import { useConfig } from '@openmrs/esm-framework';
|
|
5
|
+
import styles from './printable-transaction-header.scss';
|
|
6
6
|
|
|
7
7
|
interface PrintableTransactionHeaderProps {
|
|
8
8
|
itemName: string;
|
|
@@ -15,7 +15,7 @@ const PrintableBincardTransactionHeader: React.FC<PrintableTransactionHeaderProp
|
|
|
15
15
|
return (
|
|
16
16
|
<div className={styles.container}>
|
|
17
17
|
<div className={styles.printableHeader}>
|
|
18
|
-
<p className={styles.heading}>{t('
|
|
18
|
+
<p className={styles.heading}>{t('binCard', 'Bin card')}</p>
|
|
19
19
|
{logo?.src ? (
|
|
20
20
|
<img className={styles.img} height={60} width={250} src={logo.src} alt={logo.alt} />
|
|
21
21
|
) : logo?.name ? (
|
|
@@ -41,7 +41,7 @@ const PrintableBincardTransactionHeader: React.FC<PrintableTransactionHeaderProp
|
|
|
41
41
|
|
|
42
42
|
<div className={styles.printableBody}>
|
|
43
43
|
<div className={styles.transactionDetails}>
|
|
44
|
-
<p className={styles.itemHeading}>{t('
|
|
44
|
+
<p className={styles.itemHeading}>{t('itemName', 'Item name')}</p>
|
|
45
45
|
<p className={styles.itemLabel}>{startCase(itemName)}</p>
|
|
46
46
|
</div>
|
|
47
47
|
</div>
|
|
@@ -2,7 +2,7 @@ import React from 'react';
|
|
|
2
2
|
import styles from './printable-transaction-header.scss';
|
|
3
3
|
import { useConfig } from '@openmrs/esm-framework';
|
|
4
4
|
import { useTranslation } from 'react-i18next';
|
|
5
|
-
import startCase from 'lodash-es
|
|
5
|
+
import { startCase } from 'lodash-es';
|
|
6
6
|
|
|
7
7
|
interface PrintableTransactionHeaderProps {
|
|
8
8
|
itemName: string;
|
|
@@ -15,7 +15,7 @@ const PrintableStockcardTransactionHeader: React.FC<PrintableTransactionHeaderPr
|
|
|
15
15
|
return (
|
|
16
16
|
<div className={styles.container}>
|
|
17
17
|
<div className={styles.printableHeader}>
|
|
18
|
-
<p className={styles.heading}>{t('
|
|
18
|
+
<p className={styles.heading}>{t('stockCard', 'Stock card')}</p>
|
|
19
19
|
{logo?.src ? (
|
|
20
20
|
<img className={styles.img} height={60} width={250} src={logo.src} alt={logo.alt} />
|
|
21
21
|
) : logo?.name ? (
|
|
@@ -41,7 +41,7 @@ const PrintableStockcardTransactionHeader: React.FC<PrintableTransactionHeaderPr
|
|
|
41
41
|
|
|
42
42
|
<div className={styles.printableBody}>
|
|
43
43
|
<div className={styles.transactionDetails}>
|
|
44
|
-
<p className={styles.itemHeading}>{t('
|
|
44
|
+
<p className={styles.itemHeading}>{t('itemName', 'Item name')}</p>
|
|
45
45
|
<p className={styles.itemLabel}>{startCase(itemName)}</p>
|
|
46
46
|
</div>
|
|
47
47
|
</div>
|
package/src/stock-items/add-stock-item/transactions/printout/transactions-print-action.component.tsx
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import React, { useEffect, useMemo, useState } from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { ComboButton, MenuItem } from '@carbon/react';
|
|
3
3
|
import { Printer } from '@carbon/react/icons';
|
|
4
4
|
import { useTranslation } from 'react-i18next';
|
|
5
5
|
import { useStockItem, useStockItemInventory } from '../../../stock-items.resource';
|
|
6
6
|
import { showModal, useConfig } from '@openmrs/esm-framework';
|
|
7
|
-
import { type ConfigObject } from '../../../../config-schema';
|
|
8
|
-
import styles from './printable-transaction.scss';
|
|
9
7
|
import { type StockItemInventoryFilter, useStockItemTransactions } from '../../../stock-items.resource';
|
|
10
8
|
import { ResourceRepresentation } from '../../../../core/api/api';
|
|
9
|
+
import { type ConfigObject } from '../../../../config-schema';
|
|
11
10
|
|
|
12
11
|
type Props = {
|
|
13
12
|
itemUuid: string;
|
|
@@ -156,14 +155,12 @@ const TransactionsPrintAction: React.FC<Props> = ({ columns, data, itemUuid, fil
|
|
|
156
155
|
<MenuItem
|
|
157
156
|
label={t('printStockCard', 'Print Stock Card')}
|
|
158
157
|
renderIcon={(props) => <Printer size={24} {...props} />}
|
|
159
|
-
iconDescription="Print Stock Card"
|
|
160
158
|
onClick={handleStockcardClick}
|
|
161
159
|
disabled={isStockItemLoading || isStockCardLoading}
|
|
162
160
|
/>
|
|
163
161
|
<MenuItem
|
|
164
162
|
label={t('printBinCard', 'Print Bin Card')}
|
|
165
163
|
renderIcon={(props) => <Printer size={24} {...props} />}
|
|
166
|
-
iconDescription="Print Bin Card"
|
|
167
164
|
onClick={handleBincardClick}
|
|
168
165
|
disabled={isStockItemLoading}
|
|
169
166
|
/>
|
|
@@ -28,7 +28,7 @@ const TransactionsBincardPrintPreviewModal: React.FC<TransactionsBincardPrintPre
|
|
|
28
28
|
});
|
|
29
29
|
return (
|
|
30
30
|
<>
|
|
31
|
-
<ModalHeader closeModal={onClose} title={t('
|
|
31
|
+
<ModalHeader closeModal={onClose} title={t('printBinCard', 'Print Bin Card')} />
|
|
32
32
|
<ModalBody>
|
|
33
33
|
<div ref={ref}>
|
|
34
34
|
<TransactionsBincardPrintout title={title} columns={columns} data={data} />
|
|
@@ -27,9 +27,6 @@ const TransactionsLocationsFilter = <T,>(props: TransactionsLocationsFilterProps
|
|
|
27
27
|
render={({ field: { onChange, value, ref } }) => (
|
|
28
28
|
<ComboBox
|
|
29
29
|
titleText={props.title}
|
|
30
|
-
name={props.name}
|
|
31
|
-
control={props.control}
|
|
32
|
-
controllerName={props.controllerName}
|
|
33
30
|
id={props.name}
|
|
34
31
|
size={'md'}
|
|
35
32
|
items={stockLocations ?? []}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
+
import { useTranslation } from 'react-i18next';
|
|
2
3
|
import { RadioButton, RadioButtonGroup } from '@carbon/react';
|
|
3
4
|
import styles from './filter-stock-items.scss';
|
|
4
5
|
|
|
@@ -8,16 +9,17 @@ interface FilterStockItemsProps {
|
|
|
8
9
|
}
|
|
9
10
|
|
|
10
11
|
const FilterStockItems: React.FC<FilterStockItemsProps> = ({ filterType, changeFilterType }) => {
|
|
12
|
+
const { t } = useTranslation();
|
|
11
13
|
return (
|
|
12
14
|
<RadioButtonGroup
|
|
13
15
|
name="is-drug"
|
|
14
16
|
defaultSelected={filterType}
|
|
15
|
-
onChange={changeFilterType}
|
|
17
|
+
onChange={(value) => changeFilterType(value as string)}
|
|
16
18
|
className={styles.spacing}
|
|
17
19
|
>
|
|
18
|
-
<RadioButton labelText=
|
|
19
|
-
<RadioButton labelText=
|
|
20
|
-
<RadioButton labelText=
|
|
20
|
+
<RadioButton labelText={t('all', 'All')} value="" id="is-drug-all" />
|
|
21
|
+
<RadioButton labelText={t('pharmaceuticals', 'Pharmaceuticals')} value="true" id="is-drug-drug" />
|
|
22
|
+
<RadioButton labelText={t('nonPharmaceuticals', 'Non Pharmaceuticals')} value="false" id="is-drug-other" />
|
|
21
23
|
</RadioButtonGroup>
|
|
22
24
|
);
|
|
23
25
|
};
|
|
@@ -19,7 +19,7 @@ const EditStockItemActionsMenu: React.FC<EditStockItemActionsMenuProps> = ({ dat
|
|
|
19
19
|
data.isDrug = !!data.drugUuid;
|
|
20
20
|
launchAddOrEditStockItemWorkspace(t, data);
|
|
21
21
|
}}
|
|
22
|
-
iconDescription={t('editStockItem', 'Edit
|
|
22
|
+
iconDescription={t('editStockItem', 'Edit stock item')}
|
|
23
23
|
>
|
|
24
24
|
{`${data?.drugName ?? data.conceptName}`}
|
|
25
25
|
</Button>
|
|
@@ -31,6 +31,7 @@ import AddStockItemActionButton from './add-stock-item/add-stock-action-button.c
|
|
|
31
31
|
import AddStockItemsBulktImportActionButton from './add-bulk-stock-item/add-stock-items-bulk-import-action-button.component';
|
|
32
32
|
import EditStockItemActionsMenu from './edit-stock-item/edit-stock-item-action-menu.component';
|
|
33
33
|
import FilterStockItems from './components/filter-stock-items/filter-stock-items.component';
|
|
34
|
+
import { type CustomTableHeader } from '../core/components/table/types';
|
|
34
35
|
import styles from './stock-items-table.scss';
|
|
35
36
|
|
|
36
37
|
interface StockItemsTableProps {
|
|
@@ -80,17 +81,17 @@ const StockItemsTableComponent: React.FC<StockItemsTableProps> = () => {
|
|
|
80
81
|
},
|
|
81
82
|
{
|
|
82
83
|
id: 1,
|
|
83
|
-
header: t('genericName', 'Generic
|
|
84
|
+
header: t('genericName', 'Generic name'),
|
|
84
85
|
key: 'genericName',
|
|
85
86
|
},
|
|
86
87
|
{
|
|
87
88
|
id: 2,
|
|
88
|
-
header: t('commonName', 'Common
|
|
89
|
+
header: t('commonName', 'Common name'),
|
|
89
90
|
key: 'commonName',
|
|
90
91
|
},
|
|
91
92
|
{
|
|
92
93
|
id: 3,
|
|
93
|
-
header: t('tradeName', 'Trade
|
|
94
|
+
header: t('tradeName', 'Trade name'),
|
|
94
95
|
key: 'tradeName',
|
|
95
96
|
},
|
|
96
97
|
{
|
|
@@ -100,12 +101,12 @@ const StockItemsTableComponent: React.FC<StockItemsTableProps> = () => {
|
|
|
100
101
|
},
|
|
101
102
|
{
|
|
102
103
|
id: 5,
|
|
103
|
-
header: t('defaultStockOperationsUoMName', 'Bulk
|
|
104
|
+
header: t('defaultStockOperationsUoMName', 'Bulk packaging'),
|
|
104
105
|
key: 'defaultStockOperationsUoMName',
|
|
105
106
|
},
|
|
106
107
|
{
|
|
107
108
|
id: 6,
|
|
108
|
-
header: t('reorderLevel', 'Reorder
|
|
109
|
+
header: t('reorderLevel', 'Reorder level'),
|
|
109
110
|
key: 'reorderLevel',
|
|
110
111
|
},
|
|
111
112
|
{
|
|
@@ -159,12 +160,8 @@ const StockItemsTableComponent: React.FC<StockItemsTableProps> = () => {
|
|
|
159
160
|
<h2 className={styles.tableHeader}>
|
|
160
161
|
{t('stockItemsTableHeader', 'Drugs and other stock items managed by the system.')}
|
|
161
162
|
</h2>
|
|
162
|
-
<DataTable
|
|
163
|
-
rows
|
|
164
|
-
headers={tableHeaders}
|
|
165
|
-
isSortable
|
|
166
|
-
useZebraStyles
|
|
167
|
-
render={({ rows, headers, getHeaderProps, getTableProps, getRowProps, getBatchActionProps }) => (
|
|
163
|
+
<DataTable rows={tableRows} headers={tableHeaders} isSortable useZebraStyles>
|
|
164
|
+
{({ rows, headers, getHeaderProps, getTableProps, getRowProps, getBatchActionProps }) => (
|
|
168
165
|
<TableContainer>
|
|
169
166
|
<TableToolbar
|
|
170
167
|
style={{
|
|
@@ -181,7 +178,9 @@ const StockItemsTableComponent: React.FC<StockItemsTableProps> = () => {
|
|
|
181
178
|
}}
|
|
182
179
|
>
|
|
183
180
|
<TableToolbarSearch
|
|
184
|
-
onChange={(e) =>
|
|
181
|
+
onChange={(e) =>
|
|
182
|
+
handleSearch(typeof e === 'string' ? e : (e as React.ChangeEvent<HTMLInputElement>).target.value)
|
|
183
|
+
}
|
|
185
184
|
persistent
|
|
186
185
|
placeholder={t('searchStockItems', 'Search stock items')}
|
|
187
186
|
value={searchInput}
|
|
@@ -205,13 +204,20 @@ const StockItemsTableComponent: React.FC<StockItemsTableProps> = () => {
|
|
|
205
204
|
<TableHeader
|
|
206
205
|
{...getHeaderProps({
|
|
207
206
|
header,
|
|
208
|
-
isSortable: header.isSortable,
|
|
207
|
+
isSortable: (header as CustomTableHeader).isSortable,
|
|
209
208
|
})}
|
|
210
209
|
className={isDesktop ? styles.desktopHeader : styles.tabletHeader}
|
|
211
210
|
key={`${header.key}`}
|
|
212
211
|
isSortable={header.key !== 'name'}
|
|
213
212
|
>
|
|
214
|
-
{
|
|
213
|
+
{(() => {
|
|
214
|
+
const customHeader = header as CustomTableHeader;
|
|
215
|
+
return typeof customHeader.header === 'object' &&
|
|
216
|
+
customHeader.header !== null &&
|
|
217
|
+
'content' in customHeader.header
|
|
218
|
+
? (customHeader.header.content as React.ReactNode)
|
|
219
|
+
: (customHeader.header as React.ReactNode);
|
|
220
|
+
})()}
|
|
215
221
|
</TableHeader>
|
|
216
222
|
),
|
|
217
223
|
)}
|
|
@@ -249,7 +255,7 @@ const StockItemsTableComponent: React.FC<StockItemsTableProps> = () => {
|
|
|
249
255
|
) : null}
|
|
250
256
|
</TableContainer>
|
|
251
257
|
)}
|
|
252
|
-
|
|
258
|
+
</DataTable>
|
|
253
259
|
<Pagination
|
|
254
260
|
className={styles.paginationOverride}
|
|
255
261
|
onChange={({ page, pageSize }) => {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useEffect,
|
|
1
|
+
import { useEffect, useState } from 'react';
|
|
2
2
|
import { useTranslation } from 'react-i18next';
|
|
3
3
|
import { usePagination } from '@openmrs/esm-framework';
|
|
4
4
|
import { type StockItemFilter, useStockItems } from './stock-items.resource';
|
|
@@ -10,8 +10,7 @@ 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 {
|
|
14
|
-
import { stockItemDetailsSchema, type StockItemFormData } from './validationSchema';
|
|
13
|
+
import { type StockItemFormData } from './validationSchema';
|
|
15
14
|
|
|
16
15
|
export interface StockItemFilter extends ResourceFilterCriteria {
|
|
17
16
|
isDrug?: string | null | undefined;
|
|
@@ -3,8 +3,8 @@ import { useTranslation } from 'react-i18next';
|
|
|
3
3
|
import { showSnackbar } from '@openmrs/esm-framework';
|
|
4
4
|
import { saveLocation } from './stock-locations-table.resource';
|
|
5
5
|
import { type locationData, type LocationMutator } from '../stock-items/types';
|
|
6
|
-
import LocationAdministrationForm from './location-admin-form.component';
|
|
7
6
|
import { extractErrorMessagesFromResponse } from '../constants';
|
|
7
|
+
import LocationAdministrationForm from './location-admin-form.component';
|
|
8
8
|
|
|
9
9
|
interface LocationFormProps {
|
|
10
10
|
showModal: boolean;
|
|
@@ -33,7 +33,7 @@ const NewLocationForm: React.FC<LocationFormProps> = ({ showModal, onModalChange
|
|
|
33
33
|
saveLocation({ locationPayload: locationbject })
|
|
34
34
|
.then(() => {
|
|
35
35
|
showSnackbar({
|
|
36
|
-
title: t('
|
|
36
|
+
title: t('locationCreatedTitle', 'Location created'),
|
|
37
37
|
kind: 'success',
|
|
38
38
|
isLowContrast: true,
|
|
39
39
|
subtitle: t('locationCreatedSuccessfully', 'Location {{locationName}} was created successfully.', {
|
|
@@ -60,15 +60,13 @@ const NewLocationForm: React.FC<LocationFormProps> = ({ showModal, onModalChange
|
|
|
60
60
|
);
|
|
61
61
|
|
|
62
62
|
return (
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
/>
|
|
71
|
-
</>
|
|
63
|
+
<LocationAdministrationForm
|
|
64
|
+
onModalChange={onModalChange}
|
|
65
|
+
showModal={showModal}
|
|
66
|
+
handleCreateQuestion={handleCreateQuestion}
|
|
67
|
+
headerTitle={headerTitle}
|
|
68
|
+
initialData={initialData}
|
|
69
|
+
/>
|
|
72
70
|
);
|
|
73
71
|
};
|
|
74
72
|
export default NewLocationForm;
|
|
@@ -101,7 +101,7 @@ const LocationAdministrationForm: React.FC<LocationAdministrationFormProps> = ({
|
|
|
101
101
|
<>
|
|
102
102
|
<TextInput
|
|
103
103
|
id="location"
|
|
104
|
-
labelText={t('
|
|
104
|
+
labelText={t('locationName', 'Location name')}
|
|
105
105
|
placeholder={t('locationPlaceholder', 'Add a location')}
|
|
106
106
|
invalidText={fieldState.error?.message}
|
|
107
107
|
{...field}
|
|
@@ -116,11 +116,16 @@ const LocationAdministrationForm: React.FC<LocationAdministrationFormProps> = ({
|
|
|
116
116
|
render={({ field }) => (
|
|
117
117
|
<FilterableMultiSelect
|
|
118
118
|
id="tag"
|
|
119
|
-
titleText={t('selectTags', 'Select
|
|
120
|
-
helperText=
|
|
119
|
+
titleText={t('selectTags', 'Select tags')}
|
|
120
|
+
helperText={t('selectTagsHelper', 'Select one or more tags for this location')}
|
|
121
121
|
items={Tags ?? []}
|
|
122
122
|
{...field}
|
|
123
|
-
itemToString={(item) =>
|
|
123
|
+
itemToString={(item) => {
|
|
124
|
+
if (item && typeof item === 'object' && 'display' in item) {
|
|
125
|
+
return (item as { display: string }).display;
|
|
126
|
+
}
|
|
127
|
+
return '';
|
|
128
|
+
}}
|
|
124
129
|
selectionFeedback="top-after-reopen"
|
|
125
130
|
/>
|
|
126
131
|
)}
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
} from '@carbon/react';
|
|
10
10
|
import { Add } from '@carbon/react/icons';
|
|
11
11
|
import { useTranslation } from 'react-i18next';
|
|
12
|
-
import {
|
|
12
|
+
import { useSWRConfig } from 'swr';
|
|
13
13
|
import { restBaseUrl } from '@openmrs/esm-framework';
|
|
14
14
|
import { handleMutate } from '../utils';
|
|
15
15
|
import { ResourceRepresentation } from '../core/api/api';
|
|
@@ -24,7 +24,7 @@ interface StockLocationsTableProps {
|
|
|
24
24
|
|
|
25
25
|
const StockLocationsItems: React.FC<StockLocationsTableProps> = () => {
|
|
26
26
|
const { t } = useTranslation();
|
|
27
|
-
|
|
27
|
+
const { mutate } = useSWRConfig();
|
|
28
28
|
const [showLocationModal, setAddLocationModal] = useState(false);
|
|
29
29
|
|
|
30
30
|
const { tableHeaders, tableRows, items, isLoading } = useStockLocationPages({
|
|
@@ -69,7 +69,7 @@ const StockLocationsItems: React.FC<StockLocationsTableProps> = () => {
|
|
|
69
69
|
return (
|
|
70
70
|
<div className={styles.tileContainer}>
|
|
71
71
|
<Tile className={styles.tile}>
|
|
72
|
-
<p className={styles.content}>{t('
|
|
72
|
+
<p className={styles.content}>{t('noLocationsToDisplay', 'No locations to display')}</p>
|
|
73
73
|
</Tile>
|
|
74
74
|
</div>
|
|
75
75
|
);
|
|
@@ -15,7 +15,7 @@ import { type OpenMRSLocation, type OpenMRSLocationTag } from '../core/api/types
|
|
|
15
15
|
import { type PageableResult } from '../core/api/types/PageableResult';
|
|
16
16
|
import { type Party } from '../core/api/types/Party';
|
|
17
17
|
import { type Patient } from '../core/api/types/identity/Patient';
|
|
18
|
-
import { type ResourceFilterCriteria, toQueryParams } from '../core/api/api';
|
|
18
|
+
import { type ResourceFilterCriteria, type ResourceRepresentation, toQueryParams } from '../core/api/api';
|
|
19
19
|
import { type Role } from '../core/api/types/identity/Role';
|
|
20
20
|
import { type StockOperationType } from '../core/api/types/stockOperation/StockOperationType';
|
|
21
21
|
import { type User } from '../core/api/types/identity/User';
|
|
@@ -166,7 +166,7 @@ export function useUsers(filter: UserFilterCriteria) {
|
|
|
166
166
|
|
|
167
167
|
// getUser
|
|
168
168
|
export function useUser(id: string, v?: string) {
|
|
169
|
-
const apiUrl = `${restBaseUrl}/user/${id}${toQueryParams({ v: v as
|
|
169
|
+
const apiUrl = `${restBaseUrl}/user/${id}${toQueryParams({ v: (v as ResourceRepresentation) || undefined })}`;
|
|
170
170
|
const { data, error, isLoading } = useSWR<
|
|
171
171
|
{
|
|
172
172
|
data: User;
|
|
@@ -11,7 +11,7 @@ const StockManagementCardLink: React.FC = () => {
|
|
|
11
11
|
<ClickableTile href={window.getOpenmrsSpaBase() + 'stock-management'} rel="noopener noreferrer">
|
|
12
12
|
<div>
|
|
13
13
|
<div className="heading">{header}</div>
|
|
14
|
-
<div className="content">{t('stockManagement', 'Stock
|
|
14
|
+
<div className="content">{t('stockManagement', 'Stock management')}</div>
|
|
15
15
|
</div>
|
|
16
16
|
<div className="iconWrapper">
|
|
17
17
|
<ArrowRight size={16} />
|
package/src/stock-operations/add-stock-operation/stock-operations-expanded-row/stock-items-table.tsx
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import React, { useMemo, useState } from 'react';
|
|
2
|
+
import { useTranslation } from 'react-i18next';
|
|
1
3
|
import {
|
|
2
4
|
DataTable,
|
|
3
5
|
Pagination,
|
|
@@ -11,8 +13,6 @@ import {
|
|
|
11
13
|
Tile,
|
|
12
14
|
} from '@carbon/react';
|
|
13
15
|
import { formatDate, parseDate, usePagination } from '@openmrs/esm-framework';
|
|
14
|
-
import React, { useMemo, useState } from 'react';
|
|
15
|
-
import { useTranslation } from 'react-i18next';
|
|
16
16
|
import { type StockOperationItemDTO } from '../../../core/api/types/stockOperation/StockOperationItemDTO';
|
|
17
17
|
import styles from './stock-items-table.scss';
|
|
18
18
|
|
|
@@ -23,7 +23,7 @@ const StockItemsTable: React.FC<Props> = ({ items }) => {
|
|
|
23
23
|
const { t } = useTranslation();
|
|
24
24
|
const [pageSize, setPageSize] = useState(10);
|
|
25
25
|
const pageSizesOptions = useMemo(() => [5, 10, 20, 50, 100], []);
|
|
26
|
-
const [searchText, setSearchText] = useState();
|
|
26
|
+
const [searchText, setSearchText] = useState<string>('');
|
|
27
27
|
|
|
28
28
|
const handleSearch = (item: StockOperationItemDTO) => {
|
|
29
29
|
if (!searchText) return true;
|
|
@@ -39,7 +39,7 @@ const StockItemsTable: React.FC<Props> = ({ items }) => {
|
|
|
39
39
|
key: 'commonName',
|
|
40
40
|
},
|
|
41
41
|
{
|
|
42
|
-
header: t('batchNo', 'Batch
|
|
42
|
+
header: t('batchNo', 'Batch number'),
|
|
43
43
|
key: 'batchNo',
|
|
44
44
|
},
|
|
45
45
|
{
|
|
@@ -47,11 +47,11 @@ const StockItemsTable: React.FC<Props> = ({ items }) => {
|
|
|
47
47
|
key: 'expiration',
|
|
48
48
|
},
|
|
49
49
|
{
|
|
50
|
-
header: t('
|
|
50
|
+
header: t('quantity', 'Quantity'),
|
|
51
51
|
key: 'quantity',
|
|
52
52
|
},
|
|
53
53
|
{
|
|
54
|
-
header: t('uom', '
|
|
54
|
+
header: t('uom', 'Unit of Measurement'),
|
|
55
55
|
key: 'stockItemPackagingUOMName',
|
|
56
56
|
},
|
|
57
57
|
],
|
|
@@ -71,8 +71,12 @@ const StockItemsTable: React.FC<Props> = ({ items }) => {
|
|
|
71
71
|
return (
|
|
72
72
|
<Tile className={styles.container}>
|
|
73
73
|
<span className={styles.title}>{t('stockItems', 'Stock items')}</span>
|
|
74
|
-
<Search
|
|
75
|
-
|
|
74
|
+
<Search
|
|
75
|
+
labelText={t('search', 'Search')}
|
|
76
|
+
value={searchText}
|
|
77
|
+
onChange={({ target: { value } }) => setSearchText(value as string)}
|
|
78
|
+
/>
|
|
79
|
+
<DataTable useZebraStyles rows={tableRows} headers={headers}>
|
|
76
80
|
{({ rows, headers, getTableProps, getHeaderProps, getRowProps }) => (
|
|
77
81
|
<Table {...getTableProps()}>
|
|
78
82
|
<TableHead>
|
|
@@ -86,8 +86,8 @@ const StockOperationExpandedRow: React.FC<StockOperationExpandedRowProps> = (pro
|
|
|
86
86
|
<Row className={styles.statusContainerRow}>
|
|
87
87
|
{isLoading && (
|
|
88
88
|
<InlineLoading
|
|
89
|
-
description={t('
|
|
90
|
-
iconDescription={t('
|
|
89
|
+
description={t('loadingStockOperationLinks', 'Loading stock operation links...')}
|
|
90
|
+
iconDescription={t('loadingStockOperationLinksIcon', 'Loading stock operation links')}
|
|
91
91
|
/>
|
|
92
92
|
)}
|
|
93
93
|
{currentOperationType && (
|
|
@@ -100,8 +100,8 @@ const StockOperationExpandedRow: React.FC<StockOperationExpandedRowProps> = (pro
|
|
|
100
100
|
<Row className={styles.statusContainerRow}>
|
|
101
101
|
{isLoading && (
|
|
102
102
|
<InlineLoading
|
|
103
|
-
description={t('loadingOperationActions', 'Loading stock operation actions')
|
|
104
|
-
iconDescription={t('
|
|
103
|
+
description={t('loadingOperationActions', 'Loading stock operation actions...')}
|
|
104
|
+
iconDescription={t('loadingOperationActionsIcon', 'Loading stock operation actions')}
|
|
105
105
|
/>
|
|
106
106
|
)}
|
|
107
107
|
{currentOperationType && (
|
package/src/stock-operations/edit-stock-operation/edit-stock-operation-action-menu.component.tsx
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import React, { useCallback, useEffect, useMemo } from 'react';
|
|
2
|
+
import { Button, InlineLoading } from '@carbon/react';
|
|
2
3
|
import { Edit } from '@carbon/react/icons';
|
|
3
4
|
import { showSnackbar } from '@openmrs/esm-framework';
|
|
4
|
-
import React, { useCallback, useEffect, useMemo } from 'react';
|
|
5
5
|
import { useTranslation } from 'react-i18next';
|
|
6
6
|
import { type StockOperationDTO } from '../../core/api/types/stockOperation/StockOperationDTO';
|
|
7
7
|
import { launchStockoperationAddOrEditWorkSpace } from '../stock-operation.utils';
|
|
8
|
-
import useFilteredOperationTypesByRoles from '../stock-operations-forms/hooks/useFilteredOperationTypesByRoles';
|
|
9
8
|
import { useStockOperationAndItems } from '../stock-operations.resource';
|
|
9
|
+
import useFilteredOperationTypesByRoles from '../stock-operations-forms/hooks/useFilteredOperationTypesByRoles';
|
|
10
10
|
import styles from './edit-stock-operation-button.scss';
|
|
11
11
|
|
|
12
12
|
interface EditStockOperationActionMenuProps {
|
|
@@ -51,7 +51,7 @@ const EditStockOperationActionMenu: React.FC<EditStockOperationActionMenuProps>
|
|
|
51
51
|
if (operationTypesError || stockOperationError) {
|
|
52
52
|
showSnackbar({
|
|
53
53
|
kind: 'error',
|
|
54
|
-
title: t('
|
|
54
|
+
title: t('stockOperationLoadError', 'Error loading stock operation'),
|
|
55
55
|
subtitle: operationTypesError?.message || stockOperationError?.message || '',
|
|
56
56
|
});
|
|
57
57
|
}
|
|
@@ -66,16 +66,15 @@ const EditStockOperationActionMenu: React.FC<EditStockOperationActionMenuProps>
|
|
|
66
66
|
}
|
|
67
67
|
|
|
68
68
|
return (
|
|
69
|
-
<
|
|
69
|
+
<Button
|
|
70
70
|
className={styles.editStockButton}
|
|
71
71
|
kind="ghost"
|
|
72
72
|
size="sm"
|
|
73
73
|
onClick={handleLaunchWorkspace}
|
|
74
|
-
label={t('editStockOperation', 'Edit Stock Operation')}
|
|
75
74
|
renderIcon={showIcon ? () => <Edit size={16} /> : undefined}
|
|
76
75
|
>
|
|
77
76
|
{showprops && <span className={styles.operationNumberText}>{fetchedStockOperation?.operationNumber}</span>}
|
|
78
|
-
</
|
|
77
|
+
</Button>
|
|
79
78
|
);
|
|
80
79
|
};
|
|
81
80
|
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import styles from './stock-operation-operations-filter.scss';
|
|
2
|
-
import { Dropdown, DropdownSkeleton } from '@carbon/react';
|
|
3
1
|
import React from 'react';
|
|
2
|
+
import { Dropdown, DropdownSkeleton } from '@carbon/react';
|
|
3
|
+
import { useTranslation } from 'react-i18next';
|
|
4
4
|
import { useStockOperationTypes } from '../../stock-lookups/stock-lookups.resource';
|
|
5
|
+
import styles from './stock-operation-operations-filter.scss';
|
|
5
6
|
|
|
6
7
|
const StockOperationOperationsFilter: React.FC = () => {
|
|
8
|
+
const { t } = useTranslation();
|
|
7
9
|
// get stock sources
|
|
8
10
|
const { types, isLoading, error } = useStockOperationTypes();
|
|
9
11
|
if (isLoading || error) {
|
|
@@ -15,9 +17,11 @@ const StockOperationOperationsFilter: React.FC = () => {
|
|
|
15
17
|
<Dropdown
|
|
16
18
|
id="stockOperationOperationsFiter"
|
|
17
19
|
items={types.results}
|
|
18
|
-
itemToString={(item) => (item ? item.name : 'Not Set')}
|
|
20
|
+
itemToString={(item) => (item ? item.name : t('notSet', 'Not Set'))}
|
|
19
21
|
type="inline"
|
|
20
22
|
size="sm"
|
|
23
|
+
label={t('filterByOperationType', 'Filter by operation type')}
|
|
24
|
+
titleText={t('operationType', 'Operation Type')}
|
|
21
25
|
/>
|
|
22
26
|
</div>
|
|
23
27
|
</>
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
import styles from './stock-operation-sources-filter.scss';
|
|
2
|
-
import { Dropdown, DropdownSkeleton } from '@carbon/react';
|
|
3
1
|
import React from 'react';
|
|
4
|
-
import {
|
|
2
|
+
import { Dropdown, DropdownSkeleton } from '@carbon/react';
|
|
3
|
+
import { useTranslation } from 'react-i18next';
|
|
5
4
|
import { type ConfigObject } from '../../config-schema';
|
|
5
|
+
import { useConcept } from '../../stock-lookups/stock-lookups.resource';
|
|
6
6
|
import { useConfig } from '@openmrs/esm-framework';
|
|
7
|
+
import styles from './stock-operation-sources-filter.scss';
|
|
7
8
|
|
|
8
9
|
const StockOperationSourcesFilter: React.FC = () => {
|
|
10
|
+
const { t } = useTranslation();
|
|
9
11
|
const { stockSourceTypeUUID } = useConfig<ConfigObject>();
|
|
10
12
|
|
|
11
13
|
// get stock sources
|
|
@@ -19,9 +21,11 @@ const StockOperationSourcesFilter: React.FC = () => {
|
|
|
19
21
|
<Dropdown
|
|
20
22
|
id="stockOperationSourcesFiter"
|
|
21
23
|
items={[...items.answers]}
|
|
22
|
-
itemToString={(item) => (item ? item.display : 'Not Set')}
|
|
24
|
+
itemToString={(item) => (item ? item.display : t('notSet', 'Not Set'))}
|
|
23
25
|
type="inline"
|
|
24
26
|
size="sm"
|
|
27
|
+
label={t('filterBySource', 'Filter by source')}
|
|
28
|
+
titleText={t('source', 'Source')}
|
|
25
29
|
/>
|
|
26
30
|
</div>
|
|
27
31
|
</>
|