@openmrs/esm-stock-management-app 3.1.1-pre.1179 → 3.1.1-pre.1186
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/3066.js +2 -0
- package/dist/3066.js.map +1 -0
- 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 +1 -1
- package/dist/openmrs-esm-stock-management-app.js.buildmanifest.json +64 -64
- 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/dist/2474.js +0 -2
- package/dist/2474.js.map +0 -1
- package/src/core/components/carbon/controlled-dropdown.component.tsx +0 -37
- /package/dist/{2474.js.LICENSE.txt → 3066.js.LICENSE.txt} +0 -0
|
@@ -136,9 +136,9 @@ const StockRulesAddOrUpdate: React.FC<AddStockRuleProps> = ({ model, stockItemUu
|
|
|
136
136
|
() => {
|
|
137
137
|
showSnackbar({
|
|
138
138
|
isLowContrast: true,
|
|
139
|
-
title: t('addedRule', 'Add
|
|
139
|
+
title: t('addedRule', 'Add rule'),
|
|
140
140
|
kind: 'success',
|
|
141
|
-
subtitle: t('stockRuleAddedSuccessfully', 'Stock
|
|
141
|
+
subtitle: t('stockRuleAddedSuccessfully', 'Stock rule added successfully'),
|
|
142
142
|
});
|
|
143
143
|
closeWorkspace?.();
|
|
144
144
|
},
|
|
@@ -159,7 +159,7 @@ const StockRulesAddOrUpdate: React.FC<AddStockRuleProps> = ({ model, stockItemUu
|
|
|
159
159
|
return (
|
|
160
160
|
<Form onSubmit={onFormSubmit} className={styles.formContainer}>
|
|
161
161
|
<div>
|
|
162
|
-
<FormGroup>
|
|
162
|
+
<FormGroup legendText={t('ruleConfiguration', 'Rule configuration')}>
|
|
163
163
|
<section className={styles.section}>
|
|
164
164
|
<section className={styles.section}>
|
|
165
165
|
<Select
|
|
@@ -181,7 +181,7 @@ const StockRulesAddOrUpdate: React.FC<AddStockRuleProps> = ({ model, stockItemUu
|
|
|
181
181
|
<TextInput
|
|
182
182
|
id="name"
|
|
183
183
|
type="text"
|
|
184
|
-
labelText={t('
|
|
184
|
+
labelText={t('ruleName', 'Rule name')}
|
|
185
185
|
size="md"
|
|
186
186
|
onChange={onNameChanged}
|
|
187
187
|
value={model?.name}
|
|
@@ -193,7 +193,7 @@ const StockRulesAddOrUpdate: React.FC<AddStockRuleProps> = ({ model, stockItemUu
|
|
|
193
193
|
<Select
|
|
194
194
|
name="quantityUnit"
|
|
195
195
|
className="select-field"
|
|
196
|
-
labelText={t('quantityUnit', 'Quantity
|
|
196
|
+
labelText={t('quantityUnit', 'Quantity unit')}
|
|
197
197
|
id="quantityUnit"
|
|
198
198
|
value={formModel?.stockItemPackagingUOMUuid ? formModel.stockItemPackagingUOMUuid : ''}
|
|
199
199
|
onChange={onQuantityUnitChange}
|
|
@@ -215,7 +215,7 @@ const StockRulesAddOrUpdate: React.FC<AddStockRuleProps> = ({ model, stockItemUu
|
|
|
215
215
|
<TextInput
|
|
216
216
|
id="quantity"
|
|
217
217
|
type="number"
|
|
218
|
-
labelText={t('
|
|
218
|
+
labelText={t('quantityThreshold', 'Quantity threshold')}
|
|
219
219
|
size="md"
|
|
220
220
|
onChange={onQuantityChanged}
|
|
221
221
|
value={model?.quantity}
|
|
@@ -225,12 +225,12 @@ const StockRulesAddOrUpdate: React.FC<AddStockRuleProps> = ({ model, stockItemUu
|
|
|
225
225
|
</section>
|
|
226
226
|
</FormGroup>
|
|
227
227
|
|
|
228
|
-
<FormGroup>
|
|
228
|
+
<FormGroup legendText={t('notifications', 'Notifications')}>
|
|
229
229
|
<section className={styles.section}>
|
|
230
230
|
<Select
|
|
231
231
|
name="alertRole"
|
|
232
232
|
className="select-field"
|
|
233
|
-
labelText={t('alertRole', 'Alert
|
|
233
|
+
labelText={t('alertRole', 'Alert role')}
|
|
234
234
|
id="alertRole"
|
|
235
235
|
value={formModel?.alertRole ? formModel.alertRole : ''}
|
|
236
236
|
onChange={onAlertRoleChange}
|
|
@@ -245,7 +245,7 @@ const StockRulesAddOrUpdate: React.FC<AddStockRuleProps> = ({ model, stockItemUu
|
|
|
245
245
|
<Select
|
|
246
246
|
name="mailRole"
|
|
247
247
|
className="select-field"
|
|
248
|
-
labelText={t('mailRole', 'Mail
|
|
248
|
+
labelText={t('mailRole', 'Mail role')}
|
|
249
249
|
id="mailRole"
|
|
250
250
|
value={formModel?.mailRole ? formModel.mailRole : ''}
|
|
251
251
|
onChange={onMailRoleChange}
|
|
@@ -285,24 +285,24 @@ const StockRulesAddOrUpdate: React.FC<AddStockRuleProps> = ({ model, stockItemUu
|
|
|
285
285
|
justifyContent: 'center',
|
|
286
286
|
}}
|
|
287
287
|
>
|
|
288
|
-
<FormGroup className="clear-margin-bottom">
|
|
289
|
-
<CheckboxGroup className={styles.checkboxGrid}>
|
|
288
|
+
<FormGroup className="clear-margin-bottom" legendText={t('enabled', 'Enabled')}>
|
|
289
|
+
<CheckboxGroup className={styles.checkboxGrid} legendText="">
|
|
290
290
|
<Checkbox
|
|
291
291
|
onChange={onEnabledChanged}
|
|
292
292
|
checked={formModel?.enabled}
|
|
293
293
|
labelText={`Enabled ?`}
|
|
294
|
-
value={model?.enabled}
|
|
294
|
+
value={model?.enabled ? 'true' : 'false'}
|
|
295
295
|
id="chk-ruleEnabled"
|
|
296
296
|
/>
|
|
297
297
|
</CheckboxGroup>
|
|
298
298
|
</FormGroup>
|
|
299
|
-
<FormGroup className="clear-margin-bottom">
|
|
300
|
-
<CheckboxGroup className={styles.checkboxGrid}>
|
|
299
|
+
<FormGroup className="clear-margin-bottom" legendText={t('scope', 'Scope')}>
|
|
300
|
+
<CheckboxGroup className={styles.checkboxGrid} legendText="">
|
|
301
301
|
<Checkbox
|
|
302
302
|
onChange={onAppliesToChildrenChanged}
|
|
303
303
|
name="appliesToChildren"
|
|
304
304
|
checked={formModel?.enableDescendants}
|
|
305
|
-
value={model?.enableDescendants}
|
|
305
|
+
value={model?.enableDescendants ? 'true' : 'false'}
|
|
306
306
|
labelText={`Applies to child locations?`}
|
|
307
307
|
id="chk-ruleAppliesToChildren"
|
|
308
308
|
/>
|
|
@@ -322,7 +322,7 @@ const StockRulesAddOrUpdate: React.FC<AddStockRuleProps> = ({ model, stockItemUu
|
|
|
322
322
|
[styles.desktop]: !isTablet,
|
|
323
323
|
})}
|
|
324
324
|
>
|
|
325
|
-
<Button kind="secondary" onClick={closeWorkspace} className={styles.button}>
|
|
325
|
+
<Button kind="secondary" onClick={() => closeWorkspace()} className={styles.button}>
|
|
326
326
|
{getCoreTranslation('cancel')}
|
|
327
327
|
</Button>
|
|
328
328
|
<Button type="submit" className={styles.button}>
|
|
@@ -18,9 +18,10 @@ import {
|
|
|
18
18
|
TableToolbarSearch,
|
|
19
19
|
Tile,
|
|
20
20
|
} from '@carbon/react';
|
|
21
|
-
import { isDesktop } from '@openmrs/esm-framework';
|
|
21
|
+
import { isDesktop, restBaseUrl } from '@openmrs/esm-framework';
|
|
22
22
|
import { formatDisplayDate } from '../../../core/utils/datetimeUtils';
|
|
23
23
|
import { ResourceRepresentation } from '../../../core/api/api';
|
|
24
|
+
import { handleMutate } from '../../../utils';
|
|
24
25
|
import { type StockRule } from '../../../core/api/types/stockItem/StockRule';
|
|
25
26
|
import { useStockItemRules } from './stock-item-rules.resource';
|
|
26
27
|
import AddStockRuleActionButton from './add-stock-rule-button.component';
|
|
@@ -45,6 +46,10 @@ const StockItemRules: React.FC<StockItemRulesProps> = ({ stockItemUuid, model, c
|
|
|
45
46
|
stockItemUuid: stockItemUuid,
|
|
46
47
|
});
|
|
47
48
|
|
|
49
|
+
const handleRefresh = () => {
|
|
50
|
+
handleMutate(`${restBaseUrl}/stockmanagement/stockrule`);
|
|
51
|
+
};
|
|
52
|
+
|
|
48
53
|
const tableRows = useMemo(() => {
|
|
49
54
|
return items?.map((stockRule, index) => ({
|
|
50
55
|
...stockRule,
|
|
@@ -76,12 +81,8 @@ const StockItemRules: React.FC<StockItemRulesProps> = ({ stockItemUuid, model, c
|
|
|
76
81
|
|
|
77
82
|
return (
|
|
78
83
|
<div className={styles.tableOverride}>
|
|
79
|
-
<DataTable
|
|
80
|
-
rows
|
|
81
|
-
headers={tableHeaders}
|
|
82
|
-
isSortable={true}
|
|
83
|
-
useZebraStyles={true}
|
|
84
|
-
render={({ rows, headers, getHeaderProps, getTableProps, getRowProps, onInputChange }) => (
|
|
84
|
+
<DataTable rows={tableRows} headers={tableHeaders} isSortable useZebraStyles>
|
|
85
|
+
{({ rows, headers, getHeaderProps, getTableProps, getRowProps, onInputChange }) => (
|
|
85
86
|
<TableContainer>
|
|
86
87
|
<TableToolbar
|
|
87
88
|
style={{
|
|
@@ -101,7 +102,7 @@ const StockItemRules: React.FC<StockItemRulesProps> = ({ stockItemUuid, model, c
|
|
|
101
102
|
<StockRulesFilter stockItemUuid={stockItemUuid} />
|
|
102
103
|
</div>
|
|
103
104
|
<TableToolbarMenu>
|
|
104
|
-
<TableToolbarAction className={styles.toolbarMenuAction} onClick={
|
|
105
|
+
<TableToolbarAction className={styles.toolbarMenuAction} onClick={handleRefresh}>
|
|
105
106
|
{t('refresh', 'Refresh')}
|
|
106
107
|
</TableToolbarAction>
|
|
107
108
|
</TableToolbarMenu>
|
|
@@ -156,7 +157,7 @@ const StockItemRules: React.FC<StockItemRulesProps> = ({ stockItemUuid, model, c
|
|
|
156
157
|
) : null}
|
|
157
158
|
</TableContainer>
|
|
158
159
|
)}
|
|
159
|
-
|
|
160
|
+
</DataTable>
|
|
160
161
|
<Pagination
|
|
161
162
|
page={currentPage}
|
|
162
163
|
pageSize={currentPageSize}
|
|
@@ -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} />
|