@scaleflex/widget-common 4.4.0 → 4.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/style.css +1126 -0
  3. package/dist/style.min.css +1 -0
  4. package/lib/ApprovalStatus/ApprovalStatus.styled.js +21 -0
  5. package/lib/ApprovalStatus/index.js +104 -0
  6. package/lib/AssetPreview.js +53 -0
  7. package/lib/AutoSuggest.js +166 -0
  8. package/lib/Avatar/Avatar.styled.js +25 -0
  9. package/lib/Avatar/index.js +83 -0
  10. package/lib/AvatarWithStatus/AvatarWithStatus.styled.js +12 -0
  11. package/lib/AvatarWithStatus/index.js +30 -0
  12. package/lib/BackButton.js +46 -0
  13. package/lib/BackdropOverlay.js +77 -0
  14. package/lib/BadgeButton.js +35 -0
  15. package/lib/BaseButton.js +36 -0
  16. package/lib/Button.js +29 -0
  17. package/lib/Carousel/Carousel.styled.js +19 -0
  18. package/lib/Carousel/index.js +136 -0
  19. package/lib/Checkbox.js +55 -0
  20. package/lib/CloseButton.js +46 -0
  21. package/lib/ColorPicker/ColorPicker.styled.js +29 -0
  22. package/lib/ColorPicker/index.js +117 -0
  23. package/lib/ColorPickerModal/ColorPickerModal.styled.js +17 -0
  24. package/lib/ColorPickerModal/index.js +103 -0
  25. package/lib/DatePicker/MyDatePicker.js +350 -0
  26. package/lib/DatePicker/index.js +1 -0
  27. package/lib/DropFilesWindow.js +45 -0
  28. package/lib/FilterItem/FilterItem.styled.js +42 -0
  29. package/lib/FilterItem/index.js +48 -0
  30. package/lib/FilterPopup/FilterPopup.styled.js +16 -0
  31. package/lib/FilterPopup/index.js +85 -0
  32. package/lib/FormControl.js +25 -0
  33. package/lib/FormGroup.js +18 -0
  34. package/lib/FormHelperText.js +29 -0
  35. package/lib/IconLabeledButton.js +32 -0
  36. package/lib/Image/Image.styled.js +16 -0
  37. package/lib/Image/index.js +95 -0
  38. package/lib/ImagePreview/ImagePreview.styled.js +19 -0
  39. package/lib/ImagePreview/index.js +198 -0
  40. package/lib/InputAndLabel.js +77 -0
  41. package/lib/InputGroupTime.js +6 -0
  42. package/lib/InputLabel.js +18 -0
  43. package/lib/ItemButtonOverlay/ItemButtonOverlay.styled.js +33 -0
  44. package/lib/ItemButtonOverlay/index.js +23 -0
  45. package/lib/ItemHoverTopOptions.js +58 -0
  46. package/lib/LoaderView/LoaderView.styled.js +37 -0
  47. package/lib/LoaderView/index.js +32 -0
  48. package/lib/MetaData/FilterMetadataFields.js +115 -0
  49. package/lib/MetaData/FilterMetadataFields.styled.js +16 -0
  50. package/lib/MetaData/MetaDataField.js +246 -0
  51. package/lib/MetaData/MetaDataFieldTypes/MetaDataFieldBooleanType.js +36 -0
  52. package/lib/MetaData/MetaDataFieldTypes/MetaDataFieldDateType.js +53 -0
  53. package/lib/MetaData/MetaDataFieldTypes/MetaDataFieldMultiSelectType.js +71 -0
  54. package/lib/MetaData/MetaDataFieldTypes/MetaDataFieldNumericType.js +45 -0
  55. package/lib/MetaData/MetaDataFieldTypes/MetaDataFieldSelectType.js +69 -0
  56. package/lib/MetaData/MetaDataFieldTypes/MetaDataFieldTagsType.js +143 -0
  57. package/lib/MetaData/MetaDataFieldTypes/MetaDataFieldTextType.js +42 -0
  58. package/lib/MetaData/MetaDataFieldTypes/MetaDataFieldTextareaType.js +72 -0
  59. package/lib/MetaData/MetaDataFieldTypes/MetaDataFieldTypes.styled.js +57 -0
  60. package/lib/MetaData/MetaDataFieldTypes/MetadataAttachmentsFieldType/AttachmentsAssetsMetadataAccordion.styled.js +95 -0
  61. package/lib/MetaData/MetaDataFieldTypes/MetadataAttachmentsFieldType/MetadataAttachmentsAction.js +188 -0
  62. package/lib/MetaData/MetaDataFieldTypes/MetadataAttachmentsFieldType/MetadataAttachmentsFieldType.constants.js +48 -0
  63. package/lib/MetaData/MetaDataFieldTypes/MetadataAttachmentsFieldType/MetadataAttachmentsInfo.js +93 -0
  64. package/lib/MetaData/MetaDataFieldTypes/MetadataAttachmentsFieldType/index.js +114 -0
  65. package/lib/MetaData/MetaDataFieldTypes/MetadataFieldUriType.js +71 -0
  66. package/lib/MetaData/MetaDataFieldTypes/MetadataGeoPointField/MetadataGeoPointField.styled.js +8 -0
  67. package/lib/MetaData/MetaDataFieldTypes/MetadataGeoPointField/constants.js +10 -0
  68. package/lib/MetaData/MetaDataFieldTypes/MetadataGeoPointField/index.js +135 -0
  69. package/lib/MetaData/MetaDataFieldTypes/index.js +9 -0
  70. package/lib/MetaData/MetaDataFieldTypes.hooks.js +53 -0
  71. package/lib/OverlayCard/OverlayCard.styled.js +8 -0
  72. package/lib/OverlayCard/index.js +28 -0
  73. package/lib/PoweredBy.js +12 -0
  74. package/lib/Radiobox.js +63 -0
  75. package/lib/RegionalVariantsFilters/RegionalVariantFilters.styled.js +17 -0
  76. package/lib/RegionalVariantsFilters/index.js +160 -0
  77. package/lib/SVGUrlToElement.js +73 -0
  78. package/lib/SearchGroup/SearchGroup.styled.js +93 -0
  79. package/lib/SearchGroup/index.js +293 -0
  80. package/lib/Spinner.js +40 -0
  81. package/lib/SuggestedSelectInput/SuggestedSelectInput.styled.js +57 -0
  82. package/lib/SuggestedSelectInput/index.js +238 -0
  83. package/lib/SuggestedTagsInput/SuggestedTagsInput.js +295 -0
  84. package/lib/SuggestedTagsInput/SuggestedTagsInput.styled.js +83 -0
  85. package/lib/SuggestedTagsInput/SuggestedTagsInput.utils.js +15 -0
  86. package/lib/SuggestedTagsInput/SuggestedTagsInputSkeleton.js +14 -0
  87. package/lib/Tabs.js +62 -0
  88. package/lib/ToggleButton/ToggleButton.styled.js +16 -0
  89. package/lib/ToggleButton/index.js +16 -0
  90. package/lib/Transitions/SlideTransition.js +24 -0
  91. package/lib/Transitions/TransitionWrapper.js +83 -0
  92. package/lib/Transitions/Transitions.styled.js +8 -0
  93. package/lib/Transitions/index.js +2 -0
  94. package/lib/Typography/Typography.js +47 -0
  95. package/lib/Typography/Typography.mixin.js +46 -0
  96. package/lib/Typography/Typography.styled.js +18 -0
  97. package/lib/Typography/index.js +3 -0
  98. package/lib/Typography/types/index.js +1 -0
  99. package/lib/Typography/types/variant.js +9 -0
  100. package/lib/UploadFileFloatyLabel/UploadFileFloatyLabel.mixin.js +23 -0
  101. package/lib/UploadFileFloatyLabel/UploadFileFloatyLabel.styled.js +24 -0
  102. package/lib/UploadFileFloatyLabel/index.js +12 -0
  103. package/lib/UsersAutocomplete/Tag.js +25 -0
  104. package/lib/UsersAutocomplete/Tag.styled.js +35 -0
  105. package/lib/UsersAutocomplete/UsersAutocomplete.styled.js +94 -0
  106. package/lib/UsersAutocomplete/index.js +303 -0
  107. package/lib/VirtualGrid/VirtualGrid.styled.js +33 -0
  108. package/lib/VirtualGrid/VirtualGrid.utils.js +38 -0
  109. package/lib/VirtualGrid/VirtualGridItem.js +15 -0
  110. package/lib/VirtualGrid/index.js +252 -0
  111. package/lib/VirtualList/VirtualListItem.js +14 -0
  112. package/lib/VirtualList/index.js +105 -0
  113. package/lib/hooks/index.js +4 -0
  114. package/lib/hooks/useDebounce.js +24 -0
  115. package/lib/hooks/useInputWithLocaleNumber.js +115 -0
  116. package/lib/hooks/useIsUnMountedRef.js +12 -0
  117. package/lib/hooks/useKeyboardNavigation.js +60 -0
  118. package/lib/hooks/useUpdateEffect.js +19 -0
  119. package/lib/index.js +36 -0
  120. package/package.json +4 -4
