@openmrs/esm-stock-management-app 1.0.1-pre.777 → 1.0.1-pre.785
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/__mocks__/index.ts +1 -0
- package/__mocks__/operation-type.mock.ts +532 -0
- package/dist/155.js +1 -0
- package/dist/155.js.map +1 -0
- package/dist/172.js +1 -1
- package/dist/20.js +1 -1
- package/dist/290.js +1 -1
- package/dist/493.js +2 -0
- package/dist/493.js.map +1 -0
- package/dist/606.js +1 -1
- package/dist/627.js +1 -1
- package/dist/{400.js → 914.js} +1 -1
- package/dist/914.js.map +1 -0
- package/dist/main.js +1 -1
- package/dist/main.js.map +1 -1
- package/dist/openmrs-esm-stock-management-app.js +1 -1
- package/dist/openmrs-esm-stock-management-app.js.buildmanifest.json +81 -57
- package/dist/openmrs-esm-stock-management-app.js.map +1 -1
- package/dist/routes.json +1 -1
- package/package.json +1 -1
- package/src/core/utils/utils.ts +29 -0
- package/src/index.ts +4 -0
- package/src/routes.json +9 -0
- package/src/stock-items/add-stock-item/transactions/printout/transactions-stockcard-printout.component.tsx +8 -12
- package/src/stock-items/add-stock-item/transactions/transactions.component.tsx +8 -12
- package/src/stock-items/stock-items.resource.ts +5 -5
- package/src/stock-lookups/stock-lookups.resource.ts +2 -2
- package/src/stock-operations/edit-stock-operation/edit-stock-operation-action-menu.component.tsx +41 -16
- package/src/stock-operations/{add-stock-operation/received-items.component.tsx → received-items.component.tsx} +1 -1
- package/src/stock-operations/stock-operation-reference.component.tsx +64 -0
- package/src/stock-operations/stock-operation-status/stock-operation-status-row.tsx +77 -0
- package/src/stock-operations/stock-operation-status/stock-operation-status.scss +32 -0
- package/src/stock-operations/stock-operation-status/stock-operation-status.tsx +45 -0
- package/src/stock-operations/stock-operation-types-selector/stock-operation-types-selector.component.tsx +30 -29
- package/src/stock-operations/stock-operation.utils.tsx +16 -79
- package/src/stock-operations/stock-operations-dialog/stock-operations-issue-stock-button.component.tsx +27 -39
- package/src/stock-operations/stock-operations-dialog/stock-operations-print-button.component.tsx +51 -59
- package/src/stock-operations/{stock-item-selector/stock-item-selector.resource.tsx → stock-operations-forms/hooks/useFilterableStockItems.ts} +4 -4
- package/src/stock-operations/stock-operations-forms/hooks/useFilteredOperationTypesByRoles.ts +30 -0
- package/src/stock-operations/stock-operations-forms/hooks/useOperationTypePermisions.ts +29 -0
- package/src/stock-operations/stock-operations-forms/hooks/useParties.ts +73 -0
- package/src/stock-operations/{users-selector/users-selector.resource.tsx → stock-operations-forms/hooks/useSearchUser.ts} +9 -7
- package/src/stock-operations/{batch-no-selector/batch-no-selector.resource.tsx → stock-operations-forms/hooks/useStockItemBatchNumbers.ts} +3 -3
- package/src/stock-operations/stock-operations-forms/hooks/useStockOperationLinks.ts +20 -0
- package/src/stock-operations/stock-operations-forms/input-components/batch-no-selector.component.tsx +72 -0
- package/src/stock-operations/stock-operations-forms/input-components/batch-no-selector.test.tsx +90 -0
- package/src/stock-operations/{add-stock-operation/stock-item-search/stock-item-search.scss → stock-operations-forms/input-components/input-components-styles.scss} +2 -2
- package/src/stock-operations/stock-operations-forms/input-components/qty-uim-selector.test.tsx +157 -0
- package/src/stock-operations/stock-operations-forms/input-components/quantity-uom-selector.component.tsx +53 -0
- package/src/stock-operations/stock-operations-forms/input-components/stock-item-search.component.tsx +56 -0
- package/src/stock-operations/stock-operations-forms/input-components/stock-operation-reason-selector.component.tsx +59 -0
- package/src/stock-operations/stock-operations-forms/input-components/stock-operation-reason-selector.test.tsx +216 -0
- package/src/stock-operations/stock-operations-forms/input-components/unique-batch-no-entry-input.component.tsx +59 -0
- package/src/stock-operations/stock-operations-forms/input-components/user-selector.test.tsx +110 -0
- package/src/stock-operations/stock-operations-forms/input-components/users-selector.component.tsx +111 -0
- package/src/stock-operations/stock-operations-forms/step1.test.tsx +303 -0
- package/src/stock-operations/stock-operations-forms/step2.test.tsx +250 -0
- package/src/stock-operations/stock-operations-forms/step3.test.tsx +223 -0
- package/src/stock-operations/stock-operations-forms/steps/base-operation-details-form-step.tsx +241 -0
- package/src/stock-operations/stock-operations-forms/steps/quantity-uom-cell.component.tsx +33 -0
- package/src/stock-operations/stock-operations-forms/steps/stock-availability-cell.component.tsx +51 -0
- package/src/stock-operations/stock-operations-forms/steps/stock-operation-item-batch-no-cell.component.tsx +40 -0
- package/src/stock-operations/stock-operations-forms/steps/stock-operation-item-cell.component.tsx +38 -0
- package/src/stock-operations/stock-operations-forms/steps/stock-operation-item-expiry-cell.component.tsx +41 -0
- package/src/stock-operations/stock-operations-forms/steps/stock-operation-items-form-step.component.tsx +281 -0
- package/src/stock-operations/stock-operations-forms/steps/stock-operation-items-form-step.scc.scss +64 -0
- package/src/stock-operations/stock-operations-forms/steps/stock-operation-submission-form-step.component.tsx +236 -0
- package/src/stock-operations/stock-operations-forms/stock-issue-form-initializer-with-related-requisition-operation.component.tsx +55 -0
- package/src/stock-operations/stock-operations-forms/stock-item-form/stock-item-form.scss +41 -0
- package/src/stock-operations/stock-operations-forms/stock-item-form/stock-item-form.workspace.tsx +197 -0
- package/src/stock-operations/stock-operations-forms/stock-operation-form-header.component.tsx +166 -0
- package/src/stock-operations/stock-operations-forms/stock-operation-form.component.tsx +200 -0
- package/src/stock-operations/stock-operations-forms/stock-operation-form.scss +111 -0
- package/src/stock-operations/stock-operations-forms/stock-operation-related-link.component.tsx +45 -0
- package/src/stock-operations/stock-operations-forms/stock-operation-stepper/stepper.scss +41 -0
- package/src/stock-operations/stock-operations-forms/stock-operation-stepper/stock-operation-stepper.component.tsx +52 -0
- package/src/stock-operations/stock-operations-forms/stock-operations-form-utils.ts +32 -0
- package/src/stock-operations/stock-operations-table.component.tsx +20 -56
- package/src/stock-operations/stock-operations.resource.ts +16 -13
- package/src/stock-operations/validation-schema.ts +72 -14
- package/dist/400.js.map +0 -1
- package/dist/766.js +0 -2
- package/dist/766.js.map +0 -1
- package/src/stock-operations/add-stock-operation/add-stock-operation.component.tsx +0 -349
- package/src/stock-operations/add-stock-operation/add-stock-operation.resource.tsx +0 -27
- package/src/stock-operations/add-stock-operation/add-stock-operation.scss +0 -60
- package/src/stock-operations/add-stock-operation/add-stock-operation.test.tsx +0 -192
- package/src/stock-operations/add-stock-operation/add-stock-operation.utils.tsx +0 -152
- package/src/stock-operations/add-stock-operation/add-stock-utils.ts +0 -103
- package/src/stock-operations/add-stock-operation/base-operation-details.component.tsx +0 -439
- package/src/stock-operations/add-stock-operation/base-operation-details.scss +0 -30
- package/src/stock-operations/add-stock-operation/stock-item-search/stock-item-search.component.tsx +0 -70
- package/src/stock-operations/add-stock-operation/stock-items-addition-row.component.tsx +0 -360
- package/src/stock-operations/add-stock-operation/stock-items-addition-row.resource.tsx +0 -0
- package/src/stock-operations/add-stock-operation/stock-items-addition-row.scss +0 -12
- package/src/stock-operations/add-stock-operation/stock-items-addition-row.test.tsx +0 -10
- package/src/stock-operations/add-stock-operation/stock-items-addition.component.scss +0 -17
- package/src/stock-operations/add-stock-operation/stock-items-addition.component.tsx +0 -254
- package/src/stock-operations/add-stock-operation/stock-operation-context/useStockOperationContext.tsx +0 -16
- package/src/stock-operations/add-stock-operation/stock-operation-reference.component.tsx +0 -39
- package/src/stock-operations/add-stock-operation/stock-operation-related-link.component.tsx +0 -38
- package/src/stock-operations/add-stock-operation/stock-operation-status.component.tsx +0 -170
- package/src/stock-operations/add-stock-operation/stock-operation-submission.component.tsx +0 -189
- package/src/stock-operations/add-stock-operation/stock-operation-submission.test.tsx +0 -138
- package/src/stock-operations/add-stock-operation/types.ts +0 -55
- package/src/stock-operations/add-stock-operation/validationSchema.ts +0 -54
- package/src/stock-operations/batch-no-selector/batch-no-selector.component.tsx +0 -114
- package/src/stock-operations/batch-no-selector/batch-no-selector.scss +0 -0
- package/src/stock-operations/batch-no-selector/batch-no-selector.test.tsx +0 -101
- package/src/stock-operations/party-selector/party-selector.component.tsx +0 -59
- package/src/stock-operations/qty-uom-selector/qty-uom-selector.component.tsx +0 -65
- package/src/stock-operations/qty-uom-selector/qty-uom-selector.resource.tsx +0 -0
- package/src/stock-operations/qty-uom-selector/qty-uom-selector.scss +0 -0
- package/src/stock-operations/qty-uom-selector/qty-uom-selector.test.tsx +0 -10
- package/src/stock-operations/stock-item-selector/stock-item-selector.component.tsx +0 -69
- package/src/stock-operations/stock-item-selector/stock-item-selector.scss +0 -0
- package/src/stock-operations/stock-item-selector/stock-item-selector.test.tsx +0 -10
- package/src/stock-operations/stock-operation-reason-selector/stock-operation-reason-selector.component.tsx +0 -62
- package/src/stock-operations/users-selector/users-selector.component.tsx +0 -75
- /package/dist/{766.js.LICENSE.txt → 493.js.LICENSE.txt} +0 -0
@@ -1,59 +0,0 @@
|
|
1
|
-
import React, { ReactNode, useEffect } from 'react';
|
2
|
-
import { Control, Controller, FieldValues } from 'react-hook-form';
|
3
|
-
import { Party } from '../../core/api/types/Party';
|
4
|
-
import { ComboBox } from '@carbon/react';
|
5
|
-
|
6
|
-
interface PartySelectorProps<T> {
|
7
|
-
partyUuid?: string;
|
8
|
-
parties: Party[];
|
9
|
-
onPartyChange?: (party: Party) => void;
|
10
|
-
title?: string;
|
11
|
-
placeholder?: string;
|
12
|
-
invalid?: boolean;
|
13
|
-
invalidText?: ReactNode;
|
14
|
-
filterFunction?: (party: Party) => boolean;
|
15
|
-
|
16
|
-
// Control
|
17
|
-
controllerName: string;
|
18
|
-
name: string;
|
19
|
-
control: Control<FieldValues, T>;
|
20
|
-
}
|
21
|
-
|
22
|
-
const PartySelector = <T,>(props: PartySelectorProps<T>) => {
|
23
|
-
return (
|
24
|
-
<Controller
|
25
|
-
name={props.controllerName}
|
26
|
-
control={props.control}
|
27
|
-
render={({ field: { onChange, value, ref } }) => {
|
28
|
-
const selectedParty = props.parties.find((p) => p.uuid === props.partyUuid);
|
29
|
-
|
30
|
-
if (selectedParty && !value) {
|
31
|
-
onChange(selectedParty.uuid);
|
32
|
-
}
|
33
|
-
return (
|
34
|
-
<ComboBox
|
35
|
-
titleText={props.title}
|
36
|
-
name={props.name}
|
37
|
-
id={props.name}
|
38
|
-
size={'md'}
|
39
|
-
items={props.parties}
|
40
|
-
onChange={(data: { selectedItem: Party }) => {
|
41
|
-
props.onPartyChange?.(data.selectedItem);
|
42
|
-
onChange(data.selectedItem?.uuid);
|
43
|
-
}}
|
44
|
-
initialSelectedItem={selectedParty}
|
45
|
-
selectedItem={props.parties.find((p) => p.uuid === value)}
|
46
|
-
itemToString={(item?: Party) => (item && item?.name ? `${item?.name}` : '')}
|
47
|
-
shouldFilterItem={() => true}
|
48
|
-
placeholder={props.placeholder}
|
49
|
-
ref={ref}
|
50
|
-
invalid={props.invalid}
|
51
|
-
invalidText={props.invalidText}
|
52
|
-
/>
|
53
|
-
);
|
54
|
-
}}
|
55
|
-
/>
|
56
|
-
);
|
57
|
-
};
|
58
|
-
|
59
|
-
export default PartySelector;
|
@@ -1,65 +0,0 @@
|
|
1
|
-
import React, { ReactNode, useMemo } from 'react';
|
2
|
-
import { Control, Controller, FieldValues } from 'react-hook-form';
|
3
|
-
import { StockItemPackagingUOMDTO } from '../../core/api/types/stockItem/StockItemPackagingUOM';
|
4
|
-
import { ComboBox, SkeletonText } from '@carbon/react';
|
5
|
-
import { useStockItem } from '../../stock-items/stock-items.resource';
|
6
|
-
|
7
|
-
interface QtyUomSelectorProps<T> {
|
8
|
-
placeholder?: string;
|
9
|
-
stockItemUuid: string;
|
10
|
-
stockItemPackagingUOMUuid?: string;
|
11
|
-
onStockPackageChanged?: (item: StockItemPackagingUOMDTO) => void;
|
12
|
-
title?: string;
|
13
|
-
invalid?: boolean;
|
14
|
-
invalidText?: ReactNode;
|
15
|
-
|
16
|
-
// Control
|
17
|
-
controllerName: string;
|
18
|
-
name: string;
|
19
|
-
control: Control<FieldValues, T>;
|
20
|
-
}
|
21
|
-
|
22
|
-
const QtyUomSelector = <T,>(props: QtyUomSelectorProps<T>) => {
|
23
|
-
const { isLoading, error, item } = useStockItem(props.stockItemUuid ?? props['uuid']);
|
24
|
-
const initialSelectedItem = useMemo<StockItemPackagingUOMDTO | null>(
|
25
|
-
() => (item?.packagingUnits?.length > 0 ? item.packagingUnits[0] : null),
|
26
|
-
[item?.packagingUnits],
|
27
|
-
);
|
28
|
-
|
29
|
-
if (isLoading || error) return <SkeletonText />;
|
30
|
-
|
31
|
-
return (
|
32
|
-
<div>
|
33
|
-
<Controller
|
34
|
-
name={props.controllerName}
|
35
|
-
control={props.control}
|
36
|
-
defaultValue={initialSelectedItem.uuid ?? ''}
|
37
|
-
render={({ field: { onChange, ref } }) => (
|
38
|
-
<ComboBox
|
39
|
-
titleText={props.title}
|
40
|
-
name={props.name}
|
41
|
-
control={props.control}
|
42
|
-
controllerName={props.controllerName}
|
43
|
-
id={props.name}
|
44
|
-
size={'sm'}
|
45
|
-
items={item?.packagingUnits ?? []}
|
46
|
-
onChange={(data: { selectedItem?: StockItemPackagingUOMDTO }) => {
|
47
|
-
props.onStockPackageChanged?.(data.selectedItem);
|
48
|
-
onChange(data.selectedItem?.uuid);
|
49
|
-
}}
|
50
|
-
initialSelectedItem={initialSelectedItem}
|
51
|
-
itemToString={(s: StockItemPackagingUOMDTO) =>
|
52
|
-
s.packagingUomName ? `${s?.packagingUomName} - ${s?.factor} ` : ''
|
53
|
-
}
|
54
|
-
placeholder={props.placeholder}
|
55
|
-
invalid={props.invalid}
|
56
|
-
invalidText={props.invalidText}
|
57
|
-
ref={ref}
|
58
|
-
/>
|
59
|
-
)}
|
60
|
-
/>
|
61
|
-
</div>
|
62
|
-
);
|
63
|
-
};
|
64
|
-
|
65
|
-
export default QtyUomSelector;
|
File without changes
|
File without changes
|
@@ -1,10 +0,0 @@
|
|
1
|
-
import React from 'react';
|
2
|
-
|
3
|
-
import { render } from '@testing-library/react';
|
4
|
-
import QtyUomSelector from './qty-uom-selector.component';
|
5
|
-
|
6
|
-
describe('Test the qty uom selector', () => {
|
7
|
-
it(`renders without dying`, () => {
|
8
|
-
// render(<QtyUomSelector />);
|
9
|
-
});
|
10
|
-
});
|
@@ -1,69 +0,0 @@
|
|
1
|
-
import React, { ReactNode } from 'react';
|
2
|
-
import { Control, Controller, FieldValues } from 'react-hook-form';
|
3
|
-
import { ComboBox, InlineLoading } from '@carbon/react';
|
4
|
-
import { StockItemDTO } from '../../core/api/types/stockItem/StockItem';
|
5
|
-
import { useStockItems } from './stock-item-selector.resource';
|
6
|
-
import { useDebounce } from '../../core/hooks/debounce-hook';
|
7
|
-
|
8
|
-
interface StockItemSelectorProps<T> {
|
9
|
-
placeholder?: string;
|
10
|
-
stockItemUuid?: string;
|
11
|
-
onStockItemChanged?: (item: StockItemDTO) => void;
|
12
|
-
title?: string;
|
13
|
-
invalid?: boolean;
|
14
|
-
invalidText?: ReactNode;
|
15
|
-
initialSelectedItem?: StockItemDTO;
|
16
|
-
|
17
|
-
// Control
|
18
|
-
controllerName: string;
|
19
|
-
name: string;
|
20
|
-
control: Control<FieldValues, T>;
|
21
|
-
}
|
22
|
-
|
23
|
-
const StockItemSelector = <T,>(props: StockItemSelectorProps<T>) => {
|
24
|
-
const { isLoading, stockItemsList, setSearchString } = useStockItems({});
|
25
|
-
|
26
|
-
const debouncedSearch = useDebounce((query: string) => {
|
27
|
-
setSearchString(query);
|
28
|
-
}, 500);
|
29
|
-
|
30
|
-
return (
|
31
|
-
<div>
|
32
|
-
<Controller
|
33
|
-
name={props.controllerName}
|
34
|
-
control={props.control}
|
35
|
-
render={({ field: { onChange, value, ref } }) => (
|
36
|
-
<ComboBox
|
37
|
-
titleText={props.title}
|
38
|
-
name={props.name}
|
39
|
-
control={props.control}
|
40
|
-
controllerName={props.controllerName}
|
41
|
-
id={props.name}
|
42
|
-
size={'sm'}
|
43
|
-
items={stockItemsList || []}
|
44
|
-
onChange={(data: { selectedItem: StockItemDTO }) => {
|
45
|
-
props.onStockItemChanged?.(data.selectedItem);
|
46
|
-
onChange(data.selectedItem?.uuid);
|
47
|
-
}}
|
48
|
-
initialSelectedItem={
|
49
|
-
props?.initialSelectedItem ?? stockItemsList?.find((p) => p.uuid === props.stockItemUuid) ?? ''
|
50
|
-
}
|
51
|
-
itemToString={stockItemName}
|
52
|
-
onInputChange={debouncedSearch}
|
53
|
-
placeholder={props.placeholder}
|
54
|
-
invalid={props.invalid}
|
55
|
-
invalidText={props.invalidText}
|
56
|
-
ref={ref}
|
57
|
-
/>
|
58
|
-
)}
|
59
|
-
/>
|
60
|
-
{isLoading && <InlineLoading status="active" iconDescription="Searching" description="Searching..." />}
|
61
|
-
</div>
|
62
|
-
);
|
63
|
-
};
|
64
|
-
|
65
|
-
function stockItemName(item: StockItemDTO): string {
|
66
|
-
return item?.drugName || item?.conceptName;
|
67
|
-
}
|
68
|
-
|
69
|
-
export default StockItemSelector;
|
File without changes
|
@@ -1,10 +0,0 @@
|
|
1
|
-
import React from 'react';
|
2
|
-
|
3
|
-
import { render } from '@testing-library/react';
|
4
|
-
import StockItemSelector from './stock-item-selector.component';
|
5
|
-
|
6
|
-
describe('Test the stock item selector', () => {
|
7
|
-
it(`renders without dying`, () => {
|
8
|
-
// render(<StockItemSelector />);
|
9
|
-
});
|
10
|
-
});
|
@@ -1,62 +0,0 @@
|
|
1
|
-
import React, { ReactNode } from 'react';
|
2
|
-
import { Control, Controller, FieldValues } from 'react-hook-form';
|
3
|
-
import { Concept } from '../../core/api/types/concept/Concept';
|
4
|
-
import { ComboBox, SelectSkeleton } from '@carbon/react';
|
5
|
-
import { useConcept } from '../../stock-lookups/stock-lookups.resource';
|
6
|
-
import { type ConfigObject } from '../../config-schema';
|
7
|
-
import { useConfig } from '@openmrs/esm-framework';
|
8
|
-
|
9
|
-
interface StockOperationReasonSelectorProps<T> {
|
10
|
-
reasonUuid?: string;
|
11
|
-
onReasonChange?: (reason: Concept) => void;
|
12
|
-
title?: string;
|
13
|
-
placeholder?: string;
|
14
|
-
invalid?: boolean;
|
15
|
-
invalidText?: ReactNode;
|
16
|
-
|
17
|
-
// Control
|
18
|
-
controllerName: string;
|
19
|
-
name: string;
|
20
|
-
control: Control<FieldValues, T>;
|
21
|
-
}
|
22
|
-
|
23
|
-
const StockOperationReasonSelector = <T,>(props: StockOperationReasonSelectorProps<T>) => {
|
24
|
-
const { stockAdjustmentReasonUUID } = useConfig<ConfigObject>();
|
25
|
-
|
26
|
-
const {
|
27
|
-
isLoading,
|
28
|
-
error,
|
29
|
-
items: { answers: reasons },
|
30
|
-
} = useConcept(stockAdjustmentReasonUUID);
|
31
|
-
|
32
|
-
if (isLoading || error) return <SelectSkeleton />;
|
33
|
-
|
34
|
-
return (
|
35
|
-
<Controller
|
36
|
-
name={props.controllerName}
|
37
|
-
control={props.control}
|
38
|
-
render={({ field: { onChange, ref } }) => (
|
39
|
-
<ComboBox
|
40
|
-
labelText={props.title}
|
41
|
-
placeholder={props.placeholder}
|
42
|
-
name={props.name}
|
43
|
-
controllerName={props.controllerName}
|
44
|
-
id={props.name}
|
45
|
-
size={'md'}
|
46
|
-
items={reasons}
|
47
|
-
initialSelectedItem={reasons?.find((p) => p.uuid === props.reasonUuid) || {}}
|
48
|
-
itemToString={(item?: Concept) => (item && item?.display ? `${item?.display}` : '')}
|
49
|
-
onChange={(data: { selectedItem?: Concept }) => {
|
50
|
-
props.onReasonChange?.(data?.selectedItem);
|
51
|
-
onChange(data?.selectedItem?.uuid);
|
52
|
-
}}
|
53
|
-
ref={ref}
|
54
|
-
invalid={props.invalid}
|
55
|
-
invalidText={props.invalidText}
|
56
|
-
/>
|
57
|
-
)}
|
58
|
-
/>
|
59
|
-
);
|
60
|
-
};
|
61
|
-
|
62
|
-
export default StockOperationReasonSelector;
|
@@ -1,75 +0,0 @@
|
|
1
|
-
import React, { ReactNode, useState } from 'react';
|
2
|
-
import { Control, Controller, FieldValues } from 'react-hook-form';
|
3
|
-
import { User } from '../../core/api/types/identity/User';
|
4
|
-
import { ComboBox, InlineLoading } from '@carbon/react';
|
5
|
-
import { useUsersHook } from './users-selector.resource';
|
6
|
-
import { useDebounce } from '../../core/hooks/debounce-hook';
|
7
|
-
import { otherUser } from '../../core/utils/utils';
|
8
|
-
import { useConfig, useSession } from '@openmrs/esm-framework';
|
9
|
-
import { ConfigObject } from '../../config-schema';
|
10
|
-
|
11
|
-
interface UsersSelectorProps<T> {
|
12
|
-
placeholder?: string;
|
13
|
-
userUuid?: string;
|
14
|
-
onUserChanged?: (user: User) => void;
|
15
|
-
title?: string;
|
16
|
-
invalid?: boolean;
|
17
|
-
invalidText?: ReactNode;
|
18
|
-
|
19
|
-
// Control
|
20
|
-
controllerName: string;
|
21
|
-
name: string;
|
22
|
-
control: Control<FieldValues, T>;
|
23
|
-
}
|
24
|
-
|
25
|
-
const UsersSelector = <T,>(props: UsersSelectorProps<T>) => {
|
26
|
-
const { isLoading, userList, setSearchString } = useUsersHook();
|
27
|
-
const { user } = useSession();
|
28
|
-
const { autoPopulateResponsiblePerson } = useConfig<ConfigObject>();
|
29
|
-
const debouncedSearch = useDebounce((query: string) => {
|
30
|
-
setSearchString(query);
|
31
|
-
}, 1000);
|
32
|
-
|
33
|
-
if (userList) userList.push(otherUser);
|
34
|
-
|
35
|
-
return (
|
36
|
-
<div>
|
37
|
-
<Controller
|
38
|
-
name={props.controllerName}
|
39
|
-
control={props.control}
|
40
|
-
render={({ field: { onChange, ref } }) => (
|
41
|
-
<ComboBox
|
42
|
-
titleText={props.title}
|
43
|
-
name={props.name}
|
44
|
-
control={props.control}
|
45
|
-
controllerName={props.controllerName}
|
46
|
-
id={props.name}
|
47
|
-
size={'md'}
|
48
|
-
items={userList || []}
|
49
|
-
onChange={(data: { selectedItem: User }) => {
|
50
|
-
props.onUserChanged?.(data.selectedItem);
|
51
|
-
onChange(data.selectedItem?.uuid);
|
52
|
-
}}
|
53
|
-
initialSelectedItem={
|
54
|
-
userList?.find((p) => p.uuid === (props?.userUuid ?? autoPopulateResponsiblePerson ? user.uuid : '')) ??
|
55
|
-
''
|
56
|
-
}
|
57
|
-
itemToString={userName}
|
58
|
-
onInputChange={debouncedSearch}
|
59
|
-
placeholder={props.placeholder}
|
60
|
-
invalid={props.invalid}
|
61
|
-
invalidText={props.invalidText}
|
62
|
-
ref={ref}
|
63
|
-
/>
|
64
|
-
)}
|
65
|
-
/>
|
66
|
-
{isLoading && <InlineLoading status="active" iconDescription="Searching" description="Searching..." />}
|
67
|
-
</div>
|
68
|
-
);
|
69
|
-
};
|
70
|
-
|
71
|
-
function userName(item: User): string {
|
72
|
-
return item?.person?.display || '';
|
73
|
-
}
|
74
|
-
|
75
|
-
export default UsersSelector;
|
File without changes
|