@inseefr/lunatic 3.12.1 → 3.12.3
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/Dropdown/Dropdown.js +1 -2
- package/components/Dropdown/Dropdown.js.map +1 -1
- package/components/Dropdown/Dropdown.spec.js +13 -5
- package/components/Dropdown/Dropdown.spec.js.map +1 -1
- package/components/Suggester/CustomSuggester.d.ts +6 -0
- package/components/Suggester/CustomSuggester.js +1 -1
- package/components/Suggester/CustomSuggester.js.map +1 -1
- package/components/shared/Combobox/Combobox.js +5 -6
- package/components/shared/Combobox/Combobox.js.map +1 -1
- package/components/shared/Combobox/ComboboxType.d.ts +1 -0
- package/components/shared/Combobox/Panel/ComboboxOption.d.ts +1 -0
- package/components/shared/Combobox/Panel/ComboboxOption.js +4 -4
- package/components/shared/Combobox/Panel/ComboboxOption.js.map +1 -1
- package/components/shared/Combobox/Panel/ComboboxOption.spec.js +18 -5
- package/components/shared/Combobox/Panel/ComboboxOption.spec.js.map +1 -1
- package/components/shared/Combobox/Panel/ComboboxPanel.d.ts +1 -1
- package/components/shared/Combobox/Panel/ComboboxPanel.js +2 -2
- package/components/shared/Combobox/Panel/ComboboxPanel.js.map +1 -1
- package/components/type.d.ts +6 -0
- package/esm/components/Dropdown/Dropdown.js +1 -2
- package/esm/components/Dropdown/Dropdown.js.map +1 -1
- package/esm/components/Dropdown/Dropdown.spec.js +14 -6
- package/esm/components/Dropdown/Dropdown.spec.js.map +1 -1
- package/esm/components/Suggester/CustomSuggester.d.ts +6 -0
- package/esm/components/Suggester/CustomSuggester.js +1 -1
- package/esm/components/Suggester/CustomSuggester.js.map +1 -1
- package/esm/components/shared/Combobox/Combobox.js +5 -6
- package/esm/components/shared/Combobox/Combobox.js.map +1 -1
- package/esm/components/shared/Combobox/ComboboxType.d.ts +1 -0
- package/esm/components/shared/Combobox/Panel/ComboboxOption.d.ts +1 -0
- package/esm/components/shared/Combobox/Panel/ComboboxOption.js +5 -5
- package/esm/components/shared/Combobox/Panel/ComboboxOption.js.map +1 -1
- package/esm/components/shared/Combobox/Panel/ComboboxOption.spec.js +18 -5
- package/esm/components/shared/Combobox/Panel/ComboboxOption.spec.js.map +1 -1
- package/esm/components/shared/Combobox/Panel/ComboboxPanel.d.ts +1 -1
- package/esm/components/shared/Combobox/Panel/ComboboxPanel.js +2 -2
- package/esm/components/shared/Combobox/Panel/ComboboxPanel.js.map +1 -1
- package/esm/components/type.d.ts +6 -0
- package/esm/utils/search/SearchMiniSearch.spec.js +16 -1
- package/esm/utils/search/SearchMiniSearch.spec.js.map +1 -1
- package/esm/utils/search/SearchMinisearch.js +26 -1
- package/esm/utils/search/SearchMinisearch.js.map +1 -1
- package/esm/utils/search/tokenizer.js +1 -14
- package/esm/utils/search/tokenizer.js.map +1 -1
- package/esm/utils/search/utils.d.ts +7 -0
- package/esm/utils/search/utils.js +15 -0
- package/esm/utils/search/utils.js.map +1 -0
- package/package.json +8 -8
- package/src/components/Dropdown/Dropdown.spec.tsx +22 -6
- package/src/components/Dropdown/Dropdown.tsx +1 -2
- package/src/components/Dropdown/__snapshots__/Dropdown.spec.tsx.snap +2 -2
- package/src/components/Suggester/CustomSuggester.tsx +7 -0
- package/src/components/shared/Combobox/Combobox.tsx +5 -4
- package/src/components/shared/Combobox/ComboboxType.ts +1 -0
- package/src/components/shared/Combobox/Panel/ComboboxOption.spec.tsx +27 -5
- package/src/components/shared/Combobox/Panel/ComboboxOption.tsx +10 -6
- package/src/components/shared/Combobox/Panel/ComboboxPanel.tsx +3 -1
- package/src/components/type.ts +6 -0
- package/src/utils/search/SearchMiniSearch.spec.ts +21 -1
- package/src/utils/search/SearchMinisearch.ts +34 -1
- package/src/utils/search/tokenizer.ts +1 -15
- package/src/utils/search/utils.ts +14 -0
- package/tsconfig.build.tsbuildinfo +1 -1
- package/utils/search/SearchMiniSearch.spec.js +15 -1
- package/utils/search/SearchMiniSearch.spec.js.map +1 -1
- package/utils/search/SearchMinisearch.js +26 -1
- package/utils/search/SearchMinisearch.js.map +1 -1
- package/utils/search/tokenizer.js +6 -19
- package/utils/search/tokenizer.js.map +1 -1
- package/utils/search/utils.d.ts +7 -0
- package/utils/search/utils.js +19 -0
- package/utils/search/utils.js.map +1 -0
- package/components/Dropdown/renderer/SimpleOptionRenderer.d.ts +0 -7
- package/components/Dropdown/renderer/SimpleOptionRenderer.js +0 -16
- package/components/Dropdown/renderer/SimpleOptionRenderer.js.map +0 -1
- package/esm/components/Dropdown/renderer/SimpleOptionRenderer.d.ts +0 -7
- package/esm/components/Dropdown/renderer/SimpleOptionRenderer.js +0 -10
- package/esm/components/Dropdown/renderer/SimpleOptionRenderer.js.map +0 -1
- package/src/components/Dropdown/renderer/SimpleOptionRenderer.tsx +0 -26
|
@@ -11,13 +11,26 @@ describe('DefaultOptionRenderer', () => {
|
|
|
11
11
|
expect(idElement).toBeInTheDocument();
|
|
12
12
|
expect(labelElement).toBeNull();
|
|
13
13
|
});
|
|
14
|
-
it('renders with label', () => {
|
|
14
|
+
it('renders with label and displays id by default', () => {
|
|
15
15
|
const option = { id: '1', value: 'Value', label: 'Label' };
|
|
16
16
|
const { getByText } = render(_jsx(ComboboxOption, { option: option }));
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
expect(
|
|
20
|
-
|
|
17
|
+
expect(getByText(option.id)).toBeInTheDocument();
|
|
18
|
+
expect(getByText('-')).toBeInTheDocument();
|
|
19
|
+
expect(getByText(option.label)).toBeInTheDocument();
|
|
20
|
+
});
|
|
21
|
+
it('renders with label and displays id when prop is true', () => {
|
|
22
|
+
const option = { id: '1', value: 'Value', label: 'Label' };
|
|
23
|
+
const { getByText } = render(_jsx(ComboboxOption, { option: option, shouldDisplayOptionId: true }));
|
|
24
|
+
expect(getByText(option.id)).toBeInTheDocument();
|
|
25
|
+
expect(getByText('-')).toBeInTheDocument();
|
|
26
|
+
expect(getByText(option.label)).toBeInTheDocument();
|
|
27
|
+
});
|
|
28
|
+
it('renders with label and does not display id when prop is false', () => {
|
|
29
|
+
const option = { id: '1', value: 'Value', label: 'Label' };
|
|
30
|
+
const { getByText, queryByText } = render(_jsx(ComboboxOption, { option: option, shouldDisplayOptionId: false }));
|
|
31
|
+
expect(queryByText(option.id)).not.toBeInTheDocument();
|
|
32
|
+
expect(queryByText('-')).not.toBeInTheDocument();
|
|
33
|
+
expect(getByText(option.label)).toBeInTheDocument();
|
|
21
34
|
});
|
|
22
35
|
it('renders with selected class', () => {
|
|
23
36
|
const option = { id: '1', value: 'Value', label: 'Label' };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComboboxOption.spec.js","sourceRoot":"","sources":["../../../../../src/components/shared/Combobox/Panel/ComboboxOption.spec.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9C,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAChC,MAAM,MAAM,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAC3C,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,MAAM,CACxC,KAAC,cAAc,IAAC,MAAM,EAAE,MAAM,GAAI,CAClC,CAAC;QACF,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACvC,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,CAAC,SAAS,CAAC,CAAC,iBAAiB,EAAE,CAAC;QACtC,MAAM,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"ComboboxOption.spec.js","sourceRoot":"","sources":["../../../../../src/components/shared/Combobox/Panel/ComboboxOption.spec.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9C,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAChC,MAAM,MAAM,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAC3C,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,MAAM,CACxC,KAAC,cAAc,IAAC,MAAM,EAAE,MAAM,GAAI,CAClC,CAAC;QACF,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACvC,MAAM,YAAY,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,CAAC,SAAS,CAAC,CAAC,iBAAiB,EAAE,CAAC;QACtC,MAAM,CAAC,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACxD,MAAM,MAAM,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAC3D,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,KAAC,cAAc,IAAC,MAAM,EAAE,MAAM,GAAI,CAAC,CAAC;QAEjE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC;QACjD,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC;QAC3C,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC/D,MAAM,MAAM,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAC3D,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAC3B,KAAC,cAAc,IAAC,MAAM,EAAE,MAAM,EAAE,qBAAqB,EAAE,IAAI,GAAI,CAC/D,CAAC;QAEF,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC;QACjD,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC;QAC3C,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACxE,MAAM,MAAM,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAC3D,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,MAAM,CACxC,KAAC,cAAc,IAAC,MAAM,EAAE,MAAM,EAAE,qBAAqB,EAAE,KAAK,GAAI,CAChE,CAAC;QAEF,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;QACvD,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC;QACjD,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,iBAAiB,EAAE,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACtC,MAAM,MAAM,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAC3D,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,KAAC,cAAc,IAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,SAAG,CAAC,CAAC;QAC1E,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACzC,MAAM,MAAM,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;QAC3D,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,KAAC,cAAc,IAAC,MAAM,EAAE,MAAM,GAAI,CAAC,CAAC;QACjE,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -2,4 +2,4 @@ import type { ComboboxPanelProps } from '../ComboboxType';
|
|
|
2
2
|
/**
|
|
3
3
|
* Floating menu containing selectable options
|
|
4
4
|
*/
|
|
5
|
-
export declare function ComboboxPanel({ optionRenderer: OptionRender, options, focused, selectedIndex, expanded, id, search, onSelect, isLoading, }: ComboboxPanelProps): import("react/jsx-runtime").JSX.Element | null;
|
|
5
|
+
export declare function ComboboxPanel({ optionRenderer: OptionRender, options, shouldDisplayOptionsId, focused, selectedIndex, expanded, id, search, onSelect, isLoading, }: Readonly<ComboboxPanelProps>): import("react/jsx-runtime").JSX.Element | null;
|
|
@@ -6,7 +6,7 @@ import D from '../../../../i18n';
|
|
|
6
6
|
/**
|
|
7
7
|
* Floating menu containing selectable options
|
|
8
8
|
*/
|
|
9
|
-
export function ComboboxPanel({ optionRenderer: OptionRender, options = [], focused, selectedIndex, expanded, id, search, onSelect, isLoading, }) {
|
|
9
|
+
export function ComboboxPanel({ optionRenderer: OptionRender, options = [], shouldDisplayOptionsId, focused, selectedIndex, expanded, id, search, onSelect, isLoading, }) {
|
|
10
10
|
const visibleOptions = expanded ? options : [];
|
|
11
11
|
const ComboBoxOptionComponent = OptionRender !== null && OptionRender !== void 0 ? OptionRender : ComboboxOption;
|
|
12
12
|
// Do not display the panel if it's empty
|
|
@@ -24,7 +24,7 @@ export function ComboboxPanel({ optionRenderer: OptionRender, options = [], focu
|
|
|
24
24
|
}
|
|
25
25
|
return (_jsx(ComboboxPanelContainer, { expanded: expanded, focused: focused, id: `${id}-list`, children: visibleOptions.map((option, index) => {
|
|
26
26
|
var _a;
|
|
27
|
-
return (_jsx(ComboboxOptionContainer, { index: index.toString(), selected: selectedIndex === index, onSelect: onSelect, children: _jsx(ComboBoxOptionComponent, { option: option, selected: selectedIndex === index, search: search }) }, (_a = option.id) !== null && _a !== void 0 ? _a : option.value));
|
|
27
|
+
return (_jsx(ComboboxOptionContainer, { index: index.toString(), selected: selectedIndex === index, onSelect: onSelect, children: _jsx(ComboBoxOptionComponent, { option: option, shouldDisplayOptionId: shouldDisplayOptionsId, selected: selectedIndex === index, search: search }) }, (_a = option.id) !== null && _a !== void 0 ? _a : option.value));
|
|
28
28
|
}) }));
|
|
29
29
|
}
|
|
30
30
|
//# sourceMappingURL=ComboboxPanel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComboboxPanel.js","sourceRoot":"","sources":["../../../../../src/components/shared/Combobox/Panel/ComboboxPanel.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,CAAC,MAAM,kBAAkB,CAAC;AAEjC;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,EAC7B,cAAc,EAAE,YAAY,EAC5B,OAAO,GAAG,EAAE,EACZ,OAAO,EACP,aAAa,EACb,QAAQ,EACR,EAAE,EACF,MAAM,EACN,QAAQ,EACR,SAAS,
|
|
1
|
+
{"version":3,"file":"ComboboxPanel.js","sourceRoot":"","sources":["../../../../../src/components/shared/Combobox/Panel/ComboboxPanel.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,CAAC,MAAM,kBAAkB,CAAC;AAEjC;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,EAC7B,cAAc,EAAE,YAAY,EAC5B,OAAO,GAAG,EAAE,EACZ,sBAAsB,EACtB,OAAO,EACP,aAAa,EACb,QAAQ,EACR,EAAE,EACF,MAAM,EACN,QAAQ,EACR,SAAS,GACqB;IAC9B,MAAM,cAAc,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAE/C,MAAM,uBAAuB,GAAG,YAAY,aAAZ,YAAY,cAAZ,YAAY,GAAI,cAAc,CAAC;IAE/D,yCAAyC;IACzC,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC;IACb,CAAC;IAED,IAAI,SAAS,EAAE,CAAC;QACf,OAAO,CACN,KAAC,sBAAsB,IACtB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,EAChB,EAAE,EAAE,GAAG,EAAE,OAAO,YAEhB,cAAK,SAAS,EAAC,0BAA0B,YACxC,eAAM,SAAS,EAAC,OAAO,YAAE,CAAC,CAAC,iBAAiB,GAAQ,GAC/C,GACkB,CACzB,CAAC;IACH,CAAC;IAED,IAAI,MAAM,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3C,OAAO,CACN,KAAC,sBAAsB,IACtB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,EAChB,EAAE,EAAE,GAAG,EAAE,OAAO,YAEhB,cAAK,SAAS,EAAC,0BAA0B,YACxC,eAAM,SAAS,EAAC,OAAO,YAAE,CAAC,CAAC,mBAAmB,GAAQ,GACjD,GACkB,CACzB,CAAC;IACH,CAAC;IAED,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,CACN,KAAC,sBAAsB,IACtB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,EAChB,EAAE,EAAE,GAAG,EAAE,OAAO,YAEhB,cAAK,SAAS,EAAC,0BAA0B,YACxC,eAAM,SAAS,EAAC,OAAO,YAAE,CAAC,CAAC,mBAAmB,GAAQ,GACjD,GACkB,CACzB,CAAC;IACH,CAAC;IAED,OAAO,CACN,KAAC,sBAAsB,IACtB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,EAChB,EAAE,EAAE,GAAG,EAAE,OAAO,YAEf,cAAc,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;;YAAC,OAAA,CACtC,KAAC,uBAAuB,IAEvB,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,EACvB,QAAQ,EAAE,aAAa,KAAK,KAAK,EACjC,QAAQ,EAAE,QAAQ,YAElB,KAAC,uBAAuB,IACvB,MAAM,EAAE,MAAM,EACd,qBAAqB,EAAE,sBAAsB,EAC7C,QAAQ,EAAE,aAAa,KAAK,KAAK,EACjC,MAAM,EAAE,MAAM,GACb,IAVG,MAAA,MAAM,CAAC,EAAE,mCAAI,MAAM,CAAC,KAAK,CAWL,CAC1B,CAAA;SAAA,CAAC,GACsB,CACzB,CAAC;AACH,CAAC"}
|
package/esm/components/type.d.ts
CHANGED
|
@@ -265,11 +265,17 @@ export type ComponentPropsByType = {
|
|
|
265
265
|
Suggester: LunaticBaseProps<string | null> & {
|
|
266
266
|
componentType?: 'Suggester';
|
|
267
267
|
storeName: string;
|
|
268
|
+
/**
|
|
269
|
+
* @deprecated use createCustomizableField with ComboboxOptionRenderer as name.
|
|
270
|
+
*/
|
|
268
271
|
optionRenderer: FunctionComponent<{
|
|
269
272
|
option: SuggesterOption;
|
|
270
273
|
placeholder?: string;
|
|
271
274
|
search?: string;
|
|
272
275
|
}>;
|
|
276
|
+
/**
|
|
277
|
+
* @deprecated use createCustomizableField with ComboboxLabelRenderer as name.
|
|
278
|
+
*/
|
|
273
279
|
labelRenderer: FunctionComponent<{
|
|
274
280
|
option?: SuggesterOption;
|
|
275
281
|
selected?: boolean;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { describe, it, expect, vi, beforeAll, afterEach } from 'vitest';
|
|
2
2
|
import { SearchMinisearch } from './SearchMinisearch';
|
|
3
|
+
import { applyMelauto } from './melauto';
|
|
3
4
|
vi.mock('minisearch', () => {
|
|
4
5
|
return {
|
|
5
6
|
default: vi.fn().mockImplementation(() => ({
|
|
@@ -20,7 +21,13 @@ describe('SearchMinisearch', () => {
|
|
|
20
21
|
beforeAll(() => {
|
|
21
22
|
searchInstance = new SearchMinisearch({
|
|
22
23
|
name: 'test-suggester',
|
|
23
|
-
fields: [
|
|
24
|
+
fields: [
|
|
25
|
+
{ name: 'id' },
|
|
26
|
+
{
|
|
27
|
+
name: 'label',
|
|
28
|
+
synonyms: { accueil: ['ACCEUIL', 'ACUEIL'] },
|
|
29
|
+
},
|
|
30
|
+
],
|
|
24
31
|
queryParser: {
|
|
25
32
|
type: 'tokenized',
|
|
26
33
|
params: { language: 'English', pattern: '\\w+', min: 1 },
|
|
@@ -47,5 +54,13 @@ describe('SearchMinisearch', () => {
|
|
|
47
54
|
await searchInstance.index(mockData);
|
|
48
55
|
expect((_a = searchInstance.db) === null || _a === void 0 ? void 0 : _a.addAll).not.toHaveBeenCalled();
|
|
49
56
|
});
|
|
57
|
+
it('should expand query synonyms before melauto sorting', async () => {
|
|
58
|
+
var _a;
|
|
59
|
+
await searchInstance.index(mockData);
|
|
60
|
+
((_a = searchInstance.db) === null || _a === void 0 ? void 0 : _a.search).mockReturnValue(mockData);
|
|
61
|
+
vi.mocked(applyMelauto).mockReturnValue(mockData);
|
|
62
|
+
await searchInstance.search('agent acceuil');
|
|
63
|
+
expect(applyMelauto).toHaveBeenCalledWith('agent acceuil accueil', mockData);
|
|
64
|
+
});
|
|
50
65
|
});
|
|
51
66
|
//# sourceMappingURL=SearchMiniSearch.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchMiniSearch.spec.js","sourceRoot":"","sources":["../../../src/utils/search/SearchMiniSearch.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"SearchMiniSearch.spec.js","sourceRoot":"","sources":["../../../src/utils/search/SearchMiniSearch.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,31 @@
|
|
|
1
1
|
import { applyMelauto } from './melauto';
|
|
2
2
|
import MiniSearch from 'minisearch';
|
|
3
3
|
import { tokenizer } from './tokenizer';
|
|
4
|
+
import { normalizeStr } from './utils';
|
|
5
|
+
function getMelautoQuery(query, info) {
|
|
6
|
+
const tokens = tokenizer(info)(query);
|
|
7
|
+
// existing query tokens (already tokenized/normalized by tokenizer).
|
|
8
|
+
const expandedTokens = new Set(tokens);
|
|
9
|
+
// add synonyms to keep melauto ranking.
|
|
10
|
+
for (const field of info.fields) {
|
|
11
|
+
if (!field.synonyms) {
|
|
12
|
+
continue;
|
|
13
|
+
}
|
|
14
|
+
for (const source in field.synonyms) {
|
|
15
|
+
const normalizedSource = normalizeStr(source);
|
|
16
|
+
const normalizedSynonyms = field.synonyms[source].map((synonym) => normalizeStr(synonym));
|
|
17
|
+
// source -> synonyms
|
|
18
|
+
if (expandedTokens.has(normalizedSource)) {
|
|
19
|
+
normalizedSynonyms.forEach((synonym) => expandedTokens.add(synonym));
|
|
20
|
+
}
|
|
21
|
+
// synonym -> source
|
|
22
|
+
if (normalizedSynonyms.some((synonym) => expandedTokens.has(synonym))) {
|
|
23
|
+
expandedTokens.add(normalizedSource);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return Array.from(expandedTokens).join(' ');
|
|
28
|
+
}
|
|
4
29
|
export class SearchMinisearch {
|
|
5
30
|
constructor(info) {
|
|
6
31
|
this.db = null;
|
|
@@ -31,7 +56,7 @@ export class SearchMinisearch {
|
|
|
31
56
|
prefix: (term) => term.length > 2,
|
|
32
57
|
});
|
|
33
58
|
// Apply melauto to classify results
|
|
34
|
-
data = applyMelauto(q, data);
|
|
59
|
+
data = applyMelauto(getMelautoQuery(q, this.info), data);
|
|
35
60
|
data = data.slice(0, this.info.max);
|
|
36
61
|
return data;
|
|
37
62
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchMinisearch.js","sourceRoot":"","sources":["../../../src/utils/search/SearchMinisearch.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"SearchMinisearch.js","sourceRoot":"","sources":["../../../src/utils/search/SearchMinisearch.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { normalizeStr } from './utils';
|
|
1
2
|
/**
|
|
2
3
|
* Generates a tokenize method.
|
|
3
4
|
* When used for tokenizing a search query instead of the indexing, the fieldName is undefined.
|
|
@@ -50,20 +51,6 @@ export const tokenizeIndex = (str, info, stopWords) => {
|
|
|
50
51
|
return ((_c = (_b = filterStopWords(normalizedStr, stopWords)
|
|
51
52
|
.match(wordRegex)) === null || _b === void 0 ? void 0 : _b.filter((w) => w.length >= minLength)) !== null && _c !== void 0 ? _c : []);
|
|
52
53
|
};
|
|
53
|
-
/**
|
|
54
|
-
* Normalize a string
|
|
55
|
-
* - Remove accent (é => e, à => a)
|
|
56
|
-
* - remove ligatures (æ => ae, , Æ => ae, œ => oe, Œ => oe)
|
|
57
|
-
* - Lowercase
|
|
58
|
-
*/
|
|
59
|
-
const normalizeStr = (str) => {
|
|
60
|
-
return str
|
|
61
|
-
.toLowerCase()
|
|
62
|
-
.replaceAll('œ', 'oe')
|
|
63
|
-
.replaceAll('æ', 'ae')
|
|
64
|
-
.normalize('NFD')
|
|
65
|
-
.replace(/[\u0300-\u036f]/g, '');
|
|
66
|
-
};
|
|
67
54
|
/**
|
|
68
55
|
* remove from a string all the words that are included in a stopwords list
|
|
69
56
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../../../src/utils/search/tokenizer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tokenizer.js","sourceRoot":"","sources":["../../../src/utils/search/tokenizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normalize a string
|
|
3
|
+
* - Remove accent (é => e, à => a)
|
|
4
|
+
* - remove ligatures (æ => ae, , Æ => ae, œ => oe, Œ => oe)
|
|
5
|
+
* - Lowercase
|
|
6
|
+
*/
|
|
7
|
+
export const normalizeStr = (str) => {
|
|
8
|
+
return str
|
|
9
|
+
.toLowerCase()
|
|
10
|
+
.replaceAll('œ', 'oe')
|
|
11
|
+
.replaceAll('æ', 'ae')
|
|
12
|
+
.normalize('NFD')
|
|
13
|
+
.replace(/[\u0300-\u036f]/g, '');
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/utils/search/utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,GAAW,EAAE,EAAE;IAC3C,OAAO,GAAG;SACR,WAAW,EAAE;SACb,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC;SACrB,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC;SACrB,SAAS,CAAC,KAAK,CAAC;SAChB,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;AACnC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@inseefr/lunatic",
|
|
3
|
-
"version": "3.12.
|
|
3
|
+
"version": "3.12.3",
|
|
4
4
|
"description": "Library of questionnaire components",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -51,7 +51,6 @@
|
|
|
51
51
|
"src/components/Dropdown/Dropdown.tsx",
|
|
52
52
|
"src/components/Dropdown/__snapshots__/Dropdown.spec.tsx.snap",
|
|
53
53
|
"src/components/Dropdown/renderer/SimpleLabelRenderer.tsx",
|
|
54
|
-
"src/components/Dropdown/renderer/SimpleOptionRenderer.tsx",
|
|
55
54
|
"src/components/Duration/Duration.test.tsx",
|
|
56
55
|
"src/components/Duration/Duration.tsx",
|
|
57
56
|
"src/components/Duration/durationUtils.ts",
|
|
@@ -462,6 +461,7 @@
|
|
|
462
461
|
"src/utils/search/melauto.ts",
|
|
463
462
|
"src/utils/search/tokenizer.spec.ts",
|
|
464
463
|
"src/utils/search/tokenizer.ts",
|
|
464
|
+
"src/utils/search/utils.ts",
|
|
465
465
|
"src/utils/variables.spec.ts",
|
|
466
466
|
"src/utils/variables.ts",
|
|
467
467
|
"src/utils/vtl.ts",
|
|
@@ -510,9 +510,6 @@
|
|
|
510
510
|
"components/Dropdown/renderer/SimpleLabelRenderer.d.ts",
|
|
511
511
|
"components/Dropdown/renderer/SimpleLabelRenderer.js",
|
|
512
512
|
"components/Dropdown/renderer/SimpleLabelRenderer.js.map",
|
|
513
|
-
"components/Dropdown/renderer/SimpleOptionRenderer.d.ts",
|
|
514
|
-
"components/Dropdown/renderer/SimpleOptionRenderer.js",
|
|
515
|
-
"components/Dropdown/renderer/SimpleOptionRenderer.js.map",
|
|
516
513
|
"components/Duration/Duration.d.ts",
|
|
517
514
|
"components/Duration/Duration.js",
|
|
518
515
|
"components/Duration/Duration.js.map",
|
|
@@ -945,9 +942,6 @@
|
|
|
945
942
|
"esm/components/Dropdown/renderer/SimpleLabelRenderer.d.ts",
|
|
946
943
|
"esm/components/Dropdown/renderer/SimpleLabelRenderer.js",
|
|
947
944
|
"esm/components/Dropdown/renderer/SimpleLabelRenderer.js.map",
|
|
948
|
-
"esm/components/Dropdown/renderer/SimpleOptionRenderer.d.ts",
|
|
949
|
-
"esm/components/Dropdown/renderer/SimpleOptionRenderer.js",
|
|
950
|
-
"esm/components/Dropdown/renderer/SimpleOptionRenderer.js.map",
|
|
951
945
|
"esm/components/Duration/Duration.d.ts",
|
|
952
946
|
"esm/components/Duration/Duration.js",
|
|
953
947
|
"esm/components/Duration/Duration.js.map",
|
|
@@ -1667,6 +1661,9 @@
|
|
|
1667
1661
|
"esm/utils/search/tokenizer.spec.d.ts",
|
|
1668
1662
|
"esm/utils/search/tokenizer.spec.js",
|
|
1669
1663
|
"esm/utils/search/tokenizer.spec.js.map",
|
|
1664
|
+
"esm/utils/search/utils.d.ts",
|
|
1665
|
+
"esm/utils/search/utils.js",
|
|
1666
|
+
"esm/utils/search/utils.js.map",
|
|
1670
1667
|
"esm/utils/variables.d.ts",
|
|
1671
1668
|
"esm/utils/variables.js",
|
|
1672
1669
|
"esm/utils/variables.js.map",
|
|
@@ -2009,6 +2006,9 @@
|
|
|
2009
2006
|
"utils/search/tokenizer.spec.d.ts",
|
|
2010
2007
|
"utils/search/tokenizer.spec.js",
|
|
2011
2008
|
"utils/search/tokenizer.spec.js.map",
|
|
2009
|
+
"utils/search/utils.d.ts",
|
|
2010
|
+
"utils/search/utils.js",
|
|
2011
|
+
"utils/search/utils.js.map",
|
|
2012
2012
|
"utils/variables.d.ts",
|
|
2013
2013
|
"utils/variables.js",
|
|
2014
2014
|
"utils/variables.js.map",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { render } from '@testing-library/react';
|
|
1
|
+
import { fireEvent, render } from '@testing-library/react';
|
|
2
2
|
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
3
3
|
import { Dropdown } from './Dropdown';
|
|
4
4
|
|
|
@@ -6,14 +6,14 @@ describe('Dropdown', () => {
|
|
|
6
6
|
const mockOnSelect = vi.fn();
|
|
7
7
|
|
|
8
8
|
const baseProps = {
|
|
9
|
-
value: '
|
|
9
|
+
value: 'value1',
|
|
10
10
|
id: 'dropdown',
|
|
11
11
|
'aria-labelledby': 'dropdown',
|
|
12
12
|
options: [
|
|
13
13
|
{
|
|
14
|
-
value: '
|
|
15
|
-
description: '
|
|
16
|
-
label: '
|
|
14
|
+
value: 'value1',
|
|
15
|
+
description: 'description 1',
|
|
16
|
+
label: 'option 1',
|
|
17
17
|
},
|
|
18
18
|
],
|
|
19
19
|
response: { name: 'demo' },
|
|
@@ -37,6 +37,22 @@ describe('Dropdown', () => {
|
|
|
37
37
|
(selection as HTMLElement).focus();
|
|
38
38
|
expect(selection).toHaveFocus();
|
|
39
39
|
const span = selection?.querySelector('span');
|
|
40
|
-
expect(span).toHaveTextContent('
|
|
40
|
+
expect(span).toHaveTextContent('option 1');
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('should display only options label in dropdown selection', () => {
|
|
44
|
+
const { container, queryByText, getByText } = render(
|
|
45
|
+
<Dropdown
|
|
46
|
+
{...baseProps}
|
|
47
|
+
value={null}
|
|
48
|
+
/>
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
const selection = container.querySelector('.lunatic-combo-box-content');
|
|
52
|
+
fireEvent.focus(selection as HTMLElement);
|
|
53
|
+
|
|
54
|
+
expect(getByText('option 1')).toBeInTheDocument();
|
|
55
|
+
expect(queryByText('value1')).not.toBeInTheDocument();
|
|
56
|
+
expect(queryByText('description 1')).not.toBeInTheDocument();
|
|
41
57
|
});
|
|
42
58
|
});
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import type { LunaticComponentProps } from '../type';
|
|
2
2
|
import { getComponentErrors } from '../shared/ComponentErrors/ComponentErrors';
|
|
3
3
|
import { slottableComponent } from '../shared/HOC/slottableComponent';
|
|
4
|
-
import { SimpleOptionRenderer } from './renderer/SimpleOptionRenderer';
|
|
5
4
|
import { SimpleLabelRenderer } from './renderer/SimpleLabelRenderer';
|
|
6
5
|
import { Combobox } from '../shared/Combobox/Combobox';
|
|
7
6
|
import classNames from 'classnames';
|
|
@@ -54,9 +53,9 @@ export const CustomDropdown = slottableComponent<CustomProps>(
|
|
|
54
53
|
disabled={disabled}
|
|
55
54
|
readOnly={readOnly}
|
|
56
55
|
options={options}
|
|
56
|
+
shouldDisplayOptionsId={false}
|
|
57
57
|
editable={false}
|
|
58
58
|
onSelect={onChange}
|
|
59
|
-
optionRenderer={SimpleOptionRenderer}
|
|
60
59
|
labelRenderer={SimpleLabelRenderer}
|
|
61
60
|
value={value}
|
|
62
61
|
label={label}
|
|
@@ -27,7 +27,7 @@ exports[`Dropdown > renders without crashing 1`] = `
|
|
|
27
27
|
<span
|
|
28
28
|
class="selection"
|
|
29
29
|
>
|
|
30
|
-
|
|
30
|
+
option 1
|
|
31
31
|
</span>
|
|
32
32
|
</div>
|
|
33
33
|
</div>
|
|
@@ -63,7 +63,7 @@ exports[`Dropdown > should handle readOnly 1`] = `
|
|
|
63
63
|
<span
|
|
64
64
|
class="selection"
|
|
65
65
|
>
|
|
66
|
-
|
|
66
|
+
option 1
|
|
67
67
|
</span>
|
|
68
68
|
</div>
|
|
69
69
|
</div>
|
|
@@ -15,7 +15,13 @@ type Props = {
|
|
|
15
15
|
onBlur: () => void;
|
|
16
16
|
onFocus: () => void;
|
|
17
17
|
value: [SuggesterOptionType] | [];
|
|
18
|
+
/**
|
|
19
|
+
* @deprecated use createCustomizableField with ComboboxLabelRenderer as name.
|
|
20
|
+
*/
|
|
18
21
|
labelRenderer: LunaticComponentProps<'Suggester'>['labelRenderer'];
|
|
22
|
+
/**
|
|
23
|
+
* @deprecated use createCustomizableField with ComboboxOptionRenderer as name.
|
|
24
|
+
*/
|
|
19
25
|
optionRenderer: LunaticComponentProps<'Suggester'>['optionRenderer'];
|
|
20
26
|
disabled?: boolean;
|
|
21
27
|
readOnly?: boolean;
|
|
@@ -74,6 +80,7 @@ export const CustomSuggester = slottableComponent<Props>(
|
|
|
74
80
|
disabled={disabled}
|
|
75
81
|
readOnly={readOnly}
|
|
76
82
|
options={options.map((o) => ({ value: o.id, ...o }))}
|
|
83
|
+
shouldDisplayOptionsId={true}
|
|
77
84
|
editable={true}
|
|
78
85
|
onBlur={onBlur}
|
|
79
86
|
onFocus={onFocus}
|
|
@@ -57,6 +57,7 @@ function LunaticComboBox({
|
|
|
57
57
|
onSelect,
|
|
58
58
|
value,
|
|
59
59
|
options,
|
|
60
|
+
shouldDisplayOptionsId = true,
|
|
60
61
|
messageError,
|
|
61
62
|
search = EMPTY_SEARCH,
|
|
62
63
|
getOptionValue = getDefaultOptionValue,
|
|
@@ -184,6 +185,7 @@ function LunaticComboBox({
|
|
|
184
185
|
isLoading={isLoading}
|
|
185
186
|
optionRenderer={optionRenderer}
|
|
186
187
|
options={options}
|
|
188
|
+
shouldDisplayOptionsId={shouldDisplayOptionsId}
|
|
187
189
|
focused={focused}
|
|
188
190
|
selectedIndex={selectedIndex}
|
|
189
191
|
expanded={expanded}
|
|
@@ -212,15 +214,14 @@ function getIndexFromOptions(
|
|
|
212
214
|
if (!Array.isArray(options)) {
|
|
213
215
|
return undefined;
|
|
214
216
|
}
|
|
215
|
-
return options.map(getOptionValue).
|
|
217
|
+
return options.map(getOptionValue).indexOf(value ?? '');
|
|
216
218
|
}
|
|
217
219
|
|
|
218
220
|
/**
|
|
219
221
|
* Extract value from an option item
|
|
220
222
|
*/
|
|
221
|
-
function getDefaultOptionValue(option
|
|
222
|
-
|
|
223
|
-
return id || value;
|
|
223
|
+
function getDefaultOptionValue(option?: ComboboxOptionType) {
|
|
224
|
+
return option?.id || option?.value || '';
|
|
224
225
|
}
|
|
225
226
|
|
|
226
227
|
export const Combobox = slottableComponent('Combobox', LunaticComboBox);
|
|
@@ -14,13 +14,35 @@ describe('DefaultOptionRenderer', () => {
|
|
|
14
14
|
expect(labelElement).toBeNull();
|
|
15
15
|
});
|
|
16
16
|
|
|
17
|
-
it('renders with label', () => {
|
|
17
|
+
it('renders with label and displays id by default', () => {
|
|
18
18
|
const option = { id: '1', value: 'Value', label: 'Label' };
|
|
19
19
|
const { getByText } = render(<ComboboxOption option={option} />);
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
expect(
|
|
23
|
-
expect(
|
|
20
|
+
|
|
21
|
+
expect(getByText(option.id)).toBeInTheDocument();
|
|
22
|
+
expect(getByText('-')).toBeInTheDocument();
|
|
23
|
+
expect(getByText(option.label)).toBeInTheDocument();
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it('renders with label and displays id when prop is true', () => {
|
|
27
|
+
const option = { id: '1', value: 'Value', label: 'Label' };
|
|
28
|
+
const { getByText } = render(
|
|
29
|
+
<ComboboxOption option={option} shouldDisplayOptionId={true} />
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
expect(getByText(option.id)).toBeInTheDocument();
|
|
33
|
+
expect(getByText('-')).toBeInTheDocument();
|
|
34
|
+
expect(getByText(option.label)).toBeInTheDocument();
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it('renders with label and does not display id when prop is false', () => {
|
|
38
|
+
const option = { id: '1', value: 'Value', label: 'Label' };
|
|
39
|
+
const { getByText, queryByText } = render(
|
|
40
|
+
<ComboboxOption option={option} shouldDisplayOptionId={false} />
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
expect(queryByText(option.id)).not.toBeInTheDocument();
|
|
44
|
+
expect(queryByText('-')).not.toBeInTheDocument();
|
|
45
|
+
expect(getByText(option.label)).toBeInTheDocument();
|
|
24
46
|
});
|
|
25
47
|
|
|
26
48
|
it('renders with selected class', () => {
|
|
@@ -5,12 +5,13 @@ import D from '../../../../i18n';
|
|
|
5
5
|
|
|
6
6
|
type Props = {
|
|
7
7
|
option: ComboboxOptionType;
|
|
8
|
+
shouldDisplayOptionId?: boolean;
|
|
8
9
|
selected?: boolean;
|
|
9
10
|
};
|
|
10
11
|
|
|
11
12
|
export const ComboboxOption = slottableComponent(
|
|
12
13
|
'ComboboxOption',
|
|
13
|
-
({ option, selected }: Props) => {
|
|
14
|
+
({ option, shouldDisplayOptionId = true, selected }: Props) => {
|
|
14
15
|
const { id, value, label } = option;
|
|
15
16
|
|
|
16
17
|
if (value === 'OTHER') {
|
|
@@ -22,19 +23,22 @@ export const ComboboxOption = slottableComponent(
|
|
|
22
23
|
</div>
|
|
23
24
|
);
|
|
24
25
|
}
|
|
25
|
-
|
|
26
|
-
if (label && typeof label === 'string' && label.length) {
|
|
26
|
+
if (label) {
|
|
27
27
|
return (
|
|
28
28
|
<div className={classnames('lunatic-combo-box-option', { selected })}>
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
{shouldDisplayOptionId && (
|
|
30
|
+
<>
|
|
31
|
+
<span className="id">{id || value}</span>
|
|
32
|
+
<span> - </span>
|
|
33
|
+
</>
|
|
34
|
+
)}
|
|
31
35
|
<span className="label">{label}</span>
|
|
32
36
|
</div>
|
|
33
37
|
);
|
|
34
38
|
}
|
|
35
39
|
return (
|
|
36
40
|
<div className={classnames('lunatic-combo-box-option', { selected })}>
|
|
37
|
-
<span className="id">{id}</span>
|
|
41
|
+
<span className="id">{id || value}</span>
|
|
38
42
|
</div>
|
|
39
43
|
);
|
|
40
44
|
}
|
|
@@ -10,6 +10,7 @@ import D from '../../../../i18n';
|
|
|
10
10
|
export function ComboboxPanel({
|
|
11
11
|
optionRenderer: OptionRender,
|
|
12
12
|
options = [],
|
|
13
|
+
shouldDisplayOptionsId,
|
|
13
14
|
focused,
|
|
14
15
|
selectedIndex,
|
|
15
16
|
expanded,
|
|
@@ -17,7 +18,7 @@ export function ComboboxPanel({
|
|
|
17
18
|
search,
|
|
18
19
|
onSelect,
|
|
19
20
|
isLoading,
|
|
20
|
-
}: ComboboxPanelProps) {
|
|
21
|
+
}: Readonly<ComboboxPanelProps>) {
|
|
21
22
|
const visibleOptions = expanded ? options : [];
|
|
22
23
|
|
|
23
24
|
const ComboBoxOptionComponent = OptionRender ?? ComboboxOption;
|
|
@@ -84,6 +85,7 @@ export function ComboboxPanel({
|
|
|
84
85
|
>
|
|
85
86
|
<ComboBoxOptionComponent
|
|
86
87
|
option={option}
|
|
88
|
+
shouldDisplayOptionId={shouldDisplayOptionsId}
|
|
87
89
|
selected={selectedIndex === index}
|
|
88
90
|
search={search}
|
|
89
91
|
/>
|
package/src/components/type.ts
CHANGED
|
@@ -261,11 +261,17 @@ export type ComponentPropsByType = {
|
|
|
261
261
|
Suggester: LunaticBaseProps<string | null> & {
|
|
262
262
|
componentType?: 'Suggester';
|
|
263
263
|
storeName: string;
|
|
264
|
+
/**
|
|
265
|
+
* @deprecated use createCustomizableField with ComboboxOptionRenderer as name.
|
|
266
|
+
*/
|
|
264
267
|
optionRenderer: FunctionComponent<{
|
|
265
268
|
option: SuggesterOption;
|
|
266
269
|
placeholder?: string;
|
|
267
270
|
search?: string;
|
|
268
271
|
}>;
|
|
272
|
+
/**
|
|
273
|
+
* @deprecated use createCustomizableField with ComboboxLabelRenderer as name.
|
|
274
|
+
*/
|
|
269
275
|
labelRenderer: FunctionComponent<{
|
|
270
276
|
option?: SuggesterOption;
|
|
271
277
|
selected?: boolean;
|