@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,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.display : 'Not Set')}
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
  </>
@@ -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 { NumberInputSkeleton } from '@carbon/react';
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 styles from './printable-transaction-header.scss';
3
- import { useConfig } from '@openmrs/esm-framework';
2
+ import { startCase } from 'lodash-es';
4
3
  import { useTranslation } from 'react-i18next';
5
- import startCase from 'lodash-es/startCase';
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('bincard', 'Bin Card')}</p>
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('itemname', 'Item Name')}</p>
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/startCase';
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('bincard', 'Stock Card')}</p>
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('itemname', 'Item Name')}</p>
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>
@@ -1,13 +1,12 @@
1
1
  import React, { useEffect, useMemo, useState } from 'react';
2
- import { Button, Stack, ComboButton, MenuItem } from '@carbon/react';
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('printbincard', 'Print Bin Card')} />
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="All" value="" id="is-drug-all" />
19
- <RadioButton labelText="Pharmaceuticals" value="true" id="is-drug-drug" />
20
- <RadioButton labelText="Non Pharmaceuticals" value="false" id="is-drug-other" />
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 Stock Item')}
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 Name'),
84
+ header: t('genericName', 'Generic name'),
84
85
  key: 'genericName',
85
86
  },
86
87
  {
87
88
  id: 2,
88
- header: t('commonName', 'Common Name'),
89
+ header: t('commonName', 'Common name'),
89
90
  key: 'commonName',
90
91
  },
91
92
  {
92
93
  id: 3,
93
- header: t('tradeName', 'Trade Name'),
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 Packaging'),
104
+ header: t('defaultStockOperationsUoMName', 'Bulk packaging'),
104
105
  key: 'defaultStockOperationsUoMName',
105
106
  },
106
107
  {
107
108
  id: 6,
108
- header: t('reorderLevel', 'Reorder Level'),
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={tableRows}
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) => handleSearch(e.target.value)}
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
- {header.header?.content ?? header.header}
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
- ></DataTable>
258
+ </DataTable>
253
259
  <Pagination
254
260
  className={styles.paginationOverride}
