@inseefr/lunatic 3.8.0 → 3.8.1-rc.1
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/components/Suggester/Suggester.js +23 -8
- package/components/Suggester/Suggester.js.map +1 -1
- package/components/Suggester/Suggester.spec.js +75 -25
- package/components/Suggester/Suggester.spec.js.map +1 -1
- package/components/Suggester/useSuggestions.d.ts +21 -2
- package/components/Suggester/useSuggestions.js +26 -12
- package/components/Suggester/useSuggestions.js.map +1 -1
- package/esm/components/Suggester/Suggester.js +25 -9
- package/esm/components/Suggester/Suggester.js.map +1 -1
- package/esm/components/Suggester/Suggester.spec.js +78 -25
- package/esm/components/Suggester/Suggester.spec.js.map +1 -1
- package/esm/components/Suggester/useSuggestions.d.ts +21 -2
- package/esm/components/Suggester/useSuggestions.js +24 -10
- package/esm/components/Suggester/useSuggestions.js.map +1 -1
- package/esm/utils/search/SearchInterface.d.ts +1 -0
- package/esm/utils/search/SearchMinisearch.d.ts +1 -0
- package/esm/utils/search/SearchMinisearch.js +6 -0
- package/esm/utils/search/SearchMinisearch.js.map +1 -1
- package/esm/utils/search/SuggestersDatabase.d.ts +7 -0
- package/esm/utils/search/SuggestersDatabase.js.map +1 -1
- package/package.json +1 -1
- package/src/components/Suggester/Suggester.spec.tsx +93 -26
- package/src/components/Suggester/Suggester.tsx +25 -9
- package/src/components/Suggester/useSuggestions.ts +39 -18
- package/src/utils/search/SearchInterface.ts +2 -0
- package/src/utils/search/SearchMinisearch.ts +7 -0
- package/src/utils/search/SuggestersDatabase.ts +10 -0
- package/tsconfig.build.tsbuildinfo +1 -1
- package/utils/search/SearchInterface.d.ts +1 -0
- package/utils/search/SearchMinisearch.d.ts +1 -0
- package/utils/search/SearchMinisearch.js +6 -0
- package/utils/search/SearchMinisearch.js.map +1 -1
- package/utils/search/SuggestersDatabase.d.ts +7 -0
- package/utils/search/SuggestersDatabase.js.map +1 -1
|
@@ -18,19 +18,23 @@ function Suggester(props) {
|
|
|
18
18
|
const suggesterKey = `${id}-${iteration}`;
|
|
19
19
|
return (0, react_1.createElement)(WrappedSuggester, { ...props, key: suggesterKey });
|
|
20
20
|
}
|
|
21
|
+
const ARBITRARY_ID = 'OTHER';
|
|
21
22
|
function WrappedSuggester({ storeName, id, className, optionRenderer, labelRenderer, handleChanges, disabled, value, label, declarations, description, errors, readOnly, response, optionResponses = [], executeExpression, iteration, arbitrary, arbitraryValue, }) {
|
|
23
|
+
const { store, storeState, setStoreState, getLabelById } = (0, useSuggestions_1.useStore)({
|
|
24
|
+
storeName,
|
|
25
|
+
});
|
|
22
26
|
// Default options should not change between render
|
|
23
27
|
// so we can break the rule of hooks here
|
|
24
28
|
const computeSelectedOptions = () => {
|
|
25
29
|
if (arbitraryValue) {
|
|
26
|
-
return [{ id:
|
|
30
|
+
return [{ id: ARBITRARY_ID, label: arbitraryValue, value: ARBITRARY_ID }];
|
|
27
31
|
}
|
|
28
32
|
if (!value) {
|
|
29
33
|
return [];
|
|
30
34
|
}
|
|
31
35
|
const labelResponse = optionResponses?.find((o) => o.attribute === 'label');
|
|
32
36
|
if (!labelResponse) {
|
|
33
|
-
return [{ id: value, label: value, value: value }];
|
|
37
|
+
return [{ id: value, label: getLabelById(value), value: value }];
|
|
34
38
|
}
|
|
35
39
|
const label = executeExpression({ value: labelResponse.name, type: 'VTL' }, {
|
|
36
40
|
iteration,
|
|
@@ -48,7 +52,9 @@ function WrappedSuggester({ storeName, id, className, optionRenderer, labelRende
|
|
|
48
52
|
};
|
|
49
53
|
const [selectedOptions, setSelectedOptions] = (0, react_2.useState)(computeSelectedOptions);
|
|
50
54
|
const { state, options, search, setSearch, onFocus, onBlur } = (0, useSuggestions_1.useSuggestions)({
|
|
51
|
-
|
|
55
|
+
store,
|
|
56
|
+
storeState,
|
|
57
|
+
setStoreState,
|
|
52
58
|
allowArbitrary: !!arbitrary,
|
|
53
59
|
selectedOptions: selectedOptions,
|
|
54
60
|
});
|
|
@@ -82,7 +88,7 @@ function WrappedSuggester({ storeName, id, className, optionRenderer, labelRende
|
|
|
82
88
|
{ name: response.name, value: null },
|
|
83
89
|
];
|
|
84
90
|
// User chose an arbitrary option or clear the value
|
|
85
|
-
if (arbitrary
|
|
91
|
+
if (arbitrary?.response) {
|
|
86
92
|
newResponses.push({
|
|
87
93
|
name: arbitrary.response.name,
|
|
88
94
|
value: v?.id === useSuggestions_1.OTHER_VALUE ? search : null,
|
|
@@ -113,11 +119,20 @@ function WrappedSuggester({ storeName, id, className, optionRenderer, labelRende
|
|
|
113
119
|
onChange(null);
|
|
114
120
|
setSearch('');
|
|
115
121
|
};
|
|
116
|
-
// Fix display issue (when handleChanges is called outside this component (in management mode, return to FORCED value by example) )
|
|
117
|
-
// We have to re-compute actual selection
|
|
118
122
|
(0, react_2.useEffect)(() => {
|
|
119
|
-
|
|
120
|
-
|
|
123
|
+
// Fix display issue (when handleChanges is called outside this component (in management mode, return to FORCED value by example)
|
|
124
|
+
// "value" does'nt match selectedOption's "id"
|
|
125
|
+
if (selectedOptions[0]?.id !== value) {
|
|
126
|
+
const actualSelection = computeSelectedOptions();
|
|
127
|
+
const selectedOptionsWithLabel = actualSelection.map((selection) => {
|
|
128
|
+
if (selection.id === ARBITRARY_ID)
|
|
129
|
+
return selection;
|
|
130
|
+
return {
|
|
131
|
+
...selection,
|
|
132
|
+
label: getLabelById(selection.id),
|
|
133
|
+
};
|
|
134
|
+
});
|
|
135
|
+
setSelectedOptions(selectedOptionsWithLabel);
|
|
121
136
|
}
|
|
122
137
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
123
138
|
}, [value]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Suggester.js","sourceRoot":"","sources":["../../src/components/Suggester/Suggester.tsx"],"names":[],"mappings":";;;;;AAQA,8BAOC;
|
|
1
|
+
{"version":3,"file":"Suggester.js","sourceRoot":"","sources":["../../src/components/Suggester/Suggester.tsx"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
4
4
|
const react_1 = require("@testing-library/react");
|
|
5
5
|
const vitest_1 = require("vitest");
|
|
6
|
-
const Suggester_1 = require("./Suggester");
|
|
6
|
+
const Suggester_1 = require("./Suggester");
|
|
7
7
|
// Mock of useSuggestions
|
|
8
8
|
vitest_1.vi.mock('./useSuggestions', () => ({
|
|
9
9
|
useSuggestions: vitest_1.vi.fn(() => ({
|
|
@@ -13,46 +13,96 @@ vitest_1.vi.mock('./useSuggestions', () => ({
|
|
|
13
13
|
setSearch: vitest_1.vi.fn(),
|
|
14
14
|
onFocus: vitest_1.vi.fn(),
|
|
15
15
|
onBlur: vitest_1.vi.fn(),
|
|
16
|
+
getSelectedLabelById: vitest_1.vi.fn(),
|
|
17
|
+
})),
|
|
18
|
+
useStore: vitest_1.vi.fn(() => ({
|
|
19
|
+
store: {},
|
|
20
|
+
storeState: 'success',
|
|
21
|
+
setStoreState: vitest_1.vi.fn(),
|
|
22
|
+
getLabelById: vitest_1.vi.fn(),
|
|
16
23
|
})),
|
|
17
24
|
}));
|
|
25
|
+
const FAKE_PLACE_HOLDER = 'place holder...';
|
|
18
26
|
// Mock of CustomSuggester
|
|
19
27
|
vitest_1.vi.mock('./CustomSuggester', () => ({
|
|
20
|
-
CustomSuggester: vitest_1.vi.fn(({ value }) => ((0, jsx_runtime_1.jsx)("div", { "data-testid": "custom-suggester", children:
|
|
28
|
+
CustomSuggester: vitest_1.vi.fn(({ value }) => ((0, jsx_runtime_1.jsx)("div", { "data-testid": "custom-suggester", children: Array.isArray(value) && value.length > 0
|
|
29
|
+
? (value[0].value ?? FAKE_PLACE_HOLDER)
|
|
30
|
+
: FAKE_PLACE_HOLDER }))),
|
|
21
31
|
}));
|
|
22
32
|
(0, vitest_1.describe)('WrappedSuggester useEffect', () => {
|
|
33
|
+
// Given initial props
|
|
34
|
+
const initialProps = {
|
|
35
|
+
storeName: 'store',
|
|
36
|
+
id: 'suggester-1',
|
|
37
|
+
className: '',
|
|
38
|
+
handleChanges: vitest_1.vi.fn(),
|
|
39
|
+
disabled: false,
|
|
40
|
+
value: 'initialValue',
|
|
41
|
+
label: 'Label',
|
|
42
|
+
declarations: [],
|
|
43
|
+
description: '',
|
|
44
|
+
errors: {},
|
|
45
|
+
readOnly: false,
|
|
46
|
+
response: { name: 'response' },
|
|
47
|
+
optionResponses: [{ name: 'labelResponse', attribute: 'label' }],
|
|
48
|
+
executeExpression: vitest_1.vi.fn(),
|
|
49
|
+
iteration: 1,
|
|
50
|
+
arbitrary: { response: { name: 'ARBITRARY' } },
|
|
51
|
+
optionRenderer: vitest_1.vi.fn(),
|
|
52
|
+
labelRenderer: vitest_1.vi.fn(),
|
|
53
|
+
focused: false,
|
|
54
|
+
};
|
|
55
|
+
(0, vitest_1.it)('should display place holder when no value is set', () => {
|
|
56
|
+
// Given the composant initialize
|
|
57
|
+
const { rerender } = (0, react_1.render)((0, jsx_runtime_1.jsx)(Suggester_1.WrappedSuggester, { ...initialProps, value: null }));
|
|
58
|
+
const suggesterValue = react_1.screen.getByTestId('custom-suggester').textContent;
|
|
59
|
+
(0, vitest_1.expect)(suggesterValue).toContain(FAKE_PLACE_HOLDER);
|
|
60
|
+
const forcedValue = 'FORCED value';
|
|
61
|
+
// When we change the value
|
|
62
|
+
const newProps = { ...initialProps, value: forcedValue };
|
|
63
|
+
rerender((0, jsx_runtime_1.jsx)(Suggester_1.WrappedSuggester, { ...newProps }));
|
|
64
|
+
// Then selectedOptions, i.e value props of customSuggester have to be updated
|
|
65
|
+
const updatedValue = react_1.screen.getByTestId('custom-suggester').textContent;
|
|
66
|
+
(0, vitest_1.expect)(updatedValue).toContain('FORCED value');
|
|
67
|
+
});
|
|
23
68
|
(0, vitest_1.it)('should update selectedOptions when value prop changes', () => {
|
|
24
|
-
// Given initial props
|
|
25
|
-
const initialProps = {
|
|
26
|
-
storeName: 'store',
|
|
27
|
-
id: 'suggester-1',
|
|
28
|
-
className: '',
|
|
29
|
-
handleChanges: vitest_1.vi.fn(),
|
|
30
|
-
disabled: false,
|
|
31
|
-
value: 'initialValue',
|
|
32
|
-
label: 'Label',
|
|
33
|
-
declarations: [],
|
|
34
|
-
description: '',
|
|
35
|
-
errors: {},
|
|
36
|
-
readOnly: false,
|
|
37
|
-
response: { name: 'response' },
|
|
38
|
-
optionResponses: [{ name: 'labelResponse', attribute: 'label' }],
|
|
39
|
-
executeExpression: vitest_1.vi.fn(),
|
|
40
|
-
iteration: 1,
|
|
41
|
-
arbitrary: { response: { name: 'ARBITRARY' } },
|
|
42
|
-
optionRenderer: vitest_1.vi.fn(),
|
|
43
|
-
labelRenderer: vitest_1.vi.fn(),
|
|
44
|
-
focused: false,
|
|
45
|
-
};
|
|
46
69
|
// Given the composant initialize
|
|
47
70
|
const { rerender } = (0, react_1.render)((0, jsx_runtime_1.jsx)(Suggester_1.WrappedSuggester, { ...initialProps }));
|
|
48
71
|
const suggesterValue = react_1.screen.getByTestId('custom-suggester').textContent;
|
|
49
72
|
(0, vitest_1.expect)(suggesterValue).toContain('initialValue');
|
|
73
|
+
const forcedValue = 'FORCED value';
|
|
50
74
|
// When we change the value
|
|
51
|
-
const newProps = { ...initialProps, value:
|
|
75
|
+
const newProps = { ...initialProps, value: forcedValue };
|
|
52
76
|
rerender((0, jsx_runtime_1.jsx)(Suggester_1.WrappedSuggester, { ...newProps }));
|
|
53
77
|
// Then selectedOptions, i.e value props of customSuggester have to be updated
|
|
54
78
|
const updatedValue = react_1.screen.getByTestId('custom-suggester').textContent;
|
|
55
79
|
(0, vitest_1.expect)(updatedValue).toContain('FORCED value');
|
|
56
80
|
});
|
|
81
|
+
(0, vitest_1.it)('should update selectedOptions when value prop is set to null', () => {
|
|
82
|
+
// Given the composant initialize
|
|
83
|
+
const { rerender } = (0, react_1.render)((0, jsx_runtime_1.jsx)(Suggester_1.WrappedSuggester, { ...initialProps }));
|
|
84
|
+
const suggesterValue = react_1.screen.getByTestId('custom-suggester').textContent;
|
|
85
|
+
(0, vitest_1.expect)(suggesterValue).toContain('initialValue');
|
|
86
|
+
const forcedValue = null;
|
|
87
|
+
// When we change the value
|
|
88
|
+
const newProps = { ...initialProps, value: forcedValue };
|
|
89
|
+
rerender((0, jsx_runtime_1.jsx)(Suggester_1.WrappedSuggester, { ...newProps }));
|
|
90
|
+
// Then selectedOptions, i.e value props of customSuggester have to be updated
|
|
91
|
+
const updatedValue = react_1.screen.getByTestId('custom-suggester').textContent;
|
|
92
|
+
(0, vitest_1.expect)(updatedValue).toContain(FAKE_PLACE_HOLDER);
|
|
93
|
+
});
|
|
94
|
+
(0, vitest_1.it)('should update selectedOptions when value prop is set to an empty string ("")', () => {
|
|
95
|
+
// Given the composant initialize
|
|
96
|
+
const { rerender } = (0, react_1.render)((0, jsx_runtime_1.jsx)(Suggester_1.WrappedSuggester, { ...initialProps }));
|
|
97
|
+
const suggesterValue = react_1.screen.getByTestId('custom-suggester').textContent;
|
|
98
|
+
(0, vitest_1.expect)(suggesterValue).toContain('initialValue');
|
|
99
|
+
const forcedValue = '';
|
|
100
|
+
// When we change the value
|
|
101
|
+
const newProps = { ...initialProps, value: forcedValue };
|
|
102
|
+
rerender((0, jsx_runtime_1.jsx)(Suggester_1.WrappedSuggester, { ...newProps }));
|
|
103
|
+
// Then selectedOptions, i.e value props of customSuggester have to be updated
|
|
104
|
+
const updatedValue = react_1.screen.getByTestId('custom-suggester').textContent;
|
|
105
|
+
(0, vitest_1.expect)(updatedValue).toContain(FAKE_PLACE_HOLDER);
|
|
106
|
+
});
|
|
57
107
|
});
|
|
58
108
|
//# sourceMappingURL=Suggester.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Suggester.spec.js","sourceRoot":"","sources":["../../src/components/Suggester/Suggester.spec.tsx"],"names":[],"mappings":";;;AAAA,kDAAwD;AACxD,mCAAkD;AAClD,2CAA+C
|
|
1
|
+
{"version":3,"file":"Suggester.spec.js","sourceRoot":"","sources":["../../src/components/Suggester/Suggester.spec.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,31 @@
|
|
|
1
1
|
import type { SuggesterOptionType } from './SuggesterType';
|
|
2
|
+
import { SearchStore } from '../../utils/search/SuggestersDatabase';
|
|
2
3
|
type Props = {
|
|
3
|
-
|
|
4
|
+
store: SearchStore;
|
|
5
|
+
storeState: State;
|
|
6
|
+
setStoreState: (s: State) => any;
|
|
4
7
|
selectedOptions: SuggesterOptionType[];
|
|
5
8
|
allowArbitrary: boolean;
|
|
6
9
|
};
|
|
7
10
|
export declare const OTHER_VALUE = "OTHER";
|
|
8
11
|
type State = 'success' | 'loading' | 'error';
|
|
9
|
-
export declare function
|
|
12
|
+
export declare function useStore({ storeName }: {
|
|
13
|
+
storeName: string;
|
|
14
|
+
}): {
|
|
15
|
+
store: {
|
|
16
|
+
error: string;
|
|
17
|
+
search?: undefined;
|
|
18
|
+
index?: undefined;
|
|
19
|
+
} | {
|
|
20
|
+
error: null;
|
|
21
|
+
search: import("../../utils/search/SearchInterface").SearchInterface<import("../../utils/search/SearchInterface").IndexEntry>;
|
|
22
|
+
index: () => Promise<void>;
|
|
23
|
+
};
|
|
24
|
+
storeState: State;
|
|
25
|
+
setStoreState: import("react").Dispatch<import("react").SetStateAction<State>>;
|
|
26
|
+
getLabelById: (id: any) => string;
|
|
27
|
+
};
|
|
28
|
+
export declare function useSuggestions({ store, storeState: state, setStoreState: setState, selectedOptions, allowArbitrary, }: Props): {
|
|
10
29
|
search: string;
|
|
11
30
|
setSearch: (s: string) => void;
|
|
12
31
|
state: State;
|
|
@@ -1,21 +1,19 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.OTHER_VALUE = void 0;
|
|
4
|
+
exports.useStore = useStore;
|
|
4
5
|
exports.useSuggestions = useSuggestions;
|
|
5
6
|
const react_1 = require("react");
|
|
6
7
|
const useDebounce_1 = require("../../hooks/useDebounce");
|
|
7
8
|
const SuggestersDatabase_1 = require("../../utils/search/SuggestersDatabase");
|
|
8
9
|
const useRefSync_1 = require("../../hooks/useRefSync");
|
|
9
10
|
exports.OTHER_VALUE = 'OTHER';
|
|
10
|
-
function
|
|
11
|
-
const [searchQuery, setSearchQuery] = (0, react_1.useState)('');
|
|
11
|
+
function useStore({ storeName }) {
|
|
12
12
|
const store = (0, SuggestersDatabase_1.getSearchForStore)(storeName);
|
|
13
13
|
const searchIndexRef = (0, useRefSync_1.useRefSync)(store.index);
|
|
14
|
-
// eslint-disable-next-line prefer-const
|
|
15
|
-
let [options, setOptions] = (0, react_1.useState)(selectedOptions);
|
|
16
14
|
const [state, setState] = (0, react_1.useState)(store.error !== null
|
|
17
15
|
? 'error'
|
|
18
|
-
: store
|
|
16
|
+
: store?.search.isIndexed()
|
|
19
17
|
? 'success'
|
|
20
18
|
: 'loading');
|
|
21
19
|
// Index the data when the component is loaded
|
|
@@ -32,18 +30,34 @@ function useSuggestions({ storeName, selectedOptions, allowArbitrary, }) {
|
|
|
32
30
|
setState('error');
|
|
33
31
|
});
|
|
34
32
|
}, [searchIndexRef]);
|
|
33
|
+
return {
|
|
34
|
+
store,
|
|
35
|
+
storeState: state,
|
|
36
|
+
setStoreState: setState,
|
|
37
|
+
getLabelById: (id) => {
|
|
38
|
+
if (!id)
|
|
39
|
+
return '';
|
|
40
|
+
return store.search?.getFieldsById(id)?.label ?? '';
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function useSuggestions({ store, storeState: state, setStoreState: setState, selectedOptions, allowArbitrary, }) {
|
|
45
|
+
const [searchQuery, setSearchQuery] = (0, react_1.useState)('');
|
|
46
|
+
// eslint-disable-next-line prefer-const
|
|
47
|
+
let [options, setOptions] = (0, react_1.useState)(selectedOptions);
|
|
35
48
|
(0, useDebounce_1.useEffectDebounced)(() => {
|
|
36
49
|
// Do not reset search for empty search
|
|
37
50
|
if (!searchQuery) {
|
|
38
51
|
return;
|
|
39
52
|
}
|
|
40
|
-
store.
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
53
|
+
if (store.error === null)
|
|
54
|
+
store.search
|
|
55
|
+
?.search(searchQuery)
|
|
56
|
+
.then((r) => {
|
|
57
|
+
setOptions(r);
|
|
58
|
+
setState('success');
|
|
59
|
+
})
|
|
60
|
+
.catch(() => setState('error'));
|
|
47
61
|
}, [searchQuery], 300);
|
|
48
62
|
if (searchQuery &&
|
|
49
63
|
allowArbitrary &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSuggestions.js","sourceRoot":"","sources":["../../src/components/Suggester/useSuggestions.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"useSuggestions.js","sourceRoot":"","sources":["../../src/components/Suggester/useSuggestions.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { createElement as _createElement } from "react";
|
|
|
3
3
|
import { useEffect, useState } from 'react';
|
|
4
4
|
import { CustomSuggester } from './CustomSuggester';
|
|
5
5
|
import { getComponentErrors } from '../shared/ComponentErrors/ComponentErrors';
|
|
6
|
-
import { OTHER_VALUE, useSuggestions } from './useSuggestions';
|
|
6
|
+
import { OTHER_VALUE, useStore, useSuggestions } from './useSuggestions';
|
|
7
7
|
import D from '../../i18n';
|
|
8
8
|
export function Suggester(props) {
|
|
9
9
|
const { id, iteration } = props;
|
|
@@ -11,20 +11,24 @@ export function Suggester(props) {
|
|
|
11
11
|
const suggesterKey = `${id}-${iteration}`;
|
|
12
12
|
return _createElement(WrappedSuggester, { ...props, key: suggesterKey });
|
|
13
13
|
}
|
|
14
|
+
const ARBITRARY_ID = 'OTHER';
|
|
14
15
|
export function WrappedSuggester({ storeName, id, className, optionRenderer, labelRenderer, handleChanges, disabled, value, label, declarations, description, errors, readOnly, response, optionResponses = [], executeExpression, iteration, arbitrary, arbitraryValue, }) {
|
|
15
16
|
var _a;
|
|
17
|
+
const { store, storeState, setStoreState, getLabelById } = useStore({
|
|
18
|
+
storeName,
|
|
19
|
+
});
|
|
16
20
|
// Default options should not change between render
|
|
17
21
|
// so we can break the rule of hooks here
|
|
18
22
|
const computeSelectedOptions = () => {
|
|
19
23
|
if (arbitraryValue) {
|
|
20
|
-
return [{ id:
|
|
24
|
+
return [{ id: ARBITRARY_ID, label: arbitraryValue, value: ARBITRARY_ID }];
|
|
21
25
|
}
|
|
22
26
|
if (!value) {
|
|
23
27
|
return [];
|
|
24
28
|
}
|
|
25
29
|
const labelResponse = optionResponses === null || optionResponses === void 0 ? void 0 : optionResponses.find((o) => o.attribute === 'label');
|
|
26
30
|
if (!labelResponse) {
|
|
27
|
-
return [{ id: value, label: value, value: value }];
|
|
31
|
+
return [{ id: value, label: getLabelById(value), value: value }];
|
|
28
32
|
}
|
|
29
33
|
const label = executeExpression({ value: labelResponse.name, type: 'VTL' }, {
|
|
30
34
|
iteration,
|
|
@@ -42,7 +46,9 @@ export function WrappedSuggester({ storeName, id, className, optionRenderer, lab
|
|
|
42
46
|
};
|
|
43
47
|
const [selectedOptions, setSelectedOptions] = useState(computeSelectedOptions);
|
|
44
48
|
const { state, options, search, setSearch, onFocus, onBlur } = useSuggestions({
|
|
45
|
-
|
|
49
|
+
store,
|
|
50
|
+
storeState,
|
|
51
|
+
setStoreState,
|
|
46
52
|
allowArbitrary: !!arbitrary,
|
|
47
53
|
selectedOptions: selectedOptions,
|
|
48
54
|
});
|
|
@@ -76,7 +82,7 @@ export function WrappedSuggester({ storeName, id, className, optionRenderer, lab
|
|
|
76
82
|
{ name: response.name, value: null },
|
|
77
83
|
];
|
|
78
84
|
// User chose an arbitrary option or clear the value
|
|
79
|
-
if (arbitrary
|
|
85
|
+
if (arbitrary === null || arbitrary === void 0 ? void 0 : arbitrary.response) {
|
|
80
86
|
newResponses.push({
|
|
81
87
|
name: arbitrary.response.name,
|
|
82
88
|
value: (v === null || v === void 0 ? void 0 : v.id) === OTHER_VALUE ? search : null,
|
|
@@ -107,11 +113,21 @@ export function WrappedSuggester({ storeName, id, className, optionRenderer, lab
|
|
|
107
113
|
onChange(null);
|
|
108
114
|
setSearch('');
|
|
109
115
|
};
|
|
110
|
-
// Fix display issue (when handleChanges is called outside this component (in management mode, return to FORCED value by example) )
|
|
111
|
-
// We have to re-compute actual selection
|
|
112
116
|
useEffect(() => {
|
|
113
|
-
|
|
114
|
-
|
|
117
|
+
var _a;
|
|
118
|
+
// Fix display issue (when handleChanges is called outside this component (in management mode, return to FORCED value by example)
|
|
119
|
+
// "value" does'nt match selectedOption's "id"
|
|
120
|
+
if (((_a = selectedOptions[0]) === null || _a === void 0 ? void 0 : _a.id) !== value) {
|
|
121
|
+
const actualSelection = computeSelectedOptions();
|
|
122
|
+
const selectedOptionsWithLabel = actualSelection.map((selection) => {
|
|
123
|
+
if (selection.id === ARBITRARY_ID)
|
|
124
|
+
return selection;
|
|
125
|
+
return {
|
|
126
|
+
...selection,
|
|
127
|
+
label: getLabelById(selection.id),
|
|
128
|
+
};
|
|
129
|
+
});
|
|
130
|
+
setSelectedOptions(selectedOptionsWithLabel);
|
|
115
131
|
}
|
|
116
132
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
117
133
|
}, [value]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Suggester.js","sourceRoot":"","sources":["../../../src/components/Suggester/Suggester.tsx"],"names":[],"mappings":";;AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"Suggester.js","sourceRoot":"","sources":["../../../src/components/Suggester/Suggester.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { render, screen } from '@testing-library/react';
|
|
3
3
|
import { describe, it, expect, vi } from 'vitest';
|
|
4
|
-
import { WrappedSuggester } from './Suggester';
|
|
4
|
+
import { WrappedSuggester } from './Suggester';
|
|
5
5
|
// Mock of useSuggestions
|
|
6
6
|
vi.mock('./useSuggestions', () => ({
|
|
7
7
|
useSuggestions: vi.fn(() => ({
|
|
@@ -11,46 +11,99 @@ vi.mock('./useSuggestions', () => ({
|
|
|
11
11
|
setSearch: vi.fn(),
|
|
12
12
|
onFocus: vi.fn(),
|
|
13
13
|
onBlur: vi.fn(),
|
|
14
|
+
getSelectedLabelById: vi.fn(),
|
|
15
|
+
})),
|
|
16
|
+
useStore: vi.fn(() => ({
|
|
17
|
+
store: {},
|
|
18
|
+
storeState: 'success',
|
|
19
|
+
setStoreState: vi.fn(),
|
|
20
|
+
getLabelById: vi.fn(),
|
|
14
21
|
})),
|
|
15
22
|
}));
|
|
23
|
+
const FAKE_PLACE_HOLDER = 'place holder...';
|
|
16
24
|
// Mock of CustomSuggester
|
|
17
25
|
vi.mock('./CustomSuggester', () => ({
|
|
18
|
-
CustomSuggester: vi.fn(({ value }) =>
|
|
26
|
+
CustomSuggester: vi.fn(({ value }) => {
|
|
27
|
+
var _a;
|
|
28
|
+
return (_jsx("div", { "data-testid": "custom-suggester", children: Array.isArray(value) && value.length > 0
|
|
29
|
+
? ((_a = value[0].value) !== null && _a !== void 0 ? _a : FAKE_PLACE_HOLDER)
|
|
30
|
+
: FAKE_PLACE_HOLDER }));
|
|
31
|
+
}),
|
|
19
32
|
}));
|
|
20
33
|
describe('WrappedSuggester useEffect', () => {
|
|
34
|
+
// Given initial props
|
|
35
|
+
const initialProps = {
|
|
36
|
+
storeName: 'store',
|
|
37
|
+
id: 'suggester-1',
|
|
38
|
+
className: '',
|
|
39
|
+
handleChanges: vi.fn(),
|
|
40
|
+
disabled: false,
|
|
41
|
+
value: 'initialValue',
|
|
42
|
+
label: 'Label',
|
|
43
|
+
declarations: [],
|
|
44
|
+
description: '',
|
|
45
|
+
errors: {},
|
|
46
|
+
readOnly: false,
|
|
47
|
+
response: { name: 'response' },
|
|
48
|
+
optionResponses: [{ name: 'labelResponse', attribute: 'label' }],
|
|
49
|
+
executeExpression: vi.fn(),
|
|
50
|
+
iteration: 1,
|
|
51
|
+
arbitrary: { response: { name: 'ARBITRARY' } },
|
|
52
|
+
optionRenderer: vi.fn(),
|
|
53
|
+
labelRenderer: vi.fn(),
|
|
54
|
+
focused: false,
|
|
55
|
+
};
|
|
56
|
+
it('should display place holder when no value is set', () => {
|
|
57
|
+
// Given the composant initialize
|
|
58
|
+
const { rerender } = render(_jsx(WrappedSuggester, { ...initialProps, value: null }));
|
|
59
|
+
const suggesterValue = screen.getByTestId('custom-suggester').textContent;
|
|
60
|
+
expect(suggesterValue).toContain(FAKE_PLACE_HOLDER);
|
|
61
|
+
const forcedValue = 'FORCED value';
|
|
62
|
+
// When we change the value
|
|
63
|
+
const newProps = { ...initialProps, value: forcedValue };
|
|
64
|
+
rerender(_jsx(WrappedSuggester, { ...newProps }));
|
|
65
|
+
// Then selectedOptions, i.e value props of customSuggester have to be updated
|
|
66
|
+
const updatedValue = screen.getByTestId('custom-suggester').textContent;
|
|
67
|
+
expect(updatedValue).toContain('FORCED value');
|
|
68
|
+
});
|
|
21
69
|
it('should update selectedOptions when value prop changes', () => {
|
|
22
|
-
// Given initial props
|
|
23
|
-
const initialProps = {
|
|
24
|
-
storeName: 'store',
|
|
25
|
-
id: 'suggester-1',
|
|
26
|
-
className: '',
|
|
27
|
-
handleChanges: vi.fn(),
|
|
28
|
-
disabled: false,
|
|
29
|
-
value: 'initialValue',
|
|
30
|
-
label: 'Label',
|
|
31
|
-
declarations: [],
|
|
32
|
-
description: '',
|
|
33
|
-
errors: {},
|
|
34
|
-
readOnly: false,
|
|
35
|
-
response: { name: 'response' },
|
|
36
|
-
optionResponses: [{ name: 'labelResponse', attribute: 'label' }],
|
|
37
|
-
executeExpression: vi.fn(),
|
|
38
|
-
iteration: 1,
|
|
39
|
-
arbitrary: { response: { name: 'ARBITRARY' } },
|
|
40
|
-
optionRenderer: vi.fn(),
|
|
41
|
-
labelRenderer: vi.fn(),
|
|
42
|
-
focused: false,
|
|
43
|
-
};
|
|
44
70
|
// Given the composant initialize
|
|
45
71
|
const { rerender } = render(_jsx(WrappedSuggester, { ...initialProps }));
|
|
46
72
|
const suggesterValue = screen.getByTestId('custom-suggester').textContent;
|
|
47
73
|
expect(suggesterValue).toContain('initialValue');
|
|
74
|
+
const forcedValue = 'FORCED value';
|
|
48
75
|
// When we change the value
|
|
49
|
-
const newProps = { ...initialProps, value:
|
|
76
|
+
const newProps = { ...initialProps, value: forcedValue };
|
|
50
77
|
rerender(_jsx(WrappedSuggester, { ...newProps }));
|
|
51
78
|
// Then selectedOptions, i.e value props of customSuggester have to be updated
|
|
52
79
|
const updatedValue = screen.getByTestId('custom-suggester').textContent;
|
|
53
80
|
expect(updatedValue).toContain('FORCED value');
|
|
54
81
|
});
|
|
82
|
+
it('should update selectedOptions when value prop is set to null', () => {
|
|
83
|
+
// Given the composant initialize
|
|
84
|
+
const { rerender } = render(_jsx(WrappedSuggester, { ...initialProps }));
|
|
85
|
+
const suggesterValue = screen.getByTestId('custom-suggester').textContent;
|
|
86
|
+
expect(suggesterValue).toContain('initialValue');
|
|
87
|
+
const forcedValue = null;
|
|
88
|
+
// When we change the value
|
|
89
|
+
const newProps = { ...initialProps, value: forcedValue };
|
|
90
|
+
rerender(_jsx(WrappedSuggester, { ...newProps }));
|
|
91
|
+
// Then selectedOptions, i.e value props of customSuggester have to be updated
|
|
92
|
+
const updatedValue = screen.getByTestId('custom-suggester').textContent;
|
|
93
|
+
expect(updatedValue).toContain(FAKE_PLACE_HOLDER);
|
|
94
|
+
});
|
|
95
|
+
it('should update selectedOptions when value prop is set to an empty string ("")', () => {
|
|
96
|
+
// Given the composant initialize
|
|
97
|
+
const { rerender } = render(_jsx(WrappedSuggester, { ...initialProps }));
|
|
98
|
+
const suggesterValue = screen.getByTestId('custom-suggester').textContent;
|
|
99
|
+
expect(suggesterValue).toContain('initialValue');
|
|
100
|
+
const forcedValue = '';
|
|
101
|
+
// When we change the value
|
|
102
|
+
const newProps = { ...initialProps, value: forcedValue };
|
|
103
|
+
rerender(_jsx(WrappedSuggester, { ...newProps }));
|
|
104
|
+
// Then selectedOptions, i.e value props of customSuggester have to be updated
|
|
105
|
+
const updatedValue = screen.getByTestId('custom-suggester').textContent;
|
|
106
|
+
expect(updatedValue).toContain(FAKE_PLACE_HOLDER);
|
|
107
|
+
});
|
|
55
108
|
});
|
|
56
109
|
//# sourceMappingURL=Suggester.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Suggester.spec.js","sourceRoot":"","sources":["../../../src/components/Suggester/Suggester.spec.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC
|
|
1
|
+
{"version":3,"file":"Suggester.spec.js","sourceRoot":"","sources":["../../../src/components/Suggester/Suggester.spec.tsx"],"names":[],"mappings":"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"}
|