@grafana/scenes 1.10.0 → 1.11.1
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 +24 -0
- package/dist/esm/components/SceneApp/SceneAppPageView.js +8 -6
- package/dist/esm/components/SceneApp/SceneAppPageView.js.map +1 -1
- package/dist/esm/components/SceneTimePicker.js +9 -3
- package/dist/esm/components/SceneTimePicker.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +16 -8
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,27 @@
|
|
|
1
|
+
# v1.11.1 (Tue Oct 03 2023)
|
|
2
|
+
|
|
3
|
+
#### 🐛 Bug Fix
|
|
4
|
+
|
|
5
|
+
- SceneAppPageView: Fixes react and scene state missmatch [#381](https://github.com/grafana/scenes/pull/381) ([@torkelo](https://github.com/torkelo))
|
|
6
|
+
|
|
7
|
+
#### Authors: 1
|
|
8
|
+
|
|
9
|
+
- Torkel Ödegaard ([@torkelo](https://github.com/torkelo))
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# v1.11.0 (Tue Oct 03 2023)
|
|
14
|
+
|
|
15
|
+
#### 🚀 Enhancement
|
|
16
|
+
|
|
17
|
+
- TimePicker: Show and update fiscal year month [#386](https://github.com/grafana/scenes/pull/386) ([@torkelo](https://github.com/torkelo))
|
|
18
|
+
|
|
19
|
+
#### Authors: 1
|
|
20
|
+
|
|
21
|
+
- Torkel Ödegaard ([@torkelo](https://github.com/torkelo))
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
1
25
|
# v1.10.0 (Mon Oct 02 2023)
|
|
2
26
|
|
|
3
27
|
#### 🚀 Enhancement
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { PluginPage } from '@grafana/runtime';
|
|
2
|
-
import React, {
|
|
2
|
+
import React, { useLayoutEffect, useEffect } from 'react';
|
|
3
3
|
import { SceneDebugger } from '../SceneDebugger/SceneDebugger.js';
|
|
4
4
|
import { SceneAppPage } from './SceneAppPage.js';
|
|
5
5
|
import { useAppQueryParams, getUrlWithAppState, renderSceneComponentWithRouteProps } from './utils.js';
|
|
@@ -9,14 +9,16 @@ function SceneAppPageView({ page, routeProps }) {
|
|
|
9
9
|
const containerState = containerPage.useState();
|
|
10
10
|
const params = useAppQueryParams();
|
|
11
11
|
const scene = page.getScene(routeProps.match);
|
|
12
|
-
const
|
|
12
|
+
const isInitialized = containerState.initializedScene === scene;
|
|
13
13
|
useLayoutEffect(() => {
|
|
14
|
-
if (!
|
|
14
|
+
if (!isInitialized) {
|
|
15
15
|
containerPage.initializeScene(scene);
|
|
16
|
-
setInitialized(true);
|
|
17
16
|
}
|
|
18
|
-
}, [
|
|
19
|
-
|
|
17
|
+
}, [scene, containerPage, isInitialized]);
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
return () => containerPage.setState({ initializedScene: void 0 });
|
|
20
|
+
}, [containerPage]);
|
|
21
|
+
if (!isInitialized) {
|
|
20
22
|
return null;
|
|
21
23
|
}
|
|
22
24
|
const 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, {
|
|
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, { useEffect, useLayoutEffect } from 'react';\n\nimport { RouteComponentProps } from 'react-router-dom';\nimport { SceneObject } from '../../core/types';\nimport { SceneDebugger } from '../SceneDebugger/SceneDebugger';\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 isInitialized = containerState.initializedScene === scene;\n\n useLayoutEffect(() => {\n // Before rendering scene components, we are making sure the URL sync is enabled for.\n if (!isInitialized) {\n containerPage.initializeScene(scene);\n }\n }, [scene, containerPage, isInitialized]);\n\n // Clear initializedScene when unmounting\n useEffect(() => {\n return () => containerPage.setState({ initializedScene: undefined });\n }, [containerPage]);\n\n if (!isInitialized) {\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[] = [];\n if (containerState.controls) {\n pageActions = containerState.controls.map((control) => (\n <control.Component model={control} key={control.state.key} />\n ));\n }\n\n if (params['scene-debugger']) {\n pageActions.push(<SceneDebugger scene={containerPage} key={'scene-debugger'} />);\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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"}
|
|
@@ -4,6 +4,13 @@ import { SceneObjectBase } from '../core/SceneObjectBase.js';
|
|
|
4
4
|
import { sceneGraph } from '../core/sceneGraph/index.js';
|
|
5
5
|
|
|
6
6
|
class SceneTimePicker extends SceneObjectBase {
|
|
7
|
+
constructor() {
|
|
8
|
+
super(...arguments);
|
|
9
|
+
this.onChangeFiscalYearStartMonth = (month) => {
|
|
10
|
+
const timeRange = sceneGraph.getTimeRange(this);
|
|
11
|
+
timeRange.setState({ fiscalYearStartMonth: month });
|
|
12
|
+
};
|
|
13
|
+
}
|
|
7
14
|
}
|
|
8
15
|
SceneTimePicker.Component = SceneTimePickerRenderer;
|
|
9
16
|
function SceneTimePickerRenderer({ model }) {
|
|
@@ -19,7 +26,7 @@ function SceneTimePickerRenderer({ model }) {
|
|
|
19
26
|
value: timeRangeState.value,
|
|
20
27
|
onChange: timeRange.onTimeRangeChange,
|
|
21
28
|
timeZone,
|
|
22
|
-
fiscalYearStartMonth:
|
|
29
|
+
fiscalYearStartMonth: timeRangeState.fiscalYearStartMonth,
|
|
23
30
|
onMoveBackward: () => {
|
|
24
31
|
},
|
|
25
32
|
onMoveForward: () => {
|
|
@@ -27,8 +34,7 @@ function SceneTimePickerRenderer({ model }) {
|
|
|
27
34
|
onZoom: () => {
|
|
28
35
|
},
|
|
29
36
|
onChangeTimeZone: timeRange.onTimeZoneChange,
|
|
30
|
-
onChangeFiscalYearStartMonth:
|
|
31
|
-
}
|
|
37
|
+
onChangeFiscalYearStartMonth: model.onChangeFiscalYearStartMonth
|
|
32
38
|
});
|
|
33
39
|
}
|
|
34
40
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SceneTimePicker.js","sources":["../../../src/components/SceneTimePicker.tsx"],"sourcesContent":["import React from 'react';\n\nimport { TimeRangePicker } from '@grafana/ui';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneComponentProps, SceneObjectState } from '../core/types';\n\nexport interface SceneTimePickerState extends SceneObjectState {\n hidePicker?: boolean;\n isOnCanvas?: boolean;\n}\n\nexport class SceneTimePicker extends SceneObjectBase<SceneTimePickerState> {\n public static Component = SceneTimePickerRenderer;\n}\n\nfunction SceneTimePickerRenderer({ model }: SceneComponentProps<SceneTimePicker>) {\n const { hidePicker, isOnCanvas } = model.useState();\n const timeRange = sceneGraph.getTimeRange(model);\n const timeZone = timeRange.getTimeZone();\n const timeRangeState = timeRange.useState();\n\n if (hidePicker) {\n return null;\n }\n\n return (\n <TimeRangePicker\n isOnCanvas={isOnCanvas ?? true}\n value={timeRangeState.value}\n onChange={timeRange.onTimeRangeChange}\n timeZone={timeZone}\n fiscalYearStartMonth={
|
|
1
|
+
{"version":3,"file":"SceneTimePicker.js","sources":["../../../src/components/SceneTimePicker.tsx"],"sourcesContent":["import React from 'react';\n\nimport { TimeRangePicker } from '@grafana/ui';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneComponentProps, SceneObjectState } from '../core/types';\n\nexport interface SceneTimePickerState extends SceneObjectState {\n hidePicker?: boolean;\n isOnCanvas?: boolean;\n}\n\nexport class SceneTimePicker extends SceneObjectBase<SceneTimePickerState> {\n public static Component = SceneTimePickerRenderer;\n\n public onChangeFiscalYearStartMonth = (month: number) => {\n const timeRange = sceneGraph.getTimeRange(this);\n timeRange.setState({ fiscalYearStartMonth: month });\n };\n}\n\nfunction SceneTimePickerRenderer({ model }: SceneComponentProps<SceneTimePicker>) {\n const { hidePicker, isOnCanvas } = model.useState();\n const timeRange = sceneGraph.getTimeRange(model);\n const timeZone = timeRange.getTimeZone();\n const timeRangeState = timeRange.useState();\n\n if (hidePicker) {\n return null;\n }\n\n return (\n <TimeRangePicker\n isOnCanvas={isOnCanvas ?? true}\n value={timeRangeState.value}\n onChange={timeRange.onTimeRangeChange}\n timeZone={timeZone}\n fiscalYearStartMonth={timeRangeState.fiscalYearStartMonth}\n onMoveBackward={() => {}}\n onMoveForward={() => {}}\n onZoom={() => {}}\n onChangeTimeZone={timeRange.onTimeZoneChange}\n onChangeFiscalYearStartMonth={model.onChangeFiscalYearStartMonth}\n />\n );\n}\n"],"names":[],"mappings":";;;;;AAaO,MAAM,wBAAwB,eAAsC,CAAA;AAAA,EAApE,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA,CAAA;AAGL,IAAO,IAAA,CAAA,4BAAA,GAA+B,CAAC,KAAkB,KAAA;AACvD,MAAM,MAAA,SAAA,GAAY,UAAW,CAAA,YAAA,CAAa,IAAI,CAAA,CAAA;AAC9C,MAAA,SAAA,CAAU,QAAS,CAAA,EAAE,oBAAsB,EAAA,KAAA,EAAO,CAAA,CAAA;AAAA,KACpD,CAAA;AAAA,GAAA;AACF,CAAA;AAPa,eAAA,CACG,SAAY,GAAA,uBAAA,CAAA;AAQ5B,SAAS,uBAAA,CAAwB,EAAE,KAAA,EAA+C,EAAA;AAChF,EAAA,MAAM,EAAE,UAAA,EAAY,UAAW,EAAA,GAAI,MAAM,QAAS,EAAA,CAAA;AAClD,EAAM,MAAA,SAAA,GAAY,UAAW,CAAA,YAAA,CAAa,KAAK,CAAA,CAAA;AAC/C,EAAM,MAAA,QAAA,GAAW,UAAU,WAAY,EAAA,CAAA;AACvC,EAAM,MAAA,cAAA,GAAiB,UAAU,QAAS,EAAA,CAAA;AAE1C,EAAA,IAAI,UAAY,EAAA;AACd,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAEA,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,eAAA,EAAA;AAAA,IACC,YAAY,UAAc,IAAA,IAAA,GAAA,UAAA,GAAA,IAAA;AAAA,IAC1B,OAAO,cAAe,CAAA,KAAA;AAAA,IACtB,UAAU,SAAU,CAAA,iBAAA;AAAA,IACpB,QAAA;AAAA,IACA,sBAAsB,cAAe,CAAA,oBAAA;AAAA,IACrC,gBAAgB,MAAM;AAAA,KAAC;AAAA,IACvB,eAAe,MAAM;AAAA,KAAC;AAAA,IACtB,QAAQ,MAAM;AAAA,KAAC;AAAA,IACf,kBAAkB,SAAU,CAAA,gBAAA;AAAA,IAC5B,8BAA8B,KAAM,CAAA,4BAAA;AAAA,GACtC,CAAA,CAAA;AAEJ;;;;"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1321,6 +1321,7 @@ interface SceneTimePickerState extends SceneObjectState {
|
|
|
1321
1321
|
}
|
|
1322
1322
|
declare class SceneTimePicker extends SceneObjectBase<SceneTimePickerState> {
|
|
1323
1323
|
static Component: typeof SceneTimePickerRenderer;
|
|
1324
|
+
onChangeFiscalYearStartMonth: (month: number) => void;
|
|
1324
1325
|
}
|
|
1325
1326
|
declare function SceneTimePickerRenderer({ model }: SceneComponentProps<SceneTimePicker>): JSX.Element | null;
|
|
1326
1327
|
|
package/dist/index.js
CHANGED
|
@@ -7073,6 +7073,13 @@ SceneToolbarInput.Component = ({ model }) => {
|
|
|
7073
7073
|
};
|
|
7074
7074
|
|
|
7075
7075
|
class SceneTimePicker extends SceneObjectBase {
|
|
7076
|
+
constructor() {
|
|
7077
|
+
super(...arguments);
|
|
7078
|
+
this.onChangeFiscalYearStartMonth = (month) => {
|
|
7079
|
+
const timeRange = sceneGraph.getTimeRange(this);
|
|
7080
|
+
timeRange.setState({ fiscalYearStartMonth: month });
|
|
7081
|
+
};
|
|
7082
|
+
}
|
|
7076
7083
|
}
|
|
7077
7084
|
SceneTimePicker.Component = SceneTimePickerRenderer;
|
|
7078
7085
|
function SceneTimePickerRenderer({ model }) {
|
|
@@ -7088,7 +7095,7 @@ function SceneTimePickerRenderer({ model }) {
|
|
|
7088
7095
|
value: timeRangeState.value,
|
|
7089
7096
|
onChange: timeRange.onTimeRangeChange,
|
|
7090
7097
|
timeZone,
|
|
7091
|
-
fiscalYearStartMonth:
|
|
7098
|
+
fiscalYearStartMonth: timeRangeState.fiscalYearStartMonth,
|
|
7092
7099
|
onMoveBackward: () => {
|
|
7093
7100
|
},
|
|
7094
7101
|
onMoveForward: () => {
|
|
@@ -7096,8 +7103,7 @@ function SceneTimePickerRenderer({ model }) {
|
|
|
7096
7103
|
onZoom: () => {
|
|
7097
7104
|
},
|
|
7098
7105
|
onChangeTimeZone: timeRange.onTimeZoneChange,
|
|
7099
|
-
onChangeFiscalYearStartMonth:
|
|
7100
|
-
}
|
|
7106
|
+
onChangeFiscalYearStartMonth: model.onChangeFiscalYearStartMonth
|
|
7101
7107
|
});
|
|
7102
7108
|
}
|
|
7103
7109
|
|
|
@@ -8033,14 +8039,16 @@ function SceneAppPageView({ page, routeProps }) {
|
|
|
8033
8039
|
const containerState = containerPage.useState();
|
|
8034
8040
|
const params = useAppQueryParams();
|
|
8035
8041
|
const scene = page.getScene(routeProps.match);
|
|
8036
|
-
const
|
|
8042
|
+
const isInitialized = containerState.initializedScene === scene;
|
|
8037
8043
|
React.useLayoutEffect(() => {
|
|
8038
|
-
if (!
|
|
8044
|
+
if (!isInitialized) {
|
|
8039
8045
|
containerPage.initializeScene(scene);
|
|
8040
|
-
setInitialized(true);
|
|
8041
8046
|
}
|
|
8042
|
-
}, [
|
|
8043
|
-
|
|
8047
|
+
}, [scene, containerPage, isInitialized]);
|
|
8048
|
+
React.useEffect(() => {
|
|
8049
|
+
return () => containerPage.setState({ initializedScene: void 0 });
|
|
8050
|
+
}, [containerPage]);
|
|
8051
|
+
if (!isInitialized) {
|
|
8044
8052
|
return null;
|
|
8045
8053
|
}
|
|
8046
8054
|
const pageNav = {
|