255
261
  onChange={({ page, pageSize }) => {
@@ -1,4 +1,4 @@
1
- import { useEffect, useMemo, useState } from 'react';
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 { z } from 'zod';
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('formCreated', 'Add Location'),
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
- <LocationAdministrationForm
65
- onModalChange={onModalChange}
66
- showModal={showModal}
67
- handleCreateQuestion={handleCreateQuestion}
68
- headerTitle={headerTitle}
69
- initialData={initialData}
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('location', 'Location Name')}
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 tag(s)')}
120
- helperText="This is helper text"
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) => (item ? item.display : '')}
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 { mutate } from 'swr';
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('noStockItemsToDisplay', 'No stock items to display')}</p>
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 any })}`;
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 Management')}</div>
14
+ <div className="content">{t('stockManagement', 'Stock management')}</div>
15
15
  </div>
16
16
  <div className="iconWrapper">
17
17
  <ArrowRight size={16} />
@@ -1,3 +1,5 @@
1
+ import React, { useMemo, useState } from 'react';
2
+ import { useTranslation } from 'react-i18next';
1
3
  import {
2
4
  DataTable,
3
5
  Pagination,
@@ -11,8 +13,6 @@ import {
11
13
  Tile,
12
14
  } from '@carbon/react';
13
15
  import { formatDate, parseDate, usePagination } from '@openmrs/esm-framework';
14
- import React, { useMemo, useState } from 'react';
15
- import { useTranslation } from 'react-i18next';
16
16
  import { type StockOperationItemDTO } from '../../../core/api/types/stockOperation/StockOperationItemDTO';
17
17
  import styles from './stock-items-table.scss';
18
18
 
@@ -23,7 +23,7 @@ const StockItemsTable: React.FC<Props> = ({ items }) => {
23
23
  const { t } = useTranslation();
24
24
  const [pageSize, setPageSize] = useState(10);
25
25
  const pageSizesOptions = useMemo(() => [5, 10, 20, 50, 100], []);
26
- const [searchText, setSearchText] = useState();
26
+ const [searchText, setSearchText] = useState<string>('');
27
27
 
28
28
  const handleSearch = (item: StockOperationItemDTO) => {
29
29
  if (!searchText) return true;
@@ -39,7 +39,7 @@ const StockItemsTable: React.FC<Props> = ({ items }) => {
39
39
  key: 'commonName',
40
40
  },
41
41
  {
42
- header: t('batchNo', 'Batch No'),
42
+ header: t('batchNo', 'Batch number'),
43
43
  key: 'batchNo',
44
44
  },
45
45
  {
@@ -47,11 +47,11 @@ const StockItemsTable: React.FC<Props> = ({ items }) => {
47
47
  key: 'expiration',
48
48
  },
49
49
  {
50
- header: t('qty', 'Qty'),
50
+ header: t('quantity', 'Quantity'),
51
51
  key: 'quantity',
52
52
  },
53
53
  {
54
- header: t('uom', 'UoM'),
54
+ header: t('uom', 'Unit of Measurement'),
55
55
  key: 'stockItemPackagingUOMName',
56
56
  },
57
57
  ],
@@ -71,8 +71,12 @@ const StockItemsTable: React.FC<Props> = ({ items }) => {
71
71
  return (
72
72
  <Tile className={styles.container}>
73
73
  <span className={styles.title}>{t('stockItems', 'Stock items')}</span>
74
- <Search value={searchText} onChange={({ target: { value } }) => setSearchText(value)} />
75
- <DataTable useZebraStyles={true} rows={tableRows} headers={headers}>
74
+ <Search
75
+ labelText={t('search', 'Search')}
76
+ value={searchText}
77
+ onChange={({ target: { value } }) => setSearchText(value as string)}
78
+ />
79
+ <DataTable useZebraStyles rows={tableRows} headers={headers}>
76
80
  {({ rows, headers, getTableProps, getHeaderProps, getRowProps }) => (
77
81
  <Table {...getTableProps()}>
78
82
  <TableHead>
@@ -86,8 +86,8 @@ const StockOperationExpandedRow: React.FC<StockOperationExpandedRowProps> = (pro
86
86
  <Row className={styles.statusContainerRow}>
87
87
  {isLoading && (
88
88
  <InlineLoading
89
- description={t('loading StockoperationLinks', 'Loading stock operation links') + '...'}
90
- iconDescription={t('loading StockoperationLinks', 'Loading stock operation links')}
89
+ description={t('loadingStockOperationLinks', 'Loading stock operation links...')}
90
+ iconDescription={t('loadingStockOperationLinksIcon', 'Loading stock operation links')}
91
91
  />
92
92
  )}
93
93
  {currentOperationType && (
@@ -100,8 +100,8 @@ const StockOperationExpandedRow: React.FC<StockOperationExpandedRowProps> = (pro
100
100
  <Row className={styles.statusContainerRow}>
101
101
  {isLoading && (
102
102
  <InlineLoading
103
- description={t('loadingOperationActions', 'Loading stock operation actions') + '...'}
104
- iconDescription={t('loadingOperationActions', 'Loading stock operation actions')}
103
+ description={t('loadingOperationActions', 'Loading stock operation actions...')}
104
+ iconDescription={t('loadingOperationActionsIcon', 'Loading stock operation actions')}
105
105
  />
106
106
  )}
107
107
  {currentOperationType && (
@@ -1,12 +1,12 @@
1
- import { IconButton, InlineLoading } from '@carbon/react';
1
+ import React, { useCallback, useEffect, useMemo } from 'react';
2
+ import { Button, InlineLoading } from '@carbon/react';
2
3
  import { Edit } from '@carbon/react/icons';
3
4
  import { showSnackbar } from '@openmrs/esm-framework';
4
- import React, { useCallback, useEffect, useMemo } from 'react';
5
5
  import { useTranslation } from 'react-i18next';
6
6
  import { type StockOperationDTO } from '../../core/api/types/stockOperation/StockOperationDTO';
7
7
  import { launchStockoperationAddOrEditWorkSpace } from '../stock-operation.utils';
8
- import useFilteredOperationTypesByRoles from '../stock-operations-forms/hooks/useFilteredOperationTypesByRoles';
9
8
  import { useStockOperationAndItems } from '../stock-operations.resource';
9
+ import useFilteredOperationTypesByRoles from '../stock-operations-forms/hooks/useFilteredOperationTypesByRoles';
10
10
  import styles from './edit-stock-operation-button.scss';
11
11
 
12
12
  interface EditStockOperationActionMenuProps {
@@ -51,7 +51,7 @@ const EditStockOperationActionMenu: React.FC<EditStockOperationActionMenuProps>
51
51
  if (operationTypesError || stockOperationError) {
52
52
  showSnackbar({
53
53
  kind: 'error',
54
- title: t('stockOperationError', 'Error loading stock operation'),
54
+ title: t('stockOperationLoadError', 'Error loading stock operation'),
55
55
  subtitle: operationTypesError?.message || stockOperationError?.message || '',
56
56
  });
57
57
  }
@@ -66,16 +66,15 @@ const EditStockOperationActionMenu: React.FC<EditStockOperationActionMenuProps>
66
66
  }
67
67
 
68
68
  return (
69
- <IconButton
69
+ <Button
70
70
  className={styles.editStockButton}
71
71
  kind="ghost"
72
72
  size="sm"
73
73
  onClick={handleLaunchWorkspace}
74
- label={t('editStockOperation', 'Edit Stock Operation')}
75
74
  renderIcon={showIcon ? () => <Edit size={16} /> : undefined}
76
75
  >
77
76
  {showprops && <span className={styles.operationNumberText}>{fetchedStockOperation?.operationNumber}</span>}
78
- </IconButton>
77
+ </Button>
79
78
  );
80
79
  };
81
80
 
@@ -1,9 +1,11 @@
1
- import styles from './stock-operation-operations-filter.scss';
2
- import { Dropdown, DropdownSkeleton } from '@carbon/react';
3
1
  import React from 'react';
2
+ import { Dropdown, DropdownSkeleton } from '@carbon/react';
3
+ import { useTranslation } from 'react-i18next';
4
4
  import { useStockOperationTypes } from '../../stock-lookups/stock-lookups.resource';
5
+ import styles from './stock-operation-operations-filter.scss';
5
6
 
6
7
  const StockOperationOperationsFilter: React.FC = () => {
8
+ const { t } = useTranslation();
7
9
  // get stock sources
8
10
  const { types, isLoading, error } = useStockOperationTypes();
9
11
  if (isLoading || error) {
@@ -15,9 +17,11 @@ const StockOperationOperationsFilter: React.FC = () => {
15
17
  <Dropdown
16
18
  id="stockOperationOperationsFiter"
17
19
  items={types.results}
18
- itemToString={(item) => (item ? item.name : 'Not Set')}
20
+ itemToString={(item) => (item ? item.name : t('notSet', 'Not Set'))}
19
21
  type="inline"
20
22
  size="sm"
23
+ label={t('filterByOperationType', 'Filter by operation type')}
24
+ titleText={t('operationType', 'Operation Type')}
21
25
  />
22
26
  </div>
23
27
  </>
@@ -1,11 +1,13 @@
1
- import styles from './stock-operation-sources-filter.scss';
2
- import { Dropdown, DropdownSkeleton } from '@carbon/react';
3
1
  import React from 'react';
4
- import { useConcept } from '../../stock-lookups/stock-lookups.resource';
2
+ import { Dropdown, DropdownSkeleton } from '@carbon/react';
3
+ import { useTranslation } from 'react-i18next';
5
4
  import { type ConfigObject } from '../../config-schema';
5
+ import { useConcept } from '../../stock-lookups/stock-lookups.resource';
6
6
  import { useConfig } from '@openmrs/esm-framework';
7
+ import styles from './stock-operation-sources-filter.scss';
7
8
 
8
9
  const StockOperationSourcesFilter: React.FC = () => {
10
+ const { t } = useTranslation();
9
11
  const { stockSourceTypeUUID } = useConfig<ConfigObject>();
10
12
 
11
13
  // get stock sources
@@ -19,9 +21,11 @@ const StockOperationSourcesFilter: React.FC = () => {
19
21
  <Dropdown
20
22
  id="stockOperationSourcesFiter"
21
23
  items={[...items.answers]}
22
- itemToString={(item) => (item ? item.display : 'Not Set')}
24
+ itemToString={(item) => (item ? item.display : t('notSet', 'Not Set'))}
23
25
  type="inline"
24
26
  size="sm"
27
+ label={t('filterBySource', 'Filter by source')}
28
+ titleText={t('source', 'Source')}
25
29
  />
26
30
  </div>
27
31
  </>