@parca/profile 0.16.336 → 0.16.338

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.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,14 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [0.16.338](https://github.com/parca-dev/parca/compare/@parca/profile@0.16.337...@parca/profile@0.16.338) (2024-02-07)
7
+
8
+ **Note:** Version bump only for package @parca/profile
9
+
10
+ ## [0.16.337](https://github.com/parca-dev/parca/compare/@parca/profile@0.16.336...@parca/profile@0.16.337) (2024-02-06)
11
+
12
+ **Note:** Version bump only for package @parca/profile
13
+
6
14
  ## [0.16.336](https://github.com/parca-dev/parca/compare/@parca/profile@0.16.335...@parca/profile@0.16.336) (2024-02-01)
7
15
 
8
16
  **Note:** Version bump only for package @parca/profile
@@ -52,6 +52,6 @@ const GroupByDropdown = ({ groupBy, toggleGroupBy, }) => {
52
52
  : groupBy.length === 1
53
53
  ? groupByOptions.find(option => option.value === groupBy[0])?.label
54
54
  : 'Multiple';
55
- return (_jsxs("div", { className: "relative", children: [_jsx("label", { className: "text-sm", children: "Group" }), _jsxs(Menu, { as: "div", className: "relative text-left", children: [_jsxs(Menu.Button, { className: "relative w-max cursor-default rounded-md border bg-white py-2 pl-3 pr-[1.7rem] text-left text-sm shadow-sm focus:border-indigo-500 focus:outline-none focus:ring-1 focus:ring-indigo-500 dark:border-gray-600 dark:bg-gray-900 sm:text-sm", children: [_jsx("span", { className: "block overflow-x-hidden text-ellipsis", children: label }), _jsx("span", { className: "pointer-events-none absolute inset-y-0 right-0 flex items-center pr-2 text-gray-400", children: _jsx(Icon, { icon: "heroicons:chevron-down-20-solid", "aria-hidden": "true" }) })] }), _jsx(Transition, { as: "div", leave: "transition ease-in duration-100", leaveFrom: "opacity-100", leaveTo: "opacity-0", children: _jsx(Menu.Items, { className: "absolute left-0 z-10 mt-1 min-w-[400px] overflow-auto rounded-md bg-gray-50 py-1 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", children: _jsx("div", { className: "p-4", children: _jsx("fieldset", { children: _jsx("div", { className: "space-y-5", children: groupByOptions.map(({ value, label, description, disabled }) => (_jsxs("div", { className: "relative flex items-start", children: [_jsx("div", { className: "flex h-6 items-center", children: _jsx("input", { id: value, name: value, type: "checkbox", disabled: disabled, className: "h-4 w-4 rounded border-gray-300 text-indigo-600 focus:ring-indigo-600", checked: groupBy.includes(value), onChange: () => toggleGroupBy(value) }) }), _jsxs("div", { className: "ml-3 text-sm leading-6", children: [_jsx("label", { htmlFor: value, className: "font-medium text-gray-900 dark:text-gray-200", children: label }), _jsx("p", { className: "text-gray-500 dark:text-gray-400", children: description })] })] }, value))) }) }) }) }) })] })] }));
55
+ return (_jsxs("div", { className: "relative", children: [_jsx("label", { className: "text-sm", children: "Group" }), _jsxs(Menu, { as: "div", className: "relative text-left", children: [_jsxs(Menu.Button, { id: "h-group-by-filter", className: "relative w-max cursor-default rounded-md border bg-white py-2 pl-3 pr-[1.7rem] text-left text-sm shadow-sm focus:border-indigo-500 focus:outline-none focus:ring-1 focus:ring-indigo-500 dark:border-gray-600 dark:bg-gray-900 sm:text-sm", children: [_jsx("span", { className: "block overflow-x-hidden text-ellipsis", children: label }), _jsx("span", { className: "pointer-events-none absolute inset-y-0 right-0 flex items-center pr-2 text-gray-400", children: _jsx(Icon, { icon: "heroicons:chevron-down-20-solid", "aria-hidden": "true" }) })] }), _jsx(Transition, { as: "div", leave: "transition ease-in duration-100", leaveFrom: "opacity-100", leaveTo: "opacity-0", children: _jsx(Menu.Items, { className: "absolute left-0 z-10 mt-1 min-w-[400px] overflow-auto rounded-md bg-gray-50 py-1 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", children: _jsx("div", { className: "p-4", children: _jsx("fieldset", { children: _jsx("div", { className: "space-y-5", children: groupByOptions.map(({ value, label, description, disabled }) => (_jsxs("div", { className: "relative flex items-start", children: [_jsx("div", { className: "flex h-6 items-center", children: _jsx("input", { id: value, name: value, type: "checkbox", disabled: disabled, className: "h-4 w-4 rounded border-gray-300 text-indigo-600 focus:ring-indigo-600", checked: groupBy.includes(value), onChange: () => toggleGroupBy(value) }) }), _jsxs("div", { className: "ml-3 text-sm leading-6", children: [_jsx("label", { htmlFor: value, className: "font-medium text-gray-900 dark:text-gray-200", children: label }), _jsx("p", { className: "text-gray-500 dark:text-gray-400", children: description })] })] }, value))) }) }) }) }) })] })] }));
56
56
  };
57
57
  export default GroupByDropdown;
@@ -18,6 +18,6 @@ const RuntimeToggle = ({ id, state, toggle, label, description, }) => {
18
18
  return (_jsxs("div", { className: "relative flex items-start", children: [_jsx("div", { className: "flex h-6 items-center", children: _jsx("input", { id: id, name: id, type: "checkbox", className: "h-4 w-4 rounded border-gray-300 text-indigo-600 focus:ring-indigo-600", checked: state, onChange: () => toggle() }) }), _jsxs("div", { className: "ml-3 text-sm leading-6", children: [_jsx("label", { htmlFor: id, className: "font-medium text-gray-900 dark:text-gray-200", children: label }), _jsx("p", { className: "text-gray-500 dark:text-gray-400", children: description })] })] }, id));
19
19
  };
20
20
  const RuntimeFilterDropdown = ({ showRuntimeRuby, toggleShowRuntimeRuby, showRuntimePython, toggleShowRuntimePython, showInterpretedOnly, toggleShowInterpretedOnly, }) => {
21
- return (_jsxs("div", { children: [_jsx("label", { className: "text-sm", children: "Runtimes" }), _jsxs(Menu, { as: "div", className: "relative text-left", children: [_jsx("div", { children: _jsxs(Menu.Button, { className: "relative w-full cursor-default rounded-md border bg-white py-2 pl-3 pr-[1.7rem] text-left text-sm shadow-sm focus:border-indigo-500 focus:outline-none focus:ring-1 focus:ring-indigo-500 dark:border-gray-600 dark:bg-gray-900 sm:text-sm", children: [_jsx("span", { className: "block overflow-x-hidden text-ellipsis", children: "Runtimes" }), _jsx("span", { className: "pointer-events-none absolute inset-y-0 right-0 ml-3 flex items-center pr-2 text-gray-400", children: _jsx(Icon, { icon: "heroicons:chevron-down-20-solid", "aria-hidden": "true" }) })] }) }), _jsx(Transition, { as: Fragment, leave: "transition ease-in duration-100", leaveFrom: "opacity-100", leaveTo: "opacity-0", children: _jsx(Menu.Items, { className: "absolute left-0 z-10 mt-1 min-w-[400px] overflow-auto rounded-md bg-gray-50 py-1 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", children: _jsx("div", { className: "p-4", children: _jsx("fieldset", { children: _jsxs("div", { className: "space-y-5", children: [_jsx(RuntimeToggle, { id: "show-runtime-ruby", state: showRuntimeRuby, toggle: toggleShowRuntimeRuby, label: "Ruby", description: "Show Ruby runtime functions." }), _jsx(RuntimeToggle, { id: "show-runtime-python", state: showRuntimePython, toggle: toggleShowRuntimePython, label: "Python", description: "Show Python runtime functions." }), _jsx(RuntimeToggle, { id: "show-interpreted-only", state: showInterpretedOnly, toggle: toggleShowInterpretedOnly, label: "Interpreted Only", description: "Show only interpreted functions." })] }) }) }) }) })] })] }));
21
+ return (_jsxs("div", { children: [_jsx("label", { className: "text-sm", children: "Runtimes" }), _jsxs(Menu, { as: "div", className: "relative text-left", children: [_jsx("div", { children: _jsxs(Menu.Button, { className: "relative w-full cursor-default rounded-md border bg-white py-2 pl-3 pr-[1.7rem] text-left text-sm shadow-sm focus:border-indigo-500 focus:outline-none focus:ring-1 focus:ring-indigo-500 dark:border-gray-600 dark:bg-gray-900 sm:text-sm", id: "h-runtimes-filter", children: [_jsx("span", { className: "block overflow-x-hidden text-ellipsis", children: "Runtimes" }), _jsx("span", { className: "pointer-events-none absolute inset-y-0 right-0 ml-3 flex items-center pr-2 text-gray-400", children: _jsx(Icon, { icon: "heroicons:chevron-down-20-solid", "aria-hidden": "true" }) })] }) }), _jsx(Transition, { as: Fragment, leave: "transition ease-in duration-100", leaveFrom: "opacity-100", leaveTo: "opacity-0", children: _jsx(Menu.Items, { className: "absolute left-0 z-10 mt-1 min-w-[400px] overflow-auto rounded-md bg-gray-50 py-1 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", children: _jsx("div", { className: "p-4", children: _jsx("fieldset", { children: _jsxs("div", { className: "space-y-5", children: [_jsx(RuntimeToggle, { id: "show-runtime-ruby", state: showRuntimeRuby, toggle: toggleShowRuntimeRuby, label: "Ruby", description: "Show Ruby runtime functions." }), _jsx(RuntimeToggle, { id: "show-runtime-python", state: showRuntimePython, toggle: toggleShowRuntimePython, label: "Python", description: "Show Python runtime functions." }), _jsx(RuntimeToggle, { id: "show-interpreted-only", state: showInterpretedOnly, toggle: toggleShowInterpretedOnly, label: "Interpreted Only", description: "Show only interpreted functions." })] }) }) }) }) })] })] }));
22
22
  };
23
23
  export default RuntimeFilterDropdown;
@@ -14,7 +14,7 @@ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-run
14
14
  import { Select } from '@parca/components';
15
15
  import { FIELD_CUMULATIVE, FIELD_DIFF, FIELD_FUNCTION_NAME } from '../IcicleGraphArrow';
16
16
  const SortBySelect = ({ sortBy, setSortBy, compareMode, }) => {
17
- return (_jsxs("div", { children: [_jsx("label", { className: "text-sm", children: "Sort" }), _jsx(Select, { className: "!px-3", items: [
17
+ return (_jsxs("div", { children: [_jsx("label", { className: "text-sm", children: "Sort" }), _jsx(Select, { id: "h-sort-by-filter", className: "!px-3", items: [
18
18
  {
19
19
  key: FIELD_FUNCTION_NAME,
20
20
  disabled: false,
@@ -39,7 +39,7 @@ const ShowHideLegendButton = ({ navigateTo, isHalfScreen, }) => {
39
39
  const setColorStackLegend = useCallback((value) => {
40
40
  setStoreColorStackLegend(value);
41
41
  }, [setStoreColorStackLegend]);
42
- return (_jsx(_Fragment, { children: colorProfileName === 'default' || compareMode ? null : (_jsx(_Fragment, { children: isHalfScreen ? (_jsx(IconButton, { className: "rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 items-center flex border border-gray-200 dark:border-gray-600 dark:text-white justify-center !py-2 !px-3 cursor-pointer min-h-[38px]", icon: isColorStackLegendEnabled ? 'ph:eye-closed' : 'ph:eye', toolTipText: isColorStackLegendEnabled ? 'Hide legend' : 'Show legend', onClick: () => setColorStackLegend(isColorStackLegendEnabled ? 'false' : 'true') })) : (_jsxs(Button, { className: "gap-2 w-max", variant: "neutral", onClick: () => setColorStackLegend(isColorStackLegendEnabled ? 'false' : 'true'), children: [isColorStackLegendEnabled ? 'Hide legend' : 'Show legend', _jsx(Icon, { icon: isColorStackLegendEnabled ? 'ph:eye-closed' : 'ph:eye', width: 20 })] })) })) }));
42
+ return (_jsx(_Fragment, { children: colorProfileName === 'default' || compareMode ? null : (_jsx(_Fragment, { children: isHalfScreen ? (_jsx(IconButton, { className: "rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 items-center flex border border-gray-200 dark:border-gray-600 dark:text-white justify-center !py-2 !px-3 cursor-pointer min-h-[38px]", icon: isColorStackLegendEnabled ? 'ph:eye-closed' : 'ph:eye', toolTipText: isColorStackLegendEnabled ? 'Hide legend' : 'Show legend', onClick: () => setColorStackLegend(isColorStackLegendEnabled ? 'false' : 'true'), id: "h-show-legend-button" })) : (_jsxs(Button, { className: "gap-2 w-max", variant: "neutral", onClick: () => setColorStackLegend(isColorStackLegendEnabled ? 'false' : 'true'), id: "h-show-legend-button", children: [isColorStackLegendEnabled ? 'Hide legend' : 'Show legend', _jsx(Icon, { icon: isColorStackLegendEnabled ? 'ph:eye-closed' : 'ph:eye', width: 20 })] })) })) }));
43
43
  };
44
44
  const GroupAndSortActionButtons = ({ navigateTo }) => {
45
45
  const [storeSortBy = FIELD_FUNCTION_NAME, setStoreSortBy] = useURLState({
@@ -24,6 +24,6 @@ const CompareButton = ({ disabled, onClick, }) => {
24
24
  const compareExplanation = 'Compare two profiles and see the relative difference between them more clearly.';
25
25
  if (disabled)
26
26
  return _jsx(_Fragment, {});
27
- return (_jsxs("div", { ref: setComparePopperReferenceElement, children: [_jsx(Button, { variant: "neutral", disabled: disabled, onClick: onClick, onMouseEnter: () => setCompareHover(true), onMouseLeave: () => setCompareHover(false), children: "Compare" }), compareHover && (_jsx("div", { ref: setComparePopperElement, style: styles.popper, ...attributes.popper, className: "z-50", children: _jsx("div", { className: "flex", children: _jsxs("div", { className: "relative mx-2", children: [_jsx("svg", { className: "left-0 h-1 w-full text-black", x: "0px", y: "0px", viewBox: "0 0 255 127.5", children: _jsx("polygon", { className: "fill-current", points: "0,127.5 127.5,0 255,127.5" }) }), _jsx("div", { className: "right-0 w-40 rounded bg-black px-3 py-2 text-xs text-white", children: compareExplanation })] }) }) }))] }));
27
+ return (_jsxs("div", { ref: setComparePopperReferenceElement, children: [_jsx(Button, { variant: "neutral", disabled: disabled, onClick: onClick, onMouseEnter: () => setCompareHover(true), onMouseLeave: () => setCompareHover(false), id: "h-compare-button", children: "Compare" }), compareHover && (_jsx("div", { ref: setComparePopperElement, style: styles.popper, ...attributes.popper, className: "z-50", children: _jsx("div", { className: "flex", children: _jsxs("div", { className: "relative mx-2", children: [_jsx("svg", { className: "left-0 h-1 w-full text-black", x: "0px", y: "0px", viewBox: "0 0 255 127.5", children: _jsx("polygon", { className: "fill-current", points: "0,127.5 127.5,0 255,127.5" }) }), _jsx("div", { className: "right-0 w-40 rounded bg-black px-3 py-2 text-xs text-white", children: compareExplanation })] }) }) }))] }));
28
28
  };
29
29
  export default CompareButton;
@@ -158,7 +158,7 @@ const ProfileSelector = ({ queryClient, querySelection, selectProfile, selectQue
158
158
  viewComponent !== undefined && _jsx("div", { children: viewComponent?.createViewComponent })] }), _jsx(MatchersInput, { queryClient: queryClient, setMatchersString: setMatchersString, runQuery: setQueryExpression, currentQuery: query })] }), _jsx(DateTimeRangePicker, { onRangeSelection: setTimeRangeSelection, range: timeRangeSelection }), _jsxs(ButtonGroup, { children: [!searchDisabled && (_jsx(_Fragment, { children: !comparing && (_jsx(CompareButton, { disabled: compareDisabled, onClick: handleCompareClick })) })), _jsx(Button, { disabled: searchDisabled, onClick: (e) => {
159
159
  e.preventDefault();
160
160
  setQueryExpression(true);
161
- }, id: "matcher-search-button", children: "Search" })] })] }), _jsx("div", { children: comparing && _jsx(IconButton, { onClick: () => closeProfile(), icon: _jsx(CloseIcon, {}) }) })] }), _jsx("div", { className: "rounded bg-white shadow dark:border-gray-500 dark:bg-gray-700", children: _jsx("div", { style: { height: heightStyle }, children: !isDataLoading &&
161
+ }, id: "h-matcher-search-button", children: "Search" })] })] }), _jsx("div", { children: comparing && _jsx(IconButton, { onClick: () => closeProfile(), icon: _jsx(CloseIcon, {}) }) })] }), _jsx("div", { className: "rounded bg-white shadow dark:border-gray-500 dark:bg-gray-700", children: _jsx("div", { style: { height: heightStyle }, children: !isDataLoading &&
162
162
  querySelection.expression !== undefined &&
163
163
  querySelection.expression.length > 0 &&
164
164
  querySelection.from !== undefined &&
@@ -29,6 +29,6 @@ const FilterByFunctionButton = ({ navigateTo, }) => {
29
29
  setStoreValue(localValue);
30
30
  }
31
31
  }, [localValue, isClearAction, setStoreValue]);
32
- return (_jsx(Input, { placeholder: "Filter by function", className: "text-sm", onAction: onAction, onChange: e => setLocalValue(e.target.value), value: localValue ?? '', onBlur: () => setLocalValue(storeValue), actionIcon: isClearAction ? _jsx(Icon, { icon: "ep:circle-close" }) : _jsx(Icon, { icon: "ep:arrow-right" }) }));
32
+ return (_jsx(Input, { placeholder: "Filter by function", id: "h-filter-by-function", className: "text-sm", onAction: onAction, onChange: e => setLocalValue(e.target.value), value: localValue ?? '', onBlur: () => setLocalValue(storeValue), actionIcon: isClearAction ? _jsx(Icon, { icon: "ep:circle-close" }) : _jsx(Icon, { icon: "ep:arrow-right" }) }));
33
33
  };
34
34
  export default FilterByFunctionButton;
@@ -156,7 +156,7 @@ export const ProfileView = ({ total, filtered, flamegraphData, topTableData, cal
156
156
  'items-center': hasProfileSource,
157
157
  }), children: [_jsxs("div", { children: [hasProfileSource && (_jsxs("div", { className: "max-w-[300px]", children: [_jsx("div", { className: "text-sm font-medium capitalize", children: headerParts.length > 0 ? headerParts[0].replace(/"/g, '') : '' }), _jsx("div", { className: "text-xs", children: headerParts.length > 1
158
158
  ? headerParts[headerParts.length - 1].replace(/"/g, '')
159
- : '' })] })), profileViewExternalMainActions != null ? profileViewExternalMainActions : null] }), _jsxs("div", { className: "lg:flex flex-wrap items-center gap-2 md:justify-end hidden", children: [_jsx(FilterByFunctionButton, { navigateTo: navigateTo }), profileViewExternalSubActions != null ? profileViewExternalSubActions : null, _jsx(UserPreferences, { customButton: _jsxs(Button, { className: "gap-2", variant: "neutral", children: ["Preferences", _jsx(Icon, { icon: "pajamas:preferences", width: 20 })] }) }), profileSource !== undefined && queryClient !== undefined ? (_jsx(ProfileShareButton, { queryRequest: profileSource.QueryRequest(), queryClient: queryClient })) : null, _jsxs(Button, { className: "gap-2", variant: "neutral", onClick: e => {
159
+ : '' })] })), profileViewExternalMainActions != null ? profileViewExternalMainActions : null] }), _jsxs("div", { className: "lg:flex flex-wrap items-center gap-2 md:justify-end hidden", children: [_jsx(FilterByFunctionButton, { navigateTo: navigateTo }), profileViewExternalSubActions != null ? profileViewExternalSubActions : null, _jsx(UserPreferences, { customButton: _jsxs(Button, { className: "gap-2", variant: "neutral", id: "h-viz-preferences", children: ["Preferences", _jsx(Icon, { icon: "pajamas:preferences", width: 20 })] }) }), profileSource !== undefined && queryClient !== undefined ? (_jsx(ProfileShareButton, { queryRequest: profileSource.QueryRequest(), queryClient: queryClient })) : null, _jsxs(Button, { id: "h-download-pprof", className: "gap-2", variant: "neutral", onClick: e => {
160
160
  e.preventDefault();
161
161
  onDownloadPProf();
162
162
  }, disabled: pprofDownloading, children: [pprofDownloading != null && pprofDownloading ? 'Downloading...' : 'Download pprof', _jsx(Icon, { icon: "material-symbols:download", width: 20 })] }), _jsx(ViewSelector, { defaultValue: "", navigateTo: navigateTo, position: -1, placeholderText: "Add panel", icon: _jsx(Icon, { icon: "material-symbols:add", width: 20 }), addView: true, disabled: isMultiPanelView || dashboardItems.length < 1 })] })] }), _jsx("div", { className: "w-full", ref: ref, children: _jsx(DragDropContext, { onDragEnd: onDragEnd, children: _jsx(Droppable, { droppableId: "droppable", direction: "horizontal", children: provided => (_jsx("div", { ref: provided.innerRef, className: cx('grid w-full gap-2', isMultiPanelView ? 'grid-cols-2' : 'grid-cols-1'), ...provided.droppableProps, children: dashboardItems.map((dashboardItem, index) => {
@@ -55,6 +55,6 @@ const ProfileShareModal = ({ isOpen, closeModal, queryRequest, queryClient, }) =
55
55
  };
56
56
  const ProfileShareButton = ({ queryRequest, queryClient, disabled = false }) => {
57
57
  const [isOpen, setIsOpen] = useState(false);
58
- return (_jsxs(_Fragment, { children: [_jsxs(Button, { variant: "neutral", onClick: () => setIsOpen(true), disabled: disabled, className: "gap-2", children: ["Share profile", _jsx(Icon, { icon: "material-symbols:share", width: 20 })] }), _jsx(ProfileShareModal, { isOpen: isOpen, closeModal: () => setIsOpen(false), queryRequest: queryRequest, queryClient: queryClient })] }));
58
+ return (_jsxs(_Fragment, { children: [_jsxs(Button, { variant: "neutral", onClick: () => setIsOpen(true), disabled: disabled, className: "gap-2", id: "h-share-profile-button", children: ["Share profile", _jsx(Icon, { icon: "material-symbols:share", width: 20 })] }), _jsx(ProfileShareModal, { isOpen: isOpen, closeModal: () => setIsOpen(false), queryRequest: queryRequest, queryClient: queryClient })] }));
59
59
  };
60
60
  export default ProfileShareButton;
package/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@parca/profile",
3
- "version": "0.16.336",
3
+ "version": "0.16.338",
4
4
  "description": "Profile viewing libraries",
5
5
  "dependencies": {
6
6
  "@parca/client": "^0.16.100",
7
- "@parca/components": "^0.16.246",
7
+ "@parca/components": "^0.16.248",
8
8
  "@parca/dynamicsize": "^0.16.60",
9
9
  "@parca/hooks": "^0.0.38",
10
10
  "@parca/parser": "^0.16.68",
11
- "@parca/store": "^0.16.124",
12
- "@parca/utilities": "^0.0.52",
11
+ "@parca/store": "^0.16.125",
12
+ "@parca/utilities": "^0.0.53",
13
13
  "@tanstack/react-query": "^4.0.5",
14
14
  "@types/react-beautiful-dnd": "^13.1.3",
15
15
  "apache-arrow": "^12.0.0",
@@ -51,5 +51,5 @@
51
51
  "access": "public",
52
52
  "registry": "https://registry.npmjs.org/"
53
53
  },
54
- "gitHead": "bae8003c64921ae6ea9b7ccd1eeea5412f9fa55c"
54
+ "gitHead": "0e48d0c8f6179e3e5b945a2a6d19704f62375a5b"
55
55
  }
@@ -73,7 +73,10 @@ const GroupByDropdown = ({
73
73
  <div className="relative">
74
74
  <label className="text-sm">Group</label>
75
75
  <Menu as="div" className="relative text-left">
76
- <Menu.Button className="relative w-max cursor-default rounded-md border bg-white py-2 pl-3 pr-[1.7rem] text-left text-sm shadow-sm focus:border-indigo-500 focus:outline-none focus:ring-1 focus:ring-indigo-500 dark:border-gray-600 dark:bg-gray-900 sm:text-sm">
76
+ <Menu.Button
77
+ id="h-group-by-filter"
78
+ className="relative w-max cursor-default rounded-md border bg-white py-2 pl-3 pr-[1.7rem] text-left text-sm shadow-sm focus:border-indigo-500 focus:outline-none focus:ring-1 focus:ring-indigo-500 dark:border-gray-600 dark:bg-gray-900 sm:text-sm"
79
+ >
77
80
  <span className="block overflow-x-hidden text-ellipsis">{label}</span>
78
81
  <span className="pointer-events-none absolute inset-y-0 right-0 flex items-center pr-2 text-gray-400">
79
82
  <Icon icon="heroicons:chevron-down-20-solid" aria-hidden="true" />
@@ -71,7 +71,10 @@ const RuntimeFilterDropdown = ({
71
71
  <label className="text-sm">Runtimes</label>
72
72
  <Menu as="div" className="relative text-left">
73
73
  <div>
74
- <Menu.Button className="relative w-full cursor-default rounded-md border bg-white py-2 pl-3 pr-[1.7rem] text-left text-sm shadow-sm focus:border-indigo-500 focus:outline-none focus:ring-1 focus:ring-indigo-500 dark:border-gray-600 dark:bg-gray-900 sm:text-sm">
74
+ <Menu.Button
75
+ className="relative w-full cursor-default rounded-md border bg-white py-2 pl-3 pr-[1.7rem] text-left text-sm shadow-sm focus:border-indigo-500 focus:outline-none focus:ring-1 focus:ring-indigo-500 dark:border-gray-600 dark:bg-gray-900 sm:text-sm"
76
+ id="h-runtimes-filter"
77
+ >
75
78
  <span className="block overflow-x-hidden text-ellipsis">Runtimes</span>
76
79
  <span className="pointer-events-none absolute inset-y-0 right-0 ml-3 flex items-center pr-2 text-gray-400">
77
80
  <Icon icon="heroicons:chevron-down-20-solid" aria-hidden="true" />
@@ -28,6 +28,7 @@ const SortBySelect = ({
28
28
  <div>
29
29
  <label className="text-sm">Sort</label>
30
30
  <Select
31
+ id="h-sort-by-filter"
31
32
  className="!px-3"
32
33
  items={[
33
34
  {
@@ -97,12 +97,14 @@ const ShowHideLegendButton = ({
97
97
  icon={isColorStackLegendEnabled ? 'ph:eye-closed' : 'ph:eye'}
98
98
  toolTipText={isColorStackLegendEnabled ? 'Hide legend' : 'Show legend'}
99
99
  onClick={() => setColorStackLegend(isColorStackLegendEnabled ? 'false' : 'true')}
100
+ id="h-show-legend-button"
100
101
  />
101
102
  ) : (
102
103
  <Button
103
104
  className="gap-2 w-max"
104
105
  variant="neutral"
105
106
  onClick={() => setColorStackLegend(isColorStackLegendEnabled ? 'false' : 'true')}
107
+ id="h-show-legend-button"
106
108
  >
107
109
  {isColorStackLegendEnabled ? 'Hide legend' : 'Show legend'}
108
110
  <Icon icon={isColorStackLegendEnabled ? 'ph:eye-closed' : 'ph:eye'} width={20} />
@@ -45,6 +45,7 @@ const CompareButton = ({
45
45
  onClick={onClick}
46
46
  onMouseEnter={() => setCompareHover(true)}
47
47
  onMouseLeave={() => setCompareHover(false)}
48
+ id="h-compare-button"
48
49
  >
49
50
  Compare
50
51
  </Button>
@@ -287,7 +287,7 @@ const ProfileSelector = ({
287
287
  e.preventDefault();
288
288
  setQueryExpression(true);
289
289
  }}
290
- id="matcher-search-button"
290
+ id="h-matcher-search-button"
291
291
  >
292
292
  Search
293
293
  </Button>
@@ -42,6 +42,7 @@ const FilterByFunctionButton = ({
42
42
  return (
43
43
  <Input
44
44
  placeholder="Filter by function"
45
+ id="h-filter-by-function"
45
46
  className="text-sm"
46
47
  onAction={onAction}
47
48
  onChange={e => setLocalValue(e.target.value)}
@@ -370,7 +370,7 @@ export const ProfileView = ({
370
370
  {profileViewExternalSubActions != null ? profileViewExternalSubActions : null}
371
371
  <UserPreferences
372
372
  customButton={
373
- <Button className="gap-2" variant="neutral">
373
+ <Button className="gap-2" variant="neutral" id="h-viz-preferences">
374
374
  Preferences
375
375
  <Icon icon="pajamas:preferences" width={20} />
376
376
  </Button>
@@ -383,6 +383,7 @@ export const ProfileView = ({
383
383
  />
384
384
  ) : null}
385
385
  <Button
386
+ id="h-download-pprof"
386
387
  className="gap-2"
387
388
  variant="neutral"
388
389
  onClick={e => {
@@ -132,6 +132,7 @@ const ProfileShareButton = ({queryRequest, queryClient, disabled = false}: Props
132
132
  onClick={() => setIsOpen(true)}
133
133
  disabled={disabled}
134
134
  className="gap-2"
135
+ id="h-share-profile-button"
135
136
  >
136
137
  Share profile
137
138
  <Icon icon="material-symbols:share" width={20} />