@reltio/components 1.4.2162 → 1.4.2164

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 (73) hide show
  1. package/AddressAutocompleteEditor/AddressAutocompleteEditor.js +123 -55
  2. package/AddressAutocompleteEditor/AddressAutocompleteEditor.module.css.js +2 -2
  3. package/AddressAutocompleteEditor/AddressAutocompleteEditor.test.js +101 -5
  4. package/AddressAutocompleteEditor/helpers.d.ts +1 -0
  5. package/AddressAutocompleteEditor/helpers.js +3 -0
  6. package/FacetGroup/FacetGroup.d.ts +7 -0
  7. package/FacetGroup/FacetGroup.js +9 -0
  8. package/FacetGroup/FacetGroup.module.css.js +9 -0
  9. package/FacetGroup/index.d.ts +1 -0
  10. package/FacetGroup/index.js +1 -0
  11. package/FacetGroupTitle/FacetGroupTitle.d.ts +8 -0
  12. package/FacetGroupTitle/FacetGroupTitle.js +13 -0
  13. package/FacetGroupTitle/FacetGroupTitle.module.css.js +9 -0
  14. package/FacetGroupTitle/index.d.ts +1 -0
  15. package/FacetGroupTitle/index.js +1 -0
  16. package/MoreAttributesButton/styles.d.ts +1 -1
  17. package/QuickFiltersEntityTypeFacet/QuickFiltersEntityTypeFacet.d.ts +13 -0
  18. package/QuickFiltersEntityTypeFacet/QuickFiltersEntityTypeFacet.js +17 -0
  19. package/QuickFiltersEntityTypeFacet/QuickFiltersEntityTypeFacet.module.css.js +9 -0
  20. package/QuickFiltersEntityTypeFacet/components/EntityTypesFacetGroups/EntityTypesFacetGroups.d.ts +12 -0
  21. package/QuickFiltersEntityTypeFacet/components/EntityTypesFacetGroups/EntityTypesFacetGroups.js +49 -0
  22. package/QuickFiltersEntityTypeFacet/components/EntityTypesFacetGroups/EntityTypesFacetGroups.module.css.js +9 -0
  23. package/QuickFiltersEntityTypeFacet/components/EntityTypesFacetGroups/index.d.ts +1 -0
  24. package/QuickFiltersEntityTypeFacet/components/EntityTypesFacetGroups/index.js +1 -0
  25. package/QuickFiltersEntityTypeFacet/components/EntityTypesList/EntityTypesList.d.ts +10 -0
  26. package/QuickFiltersEntityTypeFacet/components/EntityTypesList/EntityTypesList.js +39 -0
  27. package/QuickFiltersEntityTypeFacet/components/EntityTypesList/EntityTypesList.module.css.js +9 -0
  28. package/QuickFiltersEntityTypeFacet/components/EntityTypesList/index.d.ts +1 -0
  29. package/QuickFiltersEntityTypeFacet/components/EntityTypesList/index.js +1 -0
  30. package/QuickFiltersEntityTypeFacet/index.d.ts +2 -0
  31. package/QuickFiltersEntityTypeFacet/index.js +1 -0
  32. package/QuickFiltersEntityTypeFacet/types.d.ts +5 -0
  33. package/QuickFiltersEntityTypeFacet/types.js +1 -0
  34. package/cjs/AddressAutocompleteEditor/AddressAutocompleteEditor.js +120 -52
  35. package/cjs/AddressAutocompleteEditor/AddressAutocompleteEditor.module.css.js +2 -2
  36. package/cjs/AddressAutocompleteEditor/AddressAutocompleteEditor.test.js +101 -5
  37. package/cjs/AddressAutocompleteEditor/helpers.d.ts +1 -0
  38. package/cjs/AddressAutocompleteEditor/helpers.js +5 -1
  39. package/cjs/FacetGroup/FacetGroup.d.ts +7 -0
  40. package/cjs/FacetGroup/FacetGroup.js +16 -0
  41. package/cjs/FacetGroup/FacetGroup.module.css.js +9 -0
  42. package/cjs/FacetGroup/index.d.ts +1 -0
  43. package/cjs/FacetGroup/index.js +5 -0
  44. package/cjs/FacetGroupTitle/FacetGroupTitle.d.ts +8 -0
  45. package/cjs/FacetGroupTitle/FacetGroupTitle.js +20 -0
  46. package/cjs/FacetGroupTitle/FacetGroupTitle.module.css.js +9 -0
  47. package/cjs/FacetGroupTitle/index.d.ts +1 -0
  48. package/cjs/FacetGroupTitle/index.js +5 -0
  49. package/cjs/MoreAttributesButton/styles.d.ts +1 -1
  50. package/cjs/QuickFiltersEntityTypeFacet/QuickFiltersEntityTypeFacet.d.ts +13 -0
  51. package/cjs/QuickFiltersEntityTypeFacet/QuickFiltersEntityTypeFacet.js +47 -0
  52. package/cjs/QuickFiltersEntityTypeFacet/QuickFiltersEntityTypeFacet.module.css.js +9 -0
  53. package/cjs/QuickFiltersEntityTypeFacet/components/EntityTypesFacetGroups/EntityTypesFacetGroups.d.ts +12 -0
  54. package/cjs/QuickFiltersEntityTypeFacet/components/EntityTypesFacetGroups/EntityTypesFacetGroups.js +79 -0
  55. package/cjs/QuickFiltersEntityTypeFacet/components/EntityTypesFacetGroups/EntityTypesFacetGroups.module.css.js +9 -0
  56. package/cjs/QuickFiltersEntityTypeFacet/components/EntityTypesFacetGroups/index.d.ts +1 -0
  57. package/cjs/QuickFiltersEntityTypeFacet/components/EntityTypesFacetGroups/index.js +5 -0
  58. package/cjs/QuickFiltersEntityTypeFacet/components/EntityTypesList/EntityTypesList.d.ts +10 -0
  59. package/cjs/QuickFiltersEntityTypeFacet/components/EntityTypesList/EntityTypesList.js +69 -0
  60. package/cjs/QuickFiltersEntityTypeFacet/components/EntityTypesList/EntityTypesList.module.css.js +9 -0
  61. package/cjs/QuickFiltersEntityTypeFacet/components/EntityTypesList/index.d.ts +1 -0
  62. package/cjs/QuickFiltersEntityTypeFacet/components/EntityTypesList/index.js +5 -0
  63. package/cjs/QuickFiltersEntityTypeFacet/index.d.ts +2 -0
  64. package/cjs/QuickFiltersEntityTypeFacet/index.js +5 -0
  65. package/cjs/QuickFiltersEntityTypeFacet/types.d.ts +5 -0
  66. package/cjs/QuickFiltersEntityTypeFacet/types.js +2 -0
  67. package/cjs/contexts/AutoCompleteContext/helpers.js +2 -2
  68. package/cjs/index.d.ts +3 -0
  69. package/cjs/index.js +11 -5
  70. package/contexts/AutoCompleteContext/helpers.js +3 -3
  71. package/index.d.ts +3 -0
  72. package/index.js +3 -0
  73. package/package.json +2 -2
