@grafana/scenes 0.0.11 → 0.0.13
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/dist/esm/components/SceneApp/SceneApp.js +164 -0
- package/dist/esm/components/SceneApp/SceneApp.js.map +1 -0
- package/dist/esm/components/SceneApp/utils.js +38 -0
- package/dist/esm/components/SceneApp/utils.js.map +1 -0
- package/dist/esm/components/SceneTimePicker.js +2 -1
- package/dist/esm/components/SceneTimePicker.js.map +1 -1
- package/dist/esm/components/VizPanel/VizPanel.js.map +1 -1
- package/dist/esm/components/VizPanel/VizPanelRenderer.js +14 -5
- package/dist/esm/components/VizPanel/VizPanelRenderer.js.map +1 -1
- package/dist/esm/core/SceneObjectBase.js +8 -2
- package/dist/esm/core/SceneObjectBase.js.map +1 -1
- package/dist/esm/core/SceneTimeRange.js +0 -2
- package/dist/esm/core/SceneTimeRange.js.map +1 -1
- package/dist/esm/core/types.js.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/querying/SceneQueryRunner.js +3 -1
- package/dist/esm/querying/SceneQueryRunner.js.map +1 -1
- package/dist/esm/variables/interpolation/sceneInterpolator.js.map +1 -1
- package/dist/esm/variables/sets/SceneVariableSet.js +88 -41
- package/dist/esm/variables/sets/SceneVariableSet.js.map +1 -1
- package/dist/index.d.ts +53 -15
- package/dist/index.js +512 -259
- package/dist/index.js.map +1 -1
- package/package.json +5 -1
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import React, { useState, useEffect } from 'react';
|
|
2
|
+
import { Switch, Route, useRouteMatch } from 'react-router-dom';
|
|
3
|
+
import { PluginPage } from '@grafana/runtime';
|
|
4
|
+
import { SceneObjectBase } from '../../core/SceneObjectBase.js';
|
|
5
|
+
import { useAppQueryParams, getLinkUrlWithAppUrlState } from './utils.js';
|
|
6
|
+
|
|
7
|
+
const sceneCache = /* @__PURE__ */ new Map();
|
|
8
|
+
class SceneApp extends SceneObjectBase {
|
|
9
|
+
}
|
|
10
|
+
SceneApp.Component = ({ model }) => {
|
|
11
|
+
const { pages } = model.useState();
|
|
12
|
+
return /* @__PURE__ */ React.createElement(Switch, null, pages.map((page) => /* @__PURE__ */ React.createElement(Route, {
|
|
13
|
+
key: page.state.url,
|
|
14
|
+
exact: false,
|
|
15
|
+
path: page.state.url,
|
|
16
|
+
render: () => {
|
|
17
|
+
return page && /* @__PURE__ */ React.createElement(page.Component, {
|
|
18
|
+
model: page
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
})));
|
|
22
|
+
};
|
|
23
|
+
class SceneAppPage extends SceneObjectBase {
|
|
24
|
+
}
|
|
25
|
+
SceneAppPage.Component = SceneAppPageRenderer;
|
|
26
|
+
function SceneAppPageRenderer({ model }) {
|
|
27
|
+
var _a;
|
|
28
|
+
const { tabs, drilldowns, url, routePath } = model.state;
|
|
29
|
+
const routes = [];
|
|
30
|
+
if (tabs) {
|
|
31
|
+
for (const page2 of tabs) {
|
|
32
|
+
routes.push(
|
|
33
|
+
/* @__PURE__ */ React.createElement(Route, {
|
|
34
|
+
exact: true,
|
|
35
|
+
key: page2.state.url,
|
|
36
|
+
path: (_a = page2.state.routePath) != null ? _a : page2.state.url,
|
|
37
|
+
render: () => {
|
|
38
|
+
return /* @__PURE__ */ React.createElement(page2.Component, {
|
|
39
|
+
model: page2
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
})
|
|
43
|
+
);
|
|
44
|
+
if (page2.state.drilldowns) {
|
|
45
|
+
for (const drilldown of page2.state.drilldowns) {
|
|
46
|
+
routes.push(
|
|
47
|
+
/* @__PURE__ */ React.createElement(Route, {
|
|
48
|
+
exact: false,
|
|
49
|
+
key: drilldown.routePath,
|
|
50
|
+
path: drilldown.routePath,
|
|
51
|
+
render: () => {
|
|
52
|
+
return /* @__PURE__ */ React.createElement(SceneAppDrilldownViewRender, {
|
|
53
|
+
drilldown,
|
|
54
|
+
parent: page2
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
})
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return /* @__PURE__ */ React.createElement(Switch, null, routes);
|
|
63
|
+
}
|
|
64
|
+
if (drilldowns) {
|
|
65
|
+
for (const drilldown of drilldowns) {
|
|
66
|
+
routes.push(
|
|
67
|
+
/* @__PURE__ */ React.createElement(Route, {
|
|
68
|
+
key: drilldown.routePath,
|
|
69
|
+
exact: false,
|
|
70
|
+
path: drilldown.routePath,
|
|
71
|
+
render: () => {
|
|
72
|
+
return /* @__PURE__ */ React.createElement(SceneAppDrilldownViewRender, {
|
|
73
|
+
drilldown,
|
|
74
|
+
parent: model
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
})
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
let page = /* @__PURE__ */ React.createElement(ScenePageRenderer, {
|
|
82
|
+
page: model
|
|
83
|
+
});
|
|
84
|
+
if (model.parent instanceof SceneAppPage) {
|
|
85
|
+
page = /* @__PURE__ */ React.createElement(ScenePageRenderer, {
|
|
86
|
+
page: model.parent,
|
|
87
|
+
activeTab: model,
|
|
88
|
+
tabs: model.parent.state.tabs
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
return /* @__PURE__ */ React.createElement(Switch, null, /* @__PURE__ */ React.createElement(Route, {
|
|
92
|
+
key: url,
|
|
93
|
+
exact: true,
|
|
94
|
+
path: routePath != null ? routePath : url,
|
|
95
|
+
render: () => {
|
|
96
|
+
return page;
|
|
97
|
+
}
|
|
98
|
+
}), routes);
|
|
99
|
+
}
|
|
100
|
+
function ScenePageRenderer({ page, tabs, activeTab }) {
|
|
101
|
+
const [isInitialized, setIsInitialized] = useState(false);
|
|
102
|
+
const params = useAppQueryParams();
|
|
103
|
+
const routeMatch = useRouteMatch();
|
|
104
|
+
let scene = sceneCache.get(routeMatch.url);
|
|
105
|
+
if (!scene) {
|
|
106
|
+
scene = activeTab ? activeTab.state.getScene(routeMatch) : page.state.getScene(routeMatch);
|
|
107
|
+
sceneCache.set(routeMatch.url, scene);
|
|
108
|
+
}
|
|
109
|
+
useEffect(() => {
|
|
110
|
+
if (!isInitialized && scene) {
|
|
111
|
+
scene.initUrlSync();
|
|
112
|
+
setIsInitialized(true);
|
|
113
|
+
}
|
|
114
|
+
}, [isInitialized, scene]);
|
|
115
|
+
if (!isInitialized) {
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
const pageNav = {
|
|
119
|
+
text: page.state.title,
|
|
120
|
+
subTitle: page.state.subTitle,
|
|
121
|
+
url: getLinkUrlWithAppUrlState(page.state.url, params, page.state.preserveUrlKeys),
|
|
122
|
+
hideFromBreadcrumbs: page.state.hideFromBreadcrumbs,
|
|
123
|
+
parentItem: getParentBreadcrumbs(page.state.getParentPage ? page.state.getParentPage() : page.parent, params)
|
|
124
|
+
};
|
|
125
|
+
if (tabs) {
|
|
126
|
+
pageNav.children = tabs.map((tab) => {
|
|
127
|
+
return {
|
|
128
|
+
text: tab.state.title,
|
|
129
|
+
active: activeTab === tab,
|
|
130
|
+
url: getLinkUrlWithAppUrlState(tab.state.url, params, tab.state.preserveUrlKeys),
|
|
131
|
+
parentItem: pageNav
|
|
132
|
+
};
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
return /* @__PURE__ */ React.createElement(PluginPage, {
|
|
136
|
+
pageNav
|
|
137
|
+
}, /* @__PURE__ */ React.createElement(scene.Component, {
|
|
138
|
+
model: scene
|
|
139
|
+
}));
|
|
140
|
+
}
|
|
141
|
+
function SceneAppDrilldownViewRender(props) {
|
|
142
|
+
const routeMatch = useRouteMatch();
|
|
143
|
+
const scene = props.drilldown.getPage(routeMatch, props.parent);
|
|
144
|
+
return /* @__PURE__ */ React.createElement(scene.Component, {
|
|
145
|
+
model: scene
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
function getParentBreadcrumbs(parent, params) {
|
|
149
|
+
if (parent instanceof SceneAppPage) {
|
|
150
|
+
return {
|
|
151
|
+
text: parent.state.title,
|
|
152
|
+
url: getLinkUrlWithAppUrlState(parent.state.url, params, parent.state.preserveUrlKeys),
|
|
153
|
+
hideFromBreadcrumbs: parent.state.hideFromBreadcrumbs,
|
|
154
|
+
parentItem: getParentBreadcrumbs(
|
|
155
|
+
parent.state.getParentPage ? parent.state.getParentPage() : parent.parent,
|
|
156
|
+
params
|
|
157
|
+
)
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
return void 0;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export { SceneApp, SceneAppDrilldownViewRender, SceneAppPage };
|
|
164
|
+
//# sourceMappingURL=SceneApp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SceneApp.js","sources":["../../../../src/components/SceneApp/SceneApp.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\nimport { Route, Switch, useRouteMatch } from 'react-router-dom';\n\nimport { NavModelItem, UrlQueryMap } from '@grafana/data';\nimport { PluginPage } from '@grafana/runtime';\n\nimport { SceneComponentProps, SceneObject, SceneObjectStatePlain } from '../../core/types';\nimport { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { getLinkUrlWithAppUrlState, useAppQueryParams } from './utils';\nimport { EmbeddedScene } from '../EmbeddedScene';\n\nconst sceneCache = new Map<string, EmbeddedScene>();\n\nexport interface SceneAppState extends SceneObjectStatePlain {\n // Array of SceneAppPage objects that are considered app's top level pages\n pages: SceneAppPage[];\n}\n\nexport interface SceneRouteMatch<Params extends { [K in keyof Params]?: string } = {}> {\n params: Params;\n isExact: boolean;\n path: string;\n url: string;\n}\n\nexport interface SceneAppRoute {\n path: string;\n page?: SceneAppPage;\n drilldown?: SceneAppDrilldownView;\n}\n\n/**\n * Responsible for top level pages routing\n */\nexport class SceneApp extends SceneObjectBase<SceneAppState> {\n public static Component = ({ model }: SceneComponentProps<SceneApp>) => {\n const { pages } = model.useState();\n\n return (\n <Switch>\n {pages.map((page) => (\n <Route\n key={page.state.url}\n exact={false}\n path={page.state.url}\n render={() => {\n return page && <page.Component model={page} />;\n }}\n ></Route>\n ))}\n </Switch>\n );\n };\n}\n\nexport interface SceneAppPageState extends SceneObjectStatePlain {\n title: string;\n subTitle?: string;\n // Use to provide page absolute URL, i.e. /app/overview\n url: string;\n // Use to provide parametrized page URL, i.e. /app/overview/:clusterId\n routePath?: string;\n // Whether or not page should be visible in the breadcrumbs path\n hideFromBreadcrumbs?: boolean;\n // Array of SceneAppPage objects that are used as page tabs displayed on top of the page\n tabs?: SceneAppPage[];\n // Function that returns a scene object for the page\n getScene: (routeMatch: SceneRouteMatch) => EmbeddedScene;\n // Array of scenes used for drilldown views\n drilldowns?: SceneAppDrilldownView[];\n // Function that returns a parent page object, used to create breadcrumbs structure\n getParentPage?: () => SceneAppPage;\n // Array of query params that will be preserved in breadcrumb and page tab links, i.e. ['from', 'to', 'var-datacenter',...]\n preserveUrlKeys?: string[];\n}\n\n/**\n * Responsible for page's drilldown & tabs routing\n */\nexport class SceneAppPage extends SceneObjectBase<SceneAppPageState> {\n public static Component = SceneAppPageRenderer;\n}\n\nfunction SceneAppPageRenderer({ model }: SceneComponentProps<SceneAppPage>) {\n const { tabs, drilldowns, url, routePath } = model.state;\n const routes: React.ReactNode[] = [];\n\n if (tabs) {\n for (const page of tabs) {\n routes.push(\n <Route\n exact={true}\n key={page.state.url}\n path={page.state.routePath ?? page.state.url}\n render={() => {\n return <page.Component model={page} />;\n }}\n ></Route>\n );\n\n if (page.state.drilldowns) {\n for (const drilldown of page.state.drilldowns) {\n routes.push(\n <Route\n exact={false}\n key={drilldown.routePath}\n path={drilldown.routePath}\n render={() => {\n return <SceneAppDrilldownViewRender drilldown={drilldown} parent={page} />;\n }}\n ></Route>\n );\n }\n }\n }\n\n return <Switch>{routes}</Switch>;\n }\n\n if (drilldowns) {\n for (const drilldown of drilldowns) {\n routes.push(\n <Route\n key={drilldown.routePath}\n exact={false}\n path={drilldown.routePath}\n render={() => {\n return <SceneAppDrilldownViewRender drilldown={drilldown} parent={model} />;\n }}\n ></Route>\n );\n }\n }\n\n let page = <ScenePageRenderer page={model} />;\n\n // if parent is a SceneAppPage we are a tab\n if (model.parent instanceof SceneAppPage) {\n page = <ScenePageRenderer page={model.parent} activeTab={model} tabs={model.parent.state.tabs} />;\n }\n\n return (\n <Switch>\n {/* page route */}\n <Route\n key={url}\n exact={true}\n path={routePath ?? url}\n render={() => {\n return page;\n }}\n ></Route>\n\n {/* drilldown routes */}\n {routes}\n </Switch>\n );\n}\n\ninterface ScenePageRenderProps {\n page: SceneAppPage;\n tabs?: SceneAppPage[];\n activeTab?: SceneAppPage;\n}\n\nfunction ScenePageRenderer({ page, tabs, activeTab }: ScenePageRenderProps) {\n /**\n * We use this flag to make sure the URL sync is enabled before the scene is actually rendered.\n */\n const [isInitialized, setIsInitialized] = useState(false);\n const params = useAppQueryParams();\n const routeMatch = useRouteMatch();\n\n let scene = sceneCache.get(routeMatch!.url);\n if (!scene) {\n // If we are rendering a tab, we need to get the scene f rom the tab, otherwise, use page's scene\n scene = activeTab ? activeTab.state.getScene(routeMatch) : page.state.getScene(routeMatch);\n sceneCache.set(routeMatch!.url, scene);\n }\n\n useEffect(() => {\n // Before rendering scene components, we are making sure the URL sync is enabled for.\n if (!isInitialized && scene) {\n scene.initUrlSync();\n setIsInitialized(true);\n }\n }, [isInitialized, scene]);\n\n if (!isInitialized) {\n return null;\n }\n\n const pageNav: NavModelItem = {\n text: page.state.title,\n subTitle: page.state.subTitle,\n url: getLinkUrlWithAppUrlState(page.state.url, params, page.state.preserveUrlKeys),\n hideFromBreadcrumbs: page.state.hideFromBreadcrumbs,\n parentItem: getParentBreadcrumbs(page.state.getParentPage ? page.state.getParentPage() : page.parent, params),\n };\n\n if (tabs) {\n pageNav.children = tabs.map((tab) => {\n return {\n text: tab.state.title,\n active: activeTab === tab,\n url: getLinkUrlWithAppUrlState(tab.state.url, params, tab.state.preserveUrlKeys),\n parentItem: pageNav,\n };\n });\n }\n\n return (\n <PluginPage pageNav={pageNav} /*hideFooter={true}*/>\n <scene.Component model={scene} />\n </PluginPage>\n );\n}\n\nexport interface SceneAppDrilldownView {\n // Use to provide parametrized drilldown URL, i.e. /app/clusters/:clusterId\n routePath: string;\n // Function that returns a page object for a given drilldown route match. Use parent to configure drilldown view parent SceneAppPage via getParentPage method.\n getPage: (routeMatch: SceneRouteMatch<any>, parent: SceneAppPage) => SceneAppPage;\n}\n\nexport function SceneAppDrilldownViewRender(props: { drilldown: SceneAppDrilldownView; parent: SceneAppPage }) {\n const routeMatch = useRouteMatch();\n const scene = props.drilldown.getPage(routeMatch, props.parent);\n return <scene.Component model={scene} />;\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: getLinkUrlWithAppUrlState(parent.state.url, params, 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"],"names":["page"],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { useLocation } from 'react-router-dom';
|
|
2
|
+
import { urlUtil } from '@grafana/data';
|
|
3
|
+
import { locationSearchToObject } from '@grafana/runtime';
|
|
4
|
+
|
|
5
|
+
var __defProp = Object.defineProperty;
|
|
6
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
9
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
10
|
+
var __spreadValues = (a, b) => {
|
|
11
|
+
for (var prop in b || (b = {}))
|
|
12
|
+
if (__hasOwnProp.call(b, prop))
|
|
13
|
+
__defNormalProp(a, prop, b[prop]);
|
|
14
|
+
if (__getOwnPropSymbols)
|
|
15
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
16
|
+
if (__propIsEnum.call(b, prop))
|
|
17
|
+
__defNormalProp(a, prop, b[prop]);
|
|
18
|
+
}
|
|
19
|
+
return a;
|
|
20
|
+
};
|
|
21
|
+
function useAppQueryParams() {
|
|
22
|
+
const location = useLocation();
|
|
23
|
+
return locationSearchToObject(location.search || "");
|
|
24
|
+
}
|
|
25
|
+
function getLinkUrlWithAppUrlState(path, params, preserveParams) {
|
|
26
|
+
const paramsCopy = __spreadValues({}, params);
|
|
27
|
+
if (preserveParams) {
|
|
28
|
+
for (const key of Object.keys(paramsCopy)) {
|
|
29
|
+
if (!preserveParams.includes(key)) {
|
|
30
|
+
delete paramsCopy[key];
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return urlUtil.renderUrl(path, paramsCopy);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export { getLinkUrlWithAppUrlState, useAppQueryParams };
|
|
38
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../../src/components/SceneApp/utils.ts"],"sourcesContent":["import { useLocation } from 'react-router-dom';\n\nimport { UrlQueryMap, urlUtil } from '@grafana/data';\nimport { locationSearchToObject } from '@grafana/runtime';\n\nexport function useAppQueryParams() {\n const location = useLocation();\n return locationSearchToObject(location.search || '');\n}\n\nexport function getLinkUrlWithAppUrlState(path: string, params: UrlQueryMap, preserveParams?: string[]): string {\n // make a copy of params as the renderUrl function mutates the object\n const paramsCopy = { ...params };\n\n if (preserveParams) {\n for (const key of Object.keys(paramsCopy)) {\n // if param is not in preserveParams, remove it\n if (!preserveParams.includes(key)) {\n delete paramsCopy[key];\n }\n }\n }\n\n return urlUtil.renderUrl(path, paramsCopy);\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAKO,SAAS,iBAAoB,GAAA;AAClC,EAAA,MAAM,WAAW,WAAY,EAAA,CAAA;AAC7B,EAAO,OAAA,sBAAA,CAAuB,QAAS,CAAA,MAAA,IAAU,EAAE,CAAA,CAAA;AACrD,CAAA;AAEgB,SAAA,yBAAA,CAA0B,IAAc,EAAA,MAAA,EAAqB,cAAmC,EAAA;AAE9G,EAAA,MAAM,aAAa,cAAK,CAAA,EAAA,EAAA,MAAA,CAAA,CAAA;AAExB,EAAA,IAAI,cAAgB,EAAA;AAClB,IAAA,KAAA,MAAW,GAAO,IAAA,MAAA,CAAO,IAAK,CAAA,UAAU,CAAG,EAAA;AAEzC,MAAA,IAAI,CAAC,cAAA,CAAe,QAAS,CAAA,GAAG,CAAG,EAAA;AACjC,QAAA,OAAO,UAAW,CAAA,GAAA,CAAA,CAAA;AAAA,OACpB;AAAA,KACF;AAAA,GACF;AAEA,EAAO,OAAA,OAAA,CAAQ,SAAU,CAAA,IAAA,EAAM,UAAU,CAAA,CAAA;AAC3C;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SceneTimePicker.js","sources":["../../../src/components/SceneTimePicker.tsx"],"sourcesContent":["import React from 'react';\n\nimport { RefreshPicker, TimeRangePicker, ToolbarButtonRow } from '@grafana/ui';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneComponentProps, SceneObjectStatePlain } from '../core/types';\n\nexport interface SceneTimePickerState extends SceneObjectStatePlain {\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 timeRangeState = timeRange.useState();\n\n if (hidePicker) {\n return null;\n }\n\n return (\n <ToolbarButtonRow alignment=\"right\">\n <TimeRangePicker\n isOnCanvas={isOnCanvas}\n value={timeRangeState.value}\n onChange={timeRange.onTimeRangeChange}\n timeZone={'browser'}\n fiscalYearStartMonth={0}\n onMoveBackward={() => {}}\n onMoveForward={() => {}}\n onZoom={() => {}}\n onChangeTimeZone={() => {}}\n onChangeFiscalYearStartMonth={() => {}}\n />\n
|
|
1
|
+
{"version":3,"file":"SceneTimePicker.js","sources":["../../../src/components/SceneTimePicker.tsx"],"sourcesContent":["import React from 'react';\n\nimport { RefreshPicker, TimeRangePicker, ToolbarButtonRow } from '@grafana/ui';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneComponentProps, SceneObjectStatePlain } from '../core/types';\n\nexport interface SceneTimePickerState extends SceneObjectStatePlain {\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 timeRangeState = timeRange.useState();\n\n if (hidePicker) {\n return null;\n }\n\n return (\n <ToolbarButtonRow alignment=\"right\">\n <TimeRangePicker\n isOnCanvas={isOnCanvas}\n value={timeRangeState.value}\n onChange={timeRange.onTimeRangeChange}\n timeZone={'browser'}\n fiscalYearStartMonth={0}\n onMoveBackward={() => {}}\n onMoveForward={() => {}}\n onZoom={() => {}}\n onChangeTimeZone={() => {}}\n onChangeFiscalYearStartMonth={() => {}}\n />\n <RefreshPicker onRefresh={timeRange.onRefresh} onIntervalChanged={() => {}} />\n </ToolbarButtonRow>\n );\n}\n"],"names":[],"mappings":";;;;;AAaO,MAAM,wBAAwB,eAAsC,CAAA;AAE3E,CAAA;AAFa,eAAA,CACG,SAAY,GAAA,uBAAA,CAAA;AAG5B,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,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,gBAAA,EAAA;AAAA,IAAiB,SAAU,EAAA,OAAA;AAAA,GAAA,kBACzB,KAAA,CAAA,aAAA,CAAA,eAAA,EAAA;AAAA,IACC,UAAA;AAAA,IACA,OAAO,cAAe,CAAA,KAAA;AAAA,IACtB,UAAU,SAAU,CAAA,iBAAA;AAAA,IACpB,QAAU,EAAA,SAAA;AAAA,IACV,oBAAsB,EAAA,CAAA;AAAA,IACtB,gBAAgB,MAAM;AAAA,KAAC;AAAA,IACvB,eAAe,MAAM;AAAA,KAAC;AAAA,IACtB,QAAQ,MAAM;AAAA,KAAC;AAAA,IACf,kBAAkB,MAAM;AAAA,KAAC;AAAA,IACzB,8BAA8B,MAAM;AAAA,KAAC;AAAA,GACvC,mBACC,KAAA,CAAA,aAAA,CAAA,aAAA,EAAA;AAAA,IAAc,WAAW,SAAU,CAAA,SAAA;AAAA,IAAW,mBAAmB,MAAM;AAAA,KAAC;AAAA,GAAG,CAC9E,CAAA,CAAA;AAEJ;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VizPanel.js","sources":["../../../../src/components/VizPanel/VizPanel.tsx"],"sourcesContent":["import {\n AbsoluteTimeRange,\n FieldConfigSource,\n PanelModel,\n PanelPlugin,\n toUtc,\n getPanelOptionsWithDefaults,\n} from '@grafana/data';\nimport { config, getPluginImportUtils } from '@grafana/runtime';\nimport { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { DeepPartial, SceneLayoutChildState } from '../../core/types';\n\nimport { VizPanelRenderer } from './VizPanelRenderer';\nimport { VariableDependencyConfig } from '../../variables/VariableDependencyConfig';\n\nexport interface VizPanelState<TOptions = {}, TFieldConfig = {}> extends SceneLayoutChildState {\n title: string;\n pluginId: string;\n options: DeepPartial<TOptions>;\n fieldConfig: FieldConfigSource<DeepPartial<TFieldConfig>>;\n pluginVersion?: string;\n // internal state\n pluginLoadError?: string;\n}\n\nexport class VizPanel<TOptions = {}, TFieldConfig = {}> extends SceneObjectBase<VizPanelState<TOptions, TFieldConfig>> {\n public static Component = VizPanelRenderer;\n\n protected _variableDependency = new VariableDependencyConfig(this, {\n statePaths: ['title', 'options', 'fieldConfig'],\n });\n\n // Not part of state as this is not serializable\n private _plugin?: PanelPlugin;\n\n public constructor(state: Partial<VizPanelState<TOptions, TFieldConfig>>) {\n super({\n options: {},\n fieldConfig: { defaults: {}, overrides: [] },\n title: 'Title',\n pluginId: 'timeseries',\n ...state,\n });\n }\n\n public activate() {\n super.activate();\n const { getPanelPluginFromCache, importPanelPlugin } = getPluginImportUtils();\n const plugin = getPanelPluginFromCache(this.state.pluginId);\n\n if (plugin) {\n this.pluginLoaded(plugin);\n } else {\n importPanelPlugin(this.state.pluginId)\n .then((result) => this.pluginLoaded(result))\n .catch((err: Error) => {\n this.setState({ pluginLoadError: err.message });\n });\n }\n }\n\n private pluginLoaded(plugin: PanelPlugin) {\n const { options, fieldConfig, title, pluginId, pluginVersion } = this.state;\n\n const panel: PanelModel = { title, options, fieldConfig, id: 1, type: pluginId, pluginVersion: pluginVersion };\n const currentVersion = this.getPluginVersion(plugin);\n\n if (plugin.onPanelMigration) {\n if (currentVersion !== this.state.pluginVersion) {\n // These migration handlers also mutate panel.fieldConfig to migrate fieldConfig\n panel.options = plugin.onPanelMigration(panel);\n }\n }\n\n const withDefaults = getPanelOptionsWithDefaults({\n plugin,\n currentOptions: panel.options,\n currentFieldConfig: panel.fieldConfig,\n isAfterPluginChange: false,\n });\n\n this._plugin = plugin;\n this.setState({\n options: withDefaults.options,\n fieldConfig: withDefaults.fieldConfig,\n pluginVersion: currentVersion,\n });\n }\n\n private getPluginVersion(plugin: PanelPlugin): string {\n return plugin && plugin.meta.info.version ? plugin.meta.info.version : config.buildInfo.version;\n }\n\n public getPlugin(): PanelPlugin | undefined {\n return this._plugin;\n }\n\n public onChangeTimeRange = (timeRange: AbsoluteTimeRange) => {\n const sceneTimeRange = sceneGraph.getTimeRange(this);\n sceneTimeRange.onTimeRangeChange({\n raw: {\n from: toUtc(timeRange.from),\n to: toUtc(timeRange.to),\n },\n from: toUtc(timeRange.from),\n to: toUtc(timeRange.to),\n });\n };\n\n public onOptionsChange = (options: TOptions) => {\n this.setState({ options });\n };\n\n public onFieldConfigChange = (fieldConfig: FieldConfigSource<TFieldConfig>) => {\n this.setState({ fieldConfig });\n };\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"VizPanel.js","sources":["../../../../src/components/VizPanel/VizPanel.tsx"],"sourcesContent":["import {\n AbsoluteTimeRange,\n FieldConfigSource,\n PanelModel,\n PanelPlugin,\n toUtc,\n getPanelOptionsWithDefaults,\n} from '@grafana/data';\nimport { config, getPluginImportUtils } from '@grafana/runtime';\nimport { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { DeepPartial, SceneLayoutChildState } from '../../core/types';\n\nimport { VizPanelRenderer } from './VizPanelRenderer';\nimport { VariableDependencyConfig } from '../../variables/VariableDependencyConfig';\n\nexport interface VizPanelState<TOptions = {}, TFieldConfig = {}> extends SceneLayoutChildState {\n title: string;\n description?: string;\n pluginId: string;\n options: DeepPartial<TOptions>;\n fieldConfig: FieldConfigSource<DeepPartial<TFieldConfig>>;\n pluginVersion?: string;\n // internal state\n pluginLoadError?: string;\n}\n\nexport class VizPanel<TOptions = {}, TFieldConfig = {}> extends SceneObjectBase<VizPanelState<TOptions, TFieldConfig>> {\n public static Component = VizPanelRenderer;\n\n protected _variableDependency = new VariableDependencyConfig(this, {\n statePaths: ['title', 'options', 'fieldConfig'],\n });\n\n // Not part of state as this is not serializable\n private _plugin?: PanelPlugin;\n\n public constructor(state: Partial<VizPanelState<TOptions, TFieldConfig>>) {\n super({\n options: {},\n fieldConfig: { defaults: {}, overrides: [] },\n title: 'Title',\n pluginId: 'timeseries',\n ...state,\n });\n }\n\n public activate() {\n super.activate();\n const { getPanelPluginFromCache, importPanelPlugin } = getPluginImportUtils();\n const plugin = getPanelPluginFromCache(this.state.pluginId);\n\n if (plugin) {\n this.pluginLoaded(plugin);\n } else {\n importPanelPlugin(this.state.pluginId)\n .then((result) => this.pluginLoaded(result))\n .catch((err: Error) => {\n this.setState({ pluginLoadError: err.message });\n });\n }\n }\n\n private pluginLoaded(plugin: PanelPlugin) {\n const { options, fieldConfig, title, pluginId, pluginVersion } = this.state;\n\n const panel: PanelModel = { title, options, fieldConfig, id: 1, type: pluginId, pluginVersion: pluginVersion };\n const currentVersion = this.getPluginVersion(plugin);\n\n if (plugin.onPanelMigration) {\n if (currentVersion !== this.state.pluginVersion) {\n // These migration handlers also mutate panel.fieldConfig to migrate fieldConfig\n panel.options = plugin.onPanelMigration(panel);\n }\n }\n\n const withDefaults = getPanelOptionsWithDefaults({\n plugin,\n currentOptions: panel.options,\n currentFieldConfig: panel.fieldConfig,\n isAfterPluginChange: false,\n });\n\n this._plugin = plugin;\n this.setState({\n options: withDefaults.options,\n fieldConfig: withDefaults.fieldConfig,\n pluginVersion: currentVersion,\n });\n }\n\n private getPluginVersion(plugin: PanelPlugin): string {\n return plugin && plugin.meta.info.version ? plugin.meta.info.version : config.buildInfo.version;\n }\n\n public getPlugin(): PanelPlugin | undefined {\n return this._plugin;\n }\n\n public onChangeTimeRange = (timeRange: AbsoluteTimeRange) => {\n const sceneTimeRange = sceneGraph.getTimeRange(this);\n sceneTimeRange.onTimeRangeChange({\n raw: {\n from: toUtc(timeRange.from),\n to: toUtc(timeRange.to),\n },\n from: toUtc(timeRange.from),\n to: toUtc(timeRange.to),\n });\n };\n\n public onOptionsChange = (options: TOptions) => {\n this.setState({ options });\n };\n\n public onFieldConfigChange = (fieldConfig: FieldConfigSource<TFieldConfig>) => {\n this.setState({ fieldConfig });\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -11,10 +11,10 @@ function VizPanelRenderer({ model }) {
|
|
|
11
11
|
var _a;
|
|
12
12
|
const theme = useTheme2();
|
|
13
13
|
const replace = useMemo(
|
|
14
|
-
() => (value, scoped) => sceneGraph.interpolate(model, value, scoped),
|
|
14
|
+
() => (value, scoped, format) => sceneGraph.interpolate(model, value, scoped, format),
|
|
15
15
|
[model]
|
|
16
16
|
);
|
|
17
|
-
const { title, options, fieldConfig, pluginId, pluginLoadError, $data, placement } = model.useState();
|
|
17
|
+
const { title, description, options, fieldConfig, pluginId, pluginLoadError, $data, placement } = model.useState();
|
|
18
18
|
const [ref, { width, height }] = useMeasure();
|
|
19
19
|
const plugin = model.getPlugin();
|
|
20
20
|
const { data } = sceneGraph.getData(model).useState();
|
|
@@ -23,7 +23,7 @@ function VizPanelRenderer({ model }) {
|
|
|
23
23
|
const dragHandle = /* @__PURE__ */ React.createElement(SceneDragHandle, {
|
|
24
24
|
layoutKey: parentLayout.state.key
|
|
25
25
|
});
|
|
26
|
-
const titleInterpolated =
|
|
26
|
+
const titleInterpolated = replace(title, void 0, "text");
|
|
27
27
|
const timeZone = sceneGraph.getTimeRange(model).state.timeZone;
|
|
28
28
|
const dataWithOverrides = useFieldOverrides(plugin, fieldConfig, data, timeZone, theme, replace);
|
|
29
29
|
if (pluginLoadError) {
|
|
@@ -39,14 +39,23 @@ function VizPanelRenderer({ model }) {
|
|
|
39
39
|
if ($data instanceof SceneQueryRunner) {
|
|
40
40
|
$data.setContainerWidth(width);
|
|
41
41
|
}
|
|
42
|
+
const titleItems = isDraggable ? [dragHandle] : [];
|
|
43
|
+
if (model.state.$timeRange) {
|
|
44
|
+
titleItems.push(/* @__PURE__ */ React.createElement(model.state.$timeRange.Component, {
|
|
45
|
+
model: model.state.$timeRange
|
|
46
|
+
}));
|
|
47
|
+
}
|
|
42
48
|
return /* @__PURE__ */ React.createElement("div", {
|
|
43
49
|
ref,
|
|
44
50
|
style: { position: "absolute", width: "100%", height: "100%" }
|
|
45
51
|
}, /* @__PURE__ */ React.createElement(PanelChrome, {
|
|
46
52
|
title: titleInterpolated,
|
|
53
|
+
description: description ? () => replace(description) : "",
|
|
54
|
+
loadingState: dataWithOverrides == null ? void 0 : dataWithOverrides.state,
|
|
55
|
+
statusMessage: (dataWithOverrides == null ? void 0 : dataWithOverrides.error) ? dataWithOverrides.error.message : "",
|
|
47
56
|
width,
|
|
48
57
|
height,
|
|
49
|
-
|
|
58
|
+
titleItems: isDraggable ? [dragHandle] : []
|
|
50
59
|
}, (innerWidth, innerHeight) => /* @__PURE__ */ React.createElement(React.Fragment, null, !dataWithOverrides && /* @__PURE__ */ React.createElement("div", null, "No data..."), dataWithOverrides && /* @__PURE__ */ React.createElement(ErrorBoundaryAlert, {
|
|
51
60
|
dependencies: [plugin, data]
|
|
52
61
|
}, /* @__PURE__ */ React.createElement(PluginContextProvider, {
|
|
@@ -63,7 +72,7 @@ function VizPanelRenderer({ model }) {
|
|
|
63
72
|
width: innerWidth,
|
|
64
73
|
height: innerHeight,
|
|
65
74
|
renderCounter: 0,
|
|
66
|
-
replaceVariables:
|
|
75
|
+
replaceVariables: replace,
|
|
67
76
|
onOptionsChange: model.onOptionsChange,
|
|
68
77
|
onFieldConfigChange: model.onFieldConfigChange,
|
|
69
78
|
onChangeTimeRange: model.onChangeTimeRange,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VizPanelRenderer.js","sources":["../../../../src/components/VizPanel/VizPanelRenderer.tsx"],"sourcesContent":["import React, { RefCallback, useMemo } from 'react';\nimport { useMeasure } from 'react-use';\n\nimport { PluginContextProvider, useFieldOverrides, ScopedVars } from '@grafana/data';\nimport { getAppEvents } from '@grafana/runtime';\nimport { PanelChrome, ErrorBoundaryAlert, useTheme2 } from '@grafana/ui';\n\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { SceneComponentProps } from '../../core/types';\nimport { SceneQueryRunner } from '../../querying/SceneQueryRunner';\nimport { SceneDragHandle } from '../SceneDragHandle';\n\nimport { VizPanel } from './VizPanel';\n\nexport function VizPanelRenderer({ model }: SceneComponentProps<VizPanel>) {\n const theme = useTheme2();\n const replace = useMemo(\n () => (value: string, scoped?: ScopedVars)
|
|
1
|
+
{"version":3,"file":"VizPanelRenderer.js","sources":["../../../../src/components/VizPanel/VizPanelRenderer.tsx"],"sourcesContent":["import React, { RefCallback, useMemo } from 'react';\nimport { useMeasure } from 'react-use';\n\nimport { PluginContextProvider, useFieldOverrides, ScopedVars, InterpolateFunction } from '@grafana/data';\nimport { getAppEvents } from '@grafana/runtime';\nimport { PanelChrome, ErrorBoundaryAlert, useTheme2 } from '@grafana/ui';\n\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { SceneComponentProps } from '../../core/types';\nimport { SceneQueryRunner } from '../../querying/SceneQueryRunner';\nimport { SceneDragHandle } from '../SceneDragHandle';\n\nimport { VizPanel } from './VizPanel';\nimport { CustomFormatterFn } from '../../variables/interpolation/sceneInterpolator';\n\nexport function VizPanelRenderer({ model }: SceneComponentProps<VizPanel>) {\n const theme = useTheme2();\n const replace = useMemo(\n () => (value: string, scoped?: ScopedVars, format?: string | CustomFormatterFn) =>\n sceneGraph.interpolate(model, value, scoped, format),\n [model]\n ) as InterpolateFunction;\n const { title, description, options, fieldConfig, pluginId, pluginLoadError, $data, placement } = model.useState();\n const [ref, { width, height }] = useMeasure();\n const plugin = model.getPlugin();\n const { data } = sceneGraph.getData(model).useState();\n const parentLayout = sceneGraph.getLayout(model);\n\n // TODO: this should probably be parentLayout.isDraggingEnabled() ? placement?.isDraggable : false\n // The current logic is not correct, just because parent layout itself is not draggable does not mean children are not\n const isDraggable = parentLayout.state.placement?.isDraggable ? placement?.isDraggable : false;\n const dragHandle = <SceneDragHandle layoutKey={parentLayout.state.key!} />;\n\n const titleInterpolated = replace(title, undefined, 'text');\n\n // Not sure we need to subscribe to this state\n const timeZone = sceneGraph.getTimeRange(model).state.timeZone;\n\n const dataWithOverrides = useFieldOverrides(plugin, fieldConfig, data, timeZone, theme, replace);\n\n if (pluginLoadError) {\n return <div>Failed to load plugin: {pluginLoadError}</div>;\n }\n\n if (!plugin || !plugin.hasPluginId(pluginId)) {\n return <div>Loading plugin panel...</div>;\n }\n\n if (!plugin.panel) {\n return <div>Panel plugin has no panel component</div>;\n }\n\n const PanelComponent = plugin.panel;\n\n // Query runner needs to with for auto maxDataPoints\n if ($data instanceof SceneQueryRunner) {\n $data.setContainerWidth(width);\n }\n\n const titleItems: React.ReactNode[] = isDraggable ? [dragHandle] : [];\n\n // If we have local time range show that in panel header\n if (model.state.$timeRange) {\n titleItems.push(<model.state.$timeRange.Component model={model.state.$timeRange} />);\n }\n\n return (\n <div ref={ref as RefCallback<HTMLDivElement>} style={{ position: 'absolute', width: '100%', height: '100%' }}>\n <PanelChrome\n title={titleInterpolated}\n description={description ? () => replace(description) : ''}\n loadingState={dataWithOverrides?.state}\n statusMessage={dataWithOverrides?.error ? dataWithOverrides.error.message : ''}\n width={width}\n height={height}\n titleItems={isDraggable ? [dragHandle] : []}\n >\n {(innerWidth, innerHeight) => (\n <>\n {!dataWithOverrides && <div>No data...</div>}\n {dataWithOverrides && (\n <ErrorBoundaryAlert dependencies={[plugin, data]}>\n <PluginContextProvider meta={plugin.meta}>\n <PanelComponent\n id={1}\n data={dataWithOverrides}\n title={title}\n timeRange={dataWithOverrides.timeRange}\n timeZone={timeZone}\n options={options}\n fieldConfig={fieldConfig}\n transparent={false}\n width={innerWidth}\n height={innerHeight}\n renderCounter={0}\n replaceVariables={replace}\n onOptionsChange={model.onOptionsChange}\n onFieldConfigChange={model.onFieldConfigChange}\n onChangeTimeRange={model.onChangeTimeRange}\n eventBus={getAppEvents()}\n />\n </PluginContextProvider>\n </ErrorBoundaryAlert>\n )}\n </>\n )}\n </PanelChrome>\n </div>\n );\n}\n\nVizPanelRenderer.displayName = 'ScenePanelRenderer';\n"],"names":[],"mappings":";;;;;;;;;AAegB,SAAA,gBAAA,CAAiB,EAAE,KAAA,EAAwC,EAAA;AAf3E,EAAA,IAAA,EAAA,CAAA;AAgBE,EAAA,MAAM,QAAQ,SAAU,EAAA,CAAA;AACxB,EAAA,MAAM,OAAU,GAAA,OAAA;AAAA,IACd,MAAM,CAAC,KAAA,EAAe,MAAqB,EAAA,MAAA,KACzC,WAAW,WAAY,CAAA,KAAA,EAAO,KAAO,EAAA,MAAA,EAAQ,MAAM,CAAA;AAAA,IACrD,CAAC,KAAK,CAAA;AAAA,GACR,CAAA;AACA,EAAM,MAAA,EAAE,KAAO,EAAA,WAAA,EAAa,OAAS,EAAA,WAAA,EAAa,QAAU,EAAA,eAAA,EAAiB,KAAO,EAAA,SAAA,EAAc,GAAA,KAAA,CAAM,QAAS,EAAA,CAAA;AACjH,EAAA,MAAM,CAAC,GAAK,EAAA,EAAE,OAAO,MAAO,EAAC,IAAI,UAAW,EAAA,CAAA;AAC5C,EAAM,MAAA,MAAA,GAAS,MAAM,SAAU,EAAA,CAAA;AAC/B,EAAA,MAAM,EAAE,IAAK,EAAA,GAAI,WAAW,OAAQ,CAAA,KAAK,EAAE,QAAS,EAAA,CAAA;AACpD,EAAM,MAAA,YAAA,GAAe,UAAW,CAAA,SAAA,CAAU,KAAK,CAAA,CAAA;AAI/C,EAAA,MAAM,gBAAc,EAAa,GAAA,YAAA,CAAA,KAAA,CAAM,cAAnB,IAA8B,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,WAAA,IAAc,uCAAW,WAAc,GAAA,KAAA,CAAA;AACzF,EAAA,MAAM,6BAAc,KAAA,CAAA,aAAA,CAAA,eAAA,EAAA;AAAA,IAAgB,SAAA,EAAW,aAAa,KAAM,CAAA,GAAA;AAAA,GAAM,CAAA,CAAA;AAExE,EAAA,MAAM,iBAAoB,GAAA,OAAA,CAAQ,KAAO,EAAA,KAAA,CAAA,EAAW,MAAM,CAAA,CAAA;AAG1D,EAAA,MAAM,QAAW,GAAA,UAAA,CAAW,YAAa,CAAA,KAAK,EAAE,KAAM,CAAA,QAAA,CAAA;AAEtD,EAAA,MAAM,oBAAoB,iBAAkB,CAAA,MAAA,EAAQ,aAAa,IAAM,EAAA,QAAA,EAAU,OAAO,OAAO,CAAA,CAAA;AAE/F,EAAA,IAAI,eAAiB,EAAA;AACnB,IAAO,uBAAA,KAAA,CAAA,aAAA,CAAC,KAAI,EAAA,IAAA,EAAA,yBAAA,EAAwB,eAAgB,CAAA,CAAA;AAAA,GACtD;AAEA,EAAA,IAAI,CAAC,MAAU,IAAA,CAAC,MAAO,CAAA,WAAA,CAAY,QAAQ,CAAG,EAAA;AAC5C,IAAO,uBAAA,KAAA,CAAA,aAAA,CAAC,aAAI,yBAAuB,CAAA,CAAA;AAAA,GACrC;AAEA,EAAI,IAAA,CAAC,OAAO,KAAO,EAAA;AACjB,IAAO,uBAAA,KAAA,CAAA,aAAA,CAAC,aAAI,qCAAmC,CAAA,CAAA;AAAA,GACjD;AAEA,EAAA,MAAM,iBAAiB,MAAO,CAAA,KAAA,CAAA;AAG9B,EAAA,IAAI,iBAAiB,gBAAkB,EAAA;AACrC,IAAA,KAAA,CAAM,kBAAkB,KAAK,CAAA,CAAA;AAAA,GAC/B;AAEA,EAAA,MAAM,UAAgC,GAAA,WAAA,GAAc,CAAC,UAAU,IAAI,EAAC,CAAA;AAGpE,EAAI,IAAA,KAAA,CAAM,MAAM,UAAY,EAAA;AAC1B,IAAA,UAAA,CAAW,IAAK,iBAAA,KAAA,CAAA,aAAA,CAAC,KAAM,CAAA,KAAA,CAAM,WAAW,SAAvB,EAAA;AAAA,MAAiC,KAAA,EAAO,MAAM,KAAM,CAAA,UAAA;AAAA,KAAY,CAAE,CAAA,CAAA;AAAA,GACrF;AAEA,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA;AAAA,IAAI,GAAA;AAAA,IAAyC,OAAO,EAAE,QAAA,EAAU,YAAY,KAAO,EAAA,MAAA,EAAQ,QAAQ,MAAO,EAAA;AAAA,GAAA,kBACxG,KAAA,CAAA,aAAA,CAAA,WAAA,EAAA;AAAA,IACC,KAAO,EAAA,iBAAA;AAAA,IACP,WAAa,EAAA,WAAA,GAAc,MAAM,OAAA,CAAQ,WAAW,CAAI,GAAA,EAAA;AAAA,IACxD,cAAc,iBAAmB,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,iBAAA,CAAA,KAAA;AAAA,IACjC,aAAe,EAAA,CAAA,iBAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,iBAAA,CAAmB,KAAQ,IAAA,iBAAA,CAAkB,MAAM,OAAU,GAAA,EAAA;AAAA,IAC5E,KAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAY,EAAA,WAAA,GAAc,CAAC,UAAU,IAAI,EAAC;AAAA,GAEzC,EAAA,CAAC,UAAY,EAAA,WAAA,qBAET,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,EAAA,CAAC,iBAAqB,oBAAA,KAAA,CAAA,aAAA,CAAC,KAAI,EAAA,IAAA,EAAA,YAAU,CACrC,EAAA,iBAAA,oBACE,KAAA,CAAA,aAAA,CAAA,kBAAA,EAAA;AAAA,IAAmB,YAAA,EAAc,CAAC,MAAA,EAAQ,IAAI,CAAA;AAAA,GAAA,kBAC5C,KAAA,CAAA,aAAA,CAAA,qBAAA,EAAA;AAAA,IAAsB,MAAM,MAAO,CAAA,IAAA;AAAA,GAAA,kBACjC,KAAA,CAAA,aAAA,CAAA,cAAA,EAAA;AAAA,IACC,EAAI,EAAA,CAAA;AAAA,IACJ,IAAM,EAAA,iBAAA;AAAA,IACN,KAAA;AAAA,IACA,WAAW,iBAAkB,CAAA,SAAA;AAAA,IAC7B,QAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAa,EAAA,KAAA;AAAA,IACb,KAAO,EAAA,UAAA;AAAA,IACP,MAAQ,EAAA,WAAA;AAAA,IACR,aAAe,EAAA,CAAA;AAAA,IACf,gBAAkB,EAAA,OAAA;AAAA,IAClB,iBAAiB,KAAM,CAAA,eAAA;AAAA,IACvB,qBAAqB,KAAM,CAAA,mBAAA;AAAA,IAC3B,mBAAmB,KAAM,CAAA,iBAAA;AAAA,IACzB,UAAU,YAAa,EAAA;AAAA,GACzB,CACF,CACF,CAEJ,CAEJ,CACF,CAAA,CAAA;AAEJ,CAAA;AAEA,gBAAA,CAAiB,WAAc,GAAA,oBAAA;;;;"}
|
|
@@ -95,7 +95,10 @@ class SceneObjectBase {
|
|
|
95
95
|
}
|
|
96
96
|
activate() {
|
|
97
97
|
this._isActive = true;
|
|
98
|
-
const { $data, $variables } = this.state;
|
|
98
|
+
const { $data, $variables, $timeRange } = this.state;
|
|
99
|
+
if ($timeRange && !$timeRange.isActive) {
|
|
100
|
+
$timeRange.activate();
|
|
101
|
+
}
|
|
99
102
|
if ($data && !$data.isActive) {
|
|
100
103
|
$data.activate();
|
|
101
104
|
}
|
|
@@ -105,7 +108,10 @@ class SceneObjectBase {
|
|
|
105
108
|
}
|
|
106
109
|
deactivate() {
|
|
107
110
|
this._isActive = false;
|
|
108
|
-
const { $data, $variables } = this.state;
|
|
111
|
+
const { $data, $variables, $timeRange } = this.state;
|
|
112
|
+
if ($timeRange && $timeRange.isActive) {
|
|
113
|
+
$timeRange.deactivate();
|
|
114
|
+
}
|
|
109
115
|
if ($data && $data.isActive) {
|
|
110
116
|
$data.deactivate();
|
|
111
117
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SceneObjectBase.js","sources":["../../../src/core/SceneObjectBase.tsx"],"sourcesContent":["import { useEffect } from 'react';\nimport { Observer, Subject, Subscription, Unsubscribable } from 'rxjs';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { BusEvent, BusEventHandler, BusEventType, EventBusSrv } from '@grafana/data';\nimport { SceneObject, SceneComponent, SceneObjectState, SceneObjectUrlSyncHandler } from './types';\nimport { useForceUpdate } from '@grafana/ui';\n\nimport { SceneComponentWrapper } from './SceneComponentWrapper';\nimport { SceneObjectStateChangedEvent } from './events';\nimport { cloneSceneObject, forEachSceneObjectInState } from './utils';\nimport { SceneVariableDependencyConfigLike } from '../variables/types';\n\nexport abstract class SceneObjectBase<TState extends SceneObjectState = SceneObjectState>\n implements SceneObject<TState>\n{\n private _isActive = false;\n private _subject = new Subject<TState>();\n private _state: TState;\n private _events = new EventBusSrv();\n\n /** Incremented in SceneComponentWrapper, useful for tests and rendering optimizations */\n protected _renderCount = 0;\n protected _parent?: SceneObject;\n protected _subs = new Subscription();\n\n protected _variableDependency: SceneVariableDependencyConfigLike | undefined;\n protected _urlSync: SceneObjectUrlSyncHandler<TState> | undefined;\n\n public constructor(state: TState) {\n if (!state.key) {\n state.key = uuidv4();\n }\n\n this._state = Object.freeze(state);\n this._subject.next(state);\n this.setParent();\n }\n\n /** Current state */\n public get state(): TState {\n return this._state;\n }\n\n /** True if currently being active (ie displayed for visual objects) */\n public get isActive(): boolean {\n return this._isActive;\n }\n\n /** Returns the parent, undefined for root object */\n public get parent(): SceneObject | undefined {\n return this._parent;\n }\n\n /** Returns variable dependency config */\n public get variableDependency(): SceneVariableDependencyConfigLike | undefined {\n return this._variableDependency;\n }\n\n /** Returns url sync config */\n public get urlSync(): SceneObjectUrlSyncHandler<TState> | undefined {\n return this._urlSync;\n }\n\n /**\n * Used in render functions when rendering a SceneObject.\n * Wraps the component in an EditWrapper that handles edit mode\n */\n public get Component(): SceneComponent<this> {\n return SceneComponentWrapper;\n }\n\n /**\n * Temporary solution, should be replaced by declarative options\n */\n public get Editor(): SceneComponent<this> {\n return ((this as any).constructor['Editor'] ?? (() => null)) as SceneComponent<this>;\n }\n\n private setParent() {\n forEachSceneObjectInState(this._state, (child) => (child._parent = this));\n }\n\n /**\n * Subscribe to the scene state subject\n **/\n public subscribeToState(observerOrNext?: Partial<Observer<TState>>): Subscription {\n return this._subject.subscribe(observerOrNext);\n }\n\n /**\n * Subscribe to the scene event\n **/\n public subscribeToEvent<T extends BusEvent>(eventType: BusEventType<T>, handler: BusEventHandler<T>): Unsubscribable {\n return this._events.subscribe(eventType, handler);\n }\n\n public setState(update: Partial<TState>) {\n const prevState = this._state;\n const newState: TState = {\n ...this._state,\n ...update,\n };\n\n this._state = Object.freeze(newState);\n\n this.setParent();\n this._subject.next(newState);\n\n // Bubble state change event. This is event is subscribed to by UrlSyncManager and UndoManager\n this.publishEvent(\n new SceneObjectStateChangedEvent({\n prevState,\n newState,\n partialUpdate: update,\n changedObject: this,\n }),\n true\n );\n }\n /*\n * Publish an event and optionally bubble it up the scene\n **/\n public publishEvent(event: BusEvent, bubble?: boolean) {\n this._events.publish(event);\n\n if (bubble && this.parent) {\n this.parent.publishEvent(event, bubble);\n }\n }\n\n public getRoot(): SceneObject {\n return !this._parent ? this : this._parent.getRoot();\n }\n\n /**\n * Called by the SceneComponentWrapper when the react component is mounted\n */\n public activate() {\n this._isActive = true;\n\n const { $data, $variables } = this.state;\n\n if ($data && !$data.isActive) {\n $data.activate();\n }\n\n if ($variables && !$variables.isActive) {\n $variables.activate();\n }\n }\n\n /**\n * Called by the SceneComponentWrapper when the react component is unmounted\n */\n public deactivate(): void {\n this._isActive = false;\n\n const { $data, $variables } = this.state;\n\n if ($data && $data.isActive) {\n $data.deactivate();\n }\n\n if ($variables && $variables.isActive) {\n $variables.deactivate();\n }\n\n // Clear subscriptions and listeners\n this._events.removeAllListeners();\n this._subs.unsubscribe();\n this._subs = new Subscription();\n\n this._subject.complete();\n this._subject = new Subject<TState>();\n }\n\n /**\n * Utility hook to get and subscribe to state\n */\n public useState() {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useSceneObjectState(this);\n }\n\n /** Force a re-render, should only be needed when variable values change */\n public forceRender(): void {\n this.setState({});\n }\n\n /**\n * Will create new SceneObject with shallow-cloned state, but all state items of type SceneObject are deep cloned\n */\n public clone(withState?: Partial<TState>): this {\n return cloneSceneObject(this, withState);\n }\n}\n\n/**\n * This hook is always returning model.state instead of a useState that remembers the last state emitted on the subject\n * The reason for this is so that if the model instance change this function will always return the latest state.\n */\nfunction useSceneObjectState<TState extends SceneObjectState>(model: SceneObjectBase<TState>): TState {\n const forceUpdate = useForceUpdate();\n\n useEffect(() => {\n const s = model.subscribeToState({ next: forceUpdate });\n return () => s.unsubscribe();\n }, [model, forceUpdate]);\n\n return model.state;\n}\n"],"names":["uuidv4"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SceneObjectBase.js","sources":["../../../src/core/SceneObjectBase.tsx"],"sourcesContent":["import { useEffect } from 'react';\nimport { Observer, Subject, Subscription, Unsubscribable } from 'rxjs';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport { BusEvent, BusEventHandler, BusEventType, EventBusSrv } from '@grafana/data';\nimport { SceneObject, SceneComponent, SceneObjectState, SceneObjectUrlSyncHandler } from './types';\nimport { useForceUpdate } from '@grafana/ui';\n\nimport { SceneComponentWrapper } from './SceneComponentWrapper';\nimport { SceneObjectStateChangedEvent } from './events';\nimport { cloneSceneObject, forEachSceneObjectInState } from './utils';\nimport { SceneVariableDependencyConfigLike } from '../variables/types';\n\nexport abstract class SceneObjectBase<TState extends SceneObjectState = SceneObjectState>\n implements SceneObject<TState>\n{\n private _isActive = false;\n private _subject = new Subject<TState>();\n private _state: TState;\n private _events = new EventBusSrv();\n\n /** Incremented in SceneComponentWrapper, useful for tests and rendering optimizations */\n protected _renderCount = 0;\n protected _parent?: SceneObject;\n protected _subs = new Subscription();\n\n protected _variableDependency: SceneVariableDependencyConfigLike | undefined;\n protected _urlSync: SceneObjectUrlSyncHandler<TState> | undefined;\n\n public constructor(state: TState) {\n if (!state.key) {\n state.key = uuidv4();\n }\n\n this._state = Object.freeze(state);\n this._subject.next(state);\n this.setParent();\n }\n\n /** Current state */\n public get state(): TState {\n return this._state;\n }\n\n /** True if currently being active (ie displayed for visual objects) */\n public get isActive(): boolean {\n return this._isActive;\n }\n\n /** Returns the parent, undefined for root object */\n public get parent(): SceneObject | undefined {\n return this._parent;\n }\n\n /** Returns variable dependency config */\n public get variableDependency(): SceneVariableDependencyConfigLike | undefined {\n return this._variableDependency;\n }\n\n /** Returns url sync config */\n public get urlSync(): SceneObjectUrlSyncHandler<TState> | undefined {\n return this._urlSync;\n }\n\n /**\n * Used in render functions when rendering a SceneObject.\n * Wraps the component in an EditWrapper that handles edit mode\n */\n public get Component(): SceneComponent<this> {\n return SceneComponentWrapper;\n }\n\n /**\n * Temporary solution, should be replaced by declarative options\n */\n public get Editor(): SceneComponent<this> {\n return ((this as any).constructor['Editor'] ?? (() => null)) as SceneComponent<this>;\n }\n\n private setParent() {\n forEachSceneObjectInState(this._state, (child) => (child._parent = this));\n }\n\n /**\n * Subscribe to the scene state subject\n **/\n public subscribeToState(observerOrNext?: Partial<Observer<TState>>): Subscription {\n return this._subject.subscribe(observerOrNext);\n }\n\n /**\n * Subscribe to the scene event\n **/\n public subscribeToEvent<T extends BusEvent>(eventType: BusEventType<T>, handler: BusEventHandler<T>): Unsubscribable {\n return this._events.subscribe(eventType, handler);\n }\n\n public setState(update: Partial<TState>) {\n const prevState = this._state;\n const newState: TState = {\n ...this._state,\n ...update,\n };\n\n this._state = Object.freeze(newState);\n\n this.setParent();\n this._subject.next(newState);\n\n // Bubble state change event. This is event is subscribed to by UrlSyncManager and UndoManager\n this.publishEvent(\n new SceneObjectStateChangedEvent({\n prevState,\n newState,\n partialUpdate: update,\n changedObject: this,\n }),\n true\n );\n }\n /*\n * Publish an event and optionally bubble it up the scene\n **/\n public publishEvent(event: BusEvent, bubble?: boolean) {\n this._events.publish(event);\n\n if (bubble && this.parent) {\n this.parent.publishEvent(event, bubble);\n }\n }\n\n public getRoot(): SceneObject {\n return !this._parent ? this : this._parent.getRoot();\n }\n\n /**\n * Called by the SceneComponentWrapper when the react component is mounted\n */\n public activate() {\n this._isActive = true;\n\n const { $data, $variables, $timeRange } = this.state;\n\n if ($timeRange && !$timeRange.isActive) {\n $timeRange.activate();\n }\n\n if ($data && !$data.isActive) {\n $data.activate();\n }\n\n if ($variables && !$variables.isActive) {\n $variables.activate();\n }\n }\n\n /**\n * Called by the SceneComponentWrapper when the react component is unmounted\n */\n public deactivate(): void {\n this._isActive = false;\n\n const { $data, $variables, $timeRange } = this.state;\n\n if ($timeRange && $timeRange.isActive) {\n $timeRange.deactivate();\n }\n\n if ($data && $data.isActive) {\n $data.deactivate();\n }\n\n if ($variables && $variables.isActive) {\n $variables.deactivate();\n }\n\n // Clear subscriptions and listeners\n this._events.removeAllListeners();\n this._subs.unsubscribe();\n this._subs = new Subscription();\n\n this._subject.complete();\n this._subject = new Subject<TState>();\n }\n\n /**\n * Utility hook to get and subscribe to state\n */\n public useState() {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useSceneObjectState(this);\n }\n\n /** Force a re-render, should only be needed when variable values change */\n public forceRender(): void {\n this.setState({});\n }\n\n /**\n * Will create new SceneObject with shallow-cloned state, but all state items of type SceneObject are deep cloned\n */\n public clone(withState?: Partial<TState>): this {\n return cloneSceneObject(this, withState);\n }\n}\n\n/**\n * This hook is always returning model.state instead of a useState that remembers the last state emitted on the subject\n * The reason for this is so that if the model instance change this function will always return the latest state.\n */\nfunction useSceneObjectState<TState extends SceneObjectState>(model: SceneObjectBase<TState>): TState {\n const forceUpdate = useForceUpdate();\n\n useEffect(() => {\n const s = model.subscribeToState({ next: forceUpdate });\n return () => s.unsubscribe();\n }, [model, forceUpdate]);\n\n return model.state;\n}\n"],"names":["uuidv4"],"mappings":"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"}
|
|
@@ -45,8 +45,6 @@ class SceneTimeRange extends SceneObjectBase {
|
|
|
45
45
|
this.onRefresh = () => {
|
|
46
46
|
this.setState({ value: evaluateTimeRange(this.state.from, this.state.to, this.state.timeZone) });
|
|
47
47
|
};
|
|
48
|
-
this.onIntervalChanged = (_) => {
|
|
49
|
-
};
|
|
50
48
|
}
|
|
51
49
|
getUrlState(state) {
|
|
52
50
|
return { from: state.from, to: state.to };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SceneTimeRange.js","sources":["../../../src/core/SceneTimeRange.tsx"],"sourcesContent":["import { dateMath, getTimeZone, TimeRange, TimeZone, toUtc } from '@grafana/data';\n\nimport { SceneObjectUrlSyncConfig } from '../services/SceneObjectUrlSyncConfig';\n\nimport { SceneObjectBase } from './SceneObjectBase';\nimport { SceneTimeRangeLike, SceneTimeRangeState, SceneObjectUrlValues, SceneObjectUrlValue } from './types';\n\nexport class SceneTimeRange extends SceneObjectBase<SceneTimeRangeState> implements SceneTimeRangeLike {\n protected _urlSync = new SceneObjectUrlSyncConfig(this, { keys: ['from', 'to'] });\n\n public constructor(state: Partial<SceneTimeRangeState> = {}) {\n const from = state.from ?? 'now-6h';\n const to = state.to ?? 'now';\n const timeZone = state.timeZone ?? getTimeZone();\n const value = evaluateTimeRange(from, to, timeZone);\n super({ from, to, timeZone, value, ...state });\n }\n\n public onTimeRangeChange = (timeRange: TimeRange) => {\n const update: Partial<SceneTimeRangeState> = {};\n\n if (typeof timeRange.raw.from === 'string') {\n update.from = timeRange.raw.from;\n } else {\n update.from = timeRange.raw.from.toISOString();\n }\n\n if (typeof timeRange.raw.to === 'string') {\n update.to = timeRange.raw.to;\n } else {\n update.to = timeRange.raw.to.toISOString();\n }\n\n update.value = evaluateTimeRange(update.from, update.to, this.state.timeZone);\n this.setState(update);\n };\n\n public onRefresh = () => {\n this.setState({ value: evaluateTimeRange(this.state.from, this.state.to, this.state.timeZone) });\n };\n\n public
|
|
1
|
+
{"version":3,"file":"SceneTimeRange.js","sources":["../../../src/core/SceneTimeRange.tsx"],"sourcesContent":["import { dateMath, getTimeZone, TimeRange, TimeZone, toUtc } from '@grafana/data';\n\nimport { SceneObjectUrlSyncConfig } from '../services/SceneObjectUrlSyncConfig';\n\nimport { SceneObjectBase } from './SceneObjectBase';\nimport { SceneTimeRangeLike, SceneTimeRangeState, SceneObjectUrlValues, SceneObjectUrlValue } from './types';\n\nexport class SceneTimeRange extends SceneObjectBase<SceneTimeRangeState> implements SceneTimeRangeLike {\n protected _urlSync = new SceneObjectUrlSyncConfig(this, { keys: ['from', 'to'] });\n\n public constructor(state: Partial<SceneTimeRangeState> = {}) {\n const from = state.from ?? 'now-6h';\n const to = state.to ?? 'now';\n const timeZone = state.timeZone ?? getTimeZone();\n const value = evaluateTimeRange(from, to, timeZone);\n super({ from, to, timeZone, value, ...state });\n }\n\n public onTimeRangeChange = (timeRange: TimeRange) => {\n const update: Partial<SceneTimeRangeState> = {};\n\n if (typeof timeRange.raw.from === 'string') {\n update.from = timeRange.raw.from;\n } else {\n update.from = timeRange.raw.from.toISOString();\n }\n\n if (typeof timeRange.raw.to === 'string') {\n update.to = timeRange.raw.to;\n } else {\n update.to = timeRange.raw.to.toISOString();\n }\n\n update.value = evaluateTimeRange(update.from, update.to, this.state.timeZone);\n this.setState(update);\n };\n\n public onRefresh = () => {\n this.setState({ value: evaluateTimeRange(this.state.from, this.state.to, this.state.timeZone) });\n };\n\n public getUrlState(state: SceneTimeRangeState) {\n return { from: state.from, to: state.to };\n }\n\n public updateFromUrl(values: SceneObjectUrlValues) {\n const update: Partial<SceneTimeRangeState> = {};\n\n const from = parseUrlParam(values.from);\n if (from) {\n update.from = from;\n }\n\n const to = parseUrlParam(values.to);\n if (to) {\n update.to = to;\n }\n\n update.value = evaluateTimeRange(update.from ?? this.state.from, update.to ?? this.state.to, this.state.timeZone);\n this.setState(update);\n }\n}\n\nfunction parseUrlParam(value: SceneObjectUrlValue): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n\n if (value.indexOf('now') !== -1) {\n return value;\n }\n\n if (value.length === 8) {\n const utcValue = toUtc(value, 'YYYYMMDD');\n if (utcValue.isValid()) {\n return utcValue.toISOString();\n }\n } else if (value.length === 15) {\n const utcValue = toUtc(value, 'YYYYMMDDTHHmmss');\n if (utcValue.isValid()) {\n return utcValue.toISOString();\n }\n } else if (value.length === 24) {\n const utcValue = toUtc(value);\n return utcValue.toISOString();\n }\n\n const epoch = parseInt(value, 10);\n if (!isNaN(epoch)) {\n return toUtc(epoch).toISOString();\n }\n\n return null;\n}\n\nfunction evaluateTimeRange(from: string, to: string, timeZone: TimeZone, fiscalYearStartMonth?: number): TimeRange {\n return {\n from: dateMath.parse(from, false, timeZone, fiscalYearStartMonth)!,\n to: dateMath.parse(to, true, timeZone, fiscalYearStartMonth)!,\n raw: {\n from: from,\n to: to,\n },\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sources":["../../../src/core/types.ts"],"sourcesContent":["import React from 'react';\nimport { Observer, Subscription, Unsubscribable } from 'rxjs';\n\nimport { BusEvent, BusEventHandler, BusEventType, PanelData, TimeRange, TimeZone } from '@grafana/data';\n\nimport { SceneVariableDependencyConfigLike, SceneVariables } from '../variables/types';\n\nexport interface SceneObjectStatePlain {\n key?: string;\n $timeRange?: SceneTimeRangeLike;\n $data?: SceneObject<SceneDataState>;\n $editor?: SceneEditor;\n $variables?: SceneVariables;\n}\n\nexport interface SceneLayoutChildState extends SceneObjectStatePlain {\n placement?: SceneLayoutChildOptions;\n}\n\nexport type SceneObjectState = SceneObjectStatePlain | SceneLayoutState | SceneLayoutChildState;\n\nexport interface SceneLayoutChildOptions {\n width?: number | string;\n height?: number | string;\n xSizing?: 'fill' | 'content';\n ySizing?: 'fill' | 'content';\n x?: number;\n y?: number;\n minWidth?: number | string;\n minHeight?: number | string;\n isDraggable?: boolean;\n isResizable?: boolean;\n}\n\nexport interface SceneComponentProps<T> {\n model: T;\n isEditing?: boolean;\n}\n\nexport type SceneComponent<TModel> = React.FunctionComponent<SceneComponentProps<TModel>>;\n\nexport interface SceneDataState extends SceneObjectStatePlain {\n data?: PanelData;\n}\n\nexport interface SceneObject<TState extends SceneObjectState = SceneObjectState> {\n /** The current state */\n readonly state: TState;\n\n /** True when there is a React component mounted for this Object */\n readonly isActive: boolean;\n\n /** SceneObject parent */\n readonly parent?: SceneObject;\n\n /** This abtractions declares what variables the scene object depends on and how to handle when they change value. **/\n readonly variableDependency?: SceneVariableDependencyConfigLike;\n\n /** This abstraction declares URL sync dependencies of a scene object. **/\n readonly urlSync?: SceneObjectUrlSyncHandler<TState>;\n\n /** Subscribe to state changes */\n subscribeToState(observer?: Partial<Observer<TState>>): Subscription;\n\n /** Subscribe to a scene event */\n subscribeToEvent<T extends BusEvent>(typeFilter: BusEventType<T>, handler: BusEventHandler<T>): Unsubscribable;\n\n /** Publish an event and optionally bubble it up the scene */\n publishEvent(event: BusEvent, bubble?: boolean): void;\n\n /** Utility hook that wraps useObservable. Used by React components to subscribes to state changes */\n useState(): TState;\n\n /** How to modify state */\n setState(state: Partial<TState>): void;\n\n /** Called when the Component is mounted. A place to register event listeners add subscribe to state changes */\n activate(): void;\n\n /** Called when component unmounts. Unsubscribe and closes all subscriptions */\n deactivate(): void;\n\n /** Get the scene root */\n getRoot(): SceneObject;\n\n /** Returns a deep clone this object and all its children */\n clone(state?: Partial<TState>): this;\n\n /** A React component to use for rendering the object */\n Component(props: SceneComponentProps<SceneObject<TState>>): React.ReactElement | null;\n\n /** To be replaced by declarative method */\n Editor(props: SceneComponentProps<SceneObject<TState>>): React.ReactElement | null;\n\n /** Force a re-render, should only be needed when variable values change */\n forceRender(): void;\n}\n\nexport type SceneLayoutChild = SceneObject<SceneLayoutChildState | SceneLayoutState>;\n\nexport interface SceneLayoutState extends SceneLayoutChildState {\n children: SceneLayoutChild[];\n}\n\nexport type SceneLayout<T extends SceneLayoutState = SceneLayoutState> = SceneObject<T>;\n\nexport interface SceneEditorState extends SceneObjectStatePlain {\n hoverObject?: SceneObjectRef;\n selectedObject?: SceneObjectRef;\n}\n\nexport interface SceneEditor extends SceneObject<SceneEditorState> {\n onMouseEnterObject(model: SceneObject): void;\n onMouseLeaveObject(model: SceneObject): void;\n onSelectObject(model: SceneObject): void;\n getEditComponentWrapper(): React.ComponentType<SceneComponentEditWrapperProps>;\n}\n\ninterface SceneComponentEditWrapperProps {\n editor: SceneEditor;\n model: SceneObject;\n children: React.ReactNode;\n}\n\nexport interface SceneTimeRangeState extends SceneObjectStatePlain {\n from: string;\n to: string;\n timeZone: TimeZone;\n fiscalYearStartMonth?: number;\n value: TimeRange;\n}\n\nexport interface SceneTimeRangeLike extends SceneObject<SceneTimeRangeState> {\n onTimeRangeChange(timeRange: TimeRange): void;\n
|
|
1
|
+
{"version":3,"file":"types.js","sources":["../../../src/core/types.ts"],"sourcesContent":["import React from 'react';\nimport { Observer, Subscription, Unsubscribable } from 'rxjs';\n\nimport { BusEvent, BusEventHandler, BusEventType, PanelData, TimeRange, TimeZone } from '@grafana/data';\n\nimport { SceneVariableDependencyConfigLike, SceneVariables } from '../variables/types';\n\nexport interface SceneObjectStatePlain {\n key?: string;\n $timeRange?: SceneTimeRangeLike;\n $data?: SceneObject<SceneDataState>;\n $editor?: SceneEditor;\n $variables?: SceneVariables;\n}\n\nexport interface SceneLayoutChildState extends SceneObjectStatePlain {\n placement?: SceneLayoutChildOptions;\n}\n\nexport type SceneObjectState = SceneObjectStatePlain | SceneLayoutState | SceneLayoutChildState;\n\nexport interface SceneLayoutChildOptions {\n width?: number | string;\n height?: number | string;\n xSizing?: 'fill' | 'content';\n ySizing?: 'fill' | 'content';\n x?: number;\n y?: number;\n minWidth?: number | string;\n minHeight?: number | string;\n isDraggable?: boolean;\n isResizable?: boolean;\n}\n\nexport interface SceneComponentProps<T> {\n model: T;\n isEditing?: boolean;\n}\n\nexport type SceneComponent<TModel> = React.FunctionComponent<SceneComponentProps<TModel>>;\n\nexport interface SceneDataState extends SceneObjectStatePlain {\n data?: PanelData;\n}\n\nexport interface SceneObject<TState extends SceneObjectState = SceneObjectState> {\n /** The current state */\n readonly state: TState;\n\n /** True when there is a React component mounted for this Object */\n readonly isActive: boolean;\n\n /** SceneObject parent */\n readonly parent?: SceneObject;\n\n /** This abtractions declares what variables the scene object depends on and how to handle when they change value. **/\n readonly variableDependency?: SceneVariableDependencyConfigLike;\n\n /** This abstraction declares URL sync dependencies of a scene object. **/\n readonly urlSync?: SceneObjectUrlSyncHandler<TState>;\n\n /** Subscribe to state changes */\n subscribeToState(observer?: Partial<Observer<TState>>): Subscription;\n\n /** Subscribe to a scene event */\n subscribeToEvent<T extends BusEvent>(typeFilter: BusEventType<T>, handler: BusEventHandler<T>): Unsubscribable;\n\n /** Publish an event and optionally bubble it up the scene */\n publishEvent(event: BusEvent, bubble?: boolean): void;\n\n /** Utility hook that wraps useObservable. Used by React components to subscribes to state changes */\n useState(): TState;\n\n /** How to modify state */\n setState(state: Partial<TState>): void;\n\n /** Called when the Component is mounted. A place to register event listeners add subscribe to state changes */\n activate(): void;\n\n /** Called when component unmounts. Unsubscribe and closes all subscriptions */\n deactivate(): void;\n\n /** Get the scene root */\n getRoot(): SceneObject;\n\n /** Returns a deep clone this object and all its children */\n clone(state?: Partial<TState>): this;\n\n /** A React component to use for rendering the object */\n Component(props: SceneComponentProps<SceneObject<TState>>): React.ReactElement | null;\n\n /** To be replaced by declarative method */\n Editor(props: SceneComponentProps<SceneObject<TState>>): React.ReactElement | null;\n\n /** Force a re-render, should only be needed when variable values change */\n forceRender(): void;\n}\n\nexport type SceneLayoutChild = SceneObject<SceneLayoutChildState | SceneLayoutState>;\n\nexport interface SceneLayoutState extends SceneLayoutChildState {\n children: SceneLayoutChild[];\n}\n\nexport type SceneLayout<T extends SceneLayoutState = SceneLayoutState> = SceneObject<T>;\n\nexport interface SceneEditorState extends SceneObjectStatePlain {\n hoverObject?: SceneObjectRef;\n selectedObject?: SceneObjectRef;\n}\n\nexport interface SceneEditor extends SceneObject<SceneEditorState> {\n onMouseEnterObject(model: SceneObject): void;\n onMouseLeaveObject(model: SceneObject): void;\n onSelectObject(model: SceneObject): void;\n getEditComponentWrapper(): React.ComponentType<SceneComponentEditWrapperProps>;\n}\n\ninterface SceneComponentEditWrapperProps {\n editor: SceneEditor;\n model: SceneObject;\n children: React.ReactNode;\n}\n\nexport interface SceneTimeRangeState extends SceneObjectStatePlain {\n from: string;\n to: string;\n timeZone: TimeZone;\n fiscalYearStartMonth?: number;\n value: TimeRange;\n}\n\nexport interface SceneTimeRangeLike extends SceneObject<SceneTimeRangeState> {\n onTimeRangeChange(timeRange: TimeRange): void;\n onRefresh(): void;\n}\n\nexport interface SceneObjectRef {\n ref: SceneObject;\n}\n\nexport function isSceneObject(obj: any): obj is SceneObject {\n return obj.useState !== undefined;\n}\n\nexport interface SceneObjectWithUrlSync<TState> extends SceneObject {\n getUrlState(state: TState): SceneObjectUrlValues;\n updateFromUrl(values: SceneObjectUrlValues): void;\n}\n\nexport interface SceneObjectUrlSyncHandler<TState> {\n getKeys(): string[];\n getUrlState(state: TState): SceneObjectUrlValues;\n updateFromUrl(values: SceneObjectUrlValues): void;\n}\n\nexport type SceneObjectUrlValue = string | string[] | undefined | null;\nexport type SceneObjectUrlValues = Record<string, SceneObjectUrlValue>;\n\nexport type DeepPartial<T> = {\n [K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K];\n};\n"],"names":[],"mappings":"AA6IO,SAAS,cAAc,GAA8B,EAAA;AAC1D,EAAA,OAAO,IAAI,QAAa,KAAA,KAAA,CAAA,CAAA;AAC1B;;;;"}
|
package/dist/esm/index.js
CHANGED
|
@@ -30,4 +30,5 @@ export { SceneControlsSpacer } from './components/SceneControlsSpacer.js';
|
|
|
30
30
|
export { SceneFlexLayout } from './components/layout/SceneFlexLayout.js';
|
|
31
31
|
export { SceneGridLayout } from './components/layout/SceneGridLayout.js';
|
|
32
32
|
export { SceneGridRow } from './components/layout/SceneGridRow.js';
|
|
33
|
+
export { SceneApp, SceneAppPage } from './components/SceneApp/SceneApp.js';
|
|
33
34
|
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|