@@ -0,0 +1,303 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
3
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
4
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
5
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
6
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
7
+ function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
8
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
9
+ function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
10
+ function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
11
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
12
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
13
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
14
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
15
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
16
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
17
+ import { useState, useMemo, useRef, useEffect } from 'react';
18
+ import { FormHint, Menu, TooltipV2, TextWithHighlights, Button } from '@scaleflex/ui/core';
19
+ import InfoIcon from '@scaleflex/icons/info-outline';
20
+ import Spinner from '../Spinner';
21
+ import Avatar from '../Avatar';
22
+ import Tag from './Tag';
23
+ import Styled from './UsersAutocomplete.styled';
24
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
25
+ export var INPUT_TYPE = {
26
+ USER_INPUT: 'UserInput',
27
+ SUGGESTION: 'Suggestion'
28
+ };
29
+ var UsersAutocomplete = function UsersAutocomplete(_ref) {
30
+ var _ref$suggestions = _ref.suggestions,
31
+ suggestions = _ref$suggestions === void 0 ? [] : _ref$suggestions,
32
+ _ref$value = _ref.value,
33
+ value = _ref$value === void 0 ? [] : _ref$value,
34
+ onAdd = _ref.onAdd,
35
+ _onRemove = _ref.onRemove,
36
+ label = _ref.label,
37
+ onClickPrimaryButton = _ref.onClickPrimaryButton,
38
+ onClickSecondaryButton = _ref.onClickSecondaryButton,
39
+ primaryActionButtonText = _ref.primaryActionButtonText,
40
+ secondaryActionButtonText = _ref.secondaryActionButtonText,
41
+ renderMenuItem = _ref.renderMenuItem,
42
+ renderTagIcon = _ref.renderTagIcon,
43
+ renderTagLabel = _ref.renderTagLabel,
44
+ placeholder = _ref.placeholder,
45
+ error = _ref.error,
46
+ loading = _ref.loading,
47
+ hint = _ref.hint,
48
+ _ref$getValue = _ref.getValue,
49
+ getValue = _ref$getValue === void 0 ? function (item) {
50
+ return (item === null || item === void 0 ? void 0 : item.uuid) || (item === null || item === void 0 ? void 0 : item.id);
51
+ } : _ref$getValue,
52
+ maxHeight = _ref.maxHeight,
53
+ fullWidth = _ref.fullWidth,
54
+ disabled = _ref.disabled,
55
+ readOnly = _ref.readOnly,
56
+ _ref$showPlaceholderO = _ref.showPlaceholderOnlyWhenNoSelection,
57
+ showPlaceholderOnlyWhenNoSelection = _ref$showPlaceholderO === void 0 ? false : _ref$showPlaceholderO,
58
+ suggestionsGroups = _ref.suggestionsGroups,
59
+ _ref$maxMenuHeight = _ref.maxMenuHeight,
60
+ maxMenuHeight = _ref$maxMenuHeight === void 0 ? 190 : _ref$maxMenuHeight,
61
+ disabledOptionTooltip = _ref.disabledOptionTooltip,
62
+ _ref$onEnterSelectFir = _ref.onEnterSelectFirstSuggestion,
63
+ onEnterSelectFirstSuggestion = _ref$onEnterSelectFir === void 0 ? true : _ref$onEnterSelectFir,
64
+ onOpenMenu = _ref.onOpenMenu,
65
+ menuStyles = _ref.menuStyles,
66
+ onCloseMenu = _ref.onCloseMenu;
67
+ var selectedItems = useMemo(function () {
68
+ return (value || []).map(function (id) {
69
+ return (suggestions || []).find(function (suggestion) {
70
+ return getValue(suggestion) === id;
71
+ });
72
+ }).filter(Boolean);
73
+ }, [value, suggestions]);
74
+ var _useState = useState(''),
75
+ _useState2 = _slicedToArray(_useState, 2),
76
+ userInput = _useState2[0],
77
+ setUserInput = _useState2[1];
78
+ var _useState3 = useState(null),
79
+ _useState4 = _slicedToArray(_useState3, 2),
80
+ suggestionsAnchorEl = _useState4[0],
81
+ setSuggestionsAnchorEl = _useState4[1];
82
+ var fieldContainerRef = useRef(null);
83
+ var fieldInputRef = useRef(null);
84
+ var isMenuOpened = Boolean(suggestionsAnchorEl);
85
+ var showPrimaryButton = Boolean(typeof onClickPrimaryButton === 'function' && primaryActionButtonText);
86
+ var showSecondaryButton = Boolean(typeof onClickSecondaryButton === 'function' && secondaryActionButtonText && value.length > 0);
87
+ var showActionButtons = showPrimaryButton || showSecondaryButton;
88
+ var availableSuggestions = useMemo(function () {
89
+ return (suggestions || []).filter(function (suggestion) {
90
+ return !value.includes(getValue(suggestion));
91
+ });
92
+ }, [suggestions, value]);
93
+ var filteredSuggestions = useMemo(function () {
94
+ var loweredInput = userInput.toLowerCase();
95
+ return userInput ? availableSuggestions.filter(function (_ref2) {
96
+ var name = _ref2.name,
97
+ email = _ref2.email;
98
+ return name && name.toLowerCase().includes(loweredInput) || email && email.toLowerCase().includes(loweredInput);
99
+ }) : availableSuggestions;
100
+ }, [userInput, availableSuggestions]);
101
+ var handleTagAdd = function handleTagAdd(item, type) {
102
+ if (!item) return;
103
+ onAdd(item, type);
104
+ };
105
+ var handleSelectSuggestion = function handleSelectSuggestion(selectedSuggestion) {
106
+ closeMenu(); // TODO: do we need this?
107
+ setUserInput('');
108
+ handleTagAdd(selectedSuggestion, INPUT_TYPE.SUGGESTION);
109
+ };
110
+ var handleUserInputKeyDown = function handleUserInputKeyDown(event) {
111
+ if (event.key === 'Enter' && userInput) {
112
+ event.preventDefault();
113
+ var firstNotDisabledFilteredSuggestion = filteredSuggestions.find(function (suggestion) {
114
+ return !(suggestion !== null && suggestion !== void 0 && suggestion.disabled);
115
+ });
116
+ if (onEnterSelectFirstSuggestion && firstNotDisabledFilteredSuggestion) {
117
+ handleSelectSuggestion(firstNotDisabledFilteredSuggestion);
118
+ } else {
119
+ handleTagAdd(userInput, INPUT_TYPE.USER_INPUT);
120
+ }
121
+ setUserInput('');
122
+ } else if (event.key === 'Backspace' && !userInput) {
123
+ var index = selectedItems.length - 1;
124
+ if (index > -1) {
125
+ _onRemove(getValue(selectedItems[index]), index);
126
+ }
127
+ } else if (event.key === 'Escape') {
128
+ event.stopPropagation();
129
+ event.preventDefault();
130
+ setUserInput('');
131
+ closeMenu();
132
+ }
133
+ };
134
+ var openMenu = function openMenu() {
135
+ return setSuggestionsAnchorEl(fieldContainerRef.current);
136
+ };
137
+ var closeMenu = function closeMenu() {
138
+ return setSuggestionsAnchorEl(null);
139
+ };
140
+ var highlightSearchQuery = function highlightSearchQuery(text) {
141
+ return userInput ? /*#__PURE__*/_jsx(TextWithHighlights, {
142
+ text: text || '',
143
+ highlightText: userInput || ''
144
+ }) : text;
145
+ };
146
+ var renderMenuItemFn = typeof renderMenuItem === 'function' ? renderMenuItem : function (suggestion, _ref3) {
147
+ var selectSuggestion = _ref3.selectSuggestion;
148
+ return /*#__PURE__*/_jsxs(Styled.OptionMenuItem, {
149
+ disabled: !!suggestion.disabled,
150
+ onClick: function onClick() {
151
+ return selectSuggestion(suggestion);
152
+ },
153
+ children: [/*#__PURE__*/_jsx(Avatar, {
154
+ photo: suggestion.photo_uri || suggestion.photo
155
+ }), /*#__PURE__*/_jsxs(Styled.OptionDesc, {
156
+ children: [/*#__PURE__*/_jsxs(Styled.OptionDescTitle, {
157
+ children: [/*#__PURE__*/_jsx("span", {
158
+ children: suggestion.name ? highlightSearchQuery(suggestion.name) : '---'
159
+ }), suggestion.disabled && disabledOptionTooltip && /*#__PURE__*/_jsx(TooltipV2, {
160
+ title: disabledOptionTooltip,
161
+ position: "right",
162
+ children: /*#__PURE__*/_jsx(InfoIcon, {})
163
+ })]
164
+ }), /*#__PURE__*/_jsx(Styled.OptionDescSubtitle, {
165
+ children: highlightSearchQuery(suggestion.email)
166
+ })]
167
+ })]
168
+ }, getValue(suggestion));
169
+ };
170
+ var handleRenderMenuItem = function handleRenderMenuItem(suggestion) {
171
+ return renderMenuItemFn(suggestion, {
172
+ selectSuggestion: disabled || suggestion !== null && suggestion !== void 0 && suggestion.disabled ? function () {} : handleSelectSuggestion
173
+ });
174
+ };
175
+ var removeAllItems = function removeAllItems() {
176
+ setUserInput('');
177
+ onClickSecondaryButton();
178
+ };
179
+ var getTagsIcon = function getTagsIcon(item) {
180
+ if (typeof renderTagIcon === 'function') return renderTagIcon(item);
181
+ return /*#__PURE__*/_jsx(Avatar, {
182
+ photo: item.photo_uri || item.photo,
183
+ size: 16,
184
+ iconSize: 7
185
+ });
186
+ };
187
+ var menuItemsArray = suggestionsGroups && suggestionsGroups.length > 0 ? suggestionsGroups.reduce(function (accum, _ref4) {
188
+ var label = _ref4.label,
189
+ filterFn = _ref4.filterFn;
190
+ var filteredItems = filteredSuggestions.filter(filterFn);
191
+ return filteredItems.length > 0 ? [].concat(_toConsumableArray(accum), [/*#__PURE__*/_jsx(Styled.Label, {
192
+ children: label
193
+ }, label)], _toConsumableArray(filteredItems.map(handleRenderMenuItem))) : accum;
194
+ }, []) : filteredSuggestions.map(handleRenderMenuItem);
195
+ useEffect(function () {
196
+ if (isMenuOpened && typeof onOpenMenu === 'function') {
197
+ onOpenMenu();
198
+ } else if (!isMenuOpened && typeof onCloseMenu === 'function') {
199
+ onCloseMenu();
200
+ }
201
+ }, [isMenuOpened]);
202
+ return /*#__PURE__*/_jsxs(_Fragment, {
203
+ children: [/*#__PURE__*/_jsxs(Styled.Container, {
204
+ className: "filerobot-common-UsersAutocomplete",
205
+ children: [label && /*#__PURE__*/_jsx(Styled.Label, {
206
+ error: error,
207
+ children: label
208
+ }), /*#__PURE__*/_jsxs(Styled.FieldContainerWrapper, {
209
+ children: [/*#__PURE__*/_jsxs(Styled.FieldContainer, {
210
+ fullWidth: Boolean(fullWidth),
211
+ ref: fieldContainerRef,
212
+ maxHeight: maxHeight,
213
+ tabIndex: -1,
214
+ onClick: function onClick(_ref5) {
215
+ var currentTarget = _ref5.currentTarget;
216
+ if (currentTarget) {
217
+ var inputElem = currentTarget.querySelector('input');
218
+ if (inputElem) inputElem.focus();
219
+ }
220
+ },
221
+ onBlur: function onBlur() {
222
+ if (!isMenuOpened) {
223
+ setUserInput('');
224
+ }
225
+ },
226
+ children: [(selectedItems || []).map(function (item, index) {
227
+ return /*#__PURE__*/_jsx(Styled.FieldItem, {
228
+ children: /*#__PURE__*/_jsx(Tag, {
229
+ label: typeof renderTagLabel === 'function' ? renderTagLabel(item) : item === null || item === void 0 ? void 0 : item.email,
230
+ icon: function icon() {
231
+ return getTagsIcon(item);
232
+ },
233
+ onRemove: function onRemove() {
234
+ return _onRemove(getValue(item), index);
235
+ },
236
+ onClick: function onClick(event) {
237
+ event.preventDefault();
238
+ event.stopPropagation();
239
+ }
240
+ })
241
+ }, getValue(item));
242
+ }), loading ? /*#__PURE__*/_jsx(Styled.FieldItemLoader, {
243
+ children: /*#__PURE__*/_jsx(Spinner, {
244
+ color: "#768184"
245
+ })
246
+ }) : /*#__PURE__*/_jsx(Styled.FieldItemInput, {
247
+ ref: fieldInputRef,
248
+ value: userInput,
249
+ type: "text",
250
+ autoComplete: "off",
251
+ placeholder: !showPlaceholderOnlyWhenNoSelection || selectedItems.length === 0 ? placeholder : undefined,
252
+ onChange: function onChange(ev) {
253
+ setUserInput(ev.target.value);
254
+ if (ev.target.value) openMenu();
255
+ },
256
+ onKeyDown: handleUserInputKeyDown,
257
+ readOnly: readOnly,
258
+ disabled: disabled,
259
+ onFocus: function onFocus() {
260
+ // TODO: Do we need this?
261
+ // if (userInput) {
262
+ // openMenu()
263
+ // }
264
+ },
265
+ noSelection: selectedItems.length === 0,
266
+ isMenuOpened: isMenuOpened
267
+ })]
268
+ }), showActionButtons && /*#__PURE__*/_jsxs(Styled.ActionButtonWrapper, {
269
+ children: [showPrimaryButton && /*#__PURE__*/_jsx(Button, {
270
+ size: "sm",
271
+ color: "link-basic-primary",
272
+ onClick: onClickPrimaryButton,
273
+ children: primaryActionButtonText
274
+ }), showSecondaryButton && /*#__PURE__*/_jsx(Button, {
275
+ color: "link-secondary",
276
+ size: "sm",
277
+ onClick: removeAllItems,
278
+ children: secondaryActionButtonText
279
+ })]
280
+ })]
281
+ }), hint && /*#__PURE__*/_jsx(FormHint, {
282
+ error: error,
283
+ children: hint
284
+ })]
285
+ }), menuItemsArray.length > 0 && isMenuOpened && /*#__PURE__*/_jsx(Menu, {
286
+ anchorEl: suggestionsAnchorEl,
287
+ open: isMenuOpened,
288
+ onClose: function onClose() {
289
+ closeMenu();
290
+ setUserInput('');
291
+ },
292
+ hideScroll: false,
293
+ style: _objectSpread({
294
+ maxHeight: maxMenuHeight,
295
+ padding: 8,
296
+ marginTop: 1,
297
+ background: '#ffffff'
298
+ }, menuStyles),
299
+ children: menuItemsArray
300
+ })]
301
+ });
302
+ };
303
+ export default UsersAutocomplete;
@@ -0,0 +1,33 @@
1
+ var _templateObject, _templateObject2, _templateObject3;
2
+ function _taggedTemplateLiteral(e, t) { return t || (t = e.slice(0)), Object.freeze(Object.defineProperties(e, { raw: { value: Object.freeze(t) } })); }
3
+ import styled from 'styled-components';
4
+ var RootContainer = styled.div(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n overflow: hidden;\n"])));
5
+ var GridContainer = styled.div.attrs(function (_ref) {
6
+ var _ref$$transform = _ref.$transform,
7
+ $transform = _ref$$transform === void 0 ? 0 : _ref$$transform,
8
+ $height = _ref.$height;
9
+ return {
10
+ style: {
11
+ transform: "translateY(".concat($transform, "px)"),
12
+ height: $height
13
+ }
14
+ };
15
+ })(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n overflow: hidden;\n width: 100%;\n height: 100%;\n gap: ", ";\n will-change: transform;\n display: grid;\n grid-template-columns: ", ";\n grid-auto-rows: max-content;\n padding-right: 1px; // for making sure that the last items in the row borders/edges will be shown without being hidden.\n"])), function (_ref2) {
16
+ var _ref2$gap = _ref2.gap,
17
+ gap = _ref2$gap === void 0 ? '16px' : _ref2$gap;
18
+ return gap;
19
+ }, function (_ref3) {
20
+ var _ref3$columnMinWidth = _ref3.columnMinWidth,
21
+ columnMinWidth = _ref3$columnMinWidth === void 0 ? 214 : _ref3$columnMinWidth;
22
+ return "repeat(auto-fill, minmax(".concat(columnMinWidth, "px, 1fr))");
23
+ });
24
+ var EmptyItem = styled.div(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n visibility: hidden;\n pointer-events: none;\n flex-basis: ", "px;\n"])), function (_ref4) {
25
+ var $width = _ref4.$width;
26
+ return $width;
27
+ });
28
+ var Styled = {
29
+ RootContainer: RootContainer,
30
+ GridContainer: GridContainer,
31
+ EmptyItem: EmptyItem
32
+ };
33
+ export default Styled;
@@ -0,0 +1,38 @@
1
+ var _excluded = ["height"];
2
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
3
+ function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
4
+ function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
5
+ export var getLayoutInfo = function getLayoutInfo(gridContainer, scrollableParent, columnMinWidth) {
6
+ if (!gridContainer || !scrollableParent) return {};
7
+ var _gridContainer$getBou = gridContainer.getBoundingClientRect(),
8
+ width = _gridContainer$getBou.width;
9
+ var _gridContainer$firstC = gridContainer.firstChild,
10
+ firstChild = _gridContainer$firstC === void 0 ? {} : _gridContainer$firstC;
11
+ var _ref = (firstChild === null || firstChild === void 0 ? void 0 : firstChild.getBoundingClientRect()) || {},
12
+ elementHeight = _ref.height,
13
+ boundingRect = _objectWithoutProperties(_ref, _excluded);
14
+ var elementWidth = boundingRect.width || columnMinWidth;
15
+ var _window$getComputedSt = window.getComputedStyle(gridContainer),
16
+ rowGap = _window$getComputedSt.rowGap,
17
+ columnGap = _window$getComputedSt.columnGap;
18
+ rowGap = parseFloat(rowGap) || 0;
19
+ columnGap = parseFloat(columnGap) || 0;
20
+ var visibleHeight = scrollableParent.clientHeight;
21
+ // We are adding the row/column gap to the height/width, cause the gaps are applied for the rows/columns' count - 1
22
+ // if we didn't add the gap to the height/width, the equation's result won't be accurate as there is additional pixels (for additional un-rendered gap) considered
23
+ // So we are considering removing that additional pixels by adding the gap to the height/width and in that case it will be removed after dividing by the element's height/width + gap
24
+ // Summary: grid N elements have N-1 gaps, adding the gap to the element's height/width will add additional gap in the calculations but it is not added in the DOM, we're removing that by adding the gap to the container's height/width
25
+ var rowsCount = Math.floor((visibleHeight + rowGap) / (elementHeight + rowGap)) || 1;
26
+ var columnsCount = Math.floor((width + columnGap) / (elementWidth + columnGap)) || 1;
27
+ return {
28
+ elementWidth: elementWidth,
29
+ elementHeight: elementHeight,
30
+ columnsCount: columnsCount,
31
+ rowsCount: rowsCount,
32
+ rowGap: rowGap,
33
+ columnGap: columnGap
34
+ };
35
+ };
36
+ export var defaultGetItemKey = function defaultGetItemKey(item, index) {
37
+ return (_typeof(item) === 'object' ? item.uuid || item.id : item) || index;
38
+ };
@@ -0,0 +1,15 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
3
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
4
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
5
+ import { memo, cloneElement, Children } from 'react';
6
+ var VirtualGridItem = function VirtualGridItem(_ref) {
7
+ var children = _ref.children,
8
+ item = _ref.item,
9
+ itemPropName = _ref.itemPropName,
10
+ index = _ref.index;
11
+ return typeof children === 'function' ? children(item) : Children.map(children, function (child) {
12
+ return /*#__PURE__*/cloneElement(child, _defineProperty(_defineProperty({}, itemPropName, item), "index", index));
13
+ });
14
+ };
15
+ export default /*#__PURE__*/memo(VirtualGridItem);
@@ -0,0 +1,252 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
3
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
4
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
5
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
6
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
7
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
8
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
9
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
10
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
11
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
12
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
13
+ import { memo, useCallback, useEffect, useRef, useState, useMemo } from 'react';
14
+ import getScrollableParent from '@scaleflex/widget-explorer/lib/utils/getScrollableParent';
15
+ import StyledVirtualGrid from './VirtualGrid.styled';
16
+ import VirtualGridItem from './VirtualGridItem';
17
+ import { defaultGetItemKey, getLayoutInfo } from './VirtualGrid.utils';
18
+
19
+ // TODO: Refactor the VirtualGrid to consider also the skeleton loading to avoid jumping, and use the same size of skeleton's and align items size.
20
+ /**
21
+ * A Virtual grid that applies (windowing) concept for reusing the DOM elements and avoid rerendering for all items.
22
+ * @param {Array} items - The items that will be used in the grid (required).
23
+ * @param {ReactNode} children - The children that will be rendered for each item (required).
24
+ * @param {String} injectedItemPropName - The name of the prop that will be injected in the children (optional).
25
+ * @param {Number} overscan - The number of items that will be rendered before and after the viewport in rows (optional).
26
+ * @param {Function} getItemKey - The function that will be used to get the item key (optional).
27
+ * @param {Boolean} stopChildEventsPropagation - if `true`, the children's items click events won't be propagated outside of the virtual grid component (incase of needing to handle some specific case on grid's container empty space click).
28
+ * @param {Number} columnMinWidth - The minimum width of the column in pixels (optional - default is 214px).
29
+ * @param {String} scrollToKeyOnMount - The key of the item that will be scrolled to on mount the grid (optional).
30
+ * @param {ReactRef} apiRef - the reference that will contain the api functions to deal with the grid (optional)
31
+ * 1- `scrollToItem({ key, index })` function that scrolls the grid to the specified item's key, the key should be the same property that's returned from getItemKey, index should be the item's index.
32
+ * @returns {ReactNode} - The VirtualGrid component.
33
+ */
34
+ import { jsx as _jsx } from "react/jsx-runtime";
35
+ var MARGIN_BOTTOM_SPACE = 24;
36
+ var DEFAULT_LAYOUT_INFO = {
37
+ // ELEMENT_HEIGHT => Used to know that we haven't auto recognized the element's height yet hence fit to the container's height for avoiding jumping effect.
38
+ ELEMENT_HEIGHT: -1,
39
+ COLS_COUNT: 6,
40
+ ROWS_COUNT: 6,
41
+ ROW_GAP: 0
42
+ };
43
+ var calcGappedElementHeight = function calcGappedElementHeight(elementHeight, rowGap) {
44
+ return Math.abs(elementHeight) + rowGap;
45
+ };
46
+ var VirtualGrid = function VirtualGrid(_ref) {
47
+ var children = _ref.children,
48
+ _ref$items = _ref.items,
49
+ items = _ref$items === void 0 ? [] : _ref$items,
50
+ _ref$injectedItemProp = _ref.injectedItemPropName,
51
+ injectedItemPropName = _ref$injectedItemProp === void 0 ? 'item' : _ref$injectedItemProp,
52
+ _ref$overscan = _ref.overscan,
53
+ overscan = _ref$overscan === void 0 ? 3 : _ref$overscan,
54
+ _ref$columnMinWidth = _ref.columnMinWidth,
55
+ columnMinWidth = _ref$columnMinWidth === void 0 ? 214 : _ref$columnMinWidth,
56
+ _ref$getItemKey = _ref.getItemKey,
57
+ getItemKey = _ref$getItemKey === void 0 ? defaultGetItemKey : _ref$getItemKey,
58
+ _ref$stopChildEventsP = _ref.stopChildEventsPropagation,
59
+ stopChildEventsPropagation = _ref$stopChildEventsP === void 0 ? true : _ref$stopChildEventsP,
60
+ apiRef = _ref.apiRef,
61
+ gap = _ref.gap,
62
+ role = _ref.role,
63
+ ariaLabel = _ref.ariaLabel;
64
+ var _useState = useState(0),
65
+ _useState2 = _slicedToArray(_useState, 2),
66
+ scrollTop = _useState2[0],
67
+ setScrollTop = _useState2[1];
68
+ var _useState3 = useState({
69
+ elementHeight: DEFAULT_LAYOUT_INFO.ELEMENT_HEIGHT,
70
+ columnsCount: DEFAULT_LAYOUT_INFO.COLS_COUNT,
71
+ rowsCount: DEFAULT_LAYOUT_INFO.ROWS_COUNT,
72
+ rowGap: DEFAULT_LAYOUT_INFO.ROW_GAP
73
+ }),
74
+ _useState4 = _slicedToArray(_useState3, 2),
75
+ layoutInfo = _useState4[0],
76
+ setLayoutInfo = _useState4[1];
77
+ var isUnMounting = useRef(false);
78
+ var scrollableElementRef = useRef(null);
79
+ // Same value of the state, but to be used in static reference functions for avoiding re-rendering and improve perf.
80
+ var layoutInfoRef = useRef(layoutInfo);
81
+ var gridContainerRef = useRef(null);
82
+ var animationFramesIds = useRef({
83
+ resize: null,
84
+ scroll: null
85
+ });
86
+ var gappedElementHeight = calcGappedElementHeight(layoutInfo.elementHeight, layoutInfo.rowGap);
87
+ var rowsOffset = Math.max(Math.floor(scrollTop / gappedElementHeight) - overscan, 0);
88
+ var offsetY = Math.max(0, rowsOffset * gappedElementHeight - MARGIN_BOTTOM_SPACE);
89
+ var containerHeight = useMemo(function () {
90
+ // Fit the container's height if the element's height not yet recognized for avoiding jumping effect.
91
+ if (layoutInfo.elementHeight === DEFAULT_LAYOUT_INFO.ELEMENT_HEIGHT) {
92
+ return '100%';
93
+ }
94
+ var totalRowsCount = Math.ceil(items.length / layoutInfo.columnsCount);
95
+ return Math.ceil(totalRowsCount * layoutInfo.elementHeight + layoutInfo.rowGap * (totalRowsCount - 1)) + MARGIN_BOTTOM_SPACE;
96
+ }, [items.length, layoutInfo.columnsCount, layoutInfo.elementHeight, layoutInfo.rowGap]);
97
+ var calculateLayoutInfo = useCallback(function () {
98
+ if (isUnMounting.current) {
99
+ return;
100
+ }
101
+ if (animationFramesIds.current.resize) {
102
+ cancelAnimationFrame(animationFramesIds.current.resize);
103
+ animationFramesIds.current.resize = null;
104
+ }
105
+ animationFramesIds.current.resize = requestAnimationFrame(function () {
106
+ var gridContainer = gridContainerRef.current;
107
+ var _getLayoutInfo = getLayoutInfo(gridContainer, scrollableElementRef.current, columnMinWidth),
108
+ _getLayoutInfo$elemen = _getLayoutInfo.elementWidth,
109
+ elementWidth = _getLayoutInfo$elemen === void 0 ? 1 : _getLayoutInfo$elemen,
110
+ _getLayoutInfo$elemen2 = _getLayoutInfo.elementHeight,
111
+ elementHeight = _getLayoutInfo$elemen2 === void 0 ? DEFAULT_LAYOUT_INFO.ELEMENT_HEIGHT : _getLayoutInfo$elemen2,
112
+ _getLayoutInfo$column = _getLayoutInfo.columnsCount,
113
+ columnsCount = _getLayoutInfo$column === void 0 ? DEFAULT_LAYOUT_INFO.COLS_COUNT : _getLayoutInfo$column,
114
+ _getLayoutInfo$rowsCo = _getLayoutInfo.rowsCount,
115
+ rowsCount = _getLayoutInfo$rowsCo === void 0 ? DEFAULT_LAYOUT_INFO.ROWS_COUNT : _getLayoutInfo$rowsCo,
116
+ _getLayoutInfo$rowGap = _getLayoutInfo.rowGap,
117
+ rowGap = _getLayoutInfo$rowGap === void 0 ? DEFAULT_LAYOUT_INFO.ROW_GAP : _getLayoutInfo$rowGap;
118
+ animationFramesIds.current.resize = null;
119
+ if (elementWidth === 0 || elementHeight === 0) {
120
+ return;
121
+ }
122
+ var newLayoutInfo = {
123
+ elementHeight: elementHeight,
124
+ columnsCount: columnsCount,
125
+ rowsCount: rowsCount,
126
+ rowGap: rowGap
127
+ };
128
+ layoutInfoRef.current = newLayoutInfo;
129
+ setLayoutInfo(newLayoutInfo);
130
+ handleScroll();
131
+ });
132
+ }, [columnMinWidth]);
133
+ var calculateLayoutInfoOnUiEffect = useCallback(function (element) {
134
+ isUnMounting.current = !element;
135
+ calculateLayoutInfo();
136
+ }, [calculateLayoutInfo]);
137
+ var scrollToItem = useCallback(function (_ref2) {
138
+ var key = _ref2.key,
139
+ index = _ref2.index;
140
+ var currentLayoutInfo = layoutInfoRef.current;
141
+ var hasKeyOrIndex = key || index || key === 0 || index === 0;
142
+ if (currentLayoutInfo && hasKeyOrIndex && items.length > 0) {
143
+ var itemIndex = index !== null && index !== void 0 ? index : items.findIndex(function (item) {
144
+ return getItemKey(item) === key;
145
+ });
146
+ if (itemIndex > -1) {
147
+ var _gridContainerRef$cur;
148
+ var itemRow = Math.floor(itemIndex / currentLayoutInfo.columnsCount);
149
+ var currentGappedElementHeight = calcGappedElementHeight(currentLayoutInfo.elementHeight, currentLayoutInfo.rowGap);
150
+ var itemOffset = itemRow * currentGappedElementHeight - currentGappedElementHeight;
151
+ scrollableElementRef.current.scrollTo({
152
+ top: (((_gridContainerRef$cur = gridContainerRef.current) === null || _gridContainerRef$cur === void 0 ? void 0 : _gridContainerRef$cur.offsetTop) || 0) + itemOffset,
153
+ behavior: 'smooth'
154
+ });
155
+ }
156
+ }
157
+ }, [items]);
158
+ var handleScroll = useCallback(function (e) {
159
+ var _target$scrollTop;
160
+ if (isUnMounting.current) {
161
+ return;
162
+ }
163
+ if (animationFramesIds.current.scroll) {
164
+ cancelAnimationFrame(animationFramesIds.current.scroll);
165
+ animationFramesIds.current.scroll = null;
166
+ }
167
+ var target = (e === null || e === void 0 ? void 0 : e.currentTarget) || scrollableElementRef.current;
168
+ var scrollTopValue = target ? (_target$scrollTop = target.scrollTop) !== null && _target$scrollTop !== void 0 ? _target$scrollTop : target.scrollY : 0;
169
+ var _ref3 = gridContainerRef.current || {},
170
+ _ref3$offsetTop = _ref3.offsetTop,
171
+ offsetTop = _ref3$offsetTop === void 0 ? 0 : _ref3$offsetTop,
172
+ _ref3$offsetHeight = _ref3.offsetHeight,
173
+ offsetHeight = _ref3$offsetHeight === void 0 ? 0 : _ref3$offsetHeight;
174
+ var scrollTopRelativeToGridContainer = scrollTopValue - offsetTop;
175
+ animationFramesIds.current.scroll = requestAnimationFrame(function () {
176
+ animationFramesIds.current.scroll = null;
177
+ // TODO: Check maybe we shouldn't trigger change in state unless the row is almost getting to change for avoiding additional rerender?.
178
+ // But maybe it won't make the component's scroll smooth so it's need a check to make sure of that.
179
+ setScrollTop(Math.min(Math.max(0, scrollTopRelativeToGridContainer), offsetHeight));
180
+ });
181
+ }, []);
182
+ var handleGridContainerClick = useCallback(function (e) {
183
+ if (e.target !== e.currentTarget && stopChildEventsPropagation) {
184
+ e.stopPropagation();
185
+ }
186
+ }, []);
187
+ useEffect(function () {
188
+ if (apiRef) {
189
+ apiRef.current = _objectSpread(_objectSpread({}, apiRef.current), {}, {
190
+ scrollToItem: scrollToItem
191
+ });
192
+ }
193
+ }, [scrollToItem]);
194
+ useEffect(function () {
195
+ scrollableElementRef.current = getScrollableParent(gridContainerRef.current);
196
+ var scrollableElement = scrollableElementRef.current;
197
+ scrollableElement.addEventListener('scroll', handleScroll, {
198
+ passive: true
199
+ });
200
+ return function () {
201
+ scrollableElement.removeEventListener('scroll', handleScroll);
202
+ cancelAnimationFrame(animationFramesIds.current.scroll);
203
+ cancelAnimationFrame(animationFramesIds.current.resize);
204
+ };
205
+ }, [containerHeight]);
206
+ useEffect(function () {
207
+ window.addEventListener('resize', calculateLayoutInfo);
208
+ var gridContainer = gridContainerRef.current;
209
+ var resizeObserver;
210
+ if (gridContainer) {
211
+ resizeObserver = new ResizeObserver(calculateLayoutInfo);
212
+ resizeObserver.observe(gridContainer);
213
+ }
214
+ return function () {
215
+ window.removeEventListener('resize', calculateLayoutInfo);
216
+ if (resizeObserver) {
217
+ resizeObserver.disconnect();
218
+ }
219
+ };
220
+ }, [calculateLayoutInfo]);
221
+ var renderItem = useCallback(function (item, index) {
222
+ return /*#__PURE__*/_jsx(VirtualGridItem, {
223
+ itemPropName: injectedItemPropName,
224
+ item: item,
225
+ index: index,
226
+ children: children
227
+ }, getItemKey(item, index));
228
+ }, [children, getItemKey, injectedItemPropName]);
229
+ var startItemIndex = Math.max(0, Math.min(rowsOffset * layoutInfo.columnsCount, items.length - layoutInfo.columnsCount));
230
+ var visibleItemsCount = useMemo(function () {
231
+ return layoutInfo.rowsCount * layoutInfo.columnsCount + overscan * layoutInfo.columnsCount * 2;
232
+ }, [layoutInfo.rowsCount, layoutInfo.columnsCount, overscan]);
233
+ return (
234
+ /*#__PURE__*/
235
+ // Adding calculateLayoutInfo in ref here to make sure we call it directly on loading the UI for allowing scrollToItem effect and others.
236
+ _jsx(StyledVirtualGrid.RootContainer, {
237
+ ref: calculateLayoutInfoOnUiEffect,
238
+ children: /*#__PURE__*/_jsx(StyledVirtualGrid.GridContainer, {
239
+ ref: gridContainerRef,
240
+ onClick: handleGridContainerClick,
241
+ $transform: offsetY,
242
+ $height: containerHeight,
243
+ columnMinWidth: columnMinWidth,
244
+ gap: gap,
245
+ role: role,
246
+ "aria-label": ariaLabel,
247
+ children: items.slice(startItemIndex, startItemIndex + visibleItemsCount).map(renderItem)
248
+ })
249
+ })
250
+ );
251
+ };
252
+ export default /*#__PURE__*/memo(VirtualGrid);