@@ -348,6 +363,7 @@ export default function SpanDetail(props: SpanDetailProps) {
data={tags}
label={t('explore.span-detail.label-span-attributes', 'Span attributes')}
isOpen={isTagsOpen}
+ linksGetter={resourceLinksGetter}
onToggle={() => tagsToggle(spanID)}
/>
{process.tags && (
diff --git a/public/app/features/explore/TraceView/components/utils/date.test.ts b/public/app/features/explore/TraceView/components/utils/date.test.ts
index 2be14600ebc..f18daf51259 100644
--- a/public/app/features/explore/TraceView/components/utils/date.test.ts
+++ b/public/app/features/explore/TraceView/components/utils/date.test.ts
@@ -58,4 +58,9 @@ describe('formatDuration', () => {
const input = 0;
expect(formatDuration(input)).toBe('0μs');
});
+
+ it('skips secondary units that are a whole multiple of the primary unit', () => {
+ const input = 299898037.75;
+ expect(formatDuration(input)).toBe('5m');
+ });
});
diff --git a/public/app/features/explore/TraceView/components/utils/date.tsx b/public/app/features/explore/TraceView/components/utils/date.tsx
index 3c358885359..22b4b5ab9ee 100644
--- a/public/app/features/explore/TraceView/components/utils/date.tsx
+++ b/public/app/features/explore/TraceView/components/utils/date.tsx
@@ -95,9 +95,24 @@ export function formatDuration(duration: number): string {
return `${_round(duration / primaryUnit.microseconds, 2)}${primaryUnit.unit}`;
}
- const primaryValue = Math.floor(duration / primaryUnit.microseconds);
+ let primaryValue = Math.floor(duration / primaryUnit.microseconds);
+ let secondaryValue = (duration / secondaryUnit.microseconds) % primaryUnit.ofPrevious;
+ const secondaryValueRounded = Math.round(secondaryValue);
+
+ // Handle rollover case before rounding (e.g., 60s should become 1m, not 0m 60s)
+ if (secondaryValueRounded === primaryUnit.ofPrevious) {
+ primaryValue += 1;
+ secondaryValue = 0;
+ } else {
+ secondaryValue = secondaryValueRounded;
+ }
+
const primaryUnitString = `${primaryValue}${primaryUnit.unit}`;
- const secondaryValue = Math.round((duration / secondaryUnit.microseconds) % primaryUnit.ofPrevious);
+
+ if (secondaryValue === 0) {
+ return primaryUnitString;
+ }
+
const secondaryUnitString = `${secondaryValue}${secondaryUnit.unit}`;
- return secondaryValue === 0 ? primaryUnitString : `${primaryUnitString} ${secondaryUnitString}`;
+ return `${primaryUnitString} ${secondaryUnitString}`;
}
diff --git a/public/app/features/logs/components/InfiniteScroll.tsx b/public/app/features/logs/components/InfiniteScroll.tsx
index 83f8c7fdab0..90f0919ca7d 100644
--- a/public/app/features/logs/components/InfiniteScroll.tsx
+++ b/public/app/features/logs/components/InfiniteScroll.tsx
@@ -310,7 +310,7 @@ function getNextRange(visibleRange: AbsoluteTimeRange, currentRange: TimeRange,
export const SCROLLING_THRESHOLD = 1e3;
// To get more logs, the difference between the visible range and the current range should be 1 second or more.
-function canScrollTop(
+export function canScrollTop(
visibleRange: AbsoluteTimeRange,
currentRange: TimeRange,
timeZone: TimeZone,
diff --git a/public/app/features/logs/components/LogRowMenuCell.tsx b/public/app/features/logs/components/LogRowMenuCell.tsx
index 2e3699733fd..892a5eea68b 100644
--- a/public/app/features/logs/components/LogRowMenuCell.tsx
+++ b/public/app/features/logs/components/LogRowMenuCell.tsx
@@ -194,7 +194,6 @@ function addClickListenersToNode(nodes: ReactNode[], row: LogRowModel) {
return node;
}
return cloneElement(node, {
- // @ts-expect-error
onClick: (event: MouseEvent
) => {
onClick(event, row);
},
diff --git a/public/app/features/logs/components/panel/InfiniteScroll.tsx b/public/app/features/logs/components/panel/InfiniteScroll.tsx
index c6c310ec88c..c696f2670b3 100644
--- a/public/app/features/logs/components/panel/InfiniteScroll.tsx
+++ b/public/app/features/logs/components/panel/InfiniteScroll.tsx
@@ -7,7 +7,7 @@ import { t } from '@grafana/i18n';
import { config, reportInteraction } from '@grafana/runtime';
import { Spinner, useStyles2 } from '@grafana/ui';
-import { canScrollBottom, getVisibleRange, ScrollDirection, shouldLoadMore } from '../InfiniteScroll';
+import { canScrollBottom, canScrollTop, getVisibleRange, ScrollDirection, shouldLoadMore } from '../InfiniteScroll';
import { getStyles, LogLine } from './LogLine';
import { LogLineMessage } from './LogLineMessage';
@@ -25,7 +25,8 @@ interface Props {
children: (props: ChildrenProps) => ReactNode;
displayedFields: string[];
handleOverflow: (index: number, id: string, height?: number) => void;
- loadMore?: (range: AbsoluteTimeRange) => void;
+ infiniteScrollMode: InfiniteScrollMode;
+ loadMore?: LoadMoreLogsType;
logs: LogListModel[];
onClick: (e: MouseEvent, log: LogListModel) => void;
scrollElement: HTMLDivElement | null;
@@ -38,12 +39,17 @@ interface Props {
wrapLogMessage: boolean;
}
-type InfiniteLoaderState = 'idle' | 'out-of-bounds' | 'pre-scroll' | 'loading';
+type InfiniteLoaderState = 'idle' | 'out-of-bounds' | 'pre-scroll-top' | 'pre-scroll-bottom' | 'loading';
+export type InfiniteScrollMode = 'interval' | 'unlimited';
+export type LoadMoreLogsType =
+ | ((range: AbsoluteTimeRange) => void)
+ | ((range: AbsoluteTimeRange, scrollDirection: ScrollDirection) => void);
export const InfiniteScroll = ({
children,
displayedFields,
handleOverflow,
+ infiniteScrollMode,
loadMore,
logs,
onClick,
@@ -65,6 +71,7 @@ export const InfiniteScroll = ({
const countRef = useRef(0);
const lastLogOfPage = useRef([]);
const styles = useStyles2(getStyles, virtualization);
+ const resetStateTimeout = useRef | null>(null);
useEffect(() => {
// Logs have not changed, ignore effect
@@ -74,12 +81,14 @@ export const InfiniteScroll = ({
// New logs are from infinite scrolling
if (infiniteLoaderState === 'loading') {
// out-of-bounds if no new logs returned
- setInfiniteLoaderState(logs.length === prevLogs.length ? 'out-of-bounds' : 'idle');
+ setInfiniteLoaderState(
+ logs.length === prevLogs.length && infiniteScrollMode === 'interval' ? 'out-of-bounds' : 'idle'
+ );
} else {
lastLogOfPage.current = [];
setAutoScroll(true);
}
- }, [infiniteLoaderState, logs, prevLogs]);
+ }, [infiniteLoaderState, infiniteScrollMode, logs, prevLogs]);
useEffect(() => {
if (prevSortOrder && prevSortOrder !== sortOrder) {
@@ -94,21 +103,31 @@ export const InfiniteScroll = ({
}
}, [autoScroll, setInitialScrollPosition]);
- const onLoadMore = useCallback(() => {
- const newRange = canScrollBottom(getVisibleRange(logs), timeRange, timeZone, sortOrder);
- if (!newRange) {
- setInfiniteLoaderState('out-of-bounds');
- return;
- }
- lastLogOfPage.current.push(logs[logs.length - 1].uid);
- setInfiniteLoaderState('loading');
- loadMore?.(newRange);
+ const onLoadMore = useCallback(
+ (scrollDirection: ScrollDirection) => {
+ const newRange =
+ scrollDirection === ScrollDirection.Bottom
+ ? canScrollBottom(getVisibleRange(logs), timeRange, timeZone, sortOrder)
+ : canScrollTop(getVisibleRange(logs), timeRange, timeZone, sortOrder);
+ if (!newRange && infiniteScrollMode === 'interval') {
+ setInfiniteLoaderState('out-of-bounds');
+ return;
+ }
+ if (scrollDirection === ScrollDirection.Bottom) {
+ lastLogOfPage.current.push(logs[logs.length - 1].uid);
+ } else {
+ lastLogOfPage.current.push(logs[0].uid);
+ }
+ setInfiniteLoaderState('loading');
+ loadMore?.(newRange ?? getVisibleRange(logs), scrollDirection);
- reportInteraction('grafana_logs_infinite_scrolling', {
- direction: 'bottom',
- sort_order: sortOrder,
- });
- }, [loadMore, logs, sortOrder, timeRange, timeZone]);
+ reportInteraction('grafana_logs_infinite_scrolling', {
+ direction: scrollDirection,
+ sort_order: sortOrder,
+ });
+ },
+ [infiniteScrollMode, loadMore, logs, sortOrder, timeRange, timeZone]
+ );
useEffect(() => {
if (!scrollElement || !loadMore || !config.featureToggles.logsInfiniteScrolling) {
@@ -116,14 +135,24 @@ export const InfiniteScroll = ({
}
function handleScroll(event: Event | WheelEvent) {
- if (!scrollElement || !loadMore || !logs.length || infiniteLoaderState !== 'pre-scroll') {
+ if (!scrollElement || !loadMore || !logs.length) {
return;
}
const scrollDirection = shouldLoadMore(event, lastEvent.current, countRef, scrollElement, lastScroll.current);
lastEvent.current = event;
lastScroll.current = scrollElement.scrollTop;
- if (scrollDirection === ScrollDirection.Bottom) {
- onLoadMore();
+ if (infiniteLoaderState !== 'pre-scroll-bottom' && infiniteLoaderState !== 'pre-scroll-top') {
+ if (infiniteScrollMode === 'unlimited' && scrollDirection === ScrollDirection.Top) {
+ setInfiniteLoaderState('pre-scroll-top');
+ resetStateTimeout.current = setTimeout(() => {
+ setInfiniteLoaderState((state) => (state === 'pre-scroll-top' ? 'idle' : state));
+ }, 10000);
+ return;
+ }
+ return;
+ }
+ if (scrollDirection !== ScrollDirection.NoScroll) {
+ onLoadMore(scrollDirection);
}
}
@@ -134,7 +163,26 @@ export const InfiniteScroll = ({
scrollElement.removeEventListener('scroll', handleScroll);
scrollElement.removeEventListener('wheel', handleScroll);
};
- }, [infiniteLoaderState, loadMore, logs.length, onLoadMore, scrollElement]);
+ }, [infiniteLoaderState, infiniteScrollMode, loadMore, logs.length, onLoadMore, scrollElement]);
+
+ useEffect(() => {
+ return () => {
+ if (resetStateTimeout.current) {
+ clearTimeout(resetStateTimeout.current);
+ }
+ };
+ }, []);
+
+ const loadMoreTop = useCallback(() => {
+ if (resetStateTimeout.current) {
+ clearTimeout(resetStateTimeout.current);
+ }
+ onLoadMore(ScrollDirection.Top);
+ }, [onLoadMore]);
+
+ const loadMoreBottom = useCallback(() => {
+ onLoadMore(ScrollDirection.Bottom);
+ }, [onLoadMore]);
const Renderer = useCallback(
({ index, style }: ListChildComponentProps) => {
@@ -143,7 +191,7 @@ export const InfiniteScroll = ({
{getMessageFromInfiniteLoaderState(infiniteLoaderState, sortOrder)}
@@ -170,9 +218,9 @@ export const InfiniteScroll = ({
displayedFields,
handleOverflow,
infiniteLoaderState,
+ loadMoreBottom,
logs,
onClick,
- onLoadMore,
showTime,
sortOrder,
styles,
@@ -192,7 +240,7 @@ export const InfiniteScroll = ({
const lastLogIndex = logs.length - 1;
const preScrollIndex = logs.length - 2;
if (props.visibleStopIndex >= lastLogIndex) {
- setInfiniteLoaderState('pre-scroll');
+ setInfiniteLoaderState('pre-scroll-bottom');
} else if (props.visibleStartIndex < preScrollIndex) {
setInfiniteLoaderState('idle');
}
@@ -204,7 +252,18 @@ export const InfiniteScroll = ({
const itemCount = logs.length && loadMore && infiniteLoaderState !== 'idle' ? logs.length + 1 : logs.length;
- return <>{children({ getItemKey, itemCount, onItemsRendered, Renderer })}>;
+ return (
+ <>
+ {infiniteLoaderState === 'pre-scroll-top' && (
+
+
+ {t('logs.infinite-scroll.load-more', 'Scroll to load more')}
+
+
+ )}
+ {children({ getItemKey, itemCount, onItemsRendered, Renderer })}
+ >
+ );
};
function getMessageFromInfiniteLoaderState(state: InfiniteLoaderState, order: LogsSortOrder) {
@@ -220,7 +279,7 @@ function getMessageFromInfiniteLoaderState(state: InfiniteLoaderState, order: Lo
>
);
- case 'pre-scroll':
+ case 'pre-scroll-bottom':
return t('logs.infinite-scroll.load-more', 'Scroll to load more');
default:
return null;
diff --git a/public/app/features/logs/components/panel/LogLine.tsx b/public/app/features/logs/components/panel/LogLine.tsx
index 4f099dac59a..f3b994250f5 100644
--- a/public/app/features/logs/components/panel/LogLine.tsx
+++ b/public/app/features/logs/components/panel/LogLine.tsx
@@ -524,6 +524,14 @@ export const getStyles = (theme: GrafanaTheme2, virtualization?: LogLineVirtuali
border: 'none',
display: 'inline',
}),
+ loadMoreTopContainer: css({
+ backgroundColor: tinycolor(theme.colors.background.primary).setAlpha(0.75).toString(),
+ left: 0,
+ position: 'absolute',
+ top: 0,
+ width: '100%',
+ zIndex: theme.zIndex.navbarFixed,
+ }),
overflows: css({
outline: 'solid 1px red',
}),
diff --git a/public/app/features/logs/components/panel/LogLineContext.test.tsx b/public/app/features/logs/components/panel/LogLineContext.test.tsx
new file mode 100644
index 00000000000..31f77df4f3e
--- /dev/null
+++ b/public/app/features/logs/components/panel/LogLineContext.test.tsx
@@ -0,0 +1,545 @@
+import { render, screen, waitFor, userEvent } from 'test/test-utils';
+
+import {
+ createDataFrame,
+ FieldType,
+ LogRowContextQueryDirection,
+ LogsSortOrder,
+ SplitOpenOptions,
+} from '@grafana/data';
+
+import { dataFrameToLogsModel } from '../../logsModel';
+
+import { LogLineContext } from './LogLineContext';
+
+jest.mock('@grafana/assistant', () => ({
+ ...jest.requireActual('@grafana/assistant'),
+ useAssistant: jest.fn(() => [true, jest.fn()]),
+}));
+
+const dfBefore = createDataFrame({
+ fields: [
+ {
+ name: 'time',
+ type: FieldType.time,
+ values: ['2019-04-26T07:28:11.352440161Z', '2019-04-26T09:28:11.352440161Z'],
+ },
+ {
+ name: 'message',
+ type: FieldType.string,
+ values: ['foo123', 'foo123'],
+ },
+ ],
+});
+const dfNow = createDataFrame({
+ fields: [
+ {
+ name: 'time',
+ type: FieldType.time,
+ values: ['2019-04-26T09:28:11.352440161Z'],
+ },
+ {
+ name: 'message',
+ type: FieldType.string,
+ values: ['foo123'],
+ },
+ ],
+});
+const dfAfter = createDataFrame({
+ fields: [
+ {
+ name: 'time',
+ type: FieldType.time,
+ values: ['2019-04-26T14:42:50.991981292Z', '2019-04-26T16:28:11.352440161Z'],
+ },
+ {
+ name: 'message',
+ type: FieldType.string,
+ values: ['foo123', 'bar123'],
+ },
+ ],
+});
+
+let getRowContext = jest.fn();
+const dispatchMock = jest.fn();
+jest.mock('app/types/store', () => ({
+ ...jest.requireActual('app/types/store'),
+ useDispatch: () => dispatchMock,
+}));
+
+const splitOpenSym = Symbol('splitOpen');
+const splitOpen = jest.fn().mockReturnValue(splitOpenSym);
+jest.mock('app/features/explore/state/main', () => ({
+ ...jest.requireActual('app/features/explore/state/main'),
+ splitOpen: (arg?: SplitOpenOptions) => {
+ return splitOpen(arg);
+ },
+}));
+
+const logs = dataFrameToLogsModel([dfNow]);
+const row = logs.rows[0];
+
+const timeZone = 'UTC';
+
+describe('LogLineContext', () => {
+ let uniqueRefIdCounter = 1;
+
+ beforeEach(() => {
+ uniqueRefIdCounter = 1;
+ getRowContext = jest.fn().mockImplementation(async (_, options) => {
+ uniqueRefIdCounter += 1;
+ const refId = `refid_${uniqueRefIdCounter}`;
+ if (options.direction === LogRowContextQueryDirection.Forward) {
+ return {
+ data: [
+ {
+ refId,
+ ...dfBefore,
+ },
+ ],
+ };
+ } else {
+ return {
+ data: [
+ {
+ refId,
+ ...dfAfter,
+ },
+ ],
+ };
+ }
+ });
+ });
+
+ test('Should not render when it is closed', async () => {
+ render(
+ {}}
+ getRowContext={getRowContext}
+ timeZone={timeZone}
+ sortOrder={LogsSortOrder.Descending}
+ />
+ );
+
+ await waitFor(() => expect(screen.queryByText('Log context')).not.toBeInTheDocument());
+ });
+
+ test('Should render when it is open', async () => {
+ render(
+ {}}
+ getRowContext={getRowContext}
+ timeZone={timeZone}
+ sortOrder={LogsSortOrder.Descending}
+ />
+ );
+
+ await waitFor(() => expect(screen.queryByText('Log context')).toBeInTheDocument());
+ });
+
+ test('Should call not getRowContext when closed', async () => {
+ render(
+ {}}
+ getRowContext={getRowContext}
+ timeZone={timeZone}
+ sortOrder={LogsSortOrder.Descending}
+ />
+ );
+
+ await waitFor(() => expect(getRowContext).not.toHaveBeenCalled());
+ });
+
+ test('Should call getRowContext on open', async () => {
+ render(
+ {}}
+ getRowContext={getRowContext}
+ timeZone={timeZone}
+ sortOrder={LogsSortOrder.Descending}
+ />
+ );
+ await waitFor(() => expect(getRowContext).toHaveBeenCalledTimes(2));
+ });
+
+ test('should render 3 lines containing `foo123`', async () => {
+ render(
+ {}}
+ getRowContext={getRowContext}
+ timeZone={timeZone}
+ sortOrder={LogsSortOrder.Descending}
+ />
+ );
+ // 1 in before, 1 in current, 1 in after
+ await waitFor(() => expect(screen.getAllByText('foo123').length).toBe(3));
+ });
+
+ test('should render 3 lines containing `foo123` with the same ms timestamp', async () => {
+ const dfBeforeNs = createDataFrame({
+ fields: [
+ {
+ name: 'time',
+ type: FieldType.time,
+ values: [1, 1],
+ },
+ {
+ name: 'message',
+ type: FieldType.string,
+ values: ['foo123', 'foo123'],
+ },
+ {
+ name: 'tsNs',
+ type: FieldType.string,
+ values: ['1', '2'],
+ },
+ ],
+ });
+ const dfNowNs = createDataFrame({
+ fields: [
+ {
+ name: 'time',
+ type: FieldType.time,
+ values: [1],
+ },
+ {
+ name: 'message',
+ type: FieldType.string,
+ values: ['foo123'],
+ },
+ {
+ name: 'tsNs',
+ type: FieldType.string,
+ values: ['2'],
+ },
+ ],
+ });
+ const dfAfterNs = createDataFrame({
+ fields: [
+ {
+ name: 'time',
+ type: FieldType.time,
+ values: [1, 1],
+ },
+ {
+ name: 'message',
+ type: FieldType.string,
+ values: ['foo123', 'foo123'],
+ },
+ {
+ name: 'tsNs',
+ type: FieldType.string,
+ values: ['2', '3'],
+ },
+ ],
+ });
+
+ let uniqueRefIdCounter = 1;
+ const logs = dataFrameToLogsModel([dfNowNs]);
+ const row = logs.rows[0];
+ const getRowContext = jest.fn().mockImplementation(async (_, options) => {
+ uniqueRefIdCounter += 1;
+ const refId = `refid_${uniqueRefIdCounter}`;
+ if (uniqueRefIdCounter === 2) {
+ return {
+ data: [
+ {
+ refId,
+ ...dfBeforeNs,
+ },
+ ],
+ };
+ } else if (uniqueRefIdCounter === 3) {
+ return {
+ data: [
+ {
+ refId,
+ ...dfAfterNs,
+ },
+ ],
+ };
+ }
+ return { data: [] };
+ });
+
+ render(
+ {}}
+ getRowContext={getRowContext}
+ timeZone={timeZone}
+ sortOrder={LogsSortOrder.Descending}
+ />
+ );
+
+ // 1 in before, 1 in current, 1 in after
+ await waitFor(() => {
+ expect(screen.getAllByText('foo123').length).toBe(3);
+ });
+ });
+
+ test('Should highlight the same `foo123` searchwords', async () => {
+ const dfBeforeNs = createDataFrame({
+ fields: [
+ {
+ name: 'time',
+ type: FieldType.time,
+ values: [1, 1],
+ },
+ {
+ name: 'message',
+ type: FieldType.string,
+ values: ['this contains foo123', 'this contains foo123'],
+ },
+ {
+ name: 'tsNs',
+ type: FieldType.string,
+ values: ['1', '2'],
+ },
+ ],
+ });
+ const dfNowNs = createDataFrame({
+ fields: [
+ {
+ name: 'time',
+ type: FieldType.time,
+ values: [1],
+ },
+ {
+ name: 'message',
+ type: FieldType.string,
+ values: ['this contains foo123'],
+ },
+ {
+ name: 'tsNs',
+ type: FieldType.string,
+ values: ['2'],
+ },
+ ],
+ });
+ const dfAfterNs = createDataFrame({
+ fields: [
+ {
+ name: 'time',
+ type: FieldType.time,
+ values: [1, 1],
+ },
+ {
+ name: 'message',
+ type: FieldType.string,
+ values: ['this contains foo123', 'this contains foo123'],
+ },
+ {
+ name: 'tsNs',
+ type: FieldType.string,
+ values: ['2', '3'],
+ },
+ ],
+ });
+
+ let uniqueRefIdCounter = 1;
+ const logs = dataFrameToLogsModel([dfNowNs]);
+ const row = logs.rows[0];
+ row.searchWords = ['foo123'];
+ const getRowContext = jest.fn().mockImplementation(async (_, options) => {
+ uniqueRefIdCounter += 1;
+ const refId = `refid_${uniqueRefIdCounter}`;
+ if (uniqueRefIdCounter === 2) {
+ return {
+ data: [
+ {
+ refId,
+ ...dfBeforeNs,
+ },
+ ],
+ };
+ } else if (uniqueRefIdCounter === 3) {
+ return {
+ data: [
+ {
+ refId,
+ ...dfAfterNs,
+ },
+ ],
+ };
+ }
+ return { data: [] };
+ });
+
+ render(
+ {}}
+ getRowContext={getRowContext}
+ timeZone={timeZone}
+ sortOrder={LogsSortOrder.Descending}
+ />
+ );
+
+ // there need to be 3 lines with that message, all `foo123` should be highlighted
+ await waitFor(() => {
+ expect(screen.getAllByText('foo123')).toHaveLength(3);
+ expect(screen.getAllByText('this contains')).toHaveLength(3);
+ });
+ });
+
+ test('Should show a split view button', async () => {
+ const getRowContextQuery = jest.fn().mockResolvedValue({ datasource: { uid: 'test-uid' } });
+
+ render(
+ {}}
+ getRowContext={getRowContext}
+ getRowContextQuery={getRowContextQuery}
+ timeZone={timeZone}
+ sortOrder={LogsSortOrder.Descending}
+ />
+ );
+
+ await waitFor(() =>
+ expect(
+ screen.getByRole('button', {
+ name: /open in split view/i,
+ })
+ ).toBeInTheDocument()
+ );
+ });
+
+ test('Should not show a split view button', async () => {
+ render(
+ {}}
+ getRowContext={getRowContext}
+ timeZone={timeZone}
+ sortOrder={LogsSortOrder.Descending}
+ />
+ );
+
+ await waitFor(() => {
+ expect(
+ screen.queryByRole('button', {
+ name: /open in split view/i,
+ })
+ ).not.toBeInTheDocument();
+ });
+ });
+
+ test('Should call getRowContextQuery', async () => {
+ const getRowContextQuery = jest.fn().mockResolvedValue({ datasource: { uid: 'test-uid' } });
+ render(
+ {}}
+ getRowContext={getRowContext}
+ getRowContextQuery={getRowContextQuery}
+ timeZone={timeZone}
+ sortOrder={LogsSortOrder.Descending}
+ />
+ );
+
+ await waitFor(() => expect(getRowContextQuery).toHaveBeenCalledTimes(1));
+ });
+
+ test('Should close modal', async () => {
+ const getRowContextQuery = jest.fn().mockResolvedValue({ datasource: { uid: 'test-uid' } });
+ const onClose = jest.fn();
+ render(
+
+ );
+
+ const splitViewButton = await screen.findByRole('button', {
+ name: /open in split view/i,
+ });
+
+ await userEvent.click(splitViewButton);
+
+ await waitFor(() => expect(onClose).toHaveBeenCalled());
+ });
+
+ test('Should create correct splitOpen', async () => {
+ const queryObj = { datasource: { uid: 'test-uid' } };
+ const getRowContextQuery = jest.fn().mockResolvedValue(queryObj);
+ const onClose = jest.fn();
+
+ render(
+
+ );
+
+ const splitViewButton = await screen.findByRole('button', {
+ name: /open in split view/i,
+ });
+
+ await userEvent.click(splitViewButton);
+
+ await waitFor(() =>
+ expect(splitOpen).toHaveBeenCalledWith(
+ expect.objectContaining({
+ queries: [queryObj],
+ panelsState: {
+ logs: {
+ id: row.uid,
+ },
+ },
+ })
+ )
+ );
+ });
+
+ test('Should dispatch splitOpen', async () => {
+ const getRowContextQuery = jest.fn().mockResolvedValue({ datasource: { uid: 'test-uid' } });
+ const onClose = jest.fn();
+
+ render(
+
+ );
+
+ const splitViewButton = await screen.findByRole('button', {
+ name: /open in split view/i,
+ });
+
+ await userEvent.click(splitViewButton);
+
+ await waitFor(() => expect(dispatchMock).toHaveBeenCalledWith(splitOpenSym));
+ });
+});
diff --git a/public/app/features/logs/components/panel/LogLineContext.tsx b/public/app/features/logs/components/panel/LogLineContext.tsx
new file mode 100644
index 00000000000..db28cdc0fdb
--- /dev/null
+++ b/public/app/features/logs/components/panel/LogLineContext.tsx
@@ -0,0 +1,447 @@
+import { css } from '@emotion/css';
+import { partition } from 'lodash';
+import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';
+
+import {
+ DataQueryResponse,
+ DataSourceWithLogsContextSupport,
+ GrafanaTheme2,
+ LogRowContextOptions,
+ LogRowContextQueryDirection,
+ LogsDedupStrategy,
+ LogsSortOrder,
+ dateTime,
+ TimeRange,
+ LoadingState,
+ CoreApp,
+ LogRowModel,
+ AbsoluteTimeRange,
+ EventBusSrv,
+ store,
+} from '@grafana/data';
+import { Trans, t } from '@grafana/i18n';
+import { config, reportInteraction } from '@grafana/runtime';
+import { DataQuery, TimeZone } from '@grafana/schema';
+import { Button, Collapse, Modal, useTheme2 } from '@grafana/ui';
+import { splitOpen } from 'app/features/explore/state/main';
+import { useDispatch } from 'app/types/store';
+
+import { dataFrameToLogsModel } from '../../logsModel';
+import { sortLogRows } from '../../utils';
+import { ScrollDirection } from '../InfiniteScroll';
+import { LoadingIndicator } from '../LoadingIndicator';
+
+import { LogLineDetailsLog } from './LogLineDetailsLog';
+import { LogList } from './LogList';
+import { LogListModel } from './processing';
+import { ScrollToLogsEvent } from './virtualization';
+
+interface LogLineContextProps {
+ log: LogRowModel | LogListModel;
+ logOptionsStorageKey?: string;
+ open: boolean;
+ timeZone: TimeZone;
+ onClose: () => void;
+ getRowContext: (row: LogRowModel, options: LogRowContextOptions) => Promise;
+ getRowContextQuery?: (
+ row: LogRowModel,
+ options?: LogRowContextOptions,
+ cacheFilters?: boolean
+ ) => Promise;
+ sortOrder?: LogsSortOrder;
+ runContextQuery?: () => void;
+ getLogRowContextUi?: DataSourceWithLogsContextSupport['getLogRowContextUi'];
+ displayedFields?: string[];
+ onClickShowField?: (key: string) => void;
+ onClickHideField?: (key: string) => void;
+}
+
+const PAGE_SIZE = 100;
+
+export const LogLineContext = memo(
+ ({
+ log,
+ logOptionsStorageKey,
+ open,
+ sortOrder = logOptionsStorageKey
+ ? (store.get(`${logOptionsStorageKey}.sortOrder`) ?? LogsSortOrder.Descending)
+ : LogsSortOrder.Descending,
+ timeZone,
+ getLogRowContextUi,
+ getRowContextQuery,
+ onClose,
+ getRowContext,
+ displayedFields = [],
+ onClickShowField,
+ onClickHideField,
+ }: LogLineContextProps) => {
+ const containerRef = useRef(null);
+ const [contextQuery, setContextQuery] = useState(null);
+ const [aboveLogs, setAboveLogs] = useState([]);
+ const [belowLogs, setBelowLogs] = useState([]);
+ const [initialized, setInitialized] = useState(false);
+ const allLogs = useMemo(() => [...aboveLogs, log, ...belowLogs], [log, belowLogs, aboveLogs]);
+ const [aboveState, setAboveState] = useState(LoadingState.NotStarted);
+ const [belowState, setBelowState] = useState(LoadingState.NotStarted);
+ const [showLog, setShowLog] = useState(false);
+ const eventBusRef = useRef(new EventBusSrv());
+
+ const dispatch = useDispatch();
+ const theme = useTheme2();
+ const styles = getStyles(theme);
+
+ const timeRange = useMemo(() => {
+ const fromMs =
+ sortOrder === LogsSortOrder.Ascending ? allLogs[0].timeEpochMs : allLogs[allLogs.length - 1].timeEpochMs;
+ let toMs =
+ sortOrder === LogsSortOrder.Ascending ? allLogs[allLogs.length - 1].timeEpochMs : allLogs[0].timeEpochMs;
+ // In case we have a lot of logs and from and to have same millisecond
+ // we add 1 millisecond to toMs to make sure we have a range
+ if (fromMs === toMs) {
+ toMs += 1;
+ }
+ const from = dateTime(fromMs);
+ const to = dateTime(toMs);
+
+ const range: TimeRange = {
+ from,
+ to,
+ raw: {
+ from,
+ to,
+ },
+ };
+ return range;
+ }, [allLogs, sortOrder]);
+
+ const updateContextQuery = useCallback(async () => {
+ const contextQuery = getRowContextQuery ? await getRowContextQuery(log) : null;
+ setContextQuery(contextQuery);
+ }, [log, getRowContextQuery]);
+
+ const updateResults = useCallback(async () => {
+ setAboveLogs([]);
+ setBelowLogs([]);
+ await updateContextQuery();
+ setInitialized(false);
+ }, [updateContextQuery]);
+
+ useEffect(() => {
+ if (open) {
+ updateContextQuery();
+ }
+ }, [updateContextQuery, open]);
+
+ const getContextLogs = useCallback(
+ async (place: 'above' | 'below', refLog: LogRowModel): Promise => {
+ const result = await getRowContext(normalizeLogRefId(refLog), {
+ limit: PAGE_SIZE,
+ direction: getLoadMoreDirection(place, sortOrder),
+ });
+
+ const newLogs = dataFrameToLogsModel(result.data).rows;
+ if (sortOrder === LogsSortOrder.Ascending) {
+ newLogs.reverse();
+ }
+ return newLogs.filter((r) => !containsRow(allLogs, r));
+ },
+ [allLogs, getRowContext, sortOrder]
+ );
+
+ const loadMore = useCallback(
+ async (place: 'above' | 'below', refLog: LogRowModel) => {
+ const setState = place === 'above' ? setAboveState : setBelowState;
+ setState(LoadingState.Loading);
+
+ try {
+ const newLogs = (await getContextLogs(place, refLog)).map((r) =>
+ // apply the original row's searchWords to all the rows for highlighting
+ !r.searchWords || !r.searchWords?.length ? { ...r, searchWords: log.searchWords } : r
+ );
+ const [older, newer] = partition(newLogs, (newRow) => newRow.timeEpochNs > log.timeEpochNs);
+ const newAbove = sortOrder === LogsSortOrder.Ascending ? newer : older;
+ const newBelow = sortOrder === LogsSortOrder.Ascending ? older : newer;
+
+ setAboveLogs((aboveLogs: LogRowModel[]) => {
+ return newAbove.length > 0 ? sortLogRows([...newAbove, ...aboveLogs], sortOrder) : aboveLogs;
+ });
+ setBelowLogs((belowLogs: LogRowModel[]) => {
+ return newBelow.length > 0 ? sortLogRows([...belowLogs, ...newBelow], sortOrder) : belowLogs;
+ });
+
+ setState(LoadingState.NotStarted);
+ if (!newAbove.length && place === 'above') {
+ setAboveState(LoadingState.Done);
+ }
+ if (!newBelow.length && place === 'below') {
+ setBelowState(LoadingState.Done);
+ }
+ } catch {
+ setState(LoadingState.Error);
+ }
+ },
+ [getContextLogs, log, sortOrder]
+ );
+
+ useEffect(() => {
+ if (!open) {
+ return;
+ }
+ if (!initialized) {
+ Promise.all([loadMore('above', log), loadMore('below', log)]).then(() => {});
+ setInitialized(true);
+ }
+ }, [initialized, loadMore, log, open]);
+
+ const handleLoadMore = useCallback(
+ (_: AbsoluteTimeRange, direction: ScrollDirection) => {
+ if (direction === ScrollDirection.Bottom) {
+ loadMore('below', allLogs[allLogs.length - 1]);
+ } else {
+ loadMore('above', allLogs[0]);
+ }
+ },
+ [allLogs, loadMore]
+ );
+
+ const onScrollCenterClick = useCallback(() => {
+ eventBusRef.current.publish(
+ new ScrollToLogsEvent({
+ scrollTo: log.uid,
+ })
+ );
+ }, [log.uid]);
+
+ const wrapLogMessage = logOptionsStorageKey ? store.getBool(`${logOptionsStorageKey}.wrapLogMessage`, true) : true;
+ const syntaxHighlighting = logOptionsStorageKey
+ ? store.getBool(`${logOptionsStorageKey}.syntaxHighlighting`, true)
+ : true;
+ // @todo: Remove when the LogRows are deprecated
+ const logListModel = useMemo(
+ () =>
+ log instanceof LogListModel
+ ? log
+ : new LogListModel(log, {
+ escape: false,
+ timeZone,
+ wrapLogMessage,
+ }),
+ [log, timeZone, wrapLogMessage]
+ );
+
+ return (
+
+ {config.featureToggles.logsContextDatasourceUi && getLogRowContextUi && (
+ {getLogRowContextUi(log, updateResults)}
+ )}
+ setShowLog(!showLog)}
+ className={styles.referenceLogLine}
+ label={t('logs.log-line-context.title-log-line', 'Referenced log line')}
+ >
+
+
+
+ {aboveState === LoadingState.Loading && (
+
+ )}
+ {aboveState === LoadingState.Done && (
+ No more logs available.
+ )}
+
+
+
+ {containerRef.current && (
+
+ )}
+
+
+
+ {belowState === LoadingState.Loading && (
+
+ )}
+ {belowState === LoadingState.Done && (
+ No more logs available.
+ )}
+
+
+
+
+ {contextQuery?.datasource?.uid && (
+
+ )}
+
+
+ );
+ }
+);
+LogLineContext.displayName = 'LogLineContext';
+
+const getStyles = (theme: GrafanaTheme2) => {
+ return {
+ modal: css({
+ width: '85vw',
+ height: '80%',
+ [theme.breakpoints.down('md')]: {
+ width: '100%',
+ minHeight: '100%',
+ },
+ top: '50%',
+ left: '50%',
+ transform: 'translate(-50%, -50%)',
+ }),
+ datasourceUi: css({
+ display: 'flex',
+ alignItems: 'center',
+ }),
+ loadingIndicator: css({
+ height: theme.spacing(3),
+ minHeight: theme.spacing(3),
+ textAlign: 'center',
+ }),
+ referenceLogLine: css({
+ flex: 0,
+ }),
+ wrapper: css({
+ border: `1px solid ${theme.colors.border.weak}`,
+ padding: theme.spacing(0, 1, 1, 0),
+ flex: 1,
+ height: '100%',
+ }),
+ logsContainer: css({
+ height: '100%',
+ overflow: 'hidden',
+ }),
+ flexColumn: css({
+ display: 'flex',
+ flexDirection: 'column',
+ padding: theme.spacing(0, 3, 3, 3),
+ height: '100%',
+ }),
+ link: css({
+ color: theme.colors.text.secondary,
+ fontSize: theme.typography.bodySmall.fontSize,
+ ':hover': {
+ color: theme.colors.text.link,
+ },
+ }),
+ logPreview: css({
+ overflow: 'hidden',
+ textAlign: 'left',
+ textOverflow: 'ellipsis',
+ width: '75vw',
+ whiteSpace: 'nowrap',
+ }),
+ };
+};
+
+const getLoadMoreDirection = (place: 'above' | 'below', sortOrder: LogsSortOrder): LogRowContextQueryDirection => {
+ if (place === 'above' && sortOrder === LogsSortOrder.Descending) {
+ return LogRowContextQueryDirection.Forward;
+ }
+ if (place === 'below' && sortOrder === LogsSortOrder.Ascending) {
+ return LogRowContextQueryDirection.Forward;
+ }
+
+ return LogRowContextQueryDirection.Backward;
+};
+
+const normalizeLogRefId = (log: LogRowModel): LogRowModel => {
+ // the datasoure plugins often create the context-query based on the row's dataframe's refId,
+ // by appending something to it. for example:
+ // - let's say the row's dataframe's refId is "query"
+ // - the datasource plugin will take "query" and append "-context" to it, so it becomes "query-context".
+ // - later we want to load even more lines, so we make a context query
+ // - the datasource plugin does the same transform again, but now the source is "query-context",
+ // so the new refId becomes "query-context-context"
+ // - next time it becomes "query-context-context-context", and so on.
+ // we do not want refIds to grow unbounded.
+ // to avoid this, we set the refId to a value that does not grow.
+ // on the other hand, the refId is also used in generating the row's UID, so it is useful
+ // when the refId is not always the exact same string, otherwise UID duplication can occur,
+ // which may cause problems.
+ // so we go with an approach where the refId always changes, but does not grow.
+ return {
+ ...log,
+ dataFrame: {
+ ...log.dataFrame,
+ refId: `context_${log.uid ?? log.dataFrame.refId ?? log.timeEpochMs}`,
+ },
+ };
+};
+
+const containsRow = (rows: LogRowModel[], row: LogRowModel) => {
+ return rows.some((r) => r.entry === row.entry && r.timeEpochNs === row.timeEpochNs);
+};
diff --git a/public/app/features/logs/components/panel/LogLineDetailsComponent.tsx b/public/app/features/logs/components/panel/LogLineDetailsComponent.tsx
index 96429ce4327..fd8490f74cb 100644
--- a/public/app/features/logs/components/panel/LogLineDetailsComponent.tsx
+++ b/public/app/features/logs/components/panel/LogLineDetailsComponent.tsx
@@ -25,7 +25,8 @@ interface LogLineDetailsComponentProps {
}
export const LogLineDetailsComponent = memo(({ focusLogLine, log, logs }: LogLineDetailsComponentProps) => {
- const { displayedFields, noInteractions, logOptionsStorageKey, setDisplayedFields } = useLogListContext();
+ const { displayedFields, noInteractions, logOptionsStorageKey, setDisplayedFields, syntaxHighlighting } =
+ useLogListContext();
const [search, setSearch] = useState('');
const inputRef = useRef('');
const styles = useStyles2(getStyles);
@@ -111,7 +112,7 @@ export const LogLineDetailsComponent = memo(({ focusLogLine, log, logs }: LogLin
isOpen={logLineOpen}
onToggle={(isOpen: boolean) => handleToggle('logLineOpen', isOpen)}
>
-
+
{displayedFields.length > 0 && setDisplayedFields && (
{
focusLogLine?.(log);
- }, [focusLogLine, log]);
+ reportInteractionWrapper('logs_log_line_details_header_scroll_to_clicked');
+ }, [focusLogLine, log, reportInteractionWrapper]);
const copyLogLine = useCallback(() => {
copyText(log.entry, containerRef);
diff --git a/public/app/features/logs/components/panel/LogLineDetailsLog.tsx b/public/app/features/logs/components/panel/LogLineDetailsLog.tsx
index 259d7ca27c5..a4e4b960053 100644
--- a/public/app/features/logs/components/panel/LogLineDetailsLog.tsx
+++ b/public/app/features/logs/components/panel/LogLineDetailsLog.tsx
@@ -4,15 +4,14 @@ import { memo, useMemo } from 'react';
import { useStyles2 } from '@grafana/ui';
import { getStyles } from './LogLine';
-import { useLogListContext } from './LogListContext';
import { LogListModel } from './processing';
interface Props {
log: LogListModel;
+ syntaxHighlighting: boolean;
}
-export const LogLineDetailsLog = memo(({ log: originalLog }: Props) => {
- const { syntaxHighlighting } = useLogListContext();
+export const LogLineDetailsLog = memo(({ log: originalLog, syntaxHighlighting }: Props) => {
const logStyles = useStyles2(getStyles);
const log = useMemo(() => {
const log = originalLog.clone();
diff --git a/public/app/features/logs/components/panel/LogList.tsx b/public/app/features/logs/components/panel/LogList.tsx
index 6350723ff89..df0c8b58fd5 100644
--- a/public/app/features/logs/components/panel/LogList.tsx
+++ b/public/app/features/logs/components/panel/LogList.tsx
@@ -5,7 +5,6 @@ import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, Mou
import { Align, VariableSizeList } from 'react-window';
import {
- AbsoluteTimeRange,
CoreApp,
DataFrame,
EventBus,
@@ -24,7 +23,7 @@ import { ConfirmModal, Icon, PopoverContent, useStyles2, useTheme2 } from '@graf
import { PopoverMenu } from 'app/features/explore/Logs/PopoverMenu';
import { GetFieldLinksFn } from 'app/plugins/panel/logs/types';
-import { InfiniteScroll } from './InfiniteScroll';
+import { InfiniteScrollMode, InfiniteScroll, LoadMoreLogsType } from './InfiniteScroll';
import { getGridTemplateColumns } from './LogLine';
import { LogLineDetails, LogLineDetailsMode } from './LogLineDetails';
import { GetRowContextQueryFn, LogLineMenuCustomItem } from './LogLineMenu';
@@ -50,10 +49,11 @@ export interface Props {
getFieldLinks?: GetFieldLinksFn;
getRowContextQuery?: GetRowContextQueryFn;
grammar?: Grammar;
+ infiniteScrollMode?: InfiniteScrollMode;
initialScrollPosition?: 'top' | 'bottom';
isLabelFilterActive?: (key: string, value: string, refId?: string) => Promise;
loading?: boolean;
- loadMore?: (range: AbsoluteTimeRange) => void;
+ loadMore?: LoadMoreLogsType;
logLineMenuCustomItems?: LogLineMenuCustomItem[];
logOptionsStorageKey?: string;
logs: LogRowModel[];
@@ -117,6 +117,7 @@ export const LogList = ({
getFieldLinks,
getRowContextQuery,
grammar,
+ infiniteScrollMode,
initialScrollPosition = 'top',
isLabelFilterActive,
loading,
@@ -197,6 +198,7 @@ export const LogList = ({
getFieldLinks={getFieldLinks}
grammar={grammar}
initialScrollPosition={initialScrollPosition}
+ infiniteScrollMode={infiniteScrollMode}
loading={loading}
loadMore={loadMore}
logs={logs}
@@ -215,6 +217,7 @@ const LogListComponent = ({
getFieldLinks,
grammar,
initialScrollPosition = 'top',
+ infiniteScrollMode = 'interval',
loading,
loadMore,
logs,
@@ -271,6 +274,20 @@ const LogListComponent = ({
useKeyBindings();
const { filterLogs, matchingUids, searchVisible } = useLogListSearchContext();
+ const levelFilteredLogs = useMemo(
+ () =>
+ filterLevels.length === 0 ? processedLogs : processedLogs.filter((log) => filterLevels.includes(log.logLevel)),
+ [filterLevels, processedLogs]
+ );
+
+ const filteredLogs = useMemo(
+ () =>
+ matchingUids && filterLogs
+ ? levelFilteredLogs.filter((log) => matchingUids.includes(log.uid))
+ : levelFilteredLogs,
+ [filterLogs, levelFilteredLogs, matchingUids]
+ );
+
const debouncedResetAfterIndex = useMemo(() => {
return debounce((index: number) => {
listRef.current?.resetAfterIndex(index);
@@ -286,10 +303,10 @@ const LogListComponent = ({
useEffect(() => {
const subscription = eventBus.subscribe(ScrollToLogsEvent, (e: ScrollToLogsEvent) =>
- handleScrollToEvent(e, logs.length, listRef.current)
+ handleScrollToEvent(e, filteredLogs, listRef.current)
);
return () => subscription.unsubscribe();
- }, [eventBus, logs.length]);
+ }, [eventBus, filteredLogs]);
useEffect(() => {
if (loading) {
@@ -379,20 +396,6 @@ const LogListComponent = ({
debouncedResetAfterIndex(0);
}, [debouncedResetAfterIndex]);
- const levelFilteredLogs = useMemo(
- () =>
- filterLevels.length === 0 ? processedLogs : processedLogs.filter((log) => filterLevels.includes(log.logLevel)),
- [filterLevels, processedLogs]
- );
-
- const filteredLogs = useMemo(
- () =>
- matchingUids && filterLogs
- ? levelFilteredLogs.filter((log) => matchingUids.includes(log.uid))
- : levelFilteredLogs,
- [filterLogs, levelFilteredLogs, matchingUids]
- );
-
const focusLogLine = useCallback(
(log: LogListModel) => {
const index = filteredLogs.indexOf(log);
@@ -405,6 +408,15 @@ const LogListComponent = ({
return (
+ {showControls &&
}
+ {detailsMode === 'sidebar' && showDetails.length > 0 && (
+
+ )}
{popoverState.selection && popoverState.selectedRow && (
- {detailsMode === 'sidebar' && showDetails.length > 0 && (
-
- )}
- {showControls &&
}
);
};
@@ -515,6 +519,7 @@ function getStyles(
}),
logListContainer: css({
display: 'flex',
+ flexDirection: 'row-reverse',
// Minimum width to prevent rendering issues and a sausage-like logs panel.
minWidth: theme.spacing(35),
}),
@@ -534,10 +539,16 @@ function getStyles(
};
}
-function handleScrollToEvent(event: ScrollToLogsEvent, logsCount: number, list: VariableSizeList | null) {
+function handleScrollToEvent(event: ScrollToLogsEvent, logs: LogListModel[], list: VariableSizeList | null) {
if (event.payload.scrollTo === 'top') {
list?.scrollTo(0);
+ } else if (event.payload.scrollTo === 'bottom') {
+ list?.scrollToItem(logs.length - 1);
} else {
- list?.scrollToItem(logsCount - 1);
+ // uid
+ const index = logs.findIndex((log) => log.uid === event.payload.scrollTo);
+ if (index >= 0) {
+ list?.scrollToItem(index, 'center');
+ }
}
}
diff --git a/public/app/features/logs/components/panel/virtualization.ts b/public/app/features/logs/components/panel/virtualization.ts
index bf84f5fe3ff..6207085d1a5 100644
--- a/public/app/features/logs/components/panel/virtualization.ts
+++ b/public/app/features/logs/components/panel/virtualization.ts
@@ -370,7 +370,7 @@ export function getScrollbarWidth() {
}
export interface ScrollToLogsEventPayload {
- scrollTo: 'top' | 'bottom';
+ scrollTo: 'top' | 'bottom' | string;
}
export class ScrollToLogsEvent extends BusEventWithPayload {
diff --git a/public/app/features/plugins/extensions/usePluginComponents.test.tsx b/public/app/features/plugins/extensions/usePluginComponents.test.tsx
index f40955c3f54..255a8a6161c 100644
--- a/public/app/features/plugins/extensions/usePluginComponents.test.tsx
+++ b/public/app/features/plugins/extensions/usePluginComponents.test.tsx
@@ -1,7 +1,13 @@
import { act, render, renderHook, screen } from '@testing-library/react';
import React from 'react';
-import { PluginContextProvider, PluginExtensionPoints, PluginMeta, PluginType } from '@grafana/data';
+import {
+ PluginContextProvider,
+ PluginExtensionPoints,
+ PluginLoadingStrategy,
+ PluginMeta,
+ PluginType,
+} from '@grafana/data';
import { config } from '@grafana/runtime';
import { ExtensionRegistriesProvider } from './ExtensionRegistriesContext';
@@ -105,6 +111,32 @@ describe('usePluginComponents()', () => {
},
};
+ config.apps[pluginId] = {
+ id: pluginId,
+ path: '',
+ version: '',
+ preload: false,
+ angular: {
+ detected: false,
+ hideDeprecation: false,
+ },
+ loadingStrategy: PluginLoadingStrategy.fetch,
+ dependencies: {
+ grafanaVersion: '8.0.0',
+ plugins: [],
+ extensions: {
+ exposedComponents: [],
+ },
+ },
+ extensions: {
+ addedLinks: [],
+ addedComponents: [],
+ addedFunctions: [],
+ exposedComponents: [],
+ extensionPoints: [],
+ },
+ };
+
wrapper = ({ children }: { children: React.ReactNode }) => (
{children}
@@ -459,6 +491,49 @@ describe('usePluginComponents()', () => {
expect(log.error).not.toHaveBeenCalled();
});
+ // It can happen that core Grafana plugins (e.g. traces) reuse core components which implement extension points.
+ it('should not validate the extension point meta-info for core plugins', () => {
+ jest.mocked(isGrafanaDevMode).mockReturnValue(true);
+
+ const componentConfig = {
+ targets: extensionPointId,
+ title: '1',
+ description: '1',
+ component: () => Component
,
+ };
+
+ // The `AddedComponentsRegistry` is validating if the link is registered in the plugin metadata (config.apps).
+ config.apps[pluginId].extensions.addedComponents = [componentConfig];
+
+ wrapper = ({ children }: { children: React.ReactNode }) => (
+
+ {children}
+
+ );
+
+ registries.addedComponentsRegistry.register({
+ pluginId,
+ configs: [componentConfig],
+ });
+
+ // Trying to render an extension point that is not defined in the plugin meta
+ // (No restrictions due to being a core plugin)
+ let { result } = renderHook(() => usePluginComponents({ extensionPointId }), { wrapper });
+ expect(result.current.components.length).toBe(1);
+ expect(log.error).not.toHaveBeenCalled();
+ });
+
it('should not validate the extension point id in production mode', () => {
// Empty list of extension points in the plugin meta (from plugin.json)
wrapper = ({ children }: { children: React.ReactNode }) => (
diff --git a/public/app/features/plugins/extensions/usePluginComponents.tsx b/public/app/features/plugins/extensions/usePluginComponents.tsx
index 6f37f3bdbba..d07a2e5ac07 100644
--- a/public/app/features/plugins/extensions/usePluginComponents.tsx
+++ b/public/app/features/plugins/extensions/usePluginComponents.tsx
@@ -29,6 +29,7 @@ export function usePluginComponents({
return useMemo(() => {
const isInsidePlugin = Boolean(pluginContext);
+ const isCoreGrafanaPlugin = pluginContext?.meta.module.startsWith('core:') ?? false;
const components: Array> = [];
const extensionsByPlugin: Record = {};
const pluginId = pluginContext?.meta.id ?? '';
@@ -38,7 +39,10 @@ export function usePluginComponents({
});
// Don't show extensions if the extension-point id is invalid in DEV mode
- if (isGrafanaDevMode() && !isExtensionPointIdValid({ extensionPointId, pluginId, isInsidePlugin, log: pointLog })) {
+ if (
+ isGrafanaDevMode() &&
+ !isExtensionPointIdValid({ extensionPointId, pluginId, isInsidePlugin, isCoreGrafanaPlugin, log: pointLog })
+ ) {
return {
isLoading: false,
components: [],
@@ -46,7 +50,12 @@ export function usePluginComponents({
}
// Don't show extensions if the extension-point misses meta info (plugin.json) in DEV mode
- if (isGrafanaDevMode() && pluginContext && isExtensionPointMetaInfoMissing(extensionPointId, pluginContext)) {
+ if (
+ isGrafanaDevMode() &&
+ !isCoreGrafanaPlugin &&
+ pluginContext &&
+ isExtensionPointMetaInfoMissing(extensionPointId, pluginContext)
+ ) {
pointLog.error(errors.EXTENSION_POINT_META_INFO_MISSING);
return {
isLoading: false,
diff --git a/public/app/features/plugins/extensions/usePluginFunctions.tsx b/public/app/features/plugins/extensions/usePluginFunctions.tsx
index 18a8abd7aef..8f8c989e316 100644
--- a/public/app/features/plugins/extensions/usePluginFunctions.tsx
+++ b/public/app/features/plugins/extensions/usePluginFunctions.tsx
@@ -24,6 +24,7 @@ export function usePluginFunctions({
return useMemo(() => {
const isInsidePlugin = Boolean(pluginContext);
+ const isCoreGrafanaPlugin = pluginContext?.meta.module.startsWith('core:') ?? false;
const results: Array> = [];
const extensionsByPlugin: Record = {};
const pluginId = pluginContext?.meta.id ?? '';
@@ -32,14 +33,22 @@ export function usePluginFunctions({
extensionPointId,
});
- if (isGrafanaDevMode() && !isExtensionPointIdValid({ extensionPointId, pluginId, isInsidePlugin, log: pointLog })) {
+ if (
+ isGrafanaDevMode() &&
+ !isExtensionPointIdValid({ extensionPointId, pluginId, isInsidePlugin, isCoreGrafanaPlugin, log: pointLog })
+ ) {
return {
isLoading: false,
functions: [],
};
}
- if (isGrafanaDevMode() && pluginContext && isExtensionPointMetaInfoMissing(extensionPointId, pluginContext)) {
+ if (
+ isGrafanaDevMode() &&
+ !isCoreGrafanaPlugin &&
+ pluginContext &&
+ isExtensionPointMetaInfoMissing(extensionPointId, pluginContext)
+ ) {
pointLog.error(errors.EXTENSION_POINT_META_INFO_MISSING);
return {
isLoading: false,
diff --git a/public/app/features/plugins/extensions/usePluginLinks.test.tsx b/public/app/features/plugins/extensions/usePluginLinks.test.tsx
index b5d984b165c..697c9dfd91f 100644
--- a/public/app/features/plugins/extensions/usePluginLinks.test.tsx
+++ b/public/app/features/plugins/extensions/usePluginLinks.test.tsx
@@ -1,6 +1,13 @@
import { act, renderHook } from '@testing-library/react';
-import { PluginContextProvider, PluginExtensionPoints, PluginMeta, PluginType } from '@grafana/data';
+import {
+ PluginContextProvider,
+ PluginExtensionPoints,
+ PluginLoadingStrategy,
+ PluginMeta,
+ PluginType,
+} from '@grafana/data';
+import { config } from '@grafana/runtime';
import { ExtensionRegistriesProvider } from './ExtensionRegistriesContext';
import { log } from './logs/log';
@@ -98,6 +105,32 @@ describe('usePluginLinks()', () => {
},
};
+ config.apps[pluginId] = {
+ id: pluginId,
+ path: '',
+ version: '',
+ preload: false,
+ angular: {
+ detected: false,
+ hideDeprecation: false,
+ },
+ loadingStrategy: PluginLoadingStrategy.fetch,
+ dependencies: {
+ grafanaVersion: '8.0.0',
+ plugins: [],
+ extensions: {
+ exposedComponents: [],
+ },
+ },
+ extensions: {
+ addedLinks: [],
+ addedComponents: [],
+ addedFunctions: [],
+ exposedComponents: [],
+ extensionPoints: [],
+ },
+ };
+
wrapper = ({ children }: { children: React.ReactNode }) => (
{children}
@@ -219,6 +252,49 @@ describe('usePluginLinks()', () => {
expect(log.warning).not.toHaveBeenCalled();
});
+ // It can happen that core Grafana plugins (e.g. traces) reuse core components which implement extension points.
+ it('should not validate the extension point meta-info for core plugins', () => {
+ jest.mocked(isGrafanaDevMode).mockReturnValue(true);
+
+ const linkConfig = {
+ targets: extensionPointId,
+ title: '1',
+ description: '1',
+ path: `/a/${pluginId}/2`,
+ };
+
+ // The `AddedLinksRegistry` is validating if the link is registered in the plugin metadata (config.apps).
+ config.apps[pluginId].extensions.addedLinks = [linkConfig];
+
+ wrapper = ({ children }: { children: React.ReactNode }) => (
+
+ {children}
+
+ );
+
+ registries.addedLinksRegistry.register({
+ pluginId,
+ configs: [linkConfig],
+ });
+
+ // Trying to render an extension point that is not defined in the plugin meta
+ // (No restrictions due to being a core plugin)
+ let { result } = renderHook(() => usePluginLinks({ extensionPointId }), { wrapper });
+ expect(result.current.links.length).toBe(1);
+ expect(log.warning).not.toHaveBeenCalled();
+ });
+
it('should not validate the extension point id in production mode', () => {
// Empty list of extension points in the plugin meta (from plugin.json)
wrapper = ({ children }: { children: React.ReactNode }) => (
diff --git a/public/app/features/plugins/extensions/usePluginLinks.tsx b/public/app/features/plugins/extensions/usePluginLinks.tsx
index adec8114582..5d2b193a77c 100644
--- a/public/app/features/plugins/extensions/usePluginLinks.tsx
+++ b/public/app/features/plugins/extensions/usePluginLinks.tsx
@@ -34,19 +34,28 @@ export function usePluginLinks({
return useMemo(() => {
const isInsidePlugin = Boolean(pluginContext);
const pluginId = pluginContext?.meta.id ?? '';
+ const isCoreGrafanaPlugin = pluginContext?.meta.module.startsWith('core:') ?? false;
const pointLog = log.child({
pluginId,
extensionPointId,
});
- if (isGrafanaDevMode() && !isExtensionPointIdValid({ extensionPointId, pluginId, isInsidePlugin, log: pointLog })) {
+ if (
+ isGrafanaDevMode() &&
+ !isExtensionPointIdValid({ extensionPointId, pluginId, isInsidePlugin, isCoreGrafanaPlugin, log: pointLog })
+ ) {
return {
isLoading: false,
links: [],
};
}
- if (isGrafanaDevMode() && pluginContext && isExtensionPointMetaInfoMissing(extensionPointId, pluginContext)) {
+ if (
+ isGrafanaDevMode() &&
+ !isCoreGrafanaPlugin &&
+ pluginContext &&
+ isExtensionPointMetaInfoMissing(extensionPointId, pluginContext)
+ ) {
pointLog.error(errors.EXTENSION_POINT_META_INFO_MISSING);
return {
isLoading: false,
diff --git a/public/app/features/plugins/extensions/validators.test.tsx b/public/app/features/plugins/extensions/validators.test.tsx
index 1b7e71eba7b..2f1713d3f34 100644
--- a/public/app/features/plugins/extensions/validators.test.tsx
+++ b/public/app/features/plugins/extensions/validators.test.tsx
@@ -217,6 +217,7 @@ describe('Plugin Extension Validators', () => {
extensionPointId,
pluginId,
isInsidePlugin: pluginId !== 'grafana' && pluginId !== '',
+ isCoreGrafanaPlugin: false,
log: createLogMock(),
})
).toBe(true);
@@ -244,10 +245,23 @@ describe('Plugin Extension Validators', () => {
extensionPointId,
pluginId,
isInsidePlugin: pluginId !== 'grafana' && pluginId !== '',
+ isCoreGrafanaPlugin: false,
log: createLogMock(),
})
).toBe(false);
});
+
+ it('should return FALSE true if the extension point id is set by a core plugin', () => {
+ expect(
+ isExtensionPointIdValid({
+ extensionPointId: 'traces',
+ pluginId: 'traces',
+ isInsidePlugin: true,
+ isCoreGrafanaPlugin: true,
+ log: createLogMock(),
+ })
+ ).toBe(true);
+ });
});
describe('isAddedLinkMetaInfoMissing()', () => {
diff --git a/public/app/features/plugins/extensions/validators.ts b/public/app/features/plugins/extensions/validators.ts
index 081ac98fbab..df808a34576 100644
--- a/public/app/features/plugins/extensions/validators.ts
+++ b/public/app/features/plugins/extensions/validators.ts
@@ -69,17 +69,19 @@ export function isExtensionPointIdValid({
extensionPointId,
pluginId,
isInsidePlugin,
+ isCoreGrafanaPlugin,
log,
}: {
extensionPointId: string;
pluginId: string;
isInsidePlugin: boolean;
+ isCoreGrafanaPlugin: boolean;
log: ExtensionsLog;
}) {
const startsWithPluginId =
extensionPointId.startsWith(`${pluginId}/`) || extensionPointId.startsWith(`plugins/${pluginId}/`);
- if (isInsidePlugin && !startsWithPluginId) {
+ if (isInsidePlugin && !isCoreGrafanaPlugin && !startsWithPluginId) {
log.error(errors.INVALID_EXTENSION_POINT_ID_PLUGIN(pluginId, extensionPointId));
return false;
}
diff --git a/public/app/features/transformers/docs/content.ts b/public/app/features/transformers/docs/content.ts
index 5f7d8e14703..273cbe22c94 100644
--- a/public/app/features/transformers/docs/content.ts
+++ b/public/app/features/transformers/docs/content.ts
@@ -1559,7 +1559,7 @@ ${buildImageContent(
getHelperDocs: function (imageRenderType: ImageRenderType = ImageRenderType.ShortcodeFigure) {
return `
Use this transformation to pivot the data frame, converting rows into columns and columns into rows. This transformation is particularly useful when you want to switch the orientation of your data to better suit your visualization needs.
-If you have multiple types it will default to string type.
+If you have multiple types, it will default to string type. You can select how empty cells should be represented.
**Before Transformation:**
diff --git a/public/app/features/transformers/editors/GroupingToMatrixTransformerEditor.tsx b/public/app/features/transformers/editors/GroupingToMatrixTransformerEditor.tsx
index 6eb793e082a..dd8416c64b3 100644
--- a/public/app/features/transformers/editors/GroupingToMatrixTransformerEditor.tsx
+++ b/public/app/features/transformers/editors/GroupingToMatrixTransformerEditor.tsx
@@ -17,7 +17,7 @@ import { InlineField, InlineFieldRow, Select } from '@grafana/ui';
import { getTransformationContent } from '../docs/getTransformationContent';
import darkImage from '../images/dark/groupingToMatrix.svg';
import lightImage from '../images/light/groupingToMatrix.svg';
-import { useAllFieldNamesFromDataFrames } from '../utils';
+import { getEmptyOptions, useAllFieldNamesFromDataFrames } from '../utils';
export const GroupingToMatrixTransformerEditor = ({
input,
@@ -61,49 +61,6 @@ export const GroupingToMatrixTransformerEditor = ({
[onChange, options]
);
- const specialValueOptions: Array> = [
- {
- label: t('transformers.grouping-to-matrix-transformer-editor.special-value-options.label.null', 'Null'),
- value: SpecialValue.Null,
- description: t(
- 'transformers.grouping-to-matrix-transformer-editor.special-value-options.description.null-value',
- 'Null value'
- ),
- },
- {
- label: t('transformers.grouping-to-matrix-transformer-editor.special-value-options.label.true', 'True'),
- value: SpecialValue.True,
- description: t(
- 'transformers.grouping-to-matrix-transformer-editor.special-value-options.description.boolean-true-value',
- 'Boolean true value'
- ),
- },
- {
- label: t('transformers.grouping-to-matrix-transformer-editor.special-value-options.label.false', 'False'),
- value: SpecialValue.False,
- description: t(
- 'transformers.grouping-to-matrix-transformer-editor.special-value-options.description.boolean-false-value',
- 'Boolean false value'
- ),
- },
- {
- label: t('transformers.grouping-to-matrix-transformer-editor.special-value-options.label.zero', 'Zero'),
- value: SpecialValue.Zero,
- description: t(
- 'transformers.grouping-to-matrix-transformer-editor.special-value-options.description.number-value',
- 'Number 0 value'
- ),
- },
- {
- label: t('transformers.grouping-to-matrix-transformer-editor.special-value-options.label.empty', 'Empty'),
- value: SpecialValue.Empty,
- description: t(
- 'transformers.grouping-to-matrix-transformer-editor.special-value-options.description.empty-string',
- 'Empty string'
- ),
- },
- ];
-
const onSelectEmptyValue = useCallback(
(value: SelectableValue) => {
onChange({
@@ -143,7 +100,7 @@ export const GroupingToMatrixTransformerEditor = ({
/>
-
+
>
diff --git a/public/app/features/transformers/editors/TransposeTransformerEditor.tsx b/public/app/features/transformers/editors/TransposeTransformerEditor.tsx
index baeee2461e5..fda90c7ee64 100644
--- a/public/app/features/transformers/editors/TransposeTransformerEditor.tsx
+++ b/public/app/features/transformers/editors/TransposeTransformerEditor.tsx
@@ -4,15 +4,25 @@ import {
TransformerRegistryItem,
TransformerUIProps,
TransformerCategory,
+ SpecialValue,
+ SelectableValue,
} from '@grafana/data';
import { TransposeTransformerOptions } from '@grafana/data/internal';
import { t } from '@grafana/i18n';
-import { InlineField, InlineFieldRow, Input } from '@grafana/ui';
+import { InlineField, InlineFieldRow, Input, Select } from '@grafana/ui';
import darkImage from '../images/dark/transpose.svg';
import lightImage from '../images/light/transpose.svg';
+import { getEmptyOptions } from '../utils';
export const TransposeTransformerEditor = ({ options, onChange }: TransformerUIProps) => {
+ const onSelectEmptyValue = (value?: SelectableValue) => {
+ onChange({
+ ...options,
+ emptyValue: value?.value,
+ });
+ };
+
return (
<>
@@ -42,6 +52,11 @@ export const TransposeTransformerEditor = ({ options, onChange }: TransformerUIP
/>
+
+
+
+
+
>
);
};
diff --git a/public/app/features/transformers/utils.ts b/public/app/features/transformers/utils.ts
index 7cbf4cd1241..55358295b07 100644
--- a/public/app/features/transformers/utils.ts
+++ b/public/app/features/transformers/utils.ts
@@ -8,6 +8,7 @@ import {
getTimeZones,
VariableOrigin,
VariableSuggestion,
+ SpecialValue,
} from '@grafana/data';
import { t } from '@grafana/i18n';
import { getTemplateSrv } from '@grafana/runtime';
@@ -118,3 +119,33 @@ export function getVariableSuggestions(): VariableSuggestion[] {
.getVariables()
.map((v) => ({ value: v.name, label: v.label || v.name, origin: VariableOrigin.Template }));
}
+
+export function getEmptyOptions(): Array> {
+ return [
+ {
+ label: t('transformers.utils.special-value-options.label.null-value', 'Null'),
+ description: t('transformers.utils.special-value-options.description.null-value', 'Null value'),
+ value: SpecialValue.Null,
+ },
+ {
+ label: t('transformers.utils.special-value-options.label.boolean-true', 'True'),
+ description: t('transformers.utils.special-value-options.description.boolean-true', 'Boolean true value'),
+ value: SpecialValue.True,
+ },
+ {
+ label: t('transformers.utils.special-value-options.label.boolean-false', 'False'),
+ description: t('transformers.utils.special-value-options.description.boolean-false', 'Boolean false value'),
+ value: SpecialValue.False,
+ },
+ {
+ label: t('transformers.utils.special-value-options.label.number-value', 'Zero'),
+ description: t('transformers.utils.special-value-options.description.number-value', 'Number 0 value'),
+ value: SpecialValue.Zero,
+ },
+ {
+ label: t('transformers.utils.special-value-options.label.empty-string', 'Empty'),
+ description: t('transformers.utils.special-value-options.description.empty-string', 'Empty String'),
+ value: SpecialValue.Empty,
+ },
+ ];
+}
diff --git a/public/app/plugins/datasource/azuremonitor/package.json b/public/app/plugins/datasource/azuremonitor/package.json
index 056b8688f35..090711a0ffb 100644
--- a/public/app/plugins/datasource/azuremonitor/package.json
+++ b/public/app/plugins/datasource/azuremonitor/package.json
@@ -28,8 +28,8 @@
"devDependencies": {
"@grafana/e2e-selectors": "12.2.0-pre",
"@grafana/plugin-configs": "12.2.0-pre",
- "@testing-library/dom": "10.4.0",
- "@testing-library/jest-dom": "6.6.3",
+ "@testing-library/dom": "10.4.1",
+ "@testing-library/jest-dom": "6.6.4",
"@testing-library/react": "16.3.0",
"@testing-library/user-event": "14.6.1",
"@types/jest": "29.5.14",
@@ -42,7 +42,7 @@
"jest": "29.7.0",
"react-select-event": "5.5.1",
"ts-node": "10.9.2",
- "typescript": "5.8.3",
+ "typescript": "5.9.2",
"webpack": "5.101.0"
},
"peerDependencies": {
diff --git a/public/app/plugins/datasource/cloud-monitoring/package.json b/public/app/plugins/datasource/cloud-monitoring/package.json
index 7181c557951..6d6c4879ee1 100644
--- a/public/app/plugins/datasource/cloud-monitoring/package.json
+++ b/public/app/plugins/datasource/cloud-monitoring/package.json
@@ -28,8 +28,8 @@
"devDependencies": {
"@grafana/e2e-selectors": "12.2.0-pre",
"@grafana/plugin-configs": "12.2.0-pre",
- "@testing-library/dom": "10.4.0",
- "@testing-library/jest-dom": "6.6.3",
+ "@testing-library/dom": "10.4.1",
+ "@testing-library/jest-dom": "6.6.4",
"@testing-library/react": "16.3.0",
"@testing-library/user-event": "14.6.1",
"@types/debounce-promise": "3.1.9",
@@ -42,7 +42,7 @@
"jest": "29.7.0",
"react-select-event": "5.5.1",
"ts-node": "10.9.2",
- "typescript": "5.8.3",
+ "typescript": "5.9.2",
"webpack": "5.101.0"
},
"peerDependencies": {
diff --git a/public/app/plugins/datasource/dashboard/datasource.test.ts b/public/app/plugins/datasource/dashboard/datasource.test.ts
index 3bb2fbc6b3c..5f522be6d2b 100644
--- a/public/app/plugins/datasource/dashboard/datasource.test.ts
+++ b/public/app/plugins/datasource/dashboard/datasource.test.ts
@@ -569,6 +569,101 @@ describe('DashboardDatasource', () => {
expect(result.length).toBe(2);
});
});
+
+ describe('getFiltersApplicability', () => {
+ const originalToggleValue = config.featureToggles.dashboardDsAdHocFiltering;
+ const ds = new DashboardDatasource({} as DataSourceInstanceSettings);
+
+ beforeEach(() => {
+ config.featureToggles.dashboardDsAdHocFiltering = true;
+ });
+
+ afterEach(() => {
+ config.featureToggles.dashboardDsAdHocFiltering = originalToggleValue;
+ });
+
+ it('should return empty array when feature toggle is disabled', async () => {
+ config.featureToggles.dashboardDsAdHocFiltering = false;
+
+ const result = await ds.getFiltersApplicability({
+ filters: [{ key: 'name', operator: '=', value: 'test' }],
+ });
+
+ expect(result).toEqual([]);
+ });
+
+ it('should mark supported operators as applicable', async () => {
+ const result = await ds.getFiltersApplicability({
+ filters: [
+ { key: 'name', operator: '=', value: 'John' },
+ { key: 'age', operator: '!=', value: '25' },
+ ],
+ });
+
+ expect(result).toEqual([
+ { key: 'name', applicable: true },
+ { key: 'age', applicable: true },
+ ]);
+ });
+
+ it('should mark unsupported operators as not applicable with reason', async () => {
+ const result = await ds.getFiltersApplicability({
+ filters: [
+ { key: 'name', operator: '>', value: 'John' },
+ { key: 'age', operator: '<', value: '25' },
+ { key: 'score', operator: '=~', value: 'pattern' },
+ ],
+ });
+
+ expect(result).toEqual([
+ {
+ key: 'name',
+ applicable: false,
+ reason: "Operator '>' is not supported. Only '=' and '!=' operators are supported.",
+ },
+ {
+ key: 'age',
+ applicable: false,
+ reason: "Operator '<' is not supported. Only '=' and '!=' operators are supported.",
+ },
+ {
+ key: 'score',
+ applicable: false,
+ reason: "Operator '=~' is not supported. Only '=' and '!=' operators are supported.",
+ },
+ ]);
+ });
+
+ it('should handle mixed applicable and non-applicable filters', async () => {
+ const result = await ds.getFiltersApplicability({
+ filters: [
+ { key: 'name', operator: '=', value: 'John' },
+ { key: 'age', operator: '>', value: '25' },
+ { key: 'status', operator: '!=', value: 'active' },
+ ],
+ });
+
+ expect(result).toEqual([
+ { key: 'name', applicable: true },
+ {
+ key: 'age',
+ applicable: false,
+ reason: "Operator '>' is not supported. Only '=' and '!=' operators are supported.",
+ },
+ { key: 'status', applicable: true },
+ ]);
+ });
+
+ it('should handle empty filters array', async () => {
+ const result = await ds.getFiltersApplicability({ filters: [] });
+ expect(result).toEqual([]);
+ });
+
+ it('should handle missing options', async () => {
+ const result = await ds.getFiltersApplicability();
+ expect(result).toEqual([]);
+ });
+ });
});
});
diff --git a/public/app/plugins/datasource/dashboard/datasource.ts b/public/app/plugins/datasource/dashboard/datasource.ts
index e98e140eb0a..524b044fed0 100644
--- a/public/app/plugins/datasource/dashboard/datasource.ts
+++ b/public/app/plugins/datasource/dashboard/datasource.ts
@@ -17,6 +17,8 @@ import {
MetricFindValue,
getValueMatcher,
ValueMatcherID,
+ FiltersApplicability,
+ DataSourceGetTagKeysOptions,
} from '@grafana/data';
import { config } from '@grafana/runtime';
import { SceneDataProvider, SceneDataTransformer, SceneObject } from '@grafana/scenes';
@@ -157,30 +159,18 @@ export class DashboardDatasource extends DataSourceApi {
return frame;
}
- // Pre-compute field indices and value matchers for better performance
- const filterFieldIndices = filters
- .map((filter) => {
- const fieldIndex = frame.fields.findIndex((f) => f.name === filter.key);
- return { filter, fieldIndex, matcher: this.createValueMatcher(filter, fieldIndex, frame) };
- })
- .filter(({ filter, fieldIndex, matcher }) => {
- // If field is not present:
- // - Keep filters with '=' operator (will always be false - reject rows)
- // - Remove filters with '!=' operator (will always be true - no effect)
- if (fieldIndex === -1) {
- return filter.operator === '=';
- }
- // Only keep filters with valid matchers
- return matcher !== null;
- });
+ // Filter out non-applicable filters for this specific DataFrame
+ const applicableFilters = this.getApplicableFiltersForFrame(frame, filters);
- // If no filters remain after optimization, return original frame
- if (filterFieldIndices.length === 0) {
+ // If no filters remain after filtering, return original frame
+ if (applicableFilters.length === 0) {
return frame;
}
- // Short-circuit: if any filter has '=' operator with missing field, reject all rows
- const hasImpossibleFilter = filterFieldIndices.some(({ fieldIndex }) => fieldIndex === -1);
+ // Check for impossible filters (missing field with '=' operator)
+ const hasImpossibleFilter = applicableFilters.some(
+ ({ fieldIndex, filter }) => fieldIndex === -1 && filter.operator === '='
+ );
if (hasImpossibleFilter) {
return this.reconstructDataFrame(frame);
}
@@ -189,7 +179,7 @@ export class DashboardDatasource extends DataSourceApi {
// Check each row to see if it matches all filters (AND logic)
for (let rowIndex = 0; rowIndex < frame.length; rowIndex++) {
- const rowMatches = filterFieldIndices.every(({ matcher, fieldIndex }) => {
+ const rowMatches = applicableFilters.every(({ matcher, fieldIndex }) => {
const field = frame.fields[fieldIndex];
// Use Grafana's value matcher system
@@ -210,7 +200,31 @@ export class DashboardDatasource extends DataSourceApi {
}
/**
- * Create a value matcher from an AdHoc filter
+ * Get applicable filters for a specific DataFrame, considering field existence and type compatibility.
+ */
+ private getApplicableFiltersForFrame(
+ frame: DataFrame,
+ filters: AdHocVariableFilter[]
+ ): Array<{ filter: AdHocVariableFilter; fieldIndex: number; matcher: ReturnType | null }> {
+ return filters
+ .map((filter) => {
+ const fieldIndex = frame.fields.findIndex((f) => f.name === filter.key);
+ return { filter, fieldIndex, matcher: this.createValueMatcher(filter, fieldIndex, frame) };
+ })
+ .filter(({ filter, fieldIndex, matcher }) => {
+ // If field is not present:
+ // - Keep filters with '=' operator (will always be false - reject rows)
+ // - Remove filters with '!=' operator (will always be true - no effect)
+ if (fieldIndex === -1) {
+ return filter.operator === '=';
+ }
+ // Only keep filters with valid matchers
+ return matcher !== null;
+ });
+ }
+
+ /**
+ * Create a value matcher from an AdHoc filter.
*/
private createValueMatcher(filter: AdHocVariableFilter, fieldIndex: number, frame: DataFrame) {
// Return null for missing fields - they are handled separately
@@ -329,6 +343,38 @@ export class DashboardDatasource extends DataSourceApi {
return Promise.resolve({ message: '', status: '' });
}
+ /**
+ * Check which AdHoc filters are applicable based on operator and field type support
+ */
+ async getFiltersApplicability(
+ options?: DataSourceGetTagKeysOptions
+ ): Promise {
+ if (!config.featureToggles.dashboardDsAdHocFiltering) {
+ return [];
+ }
+
+ const filters = options?.filters || [];
+
+ return filters.map((filter): FiltersApplicability => {
+ // Check operator support
+ if (filter.operator !== '=' && filter.operator !== '!=') {
+ return {
+ key: filter.key,
+ applicable: false,
+ reason: `Operator '${filter.operator}' is not supported. Only '=' and '!=' operators are supported.`,
+ };
+ }
+
+ // For dashboard datasource, we can't determine field existence/type
+ // without the actual DataFrame context, so we assume applicable here
+ // and let the actual filtering logic handle field-specific checks
+ return {
+ key: filter.key,
+ applicable: true,
+ };
+ });
+ }
+
getTagKeys(): Promise {
// Stub implementation to indicate AdHoc filter support
// Full implementation will be added in future PRs
diff --git a/public/app/plugins/datasource/grafana-postgresql-datasource/package.json b/public/app/plugins/datasource/grafana-postgresql-datasource/package.json
index 40ca80efa0b..a6188574668 100644
--- a/public/app/plugins/datasource/grafana-postgresql-datasource/package.json
+++ b/public/app/plugins/datasource/grafana-postgresql-datasource/package.json
@@ -18,7 +18,7 @@
"devDependencies": {
"@grafana/e2e-selectors": "12.2.0-pre",
"@grafana/plugin-configs": "12.2.0-pre",
- "@testing-library/dom": "10.4.0",
+ "@testing-library/dom": "10.4.1",
"@testing-library/react": "16.3.0",
"@testing-library/user-event": "14.6.1",
"@types/jest": "29.5.14",
@@ -27,7 +27,7 @@
"@types/react": "18.3.18",
"jest": "29.7.0",
"ts-node": "10.9.2",
- "typescript": "5.8.3",
+ "typescript": "5.9.2",
"webpack": "5.101.0"
},
"peerDependencies": {
diff --git a/public/app/plugins/datasource/grafana-pyroscope-datasource/package.json b/public/app/plugins/datasource/grafana-pyroscope-datasource/package.json
index 612b26365b0..b97b9af0c3e 100644
--- a/public/app/plugins/datasource/grafana-pyroscope-datasource/package.json
+++ b/public/app/plugins/datasource/grafana-pyroscope-datasource/package.json
@@ -21,8 +21,8 @@
},
"devDependencies": {
"@grafana/plugin-configs": "12.2.0-pre",
- "@testing-library/dom": "10.4.0",
- "@testing-library/jest-dom": "6.6.3",
+ "@testing-library/dom": "10.4.1",
+ "@testing-library/jest-dom": "6.6.4",
"@testing-library/react": "16.3.0",
"@testing-library/user-event": "14.6.1",
"@types/jest": "29.5.14",
@@ -35,7 +35,7 @@
"jest": "29.7.0",
"style-loader": "4.0.0",
"ts-node": "10.9.2",
- "typescript": "5.8.3",
+ "typescript": "5.9.2",
"webpack": "5.101.0"
},
"peerDependencies": {
diff --git a/public/app/plugins/datasource/grafana-testdata-datasource/package.json b/public/app/plugins/datasource/grafana-testdata-datasource/package.json
index aafaa01cfb5..544457c4a16 100644
--- a/public/app/plugins/datasource/grafana-testdata-datasource/package.json
+++ b/public/app/plugins/datasource/grafana-testdata-datasource/package.json
@@ -23,8 +23,8 @@
"devDependencies": {
"@grafana/e2e-selectors": "12.2.0-pre",
"@grafana/plugin-configs": "12.2.0-pre",
- "@testing-library/dom": "10.4.0",
- "@testing-library/jest-dom": "6.6.3",
+ "@testing-library/dom": "10.4.1",
+ "@testing-library/jest-dom": "6.6.4",
"@testing-library/react": "16.3.0",
"@testing-library/user-event": "14.6.1",
"@types/d3-random": "^3.0.2",
@@ -36,7 +36,7 @@
"@types/uuid": "10.0.0",
"jest": "29.7.0",
"ts-node": "10.9.2",
- "typescript": "5.8.3",
+ "typescript": "5.9.2",
"webpack": "5.101.0"
},
"peerDependencies": {
diff --git a/public/app/plugins/datasource/jaeger/package.json b/public/app/plugins/datasource/jaeger/package.json
index 7733e2817ef..7832f9f3624 100644
--- a/public/app/plugins/datasource/jaeger/package.json
+++ b/public/app/plugins/datasource/jaeger/package.json
@@ -24,8 +24,8 @@
},
"devDependencies": {
"@grafana/plugin-configs": "workspace:*",
- "@testing-library/dom": "10.4.0",
- "@testing-library/jest-dom": "6.6.3",
+ "@testing-library/dom": "10.4.1",
+ "@testing-library/jest-dom": "6.6.4",
"@testing-library/react": "16.3.0",
"@testing-library/user-event": "14.6.1",
"@types/jest": "29.5.14",
@@ -38,7 +38,7 @@
"@types/uuid": "10.0.0",
"jest": "29.7.0",
"ts-node": "10.9.2",
- "typescript": "5.8.3",
+ "typescript": "5.9.2",
"webpack": "5.101.0"
},
"peerDependencies": {
diff --git a/public/app/plugins/datasource/loki/package.json b/public/app/plugins/datasource/loki/package.json
index 937fba60812..b98404726cd 100644
--- a/public/app/plugins/datasource/loki/package.json
+++ b/public/app/plugins/datasource/loki/package.json
@@ -26,8 +26,8 @@
"devDependencies": {
"@grafana/e2e-selectors": "12.2.0-pre",
"@grafana/plugin-configs": "12.2.0-pre",
- "@testing-library/dom": "10.4.0",
- "@testing-library/jest-dom": "6.6.3",
+ "@testing-library/dom": "10.4.1",
+ "@testing-library/jest-dom": "6.6.4",
"@testing-library/react": "16.3.0",
"@testing-library/user-event": "14.6.1",
"@types/d3-random": "^3.0.2",
@@ -39,7 +39,7 @@
"@types/uuid": "10.0.0",
"jest": "29.7.0",
"ts-node": "10.9.2",
- "typescript": "5.8.3",
+ "typescript": "5.9.2",
"webpack": "5.101.0"
},
"peerDependencies": {
diff --git a/public/app/plugins/datasource/mssql/package.json b/public/app/plugins/datasource/mssql/package.json
index 48940aedbdd..82bdec4b732 100644
--- a/public/app/plugins/datasource/mssql/package.json
+++ b/public/app/plugins/datasource/mssql/package.json
@@ -19,7 +19,7 @@
"devDependencies": {
"@grafana/e2e-selectors": "12.2.0-pre",
"@grafana/plugin-configs": "12.2.0-pre",
- "@testing-library/dom": "10.4.0",
+ "@testing-library/dom": "10.4.1",
"@testing-library/react": "16.3.0",
"@testing-library/user-event": "14.6.1",
"@types/jest": "29.5.14",
@@ -28,7 +28,7 @@
"@types/react": "18.3.18",
"i18next-parser": "9.3.0",
"ts-node": "10.9.2",
- "typescript": "5.8.3",
+ "typescript": "5.9.2",
"webpack": "5.101.0"
},
"peerDependencies": {
diff --git a/public/app/plugins/datasource/mysql/package.json b/public/app/plugins/datasource/mysql/package.json
index b8bcf1e9e14..5c3a9654e7d 100644
--- a/public/app/plugins/datasource/mysql/package.json
+++ b/public/app/plugins/datasource/mysql/package.json
@@ -18,7 +18,7 @@
"devDependencies": {
"@grafana/e2e-selectors": "12.2.0-pre",
"@grafana/plugin-configs": "12.2.0-pre",
- "@testing-library/dom": "10.4.0",
+ "@testing-library/dom": "10.4.1",
"@testing-library/react": "16.3.0",
"@testing-library/user-event": "14.6.1",
"@types/jest": "29.5.14",
@@ -27,7 +27,7 @@
"@types/react": "18.3.18",
"jest": "29.7.0",
"ts-node": "10.9.2",
- "typescript": "5.8.3",
+ "typescript": "5.9.2",
"webpack": "5.101.0"
},
"peerDependencies": {
diff --git a/public/app/plugins/datasource/parca/package.json b/public/app/plugins/datasource/parca/package.json
index a3c421b7a16..3b08680a41a 100644
--- a/public/app/plugins/datasource/parca/package.json
+++ b/public/app/plugins/datasource/parca/package.json
@@ -19,7 +19,7 @@
},
"devDependencies": {
"@grafana/plugin-configs": "12.2.0-pre",
- "@testing-library/dom": "10.4.0",
+ "@testing-library/dom": "10.4.1",
"@testing-library/react": "16.3.0",
"@testing-library/user-event": "14.6.1",
"@types/lodash": "4.17.20",
@@ -28,7 +28,7 @@
"@types/react-dom": "18.3.5",
"jest": "29.7.0",
"ts-node": "10.9.2",
- "typescript": "5.8.3",
+ "typescript": "5.9.2",
"webpack": "5.101.0"
},
"peerDependencies": {
diff --git a/public/app/plugins/datasource/tempo/datasource.ts b/public/app/plugins/datasource/tempo/datasource.ts
index 63cb1bba4ea..b7c3af81613 100644
--- a/public/app/plugins/datasource/tempo/datasource.ts
+++ b/public/app/plugins/datasource/tempo/datasource.ts
@@ -377,6 +377,7 @@ export class TempoDatasource extends DataSourceWithBackend 0) {
reportInteraction('grafana_traces_service_graph_queried', {
datasourceType: 'tempo',
diff --git a/public/app/plugins/datasource/tempo/package.json b/public/app/plugins/datasource/tempo/package.json
index 7afedbaff53..f948e1044ef 100644
--- a/public/app/plugins/datasource/tempo/package.json
+++ b/public/app/plugins/datasource/tempo/package.json
@@ -39,8 +39,8 @@
},
"devDependencies": {
"@grafana/plugin-configs": "12.2.0-pre",
- "@testing-library/dom": "10.4.0",
- "@testing-library/jest-dom": "6.6.3",
+ "@testing-library/dom": "10.4.1",
+ "@testing-library/jest-dom": "6.6.4",
"@testing-library/react": "16.3.0",
"@testing-library/user-event": "14.6.1",
"@types/jest": "29.5.14",
@@ -55,7 +55,7 @@
"jest": "29.7.0",
"react-select-event": "5.5.1",
"ts-node": "10.9.2",
- "typescript": "5.8.3",
+ "typescript": "5.9.2",
"webpack": "5.101.0"
},
"peerDependencies": {
diff --git a/public/app/plugins/datasource/tempo/streaming.ts b/public/app/plugins/datasource/tempo/streaming.ts
index fdc66ea7bf8..3ea011d3185 100644
--- a/public/app/plugins/datasource/tempo/streaming.ts
+++ b/public/app/plugins/datasource/tempo/streaming.ts
@@ -20,7 +20,7 @@ import {
import { cloneQueryResponse, combineResponses } from '@grafana/o11y-ds-frontend';
import { getGrafanaLiveSrv } from '@grafana/runtime';
-import { SearchStreamingState } from './dataquery.gen';
+import { MetricsQueryType, SearchStreamingState } from './dataquery.gen';
import { DEFAULT_SPSS, TempoDatasource } from './datasource';
import { formatTraceQLResponse } from './resultTransformer';
import { SearchMetrics, TempoJsonData, TempoQuery } from './types';
@@ -177,7 +177,8 @@ export function doTempoMetricsStreaming(
if (!curr) {
return acc;
}
- if (!acc) {
+ // If the query is an instant query, we always want the latest result.
+ if (!acc || query.metricsQueryType === MetricsQueryType.Instant) {
return cloneQueryResponse(curr);
}
return mergeFrames(acc, curr);
diff --git a/public/app/plugins/datasource/tempo/traceql/TempoQueryBuilderOptions.tsx b/public/app/plugins/datasource/tempo/traceql/TempoQueryBuilderOptions.tsx
index c591455d578..96c577d0c6e 100644
--- a/public/app/plugins/datasource/tempo/traceql/TempoQueryBuilderOptions.tsx
+++ b/public/app/plugins/datasource/tempo/traceql/TempoQueryBuilderOptions.tsx
@@ -37,6 +37,7 @@ export const TempoQueryBuilderOptions = React.memo(
const styles = useStyles2(getStyles);
const [isOpen, toggleOpen] = useToggle(false);
const isAlerting = app === CoreApp.UnifiedAlerting;
+ const isMetricsStreamingEnabled = metricsStreaming && !isAlerting;
if (!query.hasOwnProperty('limit')) {
query.limit = DEFAULT_LIMIT;
@@ -93,7 +94,7 @@ export const TempoQueryBuilderOptions = React.memo(
`Step: ${query.step || 'auto'}`,
`Type: ${query.metricsQueryType === MetricsQueryType.Range ? 'Range' : 'Instant'}`,
'|',
- `Streaming: ${metricsStreaming ? 'Enabled' : 'Disabled'}`,
+ `Streaming: ${isMetricsStreamingEnabled ? 'Enabled' : 'Disabled'}`,
// `Exemplars: ${query.exemplars !== undefined ? query.exemplars : 'auto'}`,
];
@@ -179,7 +180,7 @@ export const TempoQueryBuilderOptions = React.memo(
} tooltipInteractive>
- {metricsStreaming ? 'Enabled' : 'Disabled'}
+ {isMetricsStreamingEnabled ? 'Enabled' : 'Disabled'}
{/*
- {contextRow && (
+ {(!config.featureToggles.newLogsPanel || !config.featureToggles.newLogContext) && contextRow && (
)}
+ {config.featureToggles.newLogsPanel && config.featureToggles.newLogContext && getLogRowContext && contextRow && (
+ getLogRowContext(row, contextRow, options)}
+ getLogRowContextUi={getLogRowContextUi}
+ logOptionsStorageKey={controlsStorageKey}
+ timeZone={timeZone}
+ displayedFields={displayedFields}
+ onClickShowField={showField}
+ onClickHideField={hideField}
+ />
+ )}
{config.featureToggles.newLogsPanel && (
({
display: 'flex',
flex: 1,
flexDirection: 'column',
+ overflow: 'hidden',
}),
controlledLogsContainer: css({
height: '100%',
diff --git a/public/app/plugins/panel/table/cells/AutoCellOptionsEditor.tsx b/public/app/plugins/panel/table/cells/AutoCellOptionsEditor.tsx
index 7b108fbc155..e97d481e0b3 100644
--- a/public/app/plugins/panel/table/cells/AutoCellOptionsEditor.tsx
+++ b/public/app/plugins/panel/table/cells/AutoCellOptionsEditor.tsx
@@ -8,8 +8,6 @@ export const AutoCellOptionsEditor = ({
cellOptions,
onChange,
}: TableCellEditorProps
) => {
- // Handle row coloring changes
-
const onWrapTextChange = () => {
cellOptions.wrapText = !cellOptions.wrapText;
onChange(cellOptions);
diff --git a/public/app/plugins/panel/table/cells/ColorBackgroundCellOptionsEditor.tsx b/public/app/plugins/panel/table/cells/ColorBackgroundCellOptionsEditor.tsx
index afd6353a43e..33c3761493d 100644
--- a/public/app/plugins/panel/table/cells/ColorBackgroundCellOptionsEditor.tsx
+++ b/public/app/plugins/panel/table/cells/ColorBackgroundCellOptionsEditor.tsx
@@ -21,13 +21,11 @@ export const ColorBackgroundCellOptionsEditor = ({
onChange(cellOptions);
};
- // Handle row coloring changes
const onColorRowChange = () => {
cellOptions.applyToRow = !cellOptions.applyToRow;
onChange(cellOptions);
};
- // Handle row coloring changes
const onWrapTextChange = () => {
cellOptions.wrapText = !cellOptions.wrapText;
onChange(cellOptions);
diff --git a/public/app/plugins/panel/table/table-new/PaginationEditor.tsx b/public/app/plugins/panel/table/table-new/PaginationEditor.tsx
index 6434c75e1b9..ccd9451ee3f 100644
--- a/public/app/plugins/panel/table/table-new/PaginationEditor.tsx
+++ b/public/app/plugins/panel/table/table-new/PaginationEditor.tsx
@@ -4,11 +4,8 @@ import { StandardEditorProps } from '@grafana/data';
import { selectors } from '@grafana/e2e-selectors';
import { Switch } from '@grafana/ui';
-export function PaginationEditor({ onChange, value, context }: StandardEditorProps) {
+export function PaginationEditor({ onChange, value }: StandardEditorProps) {
const changeValue = (event: React.FormEvent | undefined) => {
- if (event?.currentTarget.checked) {
- context.options.footer.show = false;
- }
onChange(event?.currentTarget.checked);
};
diff --git a/public/app/plugins/panel/table/table-new/TableCellOptionEditor.tsx b/public/app/plugins/panel/table/table-new/TableCellOptionEditor.tsx
index 77e2acf0808..b70723695cb 100644
--- a/public/app/plugins/panel/table/table-new/TableCellOptionEditor.tsx
+++ b/public/app/plugins/panel/table/table-new/TableCellOptionEditor.tsx
@@ -4,14 +4,15 @@ import { useState } from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { t } from '@grafana/i18n';
-import { TableCellOptions } from '@grafana/schema';
+import { TableCellOptions, TableWrapTextOptions } from '@grafana/schema';
import { Combobox, ComboboxOption, Field, TableCellDisplayMode, useStyles2 } from '@grafana/ui';
-import { AutoCellOptionsEditor } from './cells/AutoCellOptionsEditor';
import { BarGaugeCellOptionsEditor } from './cells/BarGaugeCellOptionsEditor';
import { ColorBackgroundCellOptionsEditor } from './cells/ColorBackgroundCellOptionsEditor';
import { ImageCellOptionsEditor } from './cells/ImageCellOptionsEditor';
+import { MarkdownCellOptionsEditor } from './cells/MarkdownCellOptionsEditor';
import { SparklineCellOptionsEditor } from './cells/SparklineCellOptionsEditor';
+import { TextWrapOptionsEditor } from './cells/TextWrapOptionsEditor';
// The props that any cell type editor are expected
// to handle. In this case the generic type should
@@ -26,6 +27,19 @@ interface Props {
onChange: (v: TableCellOptions) => void;
}
+const TEXT_WRAP_CELL_TYPES = new Set([
+ TableCellDisplayMode.Auto,
+ TableCellDisplayMode.Sparkline,
+ TableCellDisplayMode.ColorText,
+ TableCellDisplayMode.ColorBackground,
+ TableCellDisplayMode.DataLinks,
+ TableCellDisplayMode.Pill,
+]);
+
+function isTextWrapCellType(value: TableCellOptions): value is TableCellOptions & TableWrapTextOptions {
+ return TEXT_WRAP_CELL_TYPES.has(value.type);
+}
+
export const TableCellOptionEditor = ({ value, onChange }: Props) => {
const cellType = value.type;
const styles = useStyles2(getStyles);
@@ -41,6 +55,7 @@ export const TableCellOptionEditor = ({ value, onChange }: Props) => {
{ value: TableCellDisplayMode.Sparkline, label: t('table.cell-types.sparkline', 'Sparkline') },
{ value: TableCellDisplayMode.JSONView, label: t('table.cell-types.json', 'JSON View') },
{ value: TableCellDisplayMode.Pill, label: t('table.cell-types.pill', 'Pill') },
+ { value: TableCellDisplayMode.Markdown, label: t('table.cell-types.markdown', 'Markdown + HTML') },
{ value: TableCellDisplayMode.Image, label: t('table.cell-types.image', 'Image') },
{ value: TableCellDisplayMode.Actions, label: t('table.cell-types.actions', 'Actions') },
];
@@ -79,9 +94,7 @@ export const TableCellOptionEditor = ({ value, onChange }: Props) => {
- {(cellType === TableCellDisplayMode.Auto || cellType === TableCellDisplayMode.ColorText) && (
-
- )}
+ {isTextWrapCellType(value) && }
{cellType === TableCellDisplayMode.Gauge && (
)}
@@ -94,6 +107,9 @@ export const TableCellOptionEditor = ({ value, onChange }: Props) => {
{cellType === TableCellDisplayMode.Image && (
)}
+ {cellType === TableCellDisplayMode.Markdown && (
+
+ )}
);
};
diff --git a/public/app/plugins/panel/table/table-new/TablePanel.tsx b/public/app/plugins/panel/table/table-new/TablePanel.tsx
index 5af5472f19b..6859e6368fb 100644
--- a/public/app/plugins/panel/table/table-new/TablePanel.tsx
+++ b/public/app/plugins/panel/table/table-new/TablePanel.tsx
@@ -17,6 +17,7 @@ import { config, PanelDataErrorView } from '@grafana/runtime';
import { Select, usePanelContext, useTheme2 } from '@grafana/ui';
import { TableSortByFieldState } from '@grafana/ui/internal';
import { TableNG } from '@grafana/ui/unstable';
+import { getConfig } from 'app/core/config';
import { getActions } from '../../../../features/actions/utils';
@@ -61,6 +62,8 @@ export function TablePanel(props: Props) {
const enableSharedCrosshair = panelContext.sync && panelContext.sync() !== DashboardCursorSync.Off;
+ const disableSanitizeHtml = getConfig().disableSanitizeHtml;
+
const tableElement = (
);
diff --git a/public/app/plugins/panel/table/table-new/cells/AutoCellOptionsEditor.tsx b/public/app/plugins/panel/table/table-new/cells/AutoCellOptionsEditor.tsx
deleted file mode 100644
index 5aae9d65b7a..00000000000
--- a/public/app/plugins/panel/table/table-new/cells/AutoCellOptionsEditor.tsx
+++ /dev/null
@@ -1,27 +0,0 @@
-import { selectors } from '@grafana/e2e-selectors';
-import { t } from '@grafana/i18n';
-import { TableAutoCellOptions, TableColoredBackgroundCellOptions, TableColorTextCellOptions } from '@grafana/schema';
-import { Field, Switch } from '@grafana/ui';
-
-import { TableCellEditorProps } from '../TableCellOptionEditor';
-
-export const AutoCellOptionsEditor = ({
- cellOptions,
- onChange,
-}: TableCellEditorProps) => {
- // Handle row coloring changes
- const onWrapTextChange = () => {
- cellOptions.wrapText = !cellOptions.wrapText;
- onChange(cellOptions);
- };
-
- return (
-
-
-
- );
-};
diff --git a/public/app/plugins/panel/table/table-new/cells/ColorBackgroundCellOptionsEditor.tsx b/public/app/plugins/panel/table/table-new/cells/ColorBackgroundCellOptionsEditor.tsx
index b7d5d2ab3dc..33d85539ec4 100644
--- a/public/app/plugins/panel/table/table-new/cells/ColorBackgroundCellOptionsEditor.tsx
+++ b/public/app/plugins/panel/table/table-new/cells/ColorBackgroundCellOptionsEditor.tsx
@@ -6,7 +6,7 @@ import { Field, RadioButtonGroup, Switch } from '@grafana/ui';
import { TableCellEditorProps } from '../TableCellOptionEditor';
-import { AutoCellOptionsEditor } from './AutoCellOptionsEditor';
+import { TextWrapOptionsEditor } from './TextWrapOptionsEditor';
const colorBackgroundOpts: Array> = [
{ value: TableCellBackgroundDisplayMode.Basic, label: 'Basic' },
@@ -21,7 +21,6 @@ export const ColorBackgroundCellOptionsEditor = ({
cellOptions.mode = v;
onChange(cellOptions);
};
- // Handle row coloring changes
const onColorRowChange = () => {
cellOptions.applyToRow = !cellOptions.applyToRow;
onChange(cellOptions);
@@ -54,7 +53,7 @@ export const ColorBackgroundCellOptionsEditor = ({
/>
- {
cellOptions.wrapText = updatedCellOptions.wrapText;
diff --git a/public/app/plugins/panel/table/table-new/cells/MarkdownCellOptionsEditor.tsx b/public/app/plugins/panel/table/table-new/cells/MarkdownCellOptionsEditor.tsx
new file mode 100644
index 00000000000..00c086eb37e
--- /dev/null
+++ b/public/app/plugins/panel/table/table-new/cells/MarkdownCellOptionsEditor.tsx
@@ -0,0 +1,39 @@
+import { FormEvent } from 'react';
+
+import { t, Trans } from '@grafana/i18n';
+import { TableMarkdownCellOptions } from '@grafana/schema';
+import { Badge, Field, Label, Switch } from '@grafana/ui';
+
+import { TableCellEditorProps } from '../TableCellOptionEditor';
+
+export const MarkdownCellOptionsEditor = ({
+ cellOptions,
+ onChange,
+}: TableCellEditorProps) => {
+ const onDynamicHeightChange = (e: FormEvent) => {
+ cellOptions.dynamicHeight = e.currentTarget.checked;
+ onChange(cellOptions);
+ };
+
+ return (
+
+ Dynamic height{' '}
+
+
+ }
+ >
+
+
+ );
+};
diff --git a/public/app/plugins/panel/table/table-new/cells/TextWrapOptionsEditor.tsx b/public/app/plugins/panel/table/table-new/cells/TextWrapOptionsEditor.tsx
new file mode 100644
index 00000000000..74ddaa092ea
--- /dev/null
+++ b/public/app/plugins/panel/table/table-new/cells/TextWrapOptionsEditor.tsx
@@ -0,0 +1,29 @@
+import { selectors } from '@grafana/e2e-selectors';
+import { t } from '@grafana/i18n';
+import { TableCellOptions, TableWrapTextOptions } from '@grafana/schema';
+import { Field, Switch } from '@grafana/ui';
+
+import { TableCellEditorProps } from '../TableCellOptionEditor';
+
+export const TextWrapOptionsEditor = ({
+ cellOptions,
+ onChange,
+}: TableCellEditorProps) => {
+ // Handle row coloring changes
+ const onWrapTextChange = () => {
+ cellOptions.wrapText = !cellOptions.wrapText;
+ onChange(cellOptions);
+ };
+
+ return (
+ <>
+
+
+
+ >
+ );
+};
diff --git a/public/app/store/configureStore.ts b/public/app/store/configureStore.ts
index db0c15c8f7f..525f5f9db7d 100644
--- a/public/app/store/configureStore.ts
+++ b/public/app/store/configureStore.ts
@@ -3,6 +3,7 @@ import { setupListeners } from '@reduxjs/toolkit/query';
import { Middleware } from 'redux';
import { alertingAPI as alertingPackageAPI } from '@grafana/alerting/unstable';
+import { dashboardAPIv0alpha1 } from 'app/api/clients/dashboard/v0alpha1';
import { browseDashboardsAPI } from 'app/features/browse-dashboards/api/browseDashboardsAPI';
import { publicDashboardApi } from 'app/features/dashboard/api/publicDashboardApi';
import { cloudMigrationAPI } from 'app/features/migrate-to-cloud/api';
@@ -53,6 +54,7 @@ export function configureStore(initialState?: Partial) {
provisioningAPIv0alpha1.middleware,
folderAPIv1beta1.middleware,
advisorAPIv0alpha1.middleware,
+ dashboardAPIv0alpha1.middleware,
// PLOP_INJECT_MIDDLEWARE
// Used by the API client generator
...extraMiddleware
diff --git a/public/img/icons/unicons/filter-minus.svg b/public/img/icons/unicons/filter-minus.svg
new file mode 100644
index 00000000000..bf7dd01335b
--- /dev/null
+++ b/public/img/icons/unicons/filter-minus.svg
@@ -0,0 +1 @@
+
diff --git a/public/img/icons/unicons/filter-plus.svg b/public/img/icons/unicons/filter-plus.svg
new file mode 100644
index 00000000000..f3180a757e0
--- /dev/null
+++ b/public/img/icons/unicons/filter-plus.svg
@@ -0,0 +1 @@
+
diff --git a/public/locales/cs-CZ/grafana.json b/public/locales/cs-CZ/grafana.json
index 308c5ba4955..0323e8320c7 100644
--- a/public/locales/cs-CZ/grafana.json
+++ b/public/locales/cs-CZ/grafana.json
@@ -3601,12 +3601,12 @@
"tags-column": "Tagy"
},
"delete-provisioned-folder-form": {
- "alert-folder-deleted-successfully": "Složka byla úspěšně odstraněna",
"api-error": "Složku se nepodařilo odstranit",
"button-cancel": "Zrušit",
"button-delete": "Odstranit",
"button-deleting": "Probíhá odstraňování…",
- "delete-warning": "Tímto odstraníte tuto složku a všechny následné složky. Celkově to ovlivní:"
+ "delete-warning": "Tímto odstraníte tuto složku a všechny následné složky. Celkově to ovlivní:",
+ "success-message": ""
},
"descendant-count": {
"title-unable-to-retrieve-descendant-information": "Nelze načíst informace o následovníkovi"
@@ -3649,7 +3649,6 @@
},
"new-provisioned-folder-form": {
"alert-error-creating-folder": "Chyba při vytváření složky",
- "alert-folder-created-successfully": "Složka úspěšně vytvořena",
"button-create": "Vytvořit",
"button-creating": "Vytváření…",
"cancel": "Zrušit",
@@ -3797,7 +3796,6 @@
}
},
"description-experimental-types": "Povolit výběr experimentálních typů prvků",
- "description-infinite-panning": "Povolit nekonečné posouvání – užitečné pro rozsáhlá plátna. Upozornění: Jedná se o experimentální funkci, která v současné době funguje pouze s prvky, které jsou omezeny nahoře/vlevo",
"description-inline-editing": "Povolit přímé úpravy panelu",
"description-pan-zoom": "Povolit posouvání a přiblížení",
"direction-options": {
@@ -3898,7 +3896,6 @@
"name-align-text": "Zarovnat text",
"name-color": "Barva textu",
"name-experimental-types": "Experimentální typy prvků",
- "name-infinite-panning": "Nekonečné posouvání",
"name-inline-editing": "Přímé upravování",
"name-pan-zoom": "Posouvání a přiblížení",
"name-text": "Text",
@@ -5685,6 +5682,7 @@
"delete-read-only-file-message": "Tuto nástěnku nelze odstranit přímo z Grafany, protože úložiště je pouze pro čtení. Chcete-li tuto nástěnku odstranit, odeberte soubor z úložiště Git.",
"deleting": "Probíhá odstranění…",
"drawer-title": "Odstranit zajištěnou nástěnku",
+ "success-message": "",
"title-this-repository-is-read-only": "Toto úložiště je jen pro čtení"
},
"description-label": {
@@ -5697,9 +5695,6 @@
}
}
},
- "edit-provisioned-dashboard-form": {
- "success": "Změny na nástěnce úspěšně uloženy"
- },
"email-list": {
"aria-label-emailmenu": "Přepnout e-mailovou nabídku"
},
@@ -5860,6 +5855,7 @@
"usage-count_other": "Použito na {{count}} nástěnkách"
},
"move-provisioned-dashboard-form": {
+ "alert-error-moving-dashboard": "",
"api-error": "",
"cancel-action": "",
"current-file-not-found": "",
@@ -5869,6 +5865,7 @@
"move-action": "",
"move-read-only-message": "",
"moving": "",
+ "success-message": "",
"target-path-label": "",
"title-this-repository-is-read-only": ""
},
@@ -9425,6 +9422,15 @@
"show-more": "zobrazit více",
"tooltip-error": "Chyba: {{errorMessage}}"
},
+ "log-line-context": {
+ "center-matched-line": "",
+ "newer-logs": "",
+ "no-more-logs-available": "",
+ "older-logs": "",
+ "open-in-split-view": "",
+ "title-log-context": "",
+ "title-log-line": ""
+ },
"log-line-details": {
"clear-search": "Vymazat",
"close": "Zavřít podrobnosti protokolu",
@@ -11081,6 +11087,9 @@
"title-created-branch-in-repo": "",
"title-loaded-pull-request-in-repo": ""
},
+ "provisioned-resource-request-handler": "",
+ "provisioned-resource-request-handler-dashboard": "",
+ "provisioned-resource-request-handler-folder": "",
"provisioning": {
"banner": {
"message": "Tato funkce je v současné době v aktivním vývoji. Pro nejlepší zážitek a nejnovější vylepšení doporučujeme použít <2>noční sestavení2> Grafany."
@@ -11954,7 +11963,7 @@
"recommended": "Doporučeno",
"results": "Výsledky"
},
- "search": "Hledat"
+ "search": ""
}
},
"search": {
@@ -12595,6 +12604,19 @@
"label-medium": "Střední",
"label-small": "Malé"
},
+ "cell-types": {
+ "actions": "",
+ "auto": "",
+ "color-background": "",
+ "color-text": "",
+ "data-links": "",
+ "gauge": "",
+ "image": "",
+ "json": "",
+ "markdown": "",
+ "pill": "",
+ "sparkline": ""
+ },
"color-background-cell-options-editor": {
"description-apply-to-entire-row": "Pokud je vybrán, celý řádek bude barevný jako tato buňka.",
"description-wrap-text": "Pokud bude vybraný text zabalen na šířku textu v nakonfigurovaném sloupci",
@@ -12629,6 +12651,13 @@
"label-alt-text": "Alternativní text",
"label-title-text": "Text názvu"
},
+ "markdown-cell-options-editor": {
+ "description-dynamic-height": "",
+ "label": {
+ "text-alpha": ""
+ },
+ "label-dynamic-height": ""
+ },
"name-calculation": "Výpočet",
"name-cell-height": "Výška buňky",
"name-cell-type": "Typ buňky",
@@ -12645,7 +12674,10 @@
"name-show-table-header": "Zobrazit záhlaví tabulky",
"name-wrap-header-text": "Zalomit text záhlaví",
"placeholder-column-width": "auto.",
- "placeholder-fields": "Všechna číselná pole"
+ "placeholder-fields": "Všechna číselná pole",
+ "text-wrap-options": {
+ "label-wrap-text": ""
+ }
},
"table-new": {
"category-cell-options": "Možnosti buněk",
@@ -13360,22 +13392,6 @@
"label-row": "Řádek",
"name": {
"grouping-to-matrix": ""
- },
- "special-value-options": {
- "description": {
- "boolean-false-value": "Booleovská nepravdivá hodnota",
- "boolean-true-value": "Booleovská pravdivá hodnota",
- "empty-string": "Prázdný řetězec",
- "null-value": "Nulová hodnota",
- "number-value": "Hodnota číslo 0"
- },
- "label": {
- "empty": "Prázdný",
- "false": "Nepravda",
- "null": "Prázdný",
- "true": "Pravda",
- "zero": "Nula"
- }
}
},
"histogram-transformer-editor": {
@@ -13728,6 +13744,22 @@
"perform-spatial-operations": "",
"reformat": "",
"reorder-and-rename": ""
+ },
+ "special-value-options": {
+ "description": {
+ "boolean-false": "",
+ "boolean-true": "",
+ "empty-string": "",
+ "null-value": "",
+ "number-value": ""
+ },
+ "label": {
+ "boolean-false": "",
+ "boolean-true": "",
+ "empty-string": "",
+ "null-value": "",
+ "number-value": ""
+ }
}
},
"wide-info": {
diff --git a/public/locales/de-DE/grafana.json b/public/locales/de-DE/grafana.json
index c583a7bc4f0..4c27b0c27fc 100644
--- a/public/locales/de-DE/grafana.json
+++ b/public/locales/de-DE/grafana.json
@@ -3563,12 +3563,12 @@
"tags-column": "Tags"
},
"delete-provisioned-folder-form": {
- "alert-folder-deleted-successfully": "Ordner erfolgreich gelöscht",
"api-error": "Ordner konnte nicht gelöscht werden",
"button-cancel": "Abbrechen",
"button-delete": "Löschen",
"button-deleting": "Wird gelöscht …",
- "delete-warning": "Dadurch werden dieser und alle untergeordneten Ordner gelöscht. Insgesamt betrifft dies:"
+ "delete-warning": "Dadurch werden dieser und alle untergeordneten Ordner gelöscht. Insgesamt betrifft dies:",
+ "success-message": ""
},
"descendant-count": {
"title-unable-to-retrieve-descendant-information": "Nachfolgerinformationen können nicht abgerufen werden"
@@ -3611,7 +3611,6 @@
},
"new-provisioned-folder-form": {
"alert-error-creating-folder": "Fehler beim Erstellen des Ordners",
- "alert-folder-created-successfully": "Der Ordner wurde erfolgreich erstellt",
"button-create": "Erstellen",
"button-creating": "Wird erstellt ...",
"cancel": "Abbrechen",
@@ -3759,7 +3758,6 @@
}
},
"description-experimental-types": "Auswahl experimenteller Elementtypen aktivieren",
- "description-infinite-panning": "Unbegrenztes Schwenken aktivieren – nützlich für umfangreiche Leinwände. Warnung: Dies ist eine experimentelle Funktion und funktioniert momentan nur mit Elementen gut, die oben/links eingeschränkt sind",
"description-inline-editing": "Direkte Bearbeitung des Panels aktivieren",
"description-pan-zoom": "Schwenken und Zoomen aktivieren",
"direction-options": {
@@ -3860,7 +3858,6 @@
"name-align-text": "Text ausrichten",
"name-color": "Textfarbe",
"name-experimental-types": "Experimentelle Elementtypen",
- "name-infinite-panning": "Unbegrenztes Schwenken",
"name-inline-editing": "Inline-Bearbeitung",
"name-pan-zoom": "Schwenken und Zoomen",
"name-text": "Text",
@@ -5645,6 +5642,7 @@
"delete-read-only-file-message": "Dieses Dashboard kann nicht direkt von Grafana aus gelöscht werden, da das Repository schreibgeschützt ist. Um dieses Dashboard zu löschen, entfernen Sie bitte die Datei aus Ihrem Git-Repository.",
"deleting": "Löschen...",
"drawer-title": "Bereitgestelltes Dashboard löschen",
+ "success-message": "",
"title-this-repository-is-read-only": "Dieses Repository ist schreibgeschützt"
},
"description-label": {
@@ -5657,9 +5655,6 @@
}
}
},
- "edit-provisioned-dashboard-form": {
- "success": "Dashboard-Änderungen erfolgreich gespeichert"
- },
"email-list": {
"aria-label-emailmenu": "E-Mail-Menü umschalten"
},
@@ -5818,6 +5813,7 @@
"usage-count_other": "Verwendet bei {{count}} Dashboards"
},
"move-provisioned-dashboard-form": {
+ "alert-error-moving-dashboard": "",
"api-error": "",
"cancel-action": "",
"current-file-not-found": "",
@@ -5827,6 +5823,7 @@
"move-action": "",
"move-read-only-message": "",
"moving": "",
+ "success-message": "",
"target-path-label": "",
"title-this-repository-is-read-only": ""
},
@@ -9365,6 +9362,15 @@
"show-more": "mehr anzeigen",
"tooltip-error": "Fehler: {{errorMessage}}"
},
+ "log-line-context": {
+ "center-matched-line": "",
+ "newer-logs": "",
+ "no-more-logs-available": "",
+ "older-logs": "",
+ "open-in-split-view": "",
+ "title-log-context": "",
+ "title-log-line": ""
+ },
"log-line-details": {
"clear-search": "Löschen",
"close": "Logdetails schließen",
@@ -11015,6 +11021,9 @@
"title-created-branch-in-repo": "",
"title-loaded-pull-request-in-repo": ""
},
+ "provisioned-resource-request-handler": "",
+ "provisioned-resource-request-handler-dashboard": "",
+ "provisioned-resource-request-handler-folder": "",
"provisioning": {
"banner": {
"message": "Diese Funktion befindet sich momentan in der aktiven Entwicklung. Für die bestmögliche Nutzererfahrung und die neuesten Verbesserungen empfehlen wir die Nutzung von <2>Nightly Build2> von Grafana."
@@ -11874,7 +11883,7 @@
"recommended": "Empfohlen",
"results": "Ergebnisse"
},
- "search": "Suche"
+ "search": ""
}
},
"search": {
@@ -12511,6 +12520,19 @@
"label-medium": "Mittel",
"label-small": "Klein"
},
+ "cell-types": {
+ "actions": "",
+ "auto": "",
+ "color-background": "",
+ "color-text": "",
+ "data-links": "",
+ "gauge": "",
+ "image": "",
+ "json": "",
+ "markdown": "",
+ "pill": "",
+ "sparkline": ""
+ },
"color-background-cell-options-editor": {
"description-apply-to-entire-row": "Wenn dies ausgewählt ist, wird die gesamte Zeile so eingefärbt, wie es diese Zelle wäre.",
"description-wrap-text": "Wenn dies ausgewählt ist, wird der Text auf die Breite des Textes in der konfigurierten Spalte umgebrochen",
@@ -12545,6 +12567,13 @@
"label-alt-text": "Alt-Text",
"label-title-text": "Titeltext"
},
+ "markdown-cell-options-editor": {
+ "description-dynamic-height": "",
+ "label": {
+ "text-alpha": ""
+ },
+ "label-dynamic-height": ""
+ },
"name-calculation": "Berechnung",
"name-cell-height": "Zellenhöhe",
"name-cell-type": "Zellentyp",
@@ -12561,7 +12590,10 @@
"name-show-table-header": "Tabellenüberschirft anzeigen",
"name-wrap-header-text": "Kopfzeilentext umbrechen",
"placeholder-column-width": "auto",
- "placeholder-fields": "Alle numerischen Felder"
+ "placeholder-fields": "Alle numerischen Felder",
+ "text-wrap-options": {
+ "label-wrap-text": ""
+ }
},
"table-new": {
"category-cell-options": "Zellenoptionen",
@@ -13276,22 +13308,6 @@
"label-row": "Zeile",
"name": {
"grouping-to-matrix": ""
- },
- "special-value-options": {
- "description": {
- "boolean-false-value": "Boolescher falscher Wert",
- "boolean-true-value": "Boolescher wahrer Wert",
- "empty-string": "Leerer String",
- "null-value": "Nullwert",
- "number-value": "Wert Zahl 0"
- },
- "label": {
- "empty": "Leer",
- "false": "Falsch",
- "null": "Null",
- "true": "Richtig",
- "zero": "Zero"
- }
}
},
"histogram-transformer-editor": {
@@ -13644,6 +13660,22 @@
"perform-spatial-operations": "",
"reformat": "",
"reorder-and-rename": ""
+ },
+ "special-value-options": {
+ "description": {
+ "boolean-false": "",
+ "boolean-true": "",
+ "empty-string": "",
+ "null-value": "",
+ "number-value": ""
+ },
+ "label": {
+ "boolean-false": "",
+ "boolean-true": "",
+ "empty-string": "",
+ "null-value": "",
+ "number-value": ""
+ }
}
},
"wide-info": {
diff --git a/public/locales/en-US/grafana.json b/public/locales/en-US/grafana.json
index c0061d4b664..712be513def 100644
--- a/public/locales/en-US/grafana.json
+++ b/public/locales/en-US/grafana.json
@@ -9362,6 +9362,15 @@
"show-more": "show more",
"tooltip-error": "Error: {{errorMessage}}"
},
+ "log-line-context": {
+ "center-matched-line": "Center matched line",
+ "newer-logs": "newer",
+ "no-more-logs-available": "No more logs available.",
+ "older-logs": "older",
+ "open-in-split-view": "Open in split view",
+ "title-log-context": "Log context",
+ "title-log-line": "Referenced log line"
+ },
"log-line-details": {
"clear-search": "Clear",
"close": "Close log details",
@@ -12520,6 +12529,7 @@
"gauge": "Gauge",
"image": "Image",
"json": "JSON View",
+ "markdown": "Markdown + HTML",
"pill": "Pill",
"sparkline": "Sparkline"
},
@@ -12557,6 +12567,13 @@
"label-alt-text": "Alt text",
"label-title-text": "Title text"
},
+ "markdown-cell-options-editor": {
+ "description-dynamic-height": "We recommend enabling pagination with this option to avoid performance issues.",
+ "label": {
+ "text-alpha": "Alpha"
+ },
+ "label-dynamic-height": "Dynamic height"
+ },
"name-calculation": "Calculation",
"name-cell-height": "Cell height",
"name-cell-type": "Cell type",
@@ -12573,7 +12590,10 @@
"name-show-table-header": "Show table header",
"name-wrap-header-text": "Wrap header text",
"placeholder-column-width": "auto",
- "placeholder-fields": "All Numeric Fields"
+ "placeholder-fields": "All Numeric Fields",
+ "text-wrap-options": {
+ "label-wrap-text": "Wrap text"
+ }
},
"table-new": {
"category-cell-options": "Cell options",
@@ -13288,22 +13308,6 @@
"label-row": "Row",
"name": {
"grouping-to-matrix": "Grouping to matrix"
- },
- "special-value-options": {
- "description": {
- "boolean-false-value": "Boolean false value",
- "boolean-true-value": "Boolean true value",
- "empty-string": "Empty string",
- "null-value": "Null value",
- "number-value": "Number 0 value"
- },
- "label": {
- "empty": "Empty",
- "false": "False",
- "null": "Null",
- "true": "True",
- "zero": "Zero"
- }
}
},
"histogram-transformer-editor": {
@@ -13656,6 +13660,22 @@
"perform-spatial-operations": "Perform spatial operations",
"reformat": "Reformat",
"reorder-and-rename": "Reorder and rename"
+ },
+ "special-value-options": {
+ "description": {
+ "boolean-false": "Boolean false value",
+ "boolean-true": "Boolean true value",
+ "empty-string": "Empty String",
+ "null-value": "Null value",
+ "number-value": "Number 0 value"
+ },
+ "label": {
+ "boolean-false": "False",
+ "boolean-true": "True",
+ "empty-string": "Empty",
+ "null-value": "Null",
+ "number-value": "Zero"
+ }
}
},
"wide-info": {
diff --git a/public/locales/es-ES/grafana.json b/public/locales/es-ES/grafana.json
index dacff308cb7..e5edd437805 100644
--- a/public/locales/es-ES/grafana.json
+++ b/public/locales/es-ES/grafana.json
@@ -3563,12 +3563,12 @@
"tags-column": "Etiquetas"
},
"delete-provisioned-folder-form": {
- "alert-folder-deleted-successfully": "",
"api-error": "",
"button-cancel": "",
"button-delete": "",
"button-deleting": "",
- "delete-warning": ""
+ "delete-warning": "",
+ "success-message": ""
},
"descendant-count": {
"title-unable-to-retrieve-descendant-information": "No se puede recuperar la información descendiente"
@@ -3611,7 +3611,6 @@
},
"new-provisioned-folder-form": {
"alert-error-creating-folder": "Error al crear la carpeta",
- "alert-folder-created-successfully": "Carpeta creada correctamente",
"button-create": "Crear",
"button-creating": "Creando...",
"cancel": "Cancelar",
@@ -3759,7 +3758,6 @@
}
},
"description-experimental-types": "",
- "description-infinite-panning": "",
"description-inline-editing": "",
"description-pan-zoom": "",
"direction-options": {
@@ -3860,7 +3858,6 @@
"name-align-text": "",
"name-color": "",
"name-experimental-types": "",
- "name-infinite-panning": "",
"name-inline-editing": "",
"name-pan-zoom": "",
"name-text": "",
@@ -5645,6 +5642,7 @@
"delete-read-only-file-message": "",
"deleting": "Eliminando...",
"drawer-title": "",
+ "success-message": "",
"title-this-repository-is-read-only": "Este repositorio es de solo lectura"
},
"description-label": {
@@ -5657,9 +5655,6 @@
}
}
},
- "edit-provisioned-dashboard-form": {
- "success": ""
- },
"email-list": {
"aria-label-emailmenu": "Alternar menú de correo electrónico"
},
@@ -5818,6 +5813,7 @@
"usage-count_other": "Utilizado en {{count}} dashboards"
},
"move-provisioned-dashboard-form": {
+ "alert-error-moving-dashboard": "",
"api-error": "",
"cancel-action": "",
"current-file-not-found": "",
@@ -5827,6 +5823,7 @@
"move-action": "",
"move-read-only-message": "",
"moving": "",
+ "success-message": "",
"target-path-label": "",
"title-this-repository-is-read-only": ""
},
@@ -9365,6 +9362,15 @@
"show-more": "mostrar más",
"tooltip-error": "Error: {{errorMessage}}"
},
+ "log-line-context": {
+ "center-matched-line": "",
+ "newer-logs": "",
+ "no-more-logs-available": "",
+ "older-logs": "",
+ "open-in-split-view": "",
+ "title-log-context": "",
+ "title-log-line": ""
+ },
"log-line-details": {
"clear-search": "",
"close": "",
@@ -11015,6 +11021,9 @@
"title-created-branch-in-repo": "",
"title-loaded-pull-request-in-repo": ""
},
+ "provisioned-resource-request-handler": "",
+ "provisioned-resource-request-handler-dashboard": "",
+ "provisioned-resource-request-handler-folder": "",
"provisioning": {
"banner": {
"message": "Esta función se encuentra actualmente en desarrollo activo. Para obtener la mejor experiencia y las últimas mejoras, recomendamos utilizar la <2>compilación nocturna2> de Grafana."
@@ -11874,7 +11883,7 @@
"recommended": "Recomendado",
"results": "Resultados"
},
- "search": "Buscar"
+ "search": ""
}
},
"search": {
@@ -12511,6 +12520,19 @@
"label-medium": "",
"label-small": ""
},
+ "cell-types": {
+ "actions": "",
+ "auto": "",
+ "color-background": "",
+ "color-text": "",
+ "data-links": "",
+ "gauge": "",
+ "image": "",
+ "json": "",
+ "markdown": "",
+ "pill": "",
+ "sparkline": ""
+ },
"color-background-cell-options-editor": {
"description-apply-to-entire-row": "Si se selecciona, toda la fila se coloreará como esta celda.",
"description-wrap-text": "Si se selecciona, el texto se ajustará al ancho del texto en la columna configurada",
@@ -12545,6 +12567,13 @@
"label-alt-text": "Texto alternativo",
"label-title-text": "Texto del título"
},
+ "markdown-cell-options-editor": {
+ "description-dynamic-height": "",
+ "label": {
+ "text-alpha": ""
+ },
+ "label-dynamic-height": ""
+ },
"name-calculation": "",
"name-cell-height": "",
"name-cell-type": "",
@@ -12561,7 +12590,10 @@
"name-show-table-header": "",
"name-wrap-header-text": "",
"placeholder-column-width": "",
- "placeholder-fields": ""
+ "placeholder-fields": "",
+ "text-wrap-options": {
+ "label-wrap-text": ""
+ }
},
"table-new": {
"category-cell-options": "",
@@ -13276,22 +13308,6 @@
"label-row": "Fila",
"name": {
"grouping-to-matrix": ""
- },
- "special-value-options": {
- "description": {
- "boolean-false-value": "Valor booleano falso",
- "boolean-true-value": "Valor booleano verdadero",
- "empty-string": "Cadena vacía",
- "null-value": "Valor nulo",
- "number-value": "Valor del número 0"
- },
- "label": {
- "empty": "Vacío",
- "false": "Falso",
- "null": "Nulo",
- "true": "Verdadero",
- "zero": "Cero"
- }
}
},
"histogram-transformer-editor": {
@@ -13644,6 +13660,22 @@
"perform-spatial-operations": "",
"reformat": "",
"reorder-and-rename": ""
+ },
+ "special-value-options": {
+ "description": {
+ "boolean-false": "",
+ "boolean-true": "",
+ "empty-string": "",
+ "null-value": "",
+ "number-value": ""
+ },
+ "label": {
+ "boolean-false": "",
+ "boolean-true": "",
+ "empty-string": "",
+ "null-value": "",
+ "number-value": ""
+ }
}
},
"wide-info": {
diff --git a/public/locales/fr-FR/grafana.json b/public/locales/fr-FR/grafana.json
index 2485164635d..1c5eeeb7588 100644
--- a/public/locales/fr-FR/grafana.json
+++ b/public/locales/fr-FR/grafana.json
@@ -3563,12 +3563,12 @@
"tags-column": "Balises"
},
"delete-provisioned-folder-form": {
- "alert-folder-deleted-successfully": "Dossier supprimé avec succès",
"api-error": "Échec de la suppression du dossier",
"button-cancel": "Annuler",
"button-delete": "Supprimer",
"button-deleting": "Suppression en cours…",
- "delete-warning": "Cette opération supprimera ce dossier ainsi que tous ses éléments enfants. Au total, cela concernera :"
+ "delete-warning": "Cette opération supprimera ce dossier ainsi que tous ses éléments enfants. Au total, cela concernera :",
+ "success-message": ""
},
"descendant-count": {
"title-unable-to-retrieve-descendant-information": "Impossible de récupérer les informations descendantes"
@@ -3611,7 +3611,6 @@
},
"new-provisioned-folder-form": {
"alert-error-creating-folder": "Erreur de création du dossier",
- "alert-folder-created-successfully": "Le dossier a bien été créé",
"button-create": "Créer",
"button-creating": "Création...",
"cancel": "Annuler",
@@ -3759,7 +3758,6 @@
}
},
"description-experimental-types": "Activer la sélection de types d’éléments expérimentaux",
- "description-infinite-panning": "Activez le panoramique infini, utile pour les canvas étendus. Avertissement : il s’agit d’une fonctionnalité expérimentale qui ne fonctionne actuellement bien qu’avec des éléments contraints en haut/à gauche",
"description-inline-editing": "Activer la modification directe du panneau",
"description-pan-zoom": "Activer le zoom et le déplacement",
"direction-options": {
@@ -3860,7 +3858,6 @@
"name-align-text": "Alignement du texte",
"name-color": "Couleur du texte",
"name-experimental-types": "Types d’éléments expérimentaux",
- "name-infinite-panning": "Panoramique infini",
"name-inline-editing": "Édition en ligne",
"name-pan-zoom": "Zoom et déplacement",
"name-text": "Texte",
@@ -5645,6 +5642,7 @@
"delete-read-only-file-message": "Ce tableau de bord ne peut pas être supprimé directement depuis Grafana, car le dépôt est en lecture seule. Pour le supprimer, veuillez retirer le fichier de votre dépôt Git.",
"deleting": "Suppression…",
"drawer-title": "Supprimer le tableau de bord provisionné",
+ "success-message": "",
"title-this-repository-is-read-only": "Ce référentiel est en lecture seule"
},
"description-label": {
@@ -5657,9 +5655,6 @@
}
}
},
- "edit-provisioned-dashboard-form": {
- "success": "Modifications du tableau de bord enregistrées avec succès"
- },
"email-list": {
"aria-label-emailmenu": "Basculer vers le menu des e-mails"
},
@@ -5818,6 +5813,7 @@
"usage-count_other": "Utilisé sur {{count}} tableaux de bord"
},
"move-provisioned-dashboard-form": {
+ "alert-error-moving-dashboard": "",
"api-error": "",
"cancel-action": "",
"current-file-not-found": "",
@@ -5827,6 +5823,7 @@
"move-action": "",
"move-read-only-message": "",
"moving": "",
+ "success-message": "",
"target-path-label": "",
"title-this-repository-is-read-only": ""
},
@@ -9365,6 +9362,15 @@
"show-more": "afficher plus",
"tooltip-error": "Erreur : {{errorMessage}}"
},
+ "log-line-context": {
+ "center-matched-line": "",
+ "newer-logs": "",
+ "no-more-logs-available": "",
+ "older-logs": "",
+ "open-in-split-view": "",
+ "title-log-context": "",
+ "title-log-line": ""
+ },
"log-line-details": {
"clear-search": "Effacer",
"close": "Fermer les détails du log",
@@ -11015,6 +11021,9 @@
"title-created-branch-in-repo": "",
"title-loaded-pull-request-in-repo": ""
},
+ "provisioned-resource-request-handler": "",
+ "provisioned-resource-request-handler-dashboard": "",
+ "provisioned-resource-request-handler-folder": "",
"provisioning": {
"banner": {
"message": "Cette fonctionnalité est actuellement en cours de développement. Pour une expérience optimale et les dernières améliorations, nous vous recommandons d’utiliser la <2>compilation nocturne2> de Grafana."
@@ -11874,7 +11883,7 @@
"recommended": "Recommandé",
"results": "Résultats"
},
- "search": "Rechercher"
+ "search": ""
}
},
"search": {
@@ -12511,6 +12520,19 @@
"label-medium": "Moyen",
"label-small": "Petit"
},
+ "cell-types": {
+ "actions": "",
+ "auto": "",
+ "color-background": "",
+ "color-text": "",
+ "data-links": "",
+ "gauge": "",
+ "image": "",
+ "json": "",
+ "markdown": "",
+ "pill": "",
+ "sparkline": ""
+ },
"color-background-cell-options-editor": {
"description-apply-to-entire-row": "Si cette option est sélectionnée, toute la ligne sera colorée comme cette cellule.",
"description-wrap-text": "Si le texte sélectionné sera ajusté à la largeur du texte dans la colonne configurée",
@@ -12545,6 +12567,13 @@
"label-alt-text": "Texte alternatif",
"label-title-text": "Texte du titre"
},
+ "markdown-cell-options-editor": {
+ "description-dynamic-height": "",
+ "label": {
+ "text-alpha": ""
+ },
+ "label-dynamic-height": ""
+ },
"name-calculation": "Calcul",
"name-cell-height": "Hauteur de cellule",
"name-cell-type": "Type de cellule",
@@ -12561,7 +12590,10 @@
"name-show-table-header": "Afficher l’en-tête du tableau",
"name-wrap-header-text": "Retour à la ligne dans l’en-tête",
"placeholder-column-width": "auto",
- "placeholder-fields": "Tous les champs numériques"
+ "placeholder-fields": "Tous les champs numériques",
+ "text-wrap-options": {
+ "label-wrap-text": ""
+ }
},
"table-new": {
"category-cell-options": "Options de cellule",
@@ -13276,22 +13308,6 @@
"label-row": "Ligne",
"name": {
"grouping-to-matrix": ""
- },
- "special-value-options": {
- "description": {
- "boolean-false-value": "Valeur booléenne fausse",
- "boolean-true-value": "Valeur booléenne vraie",
- "empty-string": "Chaîne vide",
- "null-value": "Valeur nulle",
- "number-value": "Valeur du nombre 0"
- },
- "label": {
- "empty": "Vide",
- "false": "Faux",
- "null": "Nul",
- "true": "Vrai",
- "zero": "Zéro"
- }
}
},
"histogram-transformer-editor": {
@@ -13644,6 +13660,22 @@
"perform-spatial-operations": "",
"reformat": "",
"reorder-and-rename": ""
+ },
+ "special-value-options": {
+ "description": {
+ "boolean-false": "",
+ "boolean-true": "",
+ "empty-string": "",
+ "null-value": "",
+ "number-value": ""
+ },
+ "label": {
+ "boolean-false": "",
+ "boolean-true": "",
+ "empty-string": "",
+ "null-value": "",
+ "number-value": ""
+ }
}
},
"wide-info": {
diff --git a/public/locales/hu-HU/grafana.json b/public/locales/hu-HU/grafana.json
index 5e9f8acb6d0..ff457ccc3a2 100644
--- a/public/locales/hu-HU/grafana.json
+++ b/public/locales/hu-HU/grafana.json
@@ -3563,12 +3563,12 @@
"tags-column": "Címkék"
},
"delete-provisioned-folder-form": {
- "alert-folder-deleted-successfully": "A mappa törlése sikeres",
"api-error": "A mappa törlése nem sikerült",
"button-cancel": "Mégse",
"button-delete": "Törlés",
"button-deleting": "Törlés...",
- "delete-warning": "Ez törli ezt a mappát és minden almappáját. Összességében ez a következőket érinti:"
+ "delete-warning": "Ez törli ezt a mappát és minden almappáját. Összességében ez a következőket érinti:",
+ "success-message": ""
},
"descendant-count": {
"title-unable-to-retrieve-descendant-information": "Nem lehet lekérni a leszármazott adatokat"
@@ -3611,7 +3611,6 @@
},
"new-provisioned-folder-form": {
"alert-error-creating-folder": "Hiba történt a mappa létrehozása közben",
- "alert-folder-created-successfully": "A mappa létrehozása sikerült",
"button-create": "Létrehozás",
"button-creating": "Létrehozás…",
"cancel": "Mégse",
@@ -3759,7 +3758,6 @@
}
},
"description-experimental-types": "Kísérleti elemtípusok kiválasztásának engedélyezése",
- "description-infinite-panning": "Végtelen pásztázás engedélyezése – hasznos a tágas vásznakhoz. Figyelem: ez egy kísérleti funkció, és jelenleg csak a felül/bal oldalon korlátozott elemekkel működik jól",
"description-inline-editing": "A panel közvetlen szerkesztésének engedélyezése",
"description-pan-zoom": "Pásztázás és nagyítás engedélyezése",
"direction-options": {
@@ -3860,7 +3858,6 @@
"name-align-text": "Szöveg igazítása",
"name-color": "Szöveg színe",
"name-experimental-types": "Kísérleti elemtípusok",
- "name-infinite-panning": "Végtelen pásztázás",
"name-inline-editing": "Beágyazott szerkesztés",
"name-pan-zoom": "Pásztázás és nagyítás",
"name-text": "Szöveg",
@@ -5645,6 +5642,7 @@
"delete-read-only-file-message": "Ez az irányítópult nem törölhető közvetlenül a Grafanából, mert az adattár csak olvasható. Az irányítópult törléséhez távolítsa el a fájlt a Git-tárból.",
"deleting": "Törlés...",
"drawer-title": "Kiépített irányítópult törlése",
+ "success-message": "",
"title-this-repository-is-read-only": "Ez az adattár csak olvasható"
},
"description-label": {
@@ -5657,9 +5655,6 @@
}
}
},
- "edit-provisioned-dashboard-form": {
- "success": "Irányítópult-módosítások mentése sikeres"
- },
"email-list": {
"aria-label-emailmenu": "E-mail-menü ki- és bekapcsolása"
},
@@ -5818,6 +5813,7 @@
"usage-count_other": "{{count}} irányítópulton használatos"
},
"move-provisioned-dashboard-form": {
+ "alert-error-moving-dashboard": "",
"api-error": "",
"cancel-action": "",
"current-file-not-found": "",
@@ -5827,6 +5823,7 @@
"move-action": "",
"move-read-only-message": "",
"moving": "",
+ "success-message": "",
"target-path-label": "",
"title-this-repository-is-read-only": ""
},
@@ -9365,6 +9362,15 @@
"show-more": "több megjelenítése",
"tooltip-error": "Hiba: {{errorMessage}}"
},
+ "log-line-context": {
+ "center-matched-line": "",
+ "newer-logs": "",
+ "no-more-logs-available": "",
+ "older-logs": "",
+ "open-in-split-view": "",
+ "title-log-context": "",
+ "title-log-line": ""
+ },
"log-line-details": {
"clear-search": "Törlés",
"close": "Napló részleteinek bezárása",
@@ -11015,6 +11021,9 @@
"title-created-branch-in-repo": "",
"title-loaded-pull-request-in-repo": ""
},
+ "provisioned-resource-request-handler": "",
+ "provisioned-resource-request-handler-dashboard": "",
+ "provisioned-resource-request-handler-folder": "",
"provisioning": {
"banner": {
"message": "Ez a funkció jelenleg aktív fejlesztés alatt áll. A legjobb élmény és a legújabb fejlesztések érdekében javasoljuk a Grafana <2>éjszakai buildjének2> használatát."
@@ -11874,7 +11883,7 @@
"recommended": "Ajánlott",
"results": "Eredmények"
},
- "search": "Keresés"
+ "search": ""
}
},
"search": {
@@ -12511,6 +12520,19 @@
"label-medium": "Közepes",
"label-small": "Kicsi"
},
+ "cell-types": {
+ "actions": "",
+ "auto": "",
+ "color-background": "",
+ "color-text": "",
+ "data-links": "",
+ "gauge": "",
+ "image": "",
+ "json": "",
+ "markdown": "",
+ "pill": "",
+ "sparkline": ""
+ },
"color-background-cell-options-editor": {
"description-apply-to-entire-row": "Ha ki van választva, a teljes sor olyan színű lesz, mint ez a cella.",
"description-wrap-text": "Ha ki van választva, a szöveg a konfigurált oszlop szövegének szélességéhez lesz tördelve",
@@ -12545,6 +12567,13 @@
"label-alt-text": "Helyettesítő szöveg",
"label-title-text": "Cím szövege"
},
+ "markdown-cell-options-editor": {
+ "description-dynamic-height": "",
+ "label": {
+ "text-alpha": ""
+ },
+ "label-dynamic-height": ""
+ },
"name-calculation": "Számítás",
"name-cell-height": "Cellamagasság",
"name-cell-type": "Cellatípus",
@@ -12561,7 +12590,10 @@
"name-show-table-header": "Táblázatfejléc megjelenítése",
"name-wrap-header-text": "Fejléc szövegének tördelése",
"placeholder-column-width": "automatikus",
- "placeholder-fields": "Numerikus mezők"
+ "placeholder-fields": "Numerikus mezők",
+ "text-wrap-options": {
+ "label-wrap-text": ""
+ }
},
"table-new": {
"category-cell-options": "Cellabeállítások",
@@ -13276,22 +13308,6 @@
"label-row": "Sor",
"name": {
"grouping-to-matrix": ""
- },
- "special-value-options": {
- "description": {
- "boolean-false-value": "Logikai hamis érték",
- "boolean-true-value": "Logikai igaz érték",
- "empty-string": "Üres karakterlánc",
- "null-value": "Nullérték",
- "number-value": "0 számérték"
- },
- "label": {
- "empty": "Üres",
- "false": "Hamis",
- "null": "Null",
- "true": "Igaz",
- "zero": "Nulla"
- }
}
},
"histogram-transformer-editor": {
@@ -13644,6 +13660,22 @@
"perform-spatial-operations": "",
"reformat": "",
"reorder-and-rename": ""
+ },
+ "special-value-options": {
+ "description": {
+ "boolean-false": "",
+ "boolean-true": "",
+ "empty-string": "",
+ "null-value": "",
+ "number-value": ""
+ },
+ "label": {
+ "boolean-false": "",
+ "boolean-true": "",
+ "empty-string": "",
+ "null-value": "",
+ "number-value": ""
+ }
}
},
"wide-info": {
diff --git a/public/locales/id-ID/grafana.json b/public/locales/id-ID/grafana.json
index ee7e3db48e3..595c849caac 100644
--- a/public/locales/id-ID/grafana.json
+++ b/public/locales/id-ID/grafana.json
@@ -3544,12 +3544,12 @@
"tags-column": "Tag"
},
"delete-provisioned-folder-form": {
- "alert-folder-deleted-successfully": "Folder berhasil dihapus",
"api-error": "Gagal menghapus folder",
"button-cancel": "Batalkan",
"button-delete": "Hapus",
"button-deleting": "Menghapus...",
- "delete-warning": "Ini akan menghapus folder ini dan semua subfoldernya. Secara keseluruhan, ini akan memengaruhi:"
+ "delete-warning": "Ini akan menghapus folder ini dan semua subfoldernya. Secara keseluruhan, ini akan memengaruhi:",
+ "success-message": ""
},
"descendant-count": {
"title-unable-to-retrieve-descendant-information": "Tidak dapat mengambil informasi turunan"
@@ -3592,7 +3592,6 @@
},
"new-provisioned-folder-form": {
"alert-error-creating-folder": "Kesalahan saat membuat folder",
- "alert-folder-created-successfully": "Folder berhasil dibuat",
"button-create": "Buat",
"button-creating": "Membuat...",
"cancel": "Batalkan",
@@ -3740,7 +3739,6 @@
}
},
"description-experimental-types": "Aktifkan pemilihan jenis elemen eksperimental",
- "description-infinite-panning": "Aktifkan fitur geser tak terbatas - berguna untuk kanvas yang luas. Peringatan: ini adalah fitur eksperimental dan saat ini hanya berfungsi dengan baik dengan elemen yang dibatasi terhadap sudut atas/kiri",
"description-inline-editing": "Aktifkan pengeditan panel secara langsung",
"description-pan-zoom": "Aktifkan geser dan zoom",
"direction-options": {
@@ -3841,7 +3839,6 @@
"name-align-text": "Ratakan teks",
"name-color": "Warna teks",
"name-experimental-types": "Jenis elemen eksperimental",
- "name-infinite-panning": "Geser tak terbatas",
"name-inline-editing": "Pengeditan inline",
"name-pan-zoom": "Geser dan zoom",
"name-text": "Teks",
@@ -5625,6 +5622,7 @@
"delete-read-only-file-message": "Dasbor ini tidak dapat dihapus langsung dari Grafana karena repositori bersifat hanya-baca. Untuk menghapus dasbor ini, harap hapus file dari repositori Git Anda.",
"deleting": "Menghapus...",
"drawer-title": "Hapus Dasbor yang Disediakan",
+ "success-message": "",
"title-this-repository-is-read-only": "Repositori ini hanya dapat dibaca"
},
"description-label": {
@@ -5637,9 +5635,6 @@
}
}
},
- "edit-provisioned-dashboard-form": {
- "success": "Perubahan dasbor berhasil disimpan"
- },
"email-list": {
"aria-label-emailmenu": "Alihkan tombol menu email"
},
@@ -5797,6 +5792,7 @@
"usage-count_other": "Digunakan pada {{count}} dasbor"
},
"move-provisioned-dashboard-form": {
+ "alert-error-moving-dashboard": "",
"api-error": "",
"cancel-action": "",
"current-file-not-found": "",
@@ -5806,6 +5802,7 @@
"move-action": "",
"move-read-only-message": "",
"moving": "",
+ "success-message": "",
"target-path-label": "",
"title-this-repository-is-read-only": ""
},
@@ -9335,6 +9332,15 @@
"show-more": "tampilkan lebih banyak",
"tooltip-error": "Kesalahan: {{errorMessage}}"
},
+ "log-line-context": {
+ "center-matched-line": "",
+ "newer-logs": "",
+ "no-more-logs-available": "",
+ "older-logs": "",
+ "open-in-split-view": "",
+ "title-log-context": "",
+ "title-log-line": ""
+ },
"log-line-details": {
"clear-search": "Hapus",
"close": "Tutup detail log",
@@ -10982,6 +10988,9 @@
"title-created-branch-in-repo": "",
"title-loaded-pull-request-in-repo": ""
},
+ "provisioned-resource-request-handler": "",
+ "provisioned-resource-request-handler-dashboard": "",
+ "provisioned-resource-request-handler-folder": "",
"provisioning": {
"banner": {
"message": "Fitur ini saat ini sedang dalam pengembangan aktif. Untuk pengalaman terbaik dan peningkatan terbaru, kami merekomendasikan Anda untuk menggunakan <2>versi nightly 2> Grafana."
@@ -11834,7 +11843,7 @@
"recommended": "Disarankan",
"results": "Hasil"
},
- "search": "Cari"
+ "search": ""
}
},
"search": {
@@ -12469,6 +12478,19 @@
"label-medium": "Sedang",
"label-small": "Kecil"
},
+ "cell-types": {
+ "actions": "",
+ "auto": "",
+ "color-background": "",
+ "color-text": "",
+ "data-links": "",
+ "gauge": "",
+ "image": "",
+ "json": "",
+ "markdown": "",
+ "pill": "",
+ "sparkline": ""
+ },
"color-background-cell-options-editor": {
"description-apply-to-entire-row": "Jika dipilih, seluruh baris akan berwarna seperti sel ini.",
"description-wrap-text": "Jika teks yang dipilih akan dipecah sesuai lebar teks di kolom yang telah dikonfigurasi",
@@ -12503,6 +12525,13 @@
"label-alt-text": "Teks alt",
"label-title-text": "Teks judul"
},
+ "markdown-cell-options-editor": {
+ "description-dynamic-height": "",
+ "label": {
+ "text-alpha": ""
+ },
+ "label-dynamic-height": ""
+ },
"name-calculation": "Perhitungan",
"name-cell-height": "Tinggi sel",
"name-cell-type": "Jenis sel",
@@ -12519,7 +12548,10 @@
"name-show-table-header": "Tampilkan header tabel",
"name-wrap-header-text": "Bungkus teks header",
"placeholder-column-width": "otomatis",
- "placeholder-fields": "Semua Bidang Numerik"
+ "placeholder-fields": "Semua Bidang Numerik",
+ "text-wrap-options": {
+ "label-wrap-text": ""
+ }
},
"table-new": {
"category-cell-options": "Opsi sel",
@@ -13234,22 +13266,6 @@
"label-row": "Baris",
"name": {
"grouping-to-matrix": ""
- },
- "special-value-options": {
- "description": {
- "boolean-false-value": "Nilai Boolean salah",
- "boolean-true-value": "Nilai Boolean benar",
- "empty-string": "String kosong",
- "null-value": "Nilai nol",
- "number-value": "Nilai angka 0"
- },
- "label": {
- "empty": "Kosong",
- "false": "Salah",
- "null": "Tidak ada",
- "true": "Benar",
- "zero": "Nol"
- }
}
},
"histogram-transformer-editor": {
@@ -13602,6 +13618,22 @@
"perform-spatial-operations": "",
"reformat": "",
"reorder-and-rename": ""
+ },
+ "special-value-options": {
+ "description": {
+ "boolean-false": "",
+ "boolean-true": "",
+ "empty-string": "",
+ "null-value": "",
+ "number-value": ""
+ },
+ "label": {
+ "boolean-false": "",
+ "boolean-true": "",
+ "empty-string": "",
+ "null-value": "",
+ "number-value": ""
+ }
}
},
"wide-info": {
diff --git a/public/locales/it-IT/grafana.json b/public/locales/it-IT/grafana.json
index b9280ddbc9f..15a6a20c33a 100644
--- a/public/locales/it-IT/grafana.json
+++ b/public/locales/it-IT/grafana.json
@@ -3563,12 +3563,12 @@
"tags-column": "Tag"
},
"delete-provisioned-folder-form": {
- "alert-folder-deleted-successfully": "",
"api-error": "",
"button-cancel": "",
"button-delete": "",
"button-deleting": "",
- "delete-warning": ""
+ "delete-warning": "",
+ "success-message": ""
},
"descendant-count": {
"title-unable-to-retrieve-descendant-information": "Impossibile recuperare le informazioni sui discendenti"
@@ -3611,7 +3611,6 @@
},
"new-provisioned-folder-form": {
"alert-error-creating-folder": "Errore durante la creazione della cartella",
- "alert-folder-created-successfully": "Cartella creata con successo",
"button-create": "Crea",
"button-creating": "Creazione in corso...",
"cancel": "Annulla",
@@ -3759,7 +3758,6 @@
}
},
"description-experimental-types": "",
- "description-infinite-panning": "",
"description-inline-editing": "",
"description-pan-zoom": "",
"direction-options": {
@@ -3860,7 +3858,6 @@
"name-align-text": "",
"name-color": "",
"name-experimental-types": "",
- "name-infinite-panning": "",
"name-inline-editing": "",
"name-pan-zoom": "",
"name-text": "",
@@ -5645,6 +5642,7 @@
"delete-read-only-file-message": "",
"deleting": "Eliminazione in corso...",
"drawer-title": "",
+ "success-message": "",
"title-this-repository-is-read-only": "Questo repository è di sola lettura"
},
"description-label": {
@@ -5657,9 +5655,6 @@
}
}
},
- "edit-provisioned-dashboard-form": {
- "success": ""
- },
"email-list": {
"aria-label-emailmenu": "Attiva/disattiva il menu e-mail"
},
@@ -5818,6 +5813,7 @@
"usage-count_other": "Utilizzato su {{count}} dashboard"
},
"move-provisioned-dashboard-form": {
+ "alert-error-moving-dashboard": "",
"api-error": "",
"cancel-action": "",
"current-file-not-found": "",
@@ -5827,6 +5823,7 @@
"move-action": "",
"move-read-only-message": "",
"moving": "",
+ "success-message": "",
"target-path-label": "",
"title-this-repository-is-read-only": ""
},
@@ -9365,6 +9362,15 @@
"show-more": "mostra altro",
"tooltip-error": "Errore: {{errorMessage}}"
},
+ "log-line-context": {
+ "center-matched-line": "",
+ "newer-logs": "",
+ "no-more-logs-available": "",
+ "older-logs": "",
+ "open-in-split-view": "",
+ "title-log-context": "",
+ "title-log-line": ""
+ },
"log-line-details": {
"clear-search": "",
"close": "",
@@ -11015,6 +11021,9 @@
"title-created-branch-in-repo": "",
"title-loaded-pull-request-in-repo": ""
},
+ "provisioned-resource-request-handler": "",
+ "provisioned-resource-request-handler-dashboard": "",
+ "provisioned-resource-request-handler-folder": "",
"provisioning": {
"banner": {
"message": "Questa funzione è attualmente in fase di sviluppo attivo. Per un'esperienza ottimale e gli ultimi miglioramenti, consigliamo di utilizzare la <2>nightly build2> di Grafana."
@@ -11874,7 +11883,7 @@
"recommended": "Consigliato",
"results": "Risultati"
},
- "search": "Cerca"
+ "search": ""
}
},
"search": {
@@ -12511,6 +12520,19 @@
"label-medium": "",
"label-small": ""
},
+ "cell-types": {
+ "actions": "",
+ "auto": "",
+ "color-background": "",
+ "color-text": "",
+ "data-links": "",
+ "gauge": "",
+ "image": "",
+ "json": "",
+ "markdown": "",
+ "pill": "",
+ "sparkline": ""
+ },
"color-background-cell-options-editor": {
"description-apply-to-entire-row": "",
"description-wrap-text": "",
@@ -12545,6 +12567,13 @@
"label-alt-text": "",
"label-title-text": ""
},
+ "markdown-cell-options-editor": {
+ "description-dynamic-height": "",
+ "label": {
+ "text-alpha": ""
+ },
+ "label-dynamic-height": ""
+ },
"name-calculation": "",
"name-cell-height": "",
"name-cell-type": "",
@@ -12561,7 +12590,10 @@
"name-show-table-header": "",
"name-wrap-header-text": "",
"placeholder-column-width": "",
- "placeholder-fields": ""
+ "placeholder-fields": "",
+ "text-wrap-options": {
+ "label-wrap-text": ""
+ }
},
"table-new": {
"category-cell-options": "",
@@ -13276,22 +13308,6 @@
"label-row": "Riga",
"name": {
"grouping-to-matrix": ""
- },
- "special-value-options": {
- "description": {
- "boolean-false-value": "",
- "boolean-true-value": "",
- "empty-string": "",
- "null-value": "",
- "number-value": ""
- },
- "label": {
- "empty": "Vuoto",
- "false": "",
- "null": "",
- "true": "",
- "zero": ""
- }
}
},
"histogram-transformer-editor": {
@@ -13644,6 +13660,22 @@
"perform-spatial-operations": "",
"reformat": "",
"reorder-and-rename": ""
+ },
+ "special-value-options": {
+ "description": {
+ "boolean-false": "",
+ "boolean-true": "",
+ "empty-string": "",
+ "null-value": "",
+ "number-value": ""
+ },
+ "label": {
+ "boolean-false": "",
+ "boolean-true": "",
+ "empty-string": "",
+ "null-value": "",
+ "number-value": ""
+ }
}
},
"wide-info": {
diff --git a/public/locales/ja-JP/grafana.json b/public/locales/ja-JP/grafana.json
index 9d43cef2cfb..8acf6a81b5c 100644
--- a/public/locales/ja-JP/grafana.json
+++ b/public/locales/ja-JP/grafana.json
@@ -3544,12 +3544,12 @@
"tags-column": "タグ"
},
"delete-provisioned-folder-form": {
- "alert-folder-deleted-successfully": "フォルダが正常に削除されました",
"api-error": "フォルダの削除に失敗しました",
"button-cancel": "キャンセル",
"button-delete": "削除",
"button-deleting": "削除中…",
- "delete-warning": "このフォルダとその下位のすべてのフォルダやコンテンツが削除されます。全部で、次に影響します: "
+ "delete-warning": "このフォルダとその下位のすべてのフォルダやコンテンツが削除されます。全部で、次に影響します: ",
+ "success-message": ""
},
"descendant-count": {
"title-unable-to-retrieve-descendant-information": "下位情報を取得できません"
@@ -3592,7 +3592,6 @@
},
"new-provisioned-folder-form": {
"alert-error-creating-folder": "フォルダ作成時のエラー",
- "alert-folder-created-successfully": "フォルダが正常に作成されました",
"button-create": "作成",
"button-creating": "作成中...",
"cancel": "キャンセル",
@@ -3740,7 +3739,6 @@
}
},
"description-experimental-types": "実験的な要素タイプの選択を有効化",
- "description-infinite-panning": "制限なしのパンを有効化 - 広大なキャンバスに便利。警告: これは実験的な機能で、現在は上部/左側に固定されている要素でのみ正常に動作します",
"description-inline-editing": "パネルの直接編集を有効化",
"description-pan-zoom": "パンとズームを有効化",
"direction-options": {
@@ -3841,7 +3839,6 @@
"name-align-text": "テキストの配置",
"name-color": "文字色",
"name-experimental-types": "実験的な要素タイプ",
- "name-infinite-panning": "制限なしのパン",
"name-inline-editing": "インライン編集",
"name-pan-zoom": "パンとズーム",
"name-text": "テキスト",
@@ -5625,6 +5622,7 @@
"delete-read-only-file-message": "リポジトリが読み取り専用のため、このダッシュボードをGrafanaから直接削除することはできません。このダッシュボードを削除するには、Gitリポジトリからファイルを削除してください。",
"deleting": "削除中…",
"drawer-title": "プロビジョニングされたダッシュボードを削除",
+ "success-message": "",
"title-this-repository-is-read-only": "このリポジトリは読み取り専用です"
},
"description-label": {
@@ -5637,9 +5635,6 @@
}
}
},
- "edit-provisioned-dashboard-form": {
- "success": "ダッシュボードの変更が正常に保存されました"
- },
"email-list": {
"aria-label-emailmenu": "メールメニューを切り替え"
},
@@ -5797,6 +5792,7 @@
"usage-count_other": "{{count}}件のダッシュボードで使用中"
},
"move-provisioned-dashboard-form": {
+ "alert-error-moving-dashboard": "",
"api-error": "",
"cancel-action": "",
"current-file-not-found": "",
@@ -5806,6 +5802,7 @@
"move-action": "",
"move-read-only-message": "",
"moving": "",
+ "success-message": "",
"target-path-label": "",
"title-this-repository-is-read-only": ""
},
@@ -9335,6 +9332,15 @@
"show-more": "さらに表示する",
"tooltip-error": "エラー:{{errorMessage}}"
},
+ "log-line-context": {
+ "center-matched-line": "",
+ "newer-logs": "",
+ "no-more-logs-available": "",
+ "older-logs": "",
+ "open-in-split-view": "",
+ "title-log-context": "",
+ "title-log-line": ""
+ },
"log-line-details": {
"clear-search": "クリア",
"close": "ログの詳細を閉じる",
@@ -10982,6 +10988,9 @@
"title-created-branch-in-repo": "",
"title-loaded-pull-request-in-repo": ""
},
+ "provisioned-resource-request-handler": "",
+ "provisioned-resource-request-handler-dashboard": "",
+ "provisioned-resource-request-handler-folder": "",
"provisioning": {
"banner": {
"message": "この機能は現在開発中です。最高の体験と最新の改善を利用するには、Grafanaの<2>ナイトリービルド2>の使用をお勧めします。"
@@ -11834,7 +11843,7 @@
"recommended": "おすすめ",
"results": "結果"
},
- "search": "検索"
+ "search": ""
}
},
"search": {
@@ -12469,6 +12478,19 @@
"label-medium": "中",
"label-small": "小"
},
+ "cell-types": {
+ "actions": "",
+ "auto": "",
+ "color-background": "",
+ "color-text": "",
+ "data-links": "",
+ "gauge": "",
+ "image": "",
+ "json": "",
+ "markdown": "",
+ "pill": "",
+ "sparkline": ""
+ },
"color-background-cell-options-editor": {
"description-apply-to-entire-row": "選択されている場合、行全体がこのセルと同じ色で表示されます。",
"description-wrap-text": "選択されている場合、テキストは設定された列のテキスト幅で折り返されます",
@@ -12503,6 +12525,13 @@
"label-alt-text": "代替テキスト",
"label-title-text": "タイトルテキスト"
},
+ "markdown-cell-options-editor": {
+ "description-dynamic-height": "",
+ "label": {
+ "text-alpha": ""
+ },
+ "label-dynamic-height": ""
+ },
"name-calculation": "計算",
"name-cell-height": "セルの高さ",
"name-cell-type": "セルの種類",
@@ -12519,7 +12548,10 @@
"name-show-table-header": "テーブルヘッダーを表示",
"name-wrap-header-text": "ヘッダーテキストの折り返し",
"placeholder-column-width": "自動",
- "placeholder-fields": "すべての数値フィールド"
+ "placeholder-fields": "すべての数値フィールド",
+ "text-wrap-options": {
+ "label-wrap-text": ""
+ }
},
"table-new": {
"category-cell-options": "セルオプション",
@@ -13234,22 +13266,6 @@
"label-row": "行",
"name": {
"grouping-to-matrix": ""
- },
- "special-value-options": {
- "description": {
- "boolean-false-value": "ブール値のfalse値",
- "boolean-true-value": "ブール値のtrue値",
- "empty-string": "空の文字列",
- "null-value": "Null値",
- "number-value": "数値0の値"
- },
- "label": {
- "empty": "空",
- "false": "False",
- "null": "Null",
- "true": "True",
- "zero": "Zero"
- }
}
},
"histogram-transformer-editor": {
@@ -13602,6 +13618,22 @@
"perform-spatial-operations": "",
"reformat": "",
"reorder-and-rename": ""
+ },
+ "special-value-options": {
+ "description": {
+ "boolean-false": "",
+ "boolean-true": "",
+ "empty-string": "",
+ "null-value": "",
+ "number-value": ""
+ },
+ "label": {
+ "boolean-false": "",
+ "boolean-true": "",
+ "empty-string": "",
+ "null-value": "",
+ "number-value": ""
+ }
}
},
"wide-info": {
diff --git a/public/locales/ko-KR/grafana.json b/public/locales/ko-KR/grafana.json
index 06e3e47560b..ec0630e6276 100644
--- a/public/locales/ko-KR/grafana.json
+++ b/public/locales/ko-KR/grafana.json
@@ -3544,12 +3544,12 @@
"tags-column": "태그"
},
"delete-provisioned-folder-form": {
- "alert-folder-deleted-successfully": "",
"api-error": "",
"button-cancel": "",
"button-delete": "",
"button-deleting": "",
- "delete-warning": ""
+ "delete-warning": "",
+ "success-message": ""
},
"descendant-count": {
"title-unable-to-retrieve-descendant-information": "하위 정보를 검색할 수 없습니다"
@@ -3592,7 +3592,6 @@
},
"new-provisioned-folder-form": {
"alert-error-creating-folder": "폴더 생성 중 오류 발생",
- "alert-folder-created-successfully": "폴더가 성공적으로 생성되었습니다",
"button-create": "생성",
"button-creating": "생성 중...",
"cancel": "취소",
@@ -3740,7 +3739,6 @@
}
},
"description-experimental-types": "",
- "description-infinite-panning": "",
"description-inline-editing": "",
"description-pan-zoom": "",
"direction-options": {
@@ -3841,7 +3839,6 @@
"name-align-text": "",
"name-color": "",
"name-experimental-types": "",
- "name-infinite-panning": "",
"name-inline-editing": "",
"name-pan-zoom": "",
"name-text": "",
@@ -5625,6 +5622,7 @@
"delete-read-only-file-message": "",
"deleting": "삭제 중…",
"drawer-title": "",
+ "success-message": "",
"title-this-repository-is-read-only": "이 리포지토리는 읽기 전용입니다."
},
"description-label": {
@@ -5637,9 +5635,6 @@
}
}
},
- "edit-provisioned-dashboard-form": {
- "success": ""
- },
"email-list": {
"aria-label-emailmenu": "이메일 메뉴 토글"
},
@@ -5797,6 +5792,7 @@
"usage-count_other": "{{count}}개의 대시보드에서 사용됨"
},
"move-provisioned-dashboard-form": {
+ "alert-error-moving-dashboard": "",
"api-error": "",
"cancel-action": "",
"current-file-not-found": "",
@@ -5806,6 +5802,7 @@
"move-action": "",
"move-read-only-message": "",
"moving": "",
+ "success-message": "",
"target-path-label": "",
"title-this-repository-is-read-only": ""
},
@@ -9335,6 +9332,15 @@
"show-more": "더 보기",
"tooltip-error": "오류: {{errorMessage}}"
},
+ "log-line-context": {
+ "center-matched-line": "",
+ "newer-logs": "",
+ "no-more-logs-available": "",
+ "older-logs": "",
+ "open-in-split-view": "",
+ "title-log-context": "",
+ "title-log-line": ""
+ },
"log-line-details": {
"clear-search": "",
"close": "",
@@ -10982,6 +10988,9 @@
"title-created-branch-in-repo": "",
"title-loaded-pull-request-in-repo": ""
},
+ "provisioned-resource-request-handler": "",
+ "provisioned-resource-request-handler-dashboard": "",
+ "provisioned-resource-request-handler-folder": "",
"provisioning": {
"banner": {
"message": "이 기능은 현재 적극적으로 개발 중입니다. 최상의 경험과 최신 개선 사항 적용을 위해 Grafana의 <2>야간 빌드2>를 사용하는 것이 좋습니다."
@@ -11834,7 +11843,7 @@
"recommended": "권장",
"results": "결과"
},
- "search": "검색"
+ "search": ""
}
},
"search": {
@@ -12469,6 +12478,19 @@
"label-medium": "",
"label-small": ""
},
+ "cell-types": {
+ "actions": "",
+ "auto": "",
+ "color-background": "",
+ "color-text": "",
+ "data-links": "",
+ "gauge": "",
+ "image": "",
+ "json": "",
+ "markdown": "",
+ "pill": "",
+ "sparkline": ""
+ },
"color-background-cell-options-editor": {
"description-apply-to-entire-row": "선택하면 전체 행이 이 셀과 같은 색으로 표시됩니다.",
"description-wrap-text": "선택한 텍스트가 구성된 열의 텍스트 너비에 맞게 줄 바꿈되는 경우",
@@ -12503,6 +12525,13 @@
"label-alt-text": "대체 텍스트",
"label-title-text": "제목 텍스트"
},
+ "markdown-cell-options-editor": {
+ "description-dynamic-height": "",
+ "label": {
+ "text-alpha": ""
+ },
+ "label-dynamic-height": ""
+ },
"name-calculation": "",
"name-cell-height": "",
"name-cell-type": "",
@@ -12519,7 +12548,10 @@
"name-show-table-header": "",
"name-wrap-header-text": "",
"placeholder-column-width": "",
- "placeholder-fields": ""
+ "placeholder-fields": "",
+ "text-wrap-options": {
+ "label-wrap-text": ""
+ }
},
"table-new": {
"category-cell-options": "",
@@ -13234,22 +13266,6 @@
"label-row": "행",
"name": {
"grouping-to-matrix": ""
- },
- "special-value-options": {
- "description": {
- "boolean-false-value": "부울 거짓값",
- "boolean-true-value": "부울 참값",
- "empty-string": "빈 문자열",
- "null-value": "Null 값",
- "number-value": "숫자 0 값"
- },
- "label": {
- "empty": "비어 있음",
- "false": "거짓",
- "null": "Null",
- "true": "참",
- "zero": "0"
- }
}
},
"histogram-transformer-editor": {
@@ -13602,6 +13618,22 @@
"perform-spatial-operations": "",
"reformat": "",
"reorder-and-rename": ""
+ },
+ "special-value-options": {
+ "description": {
+ "boolean-false": "",
+ "boolean-true": "",
+ "empty-string": "",
+ "null-value": "",
+ "number-value": ""
+ },
+ "label": {
+ "boolean-false": "",
+ "boolean-true": "",
+ "empty-string": "",
+ "null-value": "",
+ "number-value": ""
+ }
}
},
"wide-info": {
diff --git a/public/locales/nl-NL/grafana.json b/public/locales/nl-NL/grafana.json
index c1603266c7d..6eeb94345e8 100644
--- a/public/locales/nl-NL/grafana.json
+++ b/public/locales/nl-NL/grafana.json
@@ -3563,12 +3563,12 @@
"tags-column": "Tags"
},
"delete-provisioned-folder-form": {
- "alert-folder-deleted-successfully": "Map is verwijderd",
"api-error": "Kan map niet verwijderen",
"button-cancel": "Annuleren",
"button-delete": "Verwijderen",
"button-deleting": "Bezig met verwijderen...",
- "delete-warning": "Hiermee worden deze map en alle onderliggende mappen verwijderd. In totaal heeft dit invloed op:"
+ "delete-warning": "Hiermee worden deze map en alle onderliggende mappen verwijderd. In totaal heeft dit invloed op:",
+ "success-message": ""
},
"descendant-count": {
"title-unable-to-retrieve-descendant-information": "Kan afgeleide informatie niet ophalen"
@@ -3611,7 +3611,6 @@
},
"new-provisioned-folder-form": {
"alert-error-creating-folder": "Er is een fout opgetreden bij het aanmaken van de map",
- "alert-folder-created-successfully": "Map is gemaakt",
"button-create": "Aanmaken",
"button-creating": "Aanmaken...",
"cancel": "Annuleren",
@@ -3759,7 +3758,6 @@
}
},
"description-experimental-types": "Selectie van experimentele elementtypes inschakelen",
- "description-infinite-panning": "Oneindig pannen inschakelen - handig voor grote canvassen. Waarschuwing: dit is een experimentele functie en werkt momenteel alleen goed met elementen die linksboven zijn beperkt",
"description-inline-editing": "Rechtstreekse bewerking van het paneel inschakelen",
"description-pan-zoom": "Pan en zoom inschakelen",
"direction-options": {
@@ -3860,7 +3858,6 @@
"name-align-text": "Tekst uitlijnen",
"name-color": "Tekstkleur",
"name-experimental-types": "Experimentele elementtypes",
- "name-infinite-panning": "Oneindig pannen",
"name-inline-editing": "Inline bewerken",
"name-pan-zoom": "Pennen en zoomen",
"name-text": "Tekst",
@@ -5645,6 +5642,7 @@
"delete-read-only-file-message": "Dit dashboard kan niet rechtstreeks uit Grafana worden verwijderd omdat de repository alleen-lezen is. Verwijder het bestand uit je Git-repository om dit dashboard te verwijderen.",
"deleting": "Bezig met verwijderen ...",
"drawer-title": "Kan provisioned dashboard niet verwijderen",
+ "success-message": "",
"title-this-repository-is-read-only": "Deze repository is alleen-lezen"
},
"description-label": {
@@ -5657,9 +5655,6 @@
}
}
},
- "edit-provisioned-dashboard-form": {
- "success": "Dashboardwijzigingen opgeslagen"
- },
"email-list": {
"aria-label-emailmenu": "E-mailmenu in-/uitschakelen"
},
@@ -5818,6 +5813,7 @@
"usage-count_other": "Gebruikt op {{count}} dashboards"
},
"move-provisioned-dashboard-form": {
+ "alert-error-moving-dashboard": "",
"api-error": "",
"cancel-action": "",
"current-file-not-found": "",
@@ -5827,6 +5823,7 @@
"move-action": "",
"move-read-only-message": "",
"moving": "",
+ "success-message": "",
"target-path-label": "",
"title-this-repository-is-read-only": ""
},
@@ -9365,6 +9362,15 @@
"show-more": "meer",
"tooltip-error": "Fout: {{errorMessage}}"
},
+ "log-line-context": {
+ "center-matched-line": "",
+ "newer-logs": "",
+ "no-more-logs-available": "",
+ "older-logs": "",
+ "open-in-split-view": "",
+ "title-log-context": "",
+ "title-log-line": ""
+ },
"log-line-details": {
"clear-search": "Wissen",
"close": "Logboekdetails sluiten",
@@ -11015,6 +11021,9 @@
"title-created-branch-in-repo": "",
"title-loaded-pull-request-in-repo": ""
},
+ "provisioned-resource-request-handler": "",
+ "provisioned-resource-request-handler-dashboard": "",
+ "provisioned-resource-request-handler-folder": "",
"provisioning": {
"banner": {
"message": "Er wordt momenteel actief gewerkt aan de ontwikkeling van deze functie. Voor de beste ervaring en de nieuwste verbeteringen raden we je aan om de <2>nachtelijke versie2> van Grafana te gebruiken."
@@ -11874,7 +11883,7 @@
"recommended": "Aanbevolen",
"results": "Resultaten"
},
- "search": "Zoeken"
+ "search": ""
}
},
"search": {
@@ -12511,6 +12520,19 @@
"label-medium": "Medium",
"label-small": "Klein"
},
+ "cell-types": {
+ "actions": "",
+ "auto": "",
+ "color-background": "",
+ "color-text": "",
+ "data-links": "",
+ "gauge": "",
+ "image": "",
+ "json": "",
+ "markdown": "",
+ "pill": "",
+ "sparkline": ""
+ },
"color-background-cell-options-editor": {
"description-apply-to-entire-row": "Indien geselecteerd, wordt de hele rij gekleurd zoals deze cel zou zijn.",
"description-wrap-text": "Als geselecteerde tekst wordt teruggelopen naar de breedte van de tekst in de geconfigureerde kolom",
@@ -12545,6 +12567,13 @@
"label-alt-text": "Alt text",
"label-title-text": "Titeltekst"
},
+ "markdown-cell-options-editor": {
+ "description-dynamic-height": "",
+ "label": {
+ "text-alpha": ""
+ },
+ "label-dynamic-height": ""
+ },
"name-calculation": "Berekening",
"name-cell-height": "Celhoogte",
"name-cell-type": "Type cel",
@@ -12561,7 +12590,10 @@
"name-show-table-header": "Header tabel tonen",
"name-wrap-header-text": "Koptekst laten teruglopen",
"placeholder-column-width": "automatisch",
- "placeholder-fields": "Alle numerieke velden"
+ "placeholder-fields": "Alle numerieke velden",
+ "text-wrap-options": {
+ "label-wrap-text": ""
+ }
},
"table-new": {
"category-cell-options": "Celopties",
@@ -13276,22 +13308,6 @@
"label-row": "Rij",
"name": {
"grouping-to-matrix": ""
- },
- "special-value-options": {
- "description": {
- "boolean-false-value": "Booleaanse valse waarde",
- "boolean-true-value": "Booleaanse ware waarde",
- "empty-string": "Lege string",
- "null-value": "Nulwaarde",
- "number-value": "Nummer 0 waarde"
- },
- "label": {
- "empty": "Leeg",
- "false": "Onjuist",
- "null": "Nul",
- "true": "Juist",
- "zero": "Nul"
- }
}
},
"histogram-transformer-editor": {
@@ -13644,6 +13660,22 @@
"perform-spatial-operations": "",
"reformat": "",
"reorder-and-rename": ""
+ },
+ "special-value-options": {
+ "description": {
+ "boolean-false": "",
+ "boolean-true": "",
+ "empty-string": "",
+ "null-value": "",
+ "number-value": ""
+ },
+ "label": {
+ "boolean-false": "",
+ "boolean-true": "",
+ "empty-string": "",
+ "null-value": "",
+ "number-value": ""
+ }
}
},
"wide-info": {
diff --git a/public/locales/pl-PL/grafana.json b/public/locales/pl-PL/grafana.json
index 94f57f04483..6c2bdec578a 100644
--- a/public/locales/pl-PL/grafana.json
+++ b/public/locales/pl-PL/grafana.json
@@ -3601,12 +3601,12 @@
"tags-column": "Znaczniki"
},
"delete-provisioned-folder-form": {
- "alert-folder-deleted-successfully": "",
"api-error": "",
"button-cancel": "",
"button-delete": "",
"button-deleting": "",
- "delete-warning": ""
+ "delete-warning": "",
+ "success-message": ""
},
"descendant-count": {
"title-unable-to-retrieve-descendant-information": "Nie można pobrać informacji o elemencie potomnym"
@@ -3649,7 +3649,6 @@
},
"new-provisioned-folder-form": {
"alert-error-creating-folder": "Błąd podczas tworzenia folderu",
- "alert-folder-created-successfully": "Folder został utworzony",
"button-create": "Utwórz",
"button-creating": "Tworzenie…",
"cancel": "Anuluj",
@@ -3797,7 +3796,6 @@
}
},
"description-experimental-types": "",
- "description-infinite-panning": "",
"description-inline-editing": "",
"description-pan-zoom": "",
"direction-options": {
@@ -3898,7 +3896,6 @@
"name-align-text": "",
"name-color": "",
"name-experimental-types": "",
- "name-infinite-panning": "",
"name-inline-editing": "",
"name-pan-zoom": "",
"name-text": "",
@@ -5685,6 +5682,7 @@
"delete-read-only-file-message": "",
"deleting": "Usuwanie…",
"drawer-title": "",
+ "success-message": "",
"title-this-repository-is-read-only": "To repozytorium jest tylko do odczytu"
},
"description-label": {
@@ -5697,9 +5695,6 @@
}
}
},
- "edit-provisioned-dashboard-form": {
- "success": ""
- },
"email-list": {
"aria-label-emailmenu": "Menu przełączania konta e-mail"
},
@@ -5860,6 +5855,7 @@
"usage-count_other": "Używane na {{count}} pulpitach"
},
"move-provisioned-dashboard-form": {
+ "alert-error-moving-dashboard": "",
"api-error": "",
"cancel-action": "",
"current-file-not-found": "",
@@ -5869,6 +5865,7 @@
"move-action": "",
"move-read-only-message": "",
"moving": "",
+ "success-message": "",
"target-path-label": "",
"title-this-repository-is-read-only": ""
},
@@ -9425,6 +9422,15 @@
"show-more": "pokaż więcej",
"tooltip-error": "Błąd: {{errorMessage}}"
},
+ "log-line-context": {
+ "center-matched-line": "",
+ "newer-logs": "",
+ "no-more-logs-available": "",
+ "older-logs": "",
+ "open-in-split-view": "",
+ "title-log-context": "",
+ "title-log-line": ""
+ },
"log-line-details": {
"clear-search": "",
"close": "",
@@ -11081,6 +11087,9 @@
"title-created-branch-in-repo": "",
"title-loaded-pull-request-in-repo": ""
},
+ "provisioned-resource-request-handler": "",
+ "provisioned-resource-request-handler-dashboard": "",
+ "provisioned-resource-request-handler-folder": "",
"provisioning": {
"banner": {
"message": "Ta funkcja jest obecnie aktywnie rozwijana. Aby uzyskać najlepsze wrażenia i najnowsze ulepszenia, zalecamy korzystanie z <2>nocnej kompilacji2> aplikacji Grafana."
@@ -11954,7 +11963,7 @@
"recommended": "Zalecane",
"results": "Wyniki"
},
- "search": "Szukaj"
+ "search": ""
}
},
"search": {
@@ -12595,6 +12604,19 @@
"label-medium": "",
"label-small": ""
},
+ "cell-types": {
+ "actions": "",
+ "auto": "",
+ "color-background": "",
+ "color-text": "",
+ "data-links": "",
+ "gauge": "",
+ "image": "",
+ "json": "",
+ "markdown": "",
+ "pill": "",
+ "sparkline": ""
+ },
"color-background-cell-options-editor": {
"description-apply-to-entire-row": "W przypadku zaznaczenia cały wiersz będzie kolorowy, tak jak ta komórka.",
"description-wrap-text": "Jeśli zaznaczony tekst zostanie zawinięty do szerokości tekstu w skonfigurowanej kolumnie",
@@ -12629,6 +12651,13 @@
"label-alt-text": "Tekst alternatywny",
"label-title-text": "Tekst tytułu"
},
+ "markdown-cell-options-editor": {
+ "description-dynamic-height": "",
+ "label": {
+ "text-alpha": ""
+ },
+ "label-dynamic-height": ""
+ },
"name-calculation": "",
"name-cell-height": "",
"name-cell-type": "",
@@ -12645,7 +12674,10 @@
"name-show-table-header": "",
"name-wrap-header-text": "",
"placeholder-column-width": "",
- "placeholder-fields": ""
+ "placeholder-fields": "",
+ "text-wrap-options": {
+ "label-wrap-text": ""
+ }
},
"table-new": {
"category-cell-options": "",
@@ -13360,22 +13392,6 @@
"label-row": "Wiersz",
"name": {
"grouping-to-matrix": ""
- },
- "special-value-options": {
- "description": {
- "boolean-false-value": "Wartość logiczna Fałsz",
- "boolean-true-value": "Wartość logiczna Prawda",
- "empty-string": "Pusty ciąg",
- "null-value": "Wartość null",
- "number-value": "Wartość: liczba 0"
- },
- "label": {
- "empty": "Pusty",
- "false": "Fałsz",
- "null": "Null",
- "true": "Prawda",
- "zero": "Zero"
- }
}
},
"histogram-transformer-editor": {
@@ -13728,6 +13744,22 @@
"perform-spatial-operations": "",
"reformat": "",
"reorder-and-rename": ""
+ },
+ "special-value-options": {
+ "description": {
+ "boolean-false": "",
+ "boolean-true": "",
+ "empty-string": "",
+ "null-value": "",
+ "number-value": ""
+ },
+ "label": {
+ "boolean-false": "",
+ "boolean-true": "",
+ "empty-string": "",
+ "null-value": "",
+ "number-value": ""
+ }
}
},
"wide-info": {
diff --git a/public/locales/pt-BR/grafana.json b/public/locales/pt-BR/grafana.json
index 4515bb35b80..5cd0400193b 100644
--- a/public/locales/pt-BR/grafana.json
+++ b/public/locales/pt-BR/grafana.json
@@ -3563,12 +3563,12 @@
"tags-column": "Tags"
},
"delete-provisioned-folder-form": {
- "alert-folder-deleted-successfully": "",
"api-error": "",
"button-cancel": "",
"button-delete": "",
"button-deleting": "",
- "delete-warning": ""
+ "delete-warning": "",
+ "success-message": ""
},
"descendant-count": {
"title-unable-to-retrieve-descendant-information": "Não é possível recuperar informações de elementos subordinados"
@@ -3611,7 +3611,6 @@
},
"new-provisioned-folder-form": {
"alert-error-creating-folder": "Erro ao criar pasta",
- "alert-folder-created-successfully": "Pasta criada com sucesso",
"button-create": "Criar",
"button-creating": "Criando…",
"cancel": "Cancelar",
@@ -3759,7 +3758,6 @@
}
},
"description-experimental-types": "",
- "description-infinite-panning": "",
"description-inline-editing": "",
"description-pan-zoom": "",
"direction-options": {
@@ -3860,7 +3858,6 @@
"name-align-text": "",
"name-color": "",
"name-experimental-types": "",
- "name-infinite-panning": "",
"name-inline-editing": "",
"name-pan-zoom": "",
"name-text": "",
@@ -5645,6 +5642,7 @@
"delete-read-only-file-message": "",
"deleting": "Excluindo...",
"drawer-title": "",
+ "success-message": "",
"title-this-repository-is-read-only": "Este repositório é somente leitura"
},
"description-label": {
@@ -5657,9 +5655,6 @@
}
}
},
- "edit-provisioned-dashboard-form": {
- "success": ""
- },
"email-list": {
"aria-label-emailmenu": "Alternar menu de e-mail"
},
@@ -5818,6 +5813,7 @@
"usage-count_other": "Usado em {{count}} painéis"
},
"move-provisioned-dashboard-form": {
+ "alert-error-moving-dashboard": "",
"api-error": "",
"cancel-action": "",
"current-file-not-found": "",
@@ -5827,6 +5823,7 @@
"move-action": "",
"move-read-only-message": "",
"moving": "",
+ "success-message": "",
"target-path-label": "",
"title-this-repository-is-read-only": ""
},
@@ -9365,6 +9362,15 @@
"show-more": "exibir mais",
"tooltip-error": "Erro: {{errorMessage}}"
},
+ "log-line-context": {
+ "center-matched-line": "",
+ "newer-logs": "",
+ "no-more-logs-available": "",
+ "older-logs": "",
+ "open-in-split-view": "",
+ "title-log-context": "",
+ "title-log-line": ""
+ },
"log-line-details": {
"clear-search": "",
"close": "",
@@ -11015,6 +11021,9 @@
"title-created-branch-in-repo": "",
"title-loaded-pull-request-in-repo": ""
},
+ "provisioned-resource-request-handler": "",
+ "provisioned-resource-request-handler-dashboard": "",
+ "provisioned-resource-request-handler-folder": "",
"provisioning": {
"banner": {
"message": "Este recurso está em desenvolvimento ativo no momento. Para ter uma melhor experiência e conferir as melhorias mais recentes, recomendamos usar a <2>compilação noturna2> da Grafana."
@@ -11874,7 +11883,7 @@
"recommended": "Recomendado",
"results": "Resultados"
},
- "search": "Pesquisar"
+ "search": ""
}
},
"search": {
@@ -12511,6 +12520,19 @@
"label-medium": "",
"label-small": ""
},
+ "cell-types": {
+ "actions": "",
+ "auto": "",
+ "color-background": "",
+ "color-text": "",
+ "data-links": "",
+ "gauge": "",
+ "image": "",
+ "json": "",
+ "markdown": "",
+ "pill": "",
+ "sparkline": ""
+ },
"color-background-cell-options-editor": {
"description-apply-to-entire-row": "Se selecionada, toda a linha será colorida como esta célula.",
"description-wrap-text": "Se selecionado, o texto será ajustado de acordo com a largura do texto na coluna configurada",
@@ -12545,6 +12567,13 @@
"label-alt-text": "Texto alternativo",
"label-title-text": "Texto do título"
},
+ "markdown-cell-options-editor": {
+ "description-dynamic-height": "",
+ "label": {
+ "text-alpha": ""
+ },
+ "label-dynamic-height": ""
+ },
"name-calculation": "",
"name-cell-height": "",
"name-cell-type": "",
@@ -12561,7 +12590,10 @@
"name-show-table-header": "",
"name-wrap-header-text": "",
"placeholder-column-width": "",
- "placeholder-fields": ""
+ "placeholder-fields": "",
+ "text-wrap-options": {
+ "label-wrap-text": ""
+ }
},
"table-new": {
"category-cell-options": "",
@@ -13276,22 +13308,6 @@
"label-row": "Linha",
"name": {
"grouping-to-matrix": ""
- },
- "special-value-options": {
- "description": {
- "boolean-false-value": "Valor booleano falso",
- "boolean-true-value": "Valor booleano verdadeiro",
- "empty-string": "String vazia",
- "null-value": "Valor nulo",
- "number-value": "Valor do número 0"
- },
- "label": {
- "empty": "Vazio",
- "false": "Falso",
- "null": "Nulo",
- "true": "Verdadeiro",
- "zero": "Zero"
- }
}
},
"histogram-transformer-editor": {
@@ -13644,6 +13660,22 @@
"perform-spatial-operations": "",
"reformat": "",
"reorder-and-rename": ""
+ },
+ "special-value-options": {
+ "description": {
+ "boolean-false": "",
+ "boolean-true": "",
+ "empty-string": "",
+ "null-value": "",
+ "number-value": ""
+ },
+ "label": {
+ "boolean-false": "",
+ "boolean-true": "",
+ "empty-string": "",
+ "null-value": "",
+ "number-value": ""
+ }
}
},
"wide-info": {
diff --git a/public/locales/pt-PT/grafana.json b/public/locales/pt-PT/grafana.json
index fd87d26a16b..deb24345471 100644
--- a/public/locales/pt-PT/grafana.json
+++ b/public/locales/pt-PT/grafana.json
@@ -3563,12 +3563,12 @@
"tags-column": "Etiquetas"
},
"delete-provisioned-folder-form": {
- "alert-folder-deleted-successfully": "",
"api-error": "",
"button-cancel": "",
"button-delete": "",
"button-deleting": "",
- "delete-warning": ""
+ "delete-warning": "",
+ "success-message": ""
},
"descendant-count": {
"title-unable-to-retrieve-descendant-information": "Não foi possível obter informações sobre os descendentes"
@@ -3611,7 +3611,6 @@
},
"new-provisioned-folder-form": {
"alert-error-creating-folder": "Erro ao criar a pasta",
- "alert-folder-created-successfully": "Pasta criada com sucesso",
"button-create": "Criar",
"button-creating": "A criar...",
"cancel": "Cancelar",
@@ -3759,7 +3758,6 @@
}
},
"description-experimental-types": "",
- "description-infinite-panning": "",
"description-inline-editing": "",
"description-pan-zoom": "",
"direction-options": {
@@ -3860,7 +3858,6 @@
"name-align-text": "",
"name-color": "",
"name-experimental-types": "",
- "name-infinite-panning": "",
"name-inline-editing": "",
"name-pan-zoom": "",
"name-text": "",
@@ -5645,6 +5642,7 @@
"delete-read-only-file-message": "",
"deleting": "A eliminar...",
"drawer-title": "",
+ "success-message": "",
"title-this-repository-is-read-only": "Este repositório é apenas de leitura"
},
"description-label": {
@@ -5657,9 +5655,6 @@
}
}
},
- "edit-provisioned-dashboard-form": {
- "success": ""
- },
"email-list": {
"aria-label-emailmenu": "Alternar menu de e-mail"
},
@@ -5818,6 +5813,7 @@
"usage-count_other": "Utilizado em {{count}} painéis de controlo"
},
"move-provisioned-dashboard-form": {
+ "alert-error-moving-dashboard": "",
"api-error": "",
"cancel-action": "",
"current-file-not-found": "",
@@ -5827,6 +5823,7 @@
"move-action": "",
"move-read-only-message": "",
"moving": "",
+ "success-message": "",
"target-path-label": "",
"title-this-repository-is-read-only": ""
},
@@ -9365,6 +9362,15 @@
"show-more": "mostrar mais",
"tooltip-error": "Erro: {{errorMessage}}"
},
+ "log-line-context": {
+ "center-matched-line": "",
+ "newer-logs": "",
+ "no-more-logs-available": "",
+ "older-logs": "",
+ "open-in-split-view": "",
+ "title-log-context": "",
+ "title-log-line": ""
+ },
"log-line-details": {
"clear-search": "",
"close": "",
@@ -11015,6 +11021,9 @@
"title-created-branch-in-repo": "",
"title-loaded-pull-request-in-repo": ""
},
+ "provisioned-resource-request-handler": "",
+ "provisioned-resource-request-handler-dashboard": "",
+ "provisioned-resource-request-handler-folder": "",
"provisioning": {
"banner": {
"message": "Esta funcionalidade está atualmente em desenvolvimento ativo. Para a melhor experiência e as melhorias mais recentes, recomendamos a utilização da <2>compilação noturna2> da Grafana."
@@ -11874,7 +11883,7 @@
"recommended": "Recomendado",
"results": "Resultados"
},
- "search": "Pesquisar"
+ "search": ""
}
},
"search": {
@@ -12511,6 +12520,19 @@
"label-medium": "",
"label-small": ""
},
+ "cell-types": {
+ "actions": "",
+ "auto": "",
+ "color-background": "",
+ "color-text": "",
+ "data-links": "",
+ "gauge": "",
+ "image": "",
+ "json": "",
+ "markdown": "",
+ "pill": "",
+ "sparkline": ""
+ },
"color-background-cell-options-editor": {
"description-apply-to-entire-row": "Se selecionado, toda a linha será colorida como esta célula seria.",
"description-wrap-text": "Se o texto selecionado for ajustado à largura do texto na coluna configurada",
@@ -12545,6 +12567,13 @@
"label-alt-text": "Texto alternativo",
"label-title-text": "Texto do título"
},
+ "markdown-cell-options-editor": {
+ "description-dynamic-height": "",
+ "label": {
+ "text-alpha": ""
+ },
+ "label-dynamic-height": ""
+ },
"name-calculation": "",
"name-cell-height": "",
"name-cell-type": "",
@@ -12561,7 +12590,10 @@
"name-show-table-header": "",
"name-wrap-header-text": "",
"placeholder-column-width": "",
- "placeholder-fields": ""
+ "placeholder-fields": "",
+ "text-wrap-options": {
+ "label-wrap-text": ""
+ }
},
"table-new": {
"category-cell-options": "",
@@ -13276,22 +13308,6 @@
"label-row": "Linha",
"name": {
"grouping-to-matrix": ""
- },
- "special-value-options": {
- "description": {
- "boolean-false-value": "Valor booleano falso",
- "boolean-true-value": "Valor booleano verdadeiro",
- "empty-string": "String vazia",
- "null-value": "Valor nulo",
- "number-value": "Valor do número 0"
- },
- "label": {
- "empty": "Esvaziar",
- "false": "Falso",
- "null": "Nulo",
- "true": "Verdadeiro",
- "zero": "Zero"
- }
}
},
"histogram-transformer-editor": {
@@ -13644,6 +13660,22 @@
"perform-spatial-operations": "",
"reformat": "",
"reorder-and-rename": ""
+ },
+ "special-value-options": {
+ "description": {
+ "boolean-false": "",
+ "boolean-true": "",
+ "empty-string": "",
+ "null-value": "",
+ "number-value": ""
+ },
+ "label": {
+ "boolean-false": "",
+ "boolean-true": "",
+ "empty-string": "",
+ "null-value": "",
+ "number-value": ""
+ }
}
},
"wide-info": {
diff --git a/public/locales/ru-RU/grafana.json b/public/locales/ru-RU/grafana.json
index 01ef6fe7de1..5ea0a7c18ff 100644
--- a/public/locales/ru-RU/grafana.json
+++ b/public/locales/ru-RU/grafana.json
@@ -3601,12 +3601,12 @@
"tags-column": "Теги"
},
"delete-provisioned-folder-form": {
- "alert-folder-deleted-successfully": "",
"api-error": "",
"button-cancel": "",
"button-delete": "",
"button-deleting": "",
- "delete-warning": ""
+ "delete-warning": "",
+ "success-message": ""
},
"descendant-count": {
"title-unable-to-retrieve-descendant-information": "Невозможно получить информацию о потомках"
@@ -3649,7 +3649,6 @@
},
"new-provisioned-folder-form": {
"alert-error-creating-folder": "Ошибка при создании папки",
- "alert-folder-created-successfully": "Папка создана",
"button-create": "Создание",
"button-creating": "Создание...",
"cancel": "Отмена",
@@ -3797,7 +3796,6 @@
}
},
"description-experimental-types": "",
- "description-infinite-panning": "",
"description-inline-editing": "",
"description-pan-zoom": "",
"direction-options": {
@@ -3898,7 +3896,6 @@
"name-align-text": "",
"name-color": "",
"name-experimental-types": "",
- "name-infinite-panning": "",
"name-inline-editing": "",
"name-pan-zoom": "",
"name-text": "",
@@ -5685,6 +5682,7 @@
"delete-read-only-file-message": "",
"deleting": "Удаление...",
"drawer-title": "",
+ "success-message": "",
"title-this-repository-is-read-only": "Репозиторий предназначен только для чтения"
},
"description-label": {
@@ -5697,9 +5695,6 @@
}
}
},
- "edit-provisioned-dashboard-form": {
- "success": ""
- },
"email-list": {
"aria-label-emailmenu": "Переключить меню электронной почты"
},
@@ -5860,6 +5855,7 @@
"usage-count_other": "Используется на {{count}} дашбордах"
},
"move-provisioned-dashboard-form": {
+ "alert-error-moving-dashboard": "",
"api-error": "",
"cancel-action": "",
"current-file-not-found": "",
@@ -5869,6 +5865,7 @@
"move-action": "",
"move-read-only-message": "",
"moving": "",
+ "success-message": "",
"target-path-label": "",
"title-this-repository-is-read-only": ""
},
@@ -9425,6 +9422,15 @@
"show-more": "больше",
"tooltip-error": "Ошибка: {{errorMessage}}"
},
+ "log-line-context": {
+ "center-matched-line": "",
+ "newer-logs": "",
+ "no-more-logs-available": "",
+ "older-logs": "",
+ "open-in-split-view": "",
+ "title-log-context": "",
+ "title-log-line": ""
+ },
"log-line-details": {
"clear-search": "",
"close": "",
@@ -11081,6 +11087,9 @@
"title-created-branch-in-repo": "",
"title-loaded-pull-request-in-repo": ""
},
+ "provisioned-resource-request-handler": "",
+ "provisioned-resource-request-handler-dashboard": "",
+ "provisioned-resource-request-handler-folder": "",
"provisioning": {
"banner": {
"message": "В настоящее время эта функция находится в стадии активной разработки. Чтобы обеспечить максимальное удобство пользования и получить доступ к последним улучшениям, рекомендуем использовать <2>ночную сборку2> Grafana."
@@ -11954,7 +11963,7 @@
"recommended": "Рекомендуемые",
"results": "Результаты"
},
- "search": "Поиск"
+ "search": ""
}
},
"search": {
@@ -12595,6 +12604,19 @@
"label-medium": "",
"label-small": ""
},
+ "cell-types": {
+ "actions": "",
+ "auto": "",
+ "color-background": "",
+ "color-text": "",
+ "data-links": "",
+ "gauge": "",
+ "image": "",
+ "json": "",
+ "markdown": "",
+ "pill": "",
+ "sparkline": ""
+ },
"color-background-cell-options-editor": {
"description-apply-to-entire-row": "При выборе этого параметра вся строка будет окрашена аналогично этой ячейке.",
"description-wrap-text": "При выборе этого параметра текст будет переноситься по ширине текста в настроенном столбце",
@@ -12629,6 +12651,13 @@
"label-alt-text": "Альтернативный текст",
"label-title-text": "Текст заголовка"
},
+ "markdown-cell-options-editor": {
+ "description-dynamic-height": "",
+ "label": {
+ "text-alpha": ""
+ },
+ "label-dynamic-height": ""
+ },
"name-calculation": "",
"name-cell-height": "",
"name-cell-type": "",
@@ -12645,7 +12674,10 @@
"name-show-table-header": "",
"name-wrap-header-text": "",
"placeholder-column-width": "",
- "placeholder-fields": ""
+ "placeholder-fields": "",
+ "text-wrap-options": {
+ "label-wrap-text": ""
+ }
},
"table-new": {
"category-cell-options": "",
@@ -13360,22 +13392,6 @@
"label-row": "Строка",
"name": {
"grouping-to-matrix": ""
- },
- "special-value-options": {
- "description": {
- "boolean-false-value": "Ложное логическое значение",
- "boolean-true-value": "Истинное логическое значение",
- "empty-string": "Пустая строка",
- "null-value": "Пустое значение",
- "number-value": "Значение 0"
- },
- "label": {
- "empty": "Пусто",
- "false": "Ложь",
- "null": "Пустое значение",
- "true": "Истина",
- "zero": "Нуль"
- }
}
},
"histogram-transformer-editor": {
@@ -13728,6 +13744,22 @@
"perform-spatial-operations": "",
"reformat": "",
"reorder-and-rename": ""
+ },
+ "special-value-options": {
+ "description": {
+ "boolean-false": "",
+ "boolean-true": "",
+ "empty-string": "",
+ "null-value": "",
+ "number-value": ""
+ },
+ "label": {
+ "boolean-false": "",
+ "boolean-true": "",
+ "empty-string": "",
+ "null-value": "",
+ "number-value": ""
+ }
}
},
"wide-info": {
diff --git a/public/locales/sv-SE/grafana.json b/public/locales/sv-SE/grafana.json
index c25f9d8d19b..98a11222fab 100644
--- a/public/locales/sv-SE/grafana.json
+++ b/public/locales/sv-SE/grafana.json
@@ -3563,12 +3563,12 @@
"tags-column": "Taggar"
},
"delete-provisioned-folder-form": {
- "alert-folder-deleted-successfully": "",
"api-error": "",
"button-cancel": "",
"button-delete": "",
"button-deleting": "",
- "delete-warning": ""
+ "delete-warning": "",
+ "success-message": ""
},
"descendant-count": {
"title-unable-to-retrieve-descendant-information": "Det gick inte att hämta underordnad information"
@@ -3611,7 +3611,6 @@
},
"new-provisioned-folder-form": {
"alert-error-creating-folder": "Fel när mapp skulle skapas",
- "alert-folder-created-successfully": "Mappen skapades",
"button-create": "Skapa",
"button-creating": "Skapar …",
"cancel": "Avbryt",
@@ -3759,7 +3758,6 @@
}
},
"description-experimental-types": "",
- "description-infinite-panning": "",
"description-inline-editing": "",
"description-pan-zoom": "",
"direction-options": {
@@ -3860,7 +3858,6 @@
"name-align-text": "",
"name-color": "",
"name-experimental-types": "",
- "name-infinite-panning": "",
"name-inline-editing": "",
"name-pan-zoom": "",
"name-text": "",
@@ -5645,6 +5642,7 @@
"delete-read-only-file-message": "",
"deleting": "Tar bort ...",
"drawer-title": "",
+ "success-message": "",
"title-this-repository-is-read-only": "Den här databasen är skrivskyddad"
},
"description-label": {
@@ -5657,9 +5655,6 @@
}
}
},
- "edit-provisioned-dashboard-form": {
- "success": ""
- },
"email-list": {
"aria-label-emailmenu": "Växla e-postmeny"
},
@@ -5818,6 +5813,7 @@
"usage-count_other": "Används på {{count}} instrumentpaneler"
},
"move-provisioned-dashboard-form": {
+ "alert-error-moving-dashboard": "",
"api-error": "",
"cancel-action": "",
"current-file-not-found": "",
@@ -5827,6 +5823,7 @@
"move-action": "",
"move-read-only-message": "",
"moving": "",
+ "success-message": "",
"target-path-label": "",
"title-this-repository-is-read-only": ""
},
@@ -9365,6 +9362,15 @@
"show-more": "visa mer",
"tooltip-error": "Fel: {{errorMessage}}"
},
+ "log-line-context": {
+ "center-matched-line": "",
+ "newer-logs": "",
+ "no-more-logs-available": "",
+ "older-logs": "",
+ "open-in-split-view": "",
+ "title-log-context": "",
+ "title-log-line": ""
+ },
"log-line-details": {
"clear-search": "",
"close": "",
@@ -11015,6 +11021,9 @@
"title-created-branch-in-repo": "",
"title-loaded-pull-request-in-repo": ""
},
+ "provisioned-resource-request-handler": "",
+ "provisioned-resource-request-handler-dashboard": "",
+ "provisioned-resource-request-handler-folder": "",
"provisioning": {
"banner": {
"message": "Den här funktionen är för närvarande under aktiv utveckling. För den bästa upplevelsen och de senaste förbättringarna rekommenderar vi att du använder <2> nightly-versionen2> av Grafana."
@@ -11874,7 +11883,7 @@
"recommended": "Rekommenderas",
"results": "Resultat"
},
- "search": "Sök"
+ "search": ""
}
},
"search": {
@@ -12511,6 +12520,19 @@
"label-medium": "",
"label-small": ""
},
+ "cell-types": {
+ "actions": "",
+ "auto": "",
+ "color-background": "",
+ "color-text": "",
+ "data-links": "",
+ "gauge": "",
+ "image": "",
+ "json": "",
+ "markdown": "",
+ "pill": "",
+ "sparkline": ""
+ },
"color-background-cell-options-editor": {
"description-apply-to-entire-row": "Om valt kommer hela raden att färgas som denna cell skulle vara.",
"description-wrap-text": "Om vald text kommer att radbrytas till textbredden i den konfigurerade kolumnen",
@@ -12545,6 +12567,13 @@
"label-alt-text": "Alt text",
"label-title-text": "Rubriktext"
},
+ "markdown-cell-options-editor": {
+ "description-dynamic-height": "",
+ "label": {
+ "text-alpha": ""
+ },
+ "label-dynamic-height": ""
+ },
"name-calculation": "",
"name-cell-height": "",
"name-cell-type": "",
@@ -12561,7 +12590,10 @@
"name-show-table-header": "",
"name-wrap-header-text": "",
"placeholder-column-width": "",
- "placeholder-fields": ""
+ "placeholder-fields": "",
+ "text-wrap-options": {
+ "label-wrap-text": ""
+ }
},
"table-new": {
"category-cell-options": "",
@@ -13276,22 +13308,6 @@
"label-row": "Rad",
"name": {
"grouping-to-matrix": ""
- },
- "special-value-options": {
- "description": {
- "boolean-false-value": "Booleskt falskt värde",
- "boolean-true-value": "Booleskt sant värde",
- "empty-string": "Tom sträng",
- "null-value": "Null-värde",
- "number-value": "Nummer 0-värde"
- },
- "label": {
- "empty": "Tom",
- "false": "Falskt",
- "null": "Noll",
- "true": "Sant",
- "zero": "Noll"
- }
}
},
"histogram-transformer-editor": {
@@ -13644,6 +13660,22 @@
"perform-spatial-operations": "",
"reformat": "",
"reorder-and-rename": ""
+ },
+ "special-value-options": {
+ "description": {
+ "boolean-false": "",
+ "boolean-true": "",
+ "empty-string": "",
+ "null-value": "",
+ "number-value": ""
+ },
+ "label": {
+ "boolean-false": "",
+ "boolean-true": "",
+ "empty-string": "",
+ "null-value": "",
+ "number-value": ""
+ }
}
},
"wide-info": {
diff --git a/public/locales/tr-TR/grafana.json b/public/locales/tr-TR/grafana.json
index ae7289f7817..4b8046692cc 100644
--- a/public/locales/tr-TR/grafana.json
+++ b/public/locales/tr-TR/grafana.json
@@ -3563,12 +3563,12 @@
"tags-column": "Etiketler"
},
"delete-provisioned-folder-form": {
- "alert-folder-deleted-successfully": "",
"api-error": "",
"button-cancel": "",
"button-delete": "",
"button-deleting": "",
- "delete-warning": ""
+ "delete-warning": "",
+ "success-message": ""
},
"descendant-count": {
"title-unable-to-retrieve-descendant-information": "Alt öge bilgileri alınamıyor"
@@ -3611,7 +3611,6 @@
},
"new-provisioned-folder-form": {
"alert-error-creating-folder": "Klasör oluşturulurken hata oluştu",
- "alert-folder-created-successfully": "Klasör başarıyla oluşturuldu",
"button-create": "Oluştur",
"button-creating": "Oluşturuluyor...",
"cancel": "İptal",
@@ -3759,7 +3758,6 @@
}
},
"description-experimental-types": "",
- "description-infinite-panning": "",
"description-inline-editing": "",
"description-pan-zoom": "",
"direction-options": {
@@ -3860,7 +3858,6 @@
"name-align-text": "",
"name-color": "",
"name-experimental-types": "",
- "name-infinite-panning": "",
"name-inline-editing": "",
"name-pan-zoom": "",
"name-text": "",
@@ -5645,6 +5642,7 @@
"delete-read-only-file-message": "",
"deleting": "Siliniyor...",
"drawer-title": "",
+ "success-message": "",
"title-this-repository-is-read-only": "Bu depo salt okunur"
},
"description-label": {
@@ -5657,9 +5655,6 @@
}
}
},
- "edit-provisioned-dashboard-form": {
- "success": ""
- },
"email-list": {
"aria-label-emailmenu": "E-posta menüsünü aç/kapat"
},
@@ -5818,6 +5813,7 @@
"usage-count_other": "{{count}} panoda kullanılıyor"
},
"move-provisioned-dashboard-form": {
+ "alert-error-moving-dashboard": "",
"api-error": "",
"cancel-action": "",
"current-file-not-found": "",
@@ -5827,6 +5823,7 @@
"move-action": "",
"move-read-only-message": "",
"moving": "",
+ "success-message": "",
"target-path-label": "",
"title-this-repository-is-read-only": ""
},
@@ -9365,6 +9362,15 @@
"show-more": "daha fazla göster",
"tooltip-error": "Hata: {{errorMessage}}"
},
+ "log-line-context": {
+ "center-matched-line": "",
+ "newer-logs": "",
+ "no-more-logs-available": "",
+ "older-logs": "",
+ "open-in-split-view": "",
+ "title-log-context": "",
+ "title-log-line": ""
+ },
"log-line-details": {
"clear-search": "",
"close": "",
@@ -11015,6 +11021,9 @@
"title-created-branch-in-repo": "",
"title-loaded-pull-request-in-repo": ""
},
+ "provisioned-resource-request-handler": "",
+ "provisioned-resource-request-handler-dashboard": "",
+ "provisioned-resource-request-handler-folder": "",
"provisioning": {
"banner": {
"message": "Bu özellik şu anda aktif geliştirme aşamasındadır. En iyi deneyim ve en yeni geliştirmeler için Grafana'nın <2>gecelik derleme2> sürümünü kullanmanızı öneririz."
@@ -11874,7 +11883,7 @@
"recommended": "Önerilen",
"results": "Sonuçlar"
},
- "search": "Ara"
+ "search": ""
}
},
"search": {
@@ -12511,6 +12520,19 @@
"label-medium": "",
"label-small": ""
},
+ "cell-types": {
+ "actions": "",
+ "auto": "",
+ "color-background": "",
+ "color-text": "",
+ "data-links": "",
+ "gauge": "",
+ "image": "",
+ "json": "",
+ "markdown": "",
+ "pill": "",
+ "sparkline": ""
+ },
"color-background-cell-options-editor": {
"description-apply-to-entire-row": "Seçilirse tüm satır bu hücre gibi renklendirilecektir.",
"description-wrap-text": "Seçilirse metin yapılandırılan sütunun metin genişliğine göre sığdırılır",
@@ -12545,6 +12567,13 @@
"label-alt-text": "Alternatif metin",
"label-title-text": "Başlık metni"
},
+ "markdown-cell-options-editor": {
+ "description-dynamic-height": "",
+ "label": {
+ "text-alpha": ""
+ },
+ "label-dynamic-height": ""
+ },
"name-calculation": "",
"name-cell-height": "",
"name-cell-type": "",
@@ -12561,7 +12590,10 @@
"name-show-table-header": "",
"name-wrap-header-text": "",
"placeholder-column-width": "",
- "placeholder-fields": ""
+ "placeholder-fields": "",
+ "text-wrap-options": {
+ "label-wrap-text": ""
+ }
},
"table-new": {
"category-cell-options": "",
@@ -13276,22 +13308,6 @@
"label-row": "Satır",
"name": {
"grouping-to-matrix": ""
- },
- "special-value-options": {
- "description": {
- "boolean-false-value": "Boole yanlış değeri",
- "boolean-true-value": "Boole doğru değeri",
- "empty-string": "Boş dize",
- "null-value": "Boş değer",
- "number-value": "0 sayısı değeri"
- },
- "label": {
- "empty": "Boş",
- "false": "Yanlış",
- "null": "Boş",
- "true": "Doğru",
- "zero": "Sıfır"
- }
}
},
"histogram-transformer-editor": {
@@ -13644,6 +13660,22 @@
"perform-spatial-operations": "",
"reformat": "",
"reorder-and-rename": ""
+ },
+ "special-value-options": {
+ "description": {
+ "boolean-false": "",
+ "boolean-true": "",
+ "empty-string": "",
+ "null-value": "",
+ "number-value": ""
+ },
+ "label": {
+ "boolean-false": "",
+ "boolean-true": "",
+ "empty-string": "",
+ "null-value": "",
+ "number-value": ""
+ }
}
},
"wide-info": {
diff --git a/public/locales/zh-Hans/grafana.json b/public/locales/zh-Hans/grafana.json
index 6a0e7daee75..e6fa0ac67e1 100644
--- a/public/locales/zh-Hans/grafana.json
+++ b/public/locales/zh-Hans/grafana.json
@@ -3544,12 +3544,12 @@
"tags-column": "标签"
},
"delete-provisioned-folder-form": {
- "alert-folder-deleted-successfully": "文件夹已成功删除",
"api-error": "删除文件夹失败",
"button-cancel": "取消",
"button-delete": "删除",
"button-deleting": "正在删除...",
- "delete-warning": "这将删除此文件夹及其所有子文件夹。总体而言,这将影响:"
+ "delete-warning": "这将删除此文件夹及其所有子文件夹。总体而言,这将影响:",
+ "success-message": ""
},
"descendant-count": {
"title-unable-to-retrieve-descendant-information": "无法检索后代信息"
@@ -3592,7 +3592,6 @@
},
"new-provisioned-folder-form": {
"alert-error-creating-folder": "创建文件夹时出错",
- "alert-folder-created-successfully": "文件夹创建成功",
"button-create": "创建",
"button-creating": "正在创建...",
"cancel": "取消",
@@ -3740,7 +3739,6 @@
}
},
"description-experimental-types": "启用实验元素类型的选择",
- "description-infinite-panning": "启用无限平移 - 适用于内容宽广的画布。警告:这是一项实验性功能,目前仅适用于受顶部/左侧约束的元素",
"description-inline-editing": "启用直接编辑面板",
"description-pan-zoom": "启用平移和缩放",
"direction-options": {
@@ -3841,7 +3839,6 @@
"name-align-text": "对齐文字",
"name-color": "文字颜色",
"name-experimental-types": "实验性元素类型",
- "name-infinite-panning": "无限平移",
"name-inline-editing": "嵌入式编辑",
"name-pan-zoom": "平移和缩放",
"name-text": "文字",
@@ -5625,6 +5622,7 @@
"delete-read-only-file-message": "此数据面板无法直接从 Grafana 删除,因为存储库是只读的。要删除此数据面板,请从 Git 存储库中移除相应文件。",
"deleting": "正在删除...",
"drawer-title": "删除已预置的数据面板",
+ "success-message": "",
"title-this-repository-is-read-only": "此存储库为只读"
},
"description-label": {
@@ -5637,9 +5635,6 @@
}
}
},
- "edit-provisioned-dashboard-form": {
- "success": "数据面板更改已成功保存"
- },
"email-list": {
"aria-label-emailmenu": "切换电子邮件菜单"
},
@@ -5797,6 +5792,7 @@
"usage-count_other": "用于 {{count}} 个数据面板"
},
"move-provisioned-dashboard-form": {
+ "alert-error-moving-dashboard": "",
"api-error": "",
"cancel-action": "",
"current-file-not-found": "",
@@ -5806,6 +5802,7 @@
"move-action": "",
"move-read-only-message": "",
"moving": "",
+ "success-message": "",
"target-path-label": "",
"title-this-repository-is-read-only": ""
},
@@ -9335,6 +9332,15 @@
"show-more": "展开",
"tooltip-error": "错误:{{errorMessage}}"
},
+ "log-line-context": {
+ "center-matched-line": "",
+ "newer-logs": "",
+ "no-more-logs-available": "",
+ "older-logs": "",
+ "open-in-split-view": "",
+ "title-log-context": "",
+ "title-log-line": ""
+ },
"log-line-details": {
"clear-search": "清除",
"close": "关闭日志详情",
@@ -10982,6 +10988,9 @@
"title-created-branch-in-repo": "",
"title-loaded-pull-request-in-repo": ""
},
+ "provisioned-resource-request-handler": "",
+ "provisioned-resource-request-handler-dashboard": "",
+ "provisioned-resource-request-handler-folder": "",
"provisioning": {
"banner": {
"message": "此功能目前正在积极开发中。为了获得最佳体验和最新改进,我们建议您使用 Grafana 的<2>夜间版本2>。"
@@ -11834,7 +11843,7 @@
"recommended": "推荐",
"results": "结果"
},
- "search": "搜索"
+ "search": ""
}
},
"search": {
@@ -12469,6 +12478,19 @@
"label-medium": "中",
"label-small": "小"
},
+ "cell-types": {
+ "actions": "",
+ "auto": "",
+ "color-background": "",
+ "color-text": "",
+ "data-links": "",
+ "gauge": "",
+ "image": "",
+ "json": "",
+ "markdown": "",
+ "pill": "",
+ "sparkline": ""
+ },
"color-background-cell-options-editor": {
"description-apply-to-entire-row": "如果选中,整行将按此单元格的颜色显示。",
"description-wrap-text": "如果选中,文本将根据配置列的文本宽度自动换行",
@@ -12503,6 +12525,13 @@
"label-alt-text": "替代文本",
"label-title-text": "标题文本"
},
+ "markdown-cell-options-editor": {
+ "description-dynamic-height": "",
+ "label": {
+ "text-alpha": ""
+ },
+ "label-dynamic-height": ""
+ },
"name-calculation": "计算",
"name-cell-height": "单元格高度",
"name-cell-type": "单元格类型",
@@ -12519,7 +12548,10 @@
"name-show-table-header": "显示表格表头",
"name-wrap-header-text": "表头文字换行",
"placeholder-column-width": "自动",
- "placeholder-fields": "所有数字字段"
+ "placeholder-fields": "所有数字字段",
+ "text-wrap-options": {
+ "label-wrap-text": ""
+ }
},
"table-new": {
"category-cell-options": "单元格选项",
@@ -13234,22 +13266,6 @@
"label-row": "行",
"name": {
"grouping-to-matrix": ""
- },
- "special-value-options": {
- "description": {
- "boolean-false-value": "布尔值假值",
- "boolean-true-value": "布尔值真值",
- "empty-string": "空字符串",
- "null-value": "Null 值",
- "number-value": "数字 0 值"
- },
- "label": {
- "empty": "空",
- "false": "False",
- "null": "Null",
- "true": "True",
- "zero": "零"
- }
}
},
"histogram-transformer-editor": {
@@ -13602,6 +13618,22 @@
"perform-spatial-operations": "",
"reformat": "",
"reorder-and-rename": ""
+ },
+ "special-value-options": {
+ "description": {
+ "boolean-false": "",
+ "boolean-true": "",
+ "empty-string": "",
+ "null-value": "",
+ "number-value": ""
+ },
+ "label": {
+ "boolean-false": "",
+ "boolean-true": "",
+ "empty-string": "",
+ "null-value": "",
+ "number-value": ""
+ }
}
},
"wide-info": {
diff --git a/public/locales/zh-Hant/grafana.json b/public/locales/zh-Hant/grafana.json
index 13ff7bc7f60..6ef2565677b 100644
--- a/public/locales/zh-Hant/grafana.json
+++ b/public/locales/zh-Hant/grafana.json
@@ -3544,12 +3544,12 @@
"tags-column": "標籤"
},
"delete-provisioned-folder-form": {
- "alert-folder-deleted-successfully": "已成功刪除資料夾",
"api-error": "無法刪除資料夾",
"button-cancel": "取消",
"button-delete": "刪除",
"button-deleting": "正在刪除…",
- "delete-warning": "這將刪除此資料夾及其所有子資料夾。總體而言,這會影響:"
+ "delete-warning": "這將刪除此資料夾及其所有子資料夾。總體而言,這會影響:",
+ "success-message": ""
},
"descendant-count": {
"title-unable-to-retrieve-descendant-information": "無法擷取子系資訊"
@@ -3592,7 +3592,6 @@
},
"new-provisioned-folder-form": {
"alert-error-creating-folder": "建立資料夾時發生錯誤",
- "alert-folder-created-successfully": "已成功建立資料夾",
"button-create": "建立",
"button-creating": "正在建立…",
"cancel": "取消",
@@ -3740,7 +3739,6 @@
}
},
"description-experimental-types": "啟用實驗元素類型的選擇",
- "description-infinite-panning": "啟用無限平移 - 適用於寬敞的畫布。警告:這是一項實驗功能,目前僅適用於頂端/左側受限的元素",
"description-inline-editing": "啟用直接編輯面板",
"description-pan-zoom": "啟用平移和縮放",
"direction-options": {
@@ -3841,7 +3839,6 @@
"name-align-text": "對齊文字",
"name-color": "文字色彩",
"name-experimental-types": "實驗性元素類型",
- "name-infinite-panning": "無限平移",
"name-inline-editing": "直接編輯",
"name-pan-zoom": "平移和縮放",
"name-text": "文字",
@@ -5625,6 +5622,7 @@
"delete-read-only-file-message": "由於儲存庫為唯讀,因此無法直接從 Grafana 刪除此儀表板。若要刪除此儀表板,請從您的 Git 儲存庫中移除該檔案。",
"deleting": "正在刪除…",
"drawer-title": "刪除已佈建的儀表板",
+ "success-message": "",
"title-this-repository-is-read-only": "此存放庫為唯讀"
},
"description-label": {
@@ -5637,9 +5635,6 @@
}
}
},
- "edit-provisioned-dashboard-form": {
- "success": "儀表板變更已成功儲存"
- },
"email-list": {
"aria-label-emailmenu": "切換電子郵件選單"
},
@@ -5797,6 +5792,7 @@
"usage-count_other": "用於 {{count}} 個儀表板"
},
"move-provisioned-dashboard-form": {
+ "alert-error-moving-dashboard": "",
"api-error": "",
"cancel-action": "",
"current-file-not-found": "",
@@ -5806,6 +5802,7 @@
"move-action": "",
"move-read-only-message": "",
"moving": "",
+ "success-message": "",
"target-path-label": "",
"title-this-repository-is-read-only": ""
},
@@ -9335,6 +9332,15 @@
"show-more": "顯示更多",
"tooltip-error": "錯誤:{{errorMessage}}"
},
+ "log-line-context": {
+ "center-matched-line": "",
+ "newer-logs": "",
+ "no-more-logs-available": "",
+ "older-logs": "",
+ "open-in-split-view": "",
+ "title-log-context": "",
+ "title-log-line": ""
+ },
"log-line-details": {
"clear-search": "清除",
"close": "關閉紀錄詳細資訊",
@@ -10982,6 +10988,9 @@
"title-created-branch-in-repo": "",
"title-loaded-pull-request-in-repo": ""
},
+ "provisioned-resource-request-handler": "",
+ "provisioned-resource-request-handler-dashboard": "",
+ "provisioned-resource-request-handler-folder": "",
"provisioning": {
"banner": {
"message": "此功能目前正在積極開發中。為了獲得最佳體驗和最新改進版本,建議使用 Grafana 的<2>夜間版本2>。"
@@ -11834,7 +11843,7 @@
"recommended": "建議",
"results": "結果"
},
- "search": "搜尋"
+ "search": ""
}
},
"search": {
@@ -12469,6 +12478,19 @@
"label-medium": "中",
"label-small": "小"
},
+ "cell-types": {
+ "actions": "",
+ "auto": "",
+ "color-background": "",
+ "color-text": "",
+ "data-links": "",
+ "gauge": "",
+ "image": "",
+ "json": "",
+ "markdown": "",
+ "pill": "",
+ "sparkline": ""
+ },
"color-background-cell-options-editor": {
"description-apply-to-entire-row": "若選取,整列將以此儲存格的顏色顯示。",
"description-wrap-text": "若選取,文字將依配置欄位的寬度換行",
@@ -12503,6 +12525,13 @@
"label-alt-text": "替代文字",
"label-title-text": "標題文字"
},
+ "markdown-cell-options-editor": {
+ "description-dynamic-height": "",
+ "label": {
+ "text-alpha": ""
+ },
+ "label-dynamic-height": ""
+ },
"name-calculation": "計算",
"name-cell-height": "儲存格高度",
"name-cell-type": "儲存格類型",
@@ -12519,7 +12548,10 @@
"name-show-table-header": "顯示表格頁首",
"name-wrap-header-text": "換行標題文字",
"placeholder-column-width": "自動",
- "placeholder-fields": "所有數值欄位"
+ "placeholder-fields": "所有數值欄位",
+ "text-wrap-options": {
+ "label-wrap-text": ""
+ }
},
"table-new": {
"category-cell-options": "儲存格選項",
@@ -13234,22 +13266,6 @@
"label-row": "列",
"name": {
"grouping-to-matrix": ""
- },
- "special-value-options": {
- "description": {
- "boolean-false-value": "布林假值",
- "boolean-true-value": "布林真值",
- "empty-string": "空字串",
- "null-value": "空值",
- "number-value": "數字 0 值"
- },
- "label": {
- "empty": "空",
- "false": "錯誤",
- "null": "空值",
- "true": "正確",
- "zero": "零"
- }
}
},
"histogram-transformer-editor": {
@@ -13602,6 +13618,22 @@
"perform-spatial-operations": "",
"reformat": "",
"reorder-and-rename": ""
+ },
+ "special-value-options": {
+ "description": {
+ "boolean-false": "",
+ "boolean-true": "",
+ "empty-string": "",
+ "null-value": "",
+ "number-value": ""
+ },
+ "label": {
+ "boolean-false": "",
+ "boolean-true": "",
+ "empty-string": "",
+ "null-value": "",
+ "number-value": ""
+ }
}
},
"wide-info": {
diff --git a/scripts/cleanup-husky.sh b/scripts/cleanup-husky.sh
index bb9ed8bc490..91f53a9b2a6 100755
--- a/scripts/cleanup-husky.sh
+++ b/scripts/cleanup-husky.sh
@@ -49,7 +49,16 @@ for hookName in "${oldHuskyHookNames[@]}"; do
echo "Renaming old husky hook $hookPath to $newHookPath"
fi
- mv "$hookPath" "$newHookPath" --suffix=old --backup=numbered
+ # Handle backup logic for both macOS (BSD mv) and Linux (GNU mv)
+ if [[ -f "$newHookPath" ]]; then
+ # If .old file already exists, create numbered backup
+ counter=1
+ while [[ -f "$newHookPath.$counter" ]]; do
+ counter=$((counter + 1))
+ done
+ mv "$newHookPath" "$newHookPath.$counter"
+ fi
+ mv "$hookPath" "$newHookPath"
fi
fi
done
diff --git a/scripts/generate-rtk-apis.ts b/scripts/generate-rtk-apis.ts
index 792594a91e1..2082e222156 100644
--- a/scripts/generate-rtk-apis.ts
+++ b/scripts/generate-rtk-apis.ts
@@ -79,6 +79,17 @@ const config: ConfigFile = {
filterEndpoints: ['listPlaylist', 'getPlaylist', 'createPlaylist', 'deletePlaylist', 'replacePlaylist'],
tag: true,
},
+ '../public/app/api/clients/dashboard/v0alpha1/endpoints.gen.ts': {
+ apiFile: '../public/app/api/clients/dashboard/v0alpha1/baseAPI.ts',
+ schemaFile: '../data/openapi/dashboard.grafana.app-v0alpha1.json',
+ filterEndpoints: [
+ // Do not use any other endpoints from this version
+ // If other endpoints are required, they must be used from a newer version of the dashboard API
+ 'getSearch',
+ ],
+ tag: true,
+ },
+
// PLOP_INJECT_API_CLIENT - Used by the API client generator
},
};
diff --git a/scripts/grafana-server/start-server b/scripts/grafana-server/start-server
index 71b6f929510..d9581910b83 100755
--- a/scripts/grafana-server/start-server
+++ b/scripts/grafana-server/start-server
@@ -25,7 +25,7 @@ echo starting server
# air now deletes the binary, so we check if we need to build it before trying to start the server
# see https://github.com/air-verse/air/issues/525
# if this gets resolved, we could remove the go build and rely on the binary being present as before
-if [[ ! -f ./bin/grafana ]]; then
+if [[ ! -f ./bin/"$ARCH"grafana ]]; then
make GO_BUILD_DEV=1 build-go-fast
fi
diff --git a/yarn.lock b/yarn.lock
index 4fd15247adf..922fada0a5c 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -111,13 +111,14 @@ __metadata:
languageName: node
linkType: hard
-"@babel/code-frame@npm:7.25.7":
- version: 7.25.7
- resolution: "@babel/code-frame@npm:7.25.7"
+"@babel/code-frame@npm:7.26.2":
+ version: 7.26.2
+ resolution: "@babel/code-frame@npm:7.26.2"
dependencies:
- "@babel/highlight": "npm:^7.25.7"
+ "@babel/helper-validator-identifier": "npm:^7.25.9"
+ js-tokens: "npm:^4.0.0"
picocolors: "npm:^1.0.0"
- checksum: 10/000fb8299fb35b6217d4f6c6580dcc1fa2f6c0f82d0a54b8a029966f633a8b19b490a7a906b56a94e9d8bee91c3bc44c74c44c33fb0abaa588202f6280186291
+ checksum: 10/db2c2122af79d31ca916755331bb4bac96feb2b334cdaca5097a6b467fdd41963b89b14b6836a14f083de7ff887fc78fa1b3c10b14e743d33e12dbfe5ee3d223
languageName: node
linkType: hard
@@ -386,18 +387,6 @@ __metadata:
languageName: node
linkType: hard
-"@babel/highlight@npm:^7.25.7":
- version: 7.25.9
- resolution: "@babel/highlight@npm:7.25.9"
- dependencies:
- "@babel/helper-validator-identifier": "npm:^7.25.9"
- chalk: "npm:^2.4.2"
- js-tokens: "npm:^4.0.0"
- picocolors: "npm:^1.0.0"
- checksum: 10/0d165283dd4eb312292cea8fec3ae0d376874b1885f476014f0136784ed5b564b2c2ba2d270587ed546ee92505056dab56493f7960c01c4e6394d71d1b2e7db6
- languageName: node
- linkType: hard
-
"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.27.2, @babel/parser@npm:^7.28.0":
version: 7.28.0
resolution: "@babel/parser@npm:7.28.0"
@@ -2060,14 +2049,16 @@ __metadata:
languageName: node
linkType: hard
-"@es-joy/jsdoccomment@npm:~0.49.0":
- version: 0.49.0
- resolution: "@es-joy/jsdoccomment@npm:0.49.0"
+"@es-joy/jsdoccomment@npm:~0.52.0":
+ version: 0.52.0
+ resolution: "@es-joy/jsdoccomment@npm:0.52.0"
dependencies:
+ "@types/estree": "npm:^1.0.8"
+ "@typescript-eslint/types": "npm:^8.34.1"
comment-parser: "npm:1.4.1"
esquery: "npm:^1.6.0"
jsdoc-type-pratt-parser: "npm:~4.1.0"
- checksum: 10/d767cef9b09f22d1892b8bd544eee32aa7b55c585edf6b51452e6f377f205b06f46bd319174022f75794d39625b4b0f8ce75c8a4ea0b7fd0f773063506e0ef4d
+ checksum: 10/e0d349fcaca0fc27e53c685f20836fd7f2a8eeb04462a23dea73eff8cf620c49fd847cb32f86ae8767ae86c0576116451d16478d13d6f45d6ca3f0395b0df9b0
languageName: node
linkType: hard
@@ -2556,8 +2547,8 @@ __metadata:
"@grafana/schema": "npm:12.2.0-pre"
"@grafana/ui": "npm:12.2.0-pre"
"@kusto/monaco-kusto": "npm:^10.0.0"
- "@testing-library/dom": "npm:10.4.0"
- "@testing-library/jest-dom": "npm:6.6.3"
+ "@testing-library/dom": "npm:10.4.1"
+ "@testing-library/jest-dom": "npm:6.6.4"
"@testing-library/react": "npm:16.3.0"
"@testing-library/user-event": "npm:14.6.1"
"@types/jest": "npm:29.5.14"
@@ -2582,7 +2573,7 @@ __metadata:
rxjs: "npm:7.8.2"
ts-node: "npm:10.9.2"
tslib: "npm:2.8.1"
- typescript: "npm:5.8.3"
+ typescript: "npm:5.9.2"
webpack: "npm:5.101.0"
peerDependencies:
"@grafana/runtime": "*"
@@ -2601,7 +2592,7 @@ __metadata:
"@grafana/runtime": "npm:12.2.0-pre"
"@grafana/sql": "npm:12.2.0-pre"
"@grafana/ui": "npm:12.2.0-pre"
- "@testing-library/dom": "npm:10.4.0"
+ "@testing-library/dom": "npm:10.4.1"
"@testing-library/react": "npm:16.3.0"
"@testing-library/user-event": "npm:14.6.1"
"@types/jest": "npm:29.5.14"
@@ -2614,7 +2605,7 @@ __metadata:
rxjs: "npm:7.8.2"
ts-node: "npm:10.9.2"
tslib: "npm:2.8.1"
- typescript: "npm:5.8.3"
+ typescript: "npm:5.9.2"
webpack: "npm:5.101.0"
peerDependencies:
"@grafana/runtime": "*"
@@ -2631,8 +2622,8 @@ __metadata:
"@grafana/runtime": "npm:12.2.0-pre"
"@grafana/schema": "npm:12.2.0-pre"
"@grafana/ui": "npm:12.2.0-pre"
- "@testing-library/dom": "npm:10.4.0"
- "@testing-library/jest-dom": "npm:6.6.3"
+ "@testing-library/dom": "npm:10.4.1"
+ "@testing-library/jest-dom": "npm:6.6.4"
"@testing-library/react": "npm:16.3.0"
"@testing-library/user-event": "npm:14.6.1"
"@types/jest": "npm:29.5.14"
@@ -2654,7 +2645,7 @@ __metadata:
style-loader: "npm:4.0.0"
ts-node: "npm:10.9.2"
tslib: "npm:2.8.1"
- typescript: "npm:5.8.3"
+ typescript: "npm:5.9.2"
webpack: "npm:5.101.0"
peerDependencies:
"@grafana/runtime": "*"
@@ -2672,8 +2663,8 @@ __metadata:
"@grafana/runtime": "npm:12.2.0-pre"
"@grafana/schema": "npm:12.2.0-pre"
"@grafana/ui": "npm:12.2.0-pre"
- "@testing-library/dom": "npm:10.4.0"
- "@testing-library/jest-dom": "npm:6.6.3"
+ "@testing-library/dom": "npm:10.4.1"
+ "@testing-library/jest-dom": "npm:6.6.4"
"@testing-library/react": "npm:16.3.0"
"@testing-library/user-event": "npm:14.6.1"
"@types/d3-random": "npm:^3.0.2"
@@ -2694,7 +2685,7 @@ __metadata:
rxjs: "npm:7.8.2"
ts-node: "npm:10.9.2"
tslib: "npm:2.8.1"
- typescript: "npm:5.8.3"
+ typescript: "npm:5.9.2"
uuid: "npm:11.1.0"
webpack: "npm:5.101.0"
peerDependencies:
@@ -2714,8 +2705,8 @@ __metadata:
"@grafana/plugin-ui": "npm:0.10.7"
"@grafana/runtime": "workspace:*"
"@grafana/ui": "workspace:*"
- "@testing-library/dom": "npm:10.4.0"
- "@testing-library/jest-dom": "npm:6.6.3"
+ "@testing-library/dom": "npm:10.4.1"
+ "@testing-library/jest-dom": "npm:6.6.4"
"@testing-library/react": "npm:16.3.0"
"@testing-library/user-event": "npm:14.6.1"
"@types/jest": "npm:29.5.14"
@@ -2737,7 +2728,7 @@ __metadata:
stream-browserify: "npm:3.0.0"
ts-node: "npm:10.9.2"
tslib: "npm:2.8.1"
- typescript: "npm:5.8.3"
+ typescript: "npm:5.9.2"
uuid: "npm:11.1.0"
webpack: "npm:5.101.0"
peerDependencies:
@@ -2759,8 +2750,8 @@ __metadata:
"@grafana/runtime": "npm:12.2.0-pre"
"@grafana/schema": "npm:12.2.0-pre"
"@grafana/ui": "npm:12.2.0-pre"
- "@testing-library/dom": "npm:10.4.0"
- "@testing-library/jest-dom": "npm:6.6.3"
+ "@testing-library/dom": "npm:10.4.1"
+ "@testing-library/jest-dom": "npm:6.6.4"
"@testing-library/react": "npm:16.3.0"
"@testing-library/user-event": "npm:14.6.1"
"@types/d3-random": "npm:^3.0.2"
@@ -2781,7 +2772,7 @@ __metadata:
rxjs: "npm:7.8.2"
ts-node: "npm:10.9.2"
tslib: "npm:2.8.1"
- typescript: "npm:5.8.3"
+ typescript: "npm:5.9.2"
uuid: "npm:11.1.0"
webpack: "npm:5.101.0"
peerDependencies:
@@ -2802,7 +2793,7 @@ __metadata:
"@grafana/runtime": "npm:12.2.0-pre"
"@grafana/sql": "npm:12.2.0-pre"
"@grafana/ui": "npm:12.2.0-pre"
- "@testing-library/dom": "npm:10.4.0"
+ "@testing-library/dom": "npm:10.4.1"
"@testing-library/react": "npm:16.3.0"
"@testing-library/user-event": "npm:14.6.1"
"@types/jest": "npm:29.5.14"
@@ -2815,7 +2806,7 @@ __metadata:
rxjs: "npm:7.8.2"
ts-node: "npm:10.9.2"
tslib: "npm:2.8.1"
- typescript: "npm:5.8.3"
+ typescript: "npm:5.9.2"
webpack: "npm:5.101.0"
peerDependencies:
"@grafana/runtime": "*"
@@ -2834,7 +2825,7 @@ __metadata:
"@grafana/runtime": "npm:12.2.0-pre"
"@grafana/sql": "npm:12.2.0-pre"
"@grafana/ui": "npm:12.2.0-pre"
- "@testing-library/dom": "npm:10.4.0"
+ "@testing-library/dom": "npm:10.4.1"
"@testing-library/react": "npm:16.3.0"
"@testing-library/user-event": "npm:14.6.1"
"@types/jest": "npm:29.5.14"
@@ -2847,7 +2838,7 @@ __metadata:
rxjs: "npm:7.8.2"
ts-node: "npm:10.9.2"
tslib: "npm:2.8.1"
- typescript: "npm:5.8.3"
+ typescript: "npm:5.9.2"
webpack: "npm:5.101.0"
peerDependencies:
"@grafana/runtime": "*"
@@ -2864,7 +2855,7 @@ __metadata:
"@grafana/runtime": "npm:12.2.0-pre"
"@grafana/schema": "npm:12.2.0-pre"
"@grafana/ui": "npm:12.2.0-pre"
- "@testing-library/dom": "npm:10.4.0"
+ "@testing-library/dom": "npm:10.4.1"
"@testing-library/react": "npm:16.3.0"
"@testing-library/user-event": "npm:14.6.1"
"@types/lodash": "npm:4.17.20"
@@ -2880,7 +2871,7 @@ __metadata:
rxjs: "npm:7.8.2"
ts-node: "npm:10.9.2"
tslib: "npm:2.8.1"
- typescript: "npm:5.8.3"
+ typescript: "npm:5.9.2"
webpack: "npm:5.101.0"
peerDependencies:
"@grafana/runtime": "*"
@@ -2900,8 +2891,8 @@ __metadata:
"@grafana/runtime": "npm:12.2.0-pre"
"@grafana/schema": "npm:12.2.0-pre"
"@grafana/ui": "npm:12.2.0-pre"
- "@testing-library/dom": "npm:10.4.0"
- "@testing-library/jest-dom": "npm:6.6.3"
+ "@testing-library/dom": "npm:10.4.1"
+ "@testing-library/jest-dom": "npm:6.6.4"
"@testing-library/react": "npm:16.3.0"
"@testing-library/user-event": "npm:14.6.1"
"@types/debounce-promise": "npm:3.1.9"
@@ -2927,7 +2918,7 @@ __metadata:
rxjs: "npm:7.8.2"
ts-node: "npm:10.9.2"
tslib: "npm:2.8.1"
- typescript: "npm:5.8.3"
+ typescript: "npm:5.9.2"
webpack: "npm:5.101.0"
peerDependencies:
"@grafana/runtime": "*"
@@ -2954,8 +2945,8 @@ __metadata:
"@opentelemetry/api": "npm:1.9.0"
"@opentelemetry/exporter-collector": "npm:0.25.0"
"@opentelemetry/semantic-conventions": "npm:1.36.0"
- "@testing-library/dom": "npm:10.4.0"
- "@testing-library/jest-dom": "npm:6.6.3"
+ "@testing-library/dom": "npm:10.4.1"
+ "@testing-library/jest-dom": "npm:6.6.4"
"@testing-library/react": "npm:16.3.0"
"@testing-library/user-event": "npm:14.6.1"
"@types/jest": "npm:29.5.14"
@@ -2986,7 +2977,7 @@ __metadata:
string_decoder: "npm:1.3.0"
ts-node: "npm:10.9.2"
tslib: "npm:2.8.1"
- typescript: "npm:5.8.3"
+ typescript: "npm:5.9.2"
uuid: "npm:11.1.0"
webpack: "npm:5.101.0"
peerDependencies:
@@ -3006,8 +2997,8 @@ __metadata:
"@grafana/plugin-ui": "npm:0.10.7"
"@grafana/runtime": "workspace:*"
"@grafana/ui": "workspace:*"
- "@testing-library/dom": "npm:10.4.0"
- "@testing-library/jest-dom": "npm:6.6.3"
+ "@testing-library/dom": "npm:10.4.1"
+ "@testing-library/jest-dom": "npm:6.6.4"
"@testing-library/react": "npm:16.3.0"
"@types/jest": "npm:29.5.14"
"@types/lodash": "npm:4.17.20"
@@ -3023,7 +3014,7 @@ __metadata:
rxjs: "npm:7.8.2"
ts-node: "npm:10.9.2"
tslib: "npm:2.8.1"
- typescript: "npm:5.8.3"
+ typescript: "npm:5.9.2"
webpack: "npm:5.101.0"
peerDependencies:
"@grafana/runtime": "*"
@@ -3054,7 +3045,7 @@ __metadata:
rollup-plugin-esbuild: "npm:6.2.1"
rollup-plugin-node-externals: "npm:^8.0.0"
type-fest: "npm:^4.40.0"
- typescript: "npm:5.8.3"
+ typescript: "npm:5.9.2"
peerDependencies:
"@grafana/runtime": ">=11.6 <= 12.x"
"@grafana/ui": ">=11.6 <= 12.x"
@@ -3065,9 +3056,9 @@ __metadata:
languageName: unknown
linkType: soft
-"@grafana/assistant@npm:0.0.12":
- version: 0.0.12
- resolution: "@grafana/assistant@npm:0.0.12"
+"@grafana/assistant@npm:0.0.13":
+ version: 0.0.13
+ resolution: "@grafana/assistant@npm:0.0.13"
peerDependencies:
"@grafana/data": ">=12.1.0"
"@grafana/runtime": ">=12.1.0"
@@ -3075,7 +3066,7 @@ __metadata:
"@grafana/ui": ">=12.1.0"
react: ">=18.0.0"
rxjs: ">=7.0.0"
- checksum: 10/ebf714e025bc919149fc88b41bf0f9c89805285488324233149d61749a812e7c1c65934e42863f739d87f731af3d8c8ccfa783701587b03d1e6ee844a0a7e7a3
+ checksum: 10/a0e62fe4f7ec84f8954c1e154763ca3248348442daeb2a938f9e473e339438f1c32abaf648f2a10710e4336786a11d96084a079068785a886440172dc4b4b5e8
languageName: node
linkType: hard
@@ -3154,7 +3145,7 @@ __metadata:
string-hash: "npm:^1.1.3"
tinycolor2: "npm:1.6.0"
tslib: "npm:2.8.1"
- typescript: "npm:5.8.3"
+ typescript: "npm:5.9.2"
uplot: "npm:1.6.32"
xss: "npm:^1.0.14"
peerDependencies:
@@ -3178,7 +3169,7 @@ __metadata:
rollup-plugin-node-externals: "npm:^8.0.0"
semver: "npm:^7.7.0"
tslib: "npm:2.8.1"
- typescript: "npm:5.8.3"
+ typescript: "npm:5.9.2"
languageName: unknown
linkType: soft
@@ -3216,7 +3207,7 @@ __metadata:
languageName: unknown
linkType: soft
-"@grafana/faro-core@npm:^1.13.2, @grafana/faro-core@npm:^1.19.0":
+"@grafana/faro-core@npm:^1.19.0":
version: 1.19.0
resolution: "@grafana/faro-core@npm:1.19.0"
dependencies:
@@ -3237,7 +3228,7 @@ __metadata:
languageName: node
linkType: hard
-"@grafana/faro-web-tracing@npm:^1.13.2":
+"@grafana/faro-web-tracing@npm:^1.19.0":
version: 1.19.0
resolution: "@grafana/faro-web-tracing@npm:1.19.0"
dependencies:
@@ -3269,7 +3260,7 @@ __metadata:
"@grafana/ui": "npm:12.2.0-pre"
"@leeoniya/ufuzzy": "npm:1.0.18"
"@rollup/plugin-node-resolve": "npm:16.0.1"
- "@testing-library/dom": "npm:10.4.0"
+ "@testing-library/dom": "npm:10.4.1"
"@testing-library/jest-dom": "npm:^6.1.2"
"@testing-library/react": "npm:16.3.0"
"@testing-library/user-event": "npm:14.6.1"
@@ -3296,7 +3287,7 @@ __metadata:
ts-jest: "npm:29.4.0"
ts-node: "npm:10.9.2"
tslib: "npm:2.8.1"
- typescript: "npm:5.8.3"
+ typescript: "npm:5.9.2"
peerDependencies:
react: ^18.0.0
react-dom: ^18.0.0
@@ -3331,7 +3322,7 @@ __metadata:
react-i18next: "npm:^15.0.0"
rollup: "npm:^4.22.4"
rollup-plugin-copy: "npm:3.5.0"
- typescript: "npm:5.8.3"
+ typescript: "npm:5.9.2"
peerDependencies:
react: ">=18"
languageName: unknown
@@ -3393,7 +3384,7 @@ __metadata:
"@grafana/schema": "npm:12.2.0-pre"
"@grafana/tsconfig": "npm:^2.0.0"
"@grafana/ui": "npm:12.2.0-pre"
- "@testing-library/dom": "npm:10.4.0"
+ "@testing-library/dom": "npm:10.4.1"
"@testing-library/jest-dom": "npm:^6.1.2"
"@testing-library/react": "npm:16.3.0"
"@testing-library/user-event": "npm:14.6.1"
@@ -3409,7 +3400,7 @@ __metadata:
ts-jest: "npm:29.4.0"
ts-node: "npm:10.9.2"
tslib: "npm:2.8.1"
- typescript: "npm:5.8.3"
+ typescript: "npm:5.9.2"
peerDependencies:
react: ^18.0.0
react-dom: ^18.0.0
@@ -3426,7 +3417,7 @@ __metadata:
"@swc/jest": "npm:^0.2.26"
"@types/eslint": "npm:9.6.1"
"@types/webpack-bundle-analyzer": "npm:^4.7.0"
- copy-webpack-plugin: "npm:12.0.2"
+ copy-webpack-plugin: "npm:13.0.0"
eslint: "npm:9.32.0"
eslint-webpack-plugin: "npm:4.2.0"
fork-ts-checker-webpack-plugin: "npm:9.1.0"
@@ -3438,7 +3429,7 @@ __metadata:
replace-in-file-webpack-plugin: "npm:1.0.6"
swc-loader: "npm:0.2.6"
tslib: "npm:2.8.1"
- typescript: "npm:5.8.3"
+ typescript: "npm:5.9.2"
webpack: "npm:5.101.0"
webpack-bundle-analyzer: "npm:^4.10.2"
webpack-virtual-modules: "npm:^0.6.2"
@@ -3512,7 +3503,7 @@ __metadata:
"@rollup/plugin-image": "npm:3.0.3"
"@rollup/plugin-json": "npm:6.1.0"
"@rollup/plugin-node-resolve": "npm:16.0.1"
- "@testing-library/jest-dom": "npm:6.6.3"
+ "@testing-library/jest-dom": "npm:6.6.4"
"@testing-library/react": "npm:16.3.0"
"@testing-library/user-event": "npm:14.6.1"
"@types/debounce-promise": "npm:3.1.9"
@@ -3551,7 +3542,7 @@ __metadata:
rxjs: "npm:7.8.2"
semver: "npm:7.7.2"
testing-library-selector: "npm:0.3.1"
- typescript: "npm:5.8.3"
+ typescript: "npm:5.9.2"
uuid: "npm:11.1.0"
peerDependencies:
react: ^18.0.0
@@ -3571,7 +3562,7 @@ __metadata:
"@grafana/ui": "npm:12.2.0-pre"
"@rollup/plugin-node-resolve": "npm:16.0.1"
"@rollup/plugin-terser": "npm:0.4.4"
- "@testing-library/dom": "npm:10.4.0"
+ "@testing-library/dom": "npm:10.4.1"
"@testing-library/react": "npm:16.3.0"
"@testing-library/user-event": "npm:14.6.1"
"@types/history": "npm:4.7.11"
@@ -3594,18 +3585,18 @@ __metadata:
rollup-plugin-sourcemaps: "npm:0.6.3"
rxjs: "npm:7.8.2"
tslib: "npm:2.8.1"
- typescript: "npm:5.8.3"
+ typescript: "npm:5.9.2"
peerDependencies:
react: ^18.0.0
react-dom: ^18.0.0
languageName: unknown
linkType: soft
-"@grafana/scenes-react@npm:6.28.6":
- version: 6.28.6
- resolution: "@grafana/scenes-react@npm:6.28.6"
+"@grafana/scenes-react@npm:6.29.1":
+ version: 6.29.1
+ resolution: "@grafana/scenes-react@npm:6.29.1"
dependencies:
- "@grafana/scenes": "npm:6.28.6"
+ "@grafana/scenes": "npm:6.29.1"
lru-cache: "npm:^10.2.2"
react-use: "npm:^17.4.0"
peerDependencies:
@@ -3617,13 +3608,13 @@ __metadata:
react: ^18.0.0
react-dom: ^18.0.0
react-router-dom: ^6.28.0
- checksum: 10/55dfe20a6454f218b7c5ab2dc728678885d48e53656d046c125b555b201891e121e0960e108229372c2d70336cfe3dade9b392ed001fef90aec57cbcc13f76ca
+ checksum: 10/0f1d77588b49e3e8e265813b1d9217d6de9501858d0a917e04d55fec070a0c3a0d28a848ccdb17c47badac5e5daa6ae64326387a1822ec1b2163c049402dcb0f
languageName: node
linkType: hard
-"@grafana/scenes@npm:6.28.6":
- version: 6.28.6
- resolution: "@grafana/scenes@npm:6.28.6"
+"@grafana/scenes@npm:6.29.1":
+ version: 6.29.1
+ resolution: "@grafana/scenes@npm:6.29.1"
dependencies:
"@floating-ui/react": "npm:^0.26.16"
"@leeoniya/ufuzzy": "npm:^1.0.16"
@@ -3643,7 +3634,7 @@ __metadata:
react: ^18.0.0
react-dom: ^18.0.0
react-router-dom: ^6.28.0
- checksum: 10/fcfcf663e2eb63ad25fad27ec50af8590b1a6c9e802927e8e457bf2f81d04cf971c2f12f456a04a502c929ec7a1d50ef7118baee095134b133ecc92b269a6907
+ checksum: 10/c93f95929780ec7263193d49d82ea8cae0409b208c598fd1dbae983119d80ffad1b103e01bc0a2801d841b014bd66a458c2852cb60168cdfbd253c5305f61a92
languageName: node
linkType: hard
@@ -3660,7 +3651,7 @@ __metadata:
rollup-plugin-esbuild: "npm:6.2.1"
rollup-plugin-node-externals: "npm:^8.0.0"
tslib: "npm:2.8.1"
- typescript: "npm:5.8.3"
+ typescript: "npm:5.9.2"
languageName: unknown
linkType: soft
@@ -3677,7 +3668,7 @@ __metadata:
"@grafana/tsconfig": "npm:^2.0.0"
"@grafana/ui": "npm:12.2.0-pre"
"@react-awesome-query-builder/ui": "npm:6.6.15"
- "@testing-library/dom": "npm:10.4.0"
+ "@testing-library/dom": "npm:10.4.1"
"@testing-library/jest-dom": "npm:^6.1.2"
"@testing-library/react": "npm:16.3.0"
"@testing-library/user-event": "npm:14.6.1"
@@ -3703,7 +3694,7 @@ __metadata:
ts-jest: "npm:29.4.0"
ts-node: "npm:10.9.2"
tslib: "npm:2.8.1"
- typescript: "npm:5.8.3"
+ typescript: "npm:5.9.2"
uuid: "npm:11.1.0"
peerDependencies:
"@grafana/runtime": 10.4.0-pre
@@ -3721,7 +3712,7 @@ __metadata:
"@types/node": "npm:22.17.0"
jest: "npm:29.7.0"
msw: "npm:2.10.4"
- typescript: "npm:5.8.3"
+ typescript: "npm:5.9.2"
languageName: unknown
linkType: soft
@@ -3774,8 +3765,8 @@ __metadata:
"@storybook/test-runner": "npm:^0.23.0"
"@storybook/theming": "npm:^8.6.2"
"@tanstack/react-virtual": "npm:^3.5.1"
- "@testing-library/dom": "npm:10.4.0"
- "@testing-library/jest-dom": "npm:6.6.3"
+ "@testing-library/dom": "npm:10.4.1"
+ "@testing-library/jest-dom": "npm:6.6.4"
"@testing-library/react": "npm:16.3.0"
"@testing-library/user-event": "npm:14.6.1"
"@types/chance": "npm:^1.1.7"
@@ -3840,7 +3831,7 @@ __metadata:
react-calendar: "npm:^6.0.0"
react-colorful: "npm:5.6.1"
react-custom-scrollbars-2: "npm:4.5.0"
- react-data-grid: "grafana/react-data-grid#de920f0105cb2b7d774444e7443a675f3b568ad6"
+ react-data-grid: "grafana/react-data-grid#a922856b5ede21d55db3fdffb6d38dc76bdc7c58"
react-dom: "npm:18.3.1"
react-dropzone: "npm:14.3.8"
react-highlight-words: "npm:0.21.0"
@@ -3871,7 +3862,7 @@ __metadata:
style-loader: "npm:4.0.0"
tinycolor2: "npm:1.6.0"
tslib: "npm:2.8.1"
- typescript: "npm:5.8.3"
+ typescript: "npm:5.9.2"
uplot: "npm:1.6.32"
uuid: "npm:11.1.0"
uwrap: "npm:0.1.2"
@@ -6212,13 +6203,6 @@ __metadata:
languageName: node
linkType: hard
-"@pkgr/core@npm:^0.1.0":
- version: 0.1.1
- resolution: "@pkgr/core@npm:0.1.1"
- checksum: 10/6f25fd2e3008f259c77207ac9915b02f1628420403b2630c92a07ff963129238c9262afc9e84344c7a23b5cc1f3965e2cd17e3798219f5fd78a63d144d3cceba
- languageName: node
- linkType: hard
-
"@playwright/test@npm:1.54.1":
version: 1.54.1
resolution: "@playwright/test@npm:1.54.1"
@@ -7031,55 +7015,75 @@ __metadata:
languageName: node
linkType: hard
-"@rsdoctor/client@npm:0.4.13":
- version: 0.4.13
- resolution: "@rsdoctor/client@npm:0.4.13"
- checksum: 10/6eaa768eceedf76aa940fcb5980eb39f5960f4f341c13c96ecddac8abb456c8248497dfbc0d7de933d02ad837f761af93bc54d76e84dca45591a6d99f000556b
+"@rsbuild/plugin-check-syntax@npm:1.3.0":
+ version: 1.3.0
+ resolution: "@rsbuild/plugin-check-syntax@npm:1.3.0"
+ dependencies:
+ acorn: "npm:^8.14.0"
+ browserslist-to-es-version: "npm:^1.0.0"
+ htmlparser2: "npm:10.0.0"
+ picocolors: "npm:^1.1.1"
+ source-map: "npm:^0.7.4"
+ peerDependencies:
+ "@rsbuild/core": 1.x
+ peerDependenciesMeta:
+ "@rsbuild/core":
+ optional: true
+ checksum: 10/8fc3729ba91324b936cb46eaeaf6dcc2d8b45d7d00f821af3fed3c14cb38e9174d61f199236658be3ef1046231d80ecc506404f577acc0c057f94711bf10d9da
languageName: node
linkType: hard
-"@rsdoctor/core@npm:0.4.13":
- version: 0.4.13
- resolution: "@rsdoctor/core@npm:0.4.13"
+"@rsdoctor/client@npm:1.1.10":
+ version: 1.1.10
+ resolution: "@rsdoctor/client@npm:1.1.10"
+ checksum: 10/f741188606d5ee04d09be69325f4074d8fac2940590c70a8724c5c9fe87edf78ac9a6fc46f5541db3ca38e36acd0f7a6d6e058564656aa2a73fe76bf37b10a0c
+ languageName: node
+ linkType: hard
+
+"@rsdoctor/core@npm:1.1.10":
+ version: 1.1.10
+ resolution: "@rsdoctor/core@npm:1.1.10"
dependencies:
- "@rsdoctor/graph": "npm:0.4.13"
- "@rsdoctor/sdk": "npm:0.4.13"
- "@rsdoctor/types": "npm:0.4.13"
- "@rsdoctor/utils": "npm:0.4.13"
- axios: "npm:^1.7.9"
+ "@rsbuild/plugin-check-syntax": "npm:1.3.0"
+ "@rsdoctor/graph": "npm:1.1.10"
+ "@rsdoctor/sdk": "npm:1.1.10"
+ "@rsdoctor/types": "npm:1.1.10"
+ "@rsdoctor/utils": "npm:1.1.10"
+ axios: "npm:^1.10.0"
+ browserslist-load-config: "npm:^1.0.0"
enhanced-resolve: "npm:5.12.0"
filesize: "npm:^10.1.6"
fs-extra: "npm:^11.1.1"
lodash: "npm:^4.17.21"
path-browserify: "npm:1.0.1"
- semver: "npm:^7.6.3"
+ semver: "npm:^7.7.2"
source-map: "npm:^0.7.4"
webpack-bundle-analyzer: "npm:^4.10.2"
- checksum: 10/c105de8a0933ec7abf2104762a7db1046f0bd2c418fc67fad8315c44f22cdb5a6ec34dbcf5da24c8a698959d475f120cc598ec012870fe757fc968fbe603ced3
+ checksum: 10/83373048039f6d06ae8a6e419d77c8bd4b9ed094753bb97cd40aa9fcbe6f5f41572672a1b991b5233546fc7e1dd89dadb53a180aefb6b7ad9388be05b87a366c
languageName: node
linkType: hard
-"@rsdoctor/graph@npm:0.4.13":
- version: 0.4.13
- resolution: "@rsdoctor/graph@npm:0.4.13"
+"@rsdoctor/graph@npm:1.1.10":
+ version: 1.1.10
+ resolution: "@rsdoctor/graph@npm:1.1.10"
dependencies:
- "@rsdoctor/types": "npm:0.4.13"
- "@rsdoctor/utils": "npm:0.4.13"
+ "@rsdoctor/types": "npm:1.1.10"
+ "@rsdoctor/utils": "npm:1.1.10"
lodash.unionby: "npm:^4.8.0"
socket.io: "npm:4.8.1"
source-map: "npm:^0.7.4"
- checksum: 10/40080b9726661d51bbec931ec85376039eec9f02c6a5523eb78365dbe0c7d2f86798fa2ff7ca29c13e844c5ab686bd8b6947d064aa0caaa97b06754f8a167ea1
+ checksum: 10/eb752e1ac296fdd90b657052429ed33ba7be8e67bbf29e4ba7d1ab23a5610d0d58789b13275af66c828f6bac86de7ae9942bbdae49468b2302c991695c30e9af
languageName: node
linkType: hard
-"@rsdoctor/sdk@npm:0.4.13":
- version: 0.4.13
- resolution: "@rsdoctor/sdk@npm:0.4.13"
+"@rsdoctor/sdk@npm:1.1.10":
+ version: 1.1.10
+ resolution: "@rsdoctor/sdk@npm:1.1.10"
dependencies:
- "@rsdoctor/client": "npm:0.4.13"
- "@rsdoctor/graph": "npm:0.4.13"
- "@rsdoctor/types": "npm:0.4.13"
- "@rsdoctor/utils": "npm:0.4.13"
+ "@rsdoctor/client": "npm:1.1.10"
+ "@rsdoctor/graph": "npm:1.1.10"
+ "@rsdoctor/types": "npm:1.1.10"
+ "@rsdoctor/utils": "npm:1.1.10"
"@types/fs-extra": "npm:^11.0.4"
body-parser: "npm:1.20.3"
cors: "npm:2.8.5"
@@ -7088,17 +7092,17 @@ __metadata:
json-cycle: "npm:^1.5.0"
lodash: "npm:^4.17.21"
open: "npm:^8.4.2"
- serve-static: "npm:1.16.2"
+ sirv: "npm:2.0.4"
socket.io: "npm:4.8.1"
source-map: "npm:^0.7.4"
- tapable: "npm:2.2.1"
- checksum: 10/017cfe877952038a573d6e498dc4c5da1b0754bd5e50ccaf02e5263581a3ca901600b77b59cd9556cc9baefef8c37b0ccf5e7364342fb080c14e4b72d6005e97
+ tapable: "npm:2.2.2"
+ checksum: 10/1451e931ef5767328af119c948071133bf2a59713d27b9b2451342607c4498996b7834476d98bb74f0c318cfd201e24061f54981cb83a05094ab5873754729ce
languageName: node
linkType: hard
-"@rsdoctor/types@npm:0.4.13":
- version: 0.4.13
- resolution: "@rsdoctor/types@npm:0.4.13"
+"@rsdoctor/types@npm:1.1.10":
+ version: 1.1.10
+ resolution: "@rsdoctor/types@npm:1.1.10"
dependencies:
"@types/connect": "npm:3.4.38"
"@types/estree": "npm:1.0.5"
@@ -7110,21 +7114,22 @@ __metadata:
peerDependenciesMeta:
"@rspack/core":
optional: true
- checksum: 10/a6e51bfc9e88779e9043d6f75420604f2839bbd7f7608a58556374ae74e7191b9a47872f9a426cf76e2e7756c8724550237398e093a415f6b8fbab84fae2dde5
+ webpack:
+ optional: true
+ checksum: 10/3327b8ec1c8feab4fd326f405890c11fc33d532c176a94f2927a5b0fd4e65944e3628b58f1fe0181ed58cf04ca641f5edf130171f5897c90759bb2f1b427696d
languageName: node
linkType: hard
-"@rsdoctor/utils@npm:0.4.13":
- version: 0.4.13
- resolution: "@rsdoctor/utils@npm:0.4.13"
+"@rsdoctor/utils@npm:1.1.10":
+ version: 1.1.10
+ resolution: "@rsdoctor/utils@npm:1.1.10"
dependencies:
- "@babel/code-frame": "npm:7.25.7"
- "@rsdoctor/types": "npm:0.4.13"
+ "@babel/code-frame": "npm:7.26.2"
+ "@rsdoctor/types": "npm:1.1.10"
"@types/estree": "npm:1.0.5"
acorn: "npm:^8.10.0"
- acorn-import-assertions: "npm:1.9.0"
+ acorn-import-attributes: "npm:^1.9.5"
acorn-walk: "npm:8.3.4"
- chalk: "npm:^4.1.2"
connect: "npm:3.7.0"
deep-eql: "npm:4.1.4"
envinfo: "npm:7.14.0"
@@ -7133,26 +7138,27 @@ __metadata:
get-port: "npm:5.1.1"
json-stream-stringify: "npm:3.0.1"
lines-and-columns: "npm:2.0.4"
- rslog: "npm:^1.2.3"
+ picocolors: "npm:^1.1.1"
+ rslog: "npm:^1.2.8"
strip-ansi: "npm:^6.0.1"
- checksum: 10/e102670b4432ee0ed47cda15eef8fc90e703451f3d8c7efe8d7e4817fe92b2702b33a303b156fd5409d6abcc0c5712be3a81817dd21f09dd9a6bec5ecf1c72ef
+ checksum: 10/710a5cf045f26545f6854610144dd14e4d96c87a9887604429cdd14268d0903dbcd45727670b3ff91dac33fb3e2ea948006c0974db57736c146fd571f6c133c3
languageName: node
linkType: hard
-"@rsdoctor/webpack-plugin@npm:^0.4.6":
- version: 0.4.13
- resolution: "@rsdoctor/webpack-plugin@npm:0.4.13"
+"@rsdoctor/webpack-plugin@npm:^1.0.0":
+ version: 1.1.10
+ resolution: "@rsdoctor/webpack-plugin@npm:1.1.10"
dependencies:
- "@rsdoctor/core": "npm:0.4.13"
- "@rsdoctor/graph": "npm:0.4.13"
- "@rsdoctor/sdk": "npm:0.4.13"
- "@rsdoctor/types": "npm:0.4.13"
- "@rsdoctor/utils": "npm:0.4.13"
+ "@rsdoctor/core": "npm:1.1.10"
+ "@rsdoctor/graph": "npm:1.1.10"
+ "@rsdoctor/sdk": "npm:1.1.10"
+ "@rsdoctor/types": "npm:1.1.10"
+ "@rsdoctor/utils": "npm:1.1.10"
fs-extra: "npm:^11.1.1"
lodash: "npm:^4.17.21"
peerDependencies:
webpack: 5.x
- checksum: 10/f244ef8f1b28192cb766d66099e6999ba5a042d19bd1ab29f023f4844807a6a444e26a73b31a077e03c600979d5f10ec70fd1a42e9af9766b6f22241f124b990
+ checksum: 10/7cca30b682137f1af3407b586359f0387a744b64d68de09aa42a36009aa36cf62c386d45f2d4d49e5b45a1d29263e019ca6062e250a0e300ad2b1579ac8dd2d6
languageName: node
linkType: hard
@@ -7344,13 +7350,6 @@ __metadata:
languageName: node
linkType: hard
-"@sindresorhus/merge-streams@npm:^2.1.0":
- version: 2.3.0
- resolution: "@sindresorhus/merge-streams@npm:2.3.0"
- checksum: 10/798bcb53cd1ace9df84fcdd1ba86afdc9e0cd84f5758d26ae9b1eefd8e8887e5fc30051132b9e74daf01bb41fa5a2faf1369361f83d76a3b3d7ee938058fd71c
- languageName: node
- linkType: hard
-
"@sinonjs/commons@npm:^3.0.0":
version: 3.0.0
resolution: "@sinonjs/commons@npm:3.0.0"
@@ -8721,7 +8720,7 @@ __metadata:
languageName: unknown
linkType: soft
-"@testing-library/dom@npm:10.4.0, @testing-library/dom@npm:>=7":
+"@testing-library/dom@npm:10.4.0":
version: 10.4.0
resolution: "@testing-library/dom@npm:10.4.0"
dependencies:
@@ -8737,6 +8736,22 @@ __metadata:
languageName: node
linkType: hard
+"@testing-library/dom@npm:10.4.1, @testing-library/dom@npm:>=7":
+ version: 10.4.1
+ resolution: "@testing-library/dom@npm:10.4.1"
+ dependencies:
+ "@babel/code-frame": "npm:^7.10.4"
+ "@babel/runtime": "npm:^7.12.5"
+ "@types/aria-query": "npm:^5.0.1"
+ aria-query: "npm:5.3.0"
+ dom-accessibility-api: "npm:^0.5.9"
+ lz-string: "npm:^1.5.0"
+ picocolors: "npm:1.1.1"
+ pretty-format: "npm:^27.0.2"
+ checksum: 10/7f93e09ea015f151f8b8f42cbab0b2b858999b5445f15239a72a612ef7716e672b14c40c421218194cf191cbecbde0afa6f3dc2cc83dda93ff6a4fb0237df6e6
+ languageName: node
+ linkType: hard
+
"@testing-library/jest-dom@npm:6.5.0":
version: 6.5.0
resolution: "@testing-library/jest-dom@npm:6.5.0"
@@ -8752,18 +8767,18 @@ __metadata:
languageName: node
linkType: hard
-"@testing-library/jest-dom@npm:6.6.3, @testing-library/jest-dom@npm:^6.1.2, @testing-library/jest-dom@npm:^6.6.3":
- version: 6.6.3
- resolution: "@testing-library/jest-dom@npm:6.6.3"
+"@testing-library/jest-dom@npm:6.6.4, @testing-library/jest-dom@npm:^6.1.2, @testing-library/jest-dom@npm:^6.6.3":
+ version: 6.6.4
+ resolution: "@testing-library/jest-dom@npm:6.6.4"
dependencies:
"@adobe/css-tools": "npm:^4.4.0"
aria-query: "npm:^5.0.0"
- chalk: "npm:^3.0.0"
css.escape: "npm:^1.5.1"
dom-accessibility-api: "npm:^0.6.3"
lodash: "npm:^4.17.21"
+ picocolors: "npm:^1.1.1"
redent: "npm:^3.0.0"
- checksum: 10/1f3427e45870eab9dcc59d6504b780d4a595062fe1687762ae6e67d06a70bf439b40ab64cf58cbace6293a99e3764d4647fdc8300a633b721764f5ce39dade18
+ checksum: 10/5e67112c789f884fb75b279c2cddfdd0995a012a7847a03c474e4134f0d213934ee70c97433bca26b45e3a5ffa56faafe6499c8e57841179c4f2bd80eef429cd
languageName: node
linkType: hard
@@ -9346,6 +9361,16 @@ __metadata:
languageName: node
linkType: hard
+"@types/eslint-scope@npm:^8.0.0":
+ version: 8.3.1
+ resolution: "@types/eslint-scope@npm:8.3.1"
+ dependencies:
+ "@types/eslint": "npm:*"
+ "@types/estree": "npm:*"
+ checksum: 10/54404a6473928b513b9ab3de9de34a52ed3b0524d010b0b068023539bd834617073b74e3052fc51d3c9bff2093d6b85c0af61de55e47c83d6685d4fa0d363d2b
+ languageName: node
+ linkType: hard
+
"@types/eslint@npm:*, @types/eslint@npm:9.6.1":
version: 9.6.1
resolution: "@types/eslint@npm:9.6.1"
@@ -9437,13 +9462,12 @@ __metadata:
languageName: node
linkType: hard
-"@types/glob@npm:^8.0.0":
- version: 8.1.0
- resolution: "@types/glob@npm:8.1.0"
+"@types/glob@npm:^9.0.0":
+ version: 9.0.0
+ resolution: "@types/glob@npm:9.0.0"
dependencies:
- "@types/minimatch": "npm:^5.1.2"
- "@types/node": "npm:*"
- checksum: 10/9101f3a9061e40137190f70626aa0e202369b5ec4012c3fabe6f5d229cce04772db9a94fa5a0eb39655e2e4ad105c38afbb4af56a56c0996a8c7d4fc72350e3d
+ glob: "npm:*"
+ checksum: 10/a9ea3afe1eafbc8fb303d2d39cd786084aece75fd8eeae1bad8febbf6e0323b429145f31e779a3d68fa693b2a53648ec2c639ee4858fb29132f801c74678051c
languageName: node
linkType: hard
@@ -9693,7 +9717,7 @@ __metadata:
languageName: node
linkType: hard
-"@types/minimatch@npm:*, @types/minimatch@npm:^5.1.2":
+"@types/minimatch@npm:*":
version: 5.1.2
resolution: "@types/minimatch@npm:5.1.2"
checksum: 10/94db5060d20df2b80d77b74dd384df3115f01889b5b6c40fa2dfa27cfc03a68fb0ff7c1f2a0366070263eb2e9d6bfd8c87111d4bc3ae93c3f291297c1bf56c85
@@ -10354,7 +10378,7 @@ __metadata:
languageName: node
linkType: hard
-"@typescript-eslint/types@npm:8.38.0, @typescript-eslint/types@npm:^8.38.0, @typescript-eslint/types@npm:^8.9.0":
+"@typescript-eslint/types@npm:8.38.0, @typescript-eslint/types@npm:^8.34.1, @typescript-eslint/types@npm:^8.38.0, @typescript-eslint/types@npm:^8.9.0":
version: 8.38.0
resolution: "@typescript-eslint/types@npm:8.38.0"
checksum: 10/87ac2d199eeadd35157f08deab0929616f74f50a0ed8ec0d6b216bc33755b3fc41615b2386587569c723d6cfa74a3ada428bd31c8f00ea23520213750fd2d297
@@ -10399,7 +10423,7 @@ __metadata:
languageName: node
linkType: hard
-"@typescript-eslint/utils@npm:8.38.0, @typescript-eslint/utils@npm:^6.0.0 || ^7.0.0 || ^8.0.0, @typescript-eslint/utils@npm:^8.13.0, @typescript-eslint/utils@npm:^8.15.0, @typescript-eslint/utils@npm:^8.32.1, @typescript-eslint/utils@npm:^8.33.1, @typescript-eslint/utils@npm:^8.9.0":
+"@typescript-eslint/utils@npm:8.38.0, @typescript-eslint/utils@npm:^8.0.0, @typescript-eslint/utils@npm:^8.13.0, @typescript-eslint/utils@npm:^8.15.0, @typescript-eslint/utils@npm:^8.32.1, @typescript-eslint/utils@npm:^8.33.1, @typescript-eslint/utils@npm:^8.9.0":
version: 8.38.0
resolution: "@typescript-eslint/utils@npm:8.38.0"
dependencies:
@@ -10975,15 +10999,6 @@ __metadata:
languageName: node
linkType: hard
-"acorn-import-assertions@npm:1.9.0":
- version: 1.9.0
- resolution: "acorn-import-assertions@npm:1.9.0"
- peerDependencies:
- acorn: ^8
- checksum: 10/af8dd58f6b0c6a43e85849744534b99f2133835c6fcdabda9eea27d0a0da625a0d323c4793ba7cb25cf4507609d0f747c210ccc2fc9b5866de04b0e59c9c5617
- languageName: node
- linkType: hard
-
"acorn-import-attributes@npm:^1.9.5":
version: 1.9.5
resolution: "acorn-import-attributes@npm:1.9.5"
@@ -11020,7 +11035,7 @@ __metadata:
languageName: node
linkType: hard
-"acorn@npm:^8.0.4, acorn@npm:^8.1.0, acorn@npm:^8.10.0, acorn@npm:^8.11.0, acorn@npm:^8.15.0, acorn@npm:^8.4.1, acorn@npm:^8.7.1, acorn@npm:^8.8.0, acorn@npm:^8.8.2":
+"acorn@npm:^8.0.4, acorn@npm:^8.1.0, acorn@npm:^8.10.0, acorn@npm:^8.11.0, acorn@npm:^8.14.0, acorn@npm:^8.15.0, acorn@npm:^8.4.1, acorn@npm:^8.7.1, acorn@npm:^8.8.0, acorn@npm:^8.8.2":
version: 8.15.0
resolution: "acorn@npm:8.15.0"
bin:
@@ -11764,7 +11779,7 @@ __metadata:
languageName: node
linkType: hard
-"axios@npm:^1, axios@npm:^1.6.1, axios@npm:^1.7.9, axios@npm:^1.8.3, axios@npm:^1.9.0":
+"axios@npm:^1, axios@npm:^1.10.0, axios@npm:^1.6.1, axios@npm:^1.8.3, axios@npm:^1.9.0":
version: 1.11.0
resolution: "axios@npm:1.11.0"
dependencies:
@@ -11806,16 +11821,15 @@ __metadata:
languageName: node
linkType: hard
-"babel-loader@npm:9.2.1":
- version: 9.2.1
- resolution: "babel-loader@npm:9.2.1"
+"babel-loader@npm:10.0.0":
+ version: 10.0.0
+ resolution: "babel-loader@npm:10.0.0"
dependencies:
- find-cache-dir: "npm:^4.0.0"
- schema-utils: "npm:^4.0.0"
+ find-up: "npm:^5.0.0"
peerDependencies:
"@babel/core": ^7.12.0
- webpack: ">=5"
- checksum: 10/f1f24ae3c22d488630629240b0eba9c935545f82ff843c214e8f8df66e266492b7a3d4cb34ef9c9721fb174ca222e900799951c3fd82199473bc6bac52ec03a3
+ webpack: ">=5.61.0"
+ checksum: 10/f22dc803e38a6b29cc61fbc3482f1f42a8787df2a43706dc937d328103ba6b947a223f67706b07af765d415664ad56e9fed00f85b524fe223f3ac3f00b03770b
languageName: node
linkType: hard
@@ -12316,6 +12330,22 @@ __metadata:
languageName: node
linkType: hard
+"browserslist-load-config@npm:^1.0.0":
+ version: 1.0.0
+ resolution: "browserslist-load-config@npm:1.0.0"
+ checksum: 10/6326ef0cddf3d92816aec0a066eda53be769ea55cc1c85cb016935a8976fec7e3351d1c4f7b5a053252c29394a50cd9013de351f4af533b94960d4493c448f08
+ languageName: node
+ linkType: hard
+
+"browserslist-to-es-version@npm:^1.0.0":
+ version: 1.1.0
+ resolution: "browserslist-to-es-version@npm:1.1.0"
+ dependencies:
+ browserslist: "npm:^4.25.1"
+ checksum: 10/5e5bfbd290d4f8e30b2341f0b9c0171dc72359340aef9956aa4db60eb2b1659f2f9e0bbd34e5854901a9b985d1a1a5088bde6f0b26faf3c9c2fe41f2287bb68f
+ languageName: node
+ linkType: hard
+
"browserslist@npm:^4.0.0, browserslist@npm:^4.21.10, browserslist@npm:^4.21.4, browserslist@npm:^4.24.0, browserslist@npm:^4.24.4, browserslist@npm:^4.24.5, browserslist@npm:^4.25.1":
version: 4.25.1
resolution: "browserslist@npm:4.25.1"
@@ -13364,13 +13394,6 @@ __metadata:
languageName: node
linkType: hard
-"common-path-prefix@npm:^3.0.0":
- version: 3.0.0
- resolution: "common-path-prefix@npm:3.0.0"
- checksum: 10/09c180e8d8495d42990d617f4d4b7522b5da20f6b236afe310192d401d1da8147a7835ae1ea37797ba0c2238ef3d06f3492151591451df34539fdb4b2630f2b3
- languageName: node
- linkType: hard
-
"common-tags@npm:1.8.2, common-tags@npm:^1.8.0":
version: 1.8.2
resolution: "common-tags@npm:1.8.2"
@@ -13625,19 +13648,18 @@ __metadata:
languageName: node
linkType: hard
-"copy-webpack-plugin@npm:12.0.2":
- version: 12.0.2
- resolution: "copy-webpack-plugin@npm:12.0.2"
+"copy-webpack-plugin@npm:13.0.0":
+ version: 13.0.0
+ resolution: "copy-webpack-plugin@npm:13.0.0"
dependencies:
- fast-glob: "npm:^3.3.2"
glob-parent: "npm:^6.0.1"
- globby: "npm:^14.0.0"
normalize-path: "npm:^3.0.0"
schema-utils: "npm:^4.2.0"
serialize-javascript: "npm:^6.0.2"
+ tinyglobby: "npm:^0.2.12"
peerDependencies:
webpack: ^5.1.0
- checksum: 10/674725d4d9556b7b9a32bb85393532ef2bb75ffce785d942681b3575a86d900751f67cebbb089ddd050757f58c84edc18732e17880f12c45c9775ca94328526c
+ checksum: 10/209051dd3c0bc7ab97170309cdb1826e642044d2d53e0adc35bb227123c89ae1296a504409325e9b955d7b2d1a505b063f0023e924151d382dbcc92cb9325e6a
languageName: node
linkType: hard
@@ -14741,7 +14763,7 @@ __metadata:
languageName: node
linkType: hard
-"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:^4.3.6, debug@npm:^4.4.0, debug@npm:^4.4.1":
+"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:^4.4.0, debug@npm:^4.4.1":
version: 4.4.1
resolution: "debug@npm:4.4.1"
dependencies:
@@ -15283,14 +15305,14 @@ __metadata:
languageName: node
linkType: hard
-"domutils@npm:^3.0.1, domutils@npm:^3.1.0":
- version: 3.1.0
- resolution: "domutils@npm:3.1.0"
+"domutils@npm:^3.0.1, domutils@npm:^3.1.0, domutils@npm:^3.2.1":
+ version: 3.2.2
+ resolution: "domutils@npm:3.2.2"
dependencies:
dom-serializer: "npm:^2.0.0"
domelementtype: "npm:^2.3.0"
domhandler: "npm:^5.0.3"
- checksum: 10/9a169a6e57ac4c738269a73ab4caf785114ed70e46254139c1bbc8144ac3102aacb28a6149508395ae34aa5d6a40081f4fa5313855dc8319c6d8359866b6dfea
+ checksum: 10/2e08842151aa406f50fe5e6d494f4ec73c2373199fa00d1f77b56ec604e566b7f226312ae35ab8160bb7f27a27c7285d574c8044779053e499282ca9198be210
languageName: node
linkType: hard
@@ -15467,7 +15489,7 @@ __metadata:
languageName: node
linkType: hard
-"encodeurl@npm:^2.0.0, encodeurl@npm:~2.0.0":
+"encodeurl@npm:^2.0.0":
version: 2.0.0
resolution: "encodeurl@npm:2.0.0"
checksum: 10/abf5cd51b78082cf8af7be6785813c33b6df2068ce5191a40ca8b1afe6a86f9230af9a9ce694a5ce4665955e5c1120871826df9c128a642e09c58d592e2807fe
@@ -15616,6 +15638,13 @@ __metadata:
languageName: node
linkType: hard
+"entities@npm:^6.0.0":
+ version: 6.0.1
+ resolution: "entities@npm:6.0.1"
+ checksum: 10/62af1307202884349d2867f0aac5c60d8b57102ea0b0e768b16246099512c28e239254ad772d6834e7e14cb1b6f153fc3d0c031934e3183b086c86d3838d874a
+ languageName: node
+ linkType: hard
+
"env-paths@npm:^2.2.0, env-paths@npm:^2.2.1":
version: 2.2.1
resolution: "env-paths@npm:2.2.1"
@@ -15798,7 +15827,7 @@ __metadata:
languageName: node
linkType: hard
-"es-module-lexer@npm:^1.2.1, es-module-lexer@npm:^1.5.0, es-module-lexer@npm:^1.5.3, es-module-lexer@npm:^1.6.0":
+"es-module-lexer@npm:^1.2.1, es-module-lexer@npm:^1.5.0, es-module-lexer@npm:^1.6.0":
version: 1.6.0
resolution: "es-module-lexer@npm:1.6.0"
checksum: 10/807ee7020cc46a9c970c78cad1f2f3fc139877e5ebad7f66dbfbb124d451189ba1c48c1c632bd5f8ce1b8af2caef3fca340ba044a410fa890d17b080a59024bb
@@ -16066,14 +16095,14 @@ __metadata:
languageName: node
linkType: hard
-"eslint-config-prettier@npm:9.1.0":
- version: 9.1.0
- resolution: "eslint-config-prettier@npm:9.1.0"
+"eslint-config-prettier@npm:10.1.8":
+ version: 10.1.8
+ resolution: "eslint-config-prettier@npm:10.1.8"
peerDependencies:
eslint: ">=7.0.0"
bin:
eslint-config-prettier: bin/cli.js
- checksum: 10/411e3b3b1c7aa04e3e0f20d561271b3b909014956c4dba51c878bf1a23dbb8c800a3be235c46c4732c70827276e540b6eed4636d9b09b444fd0a8e07f0fcd830
+ checksum: 10/03f8e6ea1a6a9b8f9eeaf7c8c52a96499ec4b275b9ded33331a6cc738ed1d56de734097dbd0091f136f0e84bc197388bd8ec22a52a4658105883f8c8b7d8921a
languageName: node
linkType: hard
@@ -16145,42 +16174,41 @@ __metadata:
languageName: node
linkType: hard
-"eslint-plugin-jest@npm:28.11.0":
- version: 28.11.0
- resolution: "eslint-plugin-jest@npm:28.11.0"
+"eslint-plugin-jest@npm:29.0.1":
+ version: 29.0.1
+ resolution: "eslint-plugin-jest@npm:29.0.1"
dependencies:
- "@typescript-eslint/utils": "npm:^6.0.0 || ^7.0.0 || ^8.0.0"
+ "@typescript-eslint/utils": "npm:^8.0.0"
peerDependencies:
- "@typescript-eslint/eslint-plugin": ^6.0.0 || ^7.0.0 || ^8.0.0
- eslint: ^7.0.0 || ^8.0.0 || ^9.0.0
+ "@typescript-eslint/eslint-plugin": ^8.0.0
+ eslint: ^8.57.0 || ^9.0.0
jest: "*"
peerDependenciesMeta:
"@typescript-eslint/eslint-plugin":
optional: true
jest:
optional: true
- checksum: 10/7f3896ec2dc03110688bb9f359a7aa1ba1a6d9a60ffbc3642361c4aaf55afcba9ce36b6609b20b1507028c2170ffe29b0f3e9cc9b7fe12fdd233740a2f9ce0a1
+ checksum: 10/d7b0a3fbdbf795225fbbff2c69c7711bb6502a3d4444d857c95a9d6578a65c80fd8a9fcd3ebc3d0634fe1cc70b4b77e887943945fadab6a974a736d2ffc5babf
languageName: node
linkType: hard
-"eslint-plugin-jsdoc@npm:50.6.3":
- version: 50.6.3
- resolution: "eslint-plugin-jsdoc@npm:50.6.3"
+"eslint-plugin-jsdoc@npm:52.0.2":
+ version: 52.0.2
+ resolution: "eslint-plugin-jsdoc@npm:52.0.2"
dependencies:
- "@es-joy/jsdoccomment": "npm:~0.49.0"
+ "@es-joy/jsdoccomment": "npm:~0.52.0"
are-docs-informative: "npm:^0.0.2"
comment-parser: "npm:1.4.1"
- debug: "npm:^4.3.6"
+ debug: "npm:^4.4.1"
escape-string-regexp: "npm:^4.0.0"
- espree: "npm:^10.1.0"
+ espree: "npm:^10.4.0"
esquery: "npm:^1.6.0"
- parse-imports: "npm:^2.1.1"
- semver: "npm:^7.6.3"
+ parse-imports-exports: "npm:^0.2.4"
+ semver: "npm:^7.7.2"
spdx-expression-parse: "npm:^4.0.0"
- synckit: "npm:^0.9.1"
peerDependencies:
eslint: ^7.0.0 || ^8.0.0 || ^9.0.0
- checksum: 10/2c8fa8f493730e326d53bfdaccdb4d8502ee836cd7893f56cf9b12d36831a0cd8c3e9740fe0a7fc67232d1fb6866c17385b2d89b7ce56543056403b982b5f1a6
+ checksum: 10/e7af1a044b117183042cdc4c8ee6bcc02f2d610305c2744da659140e3dc3bb02a151edf5817b295bf8d612cdbc142c4256a88fd0ce6cb66354b6615d4539bc4a
languageName: node
linkType: hard
@@ -16404,7 +16432,7 @@ __metadata:
languageName: node
linkType: hard
-"espree@npm:^10.0.1, espree@npm:^10.1.0, espree@npm:^10.3.0, espree@npm:^10.4.0":
+"espree@npm:^10.0.1, espree@npm:^10.3.0, espree@npm:^10.4.0":
version: 10.4.0
resolution: "espree@npm:10.4.0"
dependencies:
@@ -16496,7 +16524,7 @@ __metadata:
languageName: node
linkType: hard
-"etag@npm:^1.8.1, etag@npm:~1.8.1":
+"etag@npm:^1.8.1":
version: 1.8.1
resolution: "etag@npm:1.8.1"
checksum: 10/571aeb3dbe0f2bbd4e4fadbdb44f325fc75335cd5f6f6b6a091e6a06a9f25ed5392f0863c5442acb0646787446e816f13cbfc6edce5b07658541dff573cab1ff
@@ -17069,16 +17097,6 @@ __metadata:
languageName: node
linkType: hard
-"find-cache-dir@npm:^4.0.0":
- version: 4.0.0
- resolution: "find-cache-dir@npm:4.0.0"
- dependencies:
- common-path-prefix: "npm:^3.0.0"
- pkg-dir: "npm:^7.0.0"
- checksum: 10/52a456a80deeb27daa3af6e06059b63bdb9cc4af4d845fc6d6229887e505ba913cd56000349caa60bc3aa59dacdb5b4c37903d4ba34c75102d83cab330b70d2f
- languageName: node
- linkType: hard
-
"find-file-up@npm:^0.1.2":
version: 0.1.3
resolution: "find-file-up@npm:0.1.3"
@@ -17147,16 +17165,6 @@ __metadata:
languageName: node
linkType: hard
-"find-up@npm:^6.3.0":
- version: 6.3.0
- resolution: "find-up@npm:6.3.0"
- dependencies:
- locate-path: "npm:^7.1.0"
- path-exists: "npm:^5.0.0"
- checksum: 10/4f3bdc30d41778c647e53f4923e72de5e5fb055157031f34501c5b36c2eb59f77b997edf9cb00165c6060cda7eaa2e3da82cb6be2e61d68ad3e07c4bc4cce67e
- languageName: node
- linkType: hard
-
"findup-sync@npm:^5.0.0":
version: 5.0.0
resolution: "findup-sync@npm:5.0.0"
@@ -17395,13 +17403,6 @@ __metadata:
languageName: node
linkType: hard
-"fresh@npm:0.5.2":
- version: 0.5.2
- resolution: "fresh@npm:0.5.2"
- checksum: 10/64c88e489b5d08e2f29664eb3c79c705ff9a8eb15d3e597198ef76546d4ade295897a44abb0abd2700e7ef784b2e3cbf1161e4fbf16f59129193fd1030d16da1
- languageName: node
- linkType: hard
-
"fresh@npm:^2.0.0":
version: 2.0.0
resolution: "fresh@npm:2.0.0"
@@ -17946,22 +17947,7 @@ __metadata:
languageName: node
linkType: hard
-"glob@npm:10.4.1, glob@npm:^10.2.2, glob@npm:^10.3.10":
- version: 10.4.1
- resolution: "glob@npm:10.4.1"
- dependencies:
- foreground-child: "npm:^3.1.0"
- jackspeak: "npm:^3.1.2"
- minimatch: "npm:^9.0.4"
- minipass: "npm:^7.1.2"
- path-scurry: "npm:^1.11.1"
- bin:
- glob: dist/esm/bin.mjs
- checksum: 10/d7bb49d2b413f77bdd59fea4ca86dcc12450deee221af0ca93e09534b81b9ef68fe341345751d8ff0c5b54bad422307e0e44266ff8ad7fbbd0c200e8ec258b16
- languageName: node
- linkType: hard
-
-"glob@npm:11.0.3, glob@npm:^11.0.0":
+"glob@npm:*, glob@npm:11.0.3, glob@npm:^11.0.0":
version: 11.0.3
resolution: "glob@npm:11.0.3"
dependencies:
@@ -17977,6 +17963,21 @@ __metadata:
languageName: node
linkType: hard
+"glob@npm:10.4.1, glob@npm:^10.2.2, glob@npm:^10.3.10":
+ version: 10.4.1
+ resolution: "glob@npm:10.4.1"
+ dependencies:
+ foreground-child: "npm:^3.1.0"
+ jackspeak: "npm:^3.1.2"
+ minimatch: "npm:^9.0.4"
+ minipass: "npm:^7.1.2"
+ path-scurry: "npm:^1.11.1"
+ bin:
+ glob: dist/esm/bin.mjs
+ checksum: 10/d7bb49d2b413f77bdd59fea4ca86dcc12450deee221af0ca93e09534b81b9ef68fe341345751d8ff0c5b54bad422307e0e44266ff8ad7fbbd0c200e8ec258b16
+ languageName: node
+ linkType: hard
+
"glob@npm:^7.0.3, glob@npm:^7.1.2, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6":
version: 7.2.3
resolution: "glob@npm:7.2.3"
@@ -18145,20 +18146,6 @@ __metadata:
languageName: node
linkType: hard
-"globby@npm:^14.0.0":
- version: 14.0.1
- resolution: "globby@npm:14.0.1"
- dependencies:
- "@sindresorhus/merge-streams": "npm:^2.1.0"
- fast-glob: "npm:^3.3.2"
- ignore: "npm:^5.2.4"
- path-type: "npm:^5.0.0"
- slash: "npm:^5.1.0"
- unicorn-magic: "npm:^0.1.0"
- checksum: 10/b36f57afc45a857a884d82657603c7e1663b1e6f3f9afbeb53d12e42230469fc5b26a7e14a01e51086f3f25c138f58a7002036fcc8f3ca054097b6dd7c71d639
- languageName: node
- linkType: hard
-
"globby@npm:~6.1.0":
version: 6.1.0
resolution: "globby@npm:6.1.0"
@@ -18214,16 +18201,16 @@ __metadata:
"@formatjs/intl-durationformat": "npm:^0.7.0"
"@glideapps/glide-data-grid": "npm:^6.0.0"
"@grafana/alerting": "workspace:*"
- "@grafana/assistant": "npm:0.0.12"
+ "@grafana/assistant": "npm:0.0.13"
"@grafana/aws-sdk": "npm:0.7.1"
"@grafana/azure-sdk": "npm:0.0.7"
"@grafana/data": "workspace:*"
"@grafana/e2e-selectors": "workspace:*"
"@grafana/eslint-config": "npm:8.0.0"
"@grafana/eslint-plugin": "link:./packages/grafana-eslint-rules"
- "@grafana/faro-core": "npm:^1.13.2"
- "@grafana/faro-web-sdk": "npm:^1.13.2"
- "@grafana/faro-web-tracing": "npm:^1.13.2"
+ "@grafana/faro-core": "npm:^1.19.0"
+ "@grafana/faro-web-sdk": "npm:^1.19.0"
+ "@grafana/faro-web-tracing": "npm:^1.19.0"
"@grafana/flamegraph": "workspace:*"
"@grafana/google-sdk": "npm:0.3.4"
"@grafana/i18n": "workspace:*"
@@ -18235,8 +18222,8 @@ __metadata:
"@grafana/plugin-ui": "npm:0.10.7"
"@grafana/prometheus": "workspace:*"
"@grafana/runtime": "workspace:*"
- "@grafana/scenes": "npm:6.28.6"
- "@grafana/scenes-react": "npm:6.28.6"
+ "@grafana/scenes": "npm:6.29.1"
+ "@grafana/scenes-react": "npm:6.29.1"
"@grafana/schema": "workspace:*"
"@grafana/sql": "workspace:*"
"@grafana/test-utils": "workspace:*"
@@ -18271,14 +18258,14 @@ __metadata:
"@react-types/overlays": "npm:3.9.0"
"@react-types/shared": "npm:3.31.0"
"@reduxjs/toolkit": "npm:2.8.2"
- "@rsdoctor/webpack-plugin": "npm:^0.4.6"
+ "@rsdoctor/webpack-plugin": "npm:^1.0.0"
"@rtk-query/codegen-openapi": "npm:^2.0.0"
"@rtsao/plugin-proposal-class-properties": "npm:7.0.1-patch.1"
"@stylistic/eslint-plugin-ts": "npm:^4.0.0"
"@swc/core": "npm:1.13.3"
"@swc/helpers": "npm:0.5.17"
- "@testing-library/dom": "npm:10.4.0"
- "@testing-library/jest-dom": "npm:6.6.3"
+ "@testing-library/dom": "npm:10.4.1"
+ "@testing-library/jest-dom": "npm:6.6.4"
"@testing-library/react": "npm:16.3.0"
"@testing-library/user-event": "npm:14.6.1"
"@types/babel__core": "npm:^7"
@@ -18291,9 +18278,9 @@ __metadata:
"@types/d3-scale-chromatic": "npm:3.1.0"
"@types/debounce-promise": "npm:3.1.9"
"@types/eslint": "npm:9.6.1"
- "@types/eslint-scope": "npm:^3.7.7"
+ "@types/eslint-scope": "npm:^8.0.0"
"@types/file-saver": "npm:2.0.7"
- "@types/glob": "npm:^8.0.0"
+ "@types/glob": "npm:^9.0.0"
"@types/google.analytics": "npm:^0.0.46"
"@types/gtag.js": "npm:^0.0.20"
"@types/history": "npm:4.7.11"
@@ -18344,7 +18331,7 @@ __metadata:
"@welldone-software/why-did-you-render": "npm:8.0.3"
ansicolor: "npm:2.0.3"
autoprefixer: "npm:10.4.21"
- babel-loader: "npm:9.2.1"
+ babel-loader: "npm:10.0.0"
baron: "npm:3.0.3"
blob-polyfill: "npm:9.0.20240710"
brace: "npm:0.11.1"
@@ -18358,7 +18345,7 @@ __metadata:
comlink: "npm:4.4.2"
common-tags: "npm:1.8.2"
confusing-browser-globals: "npm:^1.0.11"
- copy-webpack-plugin: "npm:12.0.2"
+ copy-webpack-plugin: "npm:13.0.0"
core-js: "npm:3.44.0"
crashme: "npm:0.0.15"
croner: "npm:^9.0.0"
@@ -18378,11 +18365,11 @@ __metadata:
esbuild-loader: "npm:4.3.0"
esbuild-plugin-browserslist: "npm:^1.0.0"
eslint: "npm:9.32.0"
- eslint-config-prettier: "npm:9.1.0"
+ eslint-config-prettier: "npm:10.1.8"
eslint-plugin-import: "npm:^2.31.0"
- eslint-plugin-jest: "npm:28.11.0"
+ eslint-plugin-jest: "npm:29.0.1"
eslint-plugin-jest-dom: "npm:^5.4.0"
- eslint-plugin-jsdoc: "npm:50.6.3"
+ eslint-plugin-jsdoc: "npm:52.0.2"
eslint-plugin-jsx-a11y: "npm:6.10.2"
eslint-plugin-lodash: "npm:8.0.0"
eslint-plugin-no-barrel-files: "npm:^1.1.1"
@@ -18529,7 +18516,7 @@ __metadata:
tslib: "npm:2.8.1"
tween-functions: "npm:^1.2.0"
type-fest: "npm:^4.18.2"
- typescript: "npm:5.8.3"
+ typescript: "npm:5.9.2"
uplot: "npm:1.6.32"
uuid: "npm:11.1.0"
vis-data: "npm:^8.0.0"
@@ -19026,6 +19013,18 @@ __metadata:
languageName: node
linkType: hard
+"htmlparser2@npm:10.0.0":
+ version: 10.0.0
+ resolution: "htmlparser2@npm:10.0.0"
+ dependencies:
+ domelementtype: "npm:^2.3.0"
+ domhandler: "npm:^5.0.3"
+ domutils: "npm:^3.2.1"
+ entities: "npm:^6.0.0"
+ checksum: 10/768870f0e020dca19dc45df206cb6ac466c5dba6566c8fca4ca880347eed409f9977028d08644ac516bca8628ac9c7ded5a3847dc3ee1c043f049abf9e817154
+ languageName: node
+ linkType: hard
+
"htmlparser2@npm:^3.9.2":
version: 3.10.1
resolution: "htmlparser2@npm:3.10.1"
@@ -22093,15 +22092,6 @@ __metadata:
languageName: node
linkType: hard
-"locate-path@npm:^7.1.0":
- version: 7.2.0
- resolution: "locate-path@npm:7.2.0"
- dependencies:
- p-locate: "npm:^6.0.0"
- checksum: 10/1c6d269d4efec555937081be964e8a9b4a136319c79ca1d45ac6382212a8466113c75bd89e44521ca8ecd1c47fb08523b56eee5c0712bc7d14fec5f729deeb42
- languageName: node
- linkType: hard
-
"lockfile@npm:^1.0.4":
version: 1.0.4
resolution: "lockfile@npm:1.0.4"
@@ -22825,15 +22815,6 @@ __metadata:
languageName: node
linkType: hard
-"mime@npm:1.6.0, mime@npm:^1.6.0":
- version: 1.6.0
- resolution: "mime@npm:1.6.0"
- bin:
- mime: cli.js
- checksum: 10/b7d98bb1e006c0e63e2c91b590fe1163b872abf8f7ef224d53dd31499c2197278a6d3d0864c45239b1a93d22feaf6f9477e9fc847eef945838150b8c02d03170
- languageName: node
- linkType: hard
-
"mime@npm:3":
version: 3.0.0
resolution: "mime@npm:3.0.0"
@@ -22843,6 +22824,15 @@ __metadata:
languageName: node
linkType: hard
+"mime@npm:^1.6.0":
+ version: 1.6.0
+ resolution: "mime@npm:1.6.0"
+ bin:
+ mime: cli.js
+ checksum: 10/b7d98bb1e006c0e63e2c91b590fe1163b872abf8f7ef224d53dd31499c2197278a6d3d0864c45239b1a93d22feaf6f9477e9fc847eef945838150b8c02d03170
+ languageName: node
+ linkType: hard
+
"mimic-fn@npm:^2.1.0":
version: 2.1.0
resolution: "mimic-fn@npm:2.1.0"
@@ -23314,7 +23304,7 @@ __metadata:
languageName: node
linkType: hard
-"ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.1, ms@npm:^2.1.3":
+"ms@npm:^2.0.0, ms@npm:^2.1.1, ms@npm:^2.1.3":
version: 2.1.3
resolution: "ms@npm:2.1.3"
checksum: 10/aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d
@@ -24622,15 +24612,6 @@ __metadata:
languageName: node
linkType: hard
-"p-limit@npm:^4.0.0":
- version: 4.0.0
- resolution: "p-limit@npm:4.0.0"
- dependencies:
- yocto-queue: "npm:^1.0.0"
- checksum: 10/01d9d70695187788f984226e16c903475ec6a947ee7b21948d6f597bed788e3112cc7ec2e171c1d37125057a5f45f3da21d8653e04a3a793589e12e9e80e756b
- languageName: node
- linkType: hard
-
"p-locate@npm:^2.0.0":
version: 2.0.0
resolution: "p-locate@npm:2.0.0"
@@ -24658,15 +24639,6 @@ __metadata:
languageName: node
linkType: hard
-"p-locate@npm:^6.0.0":
- version: 6.0.0
- resolution: "p-locate@npm:6.0.0"
- dependencies:
- p-limit: "npm:^4.0.0"
- checksum: 10/2bfe5234efa5e7a4e74b30a5479a193fdd9236f8f6b4d2f3f69e3d286d9a7d7ab0c118a2a50142efcf4e41625def635bd9332d6cbf9cc65d85eb0718c579ab38
- languageName: node
- linkType: hard
-
"p-map-series@npm:2.1.0":
version: 2.1.0
resolution: "p-map-series@npm:2.1.0"
@@ -25001,13 +24973,12 @@ __metadata:
languageName: node
linkType: hard
-"parse-imports@npm:^2.1.1":
- version: 2.1.1
- resolution: "parse-imports@npm:2.1.1"
+"parse-imports-exports@npm:^0.2.4":
+ version: 0.2.4
+ resolution: "parse-imports-exports@npm:0.2.4"
dependencies:
- es-module-lexer: "npm:^1.5.3"
- slashes: "npm:^3.0.12"
- checksum: 10/466cba090fe8b77aa2edc2a7ebcde699a296f34db5384d89f2c78daa5e7a87979adbad8a478634a85f5546ec8b759b597cf1057d825b471db70ce5c1b0c8bbec
+ parse-statements: "npm:1.0.11"
+ checksum: 10/144d459771d1aeaa80eebffe43a2074c34e5b79a86d326c907efea90b62ff41af9555600b8e117e6cab717654d8e20b440e9ab09cdbbc9092f352cb0a9e1f3a3
languageName: node
linkType: hard
@@ -25049,6 +25020,13 @@ __metadata:
languageName: node
linkType: hard
+"parse-statements@npm:1.0.11":
+ version: 1.0.11
+ resolution: "parse-statements@npm:1.0.11"
+ checksum: 10/287c2739f4cbffa08e28a95ea2d3ff4a8a51ddb367df6212ae2cd80580a1189e09c6edcb8277fc05d0fdbcb93c86ad16b591f317e2fe12ac4189de738863e514
+ languageName: node
+ linkType: hard
+
"parse-url@npm:^8.1.0":
version: 8.1.0
resolution: "parse-url@npm:8.1.0"
@@ -25167,13 +25145,6 @@ __metadata:
languageName: node
linkType: hard
-"path-exists@npm:^5.0.0":
- version: 5.0.0
- resolution: "path-exists@npm:5.0.0"
- checksum: 10/8ca842868cab09423994596eb2c5ec2a971c17d1a3cb36dbf060592c730c725cd524b9067d7d2a1e031fef9ba7bd2ac6dc5ec9fb92aa693265f7be3987045254
- languageName: node
- linkType: hard
-
"path-is-absolute@npm:^1.0.0":
version: 1.0.1
resolution: "path-is-absolute@npm:1.0.1"
@@ -25277,13 +25248,6 @@ __metadata:
languageName: node
linkType: hard
-"path-type@npm:^5.0.0":
- version: 5.0.0
- resolution: "path-type@npm:5.0.0"
- checksum: 10/15ec24050e8932c2c98d085b72cfa0d6b4eeb4cbde151a0a05726d8afae85784fc5544f733d8dfc68536587d5143d29c0bd793623fad03d7e61cc00067291cd5
- languageName: node
- linkType: hard
-
"pathe@npm:^2.0.2":
version: 2.0.2
resolution: "pathe@npm:2.0.2"
@@ -25347,7 +25311,7 @@ __metadata:
languageName: node
linkType: hard
-"picocolors@npm:^1.0.0, picocolors@npm:^1.1.1":
+"picocolors@npm:1.1.1, picocolors@npm:^1.0.0, picocolors@npm:^1.1.1":
version: 1.1.1
resolution: "picocolors@npm:1.1.1"
checksum: 10/e1cf46bf84886c79055fdfa9dcb3e4711ad259949e3565154b004b260cd356c5d54b31a1437ce9782624bf766272fe6b0154f5f0c744fb7af5d454d2b60db045
@@ -25446,15 +25410,6 @@ __metadata:
languageName: node
linkType: hard
-"pkg-dir@npm:^7.0.0":
- version: 7.0.0
- resolution: "pkg-dir@npm:7.0.0"
- dependencies:
- find-up: "npm:^6.3.0"
- checksum: 10/94298b20a446bfbbd66604474de8a0cdd3b8d251225170970f15d9646f633e056c80520dd5b4c1d1050c9fed8f6a9e5054b141c93806439452efe72e57562c03
- languageName: node
- linkType: hard
-
"playwright-core@npm:1.54.1, playwright-core@npm:>=1.2.0":
version: 1.54.1
resolution: "playwright-core@npm:1.54.1"
@@ -26542,7 +26497,7 @@ __metadata:
languageName: node
linkType: hard
-"range-parser@npm:^1.2.1, range-parser@npm:~1.2.1":
+"range-parser@npm:^1.2.1":
version: 1.2.1
resolution: "range-parser@npm:1.2.1"
checksum: 10/ce21ef2a2dd40506893157970dc76e835c78cf56437e26e19189c48d5291e7279314477b06ac38abd6a401b661a6840f7b03bd0b1249da9b691deeaa15872c26
@@ -26884,15 +26839,15 @@ __metadata:
languageName: node
linkType: hard
-"react-data-grid@grafana/react-data-grid#de920f0105cb2b7d774444e7443a675f3b568ad6":
+"react-data-grid@grafana/react-data-grid#a922856b5ede21d55db3fdffb6d38dc76bdc7c58":
version: 7.0.0-beta.56
- resolution: "react-data-grid@https://github.com/grafana/react-data-grid.git#commit=de920f0105cb2b7d774444e7443a675f3b568ad6"
+ resolution: "react-data-grid@https://github.com/grafana/react-data-grid.git#commit=a922856b5ede21d55db3fdffb6d38dc76bdc7c58"
dependencies:
clsx: "npm:^2.0.0"
peerDependencies:
react: ^18.0 || ^19.0
react-dom: ^18.0 || ^19.0
- checksum: 10/efc1dcb764fa5f3549d012737e79d423b34e6ad7b0a122849d757f59b45e648afe7c5cfeb1a61464245aa7b393f9251ff91fd49f8f857139d7df185c23d68b68
+ checksum: 10/18d368ff52151c1e7900819b0d92bb554b3d26135a5d4401a6e3c044fd62ca72a4177b63ba705b93901fa489458a965ce1d1deb2e4f98aa5fb39c276d2b12d38
languageName: node
linkType: hard
@@ -27072,11 +27027,11 @@ __metadata:
linkType: hard
"react-hook-form@npm:^7.49.2":
- version: 7.61.1
- resolution: "react-hook-form@npm:7.61.1"
+ version: 7.62.0
+ resolution: "react-hook-form@npm:7.62.0"
peerDependencies:
react: ^16.8.0 || ^17 || ^18 || ^19
- checksum: 10/961c5ad1f6fe694a66c1aa9934e5cd7ef014a8fd0d4ed15ac6d97d31d8d53b9e6196cb8b66d119883f49508c11589bc4b1478e1080790eb2e91c476551c82186
+ checksum: 10/092dcf0317ed3e314b124ed9df3f3494cf3447326078cd857f6fdc47aad0504e466ab2fb593bbb8e79c247b8772159f83aebe54a7e5799926b00d7e401d127a6
languageName: node
linkType: hard
@@ -28520,10 +28475,10 @@ __metadata:
languageName: node
linkType: hard
-"rslog@npm:^1.2.3":
- version: 1.2.3
- resolution: "rslog@npm:1.2.3"
- checksum: 10/b655304394dba95b83e3b932c3788a5a9f408c113a25b5fd08950904f1f80476fc049c67744bc427837d47dfb1fc0a9a0b48cfd7c21f536bb6cb8d86d46f90e8
+"rslog@npm:^1.2.8":
+ version: 1.2.9
+ resolution: "rslog@npm:1.2.9"
+ checksum: 10/f8c1d890049671aa73fa9c5682befd756c76fcfe885841ca3d6e1167edf1798a890dd57fb94a1493de7c7d28b41a9e42119dd9a483495acaa666ac04f149ee86
languageName: node
linkType: hard
@@ -28842,27 +28797,6 @@ __metadata:
languageName: node
linkType: hard
-"send@npm:0.19.0":
- version: 0.19.0
- resolution: "send@npm:0.19.0"
- dependencies:
- debug: "npm:2.6.9"
- depd: "npm:2.0.0"
- destroy: "npm:1.2.0"
- encodeurl: "npm:~1.0.2"
- escape-html: "npm:~1.0.3"
- etag: "npm:~1.8.1"
- fresh: "npm:0.5.2"
- http-errors: "npm:2.0.0"
- mime: "npm:1.6.0"
- ms: "npm:2.1.3"
- on-finished: "npm:2.4.1"
- range-parser: "npm:~1.2.1"
- statuses: "npm:2.0.1"
- checksum: 10/1f6064dea0ae4cbe4878437aedc9270c33f2a6650a77b56a16b62d057527f2766d96ee282997dd53ec0339082f2aad935bc7d989b46b48c82fc610800dc3a1d0
- languageName: node
- linkType: hard
-
"send@npm:^1.1.0, send@npm:^1.2.0":
version: 1.2.0
resolution: "send@npm:1.2.0"
@@ -28911,18 +28845,6 @@ __metadata:
languageName: node
linkType: hard
-"serve-static@npm:1.16.2":
- version: 1.16.2
- resolution: "serve-static@npm:1.16.2"
- dependencies:
- encodeurl: "npm:~2.0.0"
- escape-html: "npm:~1.0.3"
- parseurl: "npm:~1.3.3"
- send: "npm:0.19.0"
- checksum: 10/7fa9d9c68090f6289976b34fc13c50ac8cd7f16ae6bce08d16459300f7fc61fbc2d7ebfa02884c073ec9d6ab9e7e704c89561882bbe338e99fcacb2912fde737
- languageName: node
- linkType: hard
-
"serve-static@npm:^2.2.0":
version: 2.2.0
resolution: "serve-static@npm:2.2.0"
@@ -29197,7 +29119,7 @@ __metadata:
languageName: node
linkType: hard
-"sirv@npm:^2.0.3":
+"sirv@npm:2.0.4, sirv@npm:^2.0.3":
version: 2.0.4
resolution: "sirv@npm:2.0.4"
dependencies:
@@ -29238,20 +29160,13 @@ __metadata:
languageName: node
linkType: hard
-"slash@npm:^5.0.0, slash@npm:^5.1.0":
+"slash@npm:^5.0.0":
version: 5.1.0
resolution: "slash@npm:5.1.0"
checksum: 10/2c41ec6fb1414cd9bba0fa6b1dd00e8be739e3fe85d079c69d4b09ca5f2f86eafd18d9ce611c0c0f686428638a36c272a6ac14799146a8295f259c10cc45cde4
languageName: node
linkType: hard
-"slashes@npm:^3.0.12":
- version: 3.0.12
- resolution: "slashes@npm:3.0.12"
- checksum: 10/c221d73765013db64f3eaf49dacc6b99a5d5477e63720c1bb71d1af647965dda23ab100ca1eb622e080f11ffe68e1e0a233b7b908073260bed4ec819ff1d3e42
- languageName: node
- linkType: hard
-
"slate-base64-serializer@npm:^0.2.112":
version: 0.2.115
resolution: "slate-base64-serializer@npm:0.2.115"
@@ -30530,16 +30445,6 @@ __metadata:
languageName: node
linkType: hard
-"synckit@npm:^0.9.1":
- version: 0.9.1
- resolution: "synckit@npm:0.9.1"
- dependencies:
- "@pkgr/core": "npm:^0.1.0"
- tslib: "npm:^2.6.2"
- checksum: 10/bff3903976baf8b699b5483228116d70223781a93b17c70e685c277ee960cdfd1a09cb5a741e6a9ec35e2428f14f4664baec41ccc99a598f267608b2a54f529b
- languageName: node
- linkType: hard
-
"systemjs@npm:6.15.1":
version: 6.15.1
resolution: "systemjs@npm:6.15.1"
@@ -30567,10 +30472,10 @@ __metadata:
languageName: node
linkType: hard
-"tapable@npm:2.2.1, tapable@npm:^2.0.0, tapable@npm:^2.1.1, tapable@npm:^2.2.0, tapable@npm:^2.2.1":
- version: 2.2.1
- resolution: "tapable@npm:2.2.1"
- checksum: 10/1769336dd21481ae6347611ca5fca47add0962fd8e80466515032125eca0084a4f0ede11e65341b9c0018ef4e1cf1ad820adbb0fba7cc99865c6005734000b0a
+"tapable@npm:2.2.2, tapable@npm:^2.0.0, tapable@npm:^2.1.1, tapable@npm:^2.2.0, tapable@npm:^2.2.1":
+ version: 2.2.2
+ resolution: "tapable@npm:2.2.2"
+ checksum: 10/065a0dc44aba1b32020faa1c27c719e8f76e5345347515d8494bf158524f36e9f22ad9eaa5b5494f9d5d67bf0640afdd5698505948c46d720b6b7e69d19349a6
languageName: node
linkType: hard
@@ -30837,7 +30742,7 @@ __metadata:
languageName: node
linkType: hard
-"tinyglobby@npm:^0.2.13":
+"tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.13":
version: 0.2.14
resolution: "tinyglobby@npm:0.2.14"
dependencies:
@@ -31591,13 +31496,13 @@ __metadata:
languageName: node
linkType: hard
-"typescript@npm:5.8.3, typescript@npm:>=2.7, typescript@npm:>=3 < 6, typescript@npm:^5.0.4, typescript@npm:^5.4.5, typescript@npm:^5.5.4":
- version: 5.8.3
- resolution: "typescript@npm:5.8.3"
+"typescript@npm:5.9.2, typescript@npm:>=2.7, typescript@npm:>=3 < 6, typescript@npm:^5.0.4, typescript@npm:^5.4.5, typescript@npm:^5.5.4":
+ version: 5.9.2
+ resolution: "typescript@npm:5.9.2"
bin:
tsc: bin/tsc
tsserver: bin/tsserver
- checksum: 10/65c40944c51b513b0172c6710ee62e951b70af6f75d5a5da745cb7fab132c09ae27ffdf7838996e3ed603bb015dadd099006658046941bd0ba30340cc563ae92
+ checksum: 10/cc2fe6c822819de5d453fa25aa9f32096bf70dde215d481faa1ad84a283dfb264e33988ed8f6d36bc803dd0b16dbe943efa311a798ef76d5b3892a05dfbfd628
languageName: node
linkType: hard
@@ -31621,13 +31526,13 @@ __metadata:
languageName: node
linkType: hard
-"typescript@patch:typescript@npm%3A5.8.3#optional!builtin, typescript@patch:typescript@npm%3A>=2.7#optional!builtin, typescript@patch:typescript@npm%3A>=3 < 6#optional!builtin, typescript@patch:typescript@npm%3A^5.0.4#optional!builtin, typescript@patch:typescript@npm%3A^5.4.5#optional!builtin, typescript@patch:typescript@npm%3A^5.5.4#optional!builtin":
- version: 5.8.3
- resolution: "typescript@patch:typescript@npm%3A5.8.3#optional!builtin::version=5.8.3&hash=5786d5"
+"typescript@patch:typescript@npm%3A5.9.2#optional!builtin, typescript@patch:typescript@npm%3A>=2.7#optional!builtin