@grafana/scenes 0.10.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +28 -2
- package/dist/esm/components/SceneApp/SceneAppPageView.js +2 -2
- package/dist/esm/components/SceneApp/SceneAppPageView.js.map +1 -1
- package/dist/esm/variables/macros/index.js +5 -2
- package/dist/esm/variables/macros/index.js.map +1 -1
- package/dist/esm/variables/macros/timeMacros.js +15 -2
- package/dist/esm/variables/macros/timeMacros.js.map +1 -1
- package/dist/esm/variables/macros/urlMacros.js +54 -0
- package/dist/esm/variables/macros/urlMacros.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +69 -4
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,29 @@
|
|
|
1
|
+
# v0.12.0 (Thu May 25 2023)
|
|
2
|
+
|
|
3
|
+
#### 🚀 Enhancement
|
|
4
|
+
|
|
5
|
+
- SceneAppPage: Support react elements in subtitle [#196](https://github.com/grafana/scenes/pull/196) ([@torkelo](https://github.com/torkelo))
|
|
6
|
+
|
|
7
|
+
#### Authors: 1
|
|
8
|
+
|
|
9
|
+
- Torkel Ödegaard ([@torkelo](https://github.com/torkelo))
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# v0.11.0 (Tue May 23 2023)
|
|
14
|
+
|
|
15
|
+
#### 🚀 Enhancement
|
|
16
|
+
|
|
17
|
+
- Macros: Url macro [#199](https://github.com/grafana/scenes/pull/199) ([@torkelo](https://github.com/torkelo) [@dprokop](https://github.com/dprokop))
|
|
18
|
+
- Macros: Add __timezone macro [#200](https://github.com/grafana/scenes/pull/200) ([@dprokop](https://github.com/dprokop))
|
|
19
|
+
|
|
20
|
+
#### Authors: 2
|
|
21
|
+
|
|
22
|
+
- Dominik Prokop ([@dprokop](https://github.com/dprokop))
|
|
23
|
+
- Torkel Ödegaard ([@torkelo](https://github.com/torkelo))
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
1
27
|
# v0.10.0 (Tue May 23 2023)
|
|
2
28
|
|
|
3
29
|
#### 🚀 Enhancement
|
|
@@ -73,7 +99,7 @@
|
|
|
73
99
|
|
|
74
100
|
You can now use multiple time zones in Scene. `SceneTimeRange` and `SceneTimePicker` respect time zone settings. Additionally, a new object was added, `SceneTimeZoneOverride`. It can be used to override the time zone provided by a time range object higher in the scene hierarchy. Objects within `SceneTimeZoneOverride` scope will use the closest `SceneTimeRange` range, but a locally specified time zone.
|
|
75
101
|
|
|
76
|
-
Example:
|
|
102
|
+
Example:
|
|
77
103
|
|
|
78
104
|
```ts
|
|
79
105
|
const scene = new EmbeddedScene({
|
|
@@ -85,7 +111,7 @@ const scene = new EmbeddedScene({
|
|
|
85
111
|
...
|
|
86
112
|
}),
|
|
87
113
|
// Will use global time range and locally specified time zone
|
|
88
|
-
new VizPanel({
|
|
114
|
+
new VizPanel({
|
|
89
115
|
$timeRange: new SceneTimeZoneOverride({ timeZone: 'America/New_York' }),
|
|
90
116
|
$data: new SceneQueryRunner({ ... }),
|
|
91
117
|
...
|
|
@@ -20,7 +20,6 @@ function SceneAppPageView({ page, routeProps }) {
|
|
|
20
20
|
}
|
|
21
21
|
const pageNav = {
|
|
22
22
|
text: containerState.title,
|
|
23
|
-
subTitle: containerState.subTitle,
|
|
24
23
|
img: containerState.titleImg,
|
|
25
24
|
icon: containerState.titleIcon,
|
|
26
25
|
url: getUrlWithAppState(containerState.url, containerState.preserveUrlKeys),
|
|
@@ -48,7 +47,8 @@ function SceneAppPageView({ page, routeProps }) {
|
|
|
48
47
|
return /* @__PURE__ */ React.createElement(PluginPage, {
|
|
49
48
|
pageNav,
|
|
50
49
|
actions: pageActions,
|
|
51
|
-
renderTitle: containerState.renderTitle
|
|
50
|
+
renderTitle: containerState.renderTitle,
|
|
51
|
+
subTitle: containerState.subTitle
|
|
52
52
|
}, /* @__PURE__ */ React.createElement(scene.Component, {
|
|
53
53
|
model: scene
|
|
54
54
|
}));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SceneAppPageView.js","sources":["../../../../src/components/SceneApp/SceneAppPageView.tsx"],"sourcesContent":["import { NavModelItem, UrlQueryMap } from '@grafana/data';\nimport { PluginPage } from '@grafana/runtime';\nimport React, { useLayoutEffect, useState } from 'react';\n\nimport { RouteComponentProps } from 'react-router-dom';\nimport { SceneObject } from '../../core/types';\nimport { SceneAppPage } from './SceneAppPage';\nimport { SceneAppDrilldownView, SceneAppPageLike } from './types';\nimport { getUrlWithAppState, renderSceneComponentWithRouteProps, useAppQueryParams } from './utils';\n\nexport interface Props {\n page: SceneAppPageLike;\n // activeTab?: SceneAppPageLike;\n routeProps: RouteComponentProps;\n}\n\nexport function SceneAppPageView({ page, routeProps }: Props) {\n const containerPage = getParentPageIfTab(page);\n const containerState = containerPage.useState();\n const params = useAppQueryParams();\n const scene = page.getScene(routeProps.match);\n const [initialized, setInitialized] = useState(false);\n\n useLayoutEffect(() => {\n // Before rendering scene components, we are making sure the URL sync is enabled for.\n if (!initialized) {\n containerPage.initializeScene(scene);\n setInitialized(true);\n }\n }, [initialized, scene, containerPage]);\n\n if (!initialized) {\n return null;\n }\n\n const pageNav: NavModelItem = {\n text: containerState.title,\n
|
|
1
|
+
{"version":3,"file":"SceneAppPageView.js","sources":["../../../../src/components/SceneApp/SceneAppPageView.tsx"],"sourcesContent":["import { NavModelItem, UrlQueryMap } from '@grafana/data';\nimport { PluginPage } from '@grafana/runtime';\nimport React, { useLayoutEffect, useState } from 'react';\n\nimport { RouteComponentProps } from 'react-router-dom';\nimport { SceneObject } from '../../core/types';\nimport { SceneAppPage } from './SceneAppPage';\nimport { SceneAppDrilldownView, SceneAppPageLike } from './types';\nimport { getUrlWithAppState, renderSceneComponentWithRouteProps, useAppQueryParams } from './utils';\n\nexport interface Props {\n page: SceneAppPageLike;\n // activeTab?: SceneAppPageLike;\n routeProps: RouteComponentProps;\n}\n\nexport function SceneAppPageView({ page, routeProps }: Props) {\n const containerPage = getParentPageIfTab(page);\n const containerState = containerPage.useState();\n const params = useAppQueryParams();\n const scene = page.getScene(routeProps.match);\n const [initialized, setInitialized] = useState(false);\n\n useLayoutEffect(() => {\n // Before rendering scene components, we are making sure the URL sync is enabled for.\n if (!initialized) {\n containerPage.initializeScene(scene);\n setInitialized(true);\n }\n }, [initialized, scene, containerPage]);\n\n if (!initialized) {\n return null;\n }\n\n const pageNav: NavModelItem = {\n text: containerState.title,\n img: containerState.titleImg,\n icon: containerState.titleIcon,\n url: getUrlWithAppState(containerState.url, containerState.preserveUrlKeys),\n hideFromBreadcrumbs: containerState.hideFromBreadcrumbs,\n parentItem: getParentBreadcrumbs(\n containerState.getParentPage ? containerState.getParentPage() : containerPage.parent,\n params\n ),\n };\n\n if (containerState.tabs) {\n pageNav.children = containerState.tabs.map((tab) => {\n return {\n text: tab.state.title,\n active: page === tab,\n url: getUrlWithAppState(tab.state.url, tab.state.preserveUrlKeys),\n parentItem: pageNav,\n };\n });\n }\n\n let pageActions: React.ReactNode = undefined;\n if (containerState.controls) {\n pageActions = containerState.controls.map((control) => (\n <control.Component model={control} key={control.state.key} />\n ));\n }\n\n return (\n <PluginPage\n pageNav={pageNav}\n actions={pageActions}\n renderTitle={containerState.renderTitle}\n subTitle={containerState.subTitle}\n >\n <scene.Component model={scene} />\n </PluginPage>\n );\n}\n\n/**\n * For pages that are \"tabs\" this will return the parent page\n */\nfunction getParentPageIfTab(page: SceneAppPageLike) {\n if (page.parent instanceof SceneAppPage) {\n return page.parent;\n }\n\n return page;\n}\n\nfunction getParentBreadcrumbs(parent: SceneObject | undefined, params: UrlQueryMap): NavModelItem | undefined {\n if (parent instanceof SceneAppPage) {\n return {\n text: parent.state.title,\n url: getUrlWithAppState(parent.state.url, parent.state.preserveUrlKeys),\n hideFromBreadcrumbs: parent.state.hideFromBreadcrumbs,\n parentItem: getParentBreadcrumbs(\n parent.state.getParentPage ? parent.state.getParentPage() : parent.parent,\n params\n ),\n };\n }\n\n return undefined;\n}\n\nexport interface SceneAppDrilldownViewRenderProps {\n drilldown: SceneAppDrilldownView;\n parent: SceneAppPageLike;\n routeProps: RouteComponentProps;\n}\n\nexport function SceneAppDrilldownViewRender({ drilldown, parent, routeProps }: SceneAppDrilldownViewRenderProps) {\n return renderSceneComponentWithRouteProps(parent.getDrilldownPage(drilldown, routeProps.match), routeProps);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { DataLinkBuiltInVars } from '@grafana/data';
|
|
2
|
-
import { UrlTimeRangeMacro, TimeFromAndToMacro } from './timeMacros.js';
|
|
2
|
+
import { UrlTimeRangeMacro, TimeFromAndToMacro, TimezoneMacro } from './timeMacros.js';
|
|
3
3
|
import { AllVariablesMacro } from './AllVariablesMacro.js';
|
|
4
4
|
import { ValueMacro, DataMacro, SeriesMacro, FieldMacro } from './dataMacros.js';
|
|
5
|
+
import { UrlMacro } from './urlMacros.js';
|
|
5
6
|
|
|
6
7
|
const macrosIndex = {
|
|
7
8
|
[DataLinkBuiltInVars.includeVars]: AllVariablesMacro,
|
|
@@ -10,8 +11,10 @@ const macrosIndex = {
|
|
|
10
11
|
["__data"]: DataMacro,
|
|
11
12
|
["__series"]: SeriesMacro,
|
|
12
13
|
["__field"]: FieldMacro,
|
|
14
|
+
["__url"]: UrlMacro,
|
|
13
15
|
["__from"]: TimeFromAndToMacro,
|
|
14
|
-
["__to"]: TimeFromAndToMacro
|
|
16
|
+
["__to"]: TimeFromAndToMacro,
|
|
17
|
+
["__timezone"]: TimezoneMacro
|
|
15
18
|
};
|
|
16
19
|
|
|
17
20
|
export { macrosIndex };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/variables/macros/index.ts"],"sourcesContent":["import { DataLinkBuiltInVars } from '@grafana/data';\nimport { MacroVariableConstructor } from './types';\nimport { TimeFromAndToMacro, UrlTimeRangeMacro } from './timeMacros';\nimport { AllVariablesMacro } from './AllVariablesMacro';\nimport { DataMacro, FieldMacro, SeriesMacro, ValueMacro } from './dataMacros';\n\nexport const macrosIndex: Record<string, MacroVariableConstructor> = {\n [DataLinkBuiltInVars.includeVars]: AllVariablesMacro,\n [DataLinkBuiltInVars.keepTime]: UrlTimeRangeMacro,\n ['__value']: ValueMacro,\n ['__data']: DataMacro,\n ['__series']: SeriesMacro,\n ['__field']: FieldMacro,\n ['__from']: TimeFromAndToMacro,\n ['__to']: TimeFromAndToMacro,\n};\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/variables/macros/index.ts"],"sourcesContent":["import { DataLinkBuiltInVars } from '@grafana/data';\nimport { MacroVariableConstructor } from './types';\nimport { TimeFromAndToMacro, TimezoneMacro, UrlTimeRangeMacro } from './timeMacros';\nimport { AllVariablesMacro } from './AllVariablesMacro';\nimport { DataMacro, FieldMacro, SeriesMacro, ValueMacro } from './dataMacros';\nimport { UrlMacro } from './urlMacros';\n\nexport const macrosIndex: Record<string, MacroVariableConstructor> = {\n [DataLinkBuiltInVars.includeVars]: AllVariablesMacro,\n [DataLinkBuiltInVars.keepTime]: UrlTimeRangeMacro,\n ['__value']: ValueMacro,\n ['__data']: DataMacro,\n ['__series']: SeriesMacro,\n ['__field']: FieldMacro,\n ['__url']: UrlMacro,\n ['__from']: TimeFromAndToMacro,\n ['__to']: TimeFromAndToMacro,\n ['__timezone']: TimezoneMacro,\n};\n"],"names":[],"mappings":";;;;;;AAOO,MAAM,WAAwD,GAAA;AAAA,EACnE,CAAC,oBAAoB,WAAc,GAAA,iBAAA;AAAA,EACnC,CAAC,oBAAoB,QAAW,GAAA,iBAAA;AAAA,EAChC,CAAC,SAAY,GAAA,UAAA;AAAA,EACb,CAAC,QAAW,GAAA,SAAA;AAAA,EACZ,CAAC,UAAa,GAAA,WAAA;AAAA,EACd,CAAC,SAAY,GAAA,UAAA;AAAA,EACb,CAAC,OAAU,GAAA,QAAA;AAAA,EACX,CAAC,QAAW,GAAA,kBAAA;AAAA,EACZ,CAAC,MAAS,GAAA,kBAAA;AAAA,EACV,CAAC,YAAe,GAAA,aAAA;AAClB;;;;"}
|
|
@@ -4,7 +4,7 @@ import { SkipFormattingValue } from './types.js';
|
|
|
4
4
|
|
|
5
5
|
class UrlTimeRangeMacro {
|
|
6
6
|
constructor(name, sceneObject) {
|
|
7
|
-
this.state = { name, type: "
|
|
7
|
+
this.state = { name, type: "url_variable" };
|
|
8
8
|
this._sceneObject = sceneObject;
|
|
9
9
|
}
|
|
10
10
|
getValue() {
|
|
@@ -39,6 +39,19 @@ class TimeFromAndToMacro {
|
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
|
+
class TimezoneMacro {
|
|
43
|
+
constructor(name, sceneObject) {
|
|
44
|
+
this.state = { name, type: "time_macro" };
|
|
45
|
+
this._sceneObject = sceneObject;
|
|
46
|
+
}
|
|
47
|
+
getValue() {
|
|
48
|
+
const timeRange = getTimeRange(this._sceneObject);
|
|
49
|
+
return timeRange.getTimeZone();
|
|
50
|
+
}
|
|
51
|
+
getValueText() {
|
|
52
|
+
return this.getValue();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
42
55
|
|
|
43
|
-
export { TimeFromAndToMacro, UrlTimeRangeMacro };
|
|
56
|
+
export { TimeFromAndToMacro, TimezoneMacro, UrlTimeRangeMacro };
|
|
44
57
|
//# sourceMappingURL=timeMacros.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeMacros.js","sources":["../../../../src/variables/macros/timeMacros.ts"],"sourcesContent":["import { dateTimeFormat, urlUtil } from '@grafana/data';\nimport { getTimeRange } from '../../core/sceneGraph/getTimeRange';\nimport { SceneObject } from '../../core/types';\nimport { FormatVariable } from '../interpolation/formatRegistry';\nimport { SkipFormattingValue } from './types';\n\n/**\n * Handles expressions like $__url_time_range.\n */\nexport class UrlTimeRangeMacro implements FormatVariable {\n public state: { name: string; type: string };\n private _sceneObject: SceneObject;\n\n public constructor(name: string, sceneObject: SceneObject) {\n this.state = { name: name, type: '
|
|
1
|
+
{"version":3,"file":"timeMacros.js","sources":["../../../../src/variables/macros/timeMacros.ts"],"sourcesContent":["import { dateTimeFormat, urlUtil } from '@grafana/data';\nimport { getTimeRange } from '../../core/sceneGraph/getTimeRange';\nimport { SceneObject } from '../../core/types';\nimport { FormatVariable } from '../interpolation/formatRegistry';\nimport { SkipFormattingValue } from './types';\n\n/**\n * Handles expressions like $__url_time_range.\n */\nexport class UrlTimeRangeMacro implements FormatVariable {\n public state: { name: string; type: string };\n private _sceneObject: SceneObject;\n\n public constructor(name: string, sceneObject: SceneObject) {\n this.state = { name: name, type: 'url_variable' };\n this._sceneObject = sceneObject;\n }\n\n public getValue(): SkipFormattingValue {\n const timeRange = getTimeRange(this._sceneObject);\n const urlState = timeRange.urlSync?.getUrlState();\n return new SkipFormattingValue(urlUtil.toUrlParams(urlState));\n }\n\n public getValueText?(): string {\n return '';\n }\n}\n\n/**\n * Handles expressions like $__from and $__to.\n */\nexport class TimeFromAndToMacro implements FormatVariable {\n public state: { name: string; type: string };\n private _sceneObject: SceneObject;\n\n public constructor(name: string, sceneObject: SceneObject) {\n this.state = { name: name, type: 'time_macro' };\n this._sceneObject = sceneObject;\n }\n\n public getValue() {\n const timeRange = getTimeRange(this._sceneObject);\n if (this.state.name === '__from') {\n return timeRange.state.value.from.valueOf();\n } else {\n return timeRange.state.value.to.valueOf();\n }\n }\n\n public getValueText?(): string {\n const timeRange = getTimeRange(this._sceneObject);\n if (this.state.name === '__from') {\n return dateTimeFormat(timeRange.state.value.from, { timeZone: timeRange.getTimeZone() });\n } else {\n return dateTimeFormat(timeRange.state.value.to, { timeZone: timeRange.getTimeZone() });\n }\n }\n}\n\n/**\n * Handles $__timezone expression.\n */\nexport class TimezoneMacro implements FormatVariable {\n public state: { name: string; type: string };\n private _sceneObject: SceneObject;\n\n public constructor(name: string, sceneObject: SceneObject) {\n this.state = { name: name, type: 'time_macro' };\n this._sceneObject = sceneObject;\n }\n\n public getValue() {\n const timeRange = getTimeRange(this._sceneObject);\n return timeRange.getTimeZone();\n }\n\n public getValueText?(): string {\n return this.getValue();\n }\n}\n"],"names":[],"mappings":";;;;AASO,MAAM,iBAA4C,CAAA;AAAA,EAIhD,WAAA,CAAY,MAAc,WAA0B,EAAA;AACzD,IAAA,IAAA,CAAK,KAAQ,GAAA,EAAE,IAAY,EAAA,IAAA,EAAM,cAAe,EAAA,CAAA;AAChD,IAAA,IAAA,CAAK,YAAe,GAAA,WAAA,CAAA;AAAA,GACtB;AAAA,EAEO,QAAgC,GAAA;AAlBzC,IAAA,IAAA,EAAA,CAAA;AAmBI,IAAM,MAAA,SAAA,GAAY,YAAa,CAAA,IAAA,CAAK,YAAY,CAAA,CAAA;AAChD,IAAM,MAAA,QAAA,GAAA,CAAW,EAAU,GAAA,SAAA,CAAA,OAAA,KAAV,IAAmB,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,WAAA,EAAA,CAAA;AACpC,IAAA,OAAO,IAAI,mBAAA,CAAoB,OAAQ,CAAA,WAAA,CAAY,QAAQ,CAAC,CAAA,CAAA;AAAA,GAC9D;AAAA,EAEO,YAAwB,GAAA;AAC7B,IAAO,OAAA,EAAA,CAAA;AAAA,GACT;AACF,CAAA;AAKO,MAAM,kBAA6C,CAAA;AAAA,EAIjD,WAAA,CAAY,MAAc,WAA0B,EAAA;AACzD,IAAA,IAAA,CAAK,KAAQ,GAAA,EAAE,IAAY,EAAA,IAAA,EAAM,YAAa,EAAA,CAAA;AAC9C,IAAA,IAAA,CAAK,YAAe,GAAA,WAAA,CAAA;AAAA,GACtB;AAAA,EAEO,QAAW,GAAA;AAChB,IAAM,MAAA,SAAA,GAAY,YAAa,CAAA,IAAA,CAAK,YAAY,CAAA,CAAA;AAChD,IAAI,IAAA,IAAA,CAAK,KAAM,CAAA,IAAA,KAAS,QAAU,EAAA;AAChC,MAAA,OAAO,SAAU,CAAA,KAAA,CAAM,KAAM,CAAA,IAAA,CAAK,OAAQ,EAAA,CAAA;AAAA,KACrC,MAAA;AACL,MAAA,OAAO,SAAU,CAAA,KAAA,CAAM,KAAM,CAAA,EAAA,CAAG,OAAQ,EAAA,CAAA;AAAA,KAC1C;AAAA,GACF;AAAA,EAEO,YAAwB,GAAA;AAC7B,IAAM,MAAA,SAAA,GAAY,YAAa,CAAA,IAAA,CAAK,YAAY,CAAA,CAAA;AAChD,IAAI,IAAA,IAAA,CAAK,KAAM,CAAA,IAAA,KAAS,QAAU,EAAA;AAChC,MAAO,OAAA,cAAA,CAAe,SAAU,CAAA,KAAA,CAAM,KAAM,CAAA,IAAA,EAAM,EAAE,QAAU,EAAA,SAAA,CAAU,WAAY,EAAA,EAAG,CAAA,CAAA;AAAA,KAClF,MAAA;AACL,MAAO,OAAA,cAAA,CAAe,SAAU,CAAA,KAAA,CAAM,KAAM,CAAA,EAAA,EAAI,EAAE,QAAU,EAAA,SAAA,CAAU,WAAY,EAAA,EAAG,CAAA,CAAA;AAAA,KACvF;AAAA,GACF;AACF,CAAA;AAKO,MAAM,aAAwC,CAAA;AAAA,EAI5C,WAAA,CAAY,MAAc,WAA0B,EAAA;AACzD,IAAA,IAAA,CAAK,KAAQ,GAAA,EAAE,IAAY,EAAA,IAAA,EAAM,YAAa,EAAA,CAAA;AAC9C,IAAA,IAAA,CAAK,YAAe,GAAA,WAAA,CAAA;AAAA,GACtB;AAAA,EAEO,QAAW,GAAA;AAChB,IAAM,MAAA,SAAA,GAAY,YAAa,CAAA,IAAA,CAAK,YAAY,CAAA,CAAA;AAChD,IAAA,OAAO,UAAU,WAAY,EAAA,CAAA;AAAA,GAC/B;AAAA,EAEO,YAAwB,GAAA;AAC7B,IAAA,OAAO,KAAK,QAAS,EAAA,CAAA;AAAA,GACvB;AACF;;;;"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { locationService } from '@grafana/runtime';
|
|
2
|
+
|
|
3
|
+
class UrlMacro {
|
|
4
|
+
constructor(name, _) {
|
|
5
|
+
this.state = { name, type: "url_macro" };
|
|
6
|
+
}
|
|
7
|
+
getValue(fieldPath) {
|
|
8
|
+
const location = locationService.getLocation();
|
|
9
|
+
switch (fieldPath != null ? fieldPath : "") {
|
|
10
|
+
case "params":
|
|
11
|
+
return new UrlStateFormatter(location.search);
|
|
12
|
+
case "path":
|
|
13
|
+
return location.pathname;
|
|
14
|
+
case "":
|
|
15
|
+
default:
|
|
16
|
+
return location.pathname + location.search;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
getValueText() {
|
|
20
|
+
return "";
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
class UrlStateFormatter {
|
|
24
|
+
constructor(_urlQueryParams) {
|
|
25
|
+
this._urlQueryParams = _urlQueryParams;
|
|
26
|
+
}
|
|
27
|
+
formatter(options) {
|
|
28
|
+
if (!options) {
|
|
29
|
+
return this._urlQueryParams;
|
|
30
|
+
}
|
|
31
|
+
const params = options.split(":");
|
|
32
|
+
if (params[0] === "exclude" && params.length > 1) {
|
|
33
|
+
const allParams = new URLSearchParams(this._urlQueryParams);
|
|
34
|
+
for (const param of params[1].split(",")) {
|
|
35
|
+
allParams.delete(param);
|
|
36
|
+
}
|
|
37
|
+
return `?${allParams}`;
|
|
38
|
+
}
|
|
39
|
+
if (params[0] === "include" && params.length > 1) {
|
|
40
|
+
const allParams = new URLSearchParams(this._urlQueryParams);
|
|
41
|
+
const includeOnly = params[1].split(",");
|
|
42
|
+
for (const param of allParams.keys()) {
|
|
43
|
+
if (!includeOnly.includes(param)) {
|
|
44
|
+
allParams.delete(param);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return `?${allParams}`;
|
|
48
|
+
}
|
|
49
|
+
return this._urlQueryParams;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export { UrlMacro };
|
|
54
|
+
//# sourceMappingURL=urlMacros.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"urlMacros.js","sources":["../../../../src/variables/macros/urlMacros.ts"],"sourcesContent":["import { locationService } from '@grafana/runtime';\nimport { SceneObject } from '../../core/types';\nimport { FormatVariable } from '../interpolation/formatRegistry';\nimport { CustomVariableValue } from '../types';\n\nexport class UrlMacro implements FormatVariable {\n public state: { name: string; type: string };\n\n public constructor(name: string, _: SceneObject) {\n this.state = { name: name, type: 'url_macro' };\n }\n\n public getValue(fieldPath?: string) {\n const location = locationService.getLocation();\n\n switch (fieldPath ?? '') {\n case 'params':\n return new UrlStateFormatter(location.search);\n case 'path':\n return location.pathname;\n case '':\n default:\n return location.pathname + location.search;\n }\n }\n\n public getValueText?(): string {\n return '';\n }\n}\n\nclass UrlStateFormatter implements CustomVariableValue {\n public constructor(private _urlQueryParams: string) {}\n\n public formatter(options: string): string {\n if (!options) {\n return this._urlQueryParams;\n }\n\n const params = options.split(':');\n if (params[0] === 'exclude' && params.length > 1) {\n const allParams = new URLSearchParams(this._urlQueryParams);\n for (const param of params[1].split(',')) {\n allParams.delete(param);\n }\n\n return `?${allParams}`;\n }\n\n if (params[0] === 'include' && params.length > 1) {\n const allParams = new URLSearchParams(this._urlQueryParams);\n const includeOnly = params[1].split(',');\n\n for (const param of allParams.keys()) {\n if (!includeOnly.includes(param)) {\n allParams.delete(param);\n }\n }\n\n return `?${allParams}`;\n }\n\n return this._urlQueryParams;\n }\n}\n"],"names":[],"mappings":";;AAKO,MAAM,QAAmC,CAAA;AAAA,EAGvC,WAAA,CAAY,MAAc,CAAgB,EAAA;AAC/C,IAAA,IAAA,CAAK,KAAQ,GAAA,EAAE,IAAY,EAAA,IAAA,EAAM,WAAY,EAAA,CAAA;AAAA,GAC/C;AAAA,EAEO,SAAS,SAAoB,EAAA;AAClC,IAAM,MAAA,QAAA,GAAW,gBAAgB,WAAY,EAAA,CAAA;AAE7C,IAAA,QAAQ,SAAa,IAAA,IAAA,GAAA,SAAA,GAAA,EAAA;AAAA,MACd,KAAA,QAAA;AACH,QAAO,OAAA,IAAI,iBAAkB,CAAA,QAAA,CAAS,MAAM,CAAA,CAAA;AAAA,MACzC,KAAA,MAAA;AACH,QAAA,OAAO,QAAS,CAAA,QAAA,CAAA;AAAA,MACb,KAAA,EAAA,CAAA;AAAA,MAAA;AAEH,QAAO,OAAA,QAAA,CAAS,WAAW,QAAS,CAAA,MAAA,CAAA;AAAA,KAAA;AAAA,GAE1C;AAAA,EAEO,YAAwB,GAAA;AAC7B,IAAO,OAAA,EAAA,CAAA;AAAA,GACT;AACF,CAAA;AAEA,MAAM,iBAAiD,CAAA;AAAA,EAC9C,YAAoB,eAAyB,EAAA;AAAzB,IAAA,IAAA,CAAA,eAAA,GAAA,eAAA,CAAA;AAAA,GAA0B;AAAA,EAE9C,UAAU,OAAyB,EAAA;AACxC,IAAA,IAAI,CAAC,OAAS,EAAA;AACZ,MAAA,OAAO,IAAK,CAAA,eAAA,CAAA;AAAA,KACd;AAEA,IAAM,MAAA,MAAA,GAAS,OAAQ,CAAA,KAAA,CAAM,GAAG,CAAA,CAAA;AAChC,IAAA,IAAI,MAAO,CAAA,CAAA,CAAA,KAAO,SAAa,IAAA,MAAA,CAAO,SAAS,CAAG,EAAA;AAChD,MAAA,MAAM,SAAY,GAAA,IAAI,eAAgB,CAAA,IAAA,CAAK,eAAe,CAAA,CAAA;AAC1D,MAAA,KAAA,MAAW,KAAS,IAAA,MAAA,CAAO,CAAG,CAAA,CAAA,KAAA,CAAM,GAAG,CAAG,EAAA;AACxC,QAAA,SAAA,CAAU,OAAO,KAAK,CAAA,CAAA;AAAA,OACxB;AAEA,MAAA,OAAO,CAAI,CAAA,EAAA,SAAA,CAAA,CAAA,CAAA;AAAA,KACb;AAEA,IAAA,IAAI,MAAO,CAAA,CAAA,CAAA,KAAO,SAAa,IAAA,MAAA,CAAO,SAAS,CAAG,EAAA;AAChD,MAAA,MAAM,SAAY,GAAA,IAAI,eAAgB,CAAA,IAAA,CAAK,eAAe,CAAA,CAAA;AAC1D,MAAA,MAAM,WAAc,GAAA,MAAA,CAAO,CAAG,CAAA,CAAA,KAAA,CAAM,GAAG,CAAA,CAAA;AAEvC,MAAW,KAAA,MAAA,KAAA,IAAS,SAAU,CAAA,IAAA,EAAQ,EAAA;AACpC,QAAA,IAAI,CAAC,WAAA,CAAY,QAAS,CAAA,KAAK,CAAG,EAAA;AAChC,UAAA,SAAA,CAAU,OAAO,KAAK,CAAA,CAAA;AAAA,SACxB;AAAA,OACF;AAEA,MAAA,OAAO,CAAI,CAAA,EAAA,SAAA,CAAA,CAAA,CAAA;AAAA,KACb;AAEA,IAAA,OAAO,IAAK,CAAA,eAAA,CAAA;AAAA,GACd;AACF;;;;"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1080,7 +1080,7 @@ interface SceneAppPageState extends SceneObjectState {
|
|
|
1080
1080
|
/** Page title */
|
|
1081
1081
|
title: string;
|
|
1082
1082
|
/** Page subTitle */
|
|
1083
|
-
subTitle?: string;
|
|
1083
|
+
subTitle?: string | React.ReactNode;
|
|
1084
1084
|
/**
|
|
1085
1085
|
* Customize title rendering.
|
|
1086
1086
|
* Please return an unstyled h1 tag here + any additional elements you need.
|
package/dist/index.js
CHANGED
|
@@ -977,7 +977,7 @@ class SkipFormattingValue {
|
|
|
977
977
|
|
|
978
978
|
class UrlTimeRangeMacro {
|
|
979
979
|
constructor(name, sceneObject) {
|
|
980
|
-
this.state = { name, type: "
|
|
980
|
+
this.state = { name, type: "url_variable" };
|
|
981
981
|
this._sceneObject = sceneObject;
|
|
982
982
|
}
|
|
983
983
|
getValue() {
|
|
@@ -1012,6 +1012,19 @@ class TimeFromAndToMacro {
|
|
|
1012
1012
|
}
|
|
1013
1013
|
}
|
|
1014
1014
|
}
|
|
1015
|
+
class TimezoneMacro {
|
|
1016
|
+
constructor(name, sceneObject) {
|
|
1017
|
+
this.state = { name, type: "time_macro" };
|
|
1018
|
+
this._sceneObject = sceneObject;
|
|
1019
|
+
}
|
|
1020
|
+
getValue() {
|
|
1021
|
+
const timeRange = getTimeRange(this._sceneObject);
|
|
1022
|
+
return timeRange.getTimeZone();
|
|
1023
|
+
}
|
|
1024
|
+
getValueText() {
|
|
1025
|
+
return this.getValue();
|
|
1026
|
+
}
|
|
1027
|
+
}
|
|
1015
1028
|
|
|
1016
1029
|
class AllVariablesMacro {
|
|
1017
1030
|
constructor(name, sceneObject) {
|
|
@@ -1232,6 +1245,56 @@ class FieldMacro {
|
|
|
1232
1245
|
}
|
|
1233
1246
|
}
|
|
1234
1247
|
|
|
1248
|
+
class UrlMacro {
|
|
1249
|
+
constructor(name, _) {
|
|
1250
|
+
this.state = { name, type: "url_macro" };
|
|
1251
|
+
}
|
|
1252
|
+
getValue(fieldPath) {
|
|
1253
|
+
const location = runtime.locationService.getLocation();
|
|
1254
|
+
switch (fieldPath != null ? fieldPath : "") {
|
|
1255
|
+
case "params":
|
|
1256
|
+
return new UrlStateFormatter(location.search);
|
|
1257
|
+
case "path":
|
|
1258
|
+
return location.pathname;
|
|
1259
|
+
case "":
|
|
1260
|
+
default:
|
|
1261
|
+
return location.pathname + location.search;
|
|
1262
|
+
}
|
|
1263
|
+
}
|
|
1264
|
+
getValueText() {
|
|
1265
|
+
return "";
|
|
1266
|
+
}
|
|
1267
|
+
}
|
|
1268
|
+
class UrlStateFormatter {
|
|
1269
|
+
constructor(_urlQueryParams) {
|
|
1270
|
+
this._urlQueryParams = _urlQueryParams;
|
|
1271
|
+
}
|
|
1272
|
+
formatter(options) {
|
|
1273
|
+
if (!options) {
|
|
1274
|
+
return this._urlQueryParams;
|
|
1275
|
+
}
|
|
1276
|
+
const params = options.split(":");
|
|
1277
|
+
if (params[0] === "exclude" && params.length > 1) {
|
|
1278
|
+
const allParams = new URLSearchParams(this._urlQueryParams);
|
|
1279
|
+
for (const param of params[1].split(",")) {
|
|
1280
|
+
allParams.delete(param);
|
|
1281
|
+
}
|
|
1282
|
+
return `?${allParams}`;
|
|
1283
|
+
}
|
|
1284
|
+
if (params[0] === "include" && params.length > 1) {
|
|
1285
|
+
const allParams = new URLSearchParams(this._urlQueryParams);
|
|
1286
|
+
const includeOnly = params[1].split(",");
|
|
1287
|
+
for (const param of allParams.keys()) {
|
|
1288
|
+
if (!includeOnly.includes(param)) {
|
|
1289
|
+
allParams.delete(param);
|
|
1290
|
+
}
|
|
1291
|
+
}
|
|
1292
|
+
return `?${allParams}`;
|
|
1293
|
+
}
|
|
1294
|
+
return this._urlQueryParams;
|
|
1295
|
+
}
|
|
1296
|
+
}
|
|
1297
|
+
|
|
1235
1298
|
const macrosIndex = {
|
|
1236
1299
|
[data.DataLinkBuiltInVars.includeVars]: AllVariablesMacro,
|
|
1237
1300
|
[data.DataLinkBuiltInVars.keepTime]: UrlTimeRangeMacro,
|
|
@@ -1239,8 +1302,10 @@ const macrosIndex = {
|
|
|
1239
1302
|
["__data"]: DataMacro,
|
|
1240
1303
|
["__series"]: SeriesMacro,
|
|
1241
1304
|
["__field"]: FieldMacro,
|
|
1305
|
+
["__url"]: UrlMacro,
|
|
1242
1306
|
["__from"]: TimeFromAndToMacro,
|
|
1243
|
-
["__to"]: TimeFromAndToMacro
|
|
1307
|
+
["__to"]: TimeFromAndToMacro,
|
|
1308
|
+
["__timezone"]: TimezoneMacro
|
|
1244
1309
|
};
|
|
1245
1310
|
|
|
1246
1311
|
function sceneInterpolator(sceneObject, target, scopedVars, format) {
|
|
@@ -4950,7 +5015,6 @@ function SceneAppPageView({ page, routeProps }) {
|
|
|
4950
5015
|
}
|
|
4951
5016
|
const pageNav = {
|
|
4952
5017
|
text: containerState.title,
|
|
4953
|
-
subTitle: containerState.subTitle,
|
|
4954
5018
|
img: containerState.titleImg,
|
|
4955
5019
|
icon: containerState.titleIcon,
|
|
4956
5020
|
url: getUrlWithAppState(containerState.url, containerState.preserveUrlKeys),
|
|
@@ -4978,7 +5042,8 @@ function SceneAppPageView({ page, routeProps }) {
|
|
|
4978
5042
|
return /* @__PURE__ */ React__default["default"].createElement(runtime.PluginPage, {
|
|
4979
5043
|
pageNav,
|
|
4980
5044
|
actions: pageActions,
|
|
4981
|
-
renderTitle: containerState.renderTitle
|
|
5045
|
+
renderTitle: containerState.renderTitle,
|
|
5046
|
+
subTitle: containerState.subTitle
|
|
4982
5047
|
}, /* @__PURE__ */ React__default["default"].createElement(scene.Component, {
|
|
4983
5048
|
model: scene
|
|
4984
5049
|
}));
|