@parca/profile 0.19.139 → 0.19.142

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 (170) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/GraphTooltipArrow/Content.js +224 -30
  3. package/dist/GraphTooltipArrow/DockedGraphTooltip/index.js +192 -33
  4. package/dist/GraphTooltipArrow/ExpandOnHoverValue.js +53 -3
  5. package/dist/GraphTooltipArrow/index.d.ts.map +1 -1
  6. package/dist/GraphTooltipArrow/index.js +86 -56
  7. package/dist/GraphTooltipArrow/useGraphTooltip/index.js +37 -37
  8. package/dist/GraphTooltipArrow/useGraphTooltipMetaInfo/index.js +103 -73
  9. package/dist/MatchersInput/SuggestionItem.js +91 -12
  10. package/dist/MatchersInput/SuggestionsList.d.ts +2 -1
  11. package/dist/MatchersInput/SuggestionsList.d.ts.map +1 -1
  12. package/dist/MatchersInput/SuggestionsList.js +371 -157
  13. package/dist/MatchersInput/SuggestionsList.test.d.ts +2 -0
  14. package/dist/MatchersInput/SuggestionsList.test.d.ts.map +1 -0
  15. package/dist/MatchersInput/index.js +308 -115
  16. package/dist/MetricsCircle/index.js +39 -3
  17. package/dist/MetricsGraph/MetricsContextMenu/index.js +119 -19
  18. package/dist/MetricsGraph/MetricsInfoPanel/index.js +81 -20
  19. package/dist/MetricsGraph/MetricsTooltip/index.d.ts.map +1 -1
  20. package/dist/MetricsGraph/MetricsTooltip/index.js +107 -74
  21. package/dist/MetricsGraph/index.js +552 -203
  22. package/dist/MetricsGraph/useMetricsGraphDimensions.js +46 -25
  23. package/dist/MetricsGraph/utils/colorMapping.js +24 -17
  24. package/dist/MetricsSeries/index.js +70 -7
  25. package/dist/PreSelectedMatchers/index.d.ts.map +1 -1
  26. package/dist/PreSelectedMatchers/index.js +249 -102
  27. package/dist/ProfileExplorer/ProfileExplorerCompare.js +240 -49
  28. package/dist/ProfileExplorer/ProfileExplorerSingle.js +98 -11
  29. package/dist/ProfileExplorer/index.js +183 -32
  30. package/dist/ProfileFlameChart/SamplesStrips/SamplesGraph/index.js +333 -148
  31. package/dist/ProfileFlameChart/SamplesStrips/SamplesStrips.stories.js +69 -35
  32. package/dist/ProfileFlameChart/SamplesStrips/index.js +645 -134
  33. package/dist/ProfileFlameChart/SamplesStrips/labelSetUtils.js +114 -55
  34. package/dist/ProfileFlameChart/index.js +266 -134
  35. package/dist/ProfileFlameGraph/FlameGraphArrow/ContextMenu.js +287 -88
  36. package/dist/ProfileFlameGraph/FlameGraphArrow/ContextMenuWrapper.js +56 -20
  37. package/dist/ProfileFlameGraph/FlameGraphArrow/FlameGraphNodes.js +211 -140
  38. package/dist/ProfileFlameGraph/FlameGraphArrow/MemoizedTooltip.js +133 -38
  39. package/dist/ProfileFlameGraph/FlameGraphArrow/MiniMap.js +261 -216
  40. package/dist/ProfileFlameGraph/FlameGraphArrow/TextWithEllipsis.d.ts.map +1 -1
  41. package/dist/ProfileFlameGraph/FlameGraphArrow/TextWithEllipsis.js +71 -45
  42. package/dist/ProfileFlameGraph/FlameGraphArrow/TooltipContext.d.ts.map +1 -1
  43. package/dist/ProfileFlameGraph/FlameGraphArrow/TooltipContext.js +58 -28
  44. package/dist/ProfileFlameGraph/FlameGraphArrow/ZoomControls.d.ts.map +1 -1
  45. package/dist/ProfileFlameGraph/FlameGraphArrow/ZoomControls.js +59 -8
  46. package/dist/ProfileFlameGraph/FlameGraphArrow/index.js +396 -179
  47. package/dist/ProfileFlameGraph/FlameGraphArrow/useBatchedRendering.d.ts.map +1 -1
  48. package/dist/ProfileFlameGraph/FlameGraphArrow/useBatchedRendering.js +68 -50
  49. package/dist/ProfileFlameGraph/FlameGraphArrow/useMappingList.js +62 -38
  50. package/dist/ProfileFlameGraph/FlameGraphArrow/useNodeColor.js +14 -6
  51. package/dist/ProfileFlameGraph/FlameGraphArrow/useScrollViewport.js +124 -82
  52. package/dist/ProfileFlameGraph/FlameGraphArrow/useVisibleNodes.js +160 -98
  53. package/dist/ProfileFlameGraph/FlameGraphArrow/useZoom.js +232 -112
  54. package/dist/ProfileFlameGraph/FlameGraphArrow/utils.js +137 -114
  55. package/dist/ProfileFlameGraph/benchmarks/benchdata/populateData.js +85 -0
  56. package/dist/ProfileFlameGraph/index.js +324 -148
  57. package/dist/ProfileMetricsGraph/hooks/useQueryRange.js +140 -32
  58. package/dist/ProfileMetricsGraph/index.js +518 -259
  59. package/dist/ProfileSelector/CompareButton.js +132 -12
  60. package/dist/ProfileSelector/MetricsGraphSection.js +234 -67
  61. package/dist/ProfileSelector/index.d.ts.map +1 -1
  62. package/dist/ProfileSelector/index.js +730 -142
  63. package/dist/ProfileSelector/useAutoQuerySelector.js +249 -130
  64. package/dist/ProfileSource.js +230 -163
  65. package/dist/ProfileTypeSelector/index.js +214 -125
  66. package/dist/ProfileView/components/ActionButtons/GroupByDropdown.js +50 -4
  67. package/dist/ProfileView/components/ActionButtons/SortByDropdown.js +139 -33
  68. package/dist/ProfileView/components/ColorStackLegend.js +184 -55
  69. package/dist/ProfileView/components/DashboardItems/index.js +87 -28
  70. package/dist/ProfileView/components/DashboardLayout/index.js +108 -16
  71. package/dist/ProfileView/components/DiffLegend.js +172 -29
  72. package/dist/ProfileView/components/GroupByLabelsDropdown/index.js +199 -55
  73. package/dist/ProfileView/components/InvertCallStack/index.js +99 -10
  74. package/dist/ProfileView/components/ProfileFilters/filterPresets.js +260 -315
  75. package/dist/ProfileView/components/ProfileFilters/index.js +518 -215
  76. package/dist/ProfileView/components/ProfileFilters/useProfileFilters.js +370 -306
  77. package/dist/ProfileView/components/ProfileFilters/useProfileFiltersUrlState.js +188 -120
  78. package/dist/ProfileView/components/ProfileHeader/index.js +105 -11
  79. package/dist/ProfileView/components/ShareButton/ResultBox.js +119 -16
  80. package/dist/ProfileView/components/ShareButton/index.js +352 -62
  81. package/dist/ProfileView/components/Toolbars/MultiLevelDropdown.d.ts.map +1 -1
  82. package/dist/ProfileView/components/Toolbars/MultiLevelDropdown.js +675 -195
  83. package/dist/ProfileView/components/Toolbars/SwitchMenuItem.js +94 -7
  84. package/dist/ProfileView/components/Toolbars/TableColumnsDropdown.js +198 -157
  85. package/dist/ProfileView/components/Toolbars/index.js +441 -21
  86. package/dist/ProfileView/components/ViewSelector/Dropdown.js +233 -22
  87. package/dist/ProfileView/components/ViewSelector/index.js +211 -91
  88. package/dist/ProfileView/components/VisualizationContainer/index.d.ts.map +1 -1
  89. package/dist/ProfileView/components/VisualizationContainer/index.js +52 -7
  90. package/dist/ProfileView/components/VisualizationPanel.js +185 -8
  91. package/dist/ProfileView/context/DashboardContext.js +84 -28
  92. package/dist/ProfileView/context/ProfileViewContext.js +56 -15
  93. package/dist/ProfileView/hooks/useAutoSelectDimension.js +71 -41
  94. package/dist/ProfileView/hooks/useProfileMetadata.js +50 -18
  95. package/dist/ProfileView/hooks/useResetFlameGraphState.js +31 -10
  96. package/dist/ProfileView/hooks/useResetStateOnProfileTypeChange.js +72 -29
  97. package/dist/ProfileView/hooks/useResetStateOnSeriesChange.js +39 -13
  98. package/dist/ProfileView/hooks/useVisualizationState.js +262 -87
  99. package/dist/ProfileView/index.js +383 -45
  100. package/dist/ProfileView/types/visualization.js +1 -13
  101. package/dist/ProfileView/utils/colorUtils.js +8 -7
  102. package/dist/ProfileViewWithData.js +332 -237
  103. package/dist/QueryControls/index.js +418 -47
  104. package/dist/Sandwich/components/CalleesSection.js +54 -4
  105. package/dist/Sandwich/components/CallersSection.js +97 -27
  106. package/dist/Sandwich/components/TableSection.js +77 -4
  107. package/dist/Sandwich/index.js +125 -12
  108. package/dist/Sandwich/utils/processRowData.js +48 -39
  109. package/dist/SelectWithRefresh/index.js +102 -28
  110. package/dist/SimpleMatchers/Select.js +520 -187
  111. package/dist/SimpleMatchers/index.js +590 -288
  112. package/dist/SourceView/Highlighter.js +230 -70
  113. package/dist/SourceView/LineNo.js +72 -17
  114. package/dist/SourceView/index.js +177 -101
  115. package/dist/SourceView/lang-detector/ext-to-lang.json +798 -798
  116. package/dist/SourceView/lang-detector/index.js +28 -14
  117. package/dist/SourceView/useSelectedLineRange.js +97 -16
  118. package/dist/Table/ColorCell.js +42 -1
  119. package/dist/Table/ColumnsVisibility.js +114 -6
  120. package/dist/Table/MoreDropdown.js +121 -27
  121. package/dist/Table/TableContextMenu.js +150 -139
  122. package/dist/Table/TableContextMenuWrapper.js +59 -14
  123. package/dist/Table/hooks/useColorManagement.js +58 -16
  124. package/dist/Table/hooks/useTableConfiguration.d.ts.map +1 -1
  125. package/dist/Table/hooks/useTableConfiguration.js +331 -168
  126. package/dist/Table/index.js +222 -126
  127. package/dist/Table/utils/functions.js +169 -144
  128. package/dist/Table/utils/topAndBottomExpandedRowModel.js +69 -52
  129. package/dist/TimelineGuide/index.js +209 -16
  130. package/dist/TopTable/benchmarks/benchdata/populateData.js +91 -0
  131. package/dist/TopTable/index.js +340 -122
  132. package/dist/contexts/LabelsQueryProvider.js +94 -32
  133. package/dist/contexts/UnifiedLabelsContext.js +114 -49
  134. package/dist/contexts/utils.js +37 -15
  135. package/dist/hooks/useCompareModeMeta.js +157 -94
  136. package/dist/hooks/useLabels.js +295 -52
  137. package/dist/hooks/useQueryState.js +371 -330
  138. package/dist/index.js +21 -16
  139. package/dist/testdata/fg-diff.json +3750 -0
  140. package/dist/testdata/fg-simple.json +1879 -0
  141. package/dist/testdata/link_data.json +56 -0
  142. package/dist/testdata/tabular.json +30 -0
  143. package/dist/testdata/test_flamegraph.json +26846 -0
  144. package/dist/testdata/test_graph.json +53 -0
  145. package/dist/useDelayedLoader.js +32 -18
  146. package/dist/useGrpcQuery/index.js +71 -11
  147. package/dist/useHasProfileData.js +90 -12
  148. package/dist/useQuery.js +205 -64
  149. package/dist/useSumBy.d.ts.map +1 -1
  150. package/dist/useSumBy.js +294 -138
  151. package/dist/utils.js +62 -30
  152. package/package.json +9 -9
  153. package/src/GraphTooltipArrow/index.tsx +3 -0
  154. package/src/MatchersInput/SuggestionsList.test.tsx +70 -0
  155. package/src/MatchersInput/SuggestionsList.tsx +11 -10
  156. package/src/MatchersInput/index.tsx +1 -1
  157. package/src/MetricsGraph/MetricsTooltip/index.tsx +22 -34
  158. package/src/PreSelectedMatchers/index.tsx +3 -0
  159. package/src/ProfileFlameGraph/FlameGraphArrow/TextWithEllipsis.tsx +3 -0
  160. package/src/ProfileFlameGraph/FlameGraphArrow/TooltipContext.tsx +3 -0
  161. package/src/ProfileFlameGraph/FlameGraphArrow/ZoomControls.tsx +3 -0
  162. package/src/ProfileFlameGraph/FlameGraphArrow/useBatchedRendering.ts +3 -0
  163. package/src/ProfileSelector/index.tsx +30 -7
  164. package/src/ProfileView/components/Toolbars/MultiLevelDropdown.tsx +3 -0
  165. package/src/ProfileView/components/VisualizationContainer/index.tsx +3 -0
  166. package/src/Table/hooks/useTableConfiguration.tsx +7 -13
  167. package/src/useDelayedLoader.ts +10 -10
  168. package/src/useSumBy.ts +12 -18
  169. package/dist/ProfileView/components/ProfileFilters/useProfileFiltersUrlState.test.js +0 -541
  170. package/dist/hooks/useQueryState.test.js +0 -984
