@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.
Files changed (112) hide show
  1. package/.husky/pre-commit +0 -5
  2. package/.husky/pre-push +0 -3
  3. package/dist/130.js +1 -1
  4. package/dist/130.js.map +1 -1
  5. package/dist/2177.js +1 -1
  6. package/dist/2177.js.map +1 -1
  7. package/dist/3220.js +1 -1
  8. package/dist/3220.js.map +1 -1
  9. package/dist/4300.js +1 -1
  10. package/dist/4732.js +1 -1
  11. package/dist/4732.js.map +1 -1
  12. package/dist/5125.js +1 -1
  13. package/dist/5125.js.map +1 -1
  14. package/dist/5333.js +1 -1
  15. package/dist/5333.js.map +1 -1
  16. package/dist/5609.js +1 -1
  17. package/dist/5609.js.map +1 -1
  18. package/dist/6184.js +1 -1
  19. package/dist/6184.js.map +1 -1
  20. package/dist/6757.js +1 -1
  21. package/dist/6757.js.map +1 -1
  22. package/dist/8161.js +1 -1
  23. package/dist/8161.js.map +1 -1
  24. package/dist/9186.js +1 -1
  25. package/dist/9186.js.map +1 -1
  26. package/dist/main.js +1 -1
  27. package/dist/main.js.map +1 -1
  28. package/dist/openmrs-esm-stock-management-app.js.buildmanifest.json +41 -41
  29. package/dist/routes.json +1 -1
  30. package/package.json +1 -1
  31. package/src/constants.ts +2 -3
  32. package/src/core/components/carbon/controlled-combo-box.component.tsx +12 -9
  33. package/src/core/components/carbon/controlled-radio-button-group.component.tsx +21 -16
  34. package/src/core/components/table/table.component.tsx +26 -17
  35. package/src/core/components/table/table.scss +4 -0
  36. package/src/core/components/table/types.ts +12 -0
  37. package/src/core/components/tabs/vertical-tabs.component.tsx +2 -6
  38. package/src/declarations.d.ts +0 -3
  39. package/src/stock-home/stock-home-inventory-card.component.tsx +2 -2
  40. package/src/stock-items/add-stock-item/add-stock-item.component.tsx +1 -1
  41. package/src/stock-items/add-stock-item/batch-information/batch-information-locations/batch-information-locations-filter.component.tsx +0 -3
  42. package/src/stock-items/add-stock-item/batch-information/batch-information.component.tsx +4 -4
  43. package/src/stock-items/add-stock-item/dispensing-package-measurement/dispensing-package-measurement.component.tsx +2 -5
  44. package/src/stock-items/add-stock-item/drug-selector/drug-selector.component.tsx +4 -8
  45. package/src/stock-items/add-stock-item/packaging-units/packaging-units-delete.modal.tsx +2 -2
  46. package/src/stock-items/add-stock-item/packaging-units/packaging-units.component.tsx +32 -18
  47. package/src/stock-items/add-stock-item/packaging-units-concept-selector/packaging-units-concept-selector.component.tsx +2 -5
  48. package/src/stock-items/add-stock-item/preferred-vendor-selector/preferred-vendor-selector.component.tsx +0 -3
  49. package/src/stock-items/add-stock-item/stock-item-category-selector/stock-item-category-selector.component.tsx +2 -5
  50. package/src/stock-items/add-stock-item/stock-item-details/stock-item-details.component.tsx +10 -10
  51. package/src/stock-items/add-stock-item/stock-item-references/stock-item-references.component.tsx +36 -27
  52. package/src/stock-items/add-stock-item/stock-item-references/stock-references-selector.component.tsx +2 -5
  53. package/src/stock-items/add-stock-item/stock-item-rules/add-stock-rules.component.tsx +16 -16
  54. package/src/stock-items/add-stock-item/stock-item-rules/stock-item-rules.component.tsx +10 -9
  55. package/src/stock-items/add-stock-item/stock-item-rules/stock-rules-filter.component.tsx +8 -3
  56. package/src/stock-items/add-stock-item/stock-item-units-edit/stock-item-units-edit.component.tsx +2 -2
  57. package/src/stock-items/add-stock-item/transactions/printout/printable-bincard-transaction-header.component.tsx +5 -5
  58. package/src/stock-items/add-stock-item/transactions/printout/printable-stockcard-transaction-header.component.tsx +3 -3
  59. package/src/stock-items/add-stock-item/transactions/printout/transactions-print-action.component.tsx +2 -5
  60. package/src/stock-items/add-stock-item/transactions/printout/transactions-print-bincard-preview.modal.tsx +1 -1
  61. package/src/stock-items/add-stock-item/transactions/transaction-filters/transaction-locations-filter.component.tsx +0 -3
  62. package/src/stock-items/components/filter-stock-items/filter-stock-items.component.tsx +6 -4
  63. package/src/stock-items/edit-stock-item/edit-stock-item-action-menu.component.tsx +1 -1
  64. package/src/stock-items/stock-items-table.component.tsx +21 -15
  65. package/src/stock-items/stock-items-table.resource.ts +1 -1
  66. package/src/stock-items/stock-items.resource.ts +1 -2
  67. package/src/stock-locations/add-locations-form.workspace.tsx +9 -11
  68. package/src/stock-locations/location-admin-form.component.tsx +9 -4
  69. package/src/stock-locations/stock-locations-table.component.tsx +3 -3
  70. package/src/stock-lookups/stock-lookups.resource.ts +2 -2
  71. package/src/stock-management-admin-card-link.component.tsx +1 -1
  72. package/src/stock-operations/add-stock-operation/stock-operations-expanded-row/stock-items-table.tsx +12 -8
  73. package/src/stock-operations/add-stock-operation/stock-operations-expanded-row/stock-operation-expanded-row.component.tsx +4 -4
  74. package/src/stock-operations/edit-stock-operation/edit-stock-operation-action-menu.component.tsx +6 -7
  75. package/src/stock-operations/stock-operation-operations-filter/stock-operation-operations-filter.component.tsx +7 -3
  76. package/src/stock-operations/stock-operation-sources-filter/stock-operation-sources-filter.component.tsx +8 -4
  77. package/src/stock-operations/stock-operation-statuses-filter/stock-operation-statuses-filter.component.tsx +16 -14
  78. package/src/stock-operations/stock-operation-types-selector/stock-operation-types-selector.component.tsx +4 -4
  79. package/src/stock-operations/stock-operations-filters.component.tsx +4 -2
  80. package/src/stock-operations/stock-operations-forms/input-components/batch-no-selector.component.tsx +2 -2
  81. package/src/stock-operations/stock-operations-forms/input-components/batch-no-selector.test.tsx +1 -1
  82. package/src/stock-operations/stock-operations-forms/input-components/qty-uim-selector.test.tsx +1 -1
  83. package/src/stock-operations/stock-operations-forms/input-components/quantity-uom-selector.component.tsx +3 -3
  84. package/src/stock-operations/stock-operations-forms/input-components/stock-item-search.component.tsx +3 -4
  85. package/src/stock-operations/stock-operations-forms/input-components/stock-operation-reason-selector.component.tsx +3 -3
  86. package/src/stock-operations/stock-operations-forms/input-components/users-selector.component.tsx +6 -6
  87. package/src/stock-operations/stock-operations-forms/step2.test.tsx +1 -5
  88. package/src/stock-operations/stock-operations-forms/steps/base-operation-details-form-step.tsx +15 -16
  89. package/src/stock-operations/stock-operations-forms/steps/quantity-uom-cell.component.tsx +1 -1
  90. package/src/stock-operations/stock-operations-forms/steps/received-items.component.tsx +2 -2
  91. package/src/stock-operations/stock-operations-forms/steps/stock-operation-items-form-step.component.tsx +24 -21
  92. package/src/stock-operations/stock-operations-forms/steps/stock-operation-submission-form-step.component.tsx +4 -4
  93. package/src/stock-operations/stock-operations-forms/stock-item-form/stock-item-form.workspace.tsx +60 -53
  94. package/src/stock-operations/stock-operations-forms/stock-operation-form.component.tsx +17 -12
  95. package/src/stock-operations/stock-operations-modal/stock-operations-completed-dispatch-button.component.tsx +1 -1
  96. package/src/stock-operations/stock-operations-modal/stock-operations-issue-stock-button.component.tsx +1 -1
  97. package/src/stock-operations/stock-operations-modal/stock-operations-print-button.component.tsx +6 -2
  98. package/src/stock-operations/stock-operations-modal/stock-operations-reject-button.component.tsx +4 -5
  99. package/src/stock-operations/stock-operations-modal/stock-operations.modal.tsx +4 -2
  100. package/src/stock-operations/stock-operations-table.component.tsx +16 -12
  101. package/src/stock-operations/stock-operations-table.resource.ts +1 -0
  102. package/src/stock-reports/generate-report/create-stock-report.workspace.tsx +31 -35
  103. package/src/stock-reports/report-list/stock-reports.component.tsx +5 -9
  104. package/src/stock-reports/stock-reports.resource.ts +1 -1
  105. package/src/stock-sources/add-stock-sources/add-stock-sources.workspace.tsx +6 -6
  106. package/src/stock-sources/stock-sources-items-table.component.tsx +14 -10
  107. package/src/stock-user-role-scopes/add-stock-user-scope/add-stock-user-role-scope.workspace.tsx +52 -53
  108. package/src/stock-user-role-scopes/delete-stock-user-scope/delete-stock-user-scope.component.tsx +1 -1
  109. package/src/stock-user-role-scopes/delete-stock-user-scope.modal.tsx +4 -1
  110. package/src/stock-user-role-scopes/stock-user-role-scopes-items-table.component.tsx +8 -12
  111. package/translations/en.json +105 -71
  112. package/src/core/components/carbon/controlled-dropdown.component.tsx +0 -37
