@grafana/scenes 0.0.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/LICENSE +661 -0
- package/README.md +26 -0
- package/dist/esm/components/NestedScene.js +119 -0
- package/dist/esm/components/NestedScene.js.map +1 -0
- package/dist/esm/components/Scene.js +39 -0
- package/dist/esm/components/Scene.js.map +1 -0
- package/dist/esm/components/SceneCanvasText.js +41 -0
- package/dist/esm/components/SceneCanvasText.js.map +1 -0
- package/dist/esm/components/SceneDragHandle.js +18 -0
- package/dist/esm/components/SceneDragHandle.js.map +1 -0
- package/dist/esm/components/ScenePanelRepeater.js +66 -0
- package/dist/esm/components/ScenePanelRepeater.js.map +1 -0
- package/dist/esm/components/SceneSubMenu.js +18 -0
- package/dist/esm/components/SceneSubMenu.js.map +1 -0
- package/dist/esm/components/SceneTimePicker.js +40 -0
- package/dist/esm/components/SceneTimePicker.js.map +1 -0
- package/dist/esm/components/SceneToolbarButton.js +28 -0
- package/dist/esm/components/SceneToolbarButton.js.map +1 -0
- package/dist/esm/components/VizPanel/VizPanel.js +105 -0
- package/dist/esm/components/VizPanel/VizPanel.js.map +1 -0
- package/dist/esm/components/VizPanel/VizPanelRenderer.js +76 -0
- package/dist/esm/components/VizPanel/VizPanelRenderer.js.map +1 -0
- package/dist/esm/components/layout/SceneFlexLayout.js +88 -0
- package/dist/esm/components/layout/SceneFlexLayout.js.map +1 -0
- package/dist/esm/components/layout/SceneGridLayout.js +288 -0
- package/dist/esm/components/layout/SceneGridLayout.js.map +1 -0
- package/dist/esm/components/layout/SceneGridRow.js +124 -0
- package/dist/esm/components/layout/SceneGridRow.js.map +1 -0
- package/dist/esm/components/layout/constants.js +7 -0
- package/dist/esm/components/layout/constants.js.map +1 -0
- package/dist/esm/core/SceneComponentWrapper.js +84 -0
- package/dist/esm/core/SceneComponentWrapper.js.map +1 -0
- package/dist/esm/core/SceneDataNode.js +7 -0
- package/dist/esm/core/SceneDataNode.js.map +1 -0
- package/dist/esm/core/SceneDataTransformer.js +51 -0
- package/dist/esm/core/SceneDataTransformer.js.map +1 -0
- package/dist/esm/core/SceneObjectBase.js +141 -0
- package/dist/esm/core/SceneObjectBase.js.map +1 -0
- package/dist/esm/core/SceneTimeRange.js +108 -0
- package/dist/esm/core/SceneTimeRange.js.map +1 -0
- package/dist/esm/core/events.js +8 -0
- package/dist/esm/core/events.js.map +1 -0
- package/dist/esm/core/sceneGraph.js +68 -0
- package/dist/esm/core/sceneGraph.js.map +1 -0
- package/dist/esm/core/types.js +6 -0
- package/dist/esm/core/types.js.map +1 -0
- package/dist/esm/core/utils.js +57 -0
- package/dist/esm/core/utils.js.map +1 -0
- package/dist/esm/index.js +33 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/querying/SceneQueryRunner.js +161 -0
- package/dist/esm/querying/SceneQueryRunner.js.map +1 -0
- package/dist/esm/services/SceneObjectUrlSyncConfig.js +18 -0
- package/dist/esm/services/SceneObjectUrlSyncConfig.js.map +1 -0
- package/dist/esm/services/UrlSyncManager.js +133 -0
- package/dist/esm/services/UrlSyncManager.js.map +1 -0
- package/dist/esm/utils/metricTree.js +53 -0
- package/dist/esm/utils/metricTree.js.map +1 -0
- package/dist/esm/variables/VariableDependencyConfig.js +86 -0
- package/dist/esm/variables/VariableDependencyConfig.js.map +1 -0
- package/dist/esm/variables/components/VariableValueSelect.js +58 -0
- package/dist/esm/variables/components/VariableValueSelect.js.map +1 -0
- package/dist/esm/variables/components/VariableValueSelectors.js +56 -0
- package/dist/esm/variables/components/VariableValueSelectors.js.map +1 -0
- package/dist/esm/variables/constants.js +6 -0
- package/dist/esm/variables/constants.js.map +1 -0
- package/dist/esm/variables/interpolation/ScopedVarsVariable.js +49 -0
- package/dist/esm/variables/interpolation/ScopedVarsVariable.js.map +1 -0
- package/dist/esm/variables/interpolation/defaults.js +17 -0
- package/dist/esm/variables/interpolation/defaults.js.map +1 -0
- package/dist/esm/variables/interpolation/formatRegistry.js +280 -0
- package/dist/esm/variables/interpolation/formatRegistry.js.map +1 -0
- package/dist/esm/variables/interpolation/sceneInterpolator.js +83 -0
- package/dist/esm/variables/interpolation/sceneInterpolator.js.map +1 -0
- package/dist/esm/variables/sets/SceneVariableSet.js +123 -0
- package/dist/esm/variables/sets/SceneVariableSet.js.map +1 -0
- package/dist/esm/variables/types.js +8 -0
- package/dist/esm/variables/types.js.map +1 -0
- package/dist/esm/variables/variants/ConstantVariable.js +33 -0
- package/dist/esm/variables/variants/ConstantVariable.js.map +1 -0
- package/dist/esm/variables/variants/CustomVariable.js +58 -0
- package/dist/esm/variables/variants/CustomVariable.js.map +1 -0
- package/dist/esm/variables/variants/DataSourceVariable.js +92 -0
- package/dist/esm/variables/variants/DataSourceVariable.js.map +1 -0
- package/dist/esm/variables/variants/MultiValueVariable.js +183 -0
- package/dist/esm/variables/variants/MultiValueVariable.js.map +1 -0
- package/dist/esm/variables/variants/TestVariable.js +81 -0
- package/dist/esm/variables/variants/TestVariable.js.map +1 -0
- package/dist/esm/variables/variants/query/QueryVariable.js +137 -0
- package/dist/esm/variables/variants/query/QueryVariable.js.map +1 -0
- package/dist/esm/variables/variants/query/createQueryVariableRunner.js +93 -0
- package/dist/esm/variables/variants/query/createQueryVariableRunner.js.map +1 -0
- package/dist/esm/variables/variants/query/guards.js +18 -0
- package/dist/esm/variables/variants/query/guards.js.map +1 -0
- package/dist/esm/variables/variants/query/toMetricFindValues.js +93 -0
- package/dist/esm/variables/variants/query/toMetricFindValues.js.map +1 -0
- package/dist/esm/variables/variants/query/utils.js +93 -0
- package/dist/esm/variables/variants/query/utils.js.map +1 -0
- package/dist/index.d.ts +796 -0
- package/dist/index.js +3356 -0
- package/dist/index.js.map +1 -0
- package/package.json +103 -0
package/README.md
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
<img
|
|
3
|
+
src="./docs/img/grafana_icon.svg"
|
|
4
|
+
alt="Grafana Logo"
|
|
5
|
+
width="100px"
|
|
6
|
+
padding="40px"
|
|
7
|
+
/>
|
|
8
|
+
<h1>@grafana/scenes</h1>
|
|
9
|
+
<p>Create dashboard-like experiences in Grafana app plugins</p>
|
|
10
|
+
</div>
|
|
11
|
+
|
|
12
|
+
## Important notice
|
|
13
|
+
|
|
14
|
+
@grafana/scenes is in its early days. We do not encourage anyone to use it in plugins yet. APIs can (and probably will) change significantly in the months to come.
|
|
15
|
+
|
|
16
|
+
## Development
|
|
17
|
+
|
|
18
|
+
@grafana/scenes does not come with dedicated playground yet. It is currently possible to run Scene demos using Grafana. To do that, the following setup is required.
|
|
19
|
+
|
|
20
|
+
1. Clone @grafana/scenes repository.
|
|
21
|
+
1. Clone [Grafana](https://github.com/grafana/grafana/) repository and follow [Development guide](https://github.com/grafana/grafana/blob/main/contribute/developer-guide.md#developer-guide).
|
|
22
|
+
1. Setup env variable `GRAFANA_PATH` to point to your Grafana repository directory, `export GRAFANA_PATH=<path-to-grafana-directory>`
|
|
23
|
+
1. From @grafana/scenes directory run `./scripts/dev.sh`. This will compile @grafana/scenes with watch mode enabled and link it to your Grafana.
|
|
24
|
+
1. From Grafana directory run `yarn install`.
|
|
25
|
+
1. Start Grafana with `scenes` [feature toggle enabled](https://grafana.com/docs/grafana/latest/setup-grafana/configure-grafana/#feature_toggles)
|
|
26
|
+
1. Navigate to `http://localhost:3000/scenes` to explore demo scenes.
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { css } from '@emotion/css';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { Stack } from '@grafana/experimental';
|
|
4
|
+
import { useStyles2, ToolbarButton, Button } from '@grafana/ui';
|
|
5
|
+
import { SceneObjectBase } from '../core/SceneObjectBase.js';
|
|
6
|
+
|
|
7
|
+
var __defProp = Object.defineProperty;
|
|
8
|
+
var __defProps = Object.defineProperties;
|
|
9
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
10
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
11
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
12
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
13
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
14
|
+
var __spreadValues = (a, b) => {
|
|
15
|
+
for (var prop in b || (b = {}))
|
|
16
|
+
if (__hasOwnProp.call(b, prop))
|
|
17
|
+
__defNormalProp(a, prop, b[prop]);
|
|
18
|
+
if (__getOwnPropSymbols)
|
|
19
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
20
|
+
if (__propIsEnum.call(b, prop))
|
|
21
|
+
__defNormalProp(a, prop, b[prop]);
|
|
22
|
+
}
|
|
23
|
+
return a;
|
|
24
|
+
};
|
|
25
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
26
|
+
class NestedScene extends SceneObjectBase {
|
|
27
|
+
constructor() {
|
|
28
|
+
super(...arguments);
|
|
29
|
+
this.onToggle = () => {
|
|
30
|
+
this.setState({
|
|
31
|
+
isCollapsed: !this.state.isCollapsed,
|
|
32
|
+
placement: __spreadProps(__spreadValues({}, this.state.placement), {
|
|
33
|
+
ySizing: this.state.isCollapsed ? "fill" : "content"
|
|
34
|
+
})
|
|
35
|
+
});
|
|
36
|
+
};
|
|
37
|
+
this.onRemove = () => {
|
|
38
|
+
const parent = this.parent;
|
|
39
|
+
if ("children" in parent.state) {
|
|
40
|
+
parent.setState({
|
|
41
|
+
children: parent.state.children.filter((x) => x !== this)
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
NestedScene.Component = NestedSceneRenderer;
|
|
48
|
+
function NestedSceneRenderer({ model, isEditing }) {
|
|
49
|
+
const { title, isCollapsed, canCollapse, canRemove, body, actions } = model.useState();
|
|
50
|
+
const styles = useStyles2(getStyles);
|
|
51
|
+
const toolbarActions = (actions != null ? actions : []).map((action) => /* @__PURE__ */ React.createElement(action.Component, {
|
|
52
|
+
key: action.state.key,
|
|
53
|
+
model: action
|
|
54
|
+
}));
|
|
55
|
+
if (canRemove) {
|
|
56
|
+
toolbarActions.push(
|
|
57
|
+
/* @__PURE__ */ React.createElement(ToolbarButton, {
|
|
58
|
+
icon: "times",
|
|
59
|
+
variant: "default",
|
|
60
|
+
onClick: model.onRemove,
|
|
61
|
+
key: "remove-button",
|
|
62
|
+
"aria-label": "Remove scene"
|
|
63
|
+
})
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
return /* @__PURE__ */ React.createElement("div", {
|
|
67
|
+
className: styles.row
|
|
68
|
+
}, /* @__PURE__ */ React.createElement("div", {
|
|
69
|
+
className: styles.rowHeader
|
|
70
|
+
}, /* @__PURE__ */ React.createElement(Stack, {
|
|
71
|
+
gap: 0
|
|
72
|
+
}, /* @__PURE__ */ React.createElement("div", {
|
|
73
|
+
className: styles.title,
|
|
74
|
+
role: "heading",
|
|
75
|
+
"aria-level": 1
|
|
76
|
+
}, title), canCollapse && /* @__PURE__ */ React.createElement("div", {
|
|
77
|
+
className: styles.toggle
|
|
78
|
+
}, /* @__PURE__ */ React.createElement(Button, {
|
|
79
|
+
size: "sm",
|
|
80
|
+
icon: isCollapsed ? "angle-down" : "angle-up",
|
|
81
|
+
fill: "text",
|
|
82
|
+
variant: "secondary",
|
|
83
|
+
"aria-label": isCollapsed ? "Expand scene" : "Collapse scene",
|
|
84
|
+
onClick: model.onToggle
|
|
85
|
+
}))), /* @__PURE__ */ React.createElement("div", {
|
|
86
|
+
className: styles.actions
|
|
87
|
+
}, toolbarActions)), !isCollapsed && /* @__PURE__ */ React.createElement(body.Component, {
|
|
88
|
+
model: body,
|
|
89
|
+
isEditing
|
|
90
|
+
}));
|
|
91
|
+
}
|
|
92
|
+
const getStyles = (theme) => ({
|
|
93
|
+
row: css({
|
|
94
|
+
display: "flex",
|
|
95
|
+
flexDirection: "column",
|
|
96
|
+
flexGrow: 1,
|
|
97
|
+
gap: theme.spacing(1),
|
|
98
|
+
cursor: "pointer"
|
|
99
|
+
}),
|
|
100
|
+
toggle: css({}),
|
|
101
|
+
title: css({
|
|
102
|
+
fontSize: theme.typography.h5.fontSize
|
|
103
|
+
}),
|
|
104
|
+
rowHeader: css({
|
|
105
|
+
display: "flex",
|
|
106
|
+
alignItems: "center",
|
|
107
|
+
gap: theme.spacing(2)
|
|
108
|
+
}),
|
|
109
|
+
actions: css({
|
|
110
|
+
display: "flex",
|
|
111
|
+
alignItems: "center",
|
|
112
|
+
gap: theme.spacing(1),
|
|
113
|
+
justifyContent: "flex-end",
|
|
114
|
+
flexGrow: 1
|
|
115
|
+
})
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
export { NestedScene, NestedSceneRenderer };
|
|
119
|
+
//# sourceMappingURL=NestedScene.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NestedScene.js","sources":["../../../src/components/NestedScene.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Stack } from '@grafana/experimental';\nimport { Button, ToolbarButton, useStyles2 } from '@grafana/ui';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { SceneObject, SceneLayoutChildState, SceneComponentProps, SceneLayout } from '../core/types';\n\ninterface NestedSceneState extends SceneLayoutChildState {\n title: string;\n isCollapsed?: boolean;\n canCollapse?: boolean;\n canRemove?: boolean;\n body: SceneLayout;\n actions?: SceneObject[];\n}\n\nexport class NestedScene extends SceneObjectBase<NestedSceneState> {\n public static Component = NestedSceneRenderer;\n\n public onToggle = () => {\n this.setState({\n isCollapsed: !this.state.isCollapsed,\n placement: {\n ...this.state.placement,\n ySizing: this.state.isCollapsed ? 'fill' : 'content',\n },\n });\n };\n\n /** Removes itself from its parent's children array */\n public onRemove = () => {\n const parent = this.parent!;\n if ('children' in parent.state) {\n parent.setState({\n children: parent.state.children.filter((x) => x !== this),\n });\n }\n };\n}\n\nexport function NestedSceneRenderer({ model, isEditing }: SceneComponentProps<NestedScene>) {\n const { title, isCollapsed, canCollapse, canRemove, body, actions } = model.useState();\n const styles = useStyles2(getStyles);\n\n const toolbarActions = (actions ?? []).map((action) => <action.Component key={action.state.key} model={action} />);\n\n if (canRemove) {\n toolbarActions.push(\n <ToolbarButton\n icon=\"times\"\n variant={'default'}\n onClick={model.onRemove}\n key=\"remove-button\"\n aria-label=\"Remove scene\"\n />\n );\n }\n\n return (\n <div className={styles.row}>\n <div className={styles.rowHeader}>\n <Stack gap={0}>\n <div className={styles.title} role=\"heading\" aria-level={1}>\n {title}\n </div>\n {canCollapse && (\n <div className={styles.toggle}>\n <Button\n size=\"sm\"\n icon={isCollapsed ? 'angle-down' : 'angle-up'}\n fill=\"text\"\n variant=\"secondary\"\n aria-label={isCollapsed ? 'Expand scene' : 'Collapse scene'}\n onClick={model.onToggle}\n />\n </div>\n )}\n </Stack>\n <div className={styles.actions}>{toolbarActions}</div>\n </div>\n {!isCollapsed && <body.Component model={body} isEditing={isEditing} />}\n </div>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n row: css({\n display: 'flex',\n flexDirection: 'column',\n flexGrow: 1,\n gap: theme.spacing(1),\n cursor: 'pointer',\n }),\n toggle: css({}),\n title: css({\n fontSize: theme.typography.h5.fontSize,\n }),\n rowHeader: css({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(2),\n }),\n actions: css({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n justifyContent: 'flex-end',\n flexGrow: 1,\n }),\n});\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { SceneObjectBase } from '../core/SceneObjectBase.js';
|
|
3
|
+
import { UrlSyncManager } from '../services/UrlSyncManager.js';
|
|
4
|
+
|
|
5
|
+
class EmbeddedScene extends SceneObjectBase {
|
|
6
|
+
activate() {
|
|
7
|
+
super.activate();
|
|
8
|
+
this.urlSyncManager = new UrlSyncManager(this);
|
|
9
|
+
this.urlSyncManager.initSync();
|
|
10
|
+
}
|
|
11
|
+
deactivate() {
|
|
12
|
+
super.deactivate();
|
|
13
|
+
this.urlSyncManager.cleanUp();
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
EmbeddedScene.Component = EmbeddedSceneRenderer;
|
|
17
|
+
function EmbeddedSceneRenderer({ model }) {
|
|
18
|
+
const { body, isEditing, subMenu } = model.useState();
|
|
19
|
+
return /* @__PURE__ */ React.createElement("div", {
|
|
20
|
+
style: {
|
|
21
|
+
flexGrow: 1,
|
|
22
|
+
display: "flex",
|
|
23
|
+
gap: "8px",
|
|
24
|
+
overflow: "auto",
|
|
25
|
+
minHeight: "100%",
|
|
26
|
+
flexDirection: "column"
|
|
27
|
+
}
|
|
28
|
+
}, subMenu && /* @__PURE__ */ React.createElement(subMenu.Component, {
|
|
29
|
+
model: subMenu
|
|
30
|
+
}), /* @__PURE__ */ React.createElement("div", {
|
|
31
|
+
style: { flexGrow: 1, display: "flex", gap: "8px", overflow: "auto" }
|
|
32
|
+
}, /* @__PURE__ */ React.createElement(body.Component, {
|
|
33
|
+
model: body,
|
|
34
|
+
isEditing
|
|
35
|
+
})));
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export { EmbeddedScene };
|
|
39
|
+
//# sourceMappingURL=Scene.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Scene.js","sources":["../../../src/components/Scene.tsx"],"sourcesContent":["import React from 'react';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { SceneComponentProps, SceneObjectStatePlain, SceneObject } from '../core/types';\nimport { UrlSyncManager } from '../services/UrlSyncManager';\n\nexport interface SceneState extends SceneObjectStatePlain {\n title: string;\n body: SceneObject;\n actions?: SceneObject[];\n subMenu?: SceneObject;\n isEditing?: boolean;\n}\n\nexport class EmbeddedScene extends SceneObjectBase<SceneState> {\n public static Component = EmbeddedSceneRenderer;\n\n private urlSyncManager?: UrlSyncManager;\n\n public activate() {\n super.activate();\n this.urlSyncManager = new UrlSyncManager(this);\n this.urlSyncManager.initSync();\n }\n\n public deactivate() {\n super.deactivate();\n this.urlSyncManager!.cleanUp();\n }\n}\n\nfunction EmbeddedSceneRenderer({ model }: SceneComponentProps<EmbeddedScene>) {\n const { body, isEditing, subMenu } = model.useState();\n return (\n <div\n style={{\n flexGrow: 1,\n display: 'flex',\n gap: '8px',\n overflow: 'auto',\n minHeight: '100%',\n flexDirection: 'column',\n }}\n >\n {subMenu && <subMenu.Component model={subMenu} />}\n <div style={{ flexGrow: 1, display: 'flex', gap: '8px', overflow: 'auto' }}>\n <body.Component model={body} isEditing={isEditing} />\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":";;;;AAcO,MAAM,sBAAsB,eAA4B,CAAA;AAAA,EAKtD,QAAW,GAAA;AAChB,IAAA,KAAA,CAAM,QAAS,EAAA,CAAA;AACf,IAAK,IAAA,CAAA,cAAA,GAAiB,IAAI,cAAA,CAAe,IAAI,CAAA,CAAA;AAC7C,IAAA,IAAA,CAAK,eAAe,QAAS,EAAA,CAAA;AAAA,GAC/B;AAAA,EAEO,UAAa,GAAA;AAClB,IAAA,KAAA,CAAM,UAAW,EAAA,CAAA;AACjB,IAAA,IAAA,CAAK,eAAgB,OAAQ,EAAA,CAAA;AAAA,GAC/B;AACF,CAAA;AAfa,aAAA,CACG,SAAY,GAAA,qBAAA,CAAA;AAgB5B,SAAS,qBAAA,CAAsB,EAAE,KAAA,EAA6C,EAAA;AAC5E,EAAA,MAAM,EAAE,IAAM,EAAA,SAAA,EAAW,OAAQ,EAAA,GAAI,MAAM,QAAS,EAAA,CAAA;AACpD,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA;AAAA,IACC,KAAO,EAAA;AAAA,MACL,QAAU,EAAA,CAAA;AAAA,MACV,OAAS,EAAA,MAAA;AAAA,MACT,GAAK,EAAA,KAAA;AAAA,MACL,QAAU,EAAA,MAAA;AAAA,MACV,SAAW,EAAA,MAAA;AAAA,MACX,aAAe,EAAA,QAAA;AAAA,KACjB;AAAA,GAEC,EAAA,OAAA,oBAAY,KAAA,CAAA,aAAA,CAAA,OAAA,CAAQ,SAAR,EAAA;AAAA,IAAkB,KAAO,EAAA,OAAA;AAAA,GAAS,mBAC9C,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA;AAAA,IAAI,KAAA,EAAO,EAAE,QAAU,EAAA,CAAA,EAAG,SAAS,MAAQ,EAAA,GAAA,EAAK,KAAO,EAAA,QAAA,EAAU,MAAO,EAAA;AAAA,GACvE,kBAAA,KAAA,CAAA,aAAA,CAAC,KAAK,SAAL,EAAA;AAAA,IAAe,KAAO,EAAA,IAAA;AAAA,IAAM,SAAA;AAAA,GAAsB,CACrD,CACF,CAAA,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Field, Input } from '@grafana/ui';
|
|
3
|
+
import { SceneObjectBase } from '../core/SceneObjectBase.js';
|
|
4
|
+
import { sceneGraph } from '../core/sceneGraph.js';
|
|
5
|
+
import { VariableDependencyConfig } from '../variables/VariableDependencyConfig.js';
|
|
6
|
+
|
|
7
|
+
class SceneCanvasText extends SceneObjectBase {
|
|
8
|
+
constructor() {
|
|
9
|
+
super(...arguments);
|
|
10
|
+
this._variableDependency = new VariableDependencyConfig(this, { statePaths: ["text"] });
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
SceneCanvasText.Editor = Editor;
|
|
14
|
+
SceneCanvasText.Component = ({ model }) => {
|
|
15
|
+
const { text, fontSize = 20, align = "left", key } = model.useState();
|
|
16
|
+
const style = {
|
|
17
|
+
fontSize,
|
|
18
|
+
display: "flex",
|
|
19
|
+
flexGrow: 1,
|
|
20
|
+
alignItems: "center",
|
|
21
|
+
padding: 16,
|
|
22
|
+
justifyContent: align
|
|
23
|
+
};
|
|
24
|
+
return /* @__PURE__ */ React.createElement("div", {
|
|
25
|
+
style,
|
|
26
|
+
"data-testid": key
|
|
27
|
+
}, sceneGraph.interpolate(model, text));
|
|
28
|
+
};
|
|
29
|
+
function Editor({ model }) {
|
|
30
|
+
const { fontSize } = model.useState();
|
|
31
|
+
return /* @__PURE__ */ React.createElement(Field, {
|
|
32
|
+
label: "Font size"
|
|
33
|
+
}, /* @__PURE__ */ React.createElement(Input, {
|
|
34
|
+
type: "number",
|
|
35
|
+
defaultValue: fontSize,
|
|
36
|
+
onBlur: (evt) => model.setState({ fontSize: parseInt(evt.currentTarget.value, 10) })
|
|
37
|
+
}));
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export { SceneCanvasText };
|
|
41
|
+
//# sourceMappingURL=SceneCanvasText.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SceneCanvasText.js","sources":["../../../src/components/SceneCanvasText.tsx"],"sourcesContent":["import React, { CSSProperties } from 'react';\n\nimport { Field, Input } from '@grafana/ui';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneComponentProps, SceneLayoutChildState } from '../core/types';\nimport { VariableDependencyConfig } from '../variables/VariableDependencyConfig';\n\nexport interface SceneCanvasTextState extends SceneLayoutChildState {\n text: string;\n fontSize?: number;\n align?: 'left' | 'center' | 'right';\n}\n\nexport class SceneCanvasText extends SceneObjectBase<SceneCanvasTextState> {\n public static Editor = Editor;\n\n protected _variableDependency = new VariableDependencyConfig(this, { statePaths: ['text'] });\n\n public static Component = ({ model }: SceneComponentProps<SceneCanvasText>) => {\n const { text, fontSize = 20, align = 'left', key } = model.useState();\n\n const style: CSSProperties = {\n fontSize: fontSize,\n display: 'flex',\n flexGrow: 1,\n alignItems: 'center',\n padding: 16,\n justifyContent: align,\n };\n\n return (\n <div style={style} data-testid={key}>\n {sceneGraph.interpolate(model, text)}\n </div>\n );\n };\n}\n\nfunction Editor({ model }: SceneComponentProps<SceneCanvasText>) {\n const { fontSize } = model.useState();\n\n return (\n <Field label=\"Font size\">\n <Input\n type=\"number\"\n defaultValue={fontSize}\n onBlur={(evt) => model.setState({ fontSize: parseInt(evt.currentTarget.value, 10) })}\n />\n </Field>\n );\n}\n"],"names":[],"mappings":";;;;;;AAeO,MAAM,wBAAwB,eAAsC,CAAA;AAAA,EAApE,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA,CAAA;AAGL,IAAU,IAAA,CAAA,mBAAA,GAAsB,IAAI,wBAAyB,CAAA,IAAA,EAAM,EAAE,UAAY,EAAA,CAAC,MAAM,CAAA,EAAG,CAAA,CAAA;AAAA,GAAA;AAoB7F,CAAA;AAvBa,eAAA,CACG,MAAS,GAAA,MAAA,CAAA;AADZ,eAAA,CAKG,SAAY,GAAA,CAAC,EAAE,KAAA,EAAkD,KAAA;AAC7E,EAAM,MAAA,EAAE,MAAM,QAAW,GAAA,EAAA,EAAI,QAAQ,MAAQ,EAAA,GAAA,EAAQ,GAAA,KAAA,CAAM,QAAS,EAAA,CAAA;AAEpE,EAAA,MAAM,KAAuB,GAAA;AAAA,IAC3B,QAAA;AAAA,IACA,OAAS,EAAA,MAAA;AAAA,IACT,QAAU,EAAA,CAAA;AAAA,IACV,UAAY,EAAA,QAAA;AAAA,IACZ,OAAS,EAAA,EAAA;AAAA,IACT,cAAgB,EAAA,KAAA;AAAA,GAClB,CAAA;AAEA,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA;AAAA,IAAI,KAAA;AAAA,IAAc,aAAa,EAAA,GAAA;AAAA,GAAA,EAC7B,UAAW,CAAA,WAAA,CAAY,KAAO,EAAA,IAAI,CACrC,CAAA,CAAA;AAEJ,CAAA,CAAA;AAGF,SAAS,MAAA,CAAO,EAAE,KAAA,EAA+C,EAAA;AAC/D,EAAA,MAAM,EAAE,QAAA,EAAa,GAAA,KAAA,CAAM,QAAS,EAAA,CAAA;AAEpC,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA;AAAA,IAAM,KAAM,EAAA,WAAA;AAAA,GAAA,kBACV,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA;AAAA,IACC,IAAK,EAAA,QAAA;AAAA,IACL,YAAc,EAAA,QAAA;AAAA,IACd,MAAQ,EAAA,CAAC,GAAQ,KAAA,KAAA,CAAM,QAAS,CAAA,EAAE,QAAU,EAAA,QAAA,CAAS,GAAI,CAAA,aAAA,CAAc,KAAO,EAAA,EAAE,GAAG,CAAA;AAAA,GACrF,CACF,CAAA,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Icon } from '@grafana/ui';
|
|
3
|
+
|
|
4
|
+
function SceneDragHandle({ layoutKey, className }) {
|
|
5
|
+
return /* @__PURE__ */ React.createElement("div", {
|
|
6
|
+
className: `${className} grid-drag-handle-${layoutKey}`,
|
|
7
|
+
style: {
|
|
8
|
+
width: "20px",
|
|
9
|
+
height: "20px",
|
|
10
|
+
cursor: "move"
|
|
11
|
+
}
|
|
12
|
+
}, /* @__PURE__ */ React.createElement(Icon, {
|
|
13
|
+
name: "draggabledots"
|
|
14
|
+
}));
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export { SceneDragHandle };
|
|
18
|
+
//# sourceMappingURL=SceneDragHandle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SceneDragHandle.js","sources":["../../../src/components/SceneDragHandle.tsx"],"sourcesContent":["import React from 'react';\n\nimport { Icon } from '@grafana/ui';\n\nexport function SceneDragHandle({ layoutKey, className }: { layoutKey: string; className?: string }) {\n return (\n <div\n className={`${className} grid-drag-handle-${layoutKey}`}\n style={{\n width: '20px',\n height: '20px',\n cursor: 'move',\n }}\n >\n <Icon name=\"draggabledots\" />\n </div>\n );\n}\n"],"names":[],"mappings":";;;AAIO,SAAS,eAAgB,CAAA,EAAE,SAAW,EAAA,SAAA,EAAwD,EAAA;AACnG,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA;AAAA,IACC,SAAA,EAAW,GAAG,SAA8B,CAAA,kBAAA,EAAA,SAAA,CAAA,CAAA;AAAA,IAC5C,KAAO,EAAA;AAAA,MACL,KAAO,EAAA,MAAA;AAAA,MACP,MAAQ,EAAA,MAAA;AAAA,MACR,MAAQ,EAAA,MAAA;AAAA,KACV;AAAA,GAAA,kBAEC,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA;AAAA,IAAK,IAAK,EAAA,eAAA;AAAA,GAAgB,CAC7B,CAAA,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { LoadingState } from '@grafana/data';
|
|
3
|
+
import { SceneDataNode } from '../core/SceneDataNode.js';
|
|
4
|
+
import { SceneObjectBase } from '../core/SceneObjectBase.js';
|
|
5
|
+
import { sceneGraph } from '../core/sceneGraph.js';
|
|
6
|
+
|
|
7
|
+
var __defProp = Object.defineProperty;
|
|
8
|
+
var __defProps = Object.defineProperties;
|
|
9
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
10
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
11
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
12
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
13
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
14
|
+
var __spreadValues = (a, b) => {
|
|
15
|
+
for (var prop in b || (b = {}))
|
|
16
|
+
if (__hasOwnProp.call(b, prop))
|
|
17
|
+
__defNormalProp(a, prop, b[prop]);
|
|
18
|
+
if (__getOwnPropSymbols)
|
|
19
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
20
|
+
if (__propIsEnum.call(b, prop))
|
|
21
|
+
__defNormalProp(a, prop, b[prop]);
|
|
22
|
+
}
|
|
23
|
+
return a;
|
|
24
|
+
};
|
|
25
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
26
|
+
class ScenePanelRepeater extends SceneObjectBase {
|
|
27
|
+
activate() {
|
|
28
|
+
super.activate();
|
|
29
|
+
this._subs.add(
|
|
30
|
+
sceneGraph.getData(this).subscribeToState({
|
|
31
|
+
next: (data) => {
|
|
32
|
+
var _a;
|
|
33
|
+
if (((_a = data.data) == null ? void 0 : _a.state) === LoadingState.Done) {
|
|
34
|
+
this.performRepeat(data.data);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
})
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
performRepeat(data) {
|
|
41
|
+
const firstChild = this.state.layout.state.children[0];
|
|
42
|
+
const newChildren = [];
|
|
43
|
+
for (const series of data.series) {
|
|
44
|
+
const clone = firstChild.clone({
|
|
45
|
+
key: `${newChildren.length}`,
|
|
46
|
+
$data: new SceneDataNode({
|
|
47
|
+
data: __spreadProps(__spreadValues({}, data), {
|
|
48
|
+
series: [series]
|
|
49
|
+
})
|
|
50
|
+
})
|
|
51
|
+
});
|
|
52
|
+
newChildren.push(clone);
|
|
53
|
+
}
|
|
54
|
+
this.state.layout.setState({ children: newChildren });
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
ScenePanelRepeater.Component = ({ model, isEditing }) => {
|
|
58
|
+
const { layout } = model.useState();
|
|
59
|
+
return /* @__PURE__ */ React.createElement(layout.Component, {
|
|
60
|
+
model: layout,
|
|
61
|
+
isEditing
|
|
62
|
+
});
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
export { ScenePanelRepeater };
|
|
66
|
+
//# sourceMappingURL=ScenePanelRepeater.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScenePanelRepeater.js","sources":["../../../src/components/ScenePanelRepeater.tsx"],"sourcesContent":["import React from 'react';\n\nimport { LoadingState, PanelData } from '@grafana/data';\n\nimport { SceneDataNode } from '../core/SceneDataNode';\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { sceneGraph } from '../core/sceneGraph';\nimport {\n SceneComponentProps,\n SceneObject,\n SceneObjectStatePlain,\n SceneLayoutState,\n SceneLayoutChild,\n} from '../core/types';\n\ninterface RepeatOptions extends SceneObjectStatePlain {\n layout: SceneObject<SceneLayoutState>;\n}\n\nexport class ScenePanelRepeater extends SceneObjectBase<RepeatOptions> {\n public activate(): void {\n super.activate();\n\n this._subs.add(\n sceneGraph.getData(this).subscribeToState({\n next: (data) => {\n if (data.data?.state === LoadingState.Done) {\n this.performRepeat(data.data);\n }\n },\n })\n );\n }\n\n private performRepeat(data: PanelData) {\n // assume parent is a layout\n const firstChild = this.state.layout.state.children[0]!;\n const newChildren: SceneLayoutChild[] = [];\n\n for (const series of data.series) {\n const clone = firstChild.clone({\n key: `${newChildren.length}`,\n $data: new SceneDataNode({\n data: {\n ...data,\n series: [series],\n },\n }),\n });\n\n newChildren.push(clone);\n }\n\n this.state.layout.setState({ children: newChildren });\n }\n\n public static Component = ({ model, isEditing }: SceneComponentProps<ScenePanelRepeater>) => {\n const { layout } = model.useState();\n return <layout.Component model={layout} isEditing={isEditing} />;\n };\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAmBO,MAAM,2BAA2B,eAA+B,CAAA;AAAA,EAC9D,QAAiB,GAAA;AACtB,IAAA,KAAA,CAAM,QAAS,EAAA,CAAA;AAEf,IAAA,IAAA,CAAK,KAAM,CAAA,GAAA;AAAA,MACT,UAAW,CAAA,OAAA,CAAQ,IAAI,CAAA,CAAE,gBAAiB,CAAA;AAAA,QACxC,IAAA,EAAM,CAAC,IAAS,KAAA;AAzBxB,UAAA,IAAA,EAAA,CAAA;AA0BU,UAAA,IAAA,CAAA,CAAI,EAAK,GAAA,IAAA,CAAA,IAAA,KAAL,IAAW,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,KAAA,MAAU,aAAa,IAAM,EAAA;AAC1C,YAAK,IAAA,CAAA,aAAA,CAAc,KAAK,IAAI,CAAA,CAAA;AAAA,WAC9B;AAAA,SACF;AAAA,OACD,CAAA;AAAA,KACH,CAAA;AAAA,GACF;AAAA,EAEQ,cAAc,IAAiB,EAAA;AAErC,IAAA,MAAM,UAAa,GAAA,IAAA,CAAK,KAAM,CAAA,MAAA,CAAO,MAAM,QAAS,CAAA,CAAA,CAAA,CAAA;AACpD,IAAA,MAAM,cAAkC,EAAC,CAAA;AAEzC,IAAW,KAAA,MAAA,MAAA,IAAU,KAAK,MAAQ,EAAA;AAChC,MAAM,MAAA,KAAA,GAAQ,WAAW,KAAM,CAAA;AAAA,QAC7B,GAAA,EAAK,GAAG,WAAY,CAAA,MAAA,CAAA,CAAA;AAAA,QACpB,KAAA,EAAO,IAAI,aAAc,CAAA;AAAA,UACvB,IAAA,EAAM,iCACD,IADC,CAAA,EAAA;AAAA,YAEJ,MAAA,EAAQ,CAAC,MAAM,CAAA;AAAA,WACjB,CAAA;AAAA,SACD,CAAA;AAAA,OACF,CAAA,CAAA;AAED,MAAA,WAAA,CAAY,KAAK,KAAK,CAAA,CAAA;AAAA,KACxB;AAEA,IAAA,IAAA,CAAK,MAAM,MAAO,CAAA,QAAA,CAAS,EAAE,QAAA,EAAU,aAAa,CAAA,CAAA;AAAA,GACtD;AAMF,CAAA;AAzCa,kBAAA,CAqCG,SAAY,GAAA,CAAC,EAAE,KAAA,EAAO,WAAyD,KAAA;AAC3F,EAAA,MAAM,EAAE,MAAA,EAAW,GAAA,KAAA,CAAM,QAAS,EAAA,CAAA;AAClC,EAAO,uBAAA,KAAA,CAAA,aAAA,CAAC,OAAO,SAAP,EAAA;AAAA,IAAiB,KAAO,EAAA,MAAA;AAAA,IAAQ,SAAA;AAAA,GAAsB,CAAA,CAAA;AAChE,CAAA;;;;"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { SceneObjectBase } from '../core/SceneObjectBase.js';
|
|
3
|
+
|
|
4
|
+
class SceneSubMenu extends SceneObjectBase {
|
|
5
|
+
}
|
|
6
|
+
SceneSubMenu.Component = SceneSubMenuRenderer;
|
|
7
|
+
function SceneSubMenuRenderer({ model }) {
|
|
8
|
+
const { children } = model.useState();
|
|
9
|
+
return /* @__PURE__ */ React.createElement("div", {
|
|
10
|
+
style: { display: "flex", gap: "16px" }
|
|
11
|
+
}, children.map((child) => /* @__PURE__ */ React.createElement(child.Component, {
|
|
12
|
+
key: child.state.key,
|
|
13
|
+
model: child
|
|
14
|
+
})));
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export { SceneSubMenu };
|
|
18
|
+
//# sourceMappingURL=SceneSubMenu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SceneSubMenu.js","sources":["../../../src/components/SceneSubMenu.tsx"],"sourcesContent":["import React from 'react';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { SceneLayoutState, SceneComponentProps } from '../core/types';\n\ninterface SceneSubMenuState extends SceneLayoutState {}\n\nexport class SceneSubMenu extends SceneObjectBase<SceneSubMenuState> {\n public static Component = SceneSubMenuRenderer;\n}\n\nfunction SceneSubMenuRenderer({ model }: SceneComponentProps<SceneSubMenu>) {\n const { children } = model.useState();\n\n return (\n <div style={{ display: 'flex', gap: '16px' }}>\n {children.map((child) => (\n <child.Component key={child.state.key} model={child} />\n ))}\n </div>\n );\n}\n"],"names":[],"mappings":";;;AAOO,MAAM,qBAAqB,eAAmC,CAAA;AAErE,CAAA;AAFa,YAAA,CACG,SAAY,GAAA,oBAAA,CAAA;AAG5B,SAAS,oBAAA,CAAqB,EAAE,KAAA,EAA4C,EAAA;AAC1E,EAAA,MAAM,EAAE,QAAA,EAAa,GAAA,KAAA,CAAM,QAAS,EAAA,CAAA;AAEpC,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA;AAAA,IAAI,KAAO,EAAA,EAAE,OAAS,EAAA,MAAA,EAAQ,KAAK,MAAO,EAAA;AAAA,GAAA,EACxC,SAAS,GAAI,CAAA,CAAC,KACb,qBAAA,KAAA,CAAA,aAAA,CAAC,MAAM,SAAN,EAAA;AAAA,IAAgB,GAAA,EAAK,MAAM,KAAM,CAAA,GAAA;AAAA,IAAK,KAAO,EAAA,KAAA;AAAA,GAAO,CACtD,CACH,CAAA,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ToolbarButtonRow, TimeRangePicker, RefreshPicker } from '@grafana/ui';
|
|
3
|
+
import { SceneObjectBase } from '../core/SceneObjectBase.js';
|
|
4
|
+
import { sceneGraph } from '../core/sceneGraph.js';
|
|
5
|
+
|
|
6
|
+
class SceneTimePicker extends SceneObjectBase {
|
|
7
|
+
}
|
|
8
|
+
SceneTimePicker.Component = SceneTimePickerRenderer;
|
|
9
|
+
function SceneTimePickerRenderer({ model }) {
|
|
10
|
+
const { hidePicker } = model.useState();
|
|
11
|
+
const timeRange = sceneGraph.getTimeRange(model);
|
|
12
|
+
const timeRangeState = timeRange.useState();
|
|
13
|
+
if (hidePicker) {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
return /* @__PURE__ */ React.createElement(ToolbarButtonRow, {
|
|
17
|
+
alignment: "right"
|
|
18
|
+
}, /* @__PURE__ */ React.createElement(TimeRangePicker, {
|
|
19
|
+
value: timeRangeState.value,
|
|
20
|
+
onChange: timeRange.onTimeRangeChange,
|
|
21
|
+
timeZone: "browser",
|
|
22
|
+
fiscalYearStartMonth: 0,
|
|
23
|
+
onMoveBackward: () => {
|
|
24
|
+
},
|
|
25
|
+
onMoveForward: () => {
|
|
26
|
+
},
|
|
27
|
+
onZoom: () => {
|
|
28
|
+
},
|
|
29
|
+
onChangeTimeZone: () => {
|
|
30
|
+
},
|
|
31
|
+
onChangeFiscalYearStartMonth: () => {
|
|
32
|
+
}
|
|
33
|
+
}), /* @__PURE__ */ React.createElement(RefreshPicker, {
|
|
34
|
+
onRefresh: timeRange.onRefresh,
|
|
35
|
+
onIntervalChanged: timeRange.onIntervalChanged
|
|
36
|
+
}));
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export { SceneTimePicker };
|
|
40
|
+
//# sourceMappingURL=SceneTimePicker.js.map
|
|
@@ -0,0 +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}\n\nexport class SceneTimePicker extends SceneObjectBase<SceneTimePickerState> {\n public static Component = SceneTimePickerRenderer;\n}\n\nfunction SceneTimePickerRenderer({ model }: SceneComponentProps<SceneTimePicker>) {\n const { hidePicker } = 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 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\n <RefreshPicker onRefresh={timeRange.onRefresh} onIntervalChanged={timeRange.onIntervalChanged} />\n </ToolbarButtonRow>\n );\n}\n"],"names":[],"mappings":";;;;;AAYO,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,EAAe,GAAA,KAAA,CAAM,QAAS,EAAA,CAAA;AACtC,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,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,mBAEC,KAAA,CAAA,aAAA,CAAA,aAAA,EAAA;AAAA,IAAc,WAAW,SAAU,CAAA,SAAA;AAAA,IAAW,mBAAmB,SAAU,CAAA,iBAAA;AAAA,GAAmB,CACjG,CAAA,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ToolbarButton, Input } from '@grafana/ui';
|
|
3
|
+
import { SceneObjectBase } from '../core/SceneObjectBase.js';
|
|
4
|
+
|
|
5
|
+
class SceneToolbarButton extends SceneObjectBase {
|
|
6
|
+
}
|
|
7
|
+
SceneToolbarButton.Component = ({ model }) => {
|
|
8
|
+
const state = model.useState();
|
|
9
|
+
return /* @__PURE__ */ React.createElement(ToolbarButton, {
|
|
10
|
+
onClick: state.onClick,
|
|
11
|
+
icon: state.icon
|
|
12
|
+
});
|
|
13
|
+
};
|
|
14
|
+
class SceneToolbarInput extends SceneObjectBase {
|
|
15
|
+
}
|
|
16
|
+
SceneToolbarInput.Component = ({ model }) => {
|
|
17
|
+
const state = model.useState();
|
|
18
|
+
return /* @__PURE__ */ React.createElement(Input, {
|
|
19
|
+
defaultValue: state.value,
|
|
20
|
+
width: 8,
|
|
21
|
+
onBlur: (evt) => {
|
|
22
|
+
model.state.onChange(parseInt(evt.currentTarget.value, 10));
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export { SceneToolbarButton, SceneToolbarInput };
|
|
28
|
+
//# sourceMappingURL=SceneToolbarButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SceneToolbarButton.js","sources":["../../../src/components/SceneToolbarButton.tsx"],"sourcesContent":["import React from 'react';\n\nimport { IconName, Input, ToolbarButton } from '@grafana/ui';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { SceneComponentProps, SceneObjectStatePlain } from '../core/types';\n\nexport interface ToolbarButtonState extends SceneObjectStatePlain {\n icon: IconName;\n onClick: () => void;\n}\n\nexport class SceneToolbarButton extends SceneObjectBase<ToolbarButtonState> {\n public static Component = ({ model }: SceneComponentProps<SceneToolbarButton>) => {\n const state = model.useState();\n\n return <ToolbarButton onClick={state.onClick} icon={state.icon} />;\n };\n}\n\nexport interface SceneToolbarInputState extends SceneObjectStatePlain {\n value?: string;\n onChange: (value: number) => void;\n}\n\nexport class SceneToolbarInput extends SceneObjectBase<SceneToolbarInputState> {\n public static Component = ({ model }: SceneComponentProps<SceneToolbarInput>) => {\n const state = model.useState();\n\n return (\n <Input\n defaultValue={state.value}\n width={8}\n onBlur={(evt) => {\n model.state.onChange(parseInt(evt.currentTarget.value, 10));\n }}\n />\n );\n };\n}\n"],"names":[],"mappings":";;;;AAYO,MAAM,2BAA2B,eAAoC,CAAA;AAM5E,CAAA;AANa,kBAAA,CACG,SAAY,GAAA,CAAC,EAAE,KAAA,EAAqD,KAAA;AAChF,EAAM,MAAA,KAAA,GAAQ,MAAM,QAAS,EAAA,CAAA;AAE7B,EAAA,uBAAQ,KAAA,CAAA,aAAA,CAAA,aAAA,EAAA;AAAA,IAAc,SAAS,KAAM,CAAA,OAAA;AAAA,IAAS,MAAM,KAAM,CAAA,IAAA;AAAA,GAAM,CAAA,CAAA;AAClE,CAAA,CAAA;AAQK,MAAM,0BAA0B,eAAwC,CAAA;AAc/E,CAAA;AAda,iBAAA,CACG,SAAY,GAAA,CAAC,EAAE,KAAA,EAAoD,KAAA;AAC/E,EAAM,MAAA,KAAA,GAAQ,MAAM,QAAS,EAAA,CAAA;AAE7B,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA;AAAA,IACC,cAAc,KAAM,CAAA,KAAA;AAAA,IACpB,KAAO,EAAA,CAAA;AAAA,IACP,MAAA,EAAQ,CAAC,GAAQ,KAAA;AACf,MAAA,KAAA,CAAM,MAAM,QAAS,CAAA,QAAA,CAAS,IAAI,aAAc,CAAA,KAAA,EAAO,EAAE,CAAC,CAAA,CAAA;AAAA,KAC5D;AAAA,GACF,CAAA,CAAA;AAEJ,CAAA;;;;"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { toUtc, getPanelOptionsWithDefaults } from '@grafana/data';
|
|
3
|
+
import { getPluginImportUtils, config } from '@grafana/runtime';
|
|
4
|
+
import { Field, Input } from '@grafana/ui';
|
|
5
|
+
import { SceneObjectBase } from '../../core/SceneObjectBase.js';
|
|
6
|
+
import { sceneGraph } from '../../core/sceneGraph.js';
|
|
7
|
+
import { VizPanelRenderer } from './VizPanelRenderer.js';
|
|
8
|
+
|
|
9
|
+
var __defProp = Object.defineProperty;
|
|
10
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
11
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
12
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
13
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
14
|
+
var __spreadValues = (a, b) => {
|
|
15
|
+
for (var prop in b || (b = {}))
|
|
16
|
+
if (__hasOwnProp.call(b, prop))
|
|
17
|
+
__defNormalProp(a, prop, b[prop]);
|
|
18
|
+
if (__getOwnPropSymbols)
|
|
19
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
20
|
+
if (__propIsEnum.call(b, prop))
|
|
21
|
+
__defNormalProp(a, prop, b[prop]);
|
|
22
|
+
}
|
|
23
|
+
return a;
|
|
24
|
+
};
|
|
25
|
+
class VizPanel extends SceneObjectBase {
|
|
26
|
+
constructor(state) {
|
|
27
|
+
super(__spreadValues({
|
|
28
|
+
options: {},
|
|
29
|
+
fieldConfig: { defaults: {}, overrides: [] },
|
|
30
|
+
title: "Title",
|
|
31
|
+
pluginId: "timeseries"
|
|
32
|
+
}, state));
|
|
33
|
+
this.onChangeTimeRange = (timeRange) => {
|
|
34
|
+
const sceneTimeRange = sceneGraph.getTimeRange(this);
|
|
35
|
+
sceneTimeRange.onTimeRangeChange({
|
|
36
|
+
raw: {
|
|
37
|
+
from: toUtc(timeRange.from),
|
|
38
|
+
to: toUtc(timeRange.to)
|
|
39
|
+
},
|
|
40
|
+
from: toUtc(timeRange.from),
|
|
41
|
+
to: toUtc(timeRange.to)
|
|
42
|
+
});
|
|
43
|
+
};
|
|
44
|
+
this.onOptionsChange = (options) => {
|
|
45
|
+
this.setState({ options });
|
|
46
|
+
};
|
|
47
|
+
this.onFieldConfigChange = (fieldConfig) => {
|
|
48
|
+
this.setState({ fieldConfig });
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
activate() {
|
|
52
|
+
super.activate();
|
|
53
|
+
const { getPanelPluginFromCache, importPanelPlugin } = getPluginImportUtils();
|
|
54
|
+
const plugin = getPanelPluginFromCache(this.state.pluginId);
|
|
55
|
+
if (plugin) {
|
|
56
|
+
this.pluginLoaded(plugin);
|
|
57
|
+
} else {
|
|
58
|
+
importPanelPlugin(this.state.pluginId).then((result) => this.pluginLoaded(result)).catch((err) => {
|
|
59
|
+
this.setState({ pluginLoadError: err.message });
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
pluginLoaded(plugin) {
|
|
64
|
+
const { options, fieldConfig, title, pluginId, pluginVersion } = this.state;
|
|
65
|
+
const panel = { title, options, fieldConfig, id: 1, type: pluginId, pluginVersion };
|
|
66
|
+
const currentVersion = this.getPluginVersion(plugin);
|
|
67
|
+
if (plugin.onPanelMigration) {
|
|
68
|
+
if (currentVersion !== this.state.pluginVersion) {
|
|
69
|
+
panel.options = plugin.onPanelMigration(panel);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const withDefaults = getPanelOptionsWithDefaults({
|
|
73
|
+
plugin,
|
|
74
|
+
currentOptions: panel.options,
|
|
75
|
+
currentFieldConfig: panel.fieldConfig,
|
|
76
|
+
isAfterPluginChange: false
|
|
77
|
+
});
|
|
78
|
+
this._plugin = plugin;
|
|
79
|
+
this.setState({
|
|
80
|
+
options: withDefaults.options,
|
|
81
|
+
fieldConfig: withDefaults.fieldConfig,
|
|
82
|
+
pluginVersion: currentVersion
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
getPluginVersion(plugin) {
|
|
86
|
+
return plugin && plugin.meta.info.version ? plugin.meta.info.version : config.buildInfo.version;
|
|
87
|
+
}
|
|
88
|
+
getPlugin() {
|
|
89
|
+
return this._plugin;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
VizPanel.Component = VizPanelRenderer;
|
|
93
|
+
VizPanel.Editor = VizPanelEditor;
|
|
94
|
+
function VizPanelEditor({ model }) {
|
|
95
|
+
const { title } = model.useState();
|
|
96
|
+
return /* @__PURE__ */ React.createElement(Field, {
|
|
97
|
+
label: "Title"
|
|
98
|
+
}, /* @__PURE__ */ React.createElement(Input, {
|
|
99
|
+
defaultValue: title,
|
|
100
|
+
onBlur: (evt) => model.setState({ title: evt.currentTarget.value })
|
|
101
|
+
}));
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export { VizPanel };
|
|
105
|
+
//# sourceMappingURL=VizPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VizPanel.js","sources":["../../../../src/components/VizPanel/VizPanel.tsx"],"sourcesContent":["import React from 'react';\n\nimport {\n AbsoluteTimeRange,\n FieldConfigSource,\n PanelModel,\n PanelPlugin,\n toUtc,\n getPanelOptionsWithDefaults,\n} from '@grafana/data';\nimport { config, getPluginImportUtils } from '@grafana/runtime';\nimport { Field, Input } from '@grafana/ui';\nimport { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { DeepPartial, SceneComponentProps, SceneLayoutChildState } from '../../core/types';\n\nimport { VizPanelRenderer } from './VizPanelRenderer';\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 public static Editor = VizPanelEditor;\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\nfunction VizPanelEditor({ model }: SceneComponentProps<VizPanel>) {\n const { title } = model.useState();\n\n return (\n <Field label=\"Title\">\n <Input defaultValue={title} onBlur={(evt) => model.setState({ title: evt.currentTarget.value })} />\n </Field>\n );\n}\n"],"names":[],"mappings":"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"}
|