@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
package/src/stock-operations/stock-operations-forms/stock-item-form/stock-item-form.workspace.tsx
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import React, { useMemo } from 'react';
|
|
1
2
|
import {
|
|
2
3
|
Button,
|
|
3
4
|
ButtonSet,
|
|
@@ -9,12 +10,11 @@ import {
|
|
|
9
10
|
Stack,
|
|
10
11
|
TextInput,
|
|
11
12
|
} from '@carbon/react';
|
|
12
|
-
import { zodResolver } from '@hookform/resolvers/zod';
|
|
13
|
-
import { useConfig, useLayoutType } from '@openmrs/esm-framework';
|
|
14
13
|
import classNames from 'classnames';
|
|
15
|
-
import React, { useMemo } from 'react';
|
|
16
14
|
import { Controller, useForm } from 'react-hook-form';
|
|
17
15
|
import { useTranslation } from 'react-i18next';
|
|
16
|
+
import { zodResolver } from '@hookform/resolvers/zod';
|
|
17
|
+
import { useConfig, useLayoutType } from '@openmrs/esm-framework';
|
|
18
18
|
import { type z } from 'zod';
|
|
19
19
|
import { type ConfigObject } from '../../../config-schema';
|
|
20
20
|
import { DATE_PICKER_CONTROL_FORMAT, DATE_PICKER_FORMAT, formatForDatePicker, today } from '../../../constants';
|
|
@@ -48,7 +48,8 @@ const StockItemForm: React.FC<StockItemFormProps> = ({ stockOperationType, stock
|
|
|
48
48
|
const { useItemCommonNameAsDisplay } = useConfig<ConfigObject>();
|
|
49
49
|
|
|
50
50
|
const fields = formSchema.keyof().options;
|
|
51
|
-
|
|
51
|
+
type FormData = z.infer<typeof formSchema>;
|
|
52
|
+
const form = useForm<FormData>({
|
|
52
53
|
resolver: zodResolver(formSchema),
|
|
53
54
|
defaultValues: stockOperationItem,
|
|
54
55
|
mode: 'all',
|
|
@@ -77,21 +78,21 @@ const StockItemForm: React.FC<StockItemFormProps> = ({ stockOperationType, stock
|
|
|
77
78
|
<p className={styles.title}>{useItemCommonNameAsDisplay ? commonName : drugName}</p>
|
|
78
79
|
|
|
79
80
|
{(operationTypePermision.requiresActualBatchInfo || operationTypePermision.requiresBatchUuid) &&
|
|
80
|
-
fields.includes('batchNo' as
|
|
81
|
+
fields.includes('batchNo' as keyof FormData) && (
|
|
81
82
|
<Column>
|
|
82
83
|
<Controller
|
|
83
84
|
control={form.control}
|
|
84
85
|
defaultValue={stockOperationItem?.batchNo}
|
|
85
|
-
name={'batchNo' as
|
|
86
|
+
name={'batchNo' as keyof FormData}
|
|
86
87
|
render={({ field, fieldState: { error } }) => (
|
|
87
88
|
<TextInput
|
|
88
|
-
label={t('qty', 'Qty')}
|
|
89
89
|
maxLength={50}
|
|
90
90
|
{...field}
|
|
91
|
+
value={String(field.value ?? '')}
|
|
91
92
|
invalidText={error?.message}
|
|
92
|
-
invalid={error?.message}
|
|
93
|
-
placeholder={t('batchNumber', 'Batch
|
|
94
|
-
labelText={t('batchNumber', 'Batch
|
|
93
|
+
invalid={!!error?.message}
|
|
94
|
+
placeholder={t('batchNumber', 'Batch number')}
|
|
95
|
+
labelText={t('batchNumber', 'Batch number')}
|
|
95
96
|
id="batchNumber"
|
|
96
97
|
/>
|
|
97
98
|
)}
|
|
@@ -103,7 +104,7 @@ const StockItemForm: React.FC<StockItemFormProps> = ({ stockOperationType, stock
|
|
|
103
104
|
<Column>
|
|
104
105
|
<Controller
|
|
105
106
|
control={form.control}
|
|
106
|
-
name={'stockBatchUuid' as
|
|
107
|
+
name={'stockBatchUuid' as keyof FormData}
|
|
107
108
|
render={({ field, fieldState: { error } }) => (
|
|
108
109
|
<BatchNoSelector
|
|
109
110
|
initialValue={stockOperationItem?.stockBatchUuid}
|
|
@@ -116,37 +117,35 @@ const StockItemForm: React.FC<StockItemFormProps> = ({ stockOperationType, stock
|
|
|
116
117
|
</Column>
|
|
117
118
|
)}
|
|
118
119
|
{(operationTypePermision.requiresActualBatchInfo || operationTypePermision.requiresBatchUuid) &&
|
|
119
|
-
fields.includes('expiration' as
|
|
120
|
+
fields.includes('expiration' as keyof FormData) && (
|
|
120
121
|
<Column>
|
|
121
122
|
<Controller
|
|
122
123
|
control={form.control}
|
|
123
|
-
name={'expiration' as
|
|
124
|
-
render={({ field, fieldState: { error } }) =>
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
</DatePicker>
|
|
149
|
-
)}
|
|
124
|
+
name={'expiration' as keyof FormData}
|
|
125
|
+
render={({ field, fieldState: { error } }) => {
|
|
126
|
+
const { value, onChange, onBlur, name, ref } = field;
|
|
127
|
+
return (
|
|
128
|
+
<DatePicker
|
|
129
|
+
datePickerType="single"
|
|
130
|
+
minDate={formatForDatePicker(today())}
|
|
131
|
+
locale="en"
|
|
132
|
+
className={styles.datePickerInput}
|
|
133
|
+
dateFormat={DATE_PICKER_CONTROL_FORMAT}
|
|
134
|
+
value={(value as unknown as Date) || null}
|
|
135
|
+
onChange={([newDate]) => {
|
|
136
|
+
onChange(newDate);
|
|
137
|
+
}}
|
|
138
|
+
>
|
|
139
|
+
<DatePickerInput
|
|
140
|
+
id={`expiration-input`}
|
|
141
|
+
placeholder={DATE_PICKER_FORMAT}
|
|
142
|
+
labelText={t('expiration', 'Expiration date')}
|
|
143
|
+
invalid={!!error?.message}
|
|
144
|
+
invalidText={error?.message}
|
|
145
|
+
/>
|
|
146
|
+
</DatePicker>
|
|
147
|
+
);
|
|
148
|
+
}}
|
|
150
149
|
/>
|
|
151
150
|
</Column>
|
|
152
151
|
)}
|
|
@@ -163,9 +162,9 @@ const StockItemForm: React.FC<StockItemFormProps> = ({ stockOperationType, stock
|
|
|
163
162
|
hideSteppers
|
|
164
163
|
id={`qty`}
|
|
165
164
|
{...field}
|
|
166
|
-
label={t('
|
|
165
|
+
label={t('quantity', 'Quantity')}
|
|
167
166
|
invalidText={error?.message}
|
|
168
|
-
invalid={error?.message}
|
|
167
|
+
invalid={!!error?.message}
|
|
169
168
|
/>
|
|
170
169
|
)}
|
|
171
170
|
/>
|
|
@@ -185,21 +184,29 @@ const StockItemForm: React.FC<StockItemFormProps> = ({ stockOperationType, stock
|
|
|
185
184
|
/>
|
|
186
185
|
</Column>
|
|
187
186
|
|
|
188
|
-
{operationTypePermision?.canCaptureQuantityPrice && fields.includes('purchasePrice' as
|
|
187
|
+
{operationTypePermision?.canCaptureQuantityPrice && fields.includes('purchasePrice' as keyof FormData) && (
|
|
189
188
|
<Column>
|
|
190
189
|
<Controller
|
|
191
190
|
control={form.control}
|
|
192
|
-
name={'purchasePrice' as
|
|
193
|
-
render={({ field, fieldState: { error } }) =>
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
191
|
+
name={'purchasePrice' as keyof FormData}
|
|
192
|
+
render={({ field, fieldState: { error } }) => {
|
|
193
|
+
const { value, onChange, onBlur, disabled, name, ref } = field;
|
|
194
|
+
return (
|
|
195
|
+
<TextInput
|
|
196
|
+
value={String(value ?? '')}
|
|
197
|
+
onChange={onChange}
|
|
198
|
+
onBlur={onBlur}
|
|
199
|
+
disabled={disabled}
|
|
200
|
+
name={name}
|
|
201
|
+
ref={ref}
|
|
202
|
+
labelText={t('purchasePrice', 'Purchase Price')}
|
|
203
|
+
invalid={!!error?.message}
|
|
204
|
+
invalidText={error?.message}
|
|
205
|
+
id={`purchaseprice`}
|
|
206
|
+
placeholder={t('purchasePrice', 'Purchase Price')}
|
|
207
|
+
/>
|
|
208
|
+
);
|
|
209
|
+
}}
|
|
203
210
|
/>
|
|
204
211
|
</Column>
|
|
205
212
|
)}
|
|
@@ -80,7 +80,7 @@ const StockOperationForm: React.FC<StockOperationFormProps> = ({
|
|
|
80
80
|
stockOperation?.responsiblePersonUuid ?? // if person uuid exist, make it default
|
|
81
81
|
(stockOperation?.responsiblePersonOther ? otherUser.uuid : undefined) ?? // if other resp person exist, default other user uuid
|
|
82
82
|
(autoPopulateResponsiblePerson ? defaultLoggedUserUuid : undefined), //Else default login user if configured
|
|
83
|
-
operationDate: stockOperation?.operationDate ? parseDate(stockOperation
|
|
83
|
+
operationDate: stockOperation?.operationDate ? parseDate(String(stockOperation.operationDate)) : today(),
|
|
84
84
|
remarks: stockOperation?.remarks ?? '',
|
|
85
85
|
|
|
86
86
|
operationTypeUuid: stockOperation?.operationTypeUuid ?? stockOperationType?.uuid,
|
|
@@ -89,7 +89,7 @@ const StockOperationForm: React.FC<StockOperationFormProps> = ({
|
|
|
89
89
|
stockOperationItems:
|
|
90
90
|
stockOperation?.stockOperationItems?.map((item) =>
|
|
91
91
|
pick(
|
|
92
|
-
{ ...item, expiration: item.expiration ? parseDate(item.expiration
|
|
92
|
+
{ ...item, expiration: item.expiration ? parseDate(String(item.expiration)) : undefined },
|
|
93
93
|
stockOperationItemFormSchema.keyof().options,
|
|
94
94
|
),
|
|
95
95
|
) ?? [],
|
|
@@ -102,16 +102,18 @@ const StockOperationForm: React.FC<StockOperationFormProps> = ({
|
|
|
102
102
|
sourceUuid: _stockOperation?.destinationUuid,
|
|
103
103
|
destinationUuid: _stockOperation?.sourceUuid,
|
|
104
104
|
operationTypeUuid: stockOperationType?.uuid,
|
|
105
|
-
stockOperationItems: (_stockOperation?.stockOperationItems
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
105
|
+
stockOperationItems: (_stockOperation?.stockOperationItems && _stockOperation.stockOperationItems.length > 0
|
|
106
|
+
? _stockOperation.stockOperationItems.map((item) =>
|
|
107
|
+
pick(
|
|
108
|
+
{ ...item, expiration: item?.expiration ? parseDate(String(item.expiration)) : undefined },
|
|
109
|
+
stockOperationItemFormSchema.keyof().options,
|
|
110
|
+
),
|
|
111
|
+
)
|
|
112
|
+
: []) as [BaseStockOperationItemFormData, ...BaseStockOperationItemFormData[]],
|
|
111
113
|
requisitionStockOperationUuid: stockRequisitionUuid,
|
|
112
114
|
responsiblePersonUuid: _stockOperation?.responsiblePersonUuid,
|
|
113
115
|
responsiblePersonOther: _stockOperation?.responsiblePersonOther,
|
|
114
|
-
operationDate: _stockOperation?.operationDate ? parseDate(_stockOperation
|
|
116
|
+
operationDate: _stockOperation?.operationDate ? parseDate(String(_stockOperation.operationDate)) : today(),
|
|
115
117
|
}
|
|
116
118
|
: undefined,
|
|
117
119
|
resolver: zodResolver(formschema),
|
|
@@ -125,14 +127,17 @@ const StockOperationForm: React.FC<StockOperationFormProps> = ({
|
|
|
125
127
|
stockOperationType,
|
|
126
128
|
stockOperationItem,
|
|
127
129
|
onSave: (data) => {
|
|
128
|
-
const items = (form.getValues('stockOperationItems') ?? []) as
|
|
130
|
+
const items = (form.getValues('stockOperationItems') ?? []) as BaseStockOperationItemFormData[];
|
|
129
131
|
const index = items.findIndex((i) => i.uuid === data.uuid);
|
|
130
132
|
if (index === -1) {
|
|
131
133
|
items.push(data);
|
|
132
134
|
} else {
|
|
133
135
|
items[index] = data;
|
|
134
136
|
}
|
|
135
|
-
form.setValue(
|
|
137
|
+
form.setValue(
|
|
138
|
+
'stockOperationItems',
|
|
139
|
+
items as [BaseStockOperationItemFormData, ...BaseStockOperationItemFormData[]],
|
|
140
|
+
);
|
|
136
141
|
setRenderItemForm(false);
|
|
137
142
|
setItemFormProps(undefined);
|
|
138
143
|
},
|
|
@@ -159,7 +164,7 @@ const StockOperationForm: React.FC<StockOperationFormProps> = ({
|
|
|
159
164
|
disabled: !stockOperation,
|
|
160
165
|
},
|
|
161
166
|
{
|
|
162
|
-
name: t('stockItems', 'Stock
|
|
167
|
+
name: t('stockItems', 'Stock items'),
|
|
163
168
|
component: (
|
|
164
169
|
<StockOperationItemsFormStep
|
|
165
170
|
stockOperation={stockOperation}
|
|
@@ -27,7 +27,7 @@ const StockOperationCompleteDispatchButton: React.FC<StockOperationCompleteDispa
|
|
|
27
27
|
|
|
28
28
|
return (
|
|
29
29
|
<Button onClick={launchcompletedDispatchModal} renderIcon={(props) => <Arrival size={16} {...props} />}>
|
|
30
|
-
{t('
|
|
30
|
+
{t('completeDispatch', 'Complete dispatch')}
|
|
31
31
|
</Button>
|
|
32
32
|
);
|
|
33
33
|
};
|
|
@@ -29,7 +29,7 @@ const StockOperationIssueStockButton: React.FC<StockOperationIssueStockButtonPro
|
|
|
29
29
|
if (error) {
|
|
30
30
|
showSnackbar({
|
|
31
31
|
kind: 'error',
|
|
32
|
-
title: t('
|
|
32
|
+
title: t('stockOperationTypesError', 'Error loading stock operation types'),
|
|
33
33
|
subtitle: error?.message,
|
|
34
34
|
});
|
|
35
35
|
}
|
package/src/stock-operations/stock-operations-modal/stock-operations-print-button.component.tsx
CHANGED
|
@@ -76,7 +76,11 @@ const StockOperationPrintButton: React.FC<StockOperationCancelButtonProps> = ({
|
|
|
76
76
|
inventoryFilter.groupBy = 'LocationStockItem';
|
|
77
77
|
inventoryFilter.includeStockItemName = 'true';
|
|
78
78
|
|
|
79
|
-
inventoryFilter.date =
|
|
79
|
+
inventoryFilter.date = parentOperation?.dateCreated
|
|
80
|
+
? new Date(parentOperation.dateCreated).toISOString()
|
|
81
|
+
: operation?.dateCreated
|
|
82
|
+
? new Date(operation.dateCreated).toISOString()
|
|
83
|
+
: null;
|
|
80
84
|
// get stock item inventory
|
|
81
85
|
const res = await getStockItemInventory(inventoryFilter);
|
|
82
86
|
itemInventory = res.data?.results;
|
|
@@ -119,7 +123,7 @@ const StockOperationPrintButton: React.FC<StockOperationCancelButtonProps> = ({
|
|
|
119
123
|
renderIcon={(props) => <Printer size={16} {...props} />}
|
|
120
124
|
>
|
|
121
125
|
{loading || isLoading ? (
|
|
122
|
-
<InlineLoading description={t('
|
|
126
|
+
<InlineLoading description={t('loadingPlaceholder', 'Loading...')} iconDescription={t('loading', 'Loading')} />
|
|
123
127
|
) : (
|
|
124
128
|
t('print', 'Print')
|
|
125
129
|
)}
|
package/src/stock-operations/stock-operations-modal/stock-operations-reject-button.component.tsx
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import React, { useCallback } from 'react';
|
|
2
|
-
|
|
3
2
|
import { Button } from '@carbon/react';
|
|
4
|
-
import { showModal } from '@openmrs/esm-framework';
|
|
5
|
-
import { useTranslation } from 'react-i18next';
|
|
6
3
|
import { Repeat } from '@carbon/react/icons';
|
|
4
|
+
import { useTranslation } from 'react-i18next';
|
|
5
|
+
import { showModal } from '@openmrs/esm-framework';
|
|
7
6
|
import { type StockOperationDTO } from '../../core/api/types/stockOperation/StockOperationDTO';
|
|
8
7
|
|
|
9
8
|
interface StockOperationRejectButtonProps {
|
|
@@ -22,8 +21,8 @@ const StockOperationRejectButton: React.FC<StockOperationRejectButtonProps> = ({
|
|
|
22
21
|
}, [operation]);
|
|
23
22
|
|
|
24
23
|
return (
|
|
25
|
-
<Button onClick={launchRejectModal}
|
|
26
|
-
{t('reject', 'Reject
|
|
24
|
+
<Button onClick={launchRejectModal} renderIcon={(props) => <Repeat size={16} {...props} />}>
|
|
25
|
+
{t('reject', 'Reject')}
|
|
27
26
|
</Button>
|
|
28
27
|
);
|
|
29
28
|
};
|
|
@@ -109,7 +109,9 @@ const StockOperationsModal: React.FC<StockOperationsModalProps> = ({ title, requ
|
|
|
109
109
|
<ModalBody>
|
|
110
110
|
<div className={styles.modalBody}>
|
|
111
111
|
<section className={styles.section}>
|
|
112
|
-
<h5 className={styles.section}>
|
|
112
|
+
<h5 className={styles.section}>
|
|
113
|
+
{t('confirmOperation', 'Would you really like to {{title}} the operation?', { title })}
|
|
114
|
+
</h5>
|
|
113
115
|
</section>
|
|
114
116
|
<br />
|
|
115
117
|
{requireReason && (
|
|
@@ -118,7 +120,7 @@ const StockOperationsModal: React.FC<StockOperationsModalProps> = ({ title, requ
|
|
|
118
120
|
labelText={t('notes', 'Please explain the reason:')}
|
|
119
121
|
id="nextNotes"
|
|
120
122
|
name="nextNotes"
|
|
121
|
-
invalidText=
|
|
123
|
+
invalidText={t('required', 'Required')}
|
|
122
124
|
maxCount={500}
|
|
123
125
|
enableCounter
|
|
124
126
|
onChange={(e) => setNotes(e.target.value)}
|
|
@@ -148,16 +148,12 @@ const StockOperations: React.FC<StockOperationsTableProps> = () => {
|
|
|
148
148
|
}
|
|
149
149
|
|
|
150
150
|
return (
|
|
151
|
-
|
|
151
|
+
<>
|
|
152
152
|
<h2 className={styles.tableHeader}>
|
|
153
153
|
{t('stockOperationsTableHeader', 'Stock operations to track movement of stock.')}
|
|
154
154
|
</h2>
|
|
155
|
-
<DataTable
|
|
156
|
-
|
|
157
|
-
isSortable
|
|
158
|
-
rows={tableRows}
|
|
159
|
-
useZebraStyles
|
|
160
|
-
render={({
|
|
155
|
+
<DataTable headers={tableHeaders} isSortable rows={tableRows} useZebraStyles>
|
|
156
|
+
{({
|
|
161
157
|
expandRow,
|
|
162
158
|
getExpandedRowProps,
|
|
163
159
|
getHeaderProps,
|
|
@@ -190,8 +186,16 @@ const StockOperations: React.FC<StockOperationsTableProps> = () => {
|
|
|
190
186
|
onChange={([startDate, endDate]) => handleDateFilterChange([startDate, endDate])}
|
|
191
187
|
value={[selectedFromDate, selectedToDate]}
|
|
192
188
|
>
|
|
193
|
-
<DatePickerInput
|
|
194
|
-
|
|
189
|
+
<DatePickerInput
|
|
190
|
+
id="stock-operations-start-date"
|
|
191
|
+
labelText={t('startDate', 'Start date')}
|
|
192
|
+
placeholder={DATE_PICKER_FORMAT}
|
|
193
|
+
/>
|
|
194
|
+
<DatePickerInput
|
|
195
|
+
id="stock-operations-end-date"
|
|
196
|
+
labelText={t('endDate', 'End date')}
|
|
197
|
+
placeholder={DATE_PICKER_FORMAT}
|
|
198
|
+
/>
|
|
195
199
|
</DatePicker>
|
|
196
200
|
<StockOperationsFilters filterName={StockFilters.SOURCES} onFilterChange={handleOnFilterChange} />
|
|
197
201
|
<StockOperationsFilters filterName={StockFilters.STATUS} onFilterChange={handleOnFilterChange} />
|
|
@@ -274,12 +278,12 @@ const StockOperations: React.FC<StockOperationsTableProps> = () => {
|
|
|
274
278
|
) : null}
|
|
275
279
|
{Boolean(filterApplied && isLoading) && (
|
|
276
280
|
<div className={styles.rowLoadingContainer}>
|
|
277
|
-
<InlineLoading description={t('
|
|
281
|
+
<InlineLoading description={t('loadingPlaceholder', 'Loading...')} />
|
|
278
282
|
</div>
|
|
279
283
|
)}
|
|
280
284
|
</TableContainer>
|
|
281
285
|
)}
|
|
282
|
-
|
|
286
|
+
</DataTable>
|
|
283
287
|
{items.length > 0 && (
|
|
284
288
|
<Pagination
|
|
285
289
|
page={currentPage}
|
|
@@ -297,7 +301,7 @@ const StockOperations: React.FC<StockOperationsTableProps> = () => {
|
|
|
297
301
|
className={styles.paginationOverride}
|
|
298
302
|
/>
|
|
299
303
|
)}
|
|
300
|
-
|
|
304
|
+
</>
|
|
301
305
|
);
|
|
302
306
|
};
|
|
303
307
|
|
|
@@ -8,14 +8,14 @@ import {
|
|
|
8
8
|
ComboBox,
|
|
9
9
|
DatePicker,
|
|
10
10
|
DatePickerInput,
|
|
11
|
+
Form,
|
|
12
|
+
FormGroup,
|
|
11
13
|
InlineLoading,
|
|
12
14
|
NumberInput,
|
|
13
15
|
RadioButton,
|
|
14
16
|
RadioButtonGroup,
|
|
15
17
|
Select,
|
|
16
18
|
SelectItem,
|
|
17
|
-
Form,
|
|
18
|
-
FormGroup,
|
|
19
19
|
Stack,
|
|
20
20
|
} from '@carbon/react';
|
|
21
21
|
import {
|
|
@@ -112,7 +112,9 @@ const CreateReport: React.FC<CreateReportProps> = ({ model, closeWorkspace }) =>
|
|
|
112
112
|
useEffect(() => {
|
|
113
113
|
let hasResetParameters = false;
|
|
114
114
|
if (selectedReportName) {
|
|
115
|
-
const reportType = (reportTypes
|
|
115
|
+
const reportType = Array.isArray(reportTypes)
|
|
116
|
+
? reportTypes.find((p) => p.name === selectedReportName)
|
|
117
|
+
: undefined;
|
|
116
118
|
if (reportType) {
|
|
117
119
|
setDisplayDate(reportType.parameters?.some((p) => p === ReportParameter.Date));
|
|
118
120
|
setDisplayStartDate(reportType.parameters?.some((p) => p === ReportParameter.StartDate));
|
|
@@ -159,7 +161,7 @@ const CreateReport: React.FC<CreateReportProps> = ({ model, closeWorkspace }) =>
|
|
|
159
161
|
display: 'All Categories',
|
|
160
162
|
name: 'All Categories',
|
|
161
163
|
uuid: '',
|
|
162
|
-
} as
|
|
164
|
+
} as unknown as Concept,
|
|
163
165
|
...((items && items?.answers?.length > 0 ? items?.answers : items?.setMembers) ?? []),
|
|
164
166
|
];
|
|
165
167
|
}, [items]);
|
|
@@ -178,9 +180,9 @@ const CreateReport: React.FC<CreateReportProps> = ({ model, closeWorkspace }) =>
|
|
|
178
180
|
}
|
|
179
181
|
|
|
180
182
|
const handleSave = async (report: StockReportSchema) => {
|
|
181
|
-
const reportSystemName = (reportTypes
|
|
182
|
-
(reportType) => reportType.name === report.reportName
|
|
183
|
-
|
|
183
|
+
const reportSystemName = Array.isArray(reportTypes)
|
|
184
|
+
? reportTypes.find((reportType) => reportType.name === report.reportName)?.systemName
|
|
185
|
+
: undefined;
|
|
184
186
|
|
|
185
187
|
let hideSplash = true;
|
|
186
188
|
try {
|
|
@@ -331,14 +333,14 @@ const CreateReport: React.FC<CreateReportProps> = ({ model, closeWorkspace }) =>
|
|
|
331
333
|
if (response.status === 201) {
|
|
332
334
|
showSnackbar({
|
|
333
335
|
title: t('batchJob', 'Batch Job'),
|
|
334
|
-
subtitle: t('
|
|
336
|
+
subtitle: t('batchJobSuccess', 'Batch job created successfully'),
|
|
335
337
|
kind: 'success',
|
|
336
338
|
});
|
|
337
339
|
handleMutate(`${restBaseUrl}/stockmanagement/batchjob?batchJobType=Report&v=default`);
|
|
338
340
|
closeWorkspace();
|
|
339
341
|
} else {
|
|
340
342
|
showSnackbar({
|
|
341
|
-
title: t('
|
|
343
|
+
title: t('batchJobErrorTitle', 'Batch job'),
|
|
342
344
|
subtitle: t('batchJobErrorMessage', 'Error creating batch job'),
|
|
343
345
|
kind: 'error',
|
|
344
346
|
});
|
|
@@ -347,7 +349,7 @@ const CreateReport: React.FC<CreateReportProps> = ({ model, closeWorkspace }) =>
|
|
|
347
349
|
})
|
|
348
350
|
.catch(() => {
|
|
349
351
|
showSnackbar({
|
|
350
|
-
title: t('
|
|
352
|
+
title: t('batchJobErrorTitle', 'Batch job'),
|
|
351
353
|
subtitle: t('batchJobErrorMessage', 'Error creating batch job'),
|
|
352
354
|
kind: 'error',
|
|
353
355
|
});
|
|
@@ -360,6 +362,7 @@ const CreateReport: React.FC<CreateReportProps> = ({ model, closeWorkspace }) =>
|
|
|
360
362
|
}
|
|
361
363
|
}
|
|
362
364
|
};
|
|
365
|
+
|
|
363
366
|
const getReportParameter = (
|
|
364
367
|
name: string,
|
|
365
368
|
value: string,
|
|
@@ -381,8 +384,8 @@ const CreateReport: React.FC<CreateReportProps> = ({ model, closeWorkspace }) =>
|
|
|
381
384
|
render={({ field: { onChange } }) => (
|
|
382
385
|
<ComboBox
|
|
383
386
|
id="report"
|
|
384
|
-
|
|
385
|
-
items={reportTypes}
|
|
387
|
+
titleText={t('reportName', 'Report name')}
|
|
388
|
+
items={Array.isArray(reportTypes) ? reportTypes : [reportTypes]}
|
|
386
389
|
itemToString={(item) => `${item?.name ?? item?.name ?? ''}`}
|
|
387
390
|
placeholder={t('filter', 'Filter...')}
|
|
388
391
|
onChange={({ selectedItem }) => {
|
|
@@ -405,7 +408,7 @@ const CreateReport: React.FC<CreateReportProps> = ({ model, closeWorkspace }) =>
|
|
|
405
408
|
<ComboBox
|
|
406
409
|
id="stockReportItem"
|
|
407
410
|
size="md"
|
|
408
|
-
|
|
411
|
+
titleText={t('stockItemCategory', 'Stock Item Category')}
|
|
409
412
|
items={stockItemCategories}
|
|
410
413
|
onChange={({ selectedItem }) => {
|
|
411
414
|
onChange(selectedItem.uuid);
|
|
@@ -433,11 +436,9 @@ const CreateReport: React.FC<CreateReportProps> = ({ model, closeWorkspace }) =>
|
|
|
433
436
|
>
|
|
434
437
|
<DatePickerInput
|
|
435
438
|
id="startDate"
|
|
436
|
-
name="startDate"
|
|
437
439
|
placeholder={DATE_PICKER_FORMAT}
|
|
438
|
-
labelText={t('startDate', 'Start
|
|
439
|
-
|
|
440
|
-
invalid={errors?.startDate?.message}
|
|
440
|
+
labelText={t('startDate', 'Start date')}
|
|
441
|
+
invalid={!!errors?.startDate?.message}
|
|
441
442
|
invalidText={errors?.startDate?.message}
|
|
442
443
|
/>
|
|
443
444
|
</DatePicker>
|
|
@@ -459,11 +460,9 @@ const CreateReport: React.FC<CreateReportProps> = ({ model, closeWorkspace }) =>
|
|
|
459
460
|
>
|
|
460
461
|
<DatePickerInput
|
|
461
462
|
id="endDate"
|
|
462
|
-
name="endDate"
|
|
463
463
|
placeholder={DATE_PICKER_FORMAT}
|
|
464
|
-
labelText={t('endDate', 'End
|
|
465
|
-
|
|
466
|
-
invalid={errors?.endDate?.message}
|
|
464
|
+
labelText={t('endDate', 'End date')}
|
|
465
|
+
invalid={!!errors?.endDate?.message}
|
|
467
466
|
invalidText={errors?.endDate?.message}
|
|
468
467
|
/>
|
|
469
468
|
</DatePicker>
|
|
@@ -474,15 +473,15 @@ const CreateReport: React.FC<CreateReportProps> = ({ model, closeWorkspace }) =>
|
|
|
474
473
|
<Select
|
|
475
474
|
id="inventoryGroupBy"
|
|
476
475
|
defaultValue={model?.inventoryGroupBy}
|
|
477
|
-
invalid={errors?.inventoryGroupBy?.message}
|
|
476
|
+
invalid={!!errors?.inventoryGroupBy?.message}
|
|
478
477
|
invalidText={errors?.inventoryGroupBy?.message}
|
|
479
478
|
labelText={t('inventoryBy', 'Inventory by')}
|
|
480
479
|
onChange={(e) => setValue('inventoryGroupBy', e.target.value)}
|
|
481
480
|
>
|
|
482
|
-
<SelectItem value="" text={t('
|
|
481
|
+
<SelectItem value="" text={t('selectOption', 'Select an option')} />
|
|
483
482
|
<SelectItem value="StockItemOnly" text={t('stockItem', 'Stock Item')} />
|
|
484
|
-
<SelectItem value="LocationStockItem" text={t('locationAndStockItem', 'Location and
|
|
485
|
-
<SelectItem value="LocationStockItemBatchNo" text={t('
|
|
483
|
+
<SelectItem value="LocationStockItem" text={t('locationAndStockItem', 'Location and stock item')} />
|
|
484
|
+
<SelectItem value="LocationStockItemBatchNo" text={t('locationAndBatchNo', 'Location and batch')} />
|
|
486
485
|
</Select>
|
|
487
486
|
)}
|
|
488
487
|
{displayLocation && (
|
|
@@ -497,7 +496,7 @@ const CreateReport: React.FC<CreateReportProps> = ({ model, closeWorkspace }) =>
|
|
|
497
496
|
setValue('location', selectedLocation?.name || '');
|
|
498
497
|
}}
|
|
499
498
|
defaultValue=""
|
|
500
|
-
invalid={errors?.location?.message}
|
|
499
|
+
invalid={!!errors?.location?.message}
|
|
501
500
|
invalidText={errors?.location?.message}
|
|
502
501
|
>
|
|
503
502
|
<SelectItem disabled hidden value="" text={t('chooseALocation', 'Choose a location')} />
|
|
@@ -514,7 +513,7 @@ const CreateReport: React.FC<CreateReportProps> = ({ model, closeWorkspace }) =>
|
|
|
514
513
|
<Checkbox
|
|
515
514
|
id="childLocations"
|
|
516
515
|
onChange={onChange}
|
|
517
|
-
|
|
516
|
+
checked={value}
|
|
518
517
|
labelText={t('includeChildLocations', 'Include Child Locations')}
|
|
519
518
|
/>
|
|
520
519
|
)}
|
|
@@ -526,7 +525,7 @@ const CreateReport: React.FC<CreateReportProps> = ({ model, closeWorkspace }) =>
|
|
|
526
525
|
name="mostLeastMoving"
|
|
527
526
|
render={({ field: { onChange, value } }) => (
|
|
528
527
|
<RadioButtonGroup name="mostLeastMoving" legendText={t('rank', 'Rank')} onChange={onChange} value={value}>
|
|
529
|
-
<RadioButton value="MostMoving" id="mostLeastMovingMost" labelText={t('mostMoving', 'Most
|
|
528
|
+
<RadioButton value="MostMoving" id="mostLeastMovingMost" labelText={t('mostMoving', 'Most moving')} />
|
|
530
529
|
<RadioButton
|
|
531
530
|
value="LeastMoving"
|
|
532
531
|
id="mostLeastMovingLeast"
|
|
@@ -547,9 +546,8 @@ const CreateReport: React.FC<CreateReportProps> = ({ model, closeWorkspace }) =>
|
|
|
547
546
|
disableWheel
|
|
548
547
|
hideSteppers
|
|
549
548
|
value={value}
|
|
550
|
-
|
|
549
|
+
onChange={onChange}
|
|
551
550
|
label={t('limit', 'Limit')}
|
|
552
|
-
defaultValue={20}
|
|
553
551
|
/>
|
|
554
552
|
)}
|
|
555
553
|
/>
|
|
@@ -633,11 +631,9 @@ const CreateReport: React.FC<CreateReportProps> = ({ model, closeWorkspace }) =>
|
|
|
633
631
|
>
|
|
634
632
|
<DatePickerInput
|
|
635
633
|
id="date"
|
|
636
|
-
name="date"
|
|
637
634
|
placeholder={DATE_PICKER_FORMAT}
|
|
638
635
|
labelText={t('date', 'Date')}
|
|
639
|
-
|
|
640
|
-
invalid={errors?.date?.message}
|
|
636
|
+
invalid={!!errors?.date?.message}
|
|
641
637
|
invalidText={errors?.date?.message}
|
|
642
638
|
/>
|
|
643
639
|
</DatePicker>
|
|
@@ -652,10 +648,10 @@ const CreateReport: React.FC<CreateReportProps> = ({ model, closeWorkspace }) =>
|
|
|
652
648
|
[styles.desktop]: !isTablet,
|
|
653
649
|
})}
|
|
654
650
|
>
|
|
655
|
-
<Button kind="secondary" onClick={closeWorkspace} className={styles.button}>
|
|
651
|
+
<Button kind="secondary" onClick={() => closeWorkspace()} className={styles.button}>
|
|
656
652
|
{getCoreTranslation('cancel')}
|
|
657
653
|
</Button>
|
|
658
|
-
<Button type="submit" className={styles.button}
|
|
654
|
+
<Button type="submit" className={styles.button}>
|
|
659
655
|
{getCoreTranslation('save')}
|
|
660
656
|
</Button>
|
|
661
657
|
</ButtonSet>
|