@@ -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
- const form = useForm<z.infer<typeof formSchema>>({
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 any) && (
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 any}
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 Number')}
94
- labelText={t('batchNumber', 'Batch Number')}
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 any}
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 any) && (
120
+ fields.includes('expiration' as keyof FormData) && (
120
121
  <Column>
121
122
  <Controller
122
123
  control={form.control}
123
- name={'expiration' as any}
124
- render={({ field, fieldState: { error } }) => (
125
- <DatePicker
126
- id={`expiration`}
127
- datePickerType="single"
128
- minDate={formatForDatePicker(today())}
129
- locale="en"
130
- className={styles.datePickerInput}
131
- dateFormat={DATE_PICKER_CONTROL_FORMAT}
132
- value={field.value}
133
- name={field.name}
134
- disabled={field.disabled}
135
- onChange={([newDate]) => {
136
- field.onChange(newDate);
137
- }}
138
- >
139
- <DatePickerInput
140
- autoComplete="off"
141
- id={`expiration-input`}
142
- name="operationDate"
143
- placeholder={DATE_PICKER_FORMAT}
144
- labelText={t('expiriation', 'Expiration Date')}
145
- invalid={error?.message}
146
- invalidText={error?.message}
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('qty', 'Qty')}
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 any) && (
187
+ {operationTypePermision?.canCaptureQuantityPrice && fields.includes('purchasePrice' as keyof FormData) && (
189
188
  <Column>
190
189
  <Controller
191
190
  control={form.control}
192
- name={'purchasePrice' as any}
193
- render={({ field, fieldState: { error } }) => (
194
- <TextInput
195
- {...field}
196
- labelText={t('purchasePrice', 'Purchase Price')}
197
- invalid={error?.message}
198
- invalidText={error?.message}
199
- id={`purchaseprice`}
200
- placeholder={t('purchasePrice', 'Purchase Price')}
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!.operationDate as any) : today(),
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 as any) : undefined },
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?.map((item) =>
106
- pick(
107
- { ...item, expiration: item?.expiration ? parseDate(item.expiration as any) : undefined },
108
- stockOperationItemFormSchema.keyof().options,
109
- ),
110
- ) ?? []) as any,
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!.operationDate as any) : today(),
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 Array<BaseStockOperationItemFormData>;
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('stockOperationItems', items as any);
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 Items'),
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('complete', 'Complete Dispatch ')}
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('stockOperationError', 'Error loading stock operation types'),
32
+ title: t('stockOperationTypesError', 'Error loading stock operation types'),
33
33
  subtitle: error?.message,
34
34
  });