@@ -1,4 +1,24 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
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
+ var _excluded = ["items", "selectedKey", "onSelection", "placeholder", "width", "className", "loading", "primary", "disabled", "icon", "id", "optionsClassname", "searchable", "onButtonClick", "editable", "refetchValues", "showLoadingInButton"];
3
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
4
+ 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; }
5
+ 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; }
6
+ 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; }
7
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
8
+ 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); }
9
+ function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
10
+ function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
11
+ function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
12
+ function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
13
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
14
+ 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."); }
15
+ 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; } }
16
+ 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; }
17
+ 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; } }
18
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
19
+ 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; }
20
+ 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; }
21
+ import { c as _c } from "react-compiler-runtime";
2
22
  // Copyright 2022 The Parca Authors
3
23
  // Licensed under the Apache License, Version 2.0 (the "License");
4
24
  // you may not use this file except in compliance with the License.
@@ -11,206 +31,519 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
11
31
  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
32
  // See the License for the specific language governing permissions and
13
33
  // limitations under the License.
14
- import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
34
+
35
+ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
15
36
  import { Icon } from '@iconify/react';
16
37
  import { useVirtualizer } from '@tanstack/react-virtual';
17
38
  import cx from 'classnames';
18
39
  import levenshtein from 'fast-levenshtein';
19
40
  import { Button, DividerWithLabel, RefreshButton, useParcaContext } from '@parca/components';
20
41
  import { TEST_IDS, testId } from '@parca/test-utils/dist/test-ids';
21
- const CustomSelect = ({ items: itemsProp, selectedKey, onSelection, placeholder = 'Select an item', width, className = '', loading, primary = false, disabled = false, icon, id, optionsClassname = '', searchable = false, onButtonClick, editable = false, refetchValues, showLoadingInButton = false, ...restProps }) => {
22
- const { loader } = useParcaContext();
23
- const [isOpen, setIsOpen] = useState(false);
24
- const [focusedIndex, setFocusedIndex] = useState(-1);
25
- const [searchTerm, setSearchTerm] = useState('');
26
- const [debouncedSearchTerm, setDebouncedSearchTerm] = useState('');
27
- const [isRefetching, setIsRefetching] = useState(false);
28
- const containerRef = useRef(null);
29
- const optionsRef = useRef(null);
30
- const searchInputRef = useRef(null);
31
- const handleRefetch = useCallback(async () => {
32
- if (refetchValues == null || isRefetching)
33
- return;
34
- setIsRefetching(true);
35
- try {
36
- await refetchValues();
37
- }
38
- finally {
39
- setIsRefetching(false);
42
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
43
+ var CustomSelect = function CustomSelect(_ref) {
44
+ var itemsProp = _ref.items,
45
+ selectedKey = _ref.selectedKey,
46
+ onSelection = _ref.onSelection,
47
+ _ref$placeholder = _ref.placeholder,
48
+ placeholder = _ref$placeholder === void 0 ? 'Select an item' : _ref$placeholder,
49
+ width = _ref.width,
50
+ _ref$className = _ref.className,
51
+ className = _ref$className === void 0 ? '' : _ref$className,
52
+ loading = _ref.loading,
53
+ _ref$primary = _ref.primary,
54
+ primary = _ref$primary === void 0 ? false : _ref$primary,
55
+ _ref$disabled = _ref.disabled,
56
+ disabled = _ref$disabled === void 0 ? false : _ref$disabled,
57
+ icon = _ref.icon,
58
+ id = _ref.id,
59
+ _ref$optionsClassname = _ref.optionsClassname,
60
+ optionsClassname = _ref$optionsClassname === void 0 ? '' : _ref$optionsClassname,
61
+ _ref$searchable = _ref.searchable,
62
+ searchable = _ref$searchable === void 0 ? false : _ref$searchable,
63
+ onButtonClick = _ref.onButtonClick,
64
+ _ref$editable = _ref.editable,
65
+ editable = _ref$editable === void 0 ? false : _ref$editable,
66
+ refetchValues = _ref.refetchValues,
67
+ _ref$showLoadingInBut = _ref.showLoadingInButton,
68
+ showLoadingInButton = _ref$showLoadingInBut === void 0 ? false : _ref$showLoadingInBut,
69
+ restProps = _objectWithoutProperties(_ref, _excluded);
70
+ var _useParcaContext = useParcaContext(),
71
+ loader = _useParcaContext.loader;
72
+ var _useState = useState(false),
73
+ _useState2 = _slicedToArray(_useState, 2),
74
+ isOpen = _useState2[0],
75
+ setIsOpen = _useState2[1];
76
+ var _useState3 = useState(-1),
77
+ _useState4 = _slicedToArray(_useState3, 2),
78
+ focusedIndex = _useState4[0],
79
+ setFocusedIndex = _useState4[1];
80
+ var _useState5 = useState(''),
81
+ _useState6 = _slicedToArray(_useState5, 2),
82
+ searchTerm = _useState6[0],
83
+ setSearchTerm = _useState6[1];
84
+ var _useState7 = useState(''),
85
+ _useState8 = _slicedToArray(_useState7, 2),
86
+ debouncedSearchTerm = _useState8[0],
87
+ setDebouncedSearchTerm = _useState8[1];
88
+ var _useState9 = useState(false),
89
+ _useState0 = _slicedToArray(_useState9, 2),
90
+ isRefetching = _useState0[0],
91
+ setIsRefetching = _useState0[1];
92
+ var containerRef = useRef(null);
93
+ var optionsRef = useRef(null);
94
+ var searchInputRef = useRef(null);
95
+ var handleRefetch = useCallback(/*#__PURE__*/_asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
96
+ return _regenerator().w(function (_context) {
97
+ while (1) switch (_context.p = _context.n) {
98
+ case 0:
99
+ if (!(refetchValues == null || isRefetching)) {
100
+ _context.n = 1;
101
+ break;
102
+ }
103
+ return _context.a(2);
104
+ case 1:
105
+ setIsRefetching(true);
106
+ _context.p = 2;
107
+ _context.n = 3;
108
+ return refetchValues();
109
+ case 3:
110
+ _context.p = 3;
111
+ setIsRefetching(false);
112
+ return _context.f(3);
113
+ case 4:
114
+ return _context.a(2);
115
+ }
116
+ }, _callee, null, [[2,, 3, 4]]);
117
+ })), [refetchValues, isRefetching]);
118
+ useEffect(function () {
119
+ var timer = setTimeout(function () {
120
+ return setDebouncedSearchTerm(searchTerm);
121
+ }, 150);
122
+ return function () {
123
+ return clearTimeout(timer);
124
+ };
125
+ }, [searchTerm]);
126
+ var items = useMemo(function () {
127
+ if (itemsProp[0] != null && 'type' in itemsProp[0]) {
128
+ return itemsProp.flatMap(function (item) {
129
+ return item.values.map(function (v) {
130
+ return _objectSpread(_objectSpread({}, v), {}, {
131
+ type: item.type
132
+ });
133
+ });
134
+ });
135
+ }
136
+ return itemsProp.map(function (item_0) {
137
+ return _objectSpread(_objectSpread({}, item_0), {}, {
138
+ type: ''
139
+ });
140
+ });
141
+ }, [itemsProp]);
142
+ var filteredItems = useMemo(function () {
143
+ if (!searchable) return items;
144
+ var lowerSearch = debouncedSearchTerm.toLowerCase();
145
+ var filtered = items.filter(function (item_1) {
146
+ return item_1.element.active.props.children.toString().toLowerCase().includes(lowerSearch);
147
+ });
148
+ if (debouncedSearchTerm === '') {
149
+ return filtered.sort(function (a, b) {
150
+ return a.key.localeCompare(b.key);
151
+ });
152
+ }
153
+ return filtered.sort(function (a_0, b_0) {
154
+ return levenshtein.get(a_0.key, debouncedSearchTerm) - levenshtein.get(b_0.key, debouncedSearchTerm);
155
+ });
156
+ }, [items, debouncedSearchTerm, searchable]);
157
+ var selection = editable ? selectedKey : items.find(function (v_0) {
158
+ return v_0.key === selectedKey;
159
+ });
160
+ useEffect(function () {
161
+ var handleClickOutside = function handleClickOutside(event) {
162
+ if (containerRef.current !== null && !containerRef.current.contains(event.target)) {
163
+ setIsOpen(false);
164
+ }
165
+ };
166
+ document.addEventListener('mousedown', handleClickOutside);
167
+ return function () {
168
+ document.removeEventListener('mousedown', handleClickOutside);
169
+ };
170
+ }, []);
171
+ useEffect(function () {
172
+ if (isOpen && searchable) {
173
+ var _searchInputRef$curre;
174
+ (_searchInputRef$curre = searchInputRef.current) === null || _searchInputRef$curre === void 0 || _searchInputRef$curre.focus();
175
+ }
176
+ }, [isOpen, searchable]);
177
+ var handleKeyDown = function handleKeyDown(e) {
178
+ if (e.key === 'Enter') {
179
+ if (!isOpen) {
180
+ setIsOpen(true);
181
+ } else if (focusedIndex !== -1) {
182
+ onSelection(filteredItems[focusedIndex].key);
183
+ if (editable) {
184
+ setSearchTerm(filteredItems[focusedIndex].key);
185
+ } else {
186
+ setIsOpen(false);
40
187
  }
41
- }, [refetchValues, isRefetching]);
42
- useEffect(() => {
43
- const timer = setTimeout(() => setDebouncedSearchTerm(searchTerm), 150);
44
- return () => clearTimeout(timer);
45
- }, [searchTerm]);
46
- const items = useMemo(() => {
47
- if (itemsProp[0] != null && 'type' in itemsProp[0]) {
48
- return itemsProp.flatMap(item => item.values.map(v => ({ ...v, type: item.type })));
188
+ }
189
+ } else if (e.key === 'Escape') {
190
+ setIsOpen(false);
191
+ } else if (e.key === 'Tab') {
192
+ if (isOpen) {
193
+ e.preventDefault();
194
+ if (e.shiftKey) {
195
+ // Shift+Tab: Move focus to the previous item
196
+ setFocusedIndex(function (prevIndex) {
197
+ return prevIndex <= 0 ? filteredItems.length - 1 : prevIndex - 1;
198
+ });
199
+ } else {
200
+ // Tab: Move focus to the next item
201
+ setFocusedIndex(function (prevIndex_0) {
202
+ return (prevIndex_0 + 1) % filteredItems.length;
203
+ });
49
204
  }
50
- return itemsProp.map(item => ({ ...item, type: '' }));
51
- }, [itemsProp]);
52
- const filteredItems = useMemo(() => {
53
- if (!searchable)
54
- return items;
55
- const lowerSearch = debouncedSearchTerm.toLowerCase();
56
- const filtered = items.filter(item => item.element.active.props.children.toString().toLowerCase().includes(lowerSearch));
57
- if (debouncedSearchTerm === '') {
58
- return filtered.sort((a, b) => a.key.localeCompare(b.key));
205
+ }
206
+ } else if (e.key === 'ArrowDown') {
207
+ e.preventDefault();
208
+ setFocusedIndex(function (prevIndex_1) {
209
+ return (prevIndex_1 + 1) % filteredItems.length;
210
+ });
211
+ } else if (e.key === 'ArrowUp') {
212
+ e.preventDefault();
213
+ setFocusedIndex(function (prevIndex_2) {
214
+ return (prevIndex_2 - 1 + filteredItems.length) % filteredItems.length;
215
+ });
216
+ }
217
+ };
218
+ var styles = 'relative border rounded-md shadow-sm px-4 py-2 text-left cursor-default focus:outline-none focus:ring-1 items-center focus:ring-indigo-500 focus:border-indigo-500 text-sm flex gap-2 flex items-center justify-between';
219
+ var defaultStyles = 'bg-white dark:bg-gray-900 dark:border-gray-600';
220
+ var primaryStyles = 'text-gray-100 dark:gray-900 bg-indigo-600 border-indigo-500 font-medium py-2 px-4';
221
+ var renderSelection = function renderSelection(selection_0) {
222
+ if (showLoadingInButton && loading === true && selectedKey === '') {
223
+ return /*#__PURE__*/_jsxs("span", _objectSpread(_objectSpread({
224
+ className: "flex items-center gap-2"
225
+ }, testId(TEST_IDS.LABEL_VALUE_LOADING_INDICATOR)), {}, {
226
+ children: [/*#__PURE__*/_jsx(Icon, {
227
+ icon: "svg-spinners:ring-resize",
228
+ className: "w-4 h-4"
229
+ }), /*#__PURE__*/_jsx("span", {
230
+ children: "Loading..."
231
+ })]
232
+ }));
233
+ }
234
+ if (editable) {
235
+ return typeof selection_0 === 'string' && selection_0.length > 0 ? selection_0 : placeholder;
236
+ } else {
237
+ var _element$active, _element;
238
+ return (_element$active = selection_0 === null || selection_0 === void 0 || (_element = selection_0.element) === null || _element === void 0 ? void 0 : _element.active) !== null && _element$active !== void 0 ? _element$active : placeholder;
239
+ }
240
+ };
241
+ var handleSelection = function handleSelection(value) {
242
+ onSelection(value);
243
+ if (editable) {
244
+ setSearchTerm(value);
245
+ setIsOpen(true);
246
+ } else {
247
+ setIsOpen(false);
248
+ }
249
+ };
250
+ var moveCaretToEnd = function moveCaretToEnd(e_0) {
251
+ var value_0 = e_0.target.value;
252
+ e_0.target.value = '';
253
+ e_0.target.value = value_0;
254
+ };
255
+ var groupedFilteredItems = useMemo(function () {
256
+ return filteredItems.reduce(function (acc, item_2) {
257
+ var group = acc.find(function (g) {
258
+ return g.type === item_2.type;
259
+ });
260
+ if (group != null) {
261
+ group.values.push(item_2);
262
+ } else {
263
+ acc.push({
264
+ type: item_2.type,
265
+ values: [item_2]
266
+ });
267
+ }
268
+ return acc;
269
+ }, []).sort(function (a_1, b_1) {
270
+ return a_1.values.length - b_1.values.length;
271
+ });
272
+ }, [filteredItems]);
273
+ var showHeaders = useMemo(function () {
274
+ return groupedFilteredItems.length > 1 && groupedFilteredItems.every(function (g_0) {
275
+ return g_0.type !== '';
276
+ });
277
+ }, [groupedFilteredItems]);
278
+ var flatList = useMemo(function () {
279
+ var list = [];
280
+ var optionIndex = 0;
281
+ var _iterator = _createForOfIteratorHelper(groupedFilteredItems),
282
+ _step;
283
+ try {
284
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
285
+ var group_0 = _step.value;
286
+ if (showHeaders && group_0.type !== '') {
287
+ list.push({
288
+ type: 'header',
289
+ label: group_0.type
290
+ });
59
291
  }
60
- return filtered.sort((a, b) => levenshtein.get(a.key, debouncedSearchTerm) - levenshtein.get(b.key, debouncedSearchTerm));
61
- }, [items, debouncedSearchTerm, searchable]);
62
- const selection = editable ? selectedKey : items.find(v => v.key === selectedKey);
63
- useEffect(() => {
64
- const handleClickOutside = (event) => {
65
- if (containerRef.current !== null && !containerRef.current.contains(event.target)) {
66
- setIsOpen(false);
67
- }
68
- };
69
- document.addEventListener('mousedown', handleClickOutside);
70
- return () => {
71
- document.removeEventListener('mousedown', handleClickOutside);
72
- };
73
- }, []);
74
- useEffect(() => {
75
- if (isOpen && searchable) {
76
- searchInputRef.current?.focus();
292
+ var _iterator2 = _createForOfIteratorHelper(group_0.values),
293
+ _step2;
294
+ try {
295
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
296
+ var item_3 = _step2.value;
297
+ list.push({
298
+ type: 'option',
299
+ item: item_3,
300
+ flatIndex: optionIndex
301
+ });
302
+ optionIndex++;
303
+ }
304
+ } catch (err) {
305
+ _iterator2.e(err);
306
+ } finally {
307
+ _iterator2.f();
77
308
  }
78
- }, [isOpen, searchable]);
79
- const handleKeyDown = (e) => {
80
- if (e.key === 'Enter') {
81
- if (!isOpen) {
82
- setIsOpen(true);
83
- }
84
- else if (focusedIndex !== -1) {
85
- onSelection(filteredItems[focusedIndex].key);
86
- if (editable) {
87
- setSearchTerm(filteredItems[focusedIndex].key);
309
+ }
310
+ } catch (err) {
311
+ _iterator.e(err);
312
+ } finally {
313
+ _iterator.f();
314
+ }
315
+ return list;
316
+ }, [groupedFilteredItems, showHeaders]);
317
+ var longestKey = useMemo(function () {
318
+ var _filteredItems$reduce, _filteredItems$reduce2;
319
+ return (_filteredItems$reduce = (_filteredItems$reduce2 = filteredItems.reduce(function (a_2, b_2) {
320
+ return a_2.key.length > b_2.key.length ? a_2 : b_2;
321
+ }, filteredItems[0])) === null || _filteredItems$reduce2 === void 0 ? void 0 : _filteredItems$reduce2.key) !== null && _filteredItems$reduce !== void 0 ? _filteredItems$reduce : '';
322
+ }, [filteredItems]);
323
+ var rowVirtualizer = useVirtualizer({
324
+ count: flatList.length,
325
+ getScrollElement: function getScrollElement() {
326
+ return optionsRef.current;
327
+ },
328
+ estimateSize: function estimateSize() {
329
+ return 36;
330
+ },
331
+ overscan: 500
332
+ });
333
+ useEffect(function () {
334
+ if (focusedIndex !== -1) {
335
+ var flatIdx = flatList.findIndex(function (entry) {
336
+ return entry.type === 'option' && entry.flatIndex === focusedIndex;
337
+ });
338
+ if (flatIdx !== -1) {
339
+ rowVirtualizer.scrollToIndex(flatIdx, {
340
+ align: 'auto'
341
+ });
342
+ }
343
+ }
344
+ }, [focusedIndex, flatList, rowVirtualizer]);
345
+ return /*#__PURE__*/_jsxs("div", {
346
+ ref: containerRef,
347
+ className: "relative",
348
+ onKeyDown: handleKeyDown,
349
+ onClick: onButtonClick,
350
+ children: [/*#__PURE__*/_jsxs("div", _objectSpread(_objectSpread({
351
+ id: id,
352
+ onClick: function onClick() {
353
+ return !disabled && setIsOpen(!isOpen);
354
+ },
355
+ className: cx(styles, width !== undefined ? "w-".concat(width) : 'w-full', disabled ? 'cursor-not-allowed opacity-50 pointer-events-none' : '', primary ? primaryStyles : defaultStyles, _defineProperty({}, className, className.length > 0)),
356
+ tabIndex: 0,
357
+ role: "button",
358
+ "aria-haspopup": "listbox",
359
+ "aria-expanded": isOpen
360
+ }, restProps), {}, {
361
+ children: [/*#__PURE__*/_jsx("div", {
362
+ className: cx(icon != null ? '' : 'block overflow-x-hidden text-ellipsis whitespace-nowrap'),
363
+ children: renderSelection(selection)
364
+ }), /*#__PURE__*/_jsx("div", {
365
+ className: cx(icon != null ? '' : 'pointer-events-none text-gray-400'),
366
+ children: icon !== null && icon !== void 0 ? icon : /*#__PURE__*/_jsx(Icon, {
367
+ icon: "heroicons:chevron-up-down-20-solid",
368
+ "aria-hidden": "true"
369
+ })
370
+ })]
371
+ })), isOpen && /*#__PURE__*/_jsx("div", {
372
+ ref: optionsRef,
373
+ className: cx('absolute z-50 mt-1 min-h-[100px] max-h-[50vh] w-max overflow-auto rounded-md bg-gray-50 text-base shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none dark:border-gray-600 dark:bg-gray-900 dark:ring-white dark:ring-opacity-20 sm:text-sm', _defineProperty({}, optionsClassname, optionsClassname.length > 0)),
374
+ role: "listbox",
375
+ children: /*#__PURE__*/_jsxs("div", {
376
+ className: "relative flex flex-col",
377
+ children: [searchable && /*#__PURE__*/_jsx("div", {
378
+ className: "sticky z-10 top-[-5px] w-auto max-w-full",
379
+ children: /*#__PURE__*/_jsx("div", {
380
+ className: "flex flex-col",
381
+ children: editable ? /*#__PURE__*/_jsxs(_Fragment, {
382
+ children: [/*#__PURE__*/_jsx("textarea", {
383
+ ref: searchInputRef,
384
+ className: "w-full px-4 py-2 text-sm border-b border-gray-200 rounded-none ring-0 outline-none bg-gray-50 dark:bg-gray-800 dark:text-white min-h-[50px]",
385
+ placeholder: "Type a RegEx to add",
386
+ value: searchTerm,
387
+ onChange: function onChange(e_1) {
388
+ return setSearchTerm(e_1.target.value);
389
+ },
390
+ onFocus: function onFocus(e_2) {
391
+ return moveCaretToEnd(e_2);
88
392
  }
89
- else {
393
+ }), editable && searchTerm.length > 0 && /*#__PURE__*/_jsx("div", {
394
+ className: "p-2 border-t border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800",
395
+ children: /*#__PURE__*/_jsx(Button, {
396
+ variant: "primary",
397
+ className: "w-full h-[30px]",
398
+ onClick: function onClick() {
399
+ onSelection(searchTerm);
90
400
  setIsOpen(false);
401
+ },
402
+ children: "Add"
403
+ })
404
+ })]
405
+ }) : /*#__PURE__*/_jsx("input", {
406
+ ref: searchInputRef,
407
+ type: "text",
408
+ className: "w-full px-4 h-[45px] text-sm border-none rounded-none ring-0 outline-none bg-gray-50 dark:bg-gray-800 dark:text-white",
409
+ placeholder: "Search...",
410
+ value: searchTerm,
411
+ onChange: function onChange(e_3) {
412
+ return setSearchTerm(e_3.target.value);
413
+ }
414
+ })
415
+ })
416
+ }), /*#__PURE__*/_jsx("div", {
417
+ className: "flex-1 min-h-0",
418
+ children: loading === true ? /*#__PURE__*/_jsx("div", {
419
+ className: "w-[270px]",
420
+ children: loader
421
+ }) : groupedFilteredItems.length === 0 ? /*#__PURE__*/_jsx("div", _objectSpread(_objectSpread({
422
+ className: "px-4 py-3 text-sm text-gray-500 dark:text-gray-400 text-center"
423
+ }, testId(TEST_IDS.LABEL_VALUE_NO_RESULTS)), {}, {
424
+ children: "No values found"
425
+ })) : function (_virtualItems$0$start, _virtualItems$, _virtualItems$end, _virtualItems) {
426
+ var virtualItems = rowVirtualizer.getVirtualItems();
427
+ var paddingTop = virtualItems.length > 0 ? (_virtualItems$0$start = (_virtualItems$ = virtualItems[0]) === null || _virtualItems$ === void 0 ? void 0 : _virtualItems$.start) !== null && _virtualItems$0$start !== void 0 ? _virtualItems$0$start : 0 : 0;
428
+ var paddingBottom = virtualItems.length > 0 ? rowVirtualizer.getTotalSize() - ((_virtualItems$end = (_virtualItems = virtualItems[virtualItems.length - 1]) === null || _virtualItems === void 0 ? void 0 : _virtualItems.end) !== null && _virtualItems$end !== void 0 ? _virtualItems$end : 0) : 0;
429
+ return /*#__PURE__*/_jsxs("div", {
430
+ children: [/*#__PURE__*/_jsx("div", {
431
+ "aria-hidden": true,
432
+ className: "pl-3 pr-9 whitespace-nowrap overflow-hidden",
433
+ style: {
434
+ height: 0,
435
+ visibility: 'hidden'
436
+ },
437
+ children: longestKey
438
+ }), paddingTop > 0 && /*#__PURE__*/_jsx("div", {
439
+ style: {
440
+ height: paddingTop
91
441
  }
92
- }
93
- }
94
- else if (e.key === 'Escape') {
95
- setIsOpen(false);
96
- }
97
- else if (e.key === 'Tab') {
98
- if (isOpen) {
99
- e.preventDefault();
100
- if (e.shiftKey) {
101
- // Shift+Tab: Move focus to the previous item
102
- setFocusedIndex(prevIndex => (prevIndex <= 0 ? filteredItems.length - 1 : prevIndex - 1));
442
+ }), virtualItems.map(function (virtualItem) {
443
+ var entry_0 = flatList[virtualItem.index];
444
+ return entry_0.type === 'header' ? /*#__PURE__*/_jsx("div", {
445
+ className: "pl-2",
446
+ children: /*#__PURE__*/_jsx(DividerWithLabel, {
447
+ label: entry_0.label
448
+ })
449
+ }, virtualItem.key) : /*#__PURE__*/_jsx(OptionItem, {
450
+ item: entry_0.item,
451
+ index: entry_0.flatIndex,
452
+ focusedIndex: focusedIndex,
453
+ selectedKey: selectedKey,
454
+ handleSelection: handleSelection
455
+ }, virtualItem.key);
456
+ }), paddingBottom > 0 && /*#__PURE__*/_jsx("div", {
457
+ style: {
458
+ height: paddingBottom
103
459
  }
104
- else {
105
- // Tab: Move focus to the next item
106
- setFocusedIndex(prevIndex => (prevIndex + 1) % filteredItems.length);
107
- }
108
- }
109
- }
110
- else if (e.key === 'ArrowDown') {
111
- e.preventDefault();
112
- setFocusedIndex(prevIndex => (prevIndex + 1) % filteredItems.length);
113
- }
114
- else if (e.key === 'ArrowUp') {
115
- e.preventDefault();
116
- setFocusedIndex(prevIndex => (prevIndex - 1 + filteredItems.length) % filteredItems.length);
117
- }
118
- };
119
- const styles = 'relative border rounded-md shadow-sm px-4 py-2 text-left cursor-default focus:outline-none focus:ring-1 items-center focus:ring-indigo-500 focus:border-indigo-500 text-sm flex gap-2 flex items-center justify-between';
120
- const defaultStyles = 'bg-white dark:bg-gray-900 dark:border-gray-600';
121
- const primaryStyles = 'text-gray-100 dark:gray-900 bg-indigo-600 border-indigo-500 font-medium py-2 px-4';
122
- const renderSelection = (selection) => {
123
- if (showLoadingInButton && loading === true && selectedKey === '') {
124
- return (_jsxs("span", { className: "flex items-center gap-2", ...testId(TEST_IDS.LABEL_VALUE_LOADING_INDICATOR), children: [_jsx(Icon, { icon: "svg-spinners:ring-resize", className: "w-4 h-4" }), _jsx("span", { children: "Loading..." })] }));
125
- }
126
- if (editable) {
127
- return typeof selection === 'string' && selection.length > 0 ? selection : placeholder;
128
- }
129
- else {
130
- return selection?.element?.active ?? placeholder;
131
- }
132
- };
133
- const handleSelection = (value) => {
134
- onSelection(value);
135
- if (editable) {
136
- setSearchTerm(value);
137
- setIsOpen(true);
138
- }
139
- else {
140
- setIsOpen(false);
141
- }
142
- };
143
- const moveCaretToEnd = (e) => {
144
- const value = e.target.value;
145
- e.target.value = '';
146
- e.target.value = value;
460
+ })]
461
+ });
462
+ }()
463
+ }), refetchValues !== undefined && loading !== true && /*#__PURE__*/_jsx(RefreshButton, {
464
+ onClick: function onClick() {
465
+ return void handleRefetch();
466
+ },
467
+ disabled: isRefetching,
468
+ title: "Refresh results",
469
+ testId: TEST_IDS.LABEL_VALUE_REFRESH_BUTTON,
470
+ sticky: true,
471
+ loading: isRefetching
472
+ })]
473
+ })
474
+ })]
475
+ });
476
+ };
477
+ var OptionItem = function OptionItem(t0) {
478
+ var $ = _c(17);
479
+ var item = t0.item,
480
+ index = t0.index,
481
+ focusedIndex = t0.focusedIndex,
482
+ selectedKey = t0.selectedKey,
483
+ handleSelection = t0.handleSelection;
484
+ var t1 = index === focusedIndex && "bg-indigo-600 text-white";
485
+ var t2 = item.key === selectedKey && "bg-indigo-100 dark:bg-indigo-700";
486
+ var t3 = item.disabled !== null && item.disabled === true && "opacity-50 cursor-not-allowed";
487
+ var t4;
488
+ if ($[0] !== t1 || $[1] !== t2 || $[2] !== t3) {
489
+ t4 = cx("relative cursor-default select-none py-2 pl-3 pr-9", t1, t2, t3, "focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 hover:bg-indigo-600 hover:text-white");
490
+ $[0] = t1;
491
+ $[1] = t2;
492
+ $[2] = t3;
493
+ $[3] = t4;
494
+ } else {
495
+ t4 = $[3];
496
+ }
497
+ var t5 = item.key === selectedKey;
498
+ var t6;
499
+ if ($[4] !== handleSelection || $[5] !== item.disabled || $[6] !== item.key) {
500
+ t6 = function t6() {
501
+ var _item$disabled;
502
+ if (!((_item$disabled = item.disabled) !== null && _item$disabled !== void 0 ? _item$disabled : false)) {
503
+ handleSelection(item.key);
504
+ }
147
505
  };
148
- const groupedFilteredItems = useMemo(() => {
149
- return filteredItems
150
- .reduce((acc, item) => {
151
- const group = acc.find(g => g.type === item.type);
152
- if (group != null) {
153
- group.values.push(item);
154
- }
155
- else {
156
- acc.push({ type: item.type, values: [item] });
157
- }
158
- return acc;
159
- }, [])
160
- .sort((a, b) => a.values.length - b.values.length);
161
- }, [filteredItems]);
162
- const showHeaders = useMemo(() => groupedFilteredItems.length > 1 && groupedFilteredItems.every(g => g.type !== ''), [groupedFilteredItems]);
163
- const flatList = useMemo(() => {
164
- const list = [];
165
- let optionIndex = 0;
166
- for (const group of groupedFilteredItems) {
167
- if (showHeaders && group.type !== '') {
168
- list.push({ type: 'header', label: group.type });
169
- }
170
- for (const item of group.values) {
171
- list.push({ type: 'option', item: item, flatIndex: optionIndex });
172
- optionIndex++;
173
- }
174
- }
175
- return list;
176
- }, [groupedFilteredItems, showHeaders]);
177
- const longestKey = useMemo(() => filteredItems.reduce((a, b) => (a.key.length > b.key.length ? a : b), filteredItems[0])
178
- ?.key ?? '', [filteredItems]);
179
- const rowVirtualizer = useVirtualizer({
180
- count: flatList.length,
181
- getScrollElement: () => optionsRef.current,
182
- estimateSize: () => 36,
183
- overscan: 500,
506
+ $[4] = handleSelection;
507
+ $[5] = item.disabled;
508
+ $[6] = item.key;
509
+ $[7] = t6;
510
+ } else {
511
+ t6 = $[7];
512
+ }
513
+ var t7;
514
+ if ($[8] !== item.key || $[9] !== selectedKey) {
515
+ t7 = item.key === selectedKey && /*#__PURE__*/_jsx("span", {
516
+ className: "absolute inset-y-0 right-0 flex items-center pr-4 text-indigo-600",
517
+ children: /*#__PURE__*/_jsx(Icon, {
518
+ icon: "heroicons:check-20-solid",
519
+ "aria-hidden": "true"
520
+ })
184
521
  });
185
- useEffect(() => {
186
- if (focusedIndex !== -1) {
187
- const flatIdx = flatList.findIndex(entry => entry.type === 'option' && entry.flatIndex === focusedIndex);
188
- if (flatIdx !== -1) {
189
- rowVirtualizer.scrollToIndex(flatIdx, { align: 'auto' });
190
- }
191
- }
192
- }, [focusedIndex, flatList, rowVirtualizer]);
193
- return (_jsxs("div", { ref: containerRef, className: "relative", onKeyDown: handleKeyDown, onClick: onButtonClick, children: [_jsxs("div", { id: id, onClick: () => !disabled && setIsOpen(!isOpen), className: cx(styles, width !== undefined ? `w-${width}` : 'w-full', disabled ? 'cursor-not-allowed opacity-50 pointer-events-none' : '', primary ? primaryStyles : defaultStyles, { [className]: className.length > 0 }), tabIndex: 0, role: "button", "aria-haspopup": "listbox", "aria-expanded": isOpen, ...restProps, children: [_jsx("div", { className: cx(icon != null ? '' : 'block overflow-x-hidden text-ellipsis whitespace-nowrap'), children: renderSelection(selection) }), _jsx("div", { className: cx(icon != null ? '' : 'pointer-events-none text-gray-400'), children: icon ?? _jsx(Icon, { icon: "heroicons:chevron-up-down-20-solid", "aria-hidden": "true" }) })] }), isOpen && (_jsx("div", { ref: optionsRef, className: cx('absolute z-50 mt-1 min-h-[100px] max-h-[50vh] w-max overflow-auto rounded-md bg-gray-50 text-base shadow-lg ring-1 ring-black ring-opacity-5 focus:outline-none dark:border-gray-600 dark:bg-gray-900 dark:ring-white dark:ring-opacity-20 sm:text-sm', { [optionsClassname]: optionsClassname.length > 0 }), role: "listbox", children: _jsxs("div", { className: "relative flex flex-col", children: [searchable && (_jsx("div", { className: "sticky z-10 top-[-5px] w-auto max-w-full", children: _jsx("div", { className: "flex flex-col", children: editable ? (_jsxs(_Fragment, { children: [_jsx("textarea", { ref: searchInputRef, className: "w-full px-4 py-2 text-sm border-b border-gray-200 rounded-none ring-0 outline-none bg-gray-50 dark:bg-gray-800 dark:text-white min-h-[50px]", placeholder: "Type a RegEx to add", value: searchTerm, onChange: e => setSearchTerm(e.target.value), onFocus: e => moveCaretToEnd(e) }), editable && searchTerm.length > 0 && (_jsx("div", { className: "p-2 border-t border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800", children: _jsx(Button, { variant: "primary", className: "w-full h-[30px]", onClick: () => {
194
- onSelection(searchTerm);
195
- setIsOpen(false);
196
- }, children: "Add" }) }))] })) : (_jsx("input", { ref: searchInputRef, type: "text", className: "w-full px-4 h-[45px] text-sm border-none rounded-none ring-0 outline-none bg-gray-50 dark:bg-gray-800 dark:text-white", placeholder: "Search...", value: searchTerm, onChange: e => setSearchTerm(e.target.value) })) }) })), _jsx("div", { className: "flex-1 min-h-0", children: loading === true ? (_jsx("div", { className: "w-[270px]", children: loader })) : groupedFilteredItems.length === 0 ? (_jsx("div", { className: "px-4 py-3 text-sm text-gray-500 dark:text-gray-400 text-center", ...testId(TEST_IDS.LABEL_VALUE_NO_RESULTS), children: "No values found" })) : ((() => {
197
- const virtualItems = rowVirtualizer.getVirtualItems();
198
- const paddingTop = virtualItems.length > 0 ? virtualItems[0]?.start ?? 0 : 0;
199
- const paddingBottom = virtualItems.length > 0
200
- ? rowVirtualizer.getTotalSize() -
201
- (virtualItems[virtualItems.length - 1]?.end ?? 0)
202
- : 0;
203
- return (_jsxs("div", { children: [_jsx("div", { "aria-hidden": true, className: "pl-3 pr-9 whitespace-nowrap overflow-hidden", style: { height: 0, visibility: 'hidden' }, children: longestKey }), paddingTop > 0 && _jsx("div", { style: { height: paddingTop } }), virtualItems.map(virtualItem => {
204
- const entry = flatList[virtualItem.index];
205
- return entry.type === 'header' ? (_jsx("div", { className: "pl-2", children: _jsx(DividerWithLabel, { label: entry.label }) }, virtualItem.key)) : (_jsx(OptionItem, { item: entry.item, index: entry.flatIndex, focusedIndex: focusedIndex, selectedKey: selectedKey, handleSelection: handleSelection }, virtualItem.key));
206
- }), paddingBottom > 0 && _jsx("div", { style: { height: paddingBottom } })] }));
207
- })()) }), refetchValues !== undefined && loading !== true && (_jsx(RefreshButton, { onClick: () => void handleRefetch(), disabled: isRefetching, title: "Refresh results", testId: TEST_IDS.LABEL_VALUE_REFRESH_BUTTON, sticky: true, loading: isRefetching }))] }) }))] }));
208
- };
209
- const OptionItem = ({ item, index, focusedIndex, selectedKey, handleSelection, }) => {
210
- return (_jsxs("div", { className: cx('relative cursor-default select-none py-2 pl-3 pr-9', index === focusedIndex && 'bg-indigo-600 text-white', item.key === selectedKey && 'bg-indigo-100 dark:bg-indigo-700', item.disabled !== null && item.disabled === true && 'opacity-50 cursor-not-allowed', 'focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 hover:bg-indigo-600 hover:text-white'), role: "option", "aria-selected": item.key === selectedKey, tabIndex: -1, onClick: () => {
211
- if (!(item.disabled ?? false)) {
212
- handleSelection(item.key);
213
- }
214
- }, children: [item.element.expanded, item.key === selectedKey && (_jsx("span", { className: "absolute inset-y-0 right-0 flex items-center pr-4 text-indigo-600", children: _jsx(Icon, { icon: "heroicons:check-20-solid", "aria-hidden": "true" }) }))] }));
522
+ $[8] = item.key;
523
+ $[9] = selectedKey;
524
+ $[10] = t7;
525
+ } else {
526
+ t7 = $[10];
527
+ }
528
+ var t8;
529
+ if ($[11] !== item.element.expanded || $[12] !== t4 || $[13] !== t5 || $[14] !== t6 || $[15] !== t7) {
530
+ t8 = /*#__PURE__*/_jsxs("div", {
531
+ className: t4,
532
+ role: "option",
533
+ "aria-selected": t5,
534
+ tabIndex: -1,
535
+ onClick: t6,
536
+ children: [item.element.expanded, t7]
537
+ });
538
+ $[11] = item.element.expanded;
539
+ $[12] = t4;
540
+ $[13] = t5;
541
+ $[14] = t6;
542
+ $[15] = t7;
543
+ $[16] = t8;
544
+ } else {
545
+ t8 = $[16];
546
+ }
547
+ return t8;
215
548
  };
216
- export default CustomSelect;
549
+ export default CustomSelect;