@reltio/components 1.4.1193 → 1.4.1197

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 (69) hide show
  1. package/cjs/components/ActionButton/styles.d.ts +1 -1
  2. package/cjs/components/AttributesFiltersBuilder/AttributesFiltersBuilder.d.ts +5 -1
  3. package/cjs/components/AttributesFiltersBuilder/AttributesFiltersBuilder.js +4 -3
  4. package/cjs/components/AttributesFiltersBuilder/components/FilterSelector/FilterSelector.d.ts +3 -2
  5. package/cjs/components/AttributesFiltersBuilder/components/FilterSelector/FilterSelector.js +5 -4
  6. package/cjs/components/AttributesFiltersBuilder/components/ValuesEditor/ValuesEditor.js +2 -11
  7. package/cjs/components/AttributesFiltersBuilder/index.d.ts +4 -0
  8. package/cjs/components/AttributesFiltersBuilder/index.js +12 -0
  9. package/cjs/components/AttributesFiltersButton/AttributesFiltersButton.d.ts +5 -1
  10. package/cjs/components/AttributesFiltersButton/AttributesFiltersButton.js +2 -2
  11. package/cjs/components/{AttributesFiltersBuilder/components/MatchRulesSelector → MatchRulesSelector}/MatchRulesSelector.d.ts +2 -6
  12. package/cjs/components/{AttributesFiltersBuilder/components/MatchRulesSelector → MatchRulesSelector}/MatchRulesSelector.js +1 -7
  13. package/cjs/components/{AttributesFiltersBuilder/components/MultiValueSelector → MultiValueSelector}/MultiValueSelector.d.ts +0 -0
  14. package/cjs/components/{AttributesFiltersBuilder/components/MultiValueSelector → MultiValueSelector}/MultiValueSelector.js +6 -6
  15. package/cjs/components/{AttributesFiltersBuilder/components/MultiValueSelector → MultiValueSelector}/styles.d.ts +0 -0
  16. package/cjs/components/{AttributesFiltersBuilder/components/MultiValueSelector → MultiValueSelector}/styles.js +0 -0
  17. package/cjs/components/ValueChip/styles.d.ts +1 -1
  18. package/cjs/components/attributes/ImageAttributesLine/styles.d.ts +1 -1
  19. package/cjs/components/attributes/editMode/MoreAttributesButton/styles.d.ts +1 -1
  20. package/cjs/components/commonReactSelectComponents/LoadMoreButton.d.ts +8 -0
  21. package/cjs/components/commonReactSelectComponents/LoadMoreButton.js +17 -0
  22. package/cjs/components/commonReactSelectComponents/MenuList.d.ts +3 -0
  23. package/cjs/components/commonReactSelectComponents/MenuList.js +25 -0
  24. package/cjs/components/commonReactSelectComponents/styles.d.ts +1 -0
  25. package/cjs/components/commonReactSelectComponents/styles.js +24 -0
  26. package/cjs/components/crosswalks/CrosswalkAttributes/styles.d.ts +1 -1
  27. package/cjs/components/editors/DataTypeValueEditor/useEditorContext.d.ts +8 -2
  28. package/cjs/components/editors/DataTypeValueEditor/useEditorContext.js +5 -4
  29. package/cjs/components/editors/DependentLookupEditor/DependentLookupEditor.js +52 -10
  30. package/cjs/components/editors/TypeaheadEditor/TypeaheadEditor.js +32 -7
  31. package/cjs/components/history/HistoryGraph/HistoryCircle.d.ts +1 -1
  32. package/cjs/components/history/HistoryGraph/HistoryGraph.d.ts +1 -1
  33. package/cjs/components/index.d.ts +5 -0
  34. package/cjs/components/index.js +12 -3
  35. package/esm/components/ActionButton/styles.d.ts +1 -1
  36. package/esm/components/AttributesFiltersBuilder/AttributesFiltersBuilder.d.ts +5 -1
  37. package/esm/components/AttributesFiltersBuilder/AttributesFiltersBuilder.js +4 -3
  38. package/esm/components/AttributesFiltersBuilder/components/FilterSelector/FilterSelector.d.ts +3 -2
  39. package/esm/components/AttributesFiltersBuilder/components/FilterSelector/FilterSelector.js +5 -4
  40. package/esm/components/AttributesFiltersBuilder/components/ValuesEditor/ValuesEditor.js +3 -12
  41. package/esm/components/AttributesFiltersBuilder/index.d.ts +4 -0
  42. package/esm/components/AttributesFiltersBuilder/index.js +3 -0
  43. package/esm/components/AttributesFiltersButton/AttributesFiltersButton.d.ts +5 -1
  44. package/esm/components/AttributesFiltersButton/AttributesFiltersButton.js +2 -2
  45. package/esm/components/{AttributesFiltersBuilder/components/MatchRulesSelector → MatchRulesSelector}/MatchRulesSelector.d.ts +2 -6
  46. package/esm/components/{AttributesFiltersBuilder/components/MatchRulesSelector → MatchRulesSelector}/MatchRulesSelector.js +2 -7
  47. package/esm/components/{AttributesFiltersBuilder/components/MultiValueSelector → MultiValueSelector}/MultiValueSelector.d.ts +0 -0
  48. package/esm/components/{AttributesFiltersBuilder/components/MultiValueSelector → MultiValueSelector}/MultiValueSelector.js +6 -6
  49. package/esm/components/{AttributesFiltersBuilder/components/MultiValueSelector → MultiValueSelector}/styles.d.ts +0 -0
  50. package/esm/components/{AttributesFiltersBuilder/components/MultiValueSelector → MultiValueSelector}/styles.js +0 -0
  51. package/esm/components/ValueChip/styles.d.ts +1 -1
  52. package/esm/components/attributes/ImageAttributesLine/styles.d.ts +1 -1
  53. package/esm/components/attributes/editMode/MoreAttributesButton/styles.d.ts +1 -1
  54. package/esm/components/commonReactSelectComponents/LoadMoreButton.d.ts +8 -0
  55. package/esm/components/commonReactSelectComponents/LoadMoreButton.js +12 -0
  56. package/esm/components/commonReactSelectComponents/MenuList.d.ts +3 -0
  57. package/esm/components/commonReactSelectComponents/MenuList.js +20 -0
  58. package/esm/components/commonReactSelectComponents/styles.d.ts +1 -0
  59. package/esm/components/commonReactSelectComponents/styles.js +21 -0
  60. package/esm/components/crosswalks/CrosswalkAttributes/styles.d.ts +1 -1
  61. package/esm/components/editors/DataTypeValueEditor/useEditorContext.d.ts +8 -2
  62. package/esm/components/editors/DataTypeValueEditor/useEditorContext.js +5 -4
  63. package/esm/components/editors/DependentLookupEditor/DependentLookupEditor.js +54 -12
  64. package/esm/components/editors/TypeaheadEditor/TypeaheadEditor.js +34 -9
  65. package/esm/components/history/HistoryGraph/HistoryCircle.d.ts +1 -1
  66. package/esm/components/history/HistoryGraph/HistoryGraph.d.ts +1 -1
  67. package/esm/components/index.d.ts +5 -0
  68. package/esm/components/index.js +5 -0
  69. package/package.json +3 -3