35
35
  }
@@ -76,7 +76,11 @@ const StockOperationPrintButton: React.FC<StockOperationCancelButtonProps> = ({
76
76
  inventoryFilter.groupBy = 'LocationStockItem';
77
77
  inventoryFilter.includeStockItemName = 'true';
78
78
 
79
- inventoryFilter.date = (parentOperation?.dateCreated ?? operation?.dateCreated) as any;
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('loading', 'Loading') + '...'} iconDescription={t('loading', 'Loading')} />
126
+ <InlineLoading description={t('loadingPlaceholder', 'Loading...')} iconDescription={t('loading', 'Loading')} />
123
127
  ) : (
124
128
  t('print', 'Print')
125
129
  )}
@@ -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} kind="" renderIcon={(props) => <Repeat size={16} {...props} />}>
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}>Would you really like to {title} the operation ?</h5>
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="Required"
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
- <div>
151
+ <>
152
152
  <h2 className={styles.tableHeader}>
153
153
  {t('stockOperationsTableHeader', 'Stock operations to track movement of stock.')}
154
154
  </h2>
155
- <DataTable
156
- headers={tableHeaders}
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 labelText={t('startDate', 'Start date')} placeholder={DATE_PICKER_FORMAT} />
194
- <DatePickerInput labelText={t('endDate', 'End date')} placeholder={DATE_PICKER_FORMAT} />
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('loading', 'Loading...')} />
281
+ <InlineLoading description={t('loadingPlaceholder', 'Loading...')} />
278
282
  </div>
