Files
grafana/public/app/plugins/panel/traces/TracesPanel.tsx
Ashley Harrison 4ac248a512 Internationalisation: Mark up panel plugins for translations (#106068)
* config for panel plugin translations

* markup

* tweaks

* prettier

* use data-testid

* rename disable rule now it's been moved

* final markup
2025-05-29 18:13:25 +01:00

63 lines
2.1 KiB
TypeScript

import { css } from '@emotion/css';
import { useMemo, createRef } from 'react';
import { useAsync } from 'react-use';
import { Field, LinkModel, PanelProps } from '@grafana/data';
import { Trans } from '@grafana/i18n';
import { getDataSourceSrv } from '@grafana/runtime';
import { TraceView } from 'app/features/explore/TraceView/TraceView';
import { SpanLinkFunc } from 'app/features/explore/TraceView/components';
import { transformDataFrames } from 'app/features/explore/TraceView/utils/transform';
import { replaceSearchVariables, SearchProps } from '../../../features/explore/TraceView/useSearch';
const styles = {
wrapper: css({
height: '100%',
overflow: 'scroll',
}),
};
export interface TracesPanelOptions {
createSpanLink?: SpanLinkFunc;
focusedSpanId?: string;
createFocusSpanLink?: (traceId: string, spanId: string) => LinkModel<Field>;
spanFilters?: SearchProps;
}
export const TracesPanel = ({ data, options, replaceVariables }: PanelProps<TracesPanelOptions>) => {
const topOfViewRef = createRef<HTMLDivElement>();
const traceProp = useMemo(() => transformDataFrames(data.series[0]), [data.series]);
const dataSource = useAsync(async () => {
return await getDataSourceSrv().get(data.request?.targets[0].datasource?.uid);
});
if (!data || !data.series.length || !traceProp) {
return (
<div className="panel-empty">
<p>
<Trans i18nKey="traces.traces-panel.no-data-found-in-response">No data found in response</Trans>
</p>
</div>
);
}
return (
<div className={styles.wrapper}>
<div ref={topOfViewRef}></div>
<TraceView
dataFrames={data.series}
scrollElementClass={styles.wrapper}
traceProp={traceProp}
datasource={dataSource.value}
topOfViewRef={topOfViewRef}
createSpanLink={options.createSpanLink}
focusedSpanId={options.focusedSpanId}
createFocusSpanLink={options.createFocusSpanLink}
spanFilters={replaceSearchVariables(replaceVariables, options.spanFilters)}
timeRange={data.timeRange}
/>
</div>
);
};