@parca/profile 0.19.106 → 0.19.107
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 +4 -0
- package/dist/ProfileFlameGraph/FlameGraphArrow/useVisibleNodes.js +1 -1
- package/dist/ProfileView/components/DashboardItems/index.d.ts.map +1 -1
- package/dist/ProfileView/components/DashboardItems/index.js +1 -1
- package/dist/ProfileView/types/visualization.d.ts +4 -3
- package/dist/ProfileView/types/visualization.d.ts.map +1 -1
- package/dist/Table/index.d.ts +2 -0
- package/dist/Table/index.d.ts.map +1 -1
- package/dist/Table/index.js +4 -1
- package/dist/useSumBy.js +1 -1
- package/package.json +2 -2
- package/src/ProfileFlameGraph/FlameGraphArrow/useVisibleNodes.ts +1 -1
- package/src/ProfileView/components/DashboardItems/index.tsx +1 -0
- package/src/ProfileView/types/visualization.ts +5 -3
- package/src/Table/index.tsx +6 -0
- package/src/useSumBy.ts +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,10 @@
|
|
|
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.19.107](https://github.com/parca-dev/parca/compare/@parca/profile@0.19.106...@parca/profile@0.19.107) (2025-12-22)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @parca/profile
|
|
9
|
+
|
|
6
10
|
## [0.19.106](https://github.com/parca-dev/parca/compare/@parca/profile@0.19.105...@parca/profile@0.19.106) (2025-12-18)
|
|
7
11
|
|
|
8
12
|
**Note:** Version bump only for package @parca/profile
|
|
@@ -87,7 +87,7 @@ export const useVisibleNodes = ({ table, viewport, total, width, selectedRow, ef
|
|
|
87
87
|
renderedRangeRef.current = {
|
|
88
88
|
minDepth: Infinity,
|
|
89
89
|
maxDepth: -Infinity,
|
|
90
|
-
table
|
|
90
|
+
table,
|
|
91
91
|
};
|
|
92
92
|
}
|
|
93
93
|
// Expand the rendered range (never shrink when scrolling up/down)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/ProfileView/components/DashboardItems/index.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAW,wBAAwB,EAAC,MAAM,OAAO,CAAC;AAEzD,OAAO,EAAC,kBAAkB,EAAC,MAAM,eAAe,CAAC;AAIjD,OAAO,EAAC,gBAAgB,EAAC,MAAM,kDAAkD,CAAC;AAClF,OAAO,EAAC,aAAa,EAAC,MAAM,wBAAwB,CAAC;AAIrD,OAAO,KAAK,EACV,cAAc,EACd,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,iBAAiB,EAClB,MAAM,2BAA2B,CAAC;AAEnC,UAAU,qBAAqB;IAC7B,IAAI,EAAE,iBAAiB,CAAC;IACxB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,GAAG,SAAS,CAAC;IAChC,cAAc,EAAE,cAAc,CAAC;IAC/B,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,YAAY,EAAE,YAAY,CAAC;IAC3B,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,aAAa,EAAE,aAAa,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,gBAAgB,EAAE,CAAC;IACjC,kBAAkB,EAAE,CAAC,IAAI,EAAE,gBAAgB,EAAE,KAAK,IAAI,CAAC;IACvD,IAAI,CAAC,EAAE;QACL,QAAQ,CAAC,EAAE,wBAAwB,CAAC;KACrC,CAAC;IACF,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAClC;AAED,eAAO,MAAM,gBAAgB,GAAI,qLAe9B,qBAAqB,KAAG,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/ProfileView/components/DashboardItems/index.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAW,wBAAwB,EAAC,MAAM,OAAO,CAAC;AAEzD,OAAO,EAAC,kBAAkB,EAAC,MAAM,eAAe,CAAC;AAIjD,OAAO,EAAC,gBAAgB,EAAC,MAAM,kDAAkD,CAAC;AAClF,OAAO,EAAC,aAAa,EAAC,MAAM,wBAAwB,CAAC;AAIrD,OAAO,KAAK,EACV,cAAc,EACd,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,iBAAiB,EAClB,MAAM,2BAA2B,CAAC;AAEnC,UAAU,qBAAqB;IAC7B,IAAI,EAAE,iBAAiB,CAAC;IACxB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,GAAG,SAAS,CAAC;IAChC,cAAc,EAAE,cAAc,CAAC;IAC/B,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,YAAY,EAAE,YAAY,CAAC;IAC3B,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,aAAa,EAAE,aAAa,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,gBAAgB,EAAE,CAAC;IACjC,kBAAkB,EAAE,CAAC,IAAI,EAAE,gBAAgB,EAAE,KAAK,IAAI,CAAC;IACvD,IAAI,CAAC,EAAE;QACL,QAAQ,CAAC,EAAE,wBAAwB,CAAC;KACrC,CAAC;IACF,WAAW,CAAC,EAAE,kBAAkB,CAAC;CAClC;AAED,eAAO,MAAM,gBAAgB,GAAI,qLAe9B,qBAAqB,KAAG,GAAG,CAAC,OAgG9B,CAAC"}
|
|
@@ -35,7 +35,7 @@ export const getDashboardItem = ({ type, isHalfScreen, dimensions, flamegraphDat
|
|
|
35
35
|
: dimensions.width - 16
|
|
36
36
|
: 0, metadataMappingFiles: flamechartData.metadataMappingFiles, metadataLoading: flamechartData.metadataLoading, profileSource: profileSource, isFlameChart: true }));
|
|
37
37
|
case 'table':
|
|
38
|
-
return topTableData != null ? (_jsx(Table, { total: total, filtered: filtered, loading: topTableData.loading, data: topTableData.arrow?.record, unit: topTableData.unit, profileType: profileSource?.ProfileType(), isHalfScreen: isHalfScreen, metadataMappingFiles: flamegraphData.metadataMappingFiles })) : (_jsx(_Fragment, {}));
|
|
38
|
+
return topTableData != null ? (_jsx(Table, { error: topTableData.error, total: total, filtered: filtered, loading: topTableData.loading, data: topTableData.arrow?.record, unit: topTableData.unit, profileType: profileSource?.ProfileType(), isHalfScreen: isHalfScreen, metadataMappingFiles: flamegraphData.metadataMappingFiles })) : (_jsx(_Fragment, {}));
|
|
39
39
|
case 'sandwich':
|
|
40
40
|
return topTableData != null ? (_jsx(Sandwich, { profileSource: profileSource, sandwichData: sandwichData })) : (_jsx(_Fragment, {}));
|
|
41
41
|
case 'source':
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { RpcError } from '@protobuf-ts/runtime-rpc';
|
|
1
2
|
import { FlamegraphArrow, QueryServiceClient, Source, TableArrow } from '@parca/client';
|
|
2
3
|
import { ProfileSource } from '../../ProfileSource';
|
|
3
4
|
export interface FlamegraphData {
|
|
@@ -5,7 +6,7 @@ export interface FlamegraphData {
|
|
|
5
6
|
arrow?: FlamegraphArrow;
|
|
6
7
|
total?: bigint;
|
|
7
8
|
filtered?: bigint;
|
|
8
|
-
error
|
|
9
|
+
error: RpcError | null;
|
|
9
10
|
metadataMappingFiles?: string[];
|
|
10
11
|
metadataLoading: boolean;
|
|
11
12
|
metadataLabels?: string[];
|
|
@@ -16,13 +17,13 @@ export interface TopTableData {
|
|
|
16
17
|
arrow?: TableArrow;
|
|
17
18
|
total?: bigint;
|
|
18
19
|
filtered?: bigint;
|
|
19
|
-
error
|
|
20
|
+
error: RpcError | null;
|
|
20
21
|
unit?: string;
|
|
21
22
|
}
|
|
22
23
|
export interface SourceData {
|
|
23
24
|
loading: boolean;
|
|
24
25
|
data?: Source;
|
|
25
|
-
error
|
|
26
|
+
error: RpcError | null;
|
|
26
27
|
}
|
|
27
28
|
export interface SandwichData {
|
|
28
29
|
callees: FlamegraphData;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"visualization.d.ts","sourceRoot":"","sources":["../../../src/ProfileView/types/visualization.ts"],"names":[],"mappings":"AAaA,OAAO,EAAC,eAAe,EAAE,kBAAkB,EAAE,MAAM,EAAE,UAAU,EAAC,MAAM,eAAe,CAAC;AAEtF,OAAO,EAAC,aAAa,EAAC,MAAM,qBAAqB,CAAC;AAElD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,
|
|
1
|
+
{"version":3,"file":"visualization.d.ts","sourceRoot":"","sources":["../../../src/ProfileView/types/visualization.ts"],"names":[],"mappings":"AAaA,OAAO,EAAC,QAAQ,EAAC,MAAM,0BAA0B,CAAC;AAElD,OAAO,EAAC,eAAe,EAAE,kBAAkB,EAAE,MAAM,EAAE,UAAU,EAAC,MAAM,eAAe,CAAC;AAEtF,OAAO,EAAC,aAAa,EAAC,MAAM,qBAAqB,CAAC;AAElD,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;IACvB,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,cAAc,CAAC;IACxB,OAAO,EAAE,cAAc,CAAC;CACzB;AAED,MAAM,MAAM,iBAAiB,GACzB,YAAY,GACZ,WAAW,GACX,OAAO,GACP,QAAQ,GACR,YAAY,GACZ,UAAU,CAAC;AAEf,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,cAAc,CAAC;IAC/B,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,aAAa,EAAE,aAAa,CAAC;IAC7B,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,EAAE,MAAM,IAAI,CAAC;IAC5B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,yBAAyB,CAAC,EAAE,OAAO,CAAC;CACrC"}
|
package/dist/Table/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
+
import { RpcError } from '@protobuf-ts/runtime-rpc';
|
|
2
3
|
import { ProfileType } from '@parca/parser';
|
|
3
4
|
import { DataRow } from './utils/functions';
|
|
4
5
|
export declare const FIELD_MAPPING_FILE = "mapping_file";
|
|
@@ -23,6 +24,7 @@ export interface TableProps {
|
|
|
23
24
|
isHalfScreen: boolean;
|
|
24
25
|
unit?: string;
|
|
25
26
|
metadataMappingFiles?: string[];
|
|
27
|
+
error: RpcError | null;
|
|
26
28
|
}
|
|
27
29
|
export declare const Table: React.NamedExoticComponent<TableProps>;
|
|
28
30
|
export default Table;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Table/index.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAgD,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Table/index.tsx"],"names":[],"mappings":"AAaA,OAAO,KAAgD,MAAM,OAAO,CAAC;AAErE,OAAO,EAAC,QAAQ,EAAC,MAAM,0BAA0B,CAAC;AAYlD,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;AAS1C,OAAO,EAAC,OAAO,EAAmC,MAAM,mBAAmB,CAAC;AAE5E,eAAO,MAAM,kBAAkB,iBAAiB,CAAC;AACjD,eAAO,MAAM,sBAAsB,qBAAqB,CAAC;AACzD,eAAO,MAAM,mBAAmB,kBAAkB,CAAC;AACnD,eAAO,MAAM,0BAA0B,yBAAyB,CAAC;AACjE,eAAO,MAAM,wBAAwB,uBAAuB,CAAC;AAC7D,eAAO,MAAM,UAAU,SAAS,CAAC;AACjC,eAAO,MAAM,eAAe,cAAc,CAAC;AAC3C,eAAO,MAAM,gBAAgB,eAAe,CAAC;AAC7C,eAAO,MAAM,qBAAqB,oBAAoB,CAAC;AACvD,eAAO,MAAM,aAAa,YAAY,CAAC;AACvC,eAAO,MAAM,aAAa,YAAY,CAAC;AAEvC,MAAM,MAAM,GAAG,GAAG,OAAO,CAAC;AAE1B,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,OAAO,KAAK,IAAI,CAAC;IACxD,YAAY,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;CACxB;AAED,eAAO,MAAM,KAAK,wCA0MhB,CAAC;AAEH,eAAe,KAAK,CAAC"}
|
package/dist/Table/index.js
CHANGED
|
@@ -34,7 +34,7 @@ export const FIELD_CUMULATIVE = 'cumulative';
|
|
|
34
34
|
export const FIELD_CUMULATIVE_DIFF = 'cumulative_diff';
|
|
35
35
|
export const FIELD_CALLERS = 'callers';
|
|
36
36
|
export const FIELD_CALLEES = 'callees';
|
|
37
|
-
export const Table = React.memo(function Table({ data, total, filtered, profileType, loading, isHalfScreen, unit, metadataMappingFiles, }) {
|
|
37
|
+
export const Table = React.memo(function Table({ data, total, filtered, profileType, loading, isHalfScreen, unit, metadataMappingFiles, error, }) {
|
|
38
38
|
const currentColorProfile = useCurrentColorProfile();
|
|
39
39
|
const [dashboardItems] = useURLState('dashboard_items', {
|
|
40
40
|
alwaysReturnArray: true,
|
|
@@ -142,6 +142,9 @@ export const Table = React.memo(function Table({ data, total, filtered, profileT
|
|
|
142
142
|
if (loading) {
|
|
143
143
|
return (_jsx("div", { className: "overflow-clip h-[700px] min-h-[700px]", children: _jsx(TableSkeleton, { isHalfScreen: isHalfScreen, isDarkMode: isDarkMode }) }));
|
|
144
144
|
}
|
|
145
|
+
if (error != null) {
|
|
146
|
+
return _jsxs("div", { className: "mx-auto text-center", children: ["Error: ", error.message] });
|
|
147
|
+
}
|
|
145
148
|
if (rows.length === 0) {
|
|
146
149
|
return _jsx("div", { className: "mx-auto text-center", children: "Profile has no samples" });
|
|
147
150
|
}
|
package/dist/useSumBy.js
CHANGED
|
@@ -149,7 +149,7 @@ export const useDraftSumBy = (queryClient, profileType, timeRange, defaultValue)
|
|
|
149
149
|
const { defaultSumBy, isLoading } = useDefaultSumBy(profileType, labelNamesLoading, labels);
|
|
150
150
|
return {
|
|
151
151
|
draftSumBy: draftSumBy ?? defaultSumBy ?? DEFAULT_EMPTY_SUM_BY,
|
|
152
|
-
setDraftSumBy
|
|
152
|
+
setDraftSumBy,
|
|
153
153
|
isDraftSumByLoading: isLoading,
|
|
154
154
|
};
|
|
155
155
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@parca/profile",
|
|
3
|
-
"version": "0.19.
|
|
3
|
+
"version": "0.19.107",
|
|
4
4
|
"description": "Profile viewing libraries",
|
|
5
5
|
"dependencies": {
|
|
6
6
|
"@floating-ui/react": "^0.27.12",
|
|
@@ -84,5 +84,5 @@
|
|
|
84
84
|
"access": "public",
|
|
85
85
|
"registry": "https://registry.npmjs.org/"
|
|
86
86
|
},
|
|
87
|
-
"gitHead": "
|
|
87
|
+
"gitHead": "dc8ae4a8f538ea9f3c16e8f9047970c2ce2b8c2f"
|
|
88
88
|
}
|
|
@@ -11,6 +11,8 @@
|
|
|
11
11
|
// See the License for the specific language governing permissions and
|
|
12
12
|
// limitations under the License.
|
|
13
13
|
|
|
14
|
+
import {RpcError} from '@protobuf-ts/runtime-rpc';
|
|
15
|
+
|
|
14
16
|
import {FlamegraphArrow, QueryServiceClient, Source, TableArrow} from '@parca/client';
|
|
15
17
|
|
|
16
18
|
import {ProfileSource} from '../../ProfileSource';
|
|
@@ -20,7 +22,7 @@ export interface FlamegraphData {
|
|
|
20
22
|
arrow?: FlamegraphArrow;
|
|
21
23
|
total?: bigint;
|
|
22
24
|
filtered?: bigint;
|
|
23
|
-
error
|
|
25
|
+
error: RpcError | null;
|
|
24
26
|
metadataMappingFiles?: string[];
|
|
25
27
|
metadataLoading: boolean;
|
|
26
28
|
metadataLabels?: string[];
|
|
@@ -32,14 +34,14 @@ export interface TopTableData {
|
|
|
32
34
|
arrow?: TableArrow;
|
|
33
35
|
total?: bigint;
|
|
34
36
|
filtered?: bigint;
|
|
35
|
-
error
|
|
37
|
+
error: RpcError | null;
|
|
36
38
|
unit?: string;
|
|
37
39
|
}
|
|
38
40
|
|
|
39
41
|
export interface SourceData {
|
|
40
42
|
loading: boolean;
|
|
41
43
|
data?: Source;
|
|
42
|
-
error
|
|
44
|
+
error: RpcError | null;
|
|
43
45
|
}
|
|
44
46
|
|
|
45
47
|
export interface SandwichData {
|
package/src/Table/index.tsx
CHANGED
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
|
|
14
14
|
import React, {useCallback, useEffect, useMemo, useRef} from 'react';
|
|
15
15
|
|
|
16
|
+
import {RpcError} from '@protobuf-ts/runtime-rpc';
|
|
16
17
|
import {tableFromIPC} from 'apache-arrow';
|
|
17
18
|
import {AnimatePresence, motion} from 'framer-motion';
|
|
18
19
|
import {useContextMenu} from 'react-contexify';
|
|
@@ -59,6 +60,7 @@ export interface TableProps {
|
|
|
59
60
|
isHalfScreen: boolean;
|
|
60
61
|
unit?: string;
|
|
61
62
|
metadataMappingFiles?: string[];
|
|
63
|
+
error: RpcError | null;
|
|
62
64
|
}
|
|
63
65
|
|
|
64
66
|
export const Table = React.memo(function Table({
|
|
@@ -70,6 +72,7 @@ export const Table = React.memo(function Table({
|
|
|
70
72
|
isHalfScreen,
|
|
71
73
|
unit,
|
|
72
74
|
metadataMappingFiles,
|
|
75
|
+
error,
|
|
73
76
|
}: TableProps): React.JSX.Element {
|
|
74
77
|
const currentColorProfile = useCurrentColorProfile();
|
|
75
78
|
const [dashboardItems] = useURLState<string[]>('dashboard_items', {
|
|
@@ -220,6 +223,9 @@ export const Table = React.memo(function Table({
|
|
|
220
223
|
</div>
|
|
221
224
|
);
|
|
222
225
|
}
|
|
226
|
+
if (error != null) {
|
|
227
|
+
return <div className="mx-auto text-center">Error: {error.message}</div>;
|
|
228
|
+
}
|
|
223
229
|
|
|
224
230
|
if (rows.length === 0) {
|
|
225
231
|
return <div className="mx-auto text-center">Profile has no samples</div>;
|