279
283
  )}
280
284
  </TableContainer>
281
285
  )}
282
- ></DataTable>
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
- </div>
304
+ </>
301
305
  );
302
306
  };
303
307
 
@@ -53,6 +53,7 @@ export function useStockOperationPages(filter: StockOperationFilter) {
53
53
  {
54
54
  id: 7,
55
55
  key: 'details',
56
+ header: '',
56
57
  },
57
58
  { key: 'actions', header: '' },
58
59
  ],
@@ -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 as any)?.find((p) => p.name === selectedReportName);
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 any as Concept,
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 as any).find(
182
- (reportType) => reportType.name === report.reportName,
183
- )?.systemName;
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('BatchJobSuccess', 'Batch job created successfully'),
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('BatchJobErrorTitle', 'Batch job'),
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('BatchJobErrorTitle', 'Batch job'),
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
- labelText={t('reportName', 'Report name')}
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
- labelText={t('stockItemCategory', 'Stock Item Category')}
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 Date')}
439
- defaultValue=""
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 Date')}
465
- defaultValue=""
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('SelectOption', 'Select an option')} />
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 Stock Item')} />
485
- <SelectItem value="LocationStockItemBatchNo" text={t('locationAndBatchno', 'Location and Batch')} />
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
- value={value}
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 Moving')} />
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
- onchange={onChange}
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
- defaultValue=""
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} onClick={handleSave}>
654
+ <Button type="submit" className={styles.button}>
659
655
  {getCoreTranslation('save')}
660
656
  </Button>
661
657
  </ButtonSet>