@@ -1 +1 @@
1
- export declare const useStyles: (props?: any) => import("@material-ui/core/styles/withStyles").ClassNameMap<"label" | "button" | "menuItem" | "menuText" | "startIcon" | "iconButton" | "overflowStyle" | "menuIcon">;
1
+ export declare const useStyles: (props?: any) => import("@material-ui/core/styles/withStyles").ClassNameMap<"label" | "button" | "startIcon" | "menuItem" | "menuText" | "iconButton" | "overflowStyle" | "menuIcon">;
@@ -4,6 +4,10 @@ declare type Props = {
4
4
  filters: SearchFilter[];
5
5
  onChange: (filters: SearchFilter[]) => void;
6
6
  attributeTypes: AttributeType[];
7
+ components?: {
8
+ ValuesEditor?: React.ElementType;
9
+ FilterSelector?: React.ElementType;
10
+ };
7
11
  };
8
- declare const _default: React.MemoExoticComponent<({ attributeTypes, filters, onChange }: Props) => JSX.Element>;
12
+ declare const _default: React.MemoExoticComponent<({ attributeTypes, filters, onChange, components }: Props) => JSX.Element>;
9
13
  export default _default;
@@ -42,10 +42,11 @@ var styles_1 = require("./styles");
42
42
  var EMPTY_FILTER = { fieldName: null, filter: null, values: [] };
43
43
  var Stub = function () { return null; };
