@grafana/scenes-react 6.6.0 → 6.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/esm/caching/SceneObjectCache.js +15 -28
- package/dist/esm/caching/SceneObjectCache.js.map +1 -1
- package/dist/esm/components/AnnotationLayer.js.map +1 -1
- package/dist/esm/components/DataLayerControl.js +1 -3
- package/dist/esm/components/DataLayerControl.js.map +1 -1
- package/dist/esm/components/RefreshPicker.js +5 -22
- package/dist/esm/components/RefreshPicker.js.map +1 -1
- package/dist/esm/components/TimeRangePicker.js +18 -15
- package/dist/esm/components/TimeRangePicker.js.map +1 -1
- package/dist/esm/components/VariableControl.js +1 -6
- package/dist/esm/components/VariableControl.js.map +1 -1
- package/dist/esm/components/VizGridLayout.js +1 -3
- package/dist/esm/components/VizGridLayout.js.map +1 -1
- package/dist/esm/components/VizPanel.js +1 -3
- package/dist/esm/components/VizPanel.js.map +1 -1
- package/dist/esm/contexts/BreadcrumbContext.js +15 -11
- package/dist/esm/contexts/BreadcrumbContext.js.map +1 -1
- package/dist/esm/contexts/SceneContextObject.js +3 -21
- package/dist/esm/contexts/SceneContextObject.js.map +1 -1
- package/dist/esm/contexts/SceneContextProvider.js +2 -8
- package/dist/esm/contexts/SceneContextProvider.js.map +1 -1
- package/dist/esm/hooks/hooks.js.map +1 -1
- package/dist/esm/hooks/useDataTransformer.js.map +1 -1
- package/dist/esm/hooks/useQueryRunner.js.map +1 -1
- package/dist/esm/hooks/useQueryVariable.js.map +1 -1
- package/dist/esm/hooks/useSceneObject.js.map +1 -1
- package/dist/esm/hooks/useVariableValue.js.map +1 -1
- package/dist/esm/hooks/useVariableValues.js.map +1 -1
- package/dist/esm/interoperability/EmbeddedSceneWithContext.js +2 -25
- package/dist/esm/interoperability/EmbeddedSceneWithContext.js.map +1 -1
- package/dist/esm/utils.js.map +1 -1
- package/dist/esm/variables/CustomVariable.js.map +1 -1
- package/dist/esm/variables/DataSourceVariable.js.map +1 -1
- package/dist/esm/variables/QueryVariable.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.js +67 -148
- package/dist/index.js.map +1 -1
- package/package.json +11 -12
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
# v6.6.1 (Tue Apr 01 2025)
|
|
2
|
+
|
|
3
|
+
#### 🐛 Bug Fix
|
|
4
|
+
|
|
5
|
+
- Bump rollup and related deps [#1077](https://github.com/grafana/scenes/pull/1077) ([@jackw](https://github.com/jackw))
|
|
6
|
+
|
|
7
|
+
#### Authors: 1
|
|
8
|
+
|
|
9
|
+
- Jack Westbrook ([@jackw](https://github.com/jackw))
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
1
13
|
# v6.0.0 (Fri Feb 07 2025)
|
|
2
14
|
|
|
3
15
|
#### 💥 Breaking Change
|
|
@@ -1,38 +1,25 @@
|
|
|
1
1
|
import { isPlainObject } from 'lodash';
|
|
2
2
|
import { LRUCache } from 'lru-cache';
|
|
3
3
|
|
|
4
|
-
var
|
|
5
|
-
|
|
6
|
-
throw TypeError("Cannot " + msg);
|
|
7
|
-
};
|
|
8
|
-
var __privateGet = (obj, member, getter) => {
|
|
9
|
-
__accessCheck(obj, member, "read from private field");
|
|
10
|
-
return getter ? getter.call(obj) : member.get(obj);
|
|
11
|
-
};
|
|
12
|
-
var __privateAdd = (obj, member, value) => {
|
|
13
|
-
if (member.has(obj))
|
|
14
|
-
throw TypeError("Cannot add the same private member more than once");
|
|
15
|
-
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
16
|
-
};
|
|
17
|
-
var __privateSet = (obj, member, value, setter) => {
|
|
18
|
-
__accessCheck(obj, member, "write to private field");
|
|
19
|
-
setter ? setter.call(obj, value) : member.set(obj, value);
|
|
20
|
-
return value;
|
|
21
|
-
};
|
|
22
|
-
var __privateWrapper = (obj, member, setter, getter) => {
|
|
23
|
-
return {
|
|
24
|
-
set _(value) {
|
|
25
|
-
__privateSet(obj, member, value, setter);
|
|
26
|
-
},
|
|
27
|
-
get _() {
|
|
28
|
-
return __privateGet(obj, member, getter);
|
|
29
|
-
}
|
|
30
|
-
};
|
|
4
|
+
var __typeError = (msg) => {
|
|
5
|
+
throw TypeError(msg);
|
|
31
6
|
};
|
|
7
|
+
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
8
|
+
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
9
|
+
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
10
|
+
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
|
|
11
|
+
var __privateWrapper = (obj, member, setter, getter) => ({
|
|
12
|
+
set _(value) {
|
|
13
|
+
__privateSet(obj, member, value);
|
|
14
|
+
},
|
|
15
|
+
get _() {
|
|
16
|
+
return __privateGet(obj, member, getter);
|
|
17
|
+
}
|
|
18
|
+
});
|
|
32
19
|
var _cache, _objectRefIds, _objectRefIdCounter;
|
|
33
20
|
class SceneObjectCache {
|
|
34
21
|
constructor() {
|
|
35
|
-
__privateAdd(this, _cache
|
|
22
|
+
__privateAdd(this, _cache);
|
|
36
23
|
__privateAdd(this, _objectRefIds, /* @__PURE__ */ new WeakMap());
|
|
37
24
|
__privateAdd(this, _objectRefIdCounter, 0);
|
|
38
25
|
__privateSet(this, _cache, new LRUCache({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SceneObjectCache.js","sources":["../../../src/caching/SceneObjectCache.ts"],"sourcesContent":["import { SceneObject } from '@grafana/scenes';\nimport { isPlainObject } from 'lodash';\nimport { LRUCache } from 'lru-cache';\n\nexport type CacheKey = CacheKeyPart | CacheKeyPart[];\n\nexport type CacheKeyPart = string | number | object | boolean;\n\nexport type SceneObjectConstructor = { new (...args: never[]): SceneObject };\n\nexport class SceneObjectCache {\n #cache: LRUCache<string, SceneObject>;\n #objectRefIds = new WeakMap<any, number>();\n #objectRefIdCounter = 0;\n\n public constructor() {\n this.#cache = new LRUCache({\n max: 500,\n ttl: 1000 * 60 * 5,\n });\n }\n\n public add(keyHash: string, object: SceneObject) {\n this.#cache.set(keyHash, object);\n }\n\n public get<T>(keyHash: string): T | undefined {\n return this.#cache.get(keyHash) as T;\n }\n\n public getHashKey(key: CacheKey, type: SceneObjectConstructor): string {\n if (Array.isArray(key)) {\n return `${type.name}-${key.map((k) => this.getHashKeyElement(k)).join()}`;\n }\n\n return `${type.name}-${this.getHashKeyElement(key)}`;\n }\n\n public getByRefHashKey(obj: unknown) {\n let objectRefId = this.#objectRefIds.get(obj);\n if (objectRefId == null) {\n objectRefId = this.#objectRefIdCounter++;\n this.#objectRefIds.set(obj, objectRefId);\n }\n\n return objectRefId;\n }\n\n private getHashKeyElement<T>(key: CacheKey) {\n if (typeof key === 'string' || typeof key === 'boolean' || typeof key === 'number') {\n return key;\n }\n\n return getObjectHash(key);\n }\n}\n\nlet cache: SceneObjectCache | undefined;\n\nexport function getSceneObjectCache(): SceneObjectCache {\n if (cache) {\n return cache;\n }\n\n return (cache = new SceneObjectCache());\n}\n\n/**\n * Returns a unique hash key string for the given object reference.\n */\nexport function cacheByRef(value: unknown) {\n const cache = getSceneObjectCache();\n return cache.getByRefHashKey(value);\n}\n\nexport function getObjectHash(obj: unknown): string {\n return JSON.stringify(obj, (_, val) =>\n isPlainObject(val)\n ? Object.keys(val)\n .sort()\n .reduce((result, key) => {\n result[key] = val[key];\n return result;\n }, {} as any)\n : val\n );\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SceneObjectCache.js","sources":["../../../src/caching/SceneObjectCache.ts"],"sourcesContent":["import { SceneObject } from '@grafana/scenes';\nimport { isPlainObject } from 'lodash';\nimport { LRUCache } from 'lru-cache';\n\nexport type CacheKey = CacheKeyPart | CacheKeyPart[];\n\nexport type CacheKeyPart = string | number | object | boolean;\n\nexport type SceneObjectConstructor = { new (...args: never[]): SceneObject };\n\nexport class SceneObjectCache {\n #cache: LRUCache<string, SceneObject>;\n #objectRefIds = new WeakMap<any, number>();\n #objectRefIdCounter = 0;\n\n public constructor() {\n this.#cache = new LRUCache({\n max: 500,\n ttl: 1000 * 60 * 5,\n });\n }\n\n public add(keyHash: string, object: SceneObject) {\n this.#cache.set(keyHash, object);\n }\n\n public get<T>(keyHash: string): T | undefined {\n return this.#cache.get(keyHash) as T;\n }\n\n public getHashKey(key: CacheKey, type: SceneObjectConstructor): string {\n if (Array.isArray(key)) {\n return `${type.name}-${key.map((k) => this.getHashKeyElement(k)).join()}`;\n }\n\n return `${type.name}-${this.getHashKeyElement(key)}`;\n }\n\n public getByRefHashKey(obj: unknown) {\n let objectRefId = this.#objectRefIds.get(obj);\n if (objectRefId == null) {\n objectRefId = this.#objectRefIdCounter++;\n this.#objectRefIds.set(obj, objectRefId);\n }\n\n return objectRefId;\n }\n\n private getHashKeyElement<T>(key: CacheKey) {\n if (typeof key === 'string' || typeof key === 'boolean' || typeof key === 'number') {\n return key;\n }\n\n return getObjectHash(key);\n }\n}\n\nlet cache: SceneObjectCache | undefined;\n\nexport function getSceneObjectCache(): SceneObjectCache {\n if (cache) {\n return cache;\n }\n\n return (cache = new SceneObjectCache());\n}\n\n/**\n * Returns a unique hash key string for the given object reference.\n */\nexport function cacheByRef(value: unknown) {\n const cache = getSceneObjectCache();\n return cache.getByRefHashKey(value);\n}\n\nexport function getObjectHash(obj: unknown): string {\n return JSON.stringify(obj, (_, val) =>\n isPlainObject(val)\n ? Object.keys(val)\n .sort()\n .reduce((result, key) => {\n result[key] = val[key];\n return result;\n }, {} as any)\n : val\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAAA,IAAA,MAAA,EAAA,aAAA,EAAA,mBAAA;AAUO,MAAM,gBAAiB,CAAA;AAAA,EAKrB,WAAc,GAAA;AAJrB,IAAA,YAAA,CAAA,IAAA,EAAA,MAAA,CAAA;AACA,IAAA,YAAA,CAAA,IAAA,EAAA,aAAA,sBAAoB,OAAqB,EAAA,CAAA;AACzC,IAAsB,YAAA,CAAA,IAAA,EAAA,mBAAA,EAAA,CAAA,CAAA;AAGpB,IAAK,YAAA,CAAA,IAAA,EAAA,MAAA,EAAS,IAAI,QAAS,CAAA;AAAA,MACzB,GAAK,EAAA,GAAA;AAAA,MACL,GAAA,EAAK,MAAO,EAAK,GAAA;AAAA,KAClB,CAAA,CAAA;AAAA;AACH,EAEO,GAAA,CAAI,SAAiB,MAAqB,EAAA;AAC/C,IAAK,YAAA,CAAA,IAAA,EAAA,MAAA,CAAA,CAAO,GAAI,CAAA,OAAA,EAAS,MAAM,CAAA;AAAA;AACjC,EAEO,IAAO,OAAgC,EAAA;AAC5C,IAAO,OAAA,YAAA,CAAA,IAAA,EAAK,MAAO,CAAA,CAAA,GAAA,CAAI,OAAO,CAAA;AAAA;AAChC,EAEO,UAAA,CAAW,KAAe,IAAsC,EAAA;AACrE,IAAI,IAAA,KAAA,CAAM,OAAQ,CAAA,GAAG,CAAG,EAAA;AACtB,MAAA,OAAO,CAAG,EAAA,IAAA,CAAK,IAAI,CAAA,CAAA,EAAI,IAAI,GAAI,CAAA,CAAC,CAAM,KAAA,IAAA,CAAK,iBAAkB,CAAA,CAAC,CAAC,CAAA,CAAE,MAAM,CAAA,CAAA;AAAA;AAGzE,IAAA,OAAO,GAAG,IAAK,CAAA,IAAI,IAAI,IAAK,CAAA,iBAAA,CAAkB,GAAG,CAAC,CAAA,CAAA;AAAA;AACpD,EAEO,gBAAgB,GAAc,EAAA;AACnC,IAAA,IAAI,WAAc,GAAA,YAAA,CAAA,IAAA,EAAK,aAAc,CAAA,CAAA,GAAA,CAAI,GAAG,CAAA;AAC5C,IAAA,IAAI,eAAe,IAAM,EAAA;AACvB,MAAA,WAAA,GAAc,uBAAK,mBAAL,CAAA,CAAA,CAAA,EAAA;AACd,MAAK,YAAA,CAAA,IAAA,EAAA,aAAA,CAAA,CAAc,GAAI,CAAA,GAAA,EAAK,WAAW,CAAA;AAAA;AAGzC,IAAO,OAAA,WAAA;AAAA;AACT,EAEQ,kBAAqB,GAAe,EAAA;AAC1C,IAAI,IAAA,OAAO,QAAQ,QAAY,IAAA,OAAO,QAAQ,SAAa,IAAA,OAAO,QAAQ,QAAU,EAAA;AAClF,MAAO,OAAA,GAAA;AAAA;AAGT,IAAA,OAAO,cAAc,GAAG,CAAA;AAAA;AAE5B;AA5CE,MAAA,GAAA,IAAA,OAAA,EAAA;AACA,aAAA,GAAA,IAAA,OAAA,EAAA;AACA,mBAAA,GAAA,IAAA,OAAA,EAAA;AA4CF,IAAI,KAAA;AAEG,SAAS,mBAAwC,GAAA;AACtD,EAAA,IAAI,KAAO,EAAA;AACT,IAAO,OAAA,KAAA;AAAA;AAGT,EAAQ,OAAA,KAAA,GAAQ,IAAI,gBAAiB,EAAA;AACvC;AAUO,SAAS,cAAc,GAAsB,EAAA;AAClD,EAAA,OAAO,IAAK,CAAA,SAAA;AAAA,IAAU,GAAA;AAAA,IAAK,CAAC,CAAA,EAAG,GAC7B,KAAA,aAAA,CAAc,GAAG,CACb,GAAA,MAAA,CAAO,IAAK,CAAA,GAAG,EACZ,IAAK,EAAA,CACL,MAAO,CAAA,CAAC,QAAQ,GAAQ,KAAA;AACvB,MAAO,MAAA,CAAA,GAAG,CAAI,GAAA,GAAA,CAAI,GAAG,CAAA;AACrB,MAAO,OAAA,MAAA;AAAA,KACT,EAAG,EAAS,CACd,GAAA;AAAA,GACN;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnnotationLayer.js","sources":["../../../src/components/AnnotationLayer.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\nimport { useSceneContext } from '../hooks/hooks';\nimport { AnnotationQuery } from '@grafana/data';\nimport { SceneDataLayerSet, dataLayers } from '@grafana/scenes';\nimport { SceneContextObject } from '../contexts/SceneContextObject';\nimport { writeSceneLog } from '../utils';\n\nexport interface AnnotationLayerSetProps {\n name: string;\n query: AnnotationQuery;\n children: React.ReactNode;\n}\n\nexport function AnnotationLayer({ name, query, children }: AnnotationLayerSetProps): React.ReactNode {\n const scene = useSceneContext();\n const [annotationAdded, setAnnotationAdded] = useState<boolean>();\n\n let annotation: dataLayers.AnnotationsDataLayer | undefined = findAnnotationLayer(scene, name);\n\n if (!annotation) {\n annotation = new dataLayers.AnnotationsDataLayer({ name, query });\n }\n\n useEffect(() => {\n const removeFn = addAnnotationLayer(scene, annotation);\n setAnnotationAdded(true);\n return removeFn;\n }, [scene, name, annotation]);\n\n useEffect(() => {\n // Handle prop changes\n }, [annotationAdded]);\n\n if (!annotationAdded) {\n return null;\n }\n\n return children;\n}\n\nfunction findAnnotationLayer<T>(scene: SceneContextObject, name: string): T | undefined {\n const annotations = scene.state.$data as SceneDataLayerSet;\n\n if (!annotations) {\n return;\n }\n\n return annotations.state.layers.find((anno) => anno.state.name === name) as T;\n}\n\nfunction addAnnotationLayer(scene: SceneContextObject, layer: dataLayers.AnnotationsDataLayer) {\n let set = scene.state.$data as SceneDataLayerSet;\n\n if (set) {\n set.setState({ layers: [...set.state.layers, layer] });\n } else {\n set = new SceneDataLayerSet({ layers: [layer] });\n scene.setState({ $data: set });\n }\n\n writeSceneLog('SceneContext', `Adding annotation data layer: ${layer.state.name} key: ${layer.state.key}`);\n\n return () => {\n set.setState({ layers: set.state.layers.filter((x) => x !== layer) });\n writeSceneLog('SceneContext', `Removing annotation data layer: ${layer.state.name} key: ${layer.state.key}`);\n };\n}\n"],"names":[],"mappings":";;;;;AAaO,SAAS,eAAgB,CAAA,EAAE,IAAM,EAAA,KAAA,EAAO,UAAsD,EAAA;AACnG,EAAA,MAAM,QAAQ,eAAgB,EAAA
|
|
1
|
+
{"version":3,"file":"AnnotationLayer.js","sources":["../../../src/components/AnnotationLayer.tsx"],"sourcesContent":["import React, { useEffect, useState } from 'react';\nimport { useSceneContext } from '../hooks/hooks';\nimport { AnnotationQuery } from '@grafana/data';\nimport { SceneDataLayerSet, dataLayers } from '@grafana/scenes';\nimport { SceneContextObject } from '../contexts/SceneContextObject';\nimport { writeSceneLog } from '../utils';\n\nexport interface AnnotationLayerSetProps {\n name: string;\n query: AnnotationQuery;\n children: React.ReactNode;\n}\n\nexport function AnnotationLayer({ name, query, children }: AnnotationLayerSetProps): React.ReactNode {\n const scene = useSceneContext();\n const [annotationAdded, setAnnotationAdded] = useState<boolean>();\n\n let annotation: dataLayers.AnnotationsDataLayer | undefined = findAnnotationLayer(scene, name);\n\n if (!annotation) {\n annotation = new dataLayers.AnnotationsDataLayer({ name, query });\n }\n\n useEffect(() => {\n const removeFn = addAnnotationLayer(scene, annotation);\n setAnnotationAdded(true);\n return removeFn;\n }, [scene, name, annotation]);\n\n useEffect(() => {\n // Handle prop changes\n }, [annotationAdded]);\n\n if (!annotationAdded) {\n return null;\n }\n\n return children;\n}\n\nfunction findAnnotationLayer<T>(scene: SceneContextObject, name: string): T | undefined {\n const annotations = scene.state.$data as SceneDataLayerSet;\n\n if (!annotations) {\n return;\n }\n\n return annotations.state.layers.find((anno) => anno.state.name === name) as T;\n}\n\nfunction addAnnotationLayer(scene: SceneContextObject, layer: dataLayers.AnnotationsDataLayer) {\n let set = scene.state.$data as SceneDataLayerSet;\n\n if (set) {\n set.setState({ layers: [...set.state.layers, layer] });\n } else {\n set = new SceneDataLayerSet({ layers: [layer] });\n scene.setState({ $data: set });\n }\n\n writeSceneLog('SceneContext', `Adding annotation data layer: ${layer.state.name} key: ${layer.state.key}`);\n\n return () => {\n set.setState({ layers: set.state.layers.filter((x) => x !== layer) });\n writeSceneLog('SceneContext', `Removing annotation data layer: ${layer.state.name} key: ${layer.state.key}`);\n };\n}\n"],"names":[],"mappings":";;;;;AAaO,SAAS,eAAgB,CAAA,EAAE,IAAM,EAAA,KAAA,EAAO,UAAsD,EAAA;AACnG,EAAA,MAAM,QAAQ,eAAgB,EAAA;AAC9B,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAI,QAAkB,EAAA;AAEhE,EAAI,IAAA,UAAA,GAA0D,mBAAoB,CAAA,KAAA,EAAO,IAAI,CAAA;AAE7F,EAAA,IAAI,CAAC,UAAY,EAAA;AACf,IAAA,UAAA,GAAa,IAAI,UAAW,CAAA,oBAAA,CAAqB,EAAE,IAAA,EAAM,OAAO,CAAA;AAAA;AAGlE,EAAA,SAAA,CAAU,MAAM;AACd,IAAM,MAAA,QAAA,GAAW,kBAAmB,CAAA,KAAA,EAAO,UAAU,CAAA;AACrD,IAAA,kBAAA,CAAmB,IAAI,CAAA;AACvB,IAAO,OAAA,QAAA;AAAA,GACN,EAAA,CAAC,KAAO,EAAA,IAAA,EAAM,UAAU,CAAC,CAAA;AAE5B,EAAA,SAAA,CAAU,MAAM;AAAA,GAEhB,EAAG,CAAC,eAAe,CAAC,CAAA;AAEpB,EAAA,IAAI,CAAC,eAAiB,EAAA;AACpB,IAAO,OAAA,IAAA;AAAA;AAGT,EAAO,OAAA,QAAA;AACT;AAEA,SAAS,mBAAA,CAAuB,OAA2B,IAA6B,EAAA;AACtF,EAAM,MAAA,WAAA,GAAc,MAAM,KAAM,CAAA,KAAA;AAEhC,EAAA,IAAI,CAAC,WAAa,EAAA;AAChB,IAAA;AAAA;AAGF,EAAO,OAAA,WAAA,CAAY,MAAM,MAAO,CAAA,IAAA,CAAK,CAAC,IAAS,KAAA,IAAA,CAAK,KAAM,CAAA,IAAA,KAAS,IAAI,CAAA;AACzE;AAEA,SAAS,kBAAA,CAAmB,OAA2B,KAAwC,EAAA;AAC7F,EAAI,IAAA,GAAA,GAAM,MAAM,KAAM,CAAA,KAAA;AAEtB,EAAA,IAAI,GAAK,EAAA;AACP,IAAI,GAAA,CAAA,QAAA,CAAS,EAAE,MAAA,EAAQ,CAAC,GAAG,IAAI,KAAM,CAAA,MAAA,EAAQ,KAAK,CAAA,EAAG,CAAA;AAAA,GAChD,MAAA;AACL,IAAA,GAAA,GAAM,IAAI,iBAAkB,CAAA,EAAE,QAAQ,CAAC,KAAK,GAAG,CAAA;AAC/C,IAAA,KAAA,CAAM,QAAS,CAAA,EAAE,KAAO,EAAA,GAAA,EAAK,CAAA;AAAA;AAG/B,EAAc,aAAA,CAAA,cAAA,EAAgB,iCAAiC,KAAM,CAAA,KAAA,CAAM,IAAI,CAAS,MAAA,EAAA,KAAA,CAAM,KAAM,CAAA,GAAG,CAAE,CAAA,CAAA;AAEzG,EAAA,OAAO,MAAM;AACX,IAAA,GAAA,CAAI,QAAS,CAAA,EAAE,MAAQ,EAAA,GAAA,CAAI,KAAM,CAAA,MAAA,CAAO,MAAO,CAAA,CAAC,CAAM,KAAA,CAAA,KAAM,KAAK,CAAA,EAAG,CAAA;AACpE,IAAc,aAAA,CAAA,cAAA,EAAgB,mCAAmC,KAAM,CAAA,KAAA,CAAM,IAAI,CAAS,MAAA,EAAA,KAAA,CAAM,KAAM,CAAA,GAAG,CAAE,CAAA,CAAA;AAAA,GAC7G;AACF;;;;"}
|
|
@@ -9,9 +9,7 @@ function DataLayerControl({ name }) {
|
|
|
9
9
|
if (!layer) {
|
|
10
10
|
return /* @__PURE__ */ React.createElement("div", null, "Annotation ", name, " not found");
|
|
11
11
|
}
|
|
12
|
-
return /* @__PURE__ */ React.createElement(layer.Component, {
|
|
13
|
-
model: layer
|
|
14
|
-
});
|
|
12
|
+
return /* @__PURE__ */ React.createElement(layer.Component, { model: layer });
|
|
15
13
|
}
|
|
16
14
|
function getLayer(layers, name) {
|
|
17
15
|
for (let i = 0; i < layers.length; i++) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataLayerControl.js","sources":["../../../src/components/DataLayerControl.tsx"],"sourcesContent":["import React from 'react';\nimport { SceneDataLayerProvider, SceneDataLayerSet, sceneGraph } from '@grafana/scenes';\nimport { useSceneContext } from '../hooks/hooks';\n\nexport interface Props {\n name: string;\n}\n\nexport function DataLayerControl({ name }: Props) {\n const scene = useSceneContext();\n const layerSets = sceneGraph.getDataLayers(scene);\n\n const layer = getLayer(layerSets, name);\n\n if (!layer) {\n return <div>Annotation {name} not found</div>;\n }\n\n return <layer.Component model={layer} />;\n}\n\nfunction getLayer(layers: SceneDataLayerProvider[], name: string): SceneDataLayerProvider | undefined {\n for (let i = 0; i < layers.length; i++) {\n const layer = (layers[i] as SceneDataLayerSet).state.layers.find((layer) => layer.state.name === name);\n\n if (layer) {\n return layer;\n }\n }\n\n return undefined;\n}\n"],"names":["layer"],"mappings":";;;;AAQgB,SAAA,gBAAA,CAAiB,EAAE,IAAA,EAAe,EAAA;AAChD,EAAA,MAAM,QAAQ,eAAgB,EAAA
|
|
1
|
+
{"version":3,"file":"DataLayerControl.js","sources":["../../../src/components/DataLayerControl.tsx"],"sourcesContent":["import React from 'react';\nimport { SceneDataLayerProvider, SceneDataLayerSet, sceneGraph } from '@grafana/scenes';\nimport { useSceneContext } from '../hooks/hooks';\n\nexport interface Props {\n name: string;\n}\n\nexport function DataLayerControl({ name }: Props) {\n const scene = useSceneContext();\n const layerSets = sceneGraph.getDataLayers(scene);\n\n const layer = getLayer(layerSets, name);\n\n if (!layer) {\n return <div>Annotation {name} not found</div>;\n }\n\n return <layer.Component model={layer} />;\n}\n\nfunction getLayer(layers: SceneDataLayerProvider[], name: string): SceneDataLayerProvider | undefined {\n for (let i = 0; i < layers.length; i++) {\n const layer = (layers[i] as SceneDataLayerSet).state.layers.find((layer) => layer.state.name === name);\n\n if (layer) {\n return layer;\n }\n }\n\n return undefined;\n}\n"],"names":["layer"],"mappings":";;;;AAQgB,SAAA,gBAAA,CAAiB,EAAE,IAAA,EAAe,EAAA;AAChD,EAAA,MAAM,QAAQ,eAAgB,EAAA;AAC9B,EAAM,MAAA,SAAA,GAAY,UAAW,CAAA,aAAA,CAAc,KAAK,CAAA;AAEhD,EAAM,MAAA,KAAA,GAAQ,QAAS,CAAA,SAAA,EAAW,IAAI,CAAA;AAEtC,EAAA,IAAI,CAAC,KAAO,EAAA;AACV,IAAA,uBAAQ,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,IAAA,EAAI,aAAY,EAAA,IAAA,EAAK,YAAU,CAAA;AAAA;AAGzC,EAAA,uBAAQ,KAAA,CAAA,aAAA,CAAA,KAAA,CAAM,SAAN,EAAA,EAAgB,OAAO,KAAO,EAAA,CAAA;AACxC;AAEA,SAAS,QAAA,CAAS,QAAkC,IAAkD,EAAA;AACpG,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,MAAA,CAAO,QAAQ,CAAK,EAAA,EAAA;AACtC,IAAA,MAAM,KAAS,GAAA,MAAA,CAAO,CAAC,CAAA,CAAwB,KAAM,CAAA,MAAA,CAAO,IAAK,CAAA,CAACA,MAAUA,KAAAA,MAAAA,CAAM,KAAM,CAAA,IAAA,KAAS,IAAI,CAAA;AAErG,IAAA,IAAI,KAAO,EAAA;AACT,MAAO,OAAA,KAAA;AAAA;AACT;AAGF,EAAO,OAAA,MAAA;AACT;;;;"}
|
|
@@ -3,31 +3,16 @@ import { useSceneContext } from '../hooks/hooks.js';
|
|
|
3
3
|
import { SceneRefreshPicker } from '@grafana/scenes';
|
|
4
4
|
import { usePrevious } from 'react-use';
|
|
5
5
|
|
|
6
|
-
var __defProp = Object.defineProperty;
|
|
7
|
-
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
8
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
-
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
10
|
-
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
11
|
-
var __spreadValues = (a, b) => {
|
|
12
|
-
for (var prop in b || (b = {}))
|
|
13
|
-
if (__hasOwnProp.call(b, prop))
|
|
14
|
-
__defNormalProp(a, prop, b[prop]);
|
|
15
|
-
if (__getOwnPropSymbols)
|
|
16
|
-
for (var prop of __getOwnPropSymbols(b)) {
|
|
17
|
-
if (__propIsEnum.call(b, prop))
|
|
18
|
-
__defNormalProp(a, prop, b[prop]);
|
|
19
|
-
}
|
|
20
|
-
return a;
|
|
21
|
-
};
|
|
22
6
|
function RefreshPicker(props) {
|
|
23
7
|
const scene = useSceneContext();
|
|
24
8
|
const key = useId();
|
|
25
9
|
const prevProps = usePrevious(props);
|
|
26
10
|
let picker = scene.findByKey(key);
|
|
27
11
|
if (!picker) {
|
|
28
|
-
picker = new SceneRefreshPicker(
|
|
29
|
-
key
|
|
30
|
-
|
|
12
|
+
picker = new SceneRefreshPicker({
|
|
13
|
+
key,
|
|
14
|
+
...props
|
|
15
|
+
});
|
|
31
16
|
}
|
|
32
17
|
useEffect(() => scene.addToScene(picker), [picker, scene]);
|
|
33
18
|
useEffect(() => {
|
|
@@ -43,9 +28,7 @@ function RefreshPicker(props) {
|
|
|
43
28
|
}
|
|
44
29
|
picker.setState(stateUpdate);
|
|
45
30
|
}, [picker, props, prevProps]);
|
|
46
|
-
return /* @__PURE__ */ React.createElement(picker.Component, {
|
|
47
|
-
model: picker
|
|
48
|
-
});
|
|
31
|
+
return /* @__PURE__ */ React.createElement(picker.Component, { model: picker });
|
|
49
32
|
}
|
|
50
33
|
|
|
51
34
|
export { RefreshPicker };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RefreshPicker.js","sources":["../../../src/components/RefreshPicker.tsx"],"sourcesContent":["import React, { useEffect, useId } from 'react';\nimport { useSceneContext } from '../hooks/hooks';\nimport { SceneRefreshPicker, SceneRefreshPickerState } from '@grafana/scenes';\nimport { usePrevious } from 'react-use';\n\nexport interface Props {\n refresh?: string;\n withText?: boolean;\n}\n\nexport function RefreshPicker(props: Props) {\n const scene = useSceneContext();\n const key = useId();\n const prevProps = usePrevious(props);\n\n let picker = scene.findByKey<SceneRefreshPicker>(key);\n\n if (!picker) {\n picker = new SceneRefreshPicker({\n key: key,\n ...props,\n });\n }\n\n useEffect(() => scene.addToScene(picker), [picker, scene]);\n\n // Update options\n useEffect(() => {\n const stateUpdate: Partial<SceneRefreshPickerState> = {};\n\n if (!prevProps) {\n return;\n }\n\n if (props.refresh !== prevProps.refresh) {\n stateUpdate.refresh = props.refresh;\n }\n\n if (props.withText !== prevProps.withText) {\n stateUpdate.withText = props.withText;\n }\n\n picker.setState(stateUpdate);\n }, [picker, props, prevProps]);\n\n return <picker.Component model={picker} />;\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"RefreshPicker.js","sources":["../../../src/components/RefreshPicker.tsx"],"sourcesContent":["import React, { useEffect, useId } from 'react';\nimport { useSceneContext } from '../hooks/hooks';\nimport { SceneRefreshPicker, SceneRefreshPickerState } from '@grafana/scenes';\nimport { usePrevious } from 'react-use';\n\nexport interface Props {\n refresh?: string;\n withText?: boolean;\n}\n\nexport function RefreshPicker(props: Props) {\n const scene = useSceneContext();\n const key = useId();\n const prevProps = usePrevious(props);\n\n let picker = scene.findByKey<SceneRefreshPicker>(key);\n\n if (!picker) {\n picker = new SceneRefreshPicker({\n key: key,\n ...props,\n });\n }\n\n useEffect(() => scene.addToScene(picker), [picker, scene]);\n\n // Update options\n useEffect(() => {\n const stateUpdate: Partial<SceneRefreshPickerState> = {};\n\n if (!prevProps) {\n return;\n }\n\n if (props.refresh !== prevProps.refresh) {\n stateUpdate.refresh = props.refresh;\n }\n\n if (props.withText !== prevProps.withText) {\n stateUpdate.withText = props.withText;\n }\n\n picker.setState(stateUpdate);\n }, [picker, props, prevProps]);\n\n return <picker.Component model={picker} />;\n}\n"],"names":[],"mappings":";;;;;AAUO,SAAS,cAAc,KAAc,EAAA;AAC1C,EAAA,MAAM,QAAQ,eAAgB,EAAA;AAC9B,EAAA,MAAM,MAAM,KAAM,EAAA;AAClB,EAAM,MAAA,SAAA,GAAY,YAAY,KAAK,CAAA;AAEnC,EAAI,IAAA,MAAA,GAAS,KAAM,CAAA,SAAA,CAA8B,GAAG,CAAA;AAEpD,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAA,MAAA,GAAS,IAAI,kBAAmB,CAAA;AAAA,MAC9B,GAAA;AAAA,MACA,GAAG;AAAA,KACJ,CAAA;AAAA;AAGH,EAAU,SAAA,CAAA,MAAM,MAAM,UAAW,CAAA,MAAM,GAAG,CAAC,MAAA,EAAQ,KAAK,CAAC,CAAA;AAGzD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,cAAgD,EAAC;AAEvD,IAAA,IAAI,CAAC,SAAW,EAAA;AACd,MAAA;AAAA;AAGF,IAAI,IAAA,KAAA,CAAM,OAAY,KAAA,SAAA,CAAU,OAAS,EAAA;AACvC,MAAA,WAAA,CAAY,UAAU,KAAM,CAAA,OAAA;AAAA;AAG9B,IAAI,IAAA,KAAA,CAAM,QAAa,KAAA,SAAA,CAAU,QAAU,EAAA;AACzC,MAAA,WAAA,CAAY,WAAW,KAAM,CAAA,QAAA;AAAA;AAG/B,IAAA,MAAA,CAAO,SAAS,WAAW,CAAA;AAAA,GAC1B,EAAA,CAAC,MAAQ,EAAA,KAAA,EAAO,SAAS,CAAC,CAAA;AAE7B,EAAA,uBAAQ,KAAA,CAAA,aAAA,CAAA,MAAA,CAAO,SAAP,EAAA,EAAiB,OAAO,MAAQ,EAAA,CAAA;AAC1C;;;;"}
|
|
@@ -4,22 +4,25 @@ import { useTimeRange } from '../hooks/hooks.js';
|
|
|
4
4
|
|
|
5
5
|
function TimeRangePicker(props) {
|
|
6
6
|
const [value, sceneTimeRange] = useTimeRange();
|
|
7
|
-
return /* @__PURE__ */ React.createElement(
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
7
|
+
return /* @__PURE__ */ React.createElement(
|
|
8
|
+
TimeRangePicker$1,
|
|
9
|
+
{
|
|
10
|
+
isOnCanvas: true,
|
|
11
|
+
value,
|
|
12
|
+
onChange: sceneTimeRange.onTimeRangeChange,
|
|
13
|
+
timeZone: sceneTimeRange.getTimeZone(),
|
|
14
|
+
onMoveBackward: () => {
|
|
15
|
+
},
|
|
16
|
+
onMoveForward: () => {
|
|
17
|
+
},
|
|
18
|
+
onZoom: () => {
|
|
19
|
+
},
|
|
20
|
+
onChangeTimeZone: () => {
|
|
21
|
+
},
|
|
22
|
+
onChangeFiscalYearStartMonth: () => {
|
|
23
|
+
}
|
|
21
24
|
}
|
|
22
|
-
|
|
25
|
+
);
|
|
23
26
|
}
|
|
24
27
|
|
|
25
28
|
export { TimeRangePicker };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TimeRangePicker.js","sources":["../../../src/components/TimeRangePicker.tsx"],"sourcesContent":["import { TimeRangePicker as TimeRangePickerUI } from '@grafana/ui';\nimport React from 'react';\nimport { useTimeRange } from '../hooks/hooks';\n\nexport interface Props {}\n\nexport function TimeRangePicker(props: Props) {\n const [value, sceneTimeRange] = useTimeRange();\n\n return (\n <TimeRangePickerUI\n isOnCanvas={true}\n value={value}\n onChange={sceneTimeRange.onTimeRangeChange}\n timeZone={sceneTimeRange.getTimeZone()}\n onMoveBackward={() => {}}\n onMoveForward={() => {}}\n onZoom={() => {}}\n onChangeTimeZone={() => {}}\n onChangeFiscalYearStartMonth={() => {}}\n />\n );\n}\n"],"names":["TimeRangePickerUI"],"mappings":";;;;AAMO,SAAS,gBAAgB,KAAc,EAAA;AAC5C,EAAA,MAAM,CAAC,KAAA,EAAO,cAAc,CAAA,GAAI,YAAa,EAAA
|
|
1
|
+
{"version":3,"file":"TimeRangePicker.js","sources":["../../../src/components/TimeRangePicker.tsx"],"sourcesContent":["import { TimeRangePicker as TimeRangePickerUI } from '@grafana/ui';\nimport React from 'react';\nimport { useTimeRange } from '../hooks/hooks';\n\nexport interface Props {}\n\nexport function TimeRangePicker(props: Props) {\n const [value, sceneTimeRange] = useTimeRange();\n\n return (\n <TimeRangePickerUI\n isOnCanvas={true}\n value={value}\n onChange={sceneTimeRange.onTimeRangeChange}\n timeZone={sceneTimeRange.getTimeZone()}\n onMoveBackward={() => {}}\n onMoveForward={() => {}}\n onZoom={() => {}}\n onChangeTimeZone={() => {}}\n onChangeFiscalYearStartMonth={() => {}}\n />\n );\n}\n"],"names":["TimeRangePickerUI"],"mappings":";;;;AAMO,SAAS,gBAAgB,KAAc,EAAA;AAC5C,EAAA,MAAM,CAAC,KAAA,EAAO,cAAc,CAAA,GAAI,YAAa,EAAA;AAE7C,EACE,uBAAA,KAAA,CAAA,aAAA;AAAA,IAACA,iBAAA;AAAA,IAAA;AAAA,MACC,UAAY,EAAA,IAAA;AAAA,MACZ,KAAA;AAAA,MACA,UAAU,cAAe,CAAA,iBAAA;AAAA,MACzB,QAAA,EAAU,eAAe,WAAY,EAAA;AAAA,MACrC,gBAAgB,MAAM;AAAA,OAAC;AAAA,MACvB,eAAe,MAAM;AAAA,OAAC;AAAA,MACtB,QAAQ,MAAM;AAAA,OAAC;AAAA,MACf,kBAAkB,MAAM;AAAA,OAAC;AAAA,MACzB,8BAA8B,MAAM;AAAA;AAAC;AAAA,GACvC;AAEJ;;;;"}
|
|
@@ -8,12 +8,7 @@ function VariableControl({ name, hideLabel, layout }) {
|
|
|
8
8
|
if (!variable) {
|
|
9
9
|
return /* @__PURE__ */ React.createElement("div", null, "Variable ", name, " not found");
|
|
10
10
|
}
|
|
11
|
-
return /* @__PURE__ */ React.createElement(VariableValueSelectWrapper, {
|
|
12
|
-
key: variable.state.key,
|
|
13
|
-
variable,
|
|
14
|
-
hideLabel,
|
|
15
|
-
layout
|
|
16
|
-
});
|
|
11
|
+
return /* @__PURE__ */ React.createElement(VariableValueSelectWrapper, { key: variable.state.key, variable, hideLabel, layout });
|
|
17
12
|
}
|
|
18
13
|
|
|
19
14
|
export { VariableControl };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VariableControl.js","sources":["../../../src/components/VariableControl.tsx"],"sourcesContent":["import React from 'react';\nimport { ControlsLayout, sceneGraph, VariableValueSelectWrapper } from '@grafana/scenes';\nimport { useSceneContext } from '../hooks/hooks';\n\nexport interface Props {\n name: string;\n hideLabel?: boolean;\n layout?: ControlsLayout;\n}\n\nexport function VariableControl({ name, hideLabel, layout }: Props) {\n const scene = useSceneContext();\n const variable = sceneGraph.lookupVariable(name, scene);\n\n if (!variable) {\n return <div>Variable {name} not found</div>;\n }\n\n return (\n <VariableValueSelectWrapper key={variable.state.key} variable={variable} hideLabel={hideLabel} layout={layout} />\n );\n}\n"],"names":[],"mappings":";;;;AAUO,SAAS,eAAgB,CAAA,EAAE,IAAM,EAAA,SAAA,EAAW,QAAiB,EAAA;AAClE,EAAA,MAAM,QAAQ,eAAgB,EAAA
|
|
1
|
+
{"version":3,"file":"VariableControl.js","sources":["../../../src/components/VariableControl.tsx"],"sourcesContent":["import React from 'react';\nimport { ControlsLayout, sceneGraph, VariableValueSelectWrapper } from '@grafana/scenes';\nimport { useSceneContext } from '../hooks/hooks';\n\nexport interface Props {\n name: string;\n hideLabel?: boolean;\n layout?: ControlsLayout;\n}\n\nexport function VariableControl({ name, hideLabel, layout }: Props) {\n const scene = useSceneContext();\n const variable = sceneGraph.lookupVariable(name, scene);\n\n if (!variable) {\n return <div>Variable {name} not found</div>;\n }\n\n return (\n <VariableValueSelectWrapper key={variable.state.key} variable={variable} hideLabel={hideLabel} layout={layout} />\n );\n}\n"],"names":[],"mappings":";;;;AAUO,SAAS,eAAgB,CAAA,EAAE,IAAM,EAAA,SAAA,EAAW,QAAiB,EAAA;AAClE,EAAA,MAAM,QAAQ,eAAgB,EAAA;AAC9B,EAAA,MAAM,QAAW,GAAA,UAAA,CAAW,cAAe,CAAA,IAAA,EAAM,KAAK,CAAA;AAEtD,EAAA,IAAI,CAAC,QAAU,EAAA;AACb,IAAA,uBAAQ,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,IAAA,EAAI,WAAU,EAAA,IAAA,EAAK,YAAU,CAAA;AAAA;AAGvC,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,8BAA2B,GAAK,EAAA,QAAA,CAAS,MAAM,GAAK,EAAA,QAAA,EAAoB,WAAsB,MAAgB,EAAA,CAAA;AAEnH;;;;"}
|
|
@@ -11,9 +11,7 @@ function VizGridLayout({ children, minWidth = 400, minHeight = 320 }) {
|
|
|
11
11
|
columnGap: theme.spacing(1),
|
|
12
12
|
rowGap: theme.spacing(1)
|
|
13
13
|
};
|
|
14
|
-
return /* @__PURE__ */ React.createElement("div", {
|
|
15
|
-
style
|
|
16
|
-
}, children);
|
|
14
|
+
return /* @__PURE__ */ React.createElement("div", { style }, children);
|
|
17
15
|
}
|
|
18
16
|
|
|
19
17
|
export { VizGridLayout };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VizGridLayout.js","sources":["../../../src/components/VizGridLayout.tsx"],"sourcesContent":["import { useTheme2 } from '@grafana/ui';\nimport React, { CSSProperties } from 'react';\n\nexport interface Props {\n minWidth?: number;\n minHeight?: number;\n children: React.ReactNode;\n}\n\n/**\n * Simple css grid layout for visualizations\n */\nexport function VizGridLayout({ children, minWidth = 400, minHeight = 320 }: Props) {\n const theme = useTheme2();\n const style: CSSProperties = {\n display: 'grid',\n flexGrow: 1,\n gridTemplateColumns: `repeat(auto-fit, minmax(${minWidth}px, 1fr))`,\n gridAutoRows: `minmax(${minHeight}px, auto)`,\n columnGap: theme.spacing(1),\n rowGap: theme.spacing(1),\n };\n\n return <div style={style}>{children}</div>;\n}\n"],"names":[],"mappings":";;;AAYO,SAAS,cAAc,EAAE,QAAA,EAAU,WAAW,GAAK,EAAA,SAAA,GAAY,KAAc,EAAA;AAClF,EAAA,MAAM,QAAQ,SAAU,EAAA
|
|
1
|
+
{"version":3,"file":"VizGridLayout.js","sources":["../../../src/components/VizGridLayout.tsx"],"sourcesContent":["import { useTheme2 } from '@grafana/ui';\nimport React, { CSSProperties } from 'react';\n\nexport interface Props {\n minWidth?: number;\n minHeight?: number;\n children: React.ReactNode;\n}\n\n/**\n * Simple css grid layout for visualizations\n */\nexport function VizGridLayout({ children, minWidth = 400, minHeight = 320 }: Props) {\n const theme = useTheme2();\n const style: CSSProperties = {\n display: 'grid',\n flexGrow: 1,\n gridTemplateColumns: `repeat(auto-fit, minmax(${minWidth}px, 1fr))`,\n gridAutoRows: `minmax(${minHeight}px, auto)`,\n columnGap: theme.spacing(1),\n rowGap: theme.spacing(1),\n };\n\n return <div style={style}>{children}</div>;\n}\n"],"names":[],"mappings":";;;AAYO,SAAS,cAAc,EAAE,QAAA,EAAU,WAAW,GAAK,EAAA,SAAA,GAAY,KAAc,EAAA;AAClF,EAAA,MAAM,QAAQ,SAAU,EAAA;AACxB,EAAA,MAAM,KAAuB,GAAA;AAAA,IAC3B,OAAS,EAAA,MAAA;AAAA,IACT,QAAU,EAAA,CAAA;AAAA,IACV,mBAAA,EAAqB,2BAA2B,QAAQ,CAAA,SAAA,CAAA;AAAA,IACxD,YAAA,EAAc,UAAU,SAAS,CAAA,SAAA,CAAA;AAAA,IACjC,SAAA,EAAW,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,IAC1B,MAAA,EAAQ,KAAM,CAAA,OAAA,CAAQ,CAAC;AAAA,GACzB;AAEA,EAAO,uBAAA,KAAA,CAAA,aAAA,CAAC,KAAI,EAAA,EAAA,KAAA,EAAA,EAAe,QAAS,CAAA;AACtC;;;;"}
|
|
@@ -133,9 +133,7 @@ function VizPanel(props) {
|
|
|
133
133
|
collapsed,
|
|
134
134
|
prevProps
|
|
135
135
|
]);
|
|
136
|
-
return /* @__PURE__ */ React.createElement(panel.Component, {
|
|
137
|
-
model: panel
|
|
138
|
-
});
|
|
136
|
+
return /* @__PURE__ */ React.createElement(panel.Component, { model: panel });
|
|
139
137
|
}
|
|
140
138
|
function getDataProviderForVizPanel(data) {
|
|
141
139
|
if (data && !(data instanceof SceneDataNode)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VizPanel.js","sources":["../../../src/components/VizPanel.tsx"],"sourcesContent":["import React, { useEffect, useId } from 'react';\nimport {\n VizPanelMenu,\n SceneDataProvider,\n VizPanel as VizPanelObject,\n VizPanelState,\n VizConfig,\n DataProviderProxy,\n SceneDataNode,\n} from '@grafana/scenes';\nimport { usePrevious } from 'react-use';\nimport { getPanelOptionsWithDefaults } from '@grafana/data';\nimport { PanelContext } from '@grafana/ui';\nimport { writeSceneLog } from '../utils';\nimport { useSceneContext } from '../hooks/hooks';\n\nexport interface VizPanelProps {\n title: string;\n description?: string;\n dataProvider?: SceneDataProvider;\n viz: VizConfig;\n displayMode?: 'default' | 'transparent';\n hoverHeader?: boolean;\n hoverHeaderOffset?: number;\n menu?: VizPanelMenu;\n titleItems?: React.ReactNode;\n seriesLimit?: number;\n seriesLimitShowAll?: boolean;\n headerActions?: React.ReactNode;\n extendPanelContext?: (vizPanel: VizPanelObject, context: PanelContext) => void;\n collapsible?: boolean;\n collapsed?: boolean;\n}\n\nexport function VizPanel(props: VizPanelProps) {\n const {\n title,\n description,\n viz,\n dataProvider,\n displayMode,\n hoverHeader,\n hoverHeaderOffset,\n headerActions,\n menu,\n titleItems,\n extendPanelContext,\n seriesLimit,\n seriesLimitShowAll,\n collapsible,\n collapsed,\n } = props;\n\n const scene = useSceneContext();\n const key = useId();\n const prevProps = usePrevious(props);\n\n let panel = scene.findByKey<VizPanelObject>(key);\n\n if (!panel) {\n panel = new VizPanelObject({\n key: key,\n pluginId: viz.pluginId,\n title: title,\n titleItems: titleItems,\n description: description,\n options: viz.options,\n fieldConfig: viz.fieldConfig,\n pluginVersion: viz.pluginVersion,\n $data: getDataProviderForVizPanel(dataProvider),\n displayMode: displayMode,\n hoverHeader: hoverHeader,\n hoverHeaderOffset: hoverHeaderOffset,\n headerActions: headerActions,\n menu: menu,\n extendPanelContext: extendPanelContext,\n collapsible: collapsible,\n collapsed: collapsed,\n seriesLimit: seriesLimit,\n seriesLimitShowAll: seriesLimitShowAll,\n });\n }\n\n useEffect(() => scene.addToScene(panel), [panel, scene]);\n\n // Update options\n useEffect(() => {\n const stateUpdate: Partial<VizPanelState> = {};\n\n if (!prevProps) {\n return;\n }\n\n if (title !== prevProps.title) {\n stateUpdate.title = title;\n }\n\n if (description !== prevProps.description) {\n stateUpdate.description = description;\n }\n\n if (displayMode !== prevProps.displayMode) {\n stateUpdate.displayMode = displayMode;\n }\n\n if (hoverHeader !== prevProps.hoverHeader) {\n stateUpdate.hoverHeader = hoverHeader;\n }\n\n if (hoverHeaderOffset !== prevProps.hoverHeaderOffset) {\n stateUpdate.hoverHeaderOffset = hoverHeaderOffset;\n }\n\n if (menu !== prevProps.menu) {\n stateUpdate.menu = menu;\n }\n\n if (titleItems !== prevProps.titleItems) {\n stateUpdate.titleItems = titleItems;\n }\n\n if (headerActions !== prevProps.headerActions) {\n stateUpdate.headerActions = headerActions;\n }\n\n if (dataProvider !== prevProps.dataProvider) {\n stateUpdate.$data = getDataProviderForVizPanel(dataProvider);\n }\n\n if (seriesLimit !== prevProps.seriesLimit) {\n stateUpdate.seriesLimit = seriesLimit;\n }\n\n if (seriesLimitShowAll !== prevProps.seriesLimitShowAll) {\n stateUpdate.seriesLimitShowAll = seriesLimitShowAll;\n }\n\n if (collapsible !== prevProps.collapsible) {\n stateUpdate.collapsible = collapsible;\n }\n\n if (collapsed !== prevProps.collapsed) {\n stateUpdate.collapsed = collapsed;\n }\n\n if (viz !== prevProps.viz) {\n if (viz.pluginId === prevProps.viz.pluginId) {\n const plugin = panel.getPlugin();\n if (plugin) {\n const optionsWithDefaults = getPanelOptionsWithDefaults({\n plugin,\n currentOptions: viz.options,\n currentFieldConfig: viz.fieldConfig,\n isAfterPluginChange: false,\n });\n stateUpdate.options = optionsWithDefaults.options;\n stateUpdate.fieldConfig = optionsWithDefaults.fieldConfig;\n\n panel.clearFieldConfigCache();\n }\n }\n }\n\n if (Object.keys(stateUpdate).length > 0) {\n panel.setState(stateUpdate);\n writeSceneLog('VizPanel', 'Updating VizPanel state', stateUpdate);\n }\n }, [\n panel,\n title,\n description,\n displayMode,\n hoverHeader,\n hoverHeaderOffset,\n headerActions,\n menu,\n titleItems,\n viz,\n dataProvider,\n seriesLimit,\n seriesLimitShowAll,\n collapsible,\n collapsed,\n prevProps,\n ]);\n\n return <panel.Component model={panel} />;\n}\n\n/**\n * Since the useQueryRunner attaches query runners to the scene context their parent is already set\n * This proxy is to work around that.\n * TODO: Figure out a better way to handle this'\n */\nfunction getDataProviderForVizPanel(data: SceneDataProvider | undefined): SceneDataProvider | undefined {\n if (data && !(data instanceof SceneDataNode)) {\n return new DataProviderProxy({ source: data.getRef() });\n }\n return data;\n}\n"],"names":["VizPanelObject"],"mappings":";;;;;;;AAkCO,SAAS,SAAS,KAAsB,EAAA;AAC7C,EAAM,MAAA;AAAA,IACJ,KAAA;AAAA,IACA,WAAA;AAAA,IACA,GAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAA;AAAA,IACA,iBAAA;AAAA,IACA,aAAA;AAAA,IACA,IAAA;AAAA,IACA,UAAA;AAAA,IACA,kBAAA;AAAA,IACA,WAAA;AAAA,IACA,kBAAA;AAAA,IACA,WAAA;AAAA,IACA
|
|
1
|
+
{"version":3,"file":"VizPanel.js","sources":["../../../src/components/VizPanel.tsx"],"sourcesContent":["import React, { useEffect, useId } from 'react';\nimport {\n VizPanelMenu,\n SceneDataProvider,\n VizPanel as VizPanelObject,\n VizPanelState,\n VizConfig,\n DataProviderProxy,\n SceneDataNode,\n} from '@grafana/scenes';\nimport { usePrevious } from 'react-use';\nimport { getPanelOptionsWithDefaults } from '@grafana/data';\nimport { PanelContext } from '@grafana/ui';\nimport { writeSceneLog } from '../utils';\nimport { useSceneContext } from '../hooks/hooks';\n\nexport interface VizPanelProps {\n title: string;\n description?: string;\n dataProvider?: SceneDataProvider;\n viz: VizConfig;\n displayMode?: 'default' | 'transparent';\n hoverHeader?: boolean;\n hoverHeaderOffset?: number;\n menu?: VizPanelMenu;\n titleItems?: React.ReactNode;\n seriesLimit?: number;\n seriesLimitShowAll?: boolean;\n headerActions?: React.ReactNode;\n extendPanelContext?: (vizPanel: VizPanelObject, context: PanelContext) => void;\n collapsible?: boolean;\n collapsed?: boolean;\n}\n\nexport function VizPanel(props: VizPanelProps) {\n const {\n title,\n description,\n viz,\n dataProvider,\n displayMode,\n hoverHeader,\n hoverHeaderOffset,\n headerActions,\n menu,\n titleItems,\n extendPanelContext,\n seriesLimit,\n seriesLimitShowAll,\n collapsible,\n collapsed,\n } = props;\n\n const scene = useSceneContext();\n const key = useId();\n const prevProps = usePrevious(props);\n\n let panel = scene.findByKey<VizPanelObject>(key);\n\n if (!panel) {\n panel = new VizPanelObject({\n key: key,\n pluginId: viz.pluginId,\n title: title,\n titleItems: titleItems,\n description: description,\n options: viz.options,\n fieldConfig: viz.fieldConfig,\n pluginVersion: viz.pluginVersion,\n $data: getDataProviderForVizPanel(dataProvider),\n displayMode: displayMode,\n hoverHeader: hoverHeader,\n hoverHeaderOffset: hoverHeaderOffset,\n headerActions: headerActions,\n menu: menu,\n extendPanelContext: extendPanelContext,\n collapsible: collapsible,\n collapsed: collapsed,\n seriesLimit: seriesLimit,\n seriesLimitShowAll: seriesLimitShowAll,\n });\n }\n\n useEffect(() => scene.addToScene(panel), [panel, scene]);\n\n // Update options\n useEffect(() => {\n const stateUpdate: Partial<VizPanelState> = {};\n\n if (!prevProps) {\n return;\n }\n\n if (title !== prevProps.title) {\n stateUpdate.title = title;\n }\n\n if (description !== prevProps.description) {\n stateUpdate.description = description;\n }\n\n if (displayMode !== prevProps.displayMode) {\n stateUpdate.displayMode = displayMode;\n }\n\n if (hoverHeader !== prevProps.hoverHeader) {\n stateUpdate.hoverHeader = hoverHeader;\n }\n\n if (hoverHeaderOffset !== prevProps.hoverHeaderOffset) {\n stateUpdate.hoverHeaderOffset = hoverHeaderOffset;\n }\n\n if (menu !== prevProps.menu) {\n stateUpdate.menu = menu;\n }\n\n if (titleItems !== prevProps.titleItems) {\n stateUpdate.titleItems = titleItems;\n }\n\n if (headerActions !== prevProps.headerActions) {\n stateUpdate.headerActions = headerActions;\n }\n\n if (dataProvider !== prevProps.dataProvider) {\n stateUpdate.$data = getDataProviderForVizPanel(dataProvider);\n }\n\n if (seriesLimit !== prevProps.seriesLimit) {\n stateUpdate.seriesLimit = seriesLimit;\n }\n\n if (seriesLimitShowAll !== prevProps.seriesLimitShowAll) {\n stateUpdate.seriesLimitShowAll = seriesLimitShowAll;\n }\n\n if (collapsible !== prevProps.collapsible) {\n stateUpdate.collapsible = collapsible;\n }\n\n if (collapsed !== prevProps.collapsed) {\n stateUpdate.collapsed = collapsed;\n }\n\n if (viz !== prevProps.viz) {\n if (viz.pluginId === prevProps.viz.pluginId) {\n const plugin = panel.getPlugin();\n if (plugin) {\n const optionsWithDefaults = getPanelOptionsWithDefaults({\n plugin,\n currentOptions: viz.options,\n currentFieldConfig: viz.fieldConfig,\n isAfterPluginChange: false,\n });\n stateUpdate.options = optionsWithDefaults.options;\n stateUpdate.fieldConfig = optionsWithDefaults.fieldConfig;\n\n panel.clearFieldConfigCache();\n }\n }\n }\n\n if (Object.keys(stateUpdate).length > 0) {\n panel.setState(stateUpdate);\n writeSceneLog('VizPanel', 'Updating VizPanel state', stateUpdate);\n }\n }, [\n panel,\n title,\n description,\n displayMode,\n hoverHeader,\n hoverHeaderOffset,\n headerActions,\n menu,\n titleItems,\n viz,\n dataProvider,\n seriesLimit,\n seriesLimitShowAll,\n collapsible,\n collapsed,\n prevProps,\n ]);\n\n return <panel.Component model={panel} />;\n}\n\n/**\n * Since the useQueryRunner attaches query runners to the scene context their parent is already set\n * This proxy is to work around that.\n * TODO: Figure out a better way to handle this'\n */\nfunction getDataProviderForVizPanel(data: SceneDataProvider | undefined): SceneDataProvider | undefined {\n if (data && !(data instanceof SceneDataNode)) {\n return new DataProviderProxy({ source: data.getRef() });\n }\n return data;\n}\n"],"names":["VizPanelObject"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { urlUtil } from '@grafana/data';
|
|
2
2
|
import { locationSearchToObject, locationService } from '@grafana/runtime';
|
|
3
|
-
import React, { createContext,
|
|
3
|
+
import React, { createContext, useContext, useEffect, useState, useCallback, useMemo } from 'react';
|
|
4
4
|
import { useLocation } from 'react-router-dom';
|
|
5
5
|
import { useVariables, useTimeRange } from '../hooks/hooks.js';
|
|
6
6
|
|
|
@@ -13,16 +13,20 @@ const BreadcrumbContext = createContext({
|
|
|
13
13
|
});
|
|
14
14
|
function BreadcrumbProvider({ children }) {
|
|
15
15
|
const [breadcrumbs, setBreadcrumbs] = useState([]);
|
|
16
|
-
return /* @__PURE__ */ React.createElement(
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
(breadcrumb) => setBreadcrumbs((prev) => prev
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
16
|
+
return /* @__PURE__ */ React.createElement(
|
|
17
|
+
BreadcrumbContext.Provider,
|
|
18
|
+
{
|
|
19
|
+
value: {
|
|
20
|
+
breadcrumbs,
|
|
21
|
+
addBreadcrumb: useCallback((breadcrumb) => setBreadcrumbs((prev) => [...prev, breadcrumb]), []),
|
|
22
|
+
removeBreadcrumb: useCallback(
|
|
23
|
+
(breadcrumb) => setBreadcrumbs((prev) => prev.filter((b) => b.url !== breadcrumb.url)),
|
|
24
|
+
[]
|
|
25
|
+
)
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
children
|
|
29
|
+
);
|
|
26
30
|
}
|
|
27
31
|
function Breadcrumb({ text, path, extraKeys }) {
|
|
28
32
|
const { addBreadcrumb, removeBreadcrumb } = useContext(BreadcrumbContext);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BreadcrumbContext.js","sources":["../../../src/contexts/BreadcrumbContext.tsx"],"sourcesContent":["import { NavModelItem, UrlQueryMap, urlUtil } from '@grafana/data';\nimport { locationSearchToObject, locationService } from '@grafana/runtime';\nimport React, { createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react';\nimport { useLocation } from 'react-router-dom';\nimport { useTimeRange, useVariables } from '../hooks/hooks';\n\n/**\n * Code and concepts copied from https://github.com/grafana/hackathon-2023-12-grafana-react/blob/main/src/grafana-react\n *\n * These contexts & components needs some more thought and naming considerations, just a quick proof of concept for now.\n */\n\ntype BreadcrumbItem = Pick<NavModelItem, 'text' | 'url'>;\n\nexport interface BreadcrumbContextValue {\n breadcrumbs: BreadcrumbItem[];\n addBreadcrumb(breadcrumb: BreadcrumbItem): void;\n removeBreadcrumb(breadcrumb: BreadcrumbItem): void;\n}\n\nexport const BreadcrumbContext = createContext<BreadcrumbContextValue>({\n breadcrumbs: [],\n addBreadcrumb: () => {},\n removeBreadcrumb: () => {},\n});\n\nexport function BreadcrumbProvider({ children }: { children: React.ReactNode }) {\n const [breadcrumbs, setBreadcrumbs] = useState<BreadcrumbItem[]>([]);\n\n return (\n <BreadcrumbContext.Provider\n value={{\n breadcrumbs,\n addBreadcrumb: useCallback((breadcrumb: BreadcrumbItem) => setBreadcrumbs((prev) => [...prev, breadcrumb]), []),\n removeBreadcrumb: useCallback(\n (breadcrumb: BreadcrumbItem) => setBreadcrumbs((prev) => prev.filter((b) => b.url !== breadcrumb.url)),\n []\n ),\n }}\n >\n {children}\n </BreadcrumbContext.Provider>\n );\n}\n\nexport interface BreadcrumbProps {\n text: string;\n path: string;\n extraKeys?: string[];\n}\n\nexport function Breadcrumb({ text, path, extraKeys }: BreadcrumbProps): React.ReactNode {\n const { addBreadcrumb, removeBreadcrumb } = useContext(BreadcrumbContext);\n\n const buildUrl = useUrlBuilder();\n\n useEffect(() => {\n const breadcrumb = {\n text,\n url: buildUrl(path, extraKeys),\n };\n\n addBreadcrumb(breadcrumb);\n\n return () => {\n removeBreadcrumb(breadcrumb);\n };\n }, [text, path, extraKeys, addBreadcrumb, buildUrl, removeBreadcrumb]);\n\n return null;\n}\n\nfunction useUrlBuilder() {\n const queryParams = useQueryParams()[0];\n const variables = useVariables();\n const [_, timeRange] = useTimeRange();\n\n return useCallback(\n (urlBase: string, extraKeys: string[] | undefined) => {\n const params: UrlQueryMap = {};\n\n for (const v of variables) {\n if (v.urlSync && !v.state.skipUrlSync) {\n const state = v.urlSync.getUrlState();\n Object.assign(params, state);\n }\n }\n\n if (timeRange.urlSync) {\n const state = timeRange.urlSync.getUrlState();\n Object.assign(params, state);\n }\n\n if (extraKeys) {\n for (const extra of extraKeys) {\n if (queryParams[extra]) {\n params[extra] = queryParams[extra];\n }\n }\n }\n\n return urlUtil.renderUrl(urlBase, params);\n },\n [variables, queryParams, timeRange]\n );\n}\n\nfunction useQueryParams(): [UrlQueryMap, (values: UrlQueryMap, replace?: boolean) => void] {\n const { search } = useLocation();\n const queryParams = useMemo(() => locationSearchToObject(search || ''), [search]);\n const update = useCallback((values: UrlQueryMap, replace?: boolean) => locationService.partial(values, replace), []);\n return [queryParams, update];\n}\n"],"names":[],"mappings":";;;;;;AAoBO,MAAM,oBAAoB,aAAsC,CAAA;AAAA,EACrE,aAAa,EAAC;AAAA,EACd,eAAe,MAAM;AAAA,GAAC;AAAA,EACtB,kBAAkB,MAAM;AAAA
|
|
1
|
+
{"version":3,"file":"BreadcrumbContext.js","sources":["../../../src/contexts/BreadcrumbContext.tsx"],"sourcesContent":["import { NavModelItem, UrlQueryMap, urlUtil } from '@grafana/data';\nimport { locationSearchToObject, locationService } from '@grafana/runtime';\nimport React, { createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react';\nimport { useLocation } from 'react-router-dom';\nimport { useTimeRange, useVariables } from '../hooks/hooks';\n\n/**\n * Code and concepts copied from https://github.com/grafana/hackathon-2023-12-grafana-react/blob/main/src/grafana-react\n *\n * These contexts & components needs some more thought and naming considerations, just a quick proof of concept for now.\n */\n\ntype BreadcrumbItem = Pick<NavModelItem, 'text' | 'url'>;\n\nexport interface BreadcrumbContextValue {\n breadcrumbs: BreadcrumbItem[];\n addBreadcrumb(breadcrumb: BreadcrumbItem): void;\n removeBreadcrumb(breadcrumb: BreadcrumbItem): void;\n}\n\nexport const BreadcrumbContext = createContext<BreadcrumbContextValue>({\n breadcrumbs: [],\n addBreadcrumb: () => {},\n removeBreadcrumb: () => {},\n});\n\nexport function BreadcrumbProvider({ children }: { children: React.ReactNode }) {\n const [breadcrumbs, setBreadcrumbs] = useState<BreadcrumbItem[]>([]);\n\n return (\n <BreadcrumbContext.Provider\n value={{\n breadcrumbs,\n addBreadcrumb: useCallback((breadcrumb: BreadcrumbItem) => setBreadcrumbs((prev) => [...prev, breadcrumb]), []),\n removeBreadcrumb: useCallback(\n (breadcrumb: BreadcrumbItem) => setBreadcrumbs((prev) => prev.filter((b) => b.url !== breadcrumb.url)),\n []\n ),\n }}\n >\n {children}\n </BreadcrumbContext.Provider>\n );\n}\n\nexport interface BreadcrumbProps {\n text: string;\n path: string;\n extraKeys?: string[];\n}\n\nexport function Breadcrumb({ text, path, extraKeys }: BreadcrumbProps): React.ReactNode {\n const { addBreadcrumb, removeBreadcrumb } = useContext(BreadcrumbContext);\n\n const buildUrl = useUrlBuilder();\n\n useEffect(() => {\n const breadcrumb = {\n text,\n url: buildUrl(path, extraKeys),\n };\n\n addBreadcrumb(breadcrumb);\n\n return () => {\n removeBreadcrumb(breadcrumb);\n };\n }, [text, path, extraKeys, addBreadcrumb, buildUrl, removeBreadcrumb]);\n\n return null;\n}\n\nfunction useUrlBuilder() {\n const queryParams = useQueryParams()[0];\n const variables = useVariables();\n const [_, timeRange] = useTimeRange();\n\n return useCallback(\n (urlBase: string, extraKeys: string[] | undefined) => {\n const params: UrlQueryMap = {};\n\n for (const v of variables) {\n if (v.urlSync && !v.state.skipUrlSync) {\n const state = v.urlSync.getUrlState();\n Object.assign(params, state);\n }\n }\n\n if (timeRange.urlSync) {\n const state = timeRange.urlSync.getUrlState();\n Object.assign(params, state);\n }\n\n if (extraKeys) {\n for (const extra of extraKeys) {\n if (queryParams[extra]) {\n params[extra] = queryParams[extra];\n }\n }\n }\n\n return urlUtil.renderUrl(urlBase, params);\n },\n [variables, queryParams, timeRange]\n );\n}\n\nfunction useQueryParams(): [UrlQueryMap, (values: UrlQueryMap, replace?: boolean) => void] {\n const { search } = useLocation();\n const queryParams = useMemo(() => locationSearchToObject(search || ''), [search]);\n const update = useCallback((values: UrlQueryMap, replace?: boolean) => locationService.partial(values, replace), []);\n return [queryParams, update];\n}\n"],"names":[],"mappings":";;;;;;AAoBO,MAAM,oBAAoB,aAAsC,CAAA;AAAA,EACrE,aAAa,EAAC;AAAA,EACd,eAAe,MAAM;AAAA,GAAC;AAAA,EACtB,kBAAkB,MAAM;AAAA;AAC1B,CAAC;AAEe,SAAA,kBAAA,CAAmB,EAAE,QAAA,EAA2C,EAAA;AAC9E,EAAA,MAAM,CAAC,WAAa,EAAA,cAAc,CAAI,GAAA,QAAA,CAA2B,EAAE,CAAA;AAEnE,EACE,uBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,iBAAkB,CAAA,QAAA;AAAA,IAAlB;AAAA,MACC,KAAO,EAAA;AAAA,QACL,WAAA;AAAA,QACA,aAAe,EAAA,WAAA,CAAY,CAAC,UAAA,KAA+B,eAAe,CAAC,IAAA,KAAS,CAAC,GAAG,IAAM,EAAA,UAAU,CAAC,CAAA,EAAG,EAAE,CAAA;AAAA,QAC9G,gBAAkB,EAAA,WAAA;AAAA,UAChB,CAAC,UAAA,KAA+B,cAAe,CAAA,CAAC,IAAS,KAAA,IAAA,CAAK,MAAO,CAAA,CAAC,CAAM,KAAA,CAAA,CAAE,GAAQ,KAAA,UAAA,CAAW,GAAG,CAAC,CAAA;AAAA,UACrG;AAAC;AACH;AACF,KAAA;AAAA,IAEC;AAAA,GACH;AAEJ;AAQO,SAAS,UAAW,CAAA,EAAE,IAAM,EAAA,IAAA,EAAM,WAA+C,EAAA;AACtF,EAAA,MAAM,EAAE,aAAA,EAAe,gBAAiB,EAAA,GAAI,WAAW,iBAAiB,CAAA;AAExE,EAAA,MAAM,WAAW,aAAc,EAAA;AAE/B,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,UAAa,GAAA;AAAA,MACjB,IAAA;AAAA,MACA,GAAA,EAAK,QAAS,CAAA,IAAA,EAAM,SAAS;AAAA,KAC/B;AAEA,IAAA,aAAA,CAAc,UAAU,CAAA;AAExB,IAAA,OAAO,MAAM;AACX,MAAA,gBAAA,CAAiB,UAAU,CAAA;AAAA,KAC7B;AAAA,GACF,EAAG,CAAC,IAAM,EAAA,IAAA,EAAM,WAAW,aAAe,EAAA,QAAA,EAAU,gBAAgB,CAAC,CAAA;AAErE,EAAO,OAAA,IAAA;AACT;AAEA,SAAS,aAAgB,GAAA;AACvB,EAAM,MAAA,WAAA,GAAc,cAAe,EAAA,CAAE,CAAC,CAAA;AACtC,EAAA,MAAM,YAAY,YAAa,EAAA;AAC/B,EAAA,MAAM,CAAC,CAAA,EAAG,SAAS,CAAA,GAAI,YAAa,EAAA;AAEpC,EAAO,OAAA,WAAA;AAAA,IACL,CAAC,SAAiB,SAAoC,KAAA;AACpD,MAAA,MAAM,SAAsB,EAAC;AAE7B,MAAA,KAAA,MAAW,KAAK,SAAW,EAAA;AACzB,QAAA,IAAI,CAAE,CAAA,OAAA,IAAW,CAAC,CAAA,CAAE,MAAM,WAAa,EAAA;AACrC,UAAM,MAAA,KAAA,GAAQ,CAAE,CAAA,OAAA,CAAQ,WAAY,EAAA;AACpC,UAAO,MAAA,CAAA,MAAA,CAAO,QAAQ,KAAK,CAAA;AAAA;AAC7B;AAGF,MAAA,IAAI,UAAU,OAAS,EAAA;AACrB,QAAM,MAAA,KAAA,GAAQ,SAAU,CAAA,OAAA,CAAQ,WAAY,EAAA;AAC5C,QAAO,MAAA,CAAA,MAAA,CAAO,QAAQ,KAAK,CAAA;AAAA;AAG7B,MAAA,IAAI,SAAW,EAAA;AACb,QAAA,KAAA,MAAW,SAAS,SAAW,EAAA;AAC7B,UAAI,IAAA,WAAA,CAAY,KAAK,CAAG,EAAA;AACtB,YAAO,MAAA,CAAA,KAAK,CAAI,GAAA,WAAA,CAAY,KAAK,CAAA;AAAA;AACnC;AACF;AAGF,MAAO,OAAA,OAAA,CAAQ,SAAU,CAAA,OAAA,EAAS,MAAM,CAAA;AAAA,KAC1C;AAAA,IACA,CAAC,SAAW,EAAA,WAAA,EAAa,SAAS;AAAA,GACpC;AACF;AAEA,SAAS,cAAkF,GAAA;AACzF,EAAM,MAAA,EAAE,MAAO,EAAA,GAAI,WAAY,EAAA;AAC/B,EAAM,MAAA,WAAA,GAAc,QAAQ,MAAM,sBAAA,CAAuB,UAAU,EAAE,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAChF,EAAM,MAAA,MAAA,GAAS,WAAY,CAAA,CAAC,MAAqB,EAAA,OAAA,KAAsB,eAAgB,CAAA,OAAA,CAAQ,MAAQ,EAAA,OAAO,CAAG,EAAA,EAAE,CAAA;AACnH,EAAO,OAAA,CAAC,aAAa,MAAM,CAAA;AAC7B;;;;"}
|
|
@@ -1,32 +1,14 @@
|
|
|
1
1
|
import { SceneObjectBase, NewSceneObjectAddedEvent, SceneVariableSet } from '@grafana/scenes';
|
|
2
2
|
import { writeSceneLog } from '../utils.js';
|
|
3
3
|
|
|
4
|
-
var __defProp = Object.defineProperty;
|
|
5
|
-
var __defProps = Object.defineProperties;
|
|
6
|
-
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
7
|
-
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
8
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
9
|
-
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
10
|
-
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
11
|
-
var __spreadValues = (a, b) => {
|
|
12
|
-
for (var prop in b || (b = {}))
|
|
13
|
-
if (__hasOwnProp.call(b, prop))
|
|
14
|
-
__defNormalProp(a, prop, b[prop]);
|
|
15
|
-
if (__getOwnPropSymbols)
|
|
16
|
-
for (var prop of __getOwnPropSymbols(b)) {
|
|
17
|
-
if (__propIsEnum.call(b, prop))
|
|
18
|
-
__defNormalProp(a, prop, b[prop]);
|
|
19
|
-
}
|
|
20
|
-
return a;
|
|
21
|
-
};
|
|
22
|
-
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
23
4
|
class SceneContextObject extends SceneObjectBase {
|
|
24
5
|
constructor(state) {
|
|
25
6
|
var _a, _b;
|
|
26
|
-
super(
|
|
7
|
+
super({
|
|
8
|
+
...state,
|
|
27
9
|
children: (_a = state == null ? void 0 : state.children) != null ? _a : [],
|
|
28
10
|
childContexts: (_b = state == null ? void 0 : state.childContexts) != null ? _b : []
|
|
29
|
-
})
|
|
11
|
+
});
|
|
30
12
|
}
|
|
31
13
|
addToScene(obj) {
|
|
32
14
|
this.publishEvent(new NewSceneObjectAddedEvent(obj), true);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SceneContextObject.js","sources":["../../../src/contexts/SceneContextObject.tsx"],"sourcesContent":["import {\n SceneObjectBase,\n SceneObject,\n SceneObjectState,\n SceneVariable,\n SceneVariableSet,\n NewSceneObjectAddedEvent,\n} from '@grafana/scenes';\nimport { writeSceneLog } from '../utils';\n\nexport interface SceneContextObjectState extends SceneObjectState {\n childContexts?: SceneContextObject[];\n children: SceneObject[];\n}\n\nexport class SceneContextObject extends SceneObjectBase<SceneContextObjectState> {\n public constructor(state?: Partial<SceneContextObjectState>) {\n super({\n ...state,\n children: state?.children ?? [],\n childContexts: state?.childContexts ?? [],\n });\n }\n\n public addToScene(obj: SceneObject) {\n this.publishEvent(new NewSceneObjectAddedEvent(obj), true);\n\n this.setState({ children: [...this.state.children, obj] });\n writeSceneLog('SceneContext', `Adding to scene: ${obj.constructor.name} key: ${obj.state.key}`);\n\n const deactivate = obj.activate();\n\n return () => {\n writeSceneLog('SceneContext', `Removing from scene: ${obj.constructor.name} key: ${obj.state.key}`);\n this.setState({ children: this.state.children.filter((x) => x !== obj) });\n\n deactivate();\n };\n }\n\n public findByKey<T>(key: string): T | undefined {\n return this.state.children.find((x) => x.state.key === key) as T;\n }\n\n public findVariable<T>(name: string): T | undefined {\n const variables = this.state.$variables as SceneVariableSet;\n if (!variables) {\n return;\n }\n\n return variables.getByName(name) as T;\n }\n\n public addVariable(variable: SceneVariable) {\n let set = this.state.$variables as SceneVariableSet;\n\n this.publishEvent(new NewSceneObjectAddedEvent(variable), true);\n\n if (set) {\n set.setState({ variables: [...set.state.variables, variable] });\n } else {\n set = new SceneVariableSet({ variables: [variable] });\n this.setState({ $variables: set });\n }\n\n writeSceneLog('SceneContext', `Adding variable: ${variable.constructor.name} key: ${variable.state.key}`);\n\n return () => {\n set.setState({ variables: set.state.variables.filter((x) => x !== variable) });\n writeSceneLog('SceneContext', `Removing variable: ${variable.constructor.name} key: ${variable.state.key}`);\n };\n }\n\n public addChildContext(ctx: SceneContextObject) {\n this.publishEvent(new NewSceneObjectAddedEvent(ctx), true);\n\n this.setState({ childContexts: [...(this.state.childContexts ?? []), ctx] });\n\n writeSceneLog('SceneContext', `Adding child context: ${ctx.constructor.name} key: ${ctx.state.key}`);\n }\n\n public removeChildContext(ctx: SceneContextObject) {\n this.setState({\n childContexts: this.state.childContexts?.filter((context) => ctx !== context),\n });\n\n writeSceneLog('SceneContext', `Remvoing child context: ${ctx.constructor.name} key: ${ctx.state.key}`);\n }\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SceneContextObject.js","sources":["../../../src/contexts/SceneContextObject.tsx"],"sourcesContent":["import {\n SceneObjectBase,\n SceneObject,\n SceneObjectState,\n SceneVariable,\n SceneVariableSet,\n NewSceneObjectAddedEvent,\n} from '@grafana/scenes';\nimport { writeSceneLog } from '../utils';\n\nexport interface SceneContextObjectState extends SceneObjectState {\n childContexts?: SceneContextObject[];\n children: SceneObject[];\n}\n\nexport class SceneContextObject extends SceneObjectBase<SceneContextObjectState> {\n public constructor(state?: Partial<SceneContextObjectState>) {\n super({\n ...state,\n children: state?.children ?? [],\n childContexts: state?.childContexts ?? [],\n });\n }\n\n public addToScene(obj: SceneObject) {\n this.publishEvent(new NewSceneObjectAddedEvent(obj), true);\n\n this.setState({ children: [...this.state.children, obj] });\n writeSceneLog('SceneContext', `Adding to scene: ${obj.constructor.name} key: ${obj.state.key}`);\n\n const deactivate = obj.activate();\n\n return () => {\n writeSceneLog('SceneContext', `Removing from scene: ${obj.constructor.name} key: ${obj.state.key}`);\n this.setState({ children: this.state.children.filter((x) => x !== obj) });\n\n deactivate();\n };\n }\n\n public findByKey<T>(key: string): T | undefined {\n return this.state.children.find((x) => x.state.key === key) as T;\n }\n\n public findVariable<T>(name: string): T | undefined {\n const variables = this.state.$variables as SceneVariableSet;\n if (!variables) {\n return;\n }\n\n return variables.getByName(name) as T;\n }\n\n public addVariable(variable: SceneVariable) {\n let set = this.state.$variables as SceneVariableSet;\n\n this.publishEvent(new NewSceneObjectAddedEvent(variable), true);\n\n if (set) {\n set.setState({ variables: [...set.state.variables, variable] });\n } else {\n set = new SceneVariableSet({ variables: [variable] });\n this.setState({ $variables: set });\n }\n\n writeSceneLog('SceneContext', `Adding variable: ${variable.constructor.name} key: ${variable.state.key}`);\n\n return () => {\n set.setState({ variables: set.state.variables.filter((x) => x !== variable) });\n writeSceneLog('SceneContext', `Removing variable: ${variable.constructor.name} key: ${variable.state.key}`);\n };\n }\n\n public addChildContext(ctx: SceneContextObject) {\n this.publishEvent(new NewSceneObjectAddedEvent(ctx), true);\n\n this.setState({ childContexts: [...(this.state.childContexts ?? []), ctx] });\n\n writeSceneLog('SceneContext', `Adding child context: ${ctx.constructor.name} key: ${ctx.state.key}`);\n }\n\n public removeChildContext(ctx: SceneContextObject) {\n this.setState({\n childContexts: this.state.childContexts?.filter((context) => ctx !== context),\n });\n\n writeSceneLog('SceneContext', `Remvoing child context: ${ctx.constructor.name} key: ${ctx.state.key}`);\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -31,17 +31,11 @@ function SceneContextProvider({ children, timeRange, withQueryController }) {
|
|
|
31
31
|
if (!childContext) {
|
|
32
32
|
return null;
|
|
33
33
|
}
|
|
34
|
-
const innerProvider = /* @__PURE__ */ React.createElement(SceneContext.Provider, {
|
|
35
|
-
value: childContext
|
|
36
|
-
}, children);
|
|
34
|
+
const innerProvider = /* @__PURE__ */ React.createElement(SceneContext.Provider, { value: childContext }, children);
|
|
37
35
|
if (parentContext) {
|
|
38
36
|
return innerProvider;
|
|
39
37
|
}
|
|
40
|
-
return /* @__PURE__ */ React.createElement(UrlSyncContextProvider, {
|
|
41
|
-
scene: childContext,
|
|
42
|
-
updateUrlOnInit: true,
|
|
43
|
-
createBrowserHistorySteps: true
|
|
44
|
-
}, innerProvider);
|
|
38
|
+
return /* @__PURE__ */ React.createElement(UrlSyncContextProvider, { scene: childContext, updateUrlOnInit: true, createBrowserHistorySteps: true }, innerProvider);
|
|
45
39
|
}
|
|
46
40
|
|
|
47
41
|
export { SceneContext, SceneContextProvider };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SceneContextProvider.js","sources":["../../../src/contexts/SceneContextProvider.tsx"],"sourcesContent":["import React, { createContext, useContext, useEffect, useState } from 'react';\nimport { SceneTimeRangeState, SceneTimeRange, behaviors, UrlSyncContextProvider } from '@grafana/scenes';\n\nimport { SceneContextObject, SceneContextObjectState } from './SceneContextObject';\n\nexport const SceneContext = createContext<SceneContextObject | null>(null);\n\nexport interface SceneContextProviderProps {\n /**\n * Only the initial time range, cannot be used to update time range\n **/\n timeRange?: Partial<SceneTimeRangeState>;\n /**\n * This makes it possbile to view running state of queries via\n * refresh picker and also cancel all queries in the scene.\n */\n withQueryController?: boolean;\n /**\n * Children\n */\n children: React.ReactNode;\n}\n\n/**\n * Wrapps the react children in a SceneContext\n */\nexport function SceneContextProvider({ children, timeRange, withQueryController }: SceneContextProviderProps) {\n const parentContext = useContext(SceneContext);\n const [childContext, setChildContext] = useState<SceneContextObject | undefined>();\n\n // Becasue timeRange is not part of useEffect dependencies\n const initialTimeRange = timeRange;\n\n useEffect(() => {\n const state: SceneContextObjectState = { children: [] };\n\n if (withQueryController) {\n state.$behaviors = [new behaviors.SceneQueryController()];\n }\n\n if (initialTimeRange) {\n state.$timeRange = new SceneTimeRange(initialTimeRange);\n }\n\n const childContext = new SceneContextObject(state);\n\n if (parentContext) {\n parentContext.addChildContext(childContext);\n }\n\n const deactivate = childContext.activate();\n setChildContext(childContext);\n\n return () => {\n deactivate();\n\n if (parentContext) {\n parentContext.removeChildContext(childContext);\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [parentContext, withQueryController]);\n\n if (!childContext) {\n return null;\n }\n\n const innerProvider = <SceneContext.Provider value={childContext}>{children}</SceneContext.Provider>;\n\n if (parentContext) {\n return innerProvider;\n }\n\n // For root context we wrap the provider in a UrlSyncWrapper that handles the hook that updates state on location changes\n return (\n <UrlSyncContextProvider scene={childContext} updateUrlOnInit={true} createBrowserHistorySteps={true}>\n {innerProvider}\n </UrlSyncContextProvider>\n );\n}\n"],"names":["childContext"],"mappings":";;;;AAKa,MAAA,YAAA,GAAe,cAAyC,IAAI
|
|
1
|
+
{"version":3,"file":"SceneContextProvider.js","sources":["../../../src/contexts/SceneContextProvider.tsx"],"sourcesContent":["import React, { createContext, useContext, useEffect, useState } from 'react';\nimport { SceneTimeRangeState, SceneTimeRange, behaviors, UrlSyncContextProvider } from '@grafana/scenes';\n\nimport { SceneContextObject, SceneContextObjectState } from './SceneContextObject';\n\nexport const SceneContext = createContext<SceneContextObject | null>(null);\n\nexport interface SceneContextProviderProps {\n /**\n * Only the initial time range, cannot be used to update time range\n **/\n timeRange?: Partial<SceneTimeRangeState>;\n /**\n * This makes it possbile to view running state of queries via\n * refresh picker and also cancel all queries in the scene.\n */\n withQueryController?: boolean;\n /**\n * Children\n */\n children: React.ReactNode;\n}\n\n/**\n * Wrapps the react children in a SceneContext\n */\nexport function SceneContextProvider({ children, timeRange, withQueryController }: SceneContextProviderProps) {\n const parentContext = useContext(SceneContext);\n const [childContext, setChildContext] = useState<SceneContextObject | undefined>();\n\n // Becasue timeRange is not part of useEffect dependencies\n const initialTimeRange = timeRange;\n\n useEffect(() => {\n const state: SceneContextObjectState = { children: [] };\n\n if (withQueryController) {\n state.$behaviors = [new behaviors.SceneQueryController()];\n }\n\n if (initialTimeRange) {\n state.$timeRange = new SceneTimeRange(initialTimeRange);\n }\n\n const childContext = new SceneContextObject(state);\n\n if (parentContext) {\n parentContext.addChildContext(childContext);\n }\n\n const deactivate = childContext.activate();\n setChildContext(childContext);\n\n return () => {\n deactivate();\n\n if (parentContext) {\n parentContext.removeChildContext(childContext);\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [parentContext, withQueryController]);\n\n if (!childContext) {\n return null;\n }\n\n const innerProvider = <SceneContext.Provider value={childContext}>{children}</SceneContext.Provider>;\n\n if (parentContext) {\n return innerProvider;\n }\n\n // For root context we wrap the provider in a UrlSyncWrapper that handles the hook that updates state on location changes\n return (\n <UrlSyncContextProvider scene={childContext} updateUrlOnInit={true} createBrowserHistorySteps={true}>\n {innerProvider}\n </UrlSyncContextProvider>\n );\n}\n"],"names":["childContext"],"mappings":";;;;AAKa,MAAA,YAAA,GAAe,cAAyC,IAAI;AAqBlE,SAAS,oBAAqB,CAAA,EAAE,QAAU,EAAA,SAAA,EAAW,qBAAkD,EAAA;AAC5G,EAAM,MAAA,aAAA,GAAgB,WAAW,YAAY,CAAA;AAC7C,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,QAAyC,EAAA;AAGjF,EAAA,MAAM,gBAAmB,GAAA,SAAA;AAEzB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,KAAiC,GAAA,EAAE,QAAU,EAAA,EAAG,EAAA;AAEtD,IAAA,IAAI,mBAAqB,EAAA;AACvB,MAAA,KAAA,CAAM,UAAa,GAAA,CAAC,IAAI,SAAA,CAAU,sBAAsB,CAAA;AAAA;AAG1D,IAAA,IAAI,gBAAkB,EAAA;AACpB,MAAM,KAAA,CAAA,UAAA,GAAa,IAAI,cAAA,CAAe,gBAAgB,CAAA;AAAA;AAGxD,IAAMA,MAAAA,aAAAA,GAAe,IAAI,kBAAA,CAAmB,KAAK,CAAA;AAEjD,IAAA,IAAI,aAAe,EAAA;AACjB,MAAA,aAAA,CAAc,gBAAgBA,aAAY,CAAA;AAAA;AAG5C,IAAM,MAAA,UAAA,GAAaA,cAAa,QAAS,EAAA;AACzC,IAAA,eAAA,CAAgBA,aAAY,CAAA;AAE5B,IAAA,OAAO,MAAM;AACX,MAAW,UAAA,EAAA;AAEX,MAAA,IAAI,aAAe,EAAA;AACjB,QAAA,aAAA,CAAc,mBAAmBA,aAAY,CAAA;AAAA;AAC/C,KACF;AAAA,GAEC,EAAA,CAAC,aAAe,EAAA,mBAAmB,CAAC,CAAA;AAEvC,EAAA,IAAI,CAAC,YAAc,EAAA;AACjB,IAAO,OAAA,IAAA;AAAA;AAGT,EAAA,MAAM,gCAAiB,KAAA,CAAA,aAAA,CAAA,YAAA,CAAa,UAAb,EAAsB,KAAA,EAAO,gBAAe,QAAS,CAAA;AAE5E,EAAA,IAAI,aAAe,EAAA;AACjB,IAAO,OAAA,aAAA;AAAA;AAIT,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,0BAAuB,KAAO,EAAA,YAAA,EAAc,iBAAiB,IAAM,EAAA,yBAAA,EAA2B,QAC5F,aACH,CAAA;AAEJ;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sources":["../../../src/hooks/hooks.ts"],"sourcesContent":["import { useCallback, useContext, useEffect, useState } from 'react';\nimport { SceneContext } from '../contexts/SceneContextProvider';\nimport { TimeRange } from '@grafana/data';\nimport {\n SceneVariable,\n SceneVariableValueChangedEvent,\n VariableValue,\n sceneGraph,\n SceneTimeRangeLike,\n} from '@grafana/scenes';\nimport { Subscription } from 'rxjs';\n\nexport function useSceneContext() {\n const scene = useContext(SceneContext);\n if (!scene) {\n throw new Error('Cannot find a SceneContext');\n }\n\n return scene;\n}\n\nexport function useTimeRange(): [TimeRange, SceneTimeRangeLike] {\n const scene = useSceneContext();\n const sceneTimeRange = sceneGraph.getTimeRange(scene);\n const { value } = sceneTimeRange.useState();\n\n return [value, sceneTimeRange];\n}\n\n/**\n * Only returns the variables on the closest context level.\n * We could modify it to extract all variables from the full context tree.\n */\nexport function useVariables(): SceneVariable[] {\n const scene = useSceneContext();\n const variables = sceneGraph.getVariables(scene);\n return variables.useState().variables;\n}\n\nexport interface UseUpdateWhenSceneChangesOptions {\n /** Variable names */\n variables?: string[];\n timeRange?: boolean;\n}\n\nexport interface UseUpdateWhenSceneChangesReason {\n variableName?: string;\n variableValue?: VariableValue | undefined | null;\n timeRange?: TimeRange;\n}\n\n/**\n * A utility hook to re-render the calling react component when specified variables or time range changes\n */\nexport function useUpdateWhenSceneChanges({ timeRange, variables = [] }: UseUpdateWhenSceneChangesOptions) {\n const scene = useSceneContext();\n const [updateReason, setUpdateReason] = useState<UseUpdateWhenSceneChangesReason>();\n\n useEffect(() => {\n const subscriptions = new Subscription();\n\n if (variables && variables.length > 0) {\n for (const v of variables) {\n const variable = sceneGraph.lookupVariable(v, scene);\n if (variable) {\n subscriptions.add(\n variable.subscribeToEvent(SceneVariableValueChangedEvent, () => {\n setUpdateReason({ variableName: variable.state.name, variableValue: variable.getValue() });\n })\n );\n }\n }\n }\n\n if (timeRange) {\n const tr = sceneGraph.getTimeRange(scene);\n tr.subscribeToState((newState, oldState) => {\n if (newState.value !== oldState.value) {\n setUpdateReason({ timeRange: newState.value });\n }\n });\n }\n\n return () => subscriptions.unsubscribe();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [scene, timeRange, ...variables]);\n\n return updateReason;\n}\n\n/**\n * Mainly a utility hook to re-render the calling react component when specified variables or time range changes\n */\nexport function useVariableInterpolator(options: UseUpdateWhenSceneChangesOptions) {\n const scene = useSceneContext();\n\n useUpdateWhenSceneChanges(options);\n\n return useCallback(\n (str: string) => {\n return sceneGraph.interpolate(scene, str);\n },\n [scene]\n );\n}\n"],"names":[],"mappings":";;;;;AAYO,SAAS,eAAkB,GAAA;AAChC,EAAM,MAAA,KAAA,GAAQ,WAAW,YAAY,CAAA
|
|
1
|
+
{"version":3,"file":"hooks.js","sources":["../../../src/hooks/hooks.ts"],"sourcesContent":["import { useCallback, useContext, useEffect, useState } from 'react';\nimport { SceneContext } from '../contexts/SceneContextProvider';\nimport { TimeRange } from '@grafana/data';\nimport {\n SceneVariable,\n SceneVariableValueChangedEvent,\n VariableValue,\n sceneGraph,\n SceneTimeRangeLike,\n} from '@grafana/scenes';\nimport { Subscription } from 'rxjs';\n\nexport function useSceneContext() {\n const scene = useContext(SceneContext);\n if (!scene) {\n throw new Error('Cannot find a SceneContext');\n }\n\n return scene;\n}\n\nexport function useTimeRange(): [TimeRange, SceneTimeRangeLike] {\n const scene = useSceneContext();\n const sceneTimeRange = sceneGraph.getTimeRange(scene);\n const { value } = sceneTimeRange.useState();\n\n return [value, sceneTimeRange];\n}\n\n/**\n * Only returns the variables on the closest context level.\n * We could modify it to extract all variables from the full context tree.\n */\nexport function useVariables(): SceneVariable[] {\n const scene = useSceneContext();\n const variables = sceneGraph.getVariables(scene);\n return variables.useState().variables;\n}\n\nexport interface UseUpdateWhenSceneChangesOptions {\n /** Variable names */\n variables?: string[];\n timeRange?: boolean;\n}\n\nexport interface UseUpdateWhenSceneChangesReason {\n variableName?: string;\n variableValue?: VariableValue | undefined | null;\n timeRange?: TimeRange;\n}\n\n/**\n * A utility hook to re-render the calling react component when specified variables or time range changes\n */\nexport function useUpdateWhenSceneChanges({ timeRange, variables = [] }: UseUpdateWhenSceneChangesOptions) {\n const scene = useSceneContext();\n const [updateReason, setUpdateReason] = useState<UseUpdateWhenSceneChangesReason>();\n\n useEffect(() => {\n const subscriptions = new Subscription();\n\n if (variables && variables.length > 0) {\n for (const v of variables) {\n const variable = sceneGraph.lookupVariable(v, scene);\n if (variable) {\n subscriptions.add(\n variable.subscribeToEvent(SceneVariableValueChangedEvent, () => {\n setUpdateReason({ variableName: variable.state.name, variableValue: variable.getValue() });\n })\n );\n }\n }\n }\n\n if (timeRange) {\n const tr = sceneGraph.getTimeRange(scene);\n tr.subscribeToState((newState, oldState) => {\n if (newState.value !== oldState.value) {\n setUpdateReason({ timeRange: newState.value });\n }\n });\n }\n\n return () => subscriptions.unsubscribe();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [scene, timeRange, ...variables]);\n\n return updateReason;\n}\n\n/**\n * Mainly a utility hook to re-render the calling react component when specified variables or time range changes\n */\nexport function useVariableInterpolator(options: UseUpdateWhenSceneChangesOptions) {\n const scene = useSceneContext();\n\n useUpdateWhenSceneChanges(options);\n\n return useCallback(\n (str: string) => {\n return sceneGraph.interpolate(scene, str);\n },\n [scene]\n );\n}\n"],"names":[],"mappings":";;;;;AAYO,SAAS,eAAkB,GAAA;AAChC,EAAM,MAAA,KAAA,GAAQ,WAAW,YAAY,CAAA;AACrC,EAAA,IAAI,CAAC,KAAO,EAAA;AACV,IAAM,MAAA,IAAI,MAAM,4BAA4B,CAAA;AAAA;AAG9C,EAAO,OAAA,KAAA;AACT;AAEO,SAAS,YAAgD,GAAA;AAC9D,EAAA,MAAM,QAAQ,eAAgB,EAAA;AAC9B,EAAM,MAAA,cAAA,GAAiB,UAAW,CAAA,YAAA,CAAa,KAAK,CAAA;AACpD,EAAA,MAAM,EAAE,KAAA,EAAU,GAAA,cAAA,CAAe,QAAS,EAAA;AAE1C,EAAO,OAAA,CAAC,OAAO,cAAc,CAAA;AAC/B;AAMO,SAAS,YAAgC,GAAA;AAC9C,EAAA,MAAM,QAAQ,eAAgB,EAAA;AAC9B,EAAM,MAAA,SAAA,GAAY,UAAW,CAAA,YAAA,CAAa,KAAK,CAAA;AAC/C,EAAO,OAAA,SAAA,CAAU,UAAW,CAAA,SAAA;AAC9B;AAiBO,SAAS,0BAA0B,EAAE,SAAA,EAAW,SAAY,GAAA,IAAwC,EAAA;AACzG,EAAA,MAAM,QAAQ,eAAgB,EAAA;AAC9B,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,QAA0C,EAAA;AAElF,EAAA,SAAA,CAAU,MAAM;AACd,IAAM,MAAA,aAAA,GAAgB,IAAI,YAAa,EAAA;AAEvC,IAAI,IAAA,SAAA,IAAa,SAAU,CAAA,MAAA,GAAS,CAAG,EAAA;AACrC,MAAA,KAAA,MAAW,KAAK,SAAW,EAAA;AACzB,QAAA,MAAM,QAAW,GAAA,UAAA,CAAW,cAAe,CAAA,CAAA,EAAG,KAAK,CAAA;AACnD,QAAA,IAAI,QAAU,EAAA;AACZ,UAAc,aAAA,CAAA,GAAA;AAAA,YACZ,QAAA,CAAS,gBAAiB,CAAA,8BAAA,EAAgC,MAAM;AAC9D,cAAgB,eAAA,CAAA,EAAE,cAAc,QAAS,CAAA,KAAA,CAAM,MAAM,aAAe,EAAA,QAAA,CAAS,QAAS,EAAA,EAAG,CAAA;AAAA,aAC1F;AAAA,WACH;AAAA;AACF;AACF;AAGF,IAAA,IAAI,SAAW,EAAA;AACb,MAAM,MAAA,EAAA,GAAK,UAAW,CAAA,YAAA,CAAa,KAAK,CAAA;AACxC,MAAG,EAAA,CAAA,gBAAA,CAAiB,CAAC,QAAA,EAAU,QAAa,KAAA;AAC1C,QAAI,IAAA,QAAA,CAAS,KAAU,KAAA,QAAA,CAAS,KAAO,EAAA;AACrC,UAAA,eAAA,CAAgB,EAAE,SAAA,EAAW,QAAS,CAAA,KAAA,EAAO,CAAA;AAAA;AAC/C,OACD,CAAA;AAAA;AAGH,IAAO,OAAA,MAAM,cAAc,WAAY,EAAA;AAAA,KAEtC,CAAC,KAAA,EAAO,SAAW,EAAA,GAAG,SAAS,CAAC,CAAA;AAEnC,EAAO,OAAA,YAAA;AACT;AAKO,SAAS,wBAAwB,OAA2C,EAAA;AACjF,EAAA,MAAM,QAAQ,eAAgB,EAAA;AAE9B,EAAA,yBAAA,CAA0B,OAAO,CAAA;AAEjC,EAAO,OAAA,WAAA;AAAA,IACL,CAAC,GAAgB,KAAA;AACf,MAAO,OAAA,UAAA,CAAW,WAAY,CAAA,KAAA,EAAO,GAAG,CAAA;AAAA,KAC1C;AAAA,IACA,CAAC,KAAK;AAAA,GACR;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDataTransformer.js","sources":["../../../src/hooks/useDataTransformer.ts"],"sourcesContent":["import {\n CustomTransformerDefinition,\n DataProviderProxy,\n SceneDataProvider,\n SceneDataTransformer,\n} from '@grafana/scenes';\nimport { useSceneContext } from './hooks';\nimport { useEffect, useId } from 'react';\nimport { isEqual } from 'lodash';\nimport { DataTransformerConfig } from '@grafana/schema';\n\nexport interface UseDataTransformerOptions {\n transformations: Array<DataTransformerConfig | CustomTransformerDefinition>;\n data: SceneDataProvider;\n}\n\nexport function useDataTransformer(options: UseDataTransformerOptions) {\n const scene = useSceneContext();\n const key = useId();\n\n let dataTransformer = scene.findByKey<SceneDataTransformer>(key);\n\n if (!dataTransformer) {\n dataTransformer = new SceneDataTransformer({\n key: key,\n $data: new DataProviderProxy({ source: options.data.getRef() }),\n transformations: options.transformations,\n });\n }\n\n useEffect(() => scene.addToScene(dataTransformer), [dataTransformer, scene]);\n\n useEffect(() => {\n if (!isEqual(dataTransformer.state.transformations, options.transformations)) {\n dataTransformer.setState({ transformations: options.transformations });\n dataTransformer.reprocessTransformations();\n }\n }, [dataTransformer, options.transformations]);\n\n return dataTransformer;\n}\n"],"names":[],"mappings":";;;;;AAgBO,SAAS,mBAAmB,OAAoC,EAAA;AACrE,EAAA,MAAM,QAAQ,eAAgB,EAAA
|
|
1
|
+
{"version":3,"file":"useDataTransformer.js","sources":["../../../src/hooks/useDataTransformer.ts"],"sourcesContent":["import {\n CustomTransformerDefinition,\n DataProviderProxy,\n SceneDataProvider,\n SceneDataTransformer,\n} from '@grafana/scenes';\nimport { useSceneContext } from './hooks';\nimport { useEffect, useId } from 'react';\nimport { isEqual } from 'lodash';\nimport { DataTransformerConfig } from '@grafana/schema';\n\nexport interface UseDataTransformerOptions {\n transformations: Array<DataTransformerConfig | CustomTransformerDefinition>;\n data: SceneDataProvider;\n}\n\nexport function useDataTransformer(options: UseDataTransformerOptions) {\n const scene = useSceneContext();\n const key = useId();\n\n let dataTransformer = scene.findByKey<SceneDataTransformer>(key);\n\n if (!dataTransformer) {\n dataTransformer = new SceneDataTransformer({\n key: key,\n $data: new DataProviderProxy({ source: options.data.getRef() }),\n transformations: options.transformations,\n });\n }\n\n useEffect(() => scene.addToScene(dataTransformer), [dataTransformer, scene]);\n\n useEffect(() => {\n if (!isEqual(dataTransformer.state.transformations, options.transformations)) {\n dataTransformer.setState({ transformations: options.transformations });\n dataTransformer.reprocessTransformations();\n }\n }, [dataTransformer, options.transformations]);\n\n return dataTransformer;\n}\n"],"names":[],"mappings":";;;;;AAgBO,SAAS,mBAAmB,OAAoC,EAAA;AACrE,EAAA,MAAM,QAAQ,eAAgB,EAAA;AAC9B,EAAA,MAAM,MAAM,KAAM,EAAA;AAElB,EAAI,IAAA,eAAA,GAAkB,KAAM,CAAA,SAAA,CAAgC,GAAG,CAAA;AAE/D,EAAA,IAAI,CAAC,eAAiB,EAAA;AACpB,IAAA,eAAA,GAAkB,IAAI,oBAAqB,CAAA;AAAA,MACzC,GAAA;AAAA,MACA,KAAA,EAAO,IAAI,iBAAkB,CAAA,EAAE,QAAQ,OAAQ,CAAA,IAAA,CAAK,MAAO,EAAA,EAAG,CAAA;AAAA,MAC9D,iBAAiB,OAAQ,CAAA;AAAA,KAC1B,CAAA;AAAA;AAGH,EAAU,SAAA,CAAA,MAAM,MAAM,UAAW,CAAA,eAAe,GAAG,CAAC,eAAA,EAAiB,KAAK,CAAC,CAAA;AAE3E,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,OAAQ,CAAA,eAAA,CAAgB,MAAM,eAAiB,EAAA,OAAA,CAAQ,eAAe,CAAG,EAAA;AAC5E,MAAA,eAAA,CAAgB,QAAS,CAAA,EAAE,eAAiB,EAAA,OAAA,CAAQ,iBAAiB,CAAA;AACrE,MAAA,eAAA,CAAgB,wBAAyB,EAAA;AAAA;AAC3C,GACC,EAAA,CAAC,eAAiB,EAAA,OAAA,CAAQ,eAAe,CAAC,CAAA;AAE7C,EAAO,OAAA,eAAA;AACT;;;;"}
|