@grafana/scenes 0.23.0 → 0.24.0

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,25 @@
1
+ # v0.24.0 (Fri Aug 04 2023)
2
+
3
+ #### 🚀 Enhancement
4
+
5
+ - Tabs: Add icon and suffix [#248](https://github.com/grafana/scenes/pull/248) ([@pbaumard](https://github.com/pbaumard))
6
+
7
+ #### 🐛 Bug Fix
8
+
9
+ - PanelBuilders: Fix default options being mutated [#274](https://github.com/grafana/scenes/pull/274) ([@dprokop](https://github.com/dprokop))
10
+
11
+ #### 🔩 Dependency Updates
12
+
13
+ - Bump grafana dependencies [#273](https://github.com/grafana/scenes/pull/273) ([@kaydelaney](https://github.com/kaydelaney))
14
+
15
+ #### Authors: 3
16
+
17
+ - Dominik Prokop ([@dprokop](https://github.com/dprokop))
18
+ - kay delaney ([@kaydelaney](https://github.com/kaydelaney))
19
+ - Pierre Baumard ([@pbaumard](https://github.com/pbaumard))
20
+
21
+ ---
22
+
1
23
  # v0.23.0 (Wed Jul 19 2023)
2
24
 
3
25
  #### 🚀 Enhancement
@@ -31,6 +31,8 @@ function SceneAppPageView({ page, routeProps }) {
31
31
  pageNav.children = containerState.tabs.map((tab) => {
32
32
  return {
33
33
  text: tab.state.title,
34
+ icon: tab.state.titleIcon,
35
+ tabSuffix: tab.state.tabSuffix,
34
36
  active: page === tab,
35
37
  url: getUrlWithAppState(tab.state.url, tab.state.preserveUrlKeys),
36
38
  parentItem: pageNav
@@ -1 +1 @@
1
- {"version":3,"file":"SceneAppPageView.js","sources":["../../../../src/components/SceneApp/SceneAppPageView.tsx"],"sourcesContent":["import { NavModelItem, UrlQueryMap } from '@grafana/data';\nimport { PluginPage } from '@grafana/runtime';\nimport React, { useLayoutEffect, useState } from 'react';\n\nimport { RouteComponentProps } from 'react-router-dom';\nimport { SceneObject } from '../../core/types';\nimport { SceneAppPage } from './SceneAppPage';\nimport { SceneAppDrilldownView, SceneAppPageLike } from './types';\nimport { getUrlWithAppState, renderSceneComponentWithRouteProps, useAppQueryParams } from './utils';\n\nexport interface Props {\n page: SceneAppPageLike;\n // activeTab?: SceneAppPageLike;\n routeProps: RouteComponentProps;\n}\n\nexport function SceneAppPageView({ page, routeProps }: Props) {\n const containerPage = getParentPageIfTab(page);\n const containerState = containerPage.useState();\n const params = useAppQueryParams();\n const scene = page.getScene(routeProps.match);\n const [initialized, setInitialized] = useState(false);\n\n useLayoutEffect(() => {\n // Before rendering scene components, we are making sure the URL sync is enabled for.\n if (!initialized) {\n containerPage.initializeScene(scene);\n setInitialized(true);\n }\n }, [initialized, scene, containerPage]);\n\n if (!initialized) {\n return null;\n }\n\n const pageNav: NavModelItem = {\n text: containerState.title,\n img: containerState.titleImg,\n icon: containerState.titleIcon,\n url: getUrlWithAppState(containerState.url, containerState.preserveUrlKeys),\n hideFromBreadcrumbs: containerState.hideFromBreadcrumbs,\n parentItem: getParentBreadcrumbs(\n containerState.getParentPage ? containerState.getParentPage() : containerPage.parent,\n params\n ),\n };\n\n if (containerState.tabs) {\n pageNav.children = containerState.tabs.map((tab) => {\n return {\n text: tab.state.title,\n active: page === tab,\n url: getUrlWithAppState(tab.state.url, tab.state.preserveUrlKeys),\n parentItem: pageNav,\n };\n });\n }\n\n let pageActions: React.ReactNode = undefined;\n if (containerState.controls) {\n pageActions = containerState.controls.map((control) => (\n <control.Component model={control} key={control.state.key} />\n ));\n }\n\n return (\n <PluginPage\n pageNav={pageNav}\n actions={pageActions}\n renderTitle={containerState.renderTitle}\n subTitle={containerState.subTitle}\n >\n <scene.Component model={scene} />\n </PluginPage>\n );\n}\n\n/**\n * For pages that are \"tabs\" this will return the parent page\n */\nfunction getParentPageIfTab(page: SceneAppPageLike) {\n if (page.parent instanceof SceneAppPage) {\n return page.parent;\n }\n\n return page;\n}\n\nfunction getParentBreadcrumbs(parent: SceneObject | undefined, params: UrlQueryMap): NavModelItem | undefined {\n if (parent instanceof SceneAppPage) {\n return {\n text: parent.state.title,\n url: getUrlWithAppState(parent.state.url, parent.state.preserveUrlKeys),\n hideFromBreadcrumbs: parent.state.hideFromBreadcrumbs,\n parentItem: getParentBreadcrumbs(\n parent.state.getParentPage ? parent.state.getParentPage() : parent.parent,\n params\n ),\n };\n }\n\n return undefined;\n}\n\nexport interface SceneAppDrilldownViewRenderProps {\n drilldown: SceneAppDrilldownView;\n parent: SceneAppPageLike;\n routeProps: RouteComponentProps;\n}\n\nexport function SceneAppDrilldownViewRender({ drilldown, parent, routeProps }: SceneAppDrilldownViewRenderProps) {\n return renderSceneComponentWithRouteProps(parent.getDrilldownPage(drilldown, routeProps.match), routeProps);\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SceneAppPageView.js","sources":["../../../../src/components/SceneApp/SceneAppPageView.tsx"],"sourcesContent":["import { NavModelItem, UrlQueryMap } from '@grafana/data';\nimport { PluginPage } from '@grafana/runtime';\nimport React, { useLayoutEffect, useState } from 'react';\n\nimport { RouteComponentProps } from 'react-router-dom';\nimport { SceneObject } from '../../core/types';\nimport { SceneAppPage } from './SceneAppPage';\nimport { SceneAppDrilldownView, SceneAppPageLike } from './types';\nimport { getUrlWithAppState, renderSceneComponentWithRouteProps, useAppQueryParams } from './utils';\n\nexport interface Props {\n page: SceneAppPageLike;\n // activeTab?: SceneAppPageLike;\n routeProps: RouteComponentProps;\n}\n\nexport function SceneAppPageView({ page, routeProps }: Props) {\n const containerPage = getParentPageIfTab(page);\n const containerState = containerPage.useState();\n const params = useAppQueryParams();\n const scene = page.getScene(routeProps.match);\n const [initialized, setInitialized] = useState(false);\n\n useLayoutEffect(() => {\n // Before rendering scene components, we are making sure the URL sync is enabled for.\n if (!initialized) {\n containerPage.initializeScene(scene);\n setInitialized(true);\n }\n }, [initialized, scene, containerPage]);\n\n if (!initialized) {\n return null;\n }\n\n const pageNav: NavModelItem = {\n text: containerState.title,\n img: containerState.titleImg,\n icon: containerState.titleIcon,\n url: getUrlWithAppState(containerState.url, containerState.preserveUrlKeys),\n hideFromBreadcrumbs: containerState.hideFromBreadcrumbs,\n parentItem: getParentBreadcrumbs(\n containerState.getParentPage ? containerState.getParentPage() : containerPage.parent,\n params\n ),\n };\n\n if (containerState.tabs) {\n pageNav.children = containerState.tabs.map((tab) => {\n return {\n text: tab.state.title,\n icon: tab.state.titleIcon,\n tabSuffix: tab.state.tabSuffix,\n active: page === tab,\n url: getUrlWithAppState(tab.state.url, tab.state.preserveUrlKeys),\n parentItem: pageNav,\n };\n });\n }\n\n let pageActions: React.ReactNode = undefined;\n if (containerState.controls) {\n pageActions = containerState.controls.map((control) => (\n <control.Component model={control} key={control.state.key} />\n ));\n }\n\n return (\n <PluginPage\n pageNav={pageNav}\n actions={pageActions}\n renderTitle={containerState.renderTitle}\n subTitle={containerState.subTitle}\n >\n <scene.Component model={scene} />\n </PluginPage>\n );\n}\n\n/**\n * For pages that are \"tabs\" this will return the parent page\n */\nfunction getParentPageIfTab(page: SceneAppPageLike) {\n if (page.parent instanceof SceneAppPage) {\n return page.parent;\n }\n\n return page;\n}\n\nfunction getParentBreadcrumbs(parent: SceneObject | undefined, params: UrlQueryMap): NavModelItem | undefined {\n if (parent instanceof SceneAppPage) {\n return {\n text: parent.state.title,\n url: getUrlWithAppState(parent.state.url, parent.state.preserveUrlKeys),\n hideFromBreadcrumbs: parent.state.hideFromBreadcrumbs,\n parentItem: getParentBreadcrumbs(\n parent.state.getParentPage ? parent.state.getParentPage() : parent.parent,\n params\n ),\n };\n }\n\n return undefined;\n}\n\nexport interface SceneAppDrilldownViewRenderProps {\n drilldown: SceneAppDrilldownView;\n parent: SceneAppPageLike;\n routeProps: RouteComponentProps;\n}\n\nexport function SceneAppDrilldownViewRender({ drilldown, parent, routeProps }: SceneAppDrilldownViewRenderProps) {\n return renderSceneComponentWithRouteProps(parent.getDrilldownPage(drilldown, routeProps.match), routeProps);\n}\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { merge } from 'lodash';
1
+ import { cloneDeep, merge } from 'lodash';
2
2
  import { VizPanel } from '../../components/VizPanel/VizPanel.js';
3
3
  import { FieldConfigOverridesBuilder } from './FieldConfigOverridesBuilder.js';
4
4
 
@@ -35,11 +35,11 @@ class VizPanelBuilder {
35
35
  this._state.pluginVersion = pluginVersion;
36
36
  const fieldConfig = {
37
37
  defaults: {
38
- custom: defaultFieldConfig ? defaultFieldConfig() : {}
38
+ custom: defaultFieldConfig ? cloneDeep(defaultFieldConfig()) : {}
39
39
  },
40
40
  overrides: []
41
41
  };
42
- this._state.options = defaultOptions ? defaultOptions() : {};
42
+ this._state.options = defaultOptions ? cloneDeep(defaultOptions()) : {};
43
43
  this._state.fieldConfig = fieldConfig;
44
44
  }
45
45
  setTitle(title) {
@@ -1 +1 @@
1
- {"version":3,"file":"VizPanelBuilder.js","sources":["../../../../src/core/PanelBuilders/VizPanelBuilder.ts"],"sourcesContent":["import { FieldConfigSource } from '@grafana/data';\nimport { merge } from 'lodash';\n\nimport { VizPanel, VizPanelState } from '../../components/VizPanel/VizPanel';\nimport { DeepPartial } from '../types';\nimport { FieldConfigOverridesBuilder } from './FieldConfigOverridesBuilder';\nimport { StandardFieldConfig, StandardFieldConfigInterface } from './types';\n\nexport class VizPanelBuilder<TOptions, TFieldConfig extends {}>\n implements StandardFieldConfigInterface<StandardFieldConfig, VizPanelBuilder<TOptions, TFieldConfig>, 'set'>\n{\n private _state: VizPanelState<TOptions, TFieldConfig> = {} as VizPanelState<TOptions, TFieldConfig>;\n private _overridesBuilder = new FieldConfigOverridesBuilder<TFieldConfig>();\n\n public constructor(\n pluginId: string,\n pluginVersion: string,\n defaultOptions?: () => Partial<TOptions>,\n defaultFieldConfig?: () => TFieldConfig\n ) {\n this._state.title = '';\n this._state.description = '';\n this._state.displayMode = 'default';\n this._state.hoverHeader = false;\n this._state.isDraggable = false;\n this._state.isResizable = false;\n this._state.pluginId = pluginId;\n this._state.pluginVersion = pluginVersion;\n const fieldConfig: FieldConfigSource<TFieldConfig> = {\n defaults: {\n custom: defaultFieldConfig ? defaultFieldConfig() : ({} as TFieldConfig),\n }, // use field config factory that will provide default field config\n overrides: [],\n };\n\n this._state.options = defaultOptions ? defaultOptions() : ({} as TOptions);\n this._state.fieldConfig = fieldConfig;\n }\n\n /**\n * Set panel title.\n */\n public setTitle(title: VizPanelState['title']): this {\n this._state.title = title;\n return this;\n }\n\n /**\n * Set panel description.\n */\n public setDescription(description: VizPanelState['description']): this {\n this._state.description = description;\n return this;\n }\n\n /**\n * Set panel display mode.\n */\n public setDisplayMode(displayMode: VizPanelState['displayMode']): this {\n this._state.displayMode = displayMode;\n return this;\n }\n\n /**\n * Set if panel header should be shown on hover.\n */\n public setHoverHeader(hoverHeader: VizPanelState['hoverHeader']): this {\n this._state.hoverHeader = hoverHeader;\n return this;\n }\n\n /**\n * Set if panel is draggable.\n */\n public setIsDraggable(isDraggable: VizPanelState['isDraggable']): this {\n this._state.isDraggable = isDraggable;\n return this;\n }\n\n /**\n * Set if panel is resizable.\n */\n public setIsResizable(isResizable: VizPanelState['isResizable']): this {\n this._state.isResizable = isResizable;\n return this;\n }\n\n /**\n * Set panel menu scene object.\n */\n public setMenu(menu: VizPanelState['menu']): this {\n this._state.menu = menu;\n return this;\n }\n\n /**\n * Set scene object or react component to use as panel header actions.\n */\n public setHeaderActions(headerActions: VizPanelState['headerActions']): this {\n this._state.headerActions = headerActions;\n return this;\n }\n\n /**\n * Set color.\n */\n public setColor(color: StandardFieldConfig['color']): this {\n return this.setFieldConfigDefaults('color', color);\n }\n\n /**\n * Set number of decimals to show.\n */\n public setDecimals(decimals: StandardFieldConfig['decimals']): this {\n return this.setFieldConfigDefaults('decimals', decimals);\n }\n\n /**\n * Set field display name.\n */\n public setDisplayName(displayName: StandardFieldConfig['displayName']): this {\n return this.setFieldConfigDefaults('displayName', displayName);\n }\n\n /**\n * Set the standard field config property filterable.\n */\n public setFilterable(filterable: StandardFieldConfig['filterable']): this {\n return this.setFieldConfigDefaults('filterable', filterable);\n }\n\n /**\n * Set data links.\n */\n public setLinks(links: StandardFieldConfig['links']): this {\n return this.setFieldConfigDefaults('links', links);\n }\n\n /**\n * Set value mappings.\n */\n public setMappings(mappings: StandardFieldConfig['mappings']): this {\n return this.setFieldConfigDefaults('mappings', mappings);\n }\n\n /**\n * Set the standard field config property max.\n */\n public setMax(max: StandardFieldConfig['max']): this {\n return this.setFieldConfigDefaults('max', max);\n }\n\n /**\n * Set the standard field config property min.\n */\n public setMin(min: StandardFieldConfig['min']): this {\n return this.setFieldConfigDefaults('min', min);\n }\n\n /**\n * Set the standard field config property noValue.\n */\n public setNoValue(noValue: StandardFieldConfig['noValue']): this {\n return this.setFieldConfigDefaults('noValue', noValue);\n }\n\n /**\n * Set the standard field config property thresholds.\n */\n public setThresholds(thresholds: StandardFieldConfig['thresholds']): this {\n return this.setFieldConfigDefaults('thresholds', thresholds);\n }\n\n /**\n * Set the standard field config property unit.\n */\n public setUnit(unit: StandardFieldConfig['unit']): this {\n return this.setFieldConfigDefaults('unit', unit);\n }\n\n /**\n * Set an individual panel option. This will merge the value with the existing options.\n */\n public setOption<T extends TOptions, K extends keyof T>(id: K, value: DeepPartial<T[K]>): this {\n this._state.options = merge(this._state.options, { [id]: value });\n return this;\n }\n\n /**\n * Set an individual custom field config value. This will merge the value with the existing custom field config.\n */\n public setCustomFieldConfig<T extends TFieldConfig, K extends keyof T>(id: K, value: DeepPartial<T[K]>): this {\n this._state.fieldConfig.defaults = {\n ...this._state.fieldConfig.defaults,\n custom: merge(this._state.fieldConfig.defaults.custom, { [id]: value }),\n };\n\n return this;\n }\n\n /**\n * Configure overrides for the field config. This will merge the overrides with the existing overrides.\n */\n public setOverrides(builder: (b: FieldConfigOverridesBuilder<TFieldConfig>) => void): this {\n builder(this._overridesBuilder);\n return this;\n }\n\n /**\n * Set data provider for the panel.\n */\n public setData(data: VizPanelState['$data']): this {\n this._state.$data = data;\n return this;\n }\n\n /**\n * Set time range for the panel.\n */\n public setTimeRange(timeRange: VizPanelState['$timeRange']): this {\n this._state.$timeRange = timeRange;\n return this;\n }\n\n /**\n * Set variables for the panel.\n */\n public setVariables(variables: VizPanelState['$variables']): this {\n this._state.$variables = variables;\n return this;\n }\n\n /**\n * Set behaviors for the panel.\n */\n public setBehaviors(behaviors: VizPanelState['$behaviors']): this {\n this._state.$behaviors = behaviors;\n return this;\n }\n\n /**\n * Build the panel.\n */\n public build() {\n return new VizPanel<TOptions, TFieldConfig>({\n ...this._state,\n fieldConfig: {\n defaults: this._state.fieldConfig.defaults,\n overrides: this._overridesBuilder.build(),\n },\n });\n }\n\n private setFieldConfigDefaults<T extends keyof StandardFieldConfig>(key: T, value: StandardFieldConfig[T]) {\n this._state.fieldConfig.defaults = {\n ...this._state.fieldConfig.defaults,\n [key]: value,\n };\n return this;\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"VizPanelBuilder.js","sources":["../../../../src/core/PanelBuilders/VizPanelBuilder.ts"],"sourcesContent":["import { FieldConfigSource } from '@grafana/data';\nimport { merge, cloneDeep } from 'lodash';\n\nimport { VizPanel, VizPanelState } from '../../components/VizPanel/VizPanel';\nimport { DeepPartial } from '../types';\nimport { FieldConfigOverridesBuilder } from './FieldConfigOverridesBuilder';\nimport { StandardFieldConfig, StandardFieldConfigInterface } from './types';\n\nexport class VizPanelBuilder<TOptions, TFieldConfig extends {}>\n implements StandardFieldConfigInterface<StandardFieldConfig, VizPanelBuilder<TOptions, TFieldConfig>, 'set'>\n{\n private _state: VizPanelState<TOptions, TFieldConfig> = {} as VizPanelState<TOptions, TFieldConfig>;\n private _overridesBuilder = new FieldConfigOverridesBuilder<TFieldConfig>();\n\n public constructor(\n pluginId: string,\n pluginVersion: string,\n defaultOptions?: () => Partial<TOptions>,\n defaultFieldConfig?: () => TFieldConfig\n ) {\n this._state.title = '';\n this._state.description = '';\n this._state.displayMode = 'default';\n this._state.hoverHeader = false;\n this._state.isDraggable = false;\n this._state.isResizable = false;\n this._state.pluginId = pluginId;\n this._state.pluginVersion = pluginVersion;\n const fieldConfig: FieldConfigSource<TFieldConfig> = {\n defaults: {\n custom: defaultFieldConfig ? cloneDeep(defaultFieldConfig()) : ({} as TFieldConfig),\n }, // use field config factory that will provide default field config\n overrides: [],\n };\n\n this._state.options = defaultOptions ? cloneDeep(defaultOptions()) : ({} as TOptions);\n this._state.fieldConfig = fieldConfig;\n }\n\n /**\n * Set panel title.\n */\n public setTitle(title: VizPanelState['title']): this {\n this._state.title = title;\n return this;\n }\n\n /**\n * Set panel description.\n */\n public setDescription(description: VizPanelState['description']): this {\n this._state.description = description;\n return this;\n }\n\n /**\n * Set panel display mode.\n */\n public setDisplayMode(displayMode: VizPanelState['displayMode']): this {\n this._state.displayMode = displayMode;\n return this;\n }\n\n /**\n * Set if panel header should be shown on hover.\n */\n public setHoverHeader(hoverHeader: VizPanelState['hoverHeader']): this {\n this._state.hoverHeader = hoverHeader;\n return this;\n }\n\n /**\n * Set if panel is draggable.\n */\n public setIsDraggable(isDraggable: VizPanelState['isDraggable']): this {\n this._state.isDraggable = isDraggable;\n return this;\n }\n\n /**\n * Set if panel is resizable.\n */\n public setIsResizable(isResizable: VizPanelState['isResizable']): this {\n this._state.isResizable = isResizable;\n return this;\n }\n\n /**\n * Set panel menu scene object.\n */\n public setMenu(menu: VizPanelState['menu']): this {\n this._state.menu = menu;\n return this;\n }\n\n /**\n * Set scene object or react component to use as panel header actions.\n */\n public setHeaderActions(headerActions: VizPanelState['headerActions']): this {\n this._state.headerActions = headerActions;\n return this;\n }\n\n /**\n * Set color.\n */\n public setColor(color: StandardFieldConfig['color']): this {\n return this.setFieldConfigDefaults('color', color);\n }\n\n /**\n * Set number of decimals to show.\n */\n public setDecimals(decimals: StandardFieldConfig['decimals']): this {\n return this.setFieldConfigDefaults('decimals', decimals);\n }\n\n /**\n * Set field display name.\n */\n public setDisplayName(displayName: StandardFieldConfig['displayName']): this {\n return this.setFieldConfigDefaults('displayName', displayName);\n }\n\n /**\n * Set the standard field config property filterable.\n */\n public setFilterable(filterable: StandardFieldConfig['filterable']): this {\n return this.setFieldConfigDefaults('filterable', filterable);\n }\n\n /**\n * Set data links.\n */\n public setLinks(links: StandardFieldConfig['links']): this {\n return this.setFieldConfigDefaults('links', links);\n }\n\n /**\n * Set value mappings.\n */\n public setMappings(mappings: StandardFieldConfig['mappings']): this {\n return this.setFieldConfigDefaults('mappings', mappings);\n }\n\n /**\n * Set the standard field config property max.\n */\n public setMax(max: StandardFieldConfig['max']): this {\n return this.setFieldConfigDefaults('max', max);\n }\n\n /**\n * Set the standard field config property min.\n */\n public setMin(min: StandardFieldConfig['min']): this {\n return this.setFieldConfigDefaults('min', min);\n }\n\n /**\n * Set the standard field config property noValue.\n */\n public setNoValue(noValue: StandardFieldConfig['noValue']): this {\n return this.setFieldConfigDefaults('noValue', noValue);\n }\n\n /**\n * Set the standard field config property thresholds.\n */\n public setThresholds(thresholds: StandardFieldConfig['thresholds']): this {\n return this.setFieldConfigDefaults('thresholds', thresholds);\n }\n\n /**\n * Set the standard field config property unit.\n */\n public setUnit(unit: StandardFieldConfig['unit']): this {\n return this.setFieldConfigDefaults('unit', unit);\n }\n\n /**\n * Set an individual panel option. This will merge the value with the existing options.\n */\n public setOption<T extends TOptions, K extends keyof T>(id: K, value: DeepPartial<T[K]>): this {\n this._state.options = merge(this._state.options, { [id]: value });\n return this;\n }\n\n /**\n * Set an individual custom field config value. This will merge the value with the existing custom field config.\n */\n public setCustomFieldConfig<T extends TFieldConfig, K extends keyof T>(id: K, value: DeepPartial<T[K]>): this {\n this._state.fieldConfig.defaults = {\n ...this._state.fieldConfig.defaults,\n custom: merge(this._state.fieldConfig.defaults.custom, { [id]: value }),\n };\n\n return this;\n }\n\n /**\n * Configure overrides for the field config. This will merge the overrides with the existing overrides.\n */\n public setOverrides(builder: (b: FieldConfigOverridesBuilder<TFieldConfig>) => void): this {\n builder(this._overridesBuilder);\n return this;\n }\n\n /**\n * Set data provider for the panel.\n */\n public setData(data: VizPanelState['$data']): this {\n this._state.$data = data;\n return this;\n }\n\n /**\n * Set time range for the panel.\n */\n public setTimeRange(timeRange: VizPanelState['$timeRange']): this {\n this._state.$timeRange = timeRange;\n return this;\n }\n\n /**\n * Set variables for the panel.\n */\n public setVariables(variables: VizPanelState['$variables']): this {\n this._state.$variables = variables;\n return this;\n }\n\n /**\n * Set behaviors for the panel.\n */\n public setBehaviors(behaviors: VizPanelState['$behaviors']): this {\n this._state.$behaviors = behaviors;\n return this;\n }\n\n /**\n * Build the panel.\n */\n public build() {\n return new VizPanel<TOptions, TFieldConfig>({\n ...this._state,\n fieldConfig: {\n defaults: this._state.fieldConfig.defaults,\n overrides: this._overridesBuilder.build(),\n },\n });\n }\n\n private setFieldConfigDefaults<T extends keyof StandardFieldConfig>(key: T, value: StandardFieldConfig[T]) {\n this._state.fieldConfig.defaults = {\n ...this._state.fieldConfig.defaults,\n [key]: value,\n };\n return this;\n }\n}\n"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { BusEventWithPayload, PanelData, BusEvent, BusEventType, BusEventHandler, TimeRange, DataTransformContext, DataFrame, PanelPlugin, DataQuery, DataSourceApi, ScopedVars, EventBus, EventFilterOptions, DataTransformerConfig, Registry, RegistryItem, DataSourceRef as DataSourceRef$1, VariableRefresh, VariableSort, PanelMenuItem, FieldConfigSource, AbsoluteTimeRange, InterpolateFunction, IconName as IconName$1, FieldConfig, FieldType, FieldValueMatcherConfig } from '@grafana/data';
2
- import React$1, { CSSProperties } from 'react';
2
+ import React$1, { CSSProperties, ComponentType } from 'react';
3
3
  import { Observable, Unsubscribable, MonoTypeOperatorFunction, Subscription } from 'rxjs';
4
4
  import { VariableType, VariableHide, TimeZone, DashboardCursorSync, DataSourceRef, DataQuery as DataQuery$1, MatcherConfig, TableFieldOptions } from '@grafana/schema';
5
5
  import { PanelContext, IconName } from '@grafana/ui';
@@ -1184,7 +1184,7 @@ interface SceneAppRoute {
1184
1184
  drilldown?: SceneAppDrilldownView;
1185
1185
  }
1186
1186
  interface SceneAppPageState extends SceneObjectState {
1187
- /** Page title */
1187
+ /** Page title or tab label */
1188
1188
  title: string;
1189
1189
  /** Page subTitle */
1190
1190
  subTitle?: string | React.ReactNode;
@@ -1195,8 +1195,12 @@ interface SceneAppPageState extends SceneObjectState {
1195
1195
  renderTitle?: (title: string) => React.ReactNode;
1196
1196
  /** For an image before title */
1197
1197
  titleImg?: string;
1198
- /** For an icon before title */
1198
+ /** For an icon before title or tab label */
1199
1199
  titleIcon?: IconName$1;
1200
+ /** For a tab label suffix */
1201
+ tabSuffix?: ComponentType<{
1202
+ className?: string;
1203
+ }>;
1200
1204
  url: string;
1201
1205
  routePath?: string;
1202
1206
  /** Array of scene object to be rendered at the top right of the page, inline with the page title */
package/dist/index.js CHANGED
@@ -5690,6 +5690,8 @@ function SceneAppPageView({ page, routeProps }) {
5690
5690
  pageNav.children = containerState.tabs.map((tab) => {
5691
5691
  return {
5692
5692
  text: tab.state.title,
5693
+ icon: tab.state.titleIcon,
5694
+ tabSuffix: tab.state.tabSuffix,
5693
5695
  active: page === tab,
5694
5696
  url: getUrlWithAppState(tab.state.url, tab.state.preserveUrlKeys),
5695
5697
  parentItem: pageNav
@@ -6037,11 +6039,11 @@ class VizPanelBuilder {
6037
6039
  this._state.pluginVersion = pluginVersion;
6038
6040
  const fieldConfig = {
6039
6041
  defaults: {
6040
- custom: defaultFieldConfig ? defaultFieldConfig() : {}
6042
+ custom: defaultFieldConfig ? lodash.cloneDeep(defaultFieldConfig()) : {}
6041
6043
  },
6042
6044
  overrides: []
6043
6045
  };
6044
- this._state.options = defaultOptions ? defaultOptions() : {};
6046
+ this._state.options = defaultOptions ? lodash.cloneDeep(defaultOptions()) : {};
6045
6047
  this._state.fieldConfig = fieldConfig;
6046
6048
  }
6047
6049
  setTitle(title) {