44
44
  var AttributesFiltersBuilder = function (_a) {
45
- var attributeTypes = _a.attributeTypes, filters = _a.filters, onChange = _a.onChange;
45
+ var attributeTypes = _a.attributeTypes, filters = _a.filters, onChange = _a.onChange, _b = _a.components, components = _b === void 0 ? {} : _b;
46
+ var CustomValuesEditor = components.ValuesEditor, CustomFilterSelector = components.FilterSelector;
46
47
  var metadata = react_redux_1.useSelector(mdm_module_1.default.selectors.getMetadata);
47
48
  var entityType = mdm_sdk_1.getEntityType(metadata, helpers_1.getEntityTypeFromAttrTypes(attributeTypes));
48
- var _b = styles_1.useStyles(), attrSelector = _b.attrSelector, filterSelector = _b.filterSelector, actionContainer = _b.actionContainer;
49
+ var _c = styles_1.useStyles(), attrSelector = _c.attrSelector, filterSelector = _c.filterSelector, actionContainer = _c.actionContainer;
49
50
  var actualFilters = react_1.useRef(filters);
50
51
  actualFilters.current = filters;
51
52
  var attributeFilterRef = react_1.useRef(null);
@@ -107,6 +108,6 @@ var AttributesFiltersBuilder = function (_a) {
107
108
  var addNewFilter = react_1.useCallback(function (newFilter) {
108
109
  onChange(__spreadArray(__spreadArray([], actualFilters.current), [newFilter]));
109
110
  }, [onChange]);
110
- return (react_1.default.createElement(QueryBuilderRowsGroup_1.default, { rowClasses: rowClasses, rowsData: rowsData, AttributeSelectorComponent: AttributeSelector_1.default, FilterSelectorComponent: FilterSelector_1.default, ValuesEditorComponent: ValuesEditor_1.default, ActionsComponent: RowActions_1.default, LogicOperatorComponent: Stub, filterSelectorRefIndex: lastAttributesCountRef.current, filterSelectorRef: attributeFilterRef, lastRowAttributeSelectorProps: lastRowAttributeSelectorProps, attributesGroup: attributeSelectorItems, changeFilter: changeFilter, addNewFilter: addNewFilter, addRowAfterIndex: addRowAfterIndex, removeRow: removeRow, duplicateRow: duplicateRow, entityType: entityType }));
111
+ return (react_1.default.createElement(QueryBuilderRowsGroup_1.default, { rowClasses: rowClasses, rowsData: rowsData, AttributeSelectorComponent: AttributeSelector_1.default, FilterSelectorComponent: CustomFilterSelector || FilterSelector_1.default, ValuesEditorComponent: CustomValuesEditor || ValuesEditor_1.default, ActionsComponent: RowActions_1.default, LogicOperatorComponent: Stub, filterSelectorRefIndex: lastAttributesCountRef.current, filterSelectorRef: attributeFilterRef, lastRowAttributeSelectorProps: lastRowAttributeSelectorProps, attributesGroup: attributeSelectorItems, changeFilter: changeFilter, addNewFilter: addNewFilter, addRowAfterIndex: addRowAfterIndex, removeRow: removeRow, duplicateRow: duplicateRow, entityType: entityType }));
111
112
  };
112
113
  exports.default = react_1.memo(AttributesFiltersBuilder);
@@ -1,7 +1,8 @@
1
1
  import React from 'react';
2
- import { AttributeFiltersComponentProps } from '../../types';
2
+ import { AttributeFiltersComponentProps, FilterOption } from '../../types';
3
3
  declare type Props = AttributeFiltersComponentProps & {
4
4
  textFieldInputRef: React.MutableRefObject<HTMLInputElement>;
5
+ options?: FilterOption[];
5
6
  };
6
- declare const _default: React.MemoExoticComponent<({ rowData, rowContext, textFieldInputRef }: Props) => JSX.Element>;
7
+ declare const _default: React.MemoExoticComponent<({ rowData, rowContext, textFieldInputRef, options: optionsProp }: Props) => JSX.Element>;
7
8
  export default _default;
@@ -31,13 +31,14 @@ var SimpleDropDownSelector_1 = __importDefault(require("../../../SimpleDropDownS
31
31
  var helpers_1 = require("../../helpers");
32
32
  var styles_1 = __importDefault(require("./styles"));
33
33
  var FilterSelector = function (_a) {
34
- var rowData = _a.rowData, rowContext = _a.rowContext, textFieldInputRef = _a.textFieldInputRef;
34
+ var rowData = _a.rowData, rowContext = _a.rowContext, textFieldInputRef = _a.textFieldInputRef, optionsProp = _a.options;
35
35
  var styles = styles_1.default();
36
36
  var _b = rowData || {}, _c = _b.attribute, _d = _c === void 0 ? {} : _c, _e = _d.attrType, attrType = _e === void 0 ? {} : _e, _f = _d.fieldName, fieldName = _f === void 0 ? null : _f, filter = _b.filter, id = _b.id;
37
37
  var changeFilter = rowContext.changeFilter;
38
- var options = attrType &&
39
- fieldName &&
40
- ramda_1.pipe(mdm_sdk_1.getFilterOptionsForQueryBuilder, ramda_1.map(function (value) { return ({ value: value, label: capitalize_1.default(mdm_sdk_1.getFilterOptionLabel(value)) }); }))(attrType, fieldName);
38
+ var options = optionsProp ||
39
+ (attrType &&
40
+ fieldName &&
41
+ ramda_1.pipe(mdm_sdk_1.getFilterOptionsForQueryBuilder, ramda_1.map(function (value) { return ({ value: value, label: capitalize_1.default(mdm_sdk_1.getFilterOptionLabel(value)) }); }))(attrType, fieldName));
41
42
  var onChangeFilter = react_1.useCallback(function (filterOption) {
42
43
  var newFilter = {
43
44
  fieldName: fieldName,
@@ -25,13 +25,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
25
25
  var react_1 = __importStar(require("react"));
26
26
  var mdm_sdk_1 = require("@reltio/mdm-sdk");
27
27
  var FilterValueEditor_1 = __importDefault(require("../../../editors/FilterEditor/FilterValueEditor"));
28
- var MatchRulesSelector_1 = __importDefault(require("../MatchRulesSelector/MatchRulesSelector"));
29
28
  var styles_1 = require("./styles");
30
29
  var ValuesEditor = function (_a) {
31
30
  var rowData = _a.rowData, rowContext = _a.rowContext;
32
31
  var styles = styles_1.useStyles();
33
32
  var canFilterAcceptValues = (rowData === null || rowData === void 0 ? void 0 : rowData.attribute) && mdm_sdk_1.checkIfOptionHasValues(rowData.filter);
34
- var changeFilter = rowContext.changeFilter, entityType = rowContext.entityType;
33
+ var changeFilter = rowContext.changeFilter;
35
34
  var _b = (rowData || {}), _c = _b.values, values = _c === void 0 ? [] : _c, _d = _b.attribute, _e = _d === void 0 ? {} : _d, attrType = _e.attrType, _f = _e.fieldName, fieldName = _f === void 0 ? null : _f, filter = _b.filter, id = _b.id;
36
35
  var valueDataTypeDefinition = attrType && mdm_sdk_1.getAttrDataTypeDefinition(attrType);
37
36
  var filterValueDataTypeDefinition = valueDataTypeDefinition && mdm_sdk_1.getDataTypeDefinitionForFilterValue(valueDataTypeDefinition, filter);
@@ -56,14 +55,6 @@ var ValuesEditor = function (_a) {
56
55
  };
57
56
  changeFilter(newFilter, id);
58
57
  }, [changeFilter, id, fieldName, filter]);
59
- var renderEditor = function () {
60
- if (mdm_sdk_1.isMatchRuleAttrType(attrType)) {
61
- return (react_1.default.createElement(MatchRulesSelector_1.default, { entityType: entityType, name: attrType.name, values: values, onChange: changeValue, TextFieldProps: TextFieldProps, fullWidth: true }));
62
- }
63
- else {
64
- return (react_1.default.createElement(FilterValueEditor_1.default, { filter: editorFilter, onChange: changeValue, dataTypeDefinition: filterValueDataTypeDefinition, fullWidth: true, TextFieldProps: TextFieldProps, color: "primary", classes: editorClasses, orientation: "horizontal" }));
65
- }
66
- };
67
- return react_1.default.createElement("div", { className: styles.valuesEditor }, (rowData === null || rowData === void 0 ? void 0 : rowData.attribute) && canFilterAcceptValues && renderEditor());
58
+ return (react_1.default.createElement("div", { className: styles.valuesEditor }, (rowData === null || rowData === void 0 ? void 0 : rowData.attribute) && canFilterAcceptValues && (react_1.default.createElement(FilterValueEditor_1.default, { filter: editorFilter, onChange: changeValue, dataTypeDefinition: filterValueDataTypeDefinition, fullWidth: true, TextFieldProps: TextFieldProps, color: "primary", classes: editorClasses, orientation: "horizontal" }))));
68
59
  };
69
60
  exports.default = react_1.memo(ValuesEditor);
@@ -0,0 +1,4 @@
1
+ export { default as AttributesFiltersBuilder } from './AttributesFiltersBuilder';
2
+ export { default as AttributesValuesEditor } from './components/ValuesEditor/ValuesEditor';
3
+ export { default as AttributesFilterSelector } from './components/FilterSelector/FilterSelector';
4
+ export type { AttributeFiltersComponentProps } from './types';
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.AttributesFilterSelector = exports.AttributesValuesEditor = exports.AttributesFiltersBuilder = void 0;
7
+ var AttributesFiltersBuilder_1 = require("./AttributesFiltersBuilder");
8
+ Object.defineProperty(exports, "AttributesFiltersBuilder", { enumerable: true, get: function () { return __importDefault(AttributesFiltersBuilder_1).default; } });
9
+ var ValuesEditor_1 = require("./components/ValuesEditor/ValuesEditor");
10
+ Object.defineProperty(exports, "AttributesValuesEditor", { enumerable: true, get: function () { return __importDefault(ValuesEditor_1).default; } });
11
+ var FilterSelector_1 = require("./components/FilterSelector/FilterSelector");
12
+ Object.defineProperty(exports, "AttributesFilterSelector", { enumerable: true, get: function () { return __importDefault(FilterSelector_1).default; } });
@@ -4,6 +4,10 @@ declare type Props = {
4
4
  filters: SearchFilter[];
5
5
  onChange: (filters: SearchFilter[]) => void;
6
6
  attributeTypes: AttributeType[];
7
+ components?: {
8
+ ValuesEditor?: React.ElementType;
9
+ FilterSelector?: React.ElementType;
10
+ };
7
11
  };
8
- declare const _default: React.MemoExoticComponent<({ filters: filtersProp, attributeTypes, onChange }: Props) => JSX.Element>;
12
+ declare const _default: React.MemoExoticComponent<({ filters: filtersProp, attributeTypes, onChange, components }: Props) => JSX.Element>;
9
13
  export default _default;
@@ -34,7 +34,7 @@ var AttributesFiltersBuilder_1 = __importDefault(require("../AttributesFiltersBu
34
34
  var ActionButtons_1 = __importDefault(require("./ActionButtons/ActionButtons"));
35
35
  var styles_1 = require("./styles");
36
36
  var AttributesFiltersButton = function (_a) {
37
- var filtersProp = _a.filters, attributeTypes = _a.attributeTypes, onChange = _a.onChange;
37
+ var filtersProp = _a.filters, attributeTypes = _a.attributeTypes, onChange = _a.onChange, components = _a.components;
38
38
  var styles = styles_1.useStyles();
39
39
  var buttonRef = react_1.useRef();
40
40
  var _b = react_1.useState(false), isOpen = _b[0], setIsOpen = _b[1];
@@ -73,7 +73,7 @@ var AttributesFiltersButton = function (_a) {
73
73
  react_1.default.createElement(react_1.default.Fragment, null,
74
74
  react_1.default.createElement(Typography_1.default, { variant: "h6" }, ui_i18n_1.default.text('Filter')),
75
75
  react_1.default.createElement("div", { className: styles.filtersBuilderWrapper },
76
- react_1.default.createElement(AttributesFiltersBuilder_1.default, { attributeTypes: attributeTypes, filters: filters, onChange: setFilters })),
76
+ react_1.default.createElement(AttributesFiltersBuilder_1.default, { attributeTypes: attributeTypes, filters: filters, onChange: setFilters, components: components })),
77
77
  react_1.default.createElement(Divider_1.default, { className: styles.divider }),
78
78
  react_1.default.createElement(ActionButtons_1.default, { onApply: applyButtonHandler, onCancel: cancelButtonHandler, onClear: clearAllButtonHandler })))));
79
79
  };
@@ -1,12 +1,8 @@
1
1
  /// <reference types="react" />
2
- import { TEntityType } from '@reltio/mdm-sdk';
2
+ import { TEntityType, MatchRulesAttrNames } from '@reltio/mdm-sdk';
3
3
  import { TextFieldProps as TextFieldPropsType } from '@material-ui/core/TextField';
4
- export declare enum MatchRulesAttributeNames {
5
- matchRules = "matchRules",
6
- MLRecommendedMatch = "MLRecommendedMatch"
7
- }
8
4
  declare type Props = {
9
- name: MatchRulesAttributeNames;
5
+ name: MatchRulesAttrNames;
10
6
  values?: string[];
11
7
  onChange: (values: string[]) => void;
12
8
  TextFieldProps?: Partial<TextFieldPropsType>;
@@ -22,7 +22,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
22
22
  return (mod && mod.__esModule) ? mod : { "default": mod };
23
23
  };
24
24
  Object.defineProperty(exports, "__esModule", { value: true });
25
- exports.MatchRulesAttributeNames = void 0;
26
25
  var react_1 = __importStar(require("react"));
27
26
  var react_redux_1 = require("react-redux");
28
27
  var mdm_module_1 = __importDefault(require("@reltio/mdm-module"));
@@ -35,11 +34,6 @@ var prepareOptions = function (options) {
35
34
  return ({ label: label, value: uri });
36
35
  });
37
36
  };
38
- var MatchRulesAttributeNames;
39
- (function (MatchRulesAttributeNames) {
40
- MatchRulesAttributeNames["matchRules"] = "matchRules";
41
- MatchRulesAttributeNames["MLRecommendedMatch"] = "MLRecommendedMatch";
42
- })(MatchRulesAttributeNames = exports.MatchRulesAttributeNames || (exports.MatchRulesAttributeNames = {}));
43
37
  var MatchRulesSelector = function (_a) {
44
38
  var name = _a.name, values = _a.values, onChange = _a.onChange, entityType = _a.entityType, TextFieldProps = _a.TextFieldProps, fullWidth = _a.fullWidth;
45
39
  var metadata = react_redux_1.useSelector(mdm_module_1.default.selectors.getMetadata);
@@ -47,7 +41,7 @@ var MatchRulesSelector = function (_a) {
47
41
  entityType === null || entityType === void 0 ? void 0 : entityType.uri,
48
42
  metadata
49
43
  ]), mlMatchRules = _b[0], matchRules = _b[1];
50
- var options = react_1.useMemo(function () { return prepareOptions(name === MatchRulesAttributeNames.matchRules ? matchRules : mlMatchRules); }, [name, matchRules, mlMatchRules]);
44
+ var options = react_1.useMemo(function () { return prepareOptions(name === mdm_sdk_1.MatchRulesAttrNames.matchRules ? matchRules : mlMatchRules); }, [name, matchRules, mlMatchRules]);
51
45
  return (react_1.default.createElement(MultiValueSelector_1.default, { values: values, onChange: onChange, options: options, TextFieldProps: TextFieldProps, fullWidth: fullWidth }));
52
46
  };
53
47
  MatchRulesSelector.displayName = 'MatchRulesSelector';
@@ -47,12 +47,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
47
47
  var react_1 = __importStar(require("react"));
48
48
  var ramda_1 = require("ramda");
49
49
  var mdm_sdk_1 = require("@reltio/mdm-sdk");
50
- var DropdownIndicatorWithIconButton_1 = __importDefault(require("../../../commonReactSelectComponents/DropdownIndicatorWithIconButton"));
51
- var OptionWithCheckIcon_1 = __importDefault(require("../../../commonReactSelectComponents/OptionWithCheckIcon/OptionWithCheckIcon"));
52
- var MenuWithPopper_1 = __importDefault(require("../../../commonReactSelectComponents/MenuWithPopper"));
53
- var MultiValueChip_1 = __importDefault(require("../../../editors/commonComponents/MultiValueChip/MultiValueChip"));
54
- var MultiSelect_1 = __importDefault(require("../../../ReactSelect/MultiSelect"));
55
- var core_1 = require("../../../../core");
50
+ var DropdownIndicatorWithIconButton_1 = __importDefault(require("../commonReactSelectComponents/DropdownIndicatorWithIconButton"));
51
+ var OptionWithCheckIcon_1 = __importDefault(require("../commonReactSelectComponents/OptionWithCheckIcon/OptionWithCheckIcon"));
52
+ var MenuWithPopper_1 = __importDefault(require("../commonReactSelectComponents/MenuWithPopper"));
53
+ var MultiValueChip_1 = __importDefault(require("../editors/commonComponents/MultiValueChip/MultiValueChip"));
54
+ var MultiSelect_1 = __importDefault(require("../ReactSelect/MultiSelect"));
55
+ var core_1 = require("../../core");
56
56
  var styles_1 = require("./styles");
57
57
  var MultiValueSelector = function (_a) {
58
58
  var _b = _a.values, values = _b === void 0 ? [] : _b, onChange = _a.onChange, options = _a.options, fullWidth = _a.fullWidth, _c = _a.TextFieldProps, TextFieldProps = _c === void 0 ? {} : _c;
@@ -1,2 +1,2 @@
1
1
  export const useChipStyles: (props?: any) => import("@material-ui/core/styles/withStyles").ClassNameMap<"label" | "root" | "deleteIcon">;
2
- export const useStyles: (props?: any) => import("@material-ui/core/styles/withStyles").ClassNameMap<"label" | "count" | "container">;
2
+ export const useStyles: (props?: any) => import("@material-ui/core/styles/withStyles").ClassNameMap<"count" | "label" | "container">;
@@ -3,4 +3,4 @@ export declare type SIZES_TYPE = {
3
3
  imageWidth: number;
4
4
  imageHeight: number;
5
5
  };
6
- export declare const useStyles: (props: SIZES_TYPE) => import("@material-ui/core/styles/withStyles").ClassNameMap<"number" | "imageBox" | "moreButtonContainer" | "moreButton">;
6
+ export declare const useStyles: (props: SIZES_TYPE) => import("@material-ui/core/styles/withStyles").ClassNameMap<"number" | "moreButton" | "imageBox" | "moreButtonContainer">;
@@ -1 +1 @@
1
- export const useStyles: (props?: any) => import("@material-ui/core/styles/withStyles").ClassNameMap<"icon" | "dense" | "buttonLabel" | "moreButton" | "subHeader" | "moreAttributes" | "popupContainer" | "moreAttributesPopup" | "noResultsCaptionContainer">;
1
+ export const useStyles: (props?: any) => import("@material-ui/core/styles/withStyles").ClassNameMap<"icon" | "dense" | "moreButton" | "buttonLabel" | "subHeader" | "moreAttributes" | "popupContainer" | "moreAttributesPopup" | "noResultsCaptionContainer">;
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ declare type Props = {
3
+ loading: boolean;
4
+ onClick: (event: React.MouseEvent<HTMLButtonElement>) => void;
5
+ onMouseDown?: (event: React.MouseEvent<HTMLButtonElement>) => void;
6
+ };
7
+ declare const LoadMoreButton: ({ loading, onClick, onMouseDown }: Props) => JSX.Element;
8
+ export default LoadMoreButton;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ var react_1 = __importDefault(require("react"));
7
+ var Button_1 = __importDefault(require("@material-ui/core/Button"));
8
+ var core_1 = require("@material-ui/core");
9
+ var ui_i18n_1 = __importDefault(require("ui-i18n"));
10
+ var styles_1 = require("./styles");
11
+ var LoadMoreButton = function (_a) {
12
+ var loading = _a.loading, onClick = _a.onClick, onMouseDown = _a.onMouseDown;
13
+ var styles = styles_1.useStyles();
14
+ return (react_1.default.createElement("div", { className: styles.loadMoreContainer }, loading ? (react_1.default.createElement(core_1.CircularProgress, { className: styles.loadingSpinner, size: 24 })) : (react_1.default.createElement(Button_1.default, { color: "primary", onClick: onClick, onMouseDown: onMouseDown, className: styles.moreButton },
15
+ react_1.default.createElement("div", { className: styles.buttonLabel }, ui_i18n_1.default.text('Load more'))))));
16
+ };
17
+ exports.default = LoadMoreButton;
@@ -0,0 +1,3 @@
1
+ /// <reference types="react" />
2
+ declare const MenuList: (props: any) => JSX.Element;
3
+ export default MenuList;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ var react_1 = __importDefault(require("react"));
18
+ var react_select_1 = require("react-select");
19
+ var MenuList = function (props) {
20
+ var menuListFooter = props.selectProps.menuListFooter, children = props.children;
21
+ return (react_1.default.createElement(react_select_1.components.MenuList, __assign({}, props),
22
+ children,
23
+ menuListFooter));
24
+ };
25
+ exports.default = MenuList;
@@ -0,0 +1 @@
1
+ export const useStyles: (props?: any) => import("@material-ui/core/styles/withStyles").ClassNameMap<"loadMoreContainer" | "moreButton" | "buttonLabel" | "loadingSpinner">;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useStyles = void 0;
4
+ var styles_1 = require("@material-ui/core/styles");
5
+ exports.useStyles = styles_1.makeStyles({
6
+ loadMoreContainer: {
7
+ display: 'flex',
8
+ height: '32px'
9
+ },
10
+ moreButton: {
11
+ padding: '9px 38px 9px 38px'
12
+ },
13
+ buttonLabel: {
14
+ fontSize: '14px',
15
+ fontWeight: 500,
16
+ lineHeight: '16px',
17
+ whiteSpace: 'nowrap',
18
+ overflow: 'hidden'
19
+ },
20
+ loadingSpinner: {
21
+ alignSelf: 'center',
22
+ marginLeft: '40px'
23
+ }
24
+ });
@@ -1 +1 @@
1
- export declare const useStyles: (props?: any) => import("@material-ui/core/styles/withStyles").ClassNameMap<"attributeValue" | "text" | "input" | "editor" | "moreButton" | "sourceIcon" | "attributeTitle" | "attributeWrapper">;
1
+ export declare const useStyles: (props?: any) => import("@material-ui/core/styles/withStyles").ClassNameMap<"attributeValue" | "text" | "input" | "moreButton" | "editor" | "sourceIcon" | "attributeTitle" | "attributeWrapper">;
@@ -20,14 +20,20 @@ declare function useEditorContext(fieldName: any, dataTypeDefinition: any): {
20
20
  } | {
21
21
  lookups: any;
22
22
  lookupCode: any;
23
- getLookups: (type: any, parents: any, displayNamePrefix: any) => Promise<any>;
23
+ getLookups: ({ type, parents, displayNamePrefix, max, offset }: {
24
+ type: any;
25
+ parents: any;
26
+ displayNamePrefix: any;
27
+ max: any;
28
+ offset: any;
29
+ }) => Promise<any>;
24
30
  resolveLookups: (type: any, codeValues: any) => Promise<void>;
25
31
  entries?: undefined;
26
32
  getSuggestions?: undefined;
27
33
  format?: undefined;
28
34
  tenant?: undefined;
29
35
  } | {
30
- getSuggestions: (searchValue: any) => Promise<string[]>;
36
+ getSuggestions: (searchValue: any, max: any, pageNo: any) => Promise<string[]>;
31
37
  entries?: undefined;
32
38
  lookups?: undefined;
33
39
  lookupCode?: undefined;
@@ -41,11 +41,11 @@ var useEditorContext = function (fieldName, dataTypeDefinition) {
41
41
  var attributePresentations = react_redux_1.useSelector(mdm_module_1.default.selectors.getAttributePresentations);
42
42
  var globalSearchRequestOptions = react_redux_1.useSelector(mdm_module_1.default.selectors.getGlobalSearchRequestOptions);
43
43
  var dispatch = react_redux_1.useDispatch();
44
- var typeaheadGetSuggestion = react_1.useCallback(function (searchValue) {
44
+ var typeaheadGetSuggestion = react_1.useCallback(function (searchValue, max, pageNo) {
45
45
  return mdm_sdk_1.getFacetedAttributeData({
46
46
  fieldName: fieldName,
47
47
  searchValue: searchValue,
48
- options: __assign({}, globalSearchRequestOptions)
48
+ options: __assign(__assign({}, globalSearchRequestOptions), { max: max, pageNo: pageNo })
49
49
  }).then(function (response) { return Object.keys(response[fieldName]); });
50
50
  }, [fieldName, globalSearchRequestOptions]);
51
51
  var type = dataTypeDefinition.type, values = dataTypeDefinition.values, lookupCode = dataTypeDefinition.lookupCode, uri = dataTypeDefinition.uri, dependentLookupCode = dataTypeDefinition.dependentLookupCode, options = dataTypeDefinition.options;
@@ -66,8 +66,9 @@ var useEditorContext = function (fieldName, dataTypeDefinition) {
66
66
  return {
67
67
  lookups: lookups,
68
68
  lookupCode: dependentLookupCode,
69
- getLookups: function (type, parents, displayNamePrefix) {
70
- return mdm_sdk_1.getDependentLookups({ type: type, parents: parents, displayNamePrefix: displayNamePrefix }).then(function (_a) {
69
+ getLookups: function (_a) {
70
+ var type = _a.type, parents = _a.parents, displayNamePrefix = _a.displayNamePrefix, max = _a.max, offset = _a.offset;
71
+ return mdm_sdk_1.getDependentLookups({ type: type, parents: parents, displayNamePrefix: displayNamePrefix, max: max, offset: offset }).then(function (_a) {
71
72
  var codeValues = _a.codeValues;
72
73
  return ramda_1.propOr({}, type, codeValues);
73
74
  });
@@ -48,13 +48,14 @@ exports.DEBOUNCE_INTERVAL = void 0;
48
48
  var react_1 = __importStar(require("react"));
49
49
  var prop_types_1 = __importDefault(require("prop-types"));
50
50
  var mdm_sdk_1 = require("@reltio/mdm-sdk");
51
- var AsyncSelect_1 = __importDefault(require("../../ReactSelect/AsyncSelect"));
51
+ var Select_1 = __importDefault(require("../../ReactSelect/Select"));
52
52
  var ramda_1 = require("ramda");
53
53
  var helpers_1 = require("./helpers");
54
54
  var ui_i18n_1 = __importDefault(require("ui-i18n"));
55
55
  var utils_1 = require("../../../core/utils");
56
56
  var DropdownIndicator_1 = __importDefault(require("../../commonReactSelectComponents/DropdownIndicator"));
57
57
  var MenuWithPopper_1 = __importDefault(require("../../commonReactSelectComponents/MenuWithPopper"));
58
+ var MenuList_1 = __importDefault(require("../../commonReactSelectComponents/MenuList"));
58
59
  var styles_1 = require("./styles");
59
60
  var useLookupsResolver_1 = __importDefault(require("./useLookupsResolver"));
60
61
  var MultiValueChip_1 = __importDefault(require("../commonComponents/MultiValueChip/MultiValueChip"));
@@ -62,15 +63,18 @@ var OptionWithCheckIcon_1 = __importDefault(require("../../commonReactSelectComp
62
63
  var useDefaultOptions_1 = __importDefault(require("./useDefaultOptions"));
63
64
  var useAutopopulation_1 = __importDefault(require("./useAutopopulation"));
64
65
  var useSavingFocus_1 = __importDefault(require("./useSavingFocus"));
66
+ var LoadMoreButton_1 = __importDefault(require("../../commonReactSelectComponents/LoadMoreButton"));
65
67
  var SelectComponents = {
66
68
  IndicatorSeparator: utils_1.EmptyStub,
67
69
  LoadingIndicator: utils_1.EmptyStub,
68
70
  Option: OptionWithCheckIcon_1.default,
69
71
  DropdownIndicator: DropdownIndicator_1.default,
70
72
  Menu: MenuWithPopper_1.default,
73
+ MenuList: MenuList_1.default,
71
74
  MultiValue: MultiValueChip_1.default
72
75
  };
73
76
  exports.DEBOUNCE_INTERVAL = 400;
77
+ var MAX_DEPENDENT_LOOKUP_VALUES = 50;
74
78
  var DependentLookupEditor = function (_a) {
75
79
  var multiple = _a.multiple, value = _a.value, lookupTypeCode = _a.lookupCode, TextFieldProps = _a.TextFieldProps, parents = _a.parents, onChange = _a.onChange, getLookups = _a.getLookups, _b = _a.lookups, lookups = _b === void 0 ? {} : _b, resolveLookups = _a.resolveLookups, fullWidth = _a.fullWidth, disabled = _a.disabled, placeholder = _a.placeholder, autopopulationId = _a.autopopulationId, otherProps = __rest(_a, ["multiple", "value", "lookupCode", "TextFieldProps", "parents", "onChange", "getLookups", "lookups", "resolveLookups", "fullWidth", "disabled", "placeholder", "autopopulationId"]);
76
80
  var inputRef = react_1.useRef(null);
@@ -84,16 +88,54 @@ var DependentLookupEditor = function (_a) {
84
88
  });
85
89
  useSavingFocus_1.default(selectRef, inputRef, disabled);
86
90
  var _c = react_1.useState(''), inputValue = _c[0], setInputValue = _c[1];
87
- var loadOptions = react_1.useCallback(function (value) { return getLookups(lookupTypeCode, parents, value).then(helpers_1.buildLookupOptions); }, [
88
- lookupTypeCode,
89
- parents
90
- ]);
91
+ var _d = react_1.useState([]), options = _d[0], setOptions = _d[1];
92
+ var _e = react_1.useState(1), pageNumber = _e[0], setPageNumber = _e[1];
93
+ var _f = react_1.useState(false), nextPageIsLoading = _f[0], setNextPageIsLoading = _f[1];
94
+ var handleInputChange = function (value) {
95
+ if (value !== inputValue) {
96
+ setInputValue(value);
97
+ setPageNumber(1);
98
+ debouncedLoadOptions(value, setOptions);
99
+ }
100
+ };
101
+ var loadOptions = react_1.useCallback(function (value, pageNumber) {
102
+ if (pageNumber === void 0) { pageNumber = 1; }
103
+ return getLookups({
104
+ type: lookupTypeCode,
105
+ parents: parents,
106
+ displayNamePrefix: value,
107
+ max: MAX_DEPENDENT_LOOKUP_VALUES + 1,
108
+ offset: (pageNumber - 1) * MAX_DEPENDENT_LOOKUP_VALUES
109
+ }).then(function (buildOptions) { return helpers_1.buildLookupOptions(buildOptions); });
110
+ }, [lookupTypeCode, parents]);
111
+ var loadMoreOptions = react_1.useCallback(function () {
112
+ setNextPageIsLoading(true);
113
+ loadOptions(inputValue, pageNumber + 1)
114
+ .then(function (buildOptions) {
115
+ setOptions(function (options) {
116
+ return ramda_1.concat(options.slice(0, pageNumber * MAX_DEPENDENT_LOOKUP_VALUES), buildOptions);
117
+ });
118
+ setPageNumber(function (page) { return page + 1; });
119
+ })
120
+ .catch(function () { return []; })
121
+ .finally(function () { return setNextPageIsLoading(false); });
122
+ }, [loadOptions, inputValue, pageNumber]);
91
123
  var debouncedLoadOptions = react_1.useCallback(mdm_sdk_1.debounce(function (value, callback) {
124
+ setNextPageIsLoading(true);
92
125
  loadOptions(value)
93
126
  .then(function (options) { return callback(options); })
94
- .catch(function () { return callback([]); });
127
+ .catch(function () { return callback([]); })
128
+ .finally(function () { return setNextPageIsLoading(false); });
95
129
  }, exports.DEBOUNCE_INTERVAL), [loadOptions]);
96
- var _d = useDefaultOptions_1.default(loadOptions), defaultOptions = _d.defaultOptions, initialDefaultOptions = _d.initialDefaultOptions, isLoadingDefaultOptions = _d.isLoading;
130
+ var _g = useDefaultOptions_1.default(loadOptions), defaultOptions = _g.defaultOptions, initialDefaultOptions = _g.initialDefaultOptions, isLoadingDefaultOptions = _g.isLoading;
131
+ react_1.useEffect(function () {
132
+ setOptions(defaultOptions);
133
+ }, [defaultOptions]);
134
+ var displayedOptions = react_1.useMemo(function () { return options.slice(0, pageNumber * MAX_DEPENDENT_LOOKUP_VALUES); }, [
135
+ options,
136
+ pageNumber
137
+ ]);
138
+ var showMoreButton = options.length > displayedOptions.length;
97
139
  var isEmptyValue = multiple ? ramda_1.isEmpty(value) : !(value === null || value === void 0 ? void 0 : value.lookupCode) && !(value === null || value === void 0 ? void 0 : value.value);
98
140
  var markAsTouched = useAutopopulation_1.default({
99
141
  id: autopopulationId,
@@ -102,13 +144,13 @@ var DependentLookupEditor = function (_a) {
102
144
  multiple: multiple,
103
145
  onChange: onChange
104
146
  }).markAsTouched;
105
- return (react_1.default.createElement(AsyncSelect_1.default, __assign({}, otherProps, { isMulti: multiple, classes: styles, menuPortalTarget: document.body, menuPlacement: "auto", TextFieldProps: __assign(__assign({}, TextFieldProps), { ref: inputRef, disabled: (TextFieldProps === null || TextFieldProps === void 0 ? void 0 : TextFieldProps.disabled) || disabled }), inputRef: inputRef, innerRef: selectRef, styles: {
147
+ return (react_1.default.createElement(Select_1.default, __assign({}, otherProps, { isMulti: multiple, classes: styles, menuPortalTarget: document.body, menuPlacement: "auto", TextFieldProps: __assign(__assign({}, TextFieldProps), { ref: inputRef, disabled: (TextFieldProps === null || TextFieldProps === void 0 ? void 0 : TextFieldProps.disabled) || disabled }), inputRef: inputRef, innerRef: selectRef, styles: {
106
148
  menuPortal: function (base) { return (__assign(__assign({}, base), { zIndex: 1300 })); },
107
149
  container: function (base) { return (__assign(__assign({}, base), (fullWidth ? { width: '100%' } : {}))); }
108
- }, loadingMessage: function () { return ui_i18n_1.default.text('Loading...'); }, noOptionsMessage: function () { return ui_i18n_1.default.text('No results found'); }, components: SelectComponents, isClearable: true, isSearchable: true, inputValue: inputValue, onInputChange: setInputValue, isLoading: !inputValue && isLoadingDefaultOptions, defaultOptions: defaultOptions, hideSelectedOptions: false, placeholder: placeholder || '', isDisabled: disabled, loadOptions: debouncedLoadOptions, getOptionValue: ramda_1.either(ramda_1.prop('value'), ramda_1.prop('lookupCode')), getOptionLabel: helpers_1.getOptionLabel, onChange: function (value) {
150
+ }, loadingMessage: function () { return ui_i18n_1.default.text('Loading...'); }, noOptionsMessage: function () { return ui_i18n_1.default.text('No results found'); }, components: SelectComponents, isClearable: true, isSearchable: true, inputValue: inputValue, onInputChange: handleInputChange, isLoading: !inputValue && isLoadingDefaultOptions, hideSelectedOptions: false, placeholder: placeholder || '', isDisabled: disabled, options: displayedOptions, getOptionValue: ramda_1.either(ramda_1.prop('value'), ramda_1.prop('lookupCode')), getOptionLabel: helpers_1.getOptionLabel, onChange: function (value) {
109
151
  markAsTouched();
110
152
  onChange(value);
111
- }, value: ramda_1.defaultTo(multiple ? [] : null, value) })));
153
+ }, value: ramda_1.defaultTo(multiple ? [] : null, value), menuListFooter: showMoreButton && react_1.default.createElement(LoadMoreButton_1.default, { loading: nextPageIsLoading, onClick: loadMoreOptions }) })));
112
154
  };
113
155
  DependentLookupEditor.propTypes = {
114
156
  multiple: prop_types_1.default.bool,
@@ -65,21 +65,44 @@ var utils_1 = require("../../../core/utils");
65
65
  var styles_1 = require("./styles");
66
66
  var ExpandedValueTooltip_1 = __importDefault(require("../../ExpandedValueTooltip/ExpandedValueTooltip"));
67
67
  var ValueChip_1 = __importDefault(require("../../ValueChip/ValueChip"));
68
+ var LoadMoreButton_1 = __importDefault(require("../../commonReactSelectComponents/LoadMoreButton"));
69
+ var hooks_1 = require("../../../hooks");
68
70
  var FETCH_DEBOUNCE_INTERVAL = 300;
71
+ var PAGE_SIZE = 50;
69
72
  var TypeaheadEditor = function (_a) {
70
73
  var value = _a.value, getSuggestions = _a.getSuggestions, onChange = _a.onChange, multiple = _a.multiple, fullWidth = _a.fullWidth, _b = _a.InputProps, InputProps = _b === void 0 ? {} : _b, inputProps = __rest(_a, ["value", "getSuggestions", "onChange", "multiple", "fullWidth", "InputProps"]);
71
74
  var _c = react_1.useState([]), suggestions = _c[0], setSuggestions = _c[1];
72
75
  var _d = react_1.useState(false), isPlaceholderVisible = _d[0], setPlaceholderVisibility = _d[1];
76
+ var _e = react_1.useState(1), pageNumber = _e[0], setPageNumber = _e[1];
77
+ var _f = react_1.useState(false), nextPageIsLoading = _f[0], setNextPageIsLoading = _f[1];
78
+ var pageSizeForRequest = PAGE_SIZE + 1;
79
+ var _g = react_1.useState(''), currentValue = _g[0], setCurrentValue = _g[1];
80
+ value = ramda_1.defaultTo(multiple ? [] : '', value);
81
+ var inputValue = multiple ? currentValue : value;
82
+ hooks_1.useDidUpdateEffect(function () {
83
+ setPageNumber(1);
84
+ }, [inputValue]);
73
85
  var inputRef = react_1.useRef();
74
86
  var styles = styles_1.useStyles();
75
87
  var isFocused = function () { var _a; return ((_a = inputRef.current) === null || _a === void 0 ? void 0 : _a.querySelector('input')) === document.activeElement; };
76
- var fetchSuggestions = ramda_1.pipe(ramda_1.prop('value'), ramda_1.trim, getSuggestions, ramda_1.andThen(ramda_1.pipe(ramda_1.tap(setSuggestions), ramda_1.both(ramda_1.isEmpty, isFocused), setPlaceholderVisibility)));
88
+ var fetchSuggestions = ramda_1.pipe(ramda_1.prop('value'), ramda_1.trim, function (value) { return getSuggestions(value, pageSizeForRequest); }, ramda_1.andThen(ramda_1.pipe(ramda_1.tap(setSuggestions), ramda_1.both(ramda_1.isEmpty, isFocused), setPlaceholderVisibility)));
89
+ var onLoadMoreSuggestions = function () {
90
+ setNextPageIsLoading(true);
91
+ getSuggestions(inputValue, pageSizeForRequest, pageNumber + 1)
92
+ .then(ramda_1.pipe(ramda_1.concat(suggestions), setSuggestions, ramda_1.always(pageNumber + 1), setPageNumber))
93
+ .finally(function () {
94
+ setNextPageIsLoading(false);
95
+ });
96
+ };
97
+ var onMouseDown = function (event) {
98
+ event.preventDefault();
99
+ };
77
100
  var debouncedFetchSuggestions = react_1.useCallback(mdm_sdk_1.debounce(fetchSuggestions, FETCH_DEBOUNCE_INTERVAL), [
78
101
  getSuggestions
79
102
  ]);
80
- value = ramda_1.defaultTo(multiple ? [] : '', value);
81
- var _e = react_1.useState(''), currentValue = _e[0], setCurrentValue = _e[1];
82
- var _f = react_1.useState(false), hasHighlightedItem = _f[0], setHasHighlightedItem = _f[1];
103
+ var displayedSuggestions = react_1.useMemo(function () { return suggestions.slice(0, pageNumber * PAGE_SIZE); }, [suggestions, pageNumber]);
104
+ var showMoreButton = suggestions.length > displayedSuggestions.length;
105
+ var _h = react_1.useState(false), hasHighlightedItem = _h[0], setHasHighlightedItem = _h[1];
83
106
  var onInputChange = function (_a) {
84
107
  var newValue = _a.newValue, method = _a.method;
85
108
  switch (method) {
@@ -113,11 +136,11 @@ var TypeaheadEditor = function (_a) {
113
136
  }
114
137
  }
115
138
  };
116
- return (react_1.default.createElement(react_autosuggest_1.default, { suggestions: suggestions, shouldRenderSuggestions: ramda_1.T, inputProps: __assign(__assign({ value: multiple ? currentValue : value, onChange: ramda_1.pipe(ramda_1.nthArg(1), onInputChange), onKeyDown: function (event) {
139
+ return (react_1.default.createElement(react_autosuggest_1.default, { suggestions: displayedSuggestions, shouldRenderSuggestions: ramda_1.T, inputProps: __assign(__assign({ value: inputValue, onChange: ramda_1.pipe(ramda_1.nthArg(1), onInputChange), onKeyDown: function (event) {
117
140
  if (event.keyCode === 13 && multiple && !hasHighlightedItem) {
118
141
  onInputChange({ method: 'enter', newValue: currentValue });
119
142
  }
120
- }, fullWidth: fullWidth }, inputProps), { autoComplete: 'nope' }), getSuggestionValue: ramda_1.identity, onSuggestionsFetchRequested: ramda_1.ifElse(ramda_1.propEq('reason', 'input-changed'), debouncedFetchSuggestions, fetchSuggestions), onSuggestionsClearRequested: ramda_1.pipe(ramda_1.always([]), setSuggestions, ramda_1.F, setPlaceholderVisibility), renderInputComponent: function (_a) {
143
+ }, fullWidth: fullWidth }, inputProps), { autoComplete: 'nope' }), getSuggestionValue: ramda_1.identity, onSuggestionsFetchRequested: ramda_1.ifElse(ramda_1.propEq('reason', 'input-changed'), debouncedFetchSuggestions, fetchSuggestions), onSuggestionsClearRequested: ramda_1.pipe(ramda_1.always([]), setSuggestions, ramda_1.F, setPlaceholderVisibility, ramda_1.always(1), setPageNumber), renderInputComponent: function (_a) {
121
144
  var _b;
122
145
  var ref = _a.ref, onInputChange = _a.onChange, otherProps = __rest(_a, ["ref", "onChange"]);
123
146
  var commonClasses = {
@@ -128,7 +151,9 @@ var TypeaheadEditor = function (_a) {
128
151
  }, renderSuggestionsContainer: function (_a) {
129
152
  var children = _a.children, _b = _a.containerProps, ref = _b.ref, restContainerProps = __rest(_b, ["ref"]);
130
153
  return (react_1.default.createElement(Popper_1.default, { anchorEl: inputRef.current, open: Boolean(children) || isPlaceholderVisible },
131
- react_1.default.createElement(Paper_1.default, __assign({ ref: ref, square: true }, restContainerProps, { style: { width: ramda_1.prop('clientWidth', inputRef.current) } }), children || react_1.default.createElement(EmptySearchResult_1.NoResults, { className: styles['typeahead__suggestions-placeholder'] }))));
154
+ react_1.default.createElement(Paper_1.default, __assign({ ref: ref, square: true }, restContainerProps, { style: { width: ramda_1.prop('clientWidth', inputRef.current) } }),
155
+ children || react_1.default.createElement(EmptySearchResult_1.NoResults, { className: styles['typeahead__suggestions-placeholder'] }),
156
+ showMoreButton && !isPlaceholderVisible && (react_1.default.createElement(LoadMoreButton_1.default, { onClick: onLoadMoreSuggestions, onMouseDown: onMouseDown, loading: nextPageIsLoading })))));
132
157
  }, renderSuggestion: function (suggestion, _a) {
133
158
  var isHighlighted = _a.isHighlighted;
134
159
  return (react_1.default.createElement(MenuItem_1.default, { className: styles['typeahead__suggestions-menuItem'], selected: isHighlighted, component: "div" },