@@ -0,0 +1,49 @@
1
+ import React, { useCallback, useMemo } from 'react';
2
+ import { defaultTo, filter, find, pipe, pluck, prop } from 'ramda';
3
+ import i18n from 'ui-i18n';
4
+ import { DEFAULT_ENTITY_TYPE_GROUP } from '@reltio/mdm-sdk';
5
+ import Checkbox from '@mui/material/Checkbox';
6
+ import LocalOfferOutlinedIcon from '@mui/icons-material/LocalOfferOutlined';
7
+ import { EntityTypesList } from '../EntityTypesList';
8
+ import styles from './EntityTypesFacetGroups.module.css';
9
+ export var EntityTypesFacetGroups = function (_a) {
10
+ var groups = _a.groups, values = _a.values, maxRowCount = _a.maxRowCount, showAll = _a.showAll, onChange = _a.onChange, countFormatter = _a.countFormatter;
11
+ var shouldUseAllItems = !countFormatter;
12
+ var handleCheckboxChange = useCallback(function (groupValues) { return function (e) {
13
+ var newValues = e.target.checked
14
+ ? values.concat(groupValues.filter(function (v) { return !values.includes(v); }))
15
+ : values.filter(function (v) { return !groupValues.includes(v); });
16
+ onChange(newValues);
17
+ }; }, [onChange, values]);
18
+ var groupedItemsToRender = useMemo(function () {
19
+ if (showAll)
20
+ return groups;
21
+ var count = 0;
22
+ return groups
23
+ .map(function (group) {
24
+ if (count >= maxRowCount)
25
+ return null;
26
+ var remaining = maxRowCount - count;
27
+ var limitedItems = group.items.slice(0, remaining);
28
+ count += limitedItems.length;
29
+ return limitedItems.length ? { label: group.label, items: limitedItems } : null;
30
+ })
31
+ .filter(Boolean);
32
+ }, [groups, showAll, maxRowCount]);
33
+ var renderGroup = function (_a) {
34
+ var label = _a.label, items = _a.items;
35
+ var allItems = pipe(find(function (group) { return group.label === label; }), defaultTo({ label: label, items: [] }), prop('items'))(groups);
36
+ var availableValuesWithCount = pipe(filter(function (item) { return (item.number && item.number > 0) || values.includes(item.value); }), pluck('value'))(allItems);
37
+ var availableValues = shouldUseAllItems ? pluck('value', allItems) : availableValuesWithCount;
38
+ var checkedCount = availableValues.filter(function (v) { return values.includes(v); }).length;
39
+ var allChecked = checkedCount === availableValues.length && availableValues.length > 0;
40
+ var someChecked = checkedCount > 0 && checkedCount < availableValues.length;
41
+ return (React.createElement(React.Fragment, null,
42
+ React.createElement("div", { className: styles.groupHeader },
43
+ React.createElement(Checkbox, { className: styles.groupCheckbox, checked: allChecked, indeterminate: someChecked, onChange: handleCheckboxChange(availableValues), disabled: availableValues.length === 0 }),
44
+ label !== DEFAULT_ENTITY_TYPE_GROUP && React.createElement(LocalOfferOutlinedIcon, { className: styles.groupIcon }),
45
+ React.createElement("span", { className: styles.groupLabel }, label === DEFAULT_ENTITY_TYPE_GROUP ? i18n.text('Other') : label)),
46
+ React.createElement(EntityTypesList, { data: items, values: values, onChange: onChange, countFormatter: countFormatter })));
47
+ };
48
+ return groups.length === 1 && groups[0].label === DEFAULT_ENTITY_TYPE_GROUP ? (React.createElement(EntityTypesList, { data: groupedItemsToRender[0].items, values: values, onChange: onChange, countFormatter: countFormatter })) : (React.createElement(React.Fragment, null, groupedItemsToRender.map(function (group) { return (React.createElement("div", { key: group.label }, renderGroup(group))); })));
49
+ };
@@ -0,0 +1,9 @@
1
+ const styles = {"groupHeader":"EntityTypesFacetGroups-groupHeader---V51b","groupCheckbox":"EntityTypesFacetGroups-groupCheckbox--owond","groupIcon":"EntityTypesFacetGroups-groupIcon--wPz-A","groupLabel":"EntityTypesFacetGroups-groupLabel--4yhjo"};
2
+ if (typeof document !== 'undefined') {
3
+ const head = document.head || document.getElementsByTagName('head')[0]
4
+ const style = document.createElement('style');
5
+ style.type = 'text/css'
6
+ style.innerHTML = `.EntityTypesFacetGroups-groupHeader---V51b{align-items:center;background:#f5f5f5;display:flex;margin:2px 10px;padding:6px 8px}.EntityTypesFacetGroups-groupCheckbox--owond{margin-right:21px;padding:0}.EntityTypesFacetGroups-groupIcon--wPz-A{color:rgba(0,0,0,.54);height:20px;margin-right:8px;width:20px}.EntityTypesFacetGroups-groupLabel--4yhjo{font-size:14px;font-weight:500}`;
7
+ head.appendChild(style);
8
+ }
9
+ export default styles;
@@ -0,0 +1 @@
1
+ export { EntityTypesFacetGroups } from './EntityTypesFacetGroups';
@@ -0,0 +1 @@
1
+ export { EntityTypesFacetGroups } from './EntityTypesFacetGroups';
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ import { EntityTypeFacetDataItem } from '@reltio/mdm-sdk';
3
+ type Props = {
4
+ data?: EntityTypeFacetDataItem[];
5
+ values?: string[];
6
+ countFormatter?: (number: number) => string;
7
+ onChange?: (values?: string[]) => void;
8
+ };
9
+ export declare const EntityTypesList: ({ data, values, onChange, countFormatter }: Props) => React.JSX.Element;
10
+ export {};
@@ -0,0 +1,39 @@
1
+ import React, { useCallback } from 'react';
2
+ import i18n from 'ui-i18n';
3
+ import classnames from 'classnames';
4
+ import { identity } from 'ramda';
5
+ import Checkbox from '@mui/material/Checkbox';
6
+ import { ColorBar } from '../../../ColorBar';
7
+ import styles from './EntityTypesList.module.css';
8
+ export var EntityTypesList = function (_a) {
9
+ var _b = _a.data, data = _b === void 0 ? [] : _b, _c = _a.values, values = _c === void 0 ? [] : _c, _d = _a.onChange, onChange = _d === void 0 ? identity : _d, countFormatter = _a.countFormatter;
10
+ var shouldShowCount = !!countFormatter;
11
+ var handleItemClick = function (name) { return function () {
12
+ var newValues = values.includes(name) ? values.filter(function (val) { return val !== name; }) : values.concat(name);
13
+ onChange(newValues);
14
+ }; };
15
+ var maxNumber = Math.max.apply(Math, data.map(function (item) { return item.number; }));
16
+ var createControl = function (item) {
17
+ var _a;
18
+ return (React.createElement(Checkbox, { className: classnames(styles.checkbox, (_a = {}, _a[styles.checked] = values.includes(item.value), _a)), checked: values.includes(item.value), onChange: handleItemClick(item.value), value: item.value, color: "primary" }));
19
+ };
20
+ var createColorBar = function (item) {
21
+ var _a;
22
+ return (React.createElement(ColorBar, { className: classnames((_a = {}, _a[styles.checkedBar] = values.includes(item.value), _a)), width: item.number, maxWidth: maxNumber }));
23
+ };
24
+ var shouldDisableItem = useCallback(function (item) {
25
+ return shouldShowCount && !item.number && !values.includes(item.value);
26
+ }, [shouldShowCount, values]);
27
+ return (React.createElement("div", { className: styles.listContainer }, data.map(function (item) {
28
+ var _a;
29
+ return (React.createElement("div", { key: item.value, className: classnames(styles.item, (_a = {},
30
+ _a[styles.disabled] = shouldDisableItem(item),
31
+ _a)), "data-reltio-id": "search-facets-list-row" },
32
+ createControl(item),
33
+ React.createElement("div", { className: styles.info, onClick: handleItemClick(item.value) },
34
+ shouldShowCount && createColorBar(item),
35
+ React.createElement("div", { className: classnames(styles.textInfo) },
36
+ React.createElement("div", { className: styles.text }, item.label),
37
+ shouldShowCount && (React.createElement("div", { className: styles.count }, item.number === undefined ? i18n.text('N/A') : countFormatter(item.number)))))));
38
+ })));
39
+ };
@@ -0,0 +1,9 @@
1
+ const styles = {"listContainer":"EntityTypesList-listContainer--yH3ri","disabled":"EntityTypesList-disabled--HnKbn","item":"EntityTypesList-item--7i6HO","info":"EntityTypesList-info--j8-KL","checkedBar":"EntityTypesList-checkedBar--TGBZJ","checkbox":"EntityTypesList-checkbox--ZthGQ","checked":"EntityTypesList-checked--2Ba66","textInfo":"EntityTypesList-textInfo--sL0G-","text":"EntityTypesList-text--QzVMI","count":"EntityTypesList-count--xE-gy"};
2
+ if (typeof document !== 'undefined') {
3
+ const head = document.head || document.getElementsByTagName('head')[0]
4
+ const style = document.createElement('style');
5
+ style.type = 'text/css'
6
+ style.innerHTML = `.EntityTypesList-listContainer--yH3ri{display:flex;flex-direction:column;padding-left:18px}.EntityTypesList-listContainer--yH3ri .EntityTypesList-disabled--HnKbn{opacity:.4;pointer-events:none}.EntityTypesList-item--7i6HO{display:flex;flex-direction:row;flex-grow:1;flex-shrink:0;margin-bottom:2px;margin-right:10px;margin-top:2px}.EntityTypesList-info--j8-KL{display:flex;flex-grow:1;margin-bottom:2px;margin-top:2px;min-width:0;position:relative}.EntityTypesList-info--j8-KL:hover{cursor:pointer}.EntityTypesList-info--j8-KL .EntityTypesList-checkedBar--TGBZJ{opacity:.4}.EntityTypesList-checkbox--ZthGQ{margin-right:14px;padding:0}.EntityTypesList-checkbox--ZthGQ .EntityTypesList-checked--2Ba66{opacity:1}.EntityTypesList-textInfo--sL0G-{align-items:center;background-color:transparent;display:flex;flex-grow:1;line-height:16px;min-width:0;z-index:2}.EntityTypesList-text--QzVMI{color:var(--mui-palette-text-primary);flex-grow:1;margin-left:7px;margin-right:4px;max-height:32px;width:100%;word-break:break-word;word-wrap:break-word;overflow:hidden}.EntityTypesList-count--xE-gy{color:var(--mui-palette-text-secondary);flex-shrink:0;font-size:12px;margin-right:4px;text-align:right}`;
7
+ head.appendChild(style);
8
+ }
9
+ export default styles;
@@ -0,0 +1 @@
1
+ export { EntityTypesList } from './EntityTypesList';
@@ -0,0 +1 @@
1
+ export { EntityTypesList } from './EntityTypesList';
@@ -0,0 +1,2 @@
1
+ export { QuickFiltersEntityTypeFacet } from './QuickFiltersEntityTypeFacet';
2
+ export type { EntityTypesGroup } from './types';
@@ -0,0 +1 @@
1
+ export { QuickFiltersEntityTypeFacet } from './QuickFiltersEntityTypeFacet';
@@ -0,0 +1,5 @@
1
+ import { EntityTypeFacetDataItem } from '@reltio/mdm-sdk';
2
+ export type EntityTypesGroup = {
3
+ label: string;
4
+ items: EntityTypeFacetDataItem[];
5
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -80,6 +80,15 @@ var __rest = (this && this.__rest) || function (s, e) {
80
80
  }
81
81
  return t;
82
82
  };
