@grafana/scenes 8.13.4 → 8.13.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,27 @@
1
+ # v8.13.6 (Fri Jul 31 2026)
2
+
3
+ #### 🐛 Bug Fix
4
+
5
+ - AdHocFiltersCombobox: Show more pill text before truncating [#1592](https://github.com/grafana/scenes/pull/1592) ([@samjewell](https://github.com/samjewell))
6
+
7
+ #### Authors: 1
8
+
9
+ - Sam Jewell ([@samjewell](https://github.com/samjewell))
10
+
11
+ ---
12
+
13
+ # v8.13.5 (Wed Jul 29 2026)
14
+
15
+ #### 🐛 Bug Fix
16
+
17
+ - Scenes: add data-plugin-id to render boundary [#1590](https://github.com/grafana/scenes/pull/1590) ([@jackw](https://github.com/jackw))
18
+
19
+ #### Authors: 1
20
+
21
+ - Jack Westbrook ([@jackw](https://github.com/jackw))
22
+
23
+ ---
24
+
1
25
  # v8.13.4 (Thu Jul 23 2026)
2
26
 
3
27
  #### 🐛 Bug Fix
@@ -197,7 +197,8 @@ function VizPanelRenderer({ model }) {
197
197
  className: absoluteWrapper,
198
198
  "data-viz-panel-key": model.state.key,
199
199
  "data-viz-panel-id": model.getPathId(),
200
- "data-testid": `${plugin.meta.id}-${model.state.key}`
200
+ "data-testid": `${plugin.meta.id}-${model.state.key}`,
201
+ "data-plugin-id": plugin.meta.id
201
202
  },
202
203
  /* @__PURE__ */ React.createElement(
203
204
  PanelChrome,
@@ -1 +1 @@
1
- {"version":3,"file":"VizPanelRenderer.js","sources":["../../../../src/components/VizPanel/VizPanelRenderer.tsx"],"sourcesContent":["import { Trans, t } from '@grafana/i18n';\nimport React, { memo, RefCallback, useCallback, useEffect, useLayoutEffect, useMemo, useRef } from 'react';\nimport { useMeasure, usePrevious } from 'react-use';\n\n// @ts-ignore\nimport {\n AlertState,\n DataFrame,\n GrafanaTheme2,\n PanelData,\n PanelPlugin,\n PanelProps,\n PluginContextProvider,\n PluginType,\n QueryResultMetaNotice,\n renderMarkdown,\n SetPanelAttentionEvent,\n} from '@grafana/data';\n\nimport { getAppEvents } from '@grafana/runtime';\nimport { PanelChrome, ErrorBoundaryAlert, PanelContextProvider, Tooltip, useStyles2, Icon } from '@grafana/ui';\n\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { isSceneObject, SceneComponentProps, SceneLayout, SceneObject } from '../../core/types';\n\nimport { VizPanel } from './VizPanel';\nimport { css, cx } from '@emotion/css';\nimport { debounce } from 'lodash';\nimport { VizPanelSeriesLimit } from './VizPanelSeriesLimit';\nimport { useLazyLoaderIsInView } from '../layout/LazyLoader';\n\nexport function VizPanelRenderer({ model }: SceneComponentProps<VizPanel>) {\n const {\n title,\n options,\n fieldConfig,\n _pluginLoadError,\n displayMode,\n hoverHeader,\n showMenuAlways,\n hoverHeaderOffset,\n menu,\n headerActions,\n subHeader,\n subtitle,\n titleItems,\n seriesLimit,\n seriesLimitShowAll,\n description,\n collapsible,\n collapsed,\n _renderCounter = 0,\n _UNSAFE_clearPreviousFieldValues = false,\n } = model.useState();\n let [ref, { width, height }] = useMeasure();\n const appEvents = useMemo(() => getAppEvents(), []);\n\n const setPanelAttention = useCallback(() => {\n if (model.state.key) {\n appEvents.publish(new SetPanelAttentionEvent({ panelId: model.getPathId() }));\n }\n }, [model, appEvents]);\n\n const debouncedMouseMove = useMemo(\n () => debounce(setPanelAttention, 100, { leading: true, trailing: false }),\n [setPanelAttention]\n );\n\n // S3.0 RENDER TRACKING: Simple timing for performance measurement\n const profiler = useMemo(() => model.getProfiler(), [model]);\n\n // Capture render start time immediately when component function runs\n const currentRenderStart = performance.now();\n\n const endRenderCallbackRef = React.useRef<((endTimestamp: number, duration: number) => void) | null>(null);\n\n useLayoutEffect(() => {\n if (profiler) {\n const callback = profiler.onSimpleRenderStart(currentRenderStart);\n endRenderCallbackRef.current = callback || null;\n }\n });\n\n const subtitleContent = useMemo(() => {\n if (subtitle) {\n return renderMarkdown(model.interpolate(subtitle, undefined, 'text'));\n }\n return undefined;\n }, [subtitle, model]);\n\n // Use useEffect (after DOM updates) to measure complete render cycle timing\n useEffect(() => {\n if (endRenderCallbackRef.current) {\n const timestamp = performance.now();\n // Measure from component start to after DOM updates AND effects (complete render cycle)\n const duration = timestamp - currentRenderStart;\n endRenderCallbackRef.current(timestamp, duration);\n endRenderCallbackRef.current = null; // Clear callback after use\n }\n });\n\n const plugin = model.getPlugin() ?? getLoadingPlugin();\n\n const { dragClass, dragClassCancel } = getDragClasses(model);\n const dragHooks = getDragHooks(model);\n const dataObject = sceneGraph.getData(model);\n\n const rawData = dataObject.useState();\n\n const { series, annotations } = _UNSAFE_clearPreviousFieldValues ? rawData.data ?? {} : {};\n useClearPreviousData(series);\n useClearPreviousData(annotations);\n\n const dataWithSeriesLimit = useDataWithSeriesLimit(rawData.data, seriesLimit, seriesLimitShowAll);\n const dataWithFieldConfig = model.applyFieldConfig(dataWithSeriesLimit);\n const sceneTimeRange = sceneGraph.getTimeRange(model);\n const timeZone = sceneTimeRange.getTimeZone();\n const timeRange = model.getTimeRange(dataWithFieldConfig);\n\n // Switch to manual query execution if the panel is outside viewport\n const isInView = useLazyLoaderIsInView();\n useEffect(() => {\n if (dataObject.isInViewChanged) {\n dataObject.isInViewChanged(isInView);\n }\n }, [isInView, dataObject]);\n\n // Interpolate title\n const titleInterpolated = model.interpolate(title, undefined, 'text');\n const alertStateStyles = useStyles2(getAlertStateStyles);\n\n if (!plugin.panel) {\n return (\n <div>\n <Trans i18nKey=\"grafana-scenes.components.viz-panel-renderer.panel-plugin-has-no-panel-component\">\n Panel plugin has no panel component\n </Trans>\n </div>\n );\n }\n\n const PanelComponent = plugin.panel;\n\n // If we have a query runner on our level inform it of the container width (used to set auto max data points)\n if (dataObject && dataObject.setContainerWidth) {\n dataObject.setContainerWidth(Math.round(width));\n }\n\n let subHeaderElement: React.ReactNode[] = [];\n\n if (subHeader) {\n if (Array.isArray(subHeader)) {\n subHeaderElement = subHeaderElement.concat(\n subHeader.map((subHeaderItem) => {\n return <subHeaderItem.Component model={subHeaderItem} key={`${subHeaderItem.state.key}`} />;\n })\n );\n } else if (isSceneObject(subHeader)) {\n subHeaderElement.push(<subHeader.Component model={subHeader} key={`${subHeader.state.key}`} />);\n } else {\n subHeaderElement.push(subHeader);\n }\n }\n\n let titleItemsElement: React.ReactNode[] = [];\n\n if (titleItems) {\n if (Array.isArray(titleItems)) {\n titleItemsElement = titleItemsElement.concat(\n titleItems.map((titleItem) => {\n return <titleItem.Component model={titleItem} key={`${titleItem.state.key}`} />;\n })\n );\n } else if (isSceneObject(titleItems)) {\n titleItemsElement.push(<titleItems.Component model={titleItems} />);\n } else {\n titleItemsElement.push(titleItems);\n }\n }\n\n if (seriesLimit) {\n titleItemsElement.push(\n <VizPanelSeriesLimit\n key=\"series-limit\"\n data={rawData.data}\n seriesLimit={seriesLimit}\n showAll={seriesLimitShowAll}\n onShowAllSeries={() => model.setState({ seriesLimitShowAll: !seriesLimitShowAll })}\n />\n );\n }\n\n // If we have local time range show that in panel header\n if (model.state.$timeRange) {\n titleItemsElement.push(<model.state.$timeRange.Component model={model.state.$timeRange} key={model.state.key} />);\n }\n\n if (dataWithFieldConfig.alertState) {\n titleItemsElement.push(\n <Tooltip content={dataWithFieldConfig.alertState.state ?? 'unknown'} key={`alert-states-icon-${model.state.key}`}>\n <PanelChrome.TitleItem\n className={cx({\n [alertStateStyles.ok]: dataWithFieldConfig.alertState.state === AlertState.OK,\n [alertStateStyles.pending]: dataWithFieldConfig.alertState.state === AlertState.Pending,\n [alertStateStyles.alerting]: dataWithFieldConfig.alertState.state === AlertState.Alerting,\n })}\n >\n <Icon\n name={dataWithFieldConfig.alertState.state === 'alerting' ? 'heart-break' : 'heart'}\n className=\"panel-alert-icon\"\n size=\"md\"\n />\n </PanelChrome.TitleItem>\n </Tooltip>\n );\n }\n\n let panelMenu;\n if (menu) {\n panelMenu = <menu.Component model={menu} />;\n }\n\n let actionsElement: React.ReactNode | undefined;\n\n if (headerActions) {\n if (Array.isArray(headerActions)) {\n actionsElement = (\n <>\n {headerActions.map((action) => {\n return <action.Component model={action} key={`${action.state.key}`} />;\n })}\n </>\n );\n } else if (isSceneObject(headerActions)) {\n actionsElement = <headerActions.Component model={headerActions} />;\n } else {\n actionsElement = headerActions;\n }\n }\n\n // Data is always returned. For non-data panels, empty PanelData is returned.\n const data = dataWithFieldConfig!;\n\n const isReadyToRender = dataObject.isDataReadyToDisplay ? dataObject.isDataReadyToDisplay() : true;\n\n const context = model.getPanelContext();\n // The host (e.g. dashboard) only provides an inspector opener when the new panel errors UI\n // is enabled. Use its presence to decide between the new errors/notices popover and the\n // legacy single status message.\n // @ts-expect-error onOpenInspector is added in a newer @grafana/ui version\n const showNewPanelErrorsUI = Boolean(context.onOpenInspector);\n const panelId = model.getLegacyPanelId();\n const outdatedPluginError = t(\n 'grafana-scenes.components.viz-panel-renderer.outdated-plugin-error',\n 'An unexpected error occurred. Updating the \"{{pluginName}}\" plugin to the latest version may fix the problem.',\n { pluginName: plugin.meta.name }\n );\n\n return (\n <div className={relativeWrapper}>\n <div\n ref={ref as RefCallback<HTMLDivElement>}\n className={absoluteWrapper}\n data-viz-panel-key={model.state.key}\n data-viz-panel-id={model.getPathId()}\n data-testid={`${plugin.meta.id}-${model.state.key}`}\n >\n <PanelChrome\n title={titleInterpolated}\n description={description?.trim() ? model.getDescription : undefined}\n // @ts-expect-error remove this on next grafana/ui update\n subtitle={subtitleContent}\n loadingState={data.state}\n statusMessage={getChromeStatusMessage(data, _pluginLoadError)}\n statusItems={showNewPanelErrorsUI ? getChromeStatusItems(data, _pluginLoadError) : undefined}\n statusMessageOnClick={() => {\n // Report the interaction for analytics, then let the container (e.g. dashboard) open the inspector.\n model.onStatusMessageClick();\n // @ts-expect-error onOpenInspector is added in a newer @grafana/ui version\n context.onOpenInspector?.();\n }}\n width={width === 0 ? undefined : width}\n height={height === 0 ? undefined : height}\n selectionId={model.state.key}\n displayMode={displayMode}\n titleItems={titleItemsElement.length > 0 ? titleItemsElement : undefined}\n dragClass={dragClass}\n actions={actionsElement}\n dragClassCancel={dragClassCancel}\n padding={plugin.noPadding ? 'none' : 'md'}\n menu={panelMenu}\n onCancelQuery={model.onCancelQuery}\n onFocus={setPanelAttention}\n onMouseEnter={setPanelAttention}\n onMouseMove={debouncedMouseMove}\n subHeaderContent={subHeaderElement.length ? subHeaderElement : undefined}\n onDragStart={(e: React.PointerEvent) => {\n dragHooks.onDragStart?.(e, model);\n }}\n showMenuAlways={showMenuAlways}\n {...(collapsible\n ? {\n collapsible: Boolean(collapsible),\n collapsed,\n onToggleCollapse: model.onToggleCollapse,\n }\n : { hoverHeader, hoverHeaderOffset })}\n >\n {(innerWidth, innerHeight) => {\n if (innerWidth === 0 || innerHeight === 0) {\n return null;\n }\n\n return (\n <ErrorBoundaryAlert\n title={plugin.meta.hasUpdate ? outdatedPluginError : undefined}\n dependencies={[plugin, data]}\n >\n <PluginContextProvider meta={plugin.meta}>\n <PanelContextProvider value={context}>\n {isReadyToRender && (\n <PanelComponent\n id={panelId}\n data={data}\n title={title}\n timeRange={timeRange}\n timeZone={timeZone}\n options={options}\n fieldConfig={fieldConfig}\n transparent={displayMode === 'transparent'}\n width={innerWidth}\n height={innerHeight}\n renderCounter={_renderCounter}\n replaceVariables={model.interpolate}\n onOptionsChange={model.onOptionsChange}\n onFieldConfigChange={model.onFieldConfigChange}\n onChangeTimeRange={model.onTimeRangeChange}\n eventBus={context.eventBus}\n />\n )}\n </PanelContextProvider>\n </PluginContextProvider>\n </ErrorBoundaryAlert>\n );\n }}\n </PanelChrome>\n </div>\n </div>\n );\n}\n\nfunction useClearPreviousData(data?: DataFrame[]) {\n // this holds all value arrays from all series or anno frames\n // so we can empty any previous ones that no longer appear in current data\n // why? because React fiber: https://github.com/facebook/react/issues/36176\n const prevVals = useRef<Set<any[]>>();\n const currVals = useRef<Set<any[]>>();\n prevVals.current ??= new Set();\n currVals.current ??= new Set();\n\n const currFrames = data;\n const prevFrames = usePrevious(currFrames);\n\n if (currFrames != null && currFrames !== prevFrames) {\n // populate new\n currVals.current.clear();\n\n for (let i = 0; i < currFrames.length; i++) {\n // skip legacy CircularDataFrame streaming frames\n if ('appendRow' in currFrames[i]) {\n continue;\n }\n\n let fields = currFrames[i].fields;\n\n for (let j = 0; j < fields.length; j++) {\n currVals.current.add(fields[j].values);\n }\n }\n\n // empty out all prev not seen in new\n prevVals.current.forEach((vals) => {\n if (!currVals.current!.has(vals)) {\n vals.length = 0;\n }\n });\n prevVals.current.clear();\n prevVals.current = new Set(currVals.current);\n }\n}\n\nfunction useDataWithSeriesLimit(data: PanelData | undefined, seriesLimit?: number, showAllSeries?: boolean) {\n return useMemo(() => {\n if (!data?.series || !seriesLimit || showAllSeries) {\n return data;\n }\n\n return {\n ...data,\n series: data.series.slice(0, seriesLimit),\n };\n }, [data, seriesLimit, showAllSeries]);\n}\n\nfunction getDragClasses(panel: VizPanel) {\n const parentLayout = sceneGraph.getLayout(panel);\n const isDraggable = parentLayout?.isDraggable();\n\n if (!parentLayout || !isDraggable || itemDraggingDisabled(panel, parentLayout)) {\n return { dragClass: '', dragClassCancel: '' };\n }\n\n return { dragClass: parentLayout.getDragClass?.(), dragClassCancel: parentLayout?.getDragClassCancel?.() };\n}\n\nfunction getDragHooks(panel: VizPanel) {\n const parentLayout = sceneGraph.getLayout(panel);\n return parentLayout?.getDragHooks?.() ?? {};\n}\n\n/**\n * Walks up the parent chain until it hits the layout object, trying to find the closest SceneGridItemLike ancestor.\n * It is not always the direct parent, because the VizPanel can be wrapped in other objects.\n */\nfunction itemDraggingDisabled(item: SceneObject, layout: SceneLayout) {\n let obj: SceneObject | undefined = item;\n\n while (obj && obj !== layout) {\n if ('isDraggable' in obj.state && obj.state.isDraggable === false) {\n return true;\n }\n\n if ('repeatSourceKey' in obj.state && obj.state.repeatSourceKey) {\n return true;\n }\n\n obj = obj.parent;\n }\n\n return false;\n}\n\nfunction getChromeStatusMessage(data: PanelData, pluginLoadingError: string | undefined) {\n if (pluginLoadingError) {\n return pluginLoadingError;\n }\n\n let message = data.error ? data.error.message : undefined;\n\n // Handling multiple errors with a single string until we integrate VizPanel with inspector\n if (data.errors) {\n message = data.errors.map((e) => e.message).join(', ');\n }\n return message;\n}\n\ntype PanelStatusSeverity = QueryResultMetaNotice['severity'];\n\ninterface PanelStatusItem {\n severity: PanelStatusSeverity;\n text: string;\n}\n\n/**\n * Builds the combined list of query errors and result notices shown in the panel header\n * status popover. Errors come from the query response, notices from the frame metadata.\n */\nfunction getChromeStatusItems(data: PanelData, pluginLoadingError: string | undefined): PanelStatusItem[] {\n const items: PanelStatusItem[] = [];\n\n if (pluginLoadingError) {\n items.push({ severity: 'error', text: pluginLoadingError });\n }\n\n const errors = data.errors ?? (data.error ? [data.error] : []);\n for (const error of errors) {\n items.push({ severity: 'error', text: error.message ?? 'Query error' });\n }\n\n const seen = new Set<string>();\n for (const frame of data.series ?? []) {\n for (const notice of frame.meta?.notices ?? []) {\n const severity: PanelStatusSeverity = notice.severity ?? 'info';\n const key = `${severity}:${notice.text}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n items.push({ severity, text: notice.text });\n }\n }\n\n return items;\n}\n\nconst relativeWrapper = css({\n position: 'relative',\n width: '100%',\n height: '100%',\n});\n\n/**\n * Sadly this this absolute wrapper is needed for the panel to adopt smaller sizes.\n * The combo of useMeasure and PanelChrome makes the panel take up the width it get's but that makes it impossible to\n * Then adapt to smaller space (say resizing the browser window or undocking menu).\n */\nconst absoluteWrapper = css({\n position: 'absolute',\n width: '100%',\n height: '100%',\n});\n\nconst getAlertStateStyles = (theme: GrafanaTheme2) => {\n return {\n ok: css({\n color: theme.colors.success.text,\n }),\n pending: css({\n color: theme.colors.warning.text,\n }),\n alerting: css({\n color: theme.colors.error.text,\n }),\n };\n};\n\nlet loadingPluginInstance: PanelPlugin | null = null;\n\nexport function getLoadingPlugin(): PanelPlugin {\n if (loadingPluginInstance) {\n return loadingPluginInstance;\n }\n\n const LoadingPluginComp = memo<PanelProps>(() => {\n return (\n <div>\n <Trans i18nKey=\"grafana-scenes.components.viz-panel-renderer.loading-plugin-panel\">\n Loading plugin panel...\n </Trans>\n </div>\n );\n });\n\n LoadingPluginComp.displayName = 'LoadingPlugin';\n\n loadingPluginInstance = new PanelPlugin(LoadingPluginComp);\n\n loadingPluginInstance.meta = {\n id: 'loading-plugin',\n name: 'Loading Plugin',\n sort: 100,\n type: PluginType.panel,\n module: '',\n baseUrl: '',\n info: {\n author: {\n name: '',\n },\n description: '',\n links: [],\n logos: {\n large: '',\n small: '',\n },\n screenshots: [],\n updated: '',\n version: '',\n },\n };\n\n return loadingPluginInstance;\n}\n"],"names":["_a"],"mappings":"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"}
1
+ {"version":3,"file":"VizPanelRenderer.js","sources":["../../../../src/components/VizPanel/VizPanelRenderer.tsx"],"sourcesContent":["import { Trans, t } from '@grafana/i18n';\nimport React, { memo, RefCallback, useCallback, useEffect, useLayoutEffect, useMemo, useRef } from 'react';\nimport { useMeasure, usePrevious } from 'react-use';\n\n// @ts-ignore\nimport {\n AlertState,\n DataFrame,\n GrafanaTheme2,\n PanelData,\n PanelPlugin,\n PanelProps,\n PluginContextProvider,\n PluginType,\n QueryResultMetaNotice,\n renderMarkdown,\n SetPanelAttentionEvent,\n} from '@grafana/data';\n\nimport { getAppEvents } from '@grafana/runtime';\nimport { PanelChrome, ErrorBoundaryAlert, PanelContextProvider, Tooltip, useStyles2, Icon } from '@grafana/ui';\n\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { isSceneObject, SceneComponentProps, SceneLayout, SceneObject } from '../../core/types';\n\nimport { VizPanel } from './VizPanel';\nimport { css, cx } from '@emotion/css';\nimport { debounce } from 'lodash';\nimport { VizPanelSeriesLimit } from './VizPanelSeriesLimit';\nimport { useLazyLoaderIsInView } from '../layout/LazyLoader';\n\nexport function VizPanelRenderer({ model }: SceneComponentProps<VizPanel>) {\n const {\n title,\n options,\n fieldConfig,\n _pluginLoadError,\n displayMode,\n hoverHeader,\n showMenuAlways,\n hoverHeaderOffset,\n menu,\n headerActions,\n subHeader,\n subtitle,\n titleItems,\n seriesLimit,\n seriesLimitShowAll,\n description,\n collapsible,\n collapsed,\n _renderCounter = 0,\n _UNSAFE_clearPreviousFieldValues = false,\n } = model.useState();\n let [ref, { width, height }] = useMeasure();\n const appEvents = useMemo(() => getAppEvents(), []);\n\n const setPanelAttention = useCallback(() => {\n if (model.state.key) {\n appEvents.publish(new SetPanelAttentionEvent({ panelId: model.getPathId() }));\n }\n }, [model, appEvents]);\n\n const debouncedMouseMove = useMemo(\n () => debounce(setPanelAttention, 100, { leading: true, trailing: false }),\n [setPanelAttention]\n );\n\n // S3.0 RENDER TRACKING: Simple timing for performance measurement\n const profiler = useMemo(() => model.getProfiler(), [model]);\n\n // Capture render start time immediately when component function runs\n const currentRenderStart = performance.now();\n\n const endRenderCallbackRef = React.useRef<((endTimestamp: number, duration: number) => void) | null>(null);\n\n useLayoutEffect(() => {\n if (profiler) {\n const callback = profiler.onSimpleRenderStart(currentRenderStart);\n endRenderCallbackRef.current = callback || null;\n }\n });\n\n const subtitleContent = useMemo(() => {\n if (subtitle) {\n return renderMarkdown(model.interpolate(subtitle, undefined, 'text'));\n }\n return undefined;\n }, [subtitle, model]);\n\n // Use useEffect (after DOM updates) to measure complete render cycle timing\n useEffect(() => {\n if (endRenderCallbackRef.current) {\n const timestamp = performance.now();\n // Measure from component start to after DOM updates AND effects (complete render cycle)\n const duration = timestamp - currentRenderStart;\n endRenderCallbackRef.current(timestamp, duration);\n endRenderCallbackRef.current = null; // Clear callback after use\n }\n });\n\n const plugin = model.getPlugin() ?? getLoadingPlugin();\n\n const { dragClass, dragClassCancel } = getDragClasses(model);\n const dragHooks = getDragHooks(model);\n const dataObject = sceneGraph.getData(model);\n\n const rawData = dataObject.useState();\n\n const { series, annotations } = _UNSAFE_clearPreviousFieldValues ? rawData.data ?? {} : {};\n useClearPreviousData(series);\n useClearPreviousData(annotations);\n\n const dataWithSeriesLimit = useDataWithSeriesLimit(rawData.data, seriesLimit, seriesLimitShowAll);\n const dataWithFieldConfig = model.applyFieldConfig(dataWithSeriesLimit);\n const sceneTimeRange = sceneGraph.getTimeRange(model);\n const timeZone = sceneTimeRange.getTimeZone();\n const timeRange = model.getTimeRange(dataWithFieldConfig);\n\n // Switch to manual query execution if the panel is outside viewport\n const isInView = useLazyLoaderIsInView();\n useEffect(() => {\n if (dataObject.isInViewChanged) {\n dataObject.isInViewChanged(isInView);\n }\n }, [isInView, dataObject]);\n\n // Interpolate title\n const titleInterpolated = model.interpolate(title, undefined, 'text');\n const alertStateStyles = useStyles2(getAlertStateStyles);\n\n if (!plugin.panel) {\n return (\n <div>\n <Trans i18nKey=\"grafana-scenes.components.viz-panel-renderer.panel-plugin-has-no-panel-component\">\n Panel plugin has no panel component\n </Trans>\n </div>\n );\n }\n\n const PanelComponent = plugin.panel;\n\n // If we have a query runner on our level inform it of the container width (used to set auto max data points)\n if (dataObject && dataObject.setContainerWidth) {\n dataObject.setContainerWidth(Math.round(width));\n }\n\n let subHeaderElement: React.ReactNode[] = [];\n\n if (subHeader) {\n if (Array.isArray(subHeader)) {\n subHeaderElement = subHeaderElement.concat(\n subHeader.map((subHeaderItem) => {\n return <subHeaderItem.Component model={subHeaderItem} key={`${subHeaderItem.state.key}`} />;\n })\n );\n } else if (isSceneObject(subHeader)) {\n subHeaderElement.push(<subHeader.Component model={subHeader} key={`${subHeader.state.key}`} />);\n } else {\n subHeaderElement.push(subHeader);\n }\n }\n\n let titleItemsElement: React.ReactNode[] = [];\n\n if (titleItems) {\n if (Array.isArray(titleItems)) {\n titleItemsElement = titleItemsElement.concat(\n titleItems.map((titleItem) => {\n return <titleItem.Component model={titleItem} key={`${titleItem.state.key}`} />;\n })\n );\n } else if (isSceneObject(titleItems)) {\n titleItemsElement.push(<titleItems.Component model={titleItems} />);\n } else {\n titleItemsElement.push(titleItems);\n }\n }\n\n if (seriesLimit) {\n titleItemsElement.push(\n <VizPanelSeriesLimit\n key=\"series-limit\"\n data={rawData.data}\n seriesLimit={seriesLimit}\n showAll={seriesLimitShowAll}\n onShowAllSeries={() => model.setState({ seriesLimitShowAll: !seriesLimitShowAll })}\n />\n );\n }\n\n // If we have local time range show that in panel header\n if (model.state.$timeRange) {\n titleItemsElement.push(<model.state.$timeRange.Component model={model.state.$timeRange} key={model.state.key} />);\n }\n\n if (dataWithFieldConfig.alertState) {\n titleItemsElement.push(\n <Tooltip content={dataWithFieldConfig.alertState.state ?? 'unknown'} key={`alert-states-icon-${model.state.key}`}>\n <PanelChrome.TitleItem\n className={cx({\n [alertStateStyles.ok]: dataWithFieldConfig.alertState.state === AlertState.OK,\n [alertStateStyles.pending]: dataWithFieldConfig.alertState.state === AlertState.Pending,\n [alertStateStyles.alerting]: dataWithFieldConfig.alertState.state === AlertState.Alerting,\n })}\n >\n <Icon\n name={dataWithFieldConfig.alertState.state === 'alerting' ? 'heart-break' : 'heart'}\n className=\"panel-alert-icon\"\n size=\"md\"\n />\n </PanelChrome.TitleItem>\n </Tooltip>\n );\n }\n\n let panelMenu;\n if (menu) {\n panelMenu = <menu.Component model={menu} />;\n }\n\n let actionsElement: React.ReactNode | undefined;\n\n if (headerActions) {\n if (Array.isArray(headerActions)) {\n actionsElement = (\n <>\n {headerActions.map((action) => {\n return <action.Component model={action} key={`${action.state.key}`} />;\n })}\n </>\n );\n } else if (isSceneObject(headerActions)) {\n actionsElement = <headerActions.Component model={headerActions} />;\n } else {\n actionsElement = headerActions;\n }\n }\n\n // Data is always returned. For non-data panels, empty PanelData is returned.\n const data = dataWithFieldConfig!;\n\n const isReadyToRender = dataObject.isDataReadyToDisplay ? dataObject.isDataReadyToDisplay() : true;\n\n const context = model.getPanelContext();\n // The host (e.g. dashboard) only provides an inspector opener when the new panel errors UI\n // is enabled. Use its presence to decide between the new errors/notices popover and the\n // legacy single status message.\n // @ts-expect-error onOpenInspector is added in a newer @grafana/ui version\n const showNewPanelErrorsUI = Boolean(context.onOpenInspector);\n const panelId = model.getLegacyPanelId();\n const outdatedPluginError = t(\n 'grafana-scenes.components.viz-panel-renderer.outdated-plugin-error',\n 'An unexpected error occurred. Updating the \"{{pluginName}}\" plugin to the latest version may fix the problem.',\n { pluginName: plugin.meta.name }\n );\n\n return (\n <div className={relativeWrapper}>\n <div\n ref={ref as RefCallback<HTMLDivElement>}\n className={absoluteWrapper}\n data-viz-panel-key={model.state.key}\n data-viz-panel-id={model.getPathId()}\n data-testid={`${plugin.meta.id}-${model.state.key}`}\n data-plugin-id={plugin.meta.id}\n >\n <PanelChrome\n title={titleInterpolated}\n description={description?.trim() ? model.getDescription : undefined}\n // @ts-expect-error remove this on next grafana/ui update\n subtitle={subtitleContent}\n loadingState={data.state}\n statusMessage={getChromeStatusMessage(data, _pluginLoadError)}\n statusItems={showNewPanelErrorsUI ? getChromeStatusItems(data, _pluginLoadError) : undefined}\n statusMessageOnClick={() => {\n // Report the interaction for analytics, then let the container (e.g. dashboard) open the inspector.\n model.onStatusMessageClick();\n // @ts-expect-error onOpenInspector is added in a newer @grafana/ui version\n context.onOpenInspector?.();\n }}\n width={width === 0 ? undefined : width}\n height={height === 0 ? undefined : height}\n selectionId={model.state.key}\n displayMode={displayMode}\n titleItems={titleItemsElement.length > 0 ? titleItemsElement : undefined}\n dragClass={dragClass}\n actions={actionsElement}\n dragClassCancel={dragClassCancel}\n padding={plugin.noPadding ? 'none' : 'md'}\n menu={panelMenu}\n onCancelQuery={model.onCancelQuery}\n onFocus={setPanelAttention}\n onMouseEnter={setPanelAttention}\n onMouseMove={debouncedMouseMove}\n subHeaderContent={subHeaderElement.length ? subHeaderElement : undefined}\n onDragStart={(e: React.PointerEvent) => {\n dragHooks.onDragStart?.(e, model);\n }}\n showMenuAlways={showMenuAlways}\n {...(collapsible\n ? {\n collapsible: Boolean(collapsible),\n collapsed,\n onToggleCollapse: model.onToggleCollapse,\n }\n : { hoverHeader, hoverHeaderOffset })}\n >\n {(innerWidth, innerHeight) => {\n if (innerWidth === 0 || innerHeight === 0) {\n return null;\n }\n\n return (\n <ErrorBoundaryAlert\n title={plugin.meta.hasUpdate ? outdatedPluginError : undefined}\n dependencies={[plugin, data]}\n >\n <PluginContextProvider meta={plugin.meta}>\n <PanelContextProvider value={context}>\n {isReadyToRender && (\n <PanelComponent\n id={panelId}\n data={data}\n title={title}\n timeRange={timeRange}\n timeZone={timeZone}\n options={options}\n fieldConfig={fieldConfig}\n transparent={displayMode === 'transparent'}\n width={innerWidth}\n height={innerHeight}\n renderCounter={_renderCounter}\n replaceVariables={model.interpolate}\n onOptionsChange={model.onOptionsChange}\n onFieldConfigChange={model.onFieldConfigChange}\n onChangeTimeRange={model.onTimeRangeChange}\n eventBus={context.eventBus}\n />\n )}\n </PanelContextProvider>\n </PluginContextProvider>\n </ErrorBoundaryAlert>\n );\n }}\n </PanelChrome>\n </div>\n </div>\n );\n}\n\nfunction useClearPreviousData(data?: DataFrame[]) {\n // this holds all value arrays from all series or anno frames\n // so we can empty any previous ones that no longer appear in current data\n // why? because React fiber: https://github.com/facebook/react/issues/36176\n const prevVals = useRef<Set<any[]>>();\n const currVals = useRef<Set<any[]>>();\n prevVals.current ??= new Set();\n currVals.current ??= new Set();\n\n const currFrames = data;\n const prevFrames = usePrevious(currFrames);\n\n if (currFrames != null && currFrames !== prevFrames) {\n // populate new\n currVals.current.clear();\n\n for (let i = 0; i < currFrames.length; i++) {\n // skip legacy CircularDataFrame streaming frames\n if ('appendRow' in currFrames[i]) {\n continue;\n }\n\n let fields = currFrames[i].fields;\n\n for (let j = 0; j < fields.length; j++) {\n currVals.current.add(fields[j].values);\n }\n }\n\n // empty out all prev not seen in new\n prevVals.current.forEach((vals) => {\n if (!currVals.current!.has(vals)) {\n vals.length = 0;\n }\n });\n prevVals.current.clear();\n prevVals.current = new Set(currVals.current);\n }\n}\n\nfunction useDataWithSeriesLimit(data: PanelData | undefined, seriesLimit?: number, showAllSeries?: boolean) {\n return useMemo(() => {\n if (!data?.series || !seriesLimit || showAllSeries) {\n return data;\n }\n\n return {\n ...data,\n series: data.series.slice(0, seriesLimit),\n };\n }, [data, seriesLimit, showAllSeries]);\n}\n\nfunction getDragClasses(panel: VizPanel) {\n const parentLayout = sceneGraph.getLayout(panel);\n const isDraggable = parentLayout?.isDraggable();\n\n if (!parentLayout || !isDraggable || itemDraggingDisabled(panel, parentLayout)) {\n return { dragClass: '', dragClassCancel: '' };\n }\n\n return { dragClass: parentLayout.getDragClass?.(), dragClassCancel: parentLayout?.getDragClassCancel?.() };\n}\n\nfunction getDragHooks(panel: VizPanel) {\n const parentLayout = sceneGraph.getLayout(panel);\n return parentLayout?.getDragHooks?.() ?? {};\n}\n\n/**\n * Walks up the parent chain until it hits the layout object, trying to find the closest SceneGridItemLike ancestor.\n * It is not always the direct parent, because the VizPanel can be wrapped in other objects.\n */\nfunction itemDraggingDisabled(item: SceneObject, layout: SceneLayout) {\n let obj: SceneObject | undefined = item;\n\n while (obj && obj !== layout) {\n if ('isDraggable' in obj.state && obj.state.isDraggable === false) {\n return true;\n }\n\n if ('repeatSourceKey' in obj.state && obj.state.repeatSourceKey) {\n return true;\n }\n\n obj = obj.parent;\n }\n\n return false;\n}\n\nfunction getChromeStatusMessage(data: PanelData, pluginLoadingError: string | undefined) {\n if (pluginLoadingError) {\n return pluginLoadingError;\n }\n\n let message = data.error ? data.error.message : undefined;\n\n // Handling multiple errors with a single string until we integrate VizPanel with inspector\n if (data.errors) {\n message = data.errors.map((e) => e.message).join(', ');\n }\n return message;\n}\n\ntype PanelStatusSeverity = QueryResultMetaNotice['severity'];\n\ninterface PanelStatusItem {\n severity: PanelStatusSeverity;\n text: string;\n}\n\n/**\n * Builds the combined list of query errors and result notices shown in the panel header\n * status popover. Errors come from the query response, notices from the frame metadata.\n */\nfunction getChromeStatusItems(data: PanelData, pluginLoadingError: string | undefined): PanelStatusItem[] {\n const items: PanelStatusItem[] = [];\n\n if (pluginLoadingError) {\n items.push({ severity: 'error', text: pluginLoadingError });\n }\n\n const errors = data.errors ?? (data.error ? [data.error] : []);\n for (const error of errors) {\n items.push({ severity: 'error', text: error.message ?? 'Query error' });\n }\n\n const seen = new Set<string>();\n for (const frame of data.series ?? []) {\n for (const notice of frame.meta?.notices ?? []) {\n const severity: PanelStatusSeverity = notice.severity ?? 'info';\n const key = `${severity}:${notice.text}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n items.push({ severity, text: notice.text });\n }\n }\n\n return items;\n}\n\nconst relativeWrapper = css({\n position: 'relative',\n width: '100%',\n height: '100%',\n});\n\n/**\n * Sadly this this absolute wrapper is needed for the panel to adopt smaller sizes.\n * The combo of useMeasure and PanelChrome makes the panel take up the width it get's but that makes it impossible to\n * Then adapt to smaller space (say resizing the browser window or undocking menu).\n */\nconst absoluteWrapper = css({\n position: 'absolute',\n width: '100%',\n height: '100%',\n});\n\nconst getAlertStateStyles = (theme: GrafanaTheme2) => {\n return {\n ok: css({\n color: theme.colors.success.text,\n }),\n pending: css({\n color: theme.colors.warning.text,\n }),\n alerting: css({\n color: theme.colors.error.text,\n }),\n };\n};\n\nlet loadingPluginInstance: PanelPlugin | null = null;\n\nexport function getLoadingPlugin(): PanelPlugin {\n if (loadingPluginInstance) {\n return loadingPluginInstance;\n }\n\n const LoadingPluginComp = memo<PanelProps>(() => {\n return (\n <div>\n <Trans i18nKey=\"grafana-scenes.components.viz-panel-renderer.loading-plugin-panel\">\n Loading plugin panel...\n </Trans>\n </div>\n );\n });\n\n LoadingPluginComp.displayName = 'LoadingPlugin';\n\n loadingPluginInstance = new PanelPlugin(LoadingPluginComp);\n\n loadingPluginInstance.meta = {\n id: 'loading-plugin',\n name: 'Loading Plugin',\n sort: 100,\n type: PluginType.panel,\n module: '',\n baseUrl: '',\n info: {\n author: {\n name: '',\n },\n description: '',\n links: [],\n logos: {\n large: '',\n small: '',\n },\n screenshots: [],\n updated: '',\n version: '',\n },\n };\n\n return loadingPluginInstance;\n}\n"],"names":["_a"],"mappings":"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"}
@@ -4,7 +4,7 @@ import React, { forwardRef } from 'react';
4
4
  import { t } from '@grafana/i18n';
5
5
  import { getNonApplicablePillStyles } from '../../utils.js';
6
6
 
7
- const LABEL_MAX_VISIBLE_LENGTH = 20;
7
+ const LABEL_MAX_VISIBLE_LENGTH = 28;
8
8
  const BasePill = forwardRef(function BasePill2({
9
9
  label,
10
10
  onRemove,
@@ -102,12 +102,15 @@ const getBasePillStyles = (theme) => ({
102
102
  }
103
103
  }),
104
104
  pillText: css({
105
- maxWidth: "200px",
105
+ maxWidth: "280px",
106
106
  width: "100%",
107
107
  textOverflow: "ellipsis",
108
108
  overflow: "hidden"
109
109
  }),
110
110
  tooltipText: css({
111
+ // Match pillText's maxWidth: a wider tooltip gets pushed off-centre by the
112
+ // viewport-edge shift logic when the pill is near the edge of the screen
113
+ maxWidth: "280px",
111
114
  textAlign: "center"
112
115
  }),
113
116
  disabledPillIcon: css({
@@ -1 +1 @@
1
- {"version":3,"file":"BasePill.js","sources":["../../../../../src/variables/adhoc/AdHocFiltersCombobox/BasePill.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2, IconButton, Tooltip } from '@grafana/ui';\nimport React, { forwardRef, ReactNode } from 'react';\nimport { t } from '@grafana/i18n';\nimport { getNonApplicablePillStyles } from '../../utils';\n\nconst LABEL_MAX_VISIBLE_LENGTH = 20;\n\nexport interface BasePillProps {\n label: string;\n removable?: boolean;\n onRemove?: () => void;\n onClick?: (e: React.MouseEvent) => void;\n onKeyDown?: (e: React.KeyboardEvent) => void;\n readOnly?: boolean;\n disabled?: boolean;\n isFilterReadOnly?: boolean;\n strikethrough?: boolean;\n ariaLabel?: string;\n removeAriaLabel?: string;\n additionalIcons?: ReactNode;\n}\n\nexport const BasePill = forwardRef<HTMLDivElement, BasePillProps>(function BasePill(\n {\n label,\n onRemove,\n removable = !!onRemove,\n onClick,\n onKeyDown,\n readOnly,\n disabled,\n isFilterReadOnly,\n strikethrough,\n ariaLabel,\n removeAriaLabel,\n additionalIcons,\n },\n ref\n) {\n const styles = useStyles2(getStyles);\n\n const pillText = <span className={cx(styles.pillText, strikethrough && styles.strikethrough)}>{label}</span>;\n\n return (\n <div\n className={cx(\n styles.combinedFilterPill,\n readOnly && styles.readOnlyCombinedFilter,\n disabled && styles.disabledPill,\n isFilterReadOnly && styles.filterReadOnly\n )}\n onClick={onClick}\n onKeyDown={onKeyDown}\n role={readOnly ? undefined : 'button'}\n aria-label={ariaLabel}\n tabIndex={0}\n ref={ref}\n >\n {label.length < LABEL_MAX_VISIBLE_LENGTH ? (\n pillText\n ) : (\n <Tooltip content={<div className={styles.tooltipText}>{label}</div>} placement=\"top\">\n {pillText}\n </Tooltip>\n )}\n\n {removable && onRemove && (\n <IconButton\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n onKeyDownCapture={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n e.stopPropagation();\n onRemove();\n }\n }}\n name=\"times\"\n size=\"md\"\n className={cx(styles.pillIcon, disabled && styles.disabledPillIcon)}\n tooltip={removeAriaLabel ?? t('grafana-scenes.components.base-pill.remove', 'Remove {{label}}', { label })}\n />\n )}\n\n {additionalIcons}\n </div>\n );\n});\n\nexport const getBasePillStyles = (theme: GrafanaTheme2) => ({\n combinedFilterPill: css({\n display: 'flex',\n alignItems: 'center',\n background: theme.colors.action.selected,\n borderRadius: theme.shape.radius.default,\n border: `1px solid ${theme.colors.border.weak}`,\n padding: theme.spacing(0.125, 0, 0.125, 1),\n color: theme.colors.text.primary,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n minHeight: theme.spacing(2.75),\n ...theme.typography.bodySmall,\n fontWeight: theme.typography.fontWeightBold,\n cursor: 'pointer',\n\n '&:hover': {\n background: theme.colors.action.hover,\n },\n }),\n readOnlyCombinedFilter: css({\n paddingRight: theme.spacing(1),\n cursor: 'text',\n '&:hover': {\n background: theme.colors.action.selected,\n },\n }),\n filterReadOnly: css({\n background: theme.colors.background.canvas,\n cursor: 'text',\n '&:hover': {\n background: theme.colors.background.canvas,\n },\n }),\n pillIcon: css({\n marginInline: theme.spacing(0.5),\n cursor: 'pointer',\n '&:hover': {\n color: theme.colors.text.primary,\n },\n }),\n pillText: css({\n maxWidth: '200px',\n width: '100%',\n textOverflow: 'ellipsis',\n overflow: 'hidden',\n }),\n tooltipText: css({\n textAlign: 'center',\n }),\n disabledPillIcon: css({\n marginInline: theme.spacing(0.5),\n cursor: 'pointer',\n color: theme.colors.text.disabled,\n '&:hover': {\n color: theme.colors.text.disabled,\n },\n }),\n ...getNonApplicablePillStyles(theme),\n});\n\nconst getStyles = getBasePillStyles;\n"],"names":["BasePill","getStyles"],"mappings":"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"}
1
+ {"version":3,"file":"BasePill.js","sources":["../../../../../src/variables/adhoc/AdHocFiltersCombobox/BasePill.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2, IconButton, Tooltip } from '@grafana/ui';\nimport React, { forwardRef, ReactNode } from 'react';\nimport { t } from '@grafana/i18n';\nimport { getNonApplicablePillStyles } from '../../utils';\n\n// Tooltip threshold, roughly matching how many characters fit in pillText's maxWidth\nconst LABEL_MAX_VISIBLE_LENGTH = 28;\n\nexport interface BasePillProps {\n label: string;\n removable?: boolean;\n onRemove?: () => void;\n onClick?: (e: React.MouseEvent) => void;\n onKeyDown?: (e: React.KeyboardEvent) => void;\n readOnly?: boolean;\n disabled?: boolean;\n isFilterReadOnly?: boolean;\n strikethrough?: boolean;\n ariaLabel?: string;\n removeAriaLabel?: string;\n additionalIcons?: ReactNode;\n}\n\nexport const BasePill = forwardRef<HTMLDivElement, BasePillProps>(function BasePill(\n {\n label,\n onRemove,\n removable = !!onRemove,\n onClick,\n onKeyDown,\n readOnly,\n disabled,\n isFilterReadOnly,\n strikethrough,\n ariaLabel,\n removeAriaLabel,\n additionalIcons,\n },\n ref\n) {\n const styles = useStyles2(getStyles);\n\n const pillText = <span className={cx(styles.pillText, strikethrough && styles.strikethrough)}>{label}</span>;\n\n return (\n <div\n className={cx(\n styles.combinedFilterPill,\n readOnly && styles.readOnlyCombinedFilter,\n disabled && styles.disabledPill,\n isFilterReadOnly && styles.filterReadOnly\n )}\n onClick={onClick}\n onKeyDown={onKeyDown}\n role={readOnly ? undefined : 'button'}\n aria-label={ariaLabel}\n tabIndex={0}\n ref={ref}\n >\n {label.length < LABEL_MAX_VISIBLE_LENGTH ? (\n pillText\n ) : (\n <Tooltip content={<div className={styles.tooltipText}>{label}</div>} placement=\"top\">\n {pillText}\n </Tooltip>\n )}\n\n {removable && onRemove && (\n <IconButton\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n onKeyDownCapture={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n e.stopPropagation();\n onRemove();\n }\n }}\n name=\"times\"\n size=\"md\"\n className={cx(styles.pillIcon, disabled && styles.disabledPillIcon)}\n tooltip={removeAriaLabel ?? t('grafana-scenes.components.base-pill.remove', 'Remove {{label}}', { label })}\n />\n )}\n\n {additionalIcons}\n </div>\n );\n});\n\nexport const getBasePillStyles = (theme: GrafanaTheme2) => ({\n combinedFilterPill: css({\n display: 'flex',\n alignItems: 'center',\n background: theme.colors.action.selected,\n borderRadius: theme.shape.radius.default,\n border: `1px solid ${theme.colors.border.weak}`,\n padding: theme.spacing(0.125, 0, 0.125, 1),\n color: theme.colors.text.primary,\n overflow: 'hidden',\n whiteSpace: 'nowrap',\n minHeight: theme.spacing(2.75),\n ...theme.typography.bodySmall,\n fontWeight: theme.typography.fontWeightBold,\n cursor: 'pointer',\n\n '&:hover': {\n background: theme.colors.action.hover,\n },\n }),\n readOnlyCombinedFilter: css({\n paddingRight: theme.spacing(1),\n cursor: 'text',\n '&:hover': {\n background: theme.colors.action.selected,\n },\n }),\n filterReadOnly: css({\n background: theme.colors.background.canvas,\n cursor: 'text',\n '&:hover': {\n background: theme.colors.background.canvas,\n },\n }),\n pillIcon: css({\n marginInline: theme.spacing(0.5),\n cursor: 'pointer',\n '&:hover': {\n color: theme.colors.text.primary,\n },\n }),\n pillText: css({\n maxWidth: '280px',\n width: '100%',\n textOverflow: 'ellipsis',\n overflow: 'hidden',\n }),\n tooltipText: css({\n // Match pillText's maxWidth: a wider tooltip gets pushed off-centre by the\n // viewport-edge shift logic when the pill is near the edge of the screen\n maxWidth: '280px',\n textAlign: 'center',\n }),\n disabledPillIcon: css({\n marginInline: theme.spacing(0.5),\n cursor: 'pointer',\n color: theme.colors.text.disabled,\n '&:hover': {\n color: theme.colors.text.disabled,\n },\n }),\n ...getNonApplicablePillStyles(theme),\n});\n\nconst getStyles = getBasePillStyles;\n"],"names":["BasePill","getStyles"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -3790,7 +3790,8 @@ function VizPanelRenderer({ model }) {
3790
3790
  className: absoluteWrapper,
3791
3791
  "data-viz-panel-key": model.state.key,
3792
3792
  "data-viz-panel-id": model.getPathId(),
3793
- "data-testid": `${plugin.meta.id}-${model.state.key}`
3793
+ "data-testid": `${plugin.meta.id}-${model.state.key}`,
3794
+ "data-plugin-id": plugin.meta.id
3794
3795
  },
3795
3796
  /* @__PURE__ */ React__default.default.createElement(
3796
3797
  ui.PanelChrome,
@@ -7796,7 +7797,7 @@ const getStyles$g = (theme) => ({
7796
7797
  })
7797
7798
  });
7798
7799
 
7799
- const LABEL_MAX_VISIBLE_LENGTH = 20;
7800
+ const LABEL_MAX_VISIBLE_LENGTH = 28;
7800
7801
  const BasePill = React.forwardRef(function BasePill2({
7801
7802
  label,
7802
7803
  onRemove,
@@ -7894,12 +7895,15 @@ const getBasePillStyles = (theme) => ({
7894
7895
  }
7895
7896
  }),
7896
7897
  pillText: css.css({
7897
- maxWidth: "200px",
7898
+ maxWidth: "280px",
7898
7899
  width: "100%",
7899
7900
  textOverflow: "ellipsis",
7900
7901
  overflow: "hidden"
7901
7902
  }),
7902
7903
  tooltipText: css.css({
7904
+ // Match pillText's maxWidth: a wider tooltip gets pushed off-centre by the
7905
+ // viewport-edge shift logic when the pill is near the edge of the screen
7906
+ maxWidth: "280px",
7903
7907
  textAlign: "center"
7904
7908
  }),
7905
7909
  disabledPillIcon: css.css({