@parca/profile 0.19.140 → 0.19.143

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 (182) hide show
  1. package/CHANGELOG.md +9 -1
  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 +94 -68
  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.d.ts.map +1 -1
  28. package/dist/ProfileExplorer/ProfileExplorerCompare.js +240 -45
  29. package/dist/ProfileExplorer/ProfileExplorerSingle.js +98 -11
  30. package/dist/ProfileExplorer/index.js +183 -32
  31. package/dist/ProfileFlameChart/SamplesStrips/SamplesGraph/index.js +333 -148
  32. package/dist/ProfileFlameChart/SamplesStrips/SamplesStrips.stories.js +69 -35
  33. package/dist/ProfileFlameChart/SamplesStrips/index.js +645 -134
  34. package/dist/ProfileFlameChart/SamplesStrips/labelSetUtils.js +114 -55
  35. package/dist/ProfileFlameChart/index.js +260 -126
  36. package/dist/ProfileFlameGraph/FlameGraphArrow/ContextMenu.js +283 -85
  37. package/dist/ProfileFlameGraph/FlameGraphArrow/ContextMenuWrapper.js +56 -20
  38. package/dist/ProfileFlameGraph/FlameGraphArrow/FlameGraphNodes.js +211 -140
  39. package/dist/ProfileFlameGraph/FlameGraphArrow/MemoizedTooltip.js +133 -38
  40. package/dist/ProfileFlameGraph/FlameGraphArrow/MiniMap.js +261 -216
  41. package/dist/ProfileFlameGraph/FlameGraphArrow/TextWithEllipsis.d.ts.map +1 -1
  42. package/dist/ProfileFlameGraph/FlameGraphArrow/TextWithEllipsis.js +71 -45
  43. package/dist/ProfileFlameGraph/FlameGraphArrow/TooltipContext.d.ts.map +1 -1
  44. package/dist/ProfileFlameGraph/FlameGraphArrow/TooltipContext.js +58 -28
  45. package/dist/ProfileFlameGraph/FlameGraphArrow/ZoomControls.d.ts.map +1 -1
  46. package/dist/ProfileFlameGraph/FlameGraphArrow/ZoomControls.js +59 -8
  47. package/dist/ProfileFlameGraph/FlameGraphArrow/index.js +396 -179
  48. package/dist/ProfileFlameGraph/FlameGraphArrow/useBatchedRendering.d.ts.map +1 -1
  49. package/dist/ProfileFlameGraph/FlameGraphArrow/useBatchedRendering.js +68 -50
  50. package/dist/ProfileFlameGraph/FlameGraphArrow/useMappingList.js +62 -38
  51. package/dist/ProfileFlameGraph/FlameGraphArrow/useNodeColor.js +14 -6
  52. package/dist/ProfileFlameGraph/FlameGraphArrow/useScrollViewport.js +124 -82
  53. package/dist/ProfileFlameGraph/FlameGraphArrow/useVisibleNodes.js +160 -98
  54. package/dist/ProfileFlameGraph/FlameGraphArrow/useZoom.js +232 -112
  55. package/dist/ProfileFlameGraph/FlameGraphArrow/utils.js +137 -114
  56. package/dist/ProfileFlameGraph/benchmarks/benchdata/populateData.js +85 -0
  57. package/dist/ProfileFlameGraph/index.js +322 -147
  58. package/dist/ProfileMetricsGraph/hooks/useQueryRange.js +140 -32
  59. package/dist/ProfileMetricsGraph/index.js +515 -256
  60. package/dist/ProfileSelector/CompareButton.js +132 -12
  61. package/dist/ProfileSelector/MetricsGraphSection.js +228 -63
  62. package/dist/ProfileSelector/index.d.ts +1 -1
  63. package/dist/ProfileSelector/index.d.ts.map +1 -1
  64. package/dist/ProfileSelector/index.js +734 -142
  65. package/dist/ProfileSelector/useAutoQuerySelector.d.ts +1 -3
  66. package/dist/ProfileSelector/useAutoQuerySelector.d.ts.map +1 -1
  67. package/dist/ProfileSelector/useAutoQuerySelector.js +280 -132
  68. package/dist/ProfileSource.js +230 -163
  69. package/dist/ProfileTypeSelector/index.js +214 -125
  70. package/dist/ProfileView/components/ActionButtons/GroupByDropdown.js +50 -4
  71. package/dist/ProfileView/components/ActionButtons/SortByDropdown.js +137 -32
  72. package/dist/ProfileView/components/ColorStackLegend.js +182 -54
  73. package/dist/ProfileView/components/DashboardItems/index.js +87 -28
  74. package/dist/ProfileView/components/DashboardLayout/index.js +108 -16
  75. package/dist/ProfileView/components/DiffLegend.js +172 -29
  76. package/dist/ProfileView/components/GroupByLabelsDropdown/index.js +199 -55
  77. package/dist/ProfileView/components/InvertCallStack/index.js +97 -9
  78. package/dist/ProfileView/components/ProfileFilters/filterPresets.js +260 -315
  79. package/dist/ProfileView/components/ProfileFilters/index.js +518 -215
  80. package/dist/ProfileView/components/ProfileFilters/useProfileFilters.js +370 -306
  81. package/dist/ProfileView/components/ProfileFilters/useProfileFiltersUrlState.js +191 -118
  82. package/dist/ProfileView/components/ProfileHeader/index.js +105 -11
  83. package/dist/ProfileView/components/ShareButton/ResultBox.js +119 -16
  84. package/dist/ProfileView/components/ShareButton/index.js +352 -62
  85. package/dist/ProfileView/components/Toolbars/MultiLevelDropdown.d.ts.map +1 -1
  86. package/dist/ProfileView/components/Toolbars/MultiLevelDropdown.js +664 -192
  87. package/dist/ProfileView/components/Toolbars/SwitchMenuItem.js +94 -7
  88. package/dist/ProfileView/components/Toolbars/TableColumnsDropdown.js +196 -155
  89. package/dist/ProfileView/components/Toolbars/index.js +441 -21
  90. package/dist/ProfileView/components/ViewSelector/Dropdown.js +233 -22
  91. package/dist/ProfileView/components/ViewSelector/index.js +186 -82
  92. package/dist/ProfileView/components/VisualizationContainer/index.d.ts.map +1 -1
  93. package/dist/ProfileView/components/VisualizationContainer/index.js +52 -7
  94. package/dist/ProfileView/components/VisualizationPanel.js +185 -8
  95. package/dist/ProfileView/context/DashboardContext.js +74 -26
  96. package/dist/ProfileView/context/ProfileViewContext.js +56 -15
  97. package/dist/ProfileView/hooks/useAutoSelectDimension.js +71 -41
  98. package/dist/ProfileView/hooks/useProfileMetadata.js +50 -18
  99. package/dist/ProfileView/hooks/useResetFlameGraphState.js +31 -10
  100. package/dist/ProfileView/hooks/useResetStateOnProfileTypeChange.js +71 -27
  101. package/dist/ProfileView/hooks/useResetStateOnSeriesChange.js +53 -17
  102. package/dist/ProfileView/hooks/useVisualizationState.js +229 -69
  103. package/dist/ProfileView/index.js +383 -45
  104. package/dist/ProfileView/types/visualization.js +1 -13
  105. package/dist/ProfileView/utils/colorUtils.js +8 -7
  106. package/dist/ProfileViewWithData.js +319 -225
  107. package/dist/QueryControls/index.js +418 -47
  108. package/dist/Sandwich/components/CalleesSection.js +54 -4
  109. package/dist/Sandwich/components/CallersSection.js +97 -27
  110. package/dist/Sandwich/components/TableSection.js +77 -4
  111. package/dist/Sandwich/index.js +125 -12
  112. package/dist/Sandwich/utils/processRowData.js +48 -39
  113. package/dist/SelectWithRefresh/index.js +102 -28
  114. package/dist/SimpleMatchers/Select.js +520 -187
  115. package/dist/SimpleMatchers/index.js +590 -288
  116. package/dist/SourceView/Highlighter.js +230 -70
  117. package/dist/SourceView/LineNo.js +72 -17
  118. package/dist/SourceView/index.js +177 -101
  119. package/dist/SourceView/lang-detector/ext-to-lang.json +798 -798
  120. package/dist/SourceView/lang-detector/index.js +28 -14
  121. package/dist/SourceView/useSelectedLineRange.js +72 -20
  122. package/dist/Table/ColorCell.js +42 -1
  123. package/dist/Table/ColumnsVisibility.js +114 -6
  124. package/dist/Table/MoreDropdown.js +107 -21
  125. package/dist/Table/TableContextMenu.js +144 -134
  126. package/dist/Table/TableContextMenuWrapper.js +59 -14
  127. package/dist/Table/hooks/useColorManagement.js +58 -16
  128. package/dist/Table/hooks/useTableConfiguration.d.ts.map +1 -1
  129. package/dist/Table/hooks/useTableConfiguration.js +323 -167
  130. package/dist/Table/index.js +217 -123
  131. package/dist/Table/utils/functions.js +169 -144
  132. package/dist/Table/utils/topAndBottomExpandedRowModel.js +69 -52
  133. package/dist/TimelineGuide/index.js +209 -16
  134. package/dist/TopTable/benchmarks/benchdata/populateData.js +91 -0
  135. package/dist/TopTable/index.js +325 -121
  136. package/dist/contexts/LabelsQueryProvider.js +94 -32
  137. package/dist/contexts/UnifiedLabelsContext.js +114 -49
  138. package/dist/contexts/utils.js +37 -15
  139. package/dist/hooks/urlParsers.js +27 -15
  140. package/dist/hooks/useColorBy.js +47 -10
  141. package/dist/hooks/useCompareModeMeta.js +112 -62
  142. package/dist/hooks/useDashboardItems.js +52 -11
  143. package/dist/hooks/useLabels.js +295 -52
  144. package/dist/hooks/useQueryState.d.ts +1 -1
  145. package/dist/hooks/useQueryState.d.ts.map +1 -1
  146. package/dist/hooks/useQueryState.js +375 -329
  147. package/dist/index.js +11 -6
  148. package/dist/testdata/fg-diff.json +3750 -0
  149. package/dist/testdata/fg-simple.json +1879 -0
  150. package/dist/testdata/link_data.json +56 -0
  151. package/dist/testdata/tabular.json +30 -0
  152. package/dist/testdata/test_flamegraph.json +26846 -0
  153. package/dist/testdata/test_graph.json +53 -0
  154. package/dist/useDelayedLoader.js +32 -18
  155. package/dist/useGrpcQuery/index.js +71 -11
  156. package/dist/useHasProfileData.js +90 -12
  157. package/dist/useQuery.js +205 -64
  158. package/dist/useSumBy.d.ts.map +1 -1
  159. package/dist/useSumBy.js +294 -138
  160. package/dist/utils.js +62 -30
  161. package/package.json +9 -9
  162. package/src/GraphTooltipArrow/index.tsx +3 -0
  163. package/src/MatchersInput/SuggestionsList.test.tsx +70 -0
  164. package/src/MatchersInput/SuggestionsList.tsx +11 -10
  165. package/src/MatchersInput/index.tsx +1 -1
  166. package/src/MetricsGraph/MetricsTooltip/index.tsx +22 -34
  167. package/src/PreSelectedMatchers/index.tsx +3 -0
  168. package/src/ProfileExplorer/ProfileExplorerCompare.tsx +9 -2
  169. package/src/ProfileFlameGraph/FlameGraphArrow/TextWithEllipsis.tsx +3 -0
  170. package/src/ProfileFlameGraph/FlameGraphArrow/TooltipContext.tsx +3 -0
  171. package/src/ProfileFlameGraph/FlameGraphArrow/ZoomControls.tsx +3 -0
  172. package/src/ProfileFlameGraph/FlameGraphArrow/useBatchedRendering.ts +3 -0
  173. package/src/ProfileSelector/index.tsx +31 -9
  174. package/src/ProfileSelector/useAutoQuerySelector.ts +64 -42
  175. package/src/ProfileView/components/Toolbars/MultiLevelDropdown.tsx +3 -0
  176. package/src/ProfileView/components/VisualizationContainer/index.tsx +3 -0
  177. package/src/Table/hooks/useTableConfiguration.tsx +7 -13
  178. package/src/hooks/useQueryState.ts +18 -3
  179. package/src/useDelayedLoader.ts +10 -10
  180. package/src/useSumBy.ts +12 -18
  181. package/dist/ProfileView/components/ProfileFilters/useProfileFiltersUrlState.test.js +0 -455
  182. package/dist/hooks/useQueryState.test.js +0 -868
@@ -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;