83
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
84
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
85
+ if (ar || !(i in from)) {
86
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
87
+ ar[i] = from[i];
88
+ }
89
+ }
90
+ return to.concat(ar || Array.prototype.slice.call(from));
91
+ };
83
92
  var __importDefault = (this && this.__importDefault) || function (mod) {
84
93
  return (mod && mod.__esModule) ? mod : { "default": mod };
85
94
  };
@@ -90,26 +99,29 @@ var classnames_1 = __importDefault(require("classnames"));
90
99
  var ramda_1 = require("ramda");
91
100
  var react_context_selector_1 = require("@fluentui/react-context-selector");
92
101
  var Autocomplete_1 = __importDefault(require("@mui/material/Autocomplete"));
93
- var ListItem_1 = __importDefault(require("@mui/material/ListItem"));
94
- var ListItemText_1 = __importDefault(require("@mui/material/ListItemText"));
102
+ var Button_1 = __importDefault(require("@mui/material/Button"));
103
+ var ChevronRight_1 = __importDefault(require("@mui/icons-material/ChevronRight"));
95
104
  var LinearProgress_1 = __importDefault(require("@mui/material/LinearProgress"));
96
- var Typography_1 = __importDefault(require("@mui/material/Typography"));
105
+ var ListItemButton_1 = __importDefault(require("@mui/material/ListItemButton"));
97
106
  var TextField_1 = __importDefault(require("@mui/material/TextField"));
98
- var ArrowForwardIos_1 = __importDefault(require("@mui/icons-material/ArrowForwardIos"));
107
+ var Typography_1 = __importDefault(require("@mui/material/Typography"));
99
108
  var ui_i18n_1 = __importDefault(require("ui-i18n"));
100
109
  var mdm_sdk_1 = require("@reltio/mdm-sdk");
101
110
  var AutoCompleteContext_1 = require("../contexts/AutoCompleteContext");
102
111
  var AttributeValueContext_1 = require("../contexts/AttributeValueContext");
103
112
  var helpers_1 = require("./helpers");
104
113
  var useSafePromise_1 = require("../hooks/useSafePromise");
114
+ var ExpandedValueTooltip_1 = require("../ExpandedValueTooltip");
115
+ var EmptySearchResult_1 = require("../EmptySearchResult");
105
116
  var AddressAutocompleteEditor_module_css_1 = __importDefault(require("./AddressAutocompleteEditor.module.css"));
106
117
  exports.INPUT_DEBOUNCE_INTERVAL = 400;
118
+ var EMPTY_OPTION_ID = 'empty_option_id';
107
119
  var AddressAutocompleteEditor = function (_a) {
108
120
  var _b = _a.value, value = _b === void 0 ? '' : _b, onChange = _a.onChange, InputProps = _a.InputProps, _c = _a.fullWidth, fullWidth = _c === void 0 ? true : _c, otherProps = __rest(_a, ["value", "onChange", "InputProps", "fullWidth"]);
109
121
  var _d = (0, react_1.useState)(value), inputValue = _d[0], setInputValue = _d[1];
110
- var _e = (0, react_1.useState)([]), options = _e[0], setOptions = _e[1];
111
- var _f = (0, react_1.useState)(false), loading = _f[0], setLoading = _f[1];
112
- var _g = (0, react_1.useState)(false), detailsLoading = _g[0], setDetailsLoading = _g[1];
122
+ var _e = (0, react_1.useState)(null), options = _e[0], setOptions = _e[1];
123
+ var _f = (0, react_1.useState)([]), previousOptions = _f[0], setPreviousOptions = _f[1];
124
+ var _g = (0, react_1.useState)(false), loading = _g[0], setLoading = _g[1];
113
125
  var _h = (0, react_1.useState)(false), open = _h[0], setOpen = _h[1];
114
126
  var searchSafePromise = (0, useSafePromise_1.useSafePromise)();
115
127
  var detailsSafePromise = (0, useSafePromise_1.useSafePromise)();
@@ -120,45 +132,61 @@ var AddressAutocompleteEditor = function (_a) {
120
132
  var countries = autocompleteSettings.countries, countryNames = autocompleteSettings.countryNames, limit = autocompleteSettings.limit, minSearchTextLen = autocompleteSettings.minSearchTextLen;
121
133
  var countriesHash = countries.toString();
122
134
  (0, react_1.useEffect)(function () {
123
- setOptions([]);
135
+ setOptions(null);
136
+ setPreviousOptions([]);
124
137
  }, [countriesHash]);
125
- var fetchAddressSuggestions = (0, react_1.useCallback)(function (searchTerm) { return __awaiter(void 0, void 0, void 0, function () {
126
- var results, convertedOptions, error_1;
127
- return __generator(this, function (_a) {
128
- switch (_a.label) {
138
+ var fetchAddressSuggestions = (0, react_1.useCallback)(function (_a) { return __awaiter(void 0, [_a], void 0, function (_b) {
139
+ var results, _c, convertedOptions, error_1;
140
+ var searchTerm = _b.searchTerm, container = _b.container;
141
+ return __generator(this, function (_d) {
142
+ switch (_d.label) {
129
143
  case 0:
130
144
  setLoading(true);
131
- _a.label = 1;
145
+ _d.label = 1;
132
146
  case 1:
133
- _a.trys.push([1, 3, 4, 5]);
134
- return [4 /*yield*/, searchSafePromise((0, mdm_sdk_1.searchAddresses)({
135
- text: searchTerm,
136
- limit: limit,
137
- countries: countries
138
- }))];
147
+ _d.trys.push([1, 6, 7, 8]);
148
+ if (!container) return [3 /*break*/, 3];
149
+ return [4 /*yield*/, searchSafePromise((0, mdm_sdk_1.searchAddresses)({ container: container }))];
139
150
  case 2:
140
- results = _a.sent();
151
+ _c = _d.sent();
152
+ return [3 /*break*/, 5];
153
+ case 3: return [4 /*yield*/, searchSafePromise((0, mdm_sdk_1.searchAddresses)({
154
+ text: searchTerm,
155
+ limit: limit,
156
+ countries: countries
157
+ }))];
158
+ case 4:
159
+ _c = _d.sent();
160
+ _d.label = 5;
161
+ case 5:
162
+ results = _c;
141
163
  convertedOptions = results.map(helpers_1.convertSearchResultToOption);
164
+ if (container) {
165
+ setPreviousOptions(options || []);
166
+ }
167
+ else {
168
+ setPreviousOptions([]);
169
+ }
142
170
  setOptions(convertedOptions);
143
- return [3 /*break*/, 5];
144
- case 3:
145
- error_1 = _a.sent();
171
+ return [3 /*break*/, 8];
172
+ case 6:
173
+ error_1 = _d.sent();
146
174
  console.warn('Error fetching address suggestions:', error_1);
147
175
  setOptions([]);
148
- return [3 /*break*/, 5];
149
- case 4:
176
+ return [3 /*break*/, 8];
177
+ case 7:
150
178
  setLoading(false);
151
179
  return [7 /*endfinally*/];
152
- case 5: return [2 /*return*/];
180
+ case 8: return [2 /*return*/];
153
181
  }
154
182
  });
155
- }); }, [countries, limit, searchSafePromise]);
183
+ }); }, [countries, limit, searchSafePromise, options]);
156
184
  var fetchAddressDetailsById = (0, react_1.useCallback)(function (addressId) { return __awaiter(void 0, void 0, void 0, function () {
157
185
  var error_2;
158
186
  return __generator(this, function (_a) {
159
187
  switch (_a.label) {
160
188
  case 0:
161
- setDetailsLoading(true);
189
+ setLoading(true);
162
190
  _a.label = 1;
163
191
  case 1:
164
192
  _a.trys.push([1, 3, 4, 5]);
@@ -167,9 +195,9 @@ var AddressAutocompleteEditor = function (_a) {
167
195
  case 3:
168
196
  error_2 = _a.sent();
169
197
  console.warn('Error fetching address details:', error_2);
170
- return [2 /*return*/, null];
198
+ return [3 /*break*/, 5];
171
199
  case 4:
172
- setDetailsLoading(false);
200
+ setLoading(false);
173
201
  return [7 /*endfinally*/];
174
202
  case 5: return [2 /*return*/];
175
203
  }
@@ -178,13 +206,17 @@ var AddressAutocompleteEditor = function (_a) {
178
206
  var debouncedFetchAddressSuggestions = (0, react_1.useCallback)((0, mdm_sdk_1.debounce)(fetchAddressSuggestions, exports.INPUT_DEBOUNCE_INTERVAL), [
179
207
  fetchAddressSuggestions
180
208
  ]);
181
- var handleInputChange = (0, react_1.useCallback)(function (event, newInputValue) {
209
+ var handleInputChange = (0, react_1.useCallback)(function (event, newInputValue, reason) {
210
+ if (reason === 'reset') {
211
+ return;
212
+ }
182
213
  setInputValue(newInputValue);
183
- if (newInputValue.trim().length >= minSearchTextLen) {
184
- debouncedFetchAddressSuggestions(newInputValue);
214
+ if ((0, helpers_1.isMinLength)(newInputValue, minSearchTextLen)) {
215
+ debouncedFetchAddressSuggestions({ searchTerm: newInputValue });
185
216
  }
186
217
  else {
187
218
  setOptions([]);
219
+ setPreviousOptions([]);
188
220
  }
189
221
  }, [debouncedFetchAddressSuggestions, minSearchTextLen]);
190
222
  var handleOptionSelect = (0, react_1.useCallback)(function (event, selectedOption) { return __awaiter(void 0, void 0, void 0, function () {
@@ -194,9 +226,11 @@ var AddressAutocompleteEditor = function (_a) {
194
226
  case 0:
195
227
  if (!selectedOption) return [3 /*break*/, 3];
196
228
  if (selectedOption.type === mdm_sdk_1.AddressType.Container) {
229
+ fetchAddressSuggestions({ container: selectedOption.id });
197
230
  return [2 /*return*/];
198
231
  }
199
232
  setInputValue(selectedOption.fullAddress);
233
+ setPreviousOptions([]);
200
234
  if (onChange) {
201
235
  onChange(selectedOption.fullAddress);
202
236
  }
@@ -218,36 +252,70 @@ var AddressAutocompleteEditor = function (_a) {
218
252
  case 4: return [2 /*return*/];
219
253
  }
220
254
  });
221
- }); }, [fetchAddressDetailsById, onChange, onPopulateAttributes, attributeTypeUri, valueUri]);
255
+ }); }, [fetchAddressDetailsById, fetchAddressSuggestions, onChange, onPopulateAttributes, attributeTypeUri, valueUri]);
256
+ var handleFocus = (0, react_1.useCallback)(function () {
257
+ if (!options && (0, helpers_1.isMinLength)(inputValue, minSearchTextLen)) {
258
+ debouncedFetchAddressSuggestions({ searchTerm: inputValue });
259
+ }
260
+ setOpen(true);
261
+ }, [debouncedFetchAddressSuggestions, inputValue, minSearchTextLen, options]);
222
262
  var handleBlur = (0, react_1.useCallback)(function () {
223
263
  setOpen(false);
224
264
  }, []);
225
265
  var renderOption = (0, react_1.useCallback)(function (props, option) {
226
266
  var _a;
267
+ if (option.id === EMPTY_OPTION_ID) {
268
+ return null;
269
+ }
227
270
  var isContainer = option.type === mdm_sdk_1.AddressType.Container;
228
- return (react_1.default.createElement(ListItem_1.default, __assign({}, props, { className: (0, classnames_1.default)(AddressAutocompleteEditor_module_css_1.default.option, (_a = {}, _a[AddressAutocompleteEditor_module_css_1.default.containerOption] = isContainer, _a)) }),
229
- react_1.default.createElement(ListItemText_1.default, { primary: option.fullAddress, primaryTypographyProps: { variant: 'body1' }, secondaryTypographyProps: { variant: 'body2', color: 'textSecondary' } }),
230
- isContainer && (react_1.default.createElement("div", null,
231
- react_1.default.createElement(ArrowForwardIos_1.default, null)))));
232
- }, []);
233
- var renderInput = (0, react_1.useCallback)(function (props) { return (react_1.default.createElement(TextField_1.default, __assign({}, otherProps, props, { placeholder: ui_i18n_1.default.text('Start typing to autocomplete'), fullWidth: fullWidth, onBlur: handleBlur, InputProps: __assign(__assign(__assign({}, InputProps), props.InputProps), { endAdornment: react_1.default.createElement(react_1.default.Fragment, null, props.InputProps.endAdornment) }) }))); }, [fullWidth, handleBlur, InputProps, otherProps]);
271
+ return (react_1.default.createElement(ListItemButton_1.default, __assign({}, props, { className: (0, classnames_1.default)(AddressAutocompleteEditor_module_css_1.default.option, (_a = {}, _a[AddressAutocompleteEditor_module_css_1.default.containerOption] = isContainer, _a)), component: "li", disabled: loading }),
272
+ react_1.default.createElement(ExpandedValueTooltip_1.ExpandedValueTooltip, { value: option.fullAddress },
273
+ react_1.default.createElement(Typography_1.default, { variant: "body2", className: AddressAutocompleteEditor_module_css_1.default.optionText }, option.fullAddress)),
274
+ isContainer && (react_1.default.createElement("div", { className: AddressAutocompleteEditor_module_css_1.default.containerForwardIcon },
275
+ react_1.default.createElement(ChevronRight_1.default, null)))));
276
+ }, [loading]);
277
+ var renderInput = (0, react_1.useCallback)(function (props) {
278
+ var _a;
279
+ return (react_1.default.createElement(TextField_1.default, __assign({}, props, otherProps, { placeholder: ui_i18n_1.default.text('Start typing to autocomplete'), fullWidth: fullWidth, onBlur: handleBlur, InputProps: __assign(__assign(__assign({}, props.InputProps), InputProps), { classes: __assign(__assign({}, InputProps === null || InputProps === void 0 ? void 0 : InputProps.classes), { root: (0, classnames_1.default)(AddressAutocompleteEditor_module_css_1.default.textFieldRoot, (0, ramda_1.path)(['classes', 'root'], InputProps)), input: (0, classnames_1.default)(AddressAutocompleteEditor_module_css_1.default.textFieldInput, (0, ramda_1.path)(['classes', 'input'], InputProps)), underline: (0, classnames_1.default)((_a = {}, _a[AddressAutocompleteEditor_module_css_1.default.underline] = (0, mdm_sdk_1.isEmptyValue)(value), _a)) }) }) })));
280
+ }, [fullWidth, handleBlur, InputProps, otherProps, value]);
281
+ var handleBackToAllSearchResults = (0, react_1.useCallback)(function () {
282
+ setOptions(previousOptions);
283
+ setPreviousOptions([]);
284
+ }, [previousOptions]);
234
285
  var renderListbox = (0, react_1.useCallback)(react_1.default.forwardRef(function ListboxComponent(props, ref) {
235
- return (react_1.default.createElement(react_1.default.Fragment, null,
236
- detailsLoading && react_1.default.createElement(LinearProgress_1.default, { color: "primary" }),
237
- react_1.default.createElement("ul", __assign({ ref: ref }, props),
238
- react_1.default.createElement("li", { className: AddressAutocompleteEditor_module_css_1.default.countryHeader },
239
- react_1.default.createElement(Typography_1.default, { variant: "body2", fontWeight: 500 },
286
+ var onMouseDown = props.onMouseDown, restProps = __rest(props, ["onMouseDown"]);
287
+ var shouldShowEmptyState = (options === null || options === void 0 ? void 0 : options.length) === 0 && (0, helpers_1.isMinLength)(inputValue, minSearchTextLen) && !loading;
288
+ var shouldShowMinLengthMessage = !(0, helpers_1.isMinLength)(inputValue, minSearchTextLen) && !loading;
289
+ var shouldShowOptions = (options === null || options === void 0 ? void 0 : options.length) > 0 && !shouldShowMinLengthMessage;
290
+ var countriesLabel = countryNames.join(', ');
291
+ return (react_1.default.createElement("div", { onMouseDown: onMouseDown },
292
+ loading && react_1.default.createElement(LinearProgress_1.default, { className: AddressAutocompleteEditor_module_css_1.default.loadingProgress, color: "primary" }),
293
+ react_1.default.createElement("div", { className: AddressAutocompleteEditor_module_css_1.default.countryHeader },
294
+ react_1.default.createElement(ExpandedValueTooltip_1.ExpandedValueTooltip, { value: countriesLabel },
295
+ react_1.default.createElement(Typography_1.default, { variant: "body2", color: "textSecondary", className: AddressAutocompleteEditor_module_css_1.default.headerCountries },
240
296
  ui_i18n_1.default.text('Searching in'),
241
297
  ": ",
242
- countryNames.join(', ')),
243
- react_1.default.createElement(Typography_1.default, { variant: "caption", color: "textSecondary" }, ui_i18n_1.default.text('To search in a different country, update the Country field'))),
244
- props.children)));
245
- }), [detailsLoading, countryNames]);
298
+ countriesLabel)),
299
+ react_1.default.createElement(Typography_1.default, { variant: "caption", color: "textSecondary", className: AddressAutocompleteEditor_module_css_1.default.headerHelper }, ui_i18n_1.default.text('To search in a different country, update the Country field'))),
300
+ react_1.default.createElement("ul", __assign({ ref: ref }, restProps, { className: AddressAutocompleteEditor_module_css_1.default.listbox }),
301
+ shouldShowMinLengthMessage && (react_1.default.createElement("li", { className: AddressAutocompleteEditor_module_css_1.default.emptyState },
302
+ react_1.default.createElement(Typography_1.default, { variant: "body2", color: "textSecondary" }, ui_i18n_1.default.text('Please enter at least ${minSearchTextLen} characters', {
303
+ minSearchTextLen: minSearchTextLen
304
+ })))),
305
+ shouldShowEmptyState && (react_1.default.createElement("li", { className: AddressAutocompleteEditor_module_css_1.default.emptyState },
306
+ react_1.default.createElement(EmptySearchResult_1.EmptySearchResult, { className: AddressAutocompleteEditor_module_css_1.default.noData }))),
307
+ shouldShowOptions && props.children),
308
+ previousOptions.length > 0 && (react_1.default.createElement("div", { className: AddressAutocompleteEditor_module_css_1.default.backToAllResults },
309
+ react_1.default.createElement(Button_1.default, { variant: "text", onClick: handleBackToAllSearchResults, color: "primary", disabled: loading, classes: { root: AddressAutocompleteEditor_module_css_1.default.backToAllResultsButton } }, ui_i18n_1.default.text('Back to all results'))))));
310
+ }), [loading, countryNames, previousOptions.length, (options || []).length, inputValue, minSearchTextLen]);
246
311
  var openOptionsList = (0, react_1.useCallback)(function (_event) {
247
312
  setOpen(true);
248
313
  }, []);
249
- return (react_1.default.createElement(Autocomplete_1.default, { className: AddressAutocompleteEditor_module_css_1.default.root, open: open, onOpen: openOptionsList, value: inputValue, onChange: handleOptionSelect, inputValue: inputValue, onInputChange: handleInputChange, options: options, getOptionLabel: helpers_1.getOptionLabel, loading: loading, renderInput: renderInput, renderOption: renderOption, renderGroup: function (params) { return params.children; }, ListboxComponent: renderListbox, noOptionsText: inputValue.trim().length < minSearchTextLen
250
- ? ui_i18n_1.default.text('Please enter at least {{minSearchTextLen}} characters', { minSearchTextLen: minSearchTextLen })
251
- : ui_i18n_1.default.text('No addresses found'), loadingText: ui_i18n_1.default.text('Searching addresses...'), filterOptions: ramda_1.identity, isOptionEqualToValue: helpers_1.isOptionEqualToValue, popupIcon: null, clearIcon: null, freeSolo: true, "data-reltio-id": "address-autocomplete-editor" }));
314
+ var displayOptions = (0, react_1.useMemo)(function () {
315
+ return __spreadArray([{ id: EMPTY_OPTION_ID, type: mdm_sdk_1.AddressType.Address, fullAddress: '' }], (options || []), true);
316
+ }, [options]);
317
+ return (react_1.default.createElement(Autocomplete_1.default, { className: AddressAutocompleteEditor_module_css_1.default.root, open: open, onOpen: openOptionsList, value: inputValue, onChange: handleOptionSelect, inputValue: inputValue, onInputChange: handleInputChange, onFocus: handleFocus, options: displayOptions, getOptionLabel: helpers_1.getOptionLabel, renderInput: renderInput, renderOption: renderOption, renderGroup: function (params) { return params.children; }, ListboxComponent: renderListbox, classes: {
318
+ paper: AddressAutocompleteEditor_module_css_1.default.popupContainer
319
+ }, filterOptions: ramda_1.identity, isOptionEqualToValue: helpers_1.isOptionEqualToValue, popupIcon: null, clearIcon: null, freeSolo: true, "data-reltio-id": "address-autocomplete-editor" }));
252
320
  };
253
321
  exports.AddressAutocompleteEditor = AddressAutocompleteEditor;
@@ -1,9 +1,9 @@
1
- const styles = {"root":"AddressAutocompleteEditor-root--1FDrD","countryHeader":"AddressAutocompleteEditor-countryHeader--k5tRp","loadingContainer":"AddressAutocompleteEditor-loadingContainer--j-U45","option":"AddressAutocompleteEditor-option--3hah-","containerOption":"AddressAutocompleteEditor-containerOption--aLgUn","listbox":"AddressAutocompleteEditor-listbox--cZCpg"};
1
+ const styles = {"root":"AddressAutocompleteEditor-root--1FDrD","textFieldRoot":"AddressAutocompleteEditor-textFieldRoot--udDvK","textFieldInput":"AddressAutocompleteEditor-textFieldInput--Xf-Cf","underline":"AddressAutocompleteEditor-underline--ZNYqN","countryHeader":"AddressAutocompleteEditor-countryHeader--k5tRp","headerCountries":"AddressAutocompleteEditor-headerCountries--WoYl5","headerHelper":"AddressAutocompleteEditor-headerHelper--XPT5S","loadingState":"AddressAutocompleteEditor-loadingState--PRwRK","emptyState":"AddressAutocompleteEditor-emptyState--s8M04","option":"AddressAutocompleteEditor-option--3hah-","popupContainer":"AddressAutocompleteEditor-popupContainer--360Kv","listbox":"AddressAutocompleteEditor-listbox--cZCpg","optionText":"AddressAutocompleteEditor-optionText--IcsBw","containerForwardIcon":"AddressAutocompleteEditor-containerForwardIcon--Ke5rd","backToAllResults":"AddressAutocompleteEditor-backToAllResults--2wqzi","backToAllResultsButton":"AddressAutocompleteEditor-backToAllResultsButton--T5R-3","loadingProgress":"AddressAutocompleteEditor-loadingProgress--AfWtc"};
2
2
  if (typeof document !== 'undefined') {
3
3
  const head = document.head || document.getElementsByTagName('head')[0]
4
4
  const style = document.createElement('style');
5
5
  style.type = 'text/css'
6
- style.innerHTML = `.AddressAutocompleteEditor-root--1FDrD{width:100%}.AddressAutocompleteEditor-countryHeader--k5tRp{background-color:rgba(0,0,0,.04);border-bottom:1px solid rgba(0,0,0,.12);font-weight:500;padding:8px 16px}.AddressAutocompleteEditor-loadingContainer--j-U45{align-items:center;display:flex;justify-content:center;padding:16px}.AddressAutocompleteEditor-option--3hah-{padding:8px 16px}.AddressAutocompleteEditor-containerOption--aLgUn:hover{background-color:rgba(0,0,0,.04)!important}.AddressAutocompleteEditor-listbox--cZCpg{padding:0}`;
6
+ style.innerHTML = `.AddressAutocompleteEditor-root--1FDrD{width:100%}.AddressAutocompleteEditor-root--1FDrD .AddressAutocompleteEditor-textFieldRoot--udDvK{font-size:14px;padding:0}:is(.AddressAutocompleteEditor-root--1FDrD .AddressAutocompleteEditor-textFieldRoot--udDvK) .AddressAutocompleteEditor-textFieldInput--Xf-Cf{height:19px;line-height:19px;padding:10px 12px 11px!important}:is(.AddressAutocompleteEditor-root--1FDrD .AddressAutocompleteEditor-underline--ZNYqN):before{display:none}.AddressAutocompleteEditor-countryHeader--k5tRp{padding:12px 12px 8px}.AddressAutocompleteEditor-countryHeader--k5tRp .AddressAutocompleteEditor-headerCountries--WoYl5{font-size:12px;letter-spacing:0;margin-bottom:4px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.AddressAutocompleteEditor-countryHeader--k5tRp .AddressAutocompleteEditor-headerHelper--XPT5S{font-size:10px;letter-spacing:0}.AddressAutocompleteEditor-loadingState--PRwRK{padding:16px;text-align:center}.AddressAutocompleteEditor-emptyState--s8M04{padding:8px}.AddressAutocompleteEditor-option--3hah-{padding:4px 12px}.AddressAutocompleteEditor-popupContainer--360Kv{min-width:170px}.AddressAutocompleteEditor-listbox--cZCpg{margin:0;max-height:300px;overflow-y:auto;padding:0}.AddressAutocompleteEditor-listbox--cZCpg li:first-child{border-top:1px solid rgba(0,0,0,.12);padding-top:7px}.AddressAutocompleteEditor-optionText--IcsBw{font-size:14px;letter-spacing:.24px;line-height:16px;overflow:hidden;padding:4px 0;text-overflow:ellipsis;white-space:nowrap;width:100%}.AddressAutocompleteEditor-containerForwardIcon--Ke5rd{height:24px}.AddressAutocompleteEditor-backToAllResults--2wqzi{border-top:1px solid rgba(0,0,0,.12)}.AddressAutocompleteEditor-backToAllResultsButton--T5R-3{letter-spacing:0}.AddressAutocompleteEditor-loadingProgress--AfWtc{left:0;position:absolute;right:0;top:0}`;
7
7
  head.appendChild(style);
8
8
  }
9
9
  module.exports = styles;
@@ -98,6 +98,14 @@ var mockAddressSearchResults = [
98
98
  Description: 'Jose Malhoa 22'
99
99
  }
100
100
  ];
101
+ var mockAddressContainerSearchResults = [
102
+ {
103
+ Id: 'container-1',
104
+ Type: mdm_sdk_1.AddressType.Container,
105
+ Text: 'Container Option',
106
+ Description: 'Container'
107
+ }
108
+ ];
101
109
  var mockAddressDetails = [
102
110
  {
103
111
  Id: 'address-1',
@@ -287,15 +295,34 @@ describe('AddressAutocompleteEditor', function () {
287
295
  return [4 /*yield*/, user.paste('Lisbon')];
288
296
  case 2:
289
297
  _a.sent();
290
- expect(react_2.screen.getByText('Searching addresses...')).toBeInTheDocument();
298
+ expect(react_2.screen.getByRole('progressbar')).toBeInTheDocument();
291
299
  resolveSearch([]);
292
- return [4 /*yield*/, (0, react_2.waitForElementToBeRemoved)(function () { return react_2.screen.queryByText('Searching addresses...'); })];
300
+ return [4 /*yield*/, (0, react_2.waitForElementToBeRemoved)(function () { return react_2.screen.queryByRole('progressbar'); })];
293
301
  case 3:
294
302
  _a.sent();
295
303
  return [2 /*return*/];
296
304
  }
297
305
  });
298
306
  }); });
307
+ it('should show empty state when no options are found', function () { return __awaiter(void 0, void 0, void 0, function () {
308
+ var user, input;
309
+ return __generator(this, function (_a) {
310
+ switch (_a.label) {
311
+ case 0:
312
+ mockSearchAddresses.mockResolvedValue([]);
313
+ user = setUp().user;
314
+ input = react_2.screen.getByRole('combobox');
315
+ return [4 /*yield*/, user.click(input)];
316
+ case 1:
317
+ _a.sent();
318
+ return [4 /*yield*/, user.paste('Lisbon')];
319
+ case 2:
320
+ _a.sent();
321
+ expect(react_2.screen.getByText('No results found')).toBeInTheDocument();
322
+ return [2 /*return*/];
323
+ }
324
+ });
325
+ }); });
299
326
  describe('Address search', function () {
300
327
  it('should fetch address suggestions when user types minimum characters', function () { return __awaiter(void 0, void 0, void 0, function () {
301
328
  var user, input;
@@ -383,9 +410,7 @@ describe('AddressAutocompleteEditor', function () {
383
410
  switch (_a.label) {
384
411
  case 0:
385
412
  onChange = jest.fn();
386
- mockSearchAddresses.mockResolvedValue([
387
- { Id: 'container-1', Type: mdm_sdk_1.AddressType.Container, Text: 'Container Option', Description: 'Container' }
388
- ]);
413
+ mockSearchAddresses.mockResolvedValue(mockAddressContainerSearchResults);
389
414
  user = setUp({ onChange: onChange }).user;
390
415
  input = react_2.screen.getByRole('combobox');
391
416
  return [4 /*yield*/, user.click(input)];
@@ -460,6 +485,76 @@ describe('AddressAutocompleteEditor', function () {
460
485
  }
461
486
  });
462
487
  }); });
488
+ it('should request address list for container options', function () { return __awaiter(void 0, void 0, void 0, function () {
489
+ var onChange, user, input, option;
490
+ return __generator(this, function (_a) {
491
+ switch (_a.label) {
492
+ case 0:
493
+ onChange = jest.fn();
494
+ mockSearchAddresses.mockResolvedValue(mockAddressContainerSearchResults);
495
+ user = setUp({ onChange: onChange }).user;
496
+ input = react_2.screen.getByRole('combobox');
497
+ return [4 /*yield*/, user.click(input)];
498
+ case 1:
499
+ _a.sent();
500
+ return [4 /*yield*/, user.paste('Lisbon')];
501
+ case 2:
502
+ _a.sent();
503
+ expect(react_2.screen.getByText('Container Option')).toBeInTheDocument();
504
+ expect(mockSearchAddresses).toHaveBeenCalledWith({
505
+ text: 'Lisbon',
506
+ limit: 10,
507
+ countries: ['PT', 'US']
508
+ });
509
+ mockSearchAddresses.mockReset();
510
+ mockSearchAddresses.mockResolvedValue(mockAddressSearchResults);
511
+ option = react_2.screen.getByText('Container Option');
512
+ return [4 /*yield*/, user.click(option)];
513
+ case 3:
514
+ _a.sent();
515
+ expect(mockSearchAddresses).toHaveBeenCalledWith({
516
+ container: 'container-1'
517
+ });
518
+ expect(react_2.screen.getByText('Avenida Jose Malhoa 22, Lisbon')).toBeInTheDocument();
519
+ expect(react_2.screen.queryByText('Container Option')).not.toBeInTheDocument();
520
+ expect(onChange).not.toHaveBeenCalled();
521
+ expect(mockFetchAddressDetails).not.toHaveBeenCalled();
522
+ return [2 /*return*/];
523
+ }
524
+ });
525
+ }); });
526
+ it('should back to all search results after selecting container option', function () { return __awaiter(void 0, void 0, void 0, function () {
527
+ var onChange, user, input, option;
528
+ return __generator(this, function (_a) {
529
+ switch (_a.label) {
530
+ case 0:
531
+ onChange = jest.fn();
532
+ mockSearchAddresses.mockResolvedValue(mockAddressContainerSearchResults);
533
+ user = setUp({ onChange: onChange }).user;
534
+ input = react_2.screen.getByRole('combobox');
535
+ return [4 /*yield*/, user.click(input)];
536
+ case 1:
537
+ _a.sent();
538
+ return [4 /*yield*/, user.paste('Lisbon')];
539
+ case 2:
540
+ _a.sent();
541
+ expect(react_2.screen.queryByText('Back to all results')).not.toBeInTheDocument();
542
+ mockSearchAddresses.mockReset();
543
+ mockSearchAddresses.mockResolvedValue(mockAddressSearchResults);
544
+ option = react_2.screen.getByText('Container Option');
545
+ return [4 /*yield*/, user.click(option)];
546
+ case 3:
547
+ _a.sent();
548
+ expect(react_2.screen.getByText('Back to all results')).toBeInTheDocument();
549
+ return [4 /*yield*/, user.click(react_2.screen.getByText('Back to all results'))];
550
+ case 4:
551
+ _a.sent();
552
+ expect(react_2.screen.queryByText('Back to all results')).not.toBeInTheDocument();
553
+ expect(react_2.screen.getByText('Container Option')).toBeInTheDocument();
554
+ return [2 /*return*/];
555
+ }
556
+ });
557
+ }); });
463
558
  });
464
559
  describe('Autocomplete settings', function () {
465
560
  it('should use default autocomplete settings, when no settings from metadata', function () { return __awaiter(void 0, void 0, void 0, function () {
@@ -511,6 +606,7 @@ describe('AddressAutocompleteEditor', function () {
511
606
  case 2:
512
607
  _a.sent();
513
608
  expect(mockSearchAddresses).not.toHaveBeenCalled();
609
+ expect(react_2.screen.getByText('Please enter at least 3 characters')).toBeInTheDocument();
514
610
  return [4 /*yield*/, user.paste('sbon')];
515
611
  case 3:
516
612
  _a.sent();
@@ -8,3 +8,4 @@ export type AddressOption = {
8
8
  export declare const convertSearchResultToOption: (result: AddressSearchResult) => AddressOption;
9
9
  export declare const getOptionLabel: (option: AddressOption | string) => string;
10
10
  export declare const isOptionEqualToValue: (option: AddressOption, value: string) => boolean;
11
+ export declare const isMinLength: (value: string, minLength: number) => boolean;