@grafana/scenes 6.7.0--canary.1084.14153104341.0 → 6.7.0--canary.1086.14257790935.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 +24 -0
- package/dist/esm/behaviors/ActWhenVariableChanged.js.map +1 -1
- package/dist/esm/behaviors/CursorSync.js +3 -21
- package/dist/esm/behaviors/CursorSync.js.map +1 -1
- package/dist/esm/behaviors/LiveNowTimer.js +3 -2
- package/dist/esm/behaviors/LiveNowTimer.js.map +1 -1
- package/dist/esm/behaviors/SceneQueryController.js +7 -37
- package/dist/esm/behaviors/SceneQueryController.js.map +1 -1
- package/dist/esm/behaviors/SceneRenderProfiler.js +10 -17
- package/dist/esm/behaviors/SceneRenderProfiler.js.map +1 -1
- package/dist/esm/components/EmbeddedScene.js +1 -12
- package/dist/esm/components/EmbeddedScene.js.map +1 -1
- package/dist/esm/components/NestedScene.js +23 -30
- package/dist/esm/components/NestedScene.js.map +1 -1
- package/dist/esm/components/SceneApp/SceneApp.js +1 -11
- package/dist/esm/components/SceneApp/SceneApp.js.map +1 -1
- package/dist/esm/components/SceneApp/SceneAppPage.js +28 -47
- package/dist/esm/components/SceneApp/SceneAppPage.js.map +1 -1
- package/dist/esm/components/SceneApp/SceneAppPageView.js +14 -20
- package/dist/esm/components/SceneApp/SceneAppPageView.js.map +1 -1
- package/dist/esm/components/SceneApp/utils.js +2 -18
- package/dist/esm/components/SceneApp/utils.js.map +1 -1
- package/dist/esm/components/SceneByFrameRepeater.js +1 -3
- package/dist/esm/components/SceneByFrameRepeater.js.map +1 -1
- package/dist/esm/components/SceneByVariableRepeater.js +1 -3
- package/dist/esm/components/SceneByVariableRepeater.js.map +1 -1
- package/dist/esm/components/SceneCanvasText.js +1 -4
- package/dist/esm/components/SceneCanvasText.js.map +1 -1
- package/dist/esm/components/SceneControlsSpacer.js +1 -3
- package/dist/esm/components/SceneControlsSpacer.js.map +1 -1
- package/dist/esm/components/SceneDebugger/DebugDetails.js +11 -24
- package/dist/esm/components/SceneDebugger/DebugDetails.js.map +1 -1
- package/dist/esm/components/SceneDebugger/DebugTreeNode.js +2 -14
- package/dist/esm/components/SceneDebugger/DebugTreeNode.js.map +1 -1
- package/dist/esm/components/SceneDebugger/SceneDebugger.js +1 -29
- package/dist/esm/components/SceneDebugger/SceneDebugger.js.map +1 -1
- package/dist/esm/components/SceneReactObject.js +1 -17
- package/dist/esm/components/SceneReactObject.js.map +1 -1
- package/dist/esm/components/SceneRefreshPicker.js +23 -38
- package/dist/esm/components/SceneRefreshPicker.js.map +1 -1
- package/dist/esm/components/SceneTimePicker.js +27 -29
- package/dist/esm/components/SceneTimePicker.js.map +1 -1
- package/dist/esm/components/SceneTimeRangeCompare.js +36 -50
- package/dist/esm/components/SceneTimeRangeCompare.js.map +1 -1
- package/dist/esm/components/SceneToolbarButton.js +10 -14
- package/dist/esm/components/SceneToolbarButton.js.map +1 -1
- package/dist/esm/components/VizPanel/VizPanel.js +20 -29
- package/dist/esm/components/VizPanel/VizPanel.js.map +1 -1
- package/dist/esm/components/VizPanel/VizPanelExploreButton.js +17 -13
- package/dist/esm/components/VizPanel/VizPanelExploreButton.js.map +1 -1
- package/dist/esm/components/VizPanel/VizPanelMenu.js +18 -20
- package/dist/esm/components/VizPanel/VizPanelMenu.js.map +1 -1
- package/dist/esm/components/VizPanel/VizPanelRenderer.js +92 -122
- package/dist/esm/components/VizPanel/VizPanelRenderer.js.map +1 -1
- package/dist/esm/components/VizPanel/VizPanelSeriesLimit.js +7 -15
- package/dist/esm/components/VizPanel/VizPanelSeriesLimit.js.map +1 -1
- package/dist/esm/components/VizPanel/colorSeriesConfigFactory.js +15 -29
- package/dist/esm/components/VizPanel/colorSeriesConfigFactory.js.map +1 -1
- package/dist/esm/components/VizPanel/registerRuntimePanelPlugin.js +3 -21
- package/dist/esm/components/VizPanel/registerRuntimePanelPlugin.js.map +1 -1
- package/dist/esm/components/VizPanel/seriesVisibilityConfigFactory.js +22 -34
- package/dist/esm/components/VizPanel/seriesVisibilityConfigFactory.js.map +1 -1
- package/dist/esm/components/layout/CSSGrid/SceneCSSGridLayout.js +8 -40
- package/dist/esm/components/layout/CSSGrid/SceneCSSGridLayout.js.map +1 -1
- package/dist/esm/components/layout/LazyLoader.js +2 -35
- package/dist/esm/components/layout/LazyLoader.js.map +1 -1
- package/dist/esm/components/layout/SceneFlexLayout.js +3 -13
- package/dist/esm/components/layout/SceneFlexLayout.js.map +1 -1
- package/dist/esm/components/layout/grid/SceneGridItem.js +1 -3
- package/dist/esm/components/layout/grid/SceneGridItem.js.map +1 -1
- package/dist/esm/components/layout/grid/SceneGridLayout.js +26 -26
- package/dist/esm/components/layout/grid/SceneGridLayout.js.map +1 -1
- package/dist/esm/components/layout/grid/SceneGridLayoutRenderer.js +89 -111
- package/dist/esm/components/layout/grid/SceneGridLayoutRenderer.js.map +1 -1
- package/dist/esm/components/layout/grid/SceneGridRow.js +15 -48
- package/dist/esm/components/layout/grid/SceneGridRow.js.map +1 -1
- package/dist/esm/components/layout/grid/constants.js.map +1 -1
- package/dist/esm/components/layout/grid/types.js.map +1 -1
- package/dist/esm/components/layout/grid/utils.js +3 -21
- package/dist/esm/components/layout/grid/utils.js.map +1 -1
- package/dist/esm/components/layout/split/SplitLayout.js.map +1 -1
- package/dist/esm/components/layout/split/SplitLayoutRenderer.js +11 -14
- package/dist/esm/components/layout/split/SplitLayoutRenderer.js.map +1 -1
- package/dist/esm/components/layout/split/Splitter.js +60 -58
- package/dist/esm/components/layout/split/Splitter.js.map +1 -1
- package/dist/esm/core/PanelBuilders/FieldConfigBuilder.js +46 -23
- package/dist/esm/core/PanelBuilders/FieldConfigBuilder.js.map +1 -1
- package/dist/esm/core/PanelBuilders/FieldConfigBuilders.js +8 -8
- package/dist/esm/core/PanelBuilders/FieldConfigBuilders.js.map +1 -1
- package/dist/esm/core/PanelBuilders/FieldConfigOverridesBuilder.js.map +1 -1
- package/dist/esm/core/PanelBuilders/PanelOptionsBuilder.js +3 -0
- package/dist/esm/core/PanelBuilders/PanelOptionsBuilder.js.map +1 -1
- package/dist/esm/core/PanelBuilders/PanelOptionsBuilders.js +28 -28
- package/dist/esm/core/PanelBuilders/PanelOptionsBuilders.js.map +1 -1
- package/dist/esm/core/PanelBuilders/StandardFieldConfigBuilders.js.map +1 -1
- package/dist/esm/core/PanelBuilders/VizConfigBuilder.js +39 -0
- package/dist/esm/core/PanelBuilders/VizConfigBuilder.js.map +1 -1
- package/dist/esm/core/PanelBuilders/VizConfigBuilders.js +32 -32
- package/dist/esm/core/PanelBuilders/VizConfigBuilders.js.map +1 -1
- package/dist/esm/core/PanelBuilders/VizPanelBuilder.js +82 -21
- package/dist/esm/core/PanelBuilders/VizPanelBuilder.js.map +1 -1
- package/dist/esm/core/PanelBuilders/index.js +32 -32
- package/dist/esm/core/PanelBuilders/index.js.map +1 -1
- package/dist/esm/core/SceneComponentWrapper.js +4 -38
- package/dist/esm/core/SceneComponentWrapper.js.map +1 -1
- package/dist/esm/core/SceneDataNode.js +4 -19
- package/dist/esm/core/SceneDataNode.js.map +1 -1
- package/dist/esm/core/SceneObjectBase.js +55 -17
- package/dist/esm/core/SceneObjectBase.js.map +1 -1
- package/dist/esm/core/SceneObjectRef.js +7 -18
- package/dist/esm/core/SceneObjectRef.js.map +1 -1
- package/dist/esm/core/SceneScopesBridge.js +14 -0
- package/dist/esm/core/SceneScopesBridge.js.map +1 -1
- package/dist/esm/core/SceneTimeRange.js +9 -17
- package/dist/esm/core/SceneTimeRange.js.map +1 -1
- package/dist/esm/core/SceneTimeRangeTransformerBase.js.map +1 -1
- package/dist/esm/core/SceneTimeZoneOverride.js +7 -23
- package/dist/esm/core/SceneTimeZoneOverride.js.map +1 -1
- package/dist/esm/core/events.js.map +1 -1
- package/dist/esm/core/sceneGraph/getQueryController.js.map +1 -1
- package/dist/esm/core/sceneGraph/getTimeRange.js.map +1 -1
- package/dist/esm/core/sceneGraph/index.js +1 -1
- package/dist/esm/core/sceneGraph/index.js.map +1 -1
- package/dist/esm/core/sceneGraph/sceneGraph.js.map +1 -1
- package/dist/esm/core/sceneGraph/utils.js +1 -17
- package/dist/esm/core/sceneGraph/utils.js.map +1 -1
- package/dist/esm/core/types.js.map +1 -1
- package/dist/esm/index.js +6 -5
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/querying/DataLayersMerger.js.map +1 -1
- package/dist/esm/querying/DataProviderProxy.js.map +1 -1
- package/dist/esm/querying/ExtraQueryProvider.js.map +1 -1
- package/dist/esm/querying/RuntimeDataSource.js.map +1 -1
- package/dist/esm/querying/SceneDataLayerSet.js +9 -24
- package/dist/esm/querying/SceneDataLayerSet.js.map +1 -1
- package/dist/esm/querying/SceneDataTransformer.js +11 -24
- package/dist/esm/querying/SceneDataTransformer.js.map +1 -1
- package/dist/esm/querying/SceneQueryRunner.js +44 -33
- package/dist/esm/querying/SceneQueryRunner.js.map +1 -1
- package/dist/esm/querying/extraQueryProcessingOperator.js +3 -21
- package/dist/esm/querying/extraQueryProcessingOperator.js.map +1 -1
- package/dist/esm/querying/getEnrichedDataRequest.js.map +1 -1
- package/dist/esm/querying/layers/SceneDataLayerBase.js +16 -19
- package/dist/esm/querying/layers/SceneDataLayerBase.js.map +1 -1
- package/dist/esm/querying/layers/SceneDataLayerControls.js +15 -21
- package/dist/esm/querying/layers/SceneDataLayerControls.js.map +1 -1
- package/dist/esm/querying/layers/annotations/AnnotationsDataLayer.js +12 -30
- package/dist/esm/querying/layers/annotations/AnnotationsDataLayer.js.map +1 -1
- package/dist/esm/querying/layers/annotations/filterAnnotations.js +6 -23
- package/dist/esm/querying/layers/annotations/filterAnnotations.js.map +1 -1
- package/dist/esm/querying/layers/annotations/standardAnnotationQuery.js +19 -29
- package/dist/esm/querying/layers/annotations/standardAnnotationQuery.js.map +1 -1
- package/dist/esm/querying/layers/annotations/standardAnnotationsSupport.js +14 -34
- package/dist/esm/querying/layers/annotations/standardAnnotationsSupport.js.map +1 -1
- package/dist/esm/querying/layers/annotations/utils.js +1 -17
- package/dist/esm/querying/layers/annotations/utils.js.map +1 -1
- package/dist/esm/querying/registerQueryWithController.js.map +1 -1
- package/dist/esm/services/SceneObjectUrlSyncConfig.js.map +1 -1
- package/dist/esm/services/UniqueUrlKeyMapper.js.map +1 -1
- package/dist/esm/services/UrlSyncContextProvider.js.map +1 -1
- package/dist/esm/services/UrlSyncManager.js +11 -19
- package/dist/esm/services/UrlSyncManager.js.map +1 -1
- package/dist/esm/services/useUrlSync.js.map +1 -1
- package/dist/esm/services/utils.js.map +1 -1
- package/dist/esm/utils/ControlsLabel.js +76 -53
- package/dist/esm/utils/ControlsLabel.js.map +1 -1
- package/dist/esm/utils/LoadingIndicator.js +11 -10
- package/dist/esm/utils/LoadingIndicator.js.map +1 -1
- package/dist/esm/utils/SafeSerializableSceneObject.js +7 -18
- package/dist/esm/utils/SafeSerializableSceneObject.js.map +1 -1
- package/dist/esm/utils/compatibility/setWindowGrafanaSceneContext.js.map +1 -1
- package/dist/esm/utils/date.js.map +1 -1
- package/dist/esm/utils/evaluateTimeRange.js.map +1 -1
- package/dist/esm/utils/explore.js.map +1 -1
- package/dist/esm/utils/getCompareSeriesRefId.js.map +1 -1
- package/dist/esm/utils/getDataSource.js.map +1 -1
- package/dist/esm/utils/getMessageFromError.js.map +1 -1
- package/dist/esm/utils/metricTree.js.map +1 -1
- package/dist/esm/utils/parseUrlParam.js.map +1 -1
- package/dist/esm/utils/utils.js.map +1 -1
- package/dist/esm/utils/wrapInSafeSerializableSceneObject.js.map +1 -1
- package/dist/esm/utils/writeSceneLog.js.map +1 -1
- package/dist/esm/variables/VariableDependencyConfig.js +9 -0
- package/dist/esm/variables/VariableDependencyConfig.js.map +1 -1
- package/dist/esm/variables/VariableValueRecorder.js.map +1 -1
- package/dist/esm/variables/adhoc/AdHocFilterBuilder.js +13 -12
- package/dist/esm/variables/adhoc/AdHocFilterBuilder.js.map +1 -1
- package/dist/esm/variables/adhoc/AdHocFilterRenderer.js +129 -142
- package/dist/esm/variables/adhoc/AdHocFilterRenderer.js.map +1 -1
- package/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFilterPill.js +84 -91
- package/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFilterPill.js.map +1 -1
- package/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersAlwaysWipCombobox.js +1 -6
- package/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersAlwaysWipCombobox.js.map +1 -1
- package/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersCombobox.js +195 -194
- package/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersCombobox.js.map +1 -1
- package/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersComboboxRenderer.js +34 -28
- package/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersComboboxRenderer.js.map +1 -1
- package/dist/esm/variables/adhoc/AdHocFiltersCombobox/DropdownItem.js +28 -65
- package/dist/esm/variables/adhoc/AdHocFiltersCombobox/DropdownItem.js.map +1 -1
- package/dist/esm/variables/adhoc/AdHocFiltersCombobox/MultiValuePill.js +29 -43
- package/dist/esm/variables/adhoc/AdHocFiltersCombobox/MultiValuePill.js.map +1 -1
- package/dist/esm/variables/adhoc/AdHocFiltersCombobox/useFloatingInteractions.js +2 -1
- package/dist/esm/variables/adhoc/AdHocFiltersCombobox/useFloatingInteractions.js.map +1 -1
- package/dist/esm/variables/adhoc/AdHocFiltersCombobox/utils.js.map +1 -1
- package/dist/esm/variables/adhoc/AdHocFiltersVariable.js +56 -73
- package/dist/esm/variables/adhoc/AdHocFiltersVariable.js.map +1 -1
- package/dist/esm/variables/adhoc/AdHocFiltersVariableUrlSyncHandler.js.map +1 -1
- package/dist/esm/variables/adhoc/getAdHocFiltersFromScopes.js +1 -0
- package/dist/esm/variables/adhoc/getAdHocFiltersFromScopes.js.map +1 -1
- package/dist/esm/variables/adhoc/getAdhocOptionSearcher.js.map +1 -1
- package/dist/esm/variables/adhoc/patchGetAdhocFilters.js.map +1 -1
- package/dist/esm/variables/components/VariableValueControl.js +9 -6
- package/dist/esm/variables/components/VariableValueControl.js.map +1 -1
- package/dist/esm/variables/components/VariableValueInput.js +13 -10
- package/dist/esm/variables/components/VariableValueInput.js.map +1 -1
- package/dist/esm/variables/components/VariableValueSelect.js +90 -115
- package/dist/esm/variables/components/VariableValueSelect.js.map +1 -1
- package/dist/esm/variables/components/VariableValueSelectors.js +25 -37
- package/dist/esm/variables/components/VariableValueSelectors.js.map +1 -1
- package/dist/esm/variables/components/getOptionSearcher.js +1 -1
- package/dist/esm/variables/components/getOptionSearcher.js.map +1 -1
- package/dist/esm/variables/constants.js.map +1 -1
- package/dist/esm/variables/filter.js +6 -1
- package/dist/esm/variables/filter.js.map +1 -1
- package/dist/esm/variables/getEnrichedFiltersRequest.js.map +1 -1
- package/dist/esm/variables/groupby/GroupByVariable.js +106 -112
- package/dist/esm/variables/groupby/GroupByVariable.js.map +1 -1
- package/dist/esm/variables/groupby/GroupByVariableUrlSyncHandler.js.map +1 -1
- package/dist/esm/variables/groupby/findActiveGroupByVariablesByUid.js.map +1 -1
- package/dist/esm/variables/interpolation/ScopedVarsVariable.js.map +1 -1
- package/dist/esm/variables/interpolation/defaults.js.map +1 -1
- package/dist/esm/variables/interpolation/fieldAccessorCache.js.map +1 -1
- package/dist/esm/variables/interpolation/formatRegistry.js.map +1 -1
- package/dist/esm/variables/interpolation/sceneInterpolator.js.map +1 -1
- package/dist/esm/variables/lookupVariable.js.map +1 -1
- package/dist/esm/variables/macros/AllVariablesMacro.js.map +1 -1
- package/dist/esm/variables/macros/contextMacros.js.map +1 -1
- package/dist/esm/variables/macros/dataMacros.js.map +1 -1
- package/dist/esm/variables/macros/index.js.map +1 -1
- package/dist/esm/variables/macros/templateProxies.js +4 -21
- package/dist/esm/variables/macros/templateProxies.js.map +1 -1
- package/dist/esm/variables/macros/timeMacros.js.map +1 -1
- package/dist/esm/variables/macros/types.js.map +1 -1
- package/dist/esm/variables/macros/urlMacros.js.map +1 -1
- package/dist/esm/variables/sets/SceneVariableSet.js +44 -0
- package/dist/esm/variables/sets/SceneVariableSet.js.map +1 -1
- package/dist/esm/variables/types.js.map +1 -1
- package/dist/esm/variables/utils.js.map +1 -1
- package/dist/esm/variables/variants/ConstantVariable.js +4 -23
- package/dist/esm/variables/variants/ConstantVariable.js.map +1 -1
- package/dist/esm/variables/variants/CustomVariable.js +4 -19
- package/dist/esm/variables/variants/CustomVariable.js.map +1 -1
- package/dist/esm/variables/variants/DataSourceVariable.js +4 -19
- package/dist/esm/variables/variants/DataSourceVariable.js.map +1 -1
- package/dist/esm/variables/variants/IntervalVariable.js +17 -29
- package/dist/esm/variables/variants/IntervalVariable.js.map +1 -1
- package/dist/esm/variables/variants/LocalValueVariable.js +8 -23
- package/dist/esm/variables/variants/LocalValueVariable.js.map +1 -1
- package/dist/esm/variables/variants/MultiValueVariable.js +16 -0
- package/dist/esm/variables/variants/MultiValueVariable.js.map +1 -1
- package/dist/esm/variables/variants/TestVariable.js +5 -19
- package/dist/esm/variables/variants/TestVariable.js.map +1 -1
- package/dist/esm/variables/variants/TextBoxVariable.js +5 -22
- package/dist/esm/variables/variants/TextBoxVariable.js.map +1 -1
- package/dist/esm/variables/variants/guards.js.map +1 -1
- package/dist/esm/variables/variants/query/QueryVariable.js +8 -20
- package/dist/esm/variables/variants/query/QueryVariable.js.map +1 -1
- package/dist/esm/variables/variants/query/createQueryVariableRunner.js +6 -23
- package/dist/esm/variables/variants/query/createQueryVariableRunner.js.map +1 -1
- package/dist/esm/variables/variants/query/guards.js.map +1 -1
- package/dist/esm/variables/variants/query/toMetricFindValues.js.map +1 -1
- package/dist/esm/variables/variants/query/utils.js.map +1 -1
- package/dist/index.d.ts +40 -8
- package/dist/index.js +2103 -2820
- package/dist/index.js.map +1 -1
- package/package.json +8 -9
|
@@ -76,34 +76,22 @@ function SceneAppPageRenderer({ model }) {
|
|
|
76
76
|
for (let tabIndex = 0; tabIndex < tabs.length; tabIndex++) {
|
|
77
77
|
const tab = tabs[tabIndex];
|
|
78
78
|
if (tabIndex === 0) {
|
|
79
|
-
routes.push(/* @__PURE__ */ React.createElement(Route, {
|
|
80
|
-
key: model.state.routePath,
|
|
81
|
-
path: "",
|
|
82
|
-
element: /* @__PURE__ */ React.createElement(tab.Component, {
|
|
83
|
-
model: tab
|
|
84
|
-
})
|
|
85
|
-
}));
|
|
79
|
+
routes.push(/* @__PURE__ */ React.createElement(Route, { key: model.state.routePath, path: "", element: /* @__PURE__ */ React.createElement(tab.Component, { model: tab }) }));
|
|
86
80
|
}
|
|
87
81
|
routes.push(
|
|
88
|
-
/* @__PURE__ */ React.createElement(Route, {
|
|
89
|
-
key: tab.state.url,
|
|
90
|
-
path: tab.state.routePath,
|
|
91
|
-
element: /* @__PURE__ */ React.createElement(tab.Component, {
|
|
92
|
-
model: tab
|
|
93
|
-
})
|
|
94
|
-
})
|
|
82
|
+
/* @__PURE__ */ React.createElement(Route, { key: tab.state.url, path: tab.state.routePath, element: /* @__PURE__ */ React.createElement(tab.Component, { model: tab }) })
|
|
95
83
|
);
|
|
96
84
|
if (tab.state.drilldowns) {
|
|
97
85
|
for (const drilldown of tab.state.drilldowns) {
|
|
98
86
|
routes.push(
|
|
99
|
-
/* @__PURE__ */ React.createElement(
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
drilldown,
|
|
104
|
-
parent: tab
|
|
105
|
-
}
|
|
106
|
-
|
|
87
|
+
/* @__PURE__ */ React.createElement(
|
|
88
|
+
Route,
|
|
89
|
+
{
|
|
90
|
+
key: drilldown.routePath,
|
|
91
|
+
path: drilldown.routePath,
|
|
92
|
+
element: /* @__PURE__ */ React.createElement(SceneAppDrilldownViewRender, { drilldown, parent: tab })
|
|
93
|
+
}
|
|
94
|
+
)
|
|
107
95
|
);
|
|
108
96
|
}
|
|
109
97
|
}
|
|
@@ -112,37 +100,32 @@ function SceneAppPageRenderer({ model }) {
|
|
|
112
100
|
if (drilldowns) {
|
|
113
101
|
for (const drilldown of drilldowns) {
|
|
114
102
|
routes.push(
|
|
115
|
-
/* @__PURE__ */ React.createElement(
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
drilldown,
|
|
120
|
-
parent: model
|
|
121
|
-
}
|
|
122
|
-
|
|
103
|
+
/* @__PURE__ */ React.createElement(
|
|
104
|
+
Route,
|
|
105
|
+
{
|
|
106
|
+
key: drilldown.routePath,
|
|
107
|
+
path: drilldown.routePath,
|
|
108
|
+
Component: () => /* @__PURE__ */ React.createElement(SceneAppDrilldownViewRender, { drilldown, parent: model })
|
|
109
|
+
}
|
|
110
|
+
)
|
|
123
111
|
);
|
|
124
112
|
}
|
|
125
113
|
}
|
|
126
114
|
if (!tabs) {
|
|
127
|
-
routes.push(/* @__PURE__ */ React.createElement(Route, {
|
|
128
|
-
key: "home route",
|
|
129
|
-
path: "/",
|
|
130
|
-
element: /* @__PURE__ */ React.createElement(SceneAppPageView, {
|
|
131
|
-
page: model
|
|
132
|
-
})
|
|
133
|
-
}));
|
|
115
|
+
routes.push(/* @__PURE__ */ React.createElement(Route, { key: "home route", path: "/", element: /* @__PURE__ */ React.createElement(SceneAppPageView, { page: model }) }));
|
|
134
116
|
}
|
|
135
117
|
return /* @__PURE__ */ React.createElement(Routes, null, routes);
|
|
136
118
|
}
|
|
137
119
|
function getFallbackRoute(page) {
|
|
138
120
|
var _a, _b, _c;
|
|
139
|
-
return /* @__PURE__ */ React.createElement(
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
121
|
+
return /* @__PURE__ */ React.createElement(
|
|
122
|
+
Route,
|
|
123
|
+
{
|
|
124
|
+
key: "fallback route",
|
|
125
|
+
path: "*",
|
|
126
|
+
element: /* @__PURE__ */ React.createElement(SceneAppPageView, { page: (_c = (_b = (_a = page.state).getFallbackPage) == null ? void 0 : _b.call(_a)) != null ? _c : getDefaultFallbackPage() })
|
|
127
|
+
}
|
|
128
|
+
);
|
|
146
129
|
}
|
|
147
130
|
function getDefaultFallbackPage() {
|
|
148
131
|
return new SceneAppPage({
|
|
@@ -158,9 +141,7 @@ function getDefaultFallbackPage() {
|
|
|
158
141
|
new SceneFlexItem({
|
|
159
142
|
body: new SceneReactObject({
|
|
160
143
|
component: () => {
|
|
161
|
-
return /* @__PURE__ */ React.createElement("div", {
|
|
162
|
-
"data-testid": "default-fallback-content"
|
|
163
|
-
}, "If you found your way here using a link then there might be a bug in this application.");
|
|
144
|
+
return /* @__PURE__ */ React.createElement("div", { "data-testid": "default-fallback-content" }, "If you found your way here using a link then there might be a bug in this application.");
|
|
164
145
|
}
|
|
165
146
|
})
|
|
166
147
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SceneAppPage.js","sources":["../../../../src/components/SceneApp/SceneAppPage.tsx"],"sourcesContent":["import React from 'react';\nimport { Route, Routes } from 'react-router-dom';\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { SceneScopesBridge } from '../../core/SceneScopesBridge';\nimport { SceneComponentProps, SceneObject, isDataRequestEnricher } from '../../core/types';\nimport { EmbeddedScene } from '../EmbeddedScene';\nimport { SceneFlexItem, SceneFlexLayout } from '../layout/SceneFlexLayout';\nimport { SceneReactObject } from '../SceneReactObject';\nimport { SceneAppDrilldownViewRender, SceneAppPageView } from './SceneAppPageView';\nimport { SceneAppDrilldownView, SceneAppPageLike, SceneAppPageState, SceneRouteMatch } from './types';\n\n/**\n * Responsible for page's drilldown & tabs routing\n */\nexport class SceneAppPage extends SceneObjectBase<SceneAppPageState> implements SceneAppPageLike {\n public static Component = SceneAppPageRenderer;\n private _sceneCache = new Map<string, EmbeddedScene>();\n private _drilldownCache = new Map<string, SceneAppPageLike>();\n private _scopesBridge: SceneScopesBridge | undefined;\n\n public constructor(state: SceneAppPageState) {\n super(state);\n\n this.addActivationHandler(this._activationHandler);\n }\n\n private _activationHandler = () => {\n if (!this.state.useScopes) {\n return;\n }\n\n this._scopesBridge = sceneGraph.getScopesBridge(this);\n\n if (!this._scopesBridge) {\n throw new Error('Use of scopes is enabled but no scopes bridge found');\n }\n\n this._scopesBridge.setEnabled(true);\n\n return () => {\n this._scopesBridge?.setEnabled(false);\n };\n };\n\n public initializeScene(scene: EmbeddedScene) {\n this.setState({ initializedScene: scene });\n }\n\n public getScene(routeMatch: SceneRouteMatch): EmbeddedScene {\n let scene = this._sceneCache.get(routeMatch.url);\n\n if (scene) {\n return scene;\n }\n\n if (!this.state.getScene) {\n throw new Error('Missing getScene on SceneAppPage ' + this.state.title);\n }\n\n scene = this.state.getScene(routeMatch);\n this._sceneCache.set(routeMatch.url, scene);\n\n return scene;\n }\n\n public getDrilldownPage(drilldown: SceneAppDrilldownView, routeMatch: SceneRouteMatch<{}>): SceneAppPageLike {\n let page = this._drilldownCache.get(routeMatch!.url);\n if (page) {\n return page;\n }\n\n page = drilldown.getPage(routeMatch, this);\n this._drilldownCache.set(routeMatch!.url, page);\n\n return page;\n }\n\n public enrichDataRequest(source: SceneObject) {\n if (this.state.getParentPage) {\n return this.state.getParentPage().enrichDataRequest(source);\n }\n\n if (!this.parent) {\n return null;\n }\n\n const root = this.getRoot();\n\n if (isDataRequestEnricher(root)) {\n return root.enrichDataRequest(source);\n }\n\n return null;\n }\n}\nfunction SceneAppPageRenderer({ model }: SceneComponentProps<SceneAppPage>) {\n const { tabs, drilldowns } = model.useState();\n const routes: React.ReactNode[] = [];\n\n routes.push(getFallbackRoute(model));\n\n if (tabs && tabs.length > 0) {\n for (let tabIndex = 0; tabIndex < tabs.length; tabIndex++) {\n const tab = tabs[tabIndex];\n\n // Add first tab as a default route, this makes it possible for the first tab to render with the url of the parent page\n if (tabIndex === 0) {\n routes.push(<Route key={model.state.routePath} path=\"\" element={<tab.Component model={tab} />}></Route>);\n }\n\n routes.push(\n <Route key={tab.state.url} path={tab.state.routePath} element={<tab.Component model={tab} />}></Route>\n );\n\n if (tab.state.drilldowns) {\n for (const drilldown of tab.state.drilldowns) {\n routes.push(\n <Route\n key={drilldown.routePath}\n path={drilldown.routePath}\n element={<SceneAppDrilldownViewRender drilldown={drilldown} parent={tab} />}\n ></Route>\n );\n }\n }\n }\n }\n\n if (drilldowns) {\n for (const drilldown of drilldowns) {\n routes.push(\n <Route\n key={drilldown.routePath}\n path={drilldown.routePath}\n Component={() => <SceneAppDrilldownViewRender drilldown={drilldown} parent={model} />}\n ></Route>\n );\n }\n }\n\n if (!tabs) {\n routes.push(<Route key=\"home route\" path=\"/\" element={<SceneAppPageView page={model} />}></Route>);\n }\n\n return <Routes>{routes}</Routes>;\n}\n\nfunction getFallbackRoute(page: SceneAppPage) {\n return (\n <Route\n key={'fallback route'}\n path=\"*\"\n element={<SceneAppPageView page={page.state.getFallbackPage?.() ?? getDefaultFallbackPage()} />}\n ></Route>\n );\n}\n\nfunction getDefaultFallbackPage() {\n return new SceneAppPage({\n url: '',\n title: 'Not found',\n subTitle: 'The url did not match any page',\n routePath: '*',\n getScene: () => {\n return new EmbeddedScene({\n body: new SceneFlexLayout({\n direction: 'column',\n children: [\n new SceneFlexItem({\n body: new SceneReactObject({\n component: () => {\n return (\n <div data-testid=\"default-fallback-content\">\n If you found your way here using a link then there might be a bug in this application.\n </div>\n );\n },\n }),\n }),\n ],\n }),\n });\n },\n });\n}\n"],"names":[],"mappings":";;;;;;;;;;AAeO,MAAM,qBAAqB,eAA+D,CAAA;AAAA,EAMxF,YAAY,KAA0B,EAAA;AAC3C,IAAA,KAAA,CAAM,KAAK,CAAA,CAAA;AALb,IAAQ,IAAA,CAAA,WAAA,uBAAkB,GAA2B,EAAA,CAAA;AACrD,IAAQ,IAAA,CAAA,eAAA,uBAAsB,GAA8B,EAAA,CAAA;AAS5D,IAAA,IAAA,CAAQ,qBAAqB,MAAM;AACjC,MAAI,IAAA,CAAC,IAAK,CAAA,KAAA,CAAM,SAAW,EAAA;AACzB,QAAA,OAAA;AAAA,OACF;AAEA,MAAK,IAAA,CAAA,aAAA,GAAgB,UAAW,CAAA,eAAA,CAAgB,IAAI,CAAA,CAAA;AAEpD,MAAI,IAAA,CAAC,KAAK,aAAe,EAAA;AACvB,QAAM,MAAA,IAAI,MAAM,qDAAqD,CAAA,CAAA;AAAA,OACvE;AAEA,MAAK,IAAA,CAAA,aAAA,CAAc,WAAW,IAAI,CAAA,CAAA;AAElC,MAAA,OAAO,MAAM;AAxCjB,QAAA,IAAA,EAAA,CAAA;AAyCM,QAAK,CAAA,EAAA,GAAA,IAAA,CAAA,aAAA,KAAL,mBAAoB,UAAW,CAAA,KAAA,CAAA,CAAA;AAAA,OACjC,CAAA;AAAA,KACF,CAAA;AAnBE,IAAK,IAAA,CAAA,oBAAA,CAAqB,KAAK,kBAAkB,CAAA,CAAA;AAAA,GACnD;AAAA,EAoBO,gBAAgB,KAAsB,EAAA;AAC3C,IAAA,IAAA,CAAK,QAAS,CAAA,EAAE,gBAAkB,EAAA,KAAA,EAAO,CAAA,CAAA;AAAA,GAC3C;AAAA,EAEO,SAAS,UAA4C,EAAA;AAC1D,IAAA,IAAI,KAAQ,GAAA,IAAA,CAAK,WAAY,CAAA,GAAA,CAAI,WAAW,GAAG,CAAA,CAAA;AAE/C,IAAA,IAAI,KAAO,EAAA;AACT,MAAO,OAAA,KAAA,CAAA;AAAA,KACT;AAEA,IAAI,IAAA,CAAC,IAAK,CAAA,KAAA,CAAM,QAAU,EAAA;AACxB,MAAA,MAAM,IAAI,KAAA,CAAM,mCAAsC,GAAA,IAAA,CAAK,MAAM,KAAK,CAAA,CAAA;AAAA,KACxE;AAEA,IAAQ,KAAA,GAAA,IAAA,CAAK,KAAM,CAAA,QAAA,CAAS,UAAU,CAAA,CAAA;AACtC,IAAA,IAAA,CAAK,WAAY,CAAA,GAAA,CAAI,UAAW,CAAA,GAAA,EAAK,KAAK,CAAA,CAAA;AAE1C,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAAA,EAEO,gBAAA,CAAiB,WAAkC,UAAmD,EAAA;AAC3G,IAAA,IAAI,IAAO,GAAA,IAAA,CAAK,eAAgB,CAAA,GAAA,CAAI,WAAY,GAAG,CAAA,CAAA;AACnD,IAAA,IAAI,IAAM,EAAA;AACR,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AAEA,IAAO,IAAA,GAAA,SAAA,CAAU,OAAQ,CAAA,UAAA,EAAY,IAAI,CAAA,CAAA;AACzC,IAAA,IAAA,CAAK,eAAgB,CAAA,GAAA,CAAI,UAAY,CAAA,GAAA,EAAK,IAAI,CAAA,CAAA;AAE9C,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAAA,EAEO,kBAAkB,MAAqB,EAAA;AAC5C,IAAI,IAAA,IAAA,CAAK,MAAM,aAAe,EAAA;AAC5B,MAAA,OAAO,IAAK,CAAA,KAAA,CAAM,aAAc,EAAA,CAAE,kBAAkB,MAAM,CAAA,CAAA;AAAA,KAC5D;AAEA,IAAI,IAAA,CAAC,KAAK,MAAQ,EAAA;AAChB,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AAEA,IAAM,MAAA,IAAA,GAAO,KAAK,OAAQ,EAAA,CAAA;AAE1B,IAAI,IAAA,qBAAA,CAAsB,IAAI,CAAG,EAAA;AAC/B,MAAO,OAAA,IAAA,CAAK,kBAAkB,MAAM,CAAA,CAAA;AAAA,KACtC;AAEA,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AACF,CAAA;AAhFa,YAAA,CACG,SAAY,GAAA,oBAAA,CAAA;AAgF5B,SAAS,oBAAA,CAAqB,EAAE,KAAA,EAA4C,EAAA;AAC1E,EAAA,MAAM,EAAE,IAAA,EAAM,UAAW,EAAA,GAAI,MAAM,QAAS,EAAA,CAAA;AAC5C,EAAA,MAAM,SAA4B,EAAC,CAAA;AAEnC,EAAO,MAAA,CAAA,IAAA,CAAK,gBAAiB,CAAA,KAAK,CAAC,CAAA,CAAA;AAEnC,EAAI,IAAA,IAAA,IAAQ,IAAK,CAAA,MAAA,GAAS,CAAG,EAAA;AAC3B,IAAA,KAAA,IAAS,QAAW,GAAA,CAAA,EAAG,QAAW,GAAA,IAAA,CAAK,QAAQ,QAAY,EAAA,EAAA;AACzD,MAAA,MAAM,MAAM,IAAK,CAAA,QAAA,CAAA,CAAA;AAGjB,MAAA,IAAI,aAAa,CAAG,EAAA;AAClB,QAAA,MAAA,CAAO,qBAAM,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA;AAAA,UAAM,GAAA,EAAK,MAAM,KAAM,CAAA,SAAA;AAAA,UAAW,IAAK,EAAA,EAAA;AAAA,UAAG,OAAA,kBAAU,KAAA,CAAA,aAAA,CAAA,GAAA,CAAI,SAAJ,EAAA;AAAA,YAAc,KAAO,EAAA,GAAA;AAAA,WAAK,CAAA;AAAA,SAAI,CAAQ,CAAA,CAAA;AAAA,OACzG;AAEA,MAAO,MAAA,CAAA,IAAA;AAAA,wBACJ,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA;AAAA,UAAM,GAAA,EAAK,IAAI,KAAM,CAAA,GAAA;AAAA,UAAK,IAAA,EAAM,IAAI,KAAM,CAAA,SAAA;AAAA,UAAW,OAAA,kBAAU,KAAA,CAAA,aAAA,CAAA,GAAA,CAAI,SAAJ,EAAA;AAAA,YAAc,KAAO,EAAA,GAAA;AAAA,WAAK,CAAA;AAAA,SAAI,CAAA;AAAA,OAChG,CAAA;AAEA,MAAI,IAAA,GAAA,CAAI,MAAM,UAAY,EAAA;AACxB,QAAW,KAAA,MAAA,SAAA,IAAa,GAAI,CAAA,KAAA,CAAM,UAAY,EAAA;AAC5C,UAAO,MAAA,CAAA,IAAA;AAAA,4BACJ,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA;AAAA,cACC,KAAK,SAAU,CAAA,SAAA;AAAA,cACf,MAAM,SAAU,CAAA,SAAA;AAAA,cAChB,yBAAU,KAAA,CAAA,aAAA,CAAA,2BAAA,EAAA;AAAA,gBAA4B,SAAA;AAAA,gBAAsB,MAAQ,EAAA,GAAA;AAAA,eAAK,CAAA;AAAA,aAC1E,CAAA;AAAA,WACH,CAAA;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAAA,GACF;AAEA,EAAA,IAAI,UAAY,EAAA;AACd,IAAA,KAAA,MAAW,aAAa,UAAY,EAAA;AAClC,MAAO,MAAA,CAAA,IAAA;AAAA,wBACJ,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA;AAAA,UACC,KAAK,SAAU,CAAA,SAAA;AAAA,UACf,MAAM,SAAU,CAAA,SAAA;AAAA,UAChB,SAAA,EAAW,sBAAO,KAAA,CAAA,aAAA,CAAA,2BAAA,EAAA;AAAA,YAA4B,SAAA;AAAA,YAAsB,MAAQ,EAAA,KAAA;AAAA,WAAO,CAAA;AAAA,SACpF,CAAA;AAAA,OACH,CAAA;AAAA,KACF;AAAA,GACF;AAEA,EAAA,IAAI,CAAC,IAAM,EAAA;AACT,IAAA,MAAA,CAAO,qBAAM,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA;AAAA,MAAM,GAAI,EAAA,YAAA;AAAA,MAAa,IAAK,EAAA,GAAA;AAAA,MAAI,yBAAU,KAAA,CAAA,aAAA,CAAA,gBAAA,EAAA;AAAA,QAAiB,IAAM,EAAA,KAAA;AAAA,OAAO,CAAA;AAAA,KAAI,CAAQ,CAAA,CAAA;AAAA,GACnG;AAEA,EAAO,uBAAA,KAAA,CAAA,aAAA,CAAC,cAAQ,MAAO,CAAA,CAAA;AACzB,CAAA;AAEA,SAAS,iBAAiB,IAAoB,EAAA;AApJ9C,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,CAAA;AAqJE,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA;AAAA,IACC,GAAK,EAAA,gBAAA;AAAA,IACL,IAAK,EAAA,GAAA;AAAA,IACL,yBAAU,KAAA,CAAA,aAAA,CAAA,gBAAA,EAAA;AAAA,MAAiB,IAAM,EAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,IAAA,CAAK,KAAM,EAAA,eAAA,KAAX,4CAAkC,sBAAuB,EAAA;AAAA,KAAG,CAAA;AAAA,GAC9F,CAAA,CAAA;AAEL,CAAA;AAEA,SAAS,sBAAyB,GAAA;AAChC,EAAA,OAAO,IAAI,YAAa,CAAA;AAAA,IACtB,GAAK,EAAA,EAAA;AAAA,IACL,KAAO,EAAA,WAAA;AAAA,IACP,QAAU,EAAA,gCAAA;AAAA,IACV,SAAW,EAAA,GAAA;AAAA,IACX,UAAU,MAAM;AACd,MAAA,OAAO,IAAI,aAAc,CAAA;AAAA,QACvB,IAAA,EAAM,IAAI,eAAgB,CAAA;AAAA,UACxB,SAAW,EAAA,QAAA;AAAA,UACX,QAAU,EAAA;AAAA,YACR,IAAI,aAAc,CAAA;AAAA,cAChB,IAAA,EAAM,IAAI,gBAAiB,CAAA;AAAA,gBACzB,WAAW,MAAM;AACf,kBAAA,uBACG,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA;AAAA,oBAAI,aAAY,EAAA,0BAAA;AAAA,mBAAA,EAA2B,wFAE5C,CAAA,CAAA;AAAA,iBAEJ;AAAA,eACD,CAAA;AAAA,aACF,CAAA;AAAA,WACH;AAAA,SACD,CAAA;AAAA,OACF,CAAA,CAAA;AAAA,KACH;AAAA,GACD,CAAA,CAAA;AACH;;;;"}
|
|
1
|
+
{"version":3,"file":"SceneAppPage.js","sources":["../../../../src/components/SceneApp/SceneAppPage.tsx"],"sourcesContent":["import React from 'react';\nimport { Route, Routes } from 'react-router-dom';\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { SceneScopesBridge } from '../../core/SceneScopesBridge';\nimport { SceneComponentProps, SceneObject, isDataRequestEnricher } from '../../core/types';\nimport { EmbeddedScene } from '../EmbeddedScene';\nimport { SceneFlexItem, SceneFlexLayout } from '../layout/SceneFlexLayout';\nimport { SceneReactObject } from '../SceneReactObject';\nimport { SceneAppDrilldownViewRender, SceneAppPageView } from './SceneAppPageView';\nimport { SceneAppDrilldownView, SceneAppPageLike, SceneAppPageState, SceneRouteMatch } from './types';\n\n/**\n * Responsible for page's drilldown & tabs routing\n */\nexport class SceneAppPage extends SceneObjectBase<SceneAppPageState> implements SceneAppPageLike {\n public static Component = SceneAppPageRenderer;\n private _sceneCache = new Map<string, EmbeddedScene>();\n private _drilldownCache = new Map<string, SceneAppPageLike>();\n private _scopesBridge: SceneScopesBridge | undefined;\n\n public constructor(state: SceneAppPageState) {\n super(state);\n\n this.addActivationHandler(this._activationHandler);\n }\n\n private _activationHandler = () => {\n if (!this.state.useScopes) {\n return;\n }\n\n this._scopesBridge = sceneGraph.getScopesBridge(this);\n\n if (!this._scopesBridge) {\n throw new Error('Use of scopes is enabled but no scopes bridge found');\n }\n\n this._scopesBridge.setEnabled(true);\n\n return () => {\n this._scopesBridge?.setEnabled(false);\n };\n };\n\n public initializeScene(scene: EmbeddedScene) {\n this.setState({ initializedScene: scene });\n }\n\n public getScene(routeMatch: SceneRouteMatch): EmbeddedScene {\n let scene = this._sceneCache.get(routeMatch.url);\n\n if (scene) {\n return scene;\n }\n\n if (!this.state.getScene) {\n throw new Error('Missing getScene on SceneAppPage ' + this.state.title);\n }\n\n scene = this.state.getScene(routeMatch);\n this._sceneCache.set(routeMatch.url, scene);\n\n return scene;\n }\n\n public getDrilldownPage(drilldown: SceneAppDrilldownView, routeMatch: SceneRouteMatch<{}>): SceneAppPageLike {\n let page = this._drilldownCache.get(routeMatch!.url);\n if (page) {\n return page;\n }\n\n page = drilldown.getPage(routeMatch, this);\n this._drilldownCache.set(routeMatch!.url, page);\n\n return page;\n }\n\n public enrichDataRequest(source: SceneObject) {\n if (this.state.getParentPage) {\n return this.state.getParentPage().enrichDataRequest(source);\n }\n\n if (!this.parent) {\n return null;\n }\n\n const root = this.getRoot();\n\n if (isDataRequestEnricher(root)) {\n return root.enrichDataRequest(source);\n }\n\n return null;\n }\n}\nfunction SceneAppPageRenderer({ model }: SceneComponentProps<SceneAppPage>) {\n const { tabs, drilldowns } = model.useState();\n const routes: React.ReactNode[] = [];\n\n routes.push(getFallbackRoute(model));\n\n if (tabs && tabs.length > 0) {\n for (let tabIndex = 0; tabIndex < tabs.length; tabIndex++) {\n const tab = tabs[tabIndex];\n\n // Add first tab as a default route, this makes it possible for the first tab to render with the url of the parent page\n if (tabIndex === 0) {\n routes.push(<Route key={model.state.routePath} path=\"\" element={<tab.Component model={tab} />}></Route>);\n }\n\n routes.push(\n <Route key={tab.state.url} path={tab.state.routePath} element={<tab.Component model={tab} />}></Route>\n );\n\n if (tab.state.drilldowns) {\n for (const drilldown of tab.state.drilldowns) {\n routes.push(\n <Route\n key={drilldown.routePath}\n path={drilldown.routePath}\n element={<SceneAppDrilldownViewRender drilldown={drilldown} parent={tab} />}\n ></Route>\n );\n }\n }\n }\n }\n\n if (drilldowns) {\n for (const drilldown of drilldowns) {\n routes.push(\n <Route\n key={drilldown.routePath}\n path={drilldown.routePath}\n Component={() => <SceneAppDrilldownViewRender drilldown={drilldown} parent={model} />}\n ></Route>\n );\n }\n }\n\n if (!tabs) {\n routes.push(<Route key=\"home route\" path=\"/\" element={<SceneAppPageView page={model} />}></Route>);\n }\n\n return <Routes>{routes}</Routes>;\n}\n\nfunction getFallbackRoute(page: SceneAppPage) {\n return (\n <Route\n key={'fallback route'}\n path=\"*\"\n element={<SceneAppPageView page={page.state.getFallbackPage?.() ?? getDefaultFallbackPage()} />}\n ></Route>\n );\n}\n\nfunction getDefaultFallbackPage() {\n return new SceneAppPage({\n url: '',\n title: 'Not found',\n subTitle: 'The url did not match any page',\n routePath: '*',\n getScene: () => {\n return new EmbeddedScene({\n body: new SceneFlexLayout({\n direction: 'column',\n children: [\n new SceneFlexItem({\n body: new SceneReactObject({\n component: () => {\n return (\n <div data-testid=\"default-fallback-content\">\n If you found your way here using a link then there might be a bug in this application.\n </div>\n );\n },\n }),\n }),\n ],\n }),\n });\n },\n });\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -55,26 +55,22 @@ function SceneAppPageView({ page }) {
|
|
|
55
55
|
}
|
|
56
56
|
let pageActions = [];
|
|
57
57
|
if (containerState.controls) {
|
|
58
|
-
pageActions = containerState.controls.map((control) => /* @__PURE__ */ React.createElement(control.Component, {
|
|
59
|
-
model: control,
|
|
60
|
-
key: control.state.key
|
|
61
|
-
}));
|
|
58
|
+
pageActions = containerState.controls.map((control) => /* @__PURE__ */ React.createElement(control.Component, { model: control, key: control.state.key }));
|
|
62
59
|
}
|
|
63
60
|
if (params["scene-debugger"]) {
|
|
64
|
-
pageActions.push(/* @__PURE__ */ React.createElement(SceneDebugger, {
|
|
65
|
-
scene: containerPage,
|
|
66
|
-
key: "scene-debugger"
|
|
67
|
-
}));
|
|
61
|
+
pageActions.push(/* @__PURE__ */ React.createElement(SceneDebugger, { scene: containerPage, key: "scene-debugger" }));
|
|
68
62
|
}
|
|
69
|
-
return /* @__PURE__ */ React.createElement(
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
63
|
+
return /* @__PURE__ */ React.createElement(
|
|
64
|
+
PluginPage,
|
|
65
|
+
{
|
|
66
|
+
layout,
|
|
67
|
+
pageNav,
|
|
68
|
+
actions: pageActions,
|
|
69
|
+
renderTitle: containerState.renderTitle,
|
|
70
|
+
subTitle: containerState.subTitle
|
|
71
|
+
},
|
|
72
|
+
/* @__PURE__ */ React.createElement(scene.Component, { model: scene })
|
|
73
|
+
);
|
|
78
74
|
}
|
|
79
75
|
function getParentPageIfTab(page) {
|
|
80
76
|
if (page.parent instanceof SceneAppPage) {
|
|
@@ -100,9 +96,7 @@ function getParentBreadcrumbs(parent, params, searchObject) {
|
|
|
100
96
|
function SceneAppDrilldownViewRender({ drilldown, parent }) {
|
|
101
97
|
const routeMatch = useSceneRouteMatch(drilldown.routePath);
|
|
102
98
|
const page = parent.getDrilldownPage(drilldown, routeMatch);
|
|
103
|
-
return /* @__PURE__ */ React.createElement(page.Component, {
|
|
104
|
-
model: page
|
|
105
|
-
});
|
|
99
|
+
return /* @__PURE__ */ React.createElement(page.Component, { model: page });
|
|
106
100
|
}
|
|
107
101
|
|
|
108
102
|
export { SceneAppDrilldownViewRender, SceneAppPageView };
|
|
@@ -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, { useContext, useEffect, useLayoutEffect } from 'react';\n\nimport { SceneObject } from '../../core/types';\nimport { SceneDebugger } from '../SceneDebugger/SceneDebugger';\nimport { SceneAppPage } from './SceneAppPage';\nimport { SceneAppDrilldownView, SceneAppPageLike } from './types';\nimport { getUrlWithAppState, useAppQueryParams, useSceneRouteMatch } from './utils';\nimport { useUrlSync } from '../../services/useUrlSync';\nimport { SceneAppContext } from './SceneApp';\nimport { useLocationServiceSafe } from '../../utils/utils';\n\nexport interface Props {\n page: SceneAppPageLike;\n}\n\nexport function SceneAppPageView({ page }: Props) {\n const routeMatch = useSceneRouteMatch(page.state.url);\n const containerPage = getParentPageIfTab(page);\n const containerState = containerPage.useState();\n const params = useAppQueryParams();\n const scene = page.getScene(routeMatch);\n const appContext = useContext(SceneAppContext);\n const isInitialized = containerState.initializedScene === scene;\n const { layout } = page.state;\n const locationService = useLocationServiceSafe();\n\n useLayoutEffect(() => {\n // Before rendering scene components, we are making sure the URL sync is enabled for.\n if (!isInitialized) {\n containerPage.initializeScene(scene);\n }\n }, [scene, containerPage, isInitialized]);\n\n useEffect(() => {\n // Clear initializedScene when unmounting\n return () => containerPage.setState({ initializedScene: undefined });\n }, [containerPage]);\n\n const urlSyncInitialized = useUrlSync(containerPage, appContext?.state.urlSyncOptions);\n\n if (!isInitialized && !urlSyncInitialized) {\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, locationService.getSearchObject(), containerState.preserveUrlKeys),\n hideFromBreadcrumbs: containerState.hideFromBreadcrumbs,\n parentItem: getParentBreadcrumbs(\n containerState.getParentPage ? containerState.getParentPage() : containerPage.parent,\n params,\n locationService.getSearchObject()\n ),\n };\n\n if (containerState.tabs) {\n pageNav.children = containerState.tabs.map((tab) => {\n return {\n text: tab.state.title,\n icon: tab.state.titleIcon,\n tabSuffix: tab.state.tabSuffix,\n active: page === tab,\n url: getUrlWithAppState(tab.state.url, locationService.getSearchObject(), tab.state.preserveUrlKeys),\n parentItem: pageNav,\n };\n });\n }\n\n let pageActions: React.ReactNode[] = [];\n if (containerState.controls) {\n pageActions = containerState.controls.map((control) => (\n <control.Component model={control} key={control.state.key} />\n ));\n }\n\n if (params['scene-debugger']) {\n pageActions.push(<SceneDebugger scene={containerPage} key={'scene-debugger'} />);\n }\n\n return (\n <PluginPage\n layout={layout}\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(\n parent: SceneObject | undefined,\n params: UrlQueryMap,\n searchObject: UrlQueryMap\n): NavModelItem | undefined {\n if (parent instanceof SceneAppPage) {\n return {\n text: parent.state.title,\n url: getUrlWithAppState(parent.state.url, searchObject, parent.state.preserveUrlKeys),\n hideFromBreadcrumbs: parent.state.hideFromBreadcrumbs,\n parentItem: getParentBreadcrumbs(\n parent.state.getParentPage ? parent.state.getParentPage() : parent.parent,\n params,\n searchObject\n ),\n };\n }\n\n return undefined;\n}\n\nexport interface SceneAppDrilldownViewRenderProps {\n drilldown: SceneAppDrilldownView;\n parent: SceneAppPageLike;\n}\n\nexport function SceneAppDrilldownViewRender({ drilldown, parent }: SceneAppDrilldownViewRenderProps) {\n const routeMatch = useSceneRouteMatch(drilldown.routePath!);\n const page = parent.getDrilldownPage(drilldown, routeMatch);\n return <page.Component model={page} />;\n}\n"],"names":[],"mappings":";;;;;;;;;AAiBgB,SAAA,gBAAA,CAAiB,EAAE,IAAA,EAAe,EAAA;AAChD,EAAA,MAAM,UAAa,GAAA,kBAAA,CAAmB,IAAK,CAAA,KAAA,CAAM,GAAG,CAAA
|
|
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, { useContext, useEffect, useLayoutEffect } from 'react';\n\nimport { SceneObject } from '../../core/types';\nimport { SceneDebugger } from '../SceneDebugger/SceneDebugger';\nimport { SceneAppPage } from './SceneAppPage';\nimport { SceneAppDrilldownView, SceneAppPageLike } from './types';\nimport { getUrlWithAppState, useAppQueryParams, useSceneRouteMatch } from './utils';\nimport { useUrlSync } from '../../services/useUrlSync';\nimport { SceneAppContext } from './SceneApp';\nimport { useLocationServiceSafe } from '../../utils/utils';\n\nexport interface Props {\n page: SceneAppPageLike;\n}\n\nexport function SceneAppPageView({ page }: Props) {\n const routeMatch = useSceneRouteMatch(page.state.url);\n const containerPage = getParentPageIfTab(page);\n const containerState = containerPage.useState();\n const params = useAppQueryParams();\n const scene = page.getScene(routeMatch);\n const appContext = useContext(SceneAppContext);\n const isInitialized = containerState.initializedScene === scene;\n const { layout } = page.state;\n const locationService = useLocationServiceSafe();\n\n useLayoutEffect(() => {\n // Before rendering scene components, we are making sure the URL sync is enabled for.\n if (!isInitialized) {\n containerPage.initializeScene(scene);\n }\n }, [scene, containerPage, isInitialized]);\n\n useEffect(() => {\n // Clear initializedScene when unmounting\n return () => containerPage.setState({ initializedScene: undefined });\n }, [containerPage]);\n\n const urlSyncInitialized = useUrlSync(containerPage, appContext?.state.urlSyncOptions);\n\n if (!isInitialized && !urlSyncInitialized) {\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, locationService.getSearchObject(), containerState.preserveUrlKeys),\n hideFromBreadcrumbs: containerState.hideFromBreadcrumbs,\n parentItem: getParentBreadcrumbs(\n containerState.getParentPage ? containerState.getParentPage() : containerPage.parent,\n params,\n locationService.getSearchObject()\n ),\n };\n\n if (containerState.tabs) {\n pageNav.children = containerState.tabs.map((tab) => {\n return {\n text: tab.state.title,\n icon: tab.state.titleIcon,\n tabSuffix: tab.state.tabSuffix,\n active: page === tab,\n url: getUrlWithAppState(tab.state.url, locationService.getSearchObject(), tab.state.preserveUrlKeys),\n parentItem: pageNav,\n };\n });\n }\n\n let pageActions: React.ReactNode[] = [];\n if (containerState.controls) {\n pageActions = containerState.controls.map((control) => (\n <control.Component model={control} key={control.state.key} />\n ));\n }\n\n if (params['scene-debugger']) {\n pageActions.push(<SceneDebugger scene={containerPage} key={'scene-debugger'} />);\n }\n\n return (\n <PluginPage\n layout={layout}\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(\n parent: SceneObject | undefined,\n params: UrlQueryMap,\n searchObject: UrlQueryMap\n): NavModelItem | undefined {\n if (parent instanceof SceneAppPage) {\n return {\n text: parent.state.title,\n url: getUrlWithAppState(parent.state.url, searchObject, parent.state.preserveUrlKeys),\n hideFromBreadcrumbs: parent.state.hideFromBreadcrumbs,\n parentItem: getParentBreadcrumbs(\n parent.state.getParentPage ? parent.state.getParentPage() : parent.parent,\n params,\n searchObject\n ),\n };\n }\n\n return undefined;\n}\n\nexport interface SceneAppDrilldownViewRenderProps {\n drilldown: SceneAppDrilldownView;\n parent: SceneAppPageLike;\n}\n\nexport function SceneAppDrilldownViewRender({ drilldown, parent }: SceneAppDrilldownViewRenderProps) {\n const routeMatch = useSceneRouteMatch(drilldown.routePath!);\n const page = parent.getDrilldownPage(drilldown, routeMatch);\n return <page.Component model={page} />;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,29 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { useParams, useLocation, matchPath } from 'react-router-dom';
|
|
2
2
|
import { urlUtil, locationUtil } from '@grafana/data';
|
|
3
3
|
import { locationSearchToObject } from '@grafana/runtime';
|
|
4
4
|
|
|
5
|
-
var __defProp = Object.defineProperty;
|
|
6
|
-
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
7
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
-
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
9
|
-
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
10
|
-
var __spreadValues = (a, b) => {
|
|
11
|
-
for (var prop in b || (b = {}))
|
|
12
|
-
if (__hasOwnProp.call(b, prop))
|
|
13
|
-
__defNormalProp(a, prop, b[prop]);
|
|
14
|
-
if (__getOwnPropSymbols)
|
|
15
|
-
for (var prop of __getOwnPropSymbols(b)) {
|
|
16
|
-
if (__propIsEnum.call(b, prop))
|
|
17
|
-
__defNormalProp(a, prop, b[prop]);
|
|
18
|
-
}
|
|
19
|
-
return a;
|
|
20
|
-
};
|
|
21
5
|
function useAppQueryParams() {
|
|
22
6
|
const location = useLocation();
|
|
23
7
|
return locationSearchToObject(location.search || "");
|
|
24
8
|
}
|
|
25
9
|
function getUrlWithAppState(path, searchObject, preserveParams) {
|
|
26
|
-
const paramsCopy =
|
|
10
|
+
const paramsCopy = { ...searchObject };
|
|
27
11
|
if (preserveParams) {
|
|
28
12
|
for (const key of Object.keys(paramsCopy)) {
|
|
29
13
|
if (!preserveParams.includes(key)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../../../../src/components/SceneApp/utils.ts"],"sourcesContent":["import { matchPath, useLocation, useParams } from 'react-router-dom';\nimport { UrlQueryMap, locationUtil, urlUtil } from '@grafana/data';\nimport { locationSearchToObject } from '@grafana/runtime';\nimport { SceneRouteMatch } from './types';\n\nexport function useAppQueryParams(): UrlQueryMap {\n const location = useLocation();\n return locationSearchToObject(location.search || '');\n}\n\n/**\n *\n * @param path Url to append query params to\n * @param searchObject Query params of the URL\n * @param preserveParams Query params to preserve\n * @returns Url with query params\n */\nexport function getUrlWithAppState(path: string, searchObject: UrlQueryMap, preserveParams?: string[]): string {\n // make a copy of params as the renderUrl function mutates the object\n const paramsCopy = { ...searchObject };\n\n if (preserveParams) {\n for (const key of Object.keys(paramsCopy)) {\n // if param is not in preserveParams, remove it\n if (!preserveParams.includes(key)) {\n delete paramsCopy[key];\n }\n }\n }\n\n return urlUtil.renderUrl(locationUtil.assureBaseUrl(path), paramsCopy);\n}\n\nexport function useSceneRouteMatch(path: string) {\n const params = useParams();\n const location = useLocation();\n const isExact = matchPath(\n {\n path,\n caseSensitive: false,\n end: true,\n },\n location.pathname\n );\n\n const match: SceneRouteMatch = {\n params,\n isExact: isExact !== null,\n path: location.pathname,\n url: location.pathname,\n };\n\n return match;\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../../src/components/SceneApp/utils.ts"],"sourcesContent":["import { matchPath, useLocation, useParams } from 'react-router-dom';\nimport { UrlQueryMap, locationUtil, urlUtil } from '@grafana/data';\nimport { locationSearchToObject } from '@grafana/runtime';\nimport { SceneRouteMatch } from './types';\n\nexport function useAppQueryParams(): UrlQueryMap {\n const location = useLocation();\n return locationSearchToObject(location.search || '');\n}\n\n/**\n *\n * @param path Url to append query params to\n * @param searchObject Query params of the URL\n * @param preserveParams Query params to preserve\n * @returns Url with query params\n */\nexport function getUrlWithAppState(path: string, searchObject: UrlQueryMap, preserveParams?: string[]): string {\n // make a copy of params as the renderUrl function mutates the object\n const paramsCopy = { ...searchObject };\n\n if (preserveParams) {\n for (const key of Object.keys(paramsCopy)) {\n // if param is not in preserveParams, remove it\n if (!preserveParams.includes(key)) {\n delete paramsCopy[key];\n }\n }\n }\n\n return urlUtil.renderUrl(locationUtil.assureBaseUrl(path), paramsCopy);\n}\n\nexport function useSceneRouteMatch(path: string) {\n const params = useParams();\n const location = useLocation();\n const isExact = matchPath(\n {\n path,\n caseSensitive: false,\n end: true,\n },\n location.pathname\n );\n\n const match: SceneRouteMatch = {\n params,\n isExact: isExact !== null,\n path: location.pathname,\n url: location.pathname,\n };\n\n return match;\n}\n"],"names":[],"mappings":";;;;AAKO,SAAS,iBAAiC,GAAA;AAC/C,EAAA,MAAM,WAAW,WAAY,EAAA;AAC7B,EAAO,OAAA,sBAAA,CAAuB,QAAS,CAAA,MAAA,IAAU,EAAE,CAAA;AACrD;AASgB,SAAA,kBAAA,CAAmB,IAAc,EAAA,YAAA,EAA2B,cAAmC,EAAA;AAE7G,EAAM,MAAA,UAAA,GAAa,EAAE,GAAG,YAAa,EAAA;AAErC,EAAA,IAAI,cAAgB,EAAA;AAClB,IAAA,KAAA,MAAW,GAAO,IAAA,MAAA,CAAO,IAAK,CAAA,UAAU,CAAG,EAAA;AAEzC,MAAA,IAAI,CAAC,cAAA,CAAe,QAAS,CAAA,GAAG,CAAG,EAAA;AACjC,QAAA,OAAO,WAAW,GAAG,CAAA;AAAA;AACvB;AACF;AAGF,EAAA,OAAO,QAAQ,SAAU,CAAA,YAAA,CAAa,aAAc,CAAA,IAAI,GAAG,UAAU,CAAA;AACvE;AAEO,SAAS,mBAAmB,IAAc,EAAA;AAC/C,EAAA,MAAM,SAAS,SAAU,EAAA;AACzB,EAAA,MAAM,WAAW,WAAY,EAAA;AAC7B,EAAA,MAAM,OAAU,GAAA,SAAA;AAAA,IACd;AAAA,MACE,IAAA;AAAA,MACA,aAAe,EAAA,KAAA;AAAA,MACf,GAAK,EAAA;AAAA,KACP;AAAA,IACA,QAAS,CAAA;AAAA,GACX;AAEA,EAAA,MAAM,KAAyB,GAAA;AAAA,IAC7B,MAAA;AAAA,IACA,SAAS,OAAY,KAAA,IAAA;AAAA,IACrB,MAAM,QAAS,CAAA,QAAA;AAAA,IACf,KAAK,QAAS,CAAA;AAAA,GAChB;AAEA,EAAO,OAAA,KAAA;AACT;;;;"}
|
|
@@ -32,9 +32,7 @@ class SceneByFrameRepeater extends SceneObjectBase {
|
|
|
32
32
|
}
|
|
33
33
|
SceneByFrameRepeater.Component = ({ model }) => {
|
|
34
34
|
const { body } = model.useState();
|
|
35
|
-
return /* @__PURE__ */ React.createElement(body.Component, {
|
|
36
|
-
model: body
|
|
37
|
-
});
|
|
35
|
+
return /* @__PURE__ */ React.createElement(body.Component, { model: body });
|
|
38
36
|
};
|
|
39
37
|
|
|
40
38
|
export { SceneByFrameRepeater };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SceneByFrameRepeater.js","sources":["../../../src/components/SceneByFrameRepeater.tsx"],"sourcesContent":["import React from 'react';\n\nimport { LoadingState, PanelData, DataFrame } from '@grafana/data';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneComponentProps, SceneLayout, SceneObject, SceneObjectState } from '../core/types';\n\ninterface SceneByFrameRepeaterState extends SceneObjectState {\n body: SceneLayout;\n getLayoutChild(data: PanelData, frame: DataFrame, frameIndex: number): SceneObject;\n}\n\nexport class SceneByFrameRepeater extends SceneObjectBase<SceneByFrameRepeaterState> {\n public constructor(state: SceneByFrameRepeaterState) {\n super(state);\n\n this.addActivationHandler(() => {\n const dataProvider = sceneGraph.getData(this);\n\n this._subs.add(\n dataProvider.subscribeToState((data) => {\n if (data.data?.state === LoadingState.Done) {\n this.performRepeat(data.data);\n }\n })\n );\n\n if (dataProvider.state.data) {\n this.performRepeat(dataProvider.state.data);\n }\n });\n }\n\n private performRepeat(data: PanelData) {\n const newChildren: SceneObject[] = [];\n\n for (let seriesIndex = 0; seriesIndex < data.series.length; seriesIndex++) {\n const layoutChild = this.state.getLayoutChild(data, data.series[seriesIndex], seriesIndex);\n newChildren.push(layoutChild);\n }\n\n this.state.body.setState({ children: newChildren });\n }\n\n public static Component = ({ model }: SceneComponentProps<SceneByFrameRepeater>) => {\n const { body } = model.useState();\n return <body.Component model={body} />;\n };\n}\n"],"names":[],"mappings":";;;;;AAaO,MAAM,6BAA6B,eAA2C,CAAA;AAAA,EAC5E,YAAY,KAAkC,EAAA;AACnD,IAAA,KAAA,CAAM,KAAK,CAAA
|
|
1
|
+
{"version":3,"file":"SceneByFrameRepeater.js","sources":["../../../src/components/SceneByFrameRepeater.tsx"],"sourcesContent":["import React from 'react';\n\nimport { LoadingState, PanelData, DataFrame } from '@grafana/data';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneComponentProps, SceneLayout, SceneObject, SceneObjectState } from '../core/types';\n\ninterface SceneByFrameRepeaterState extends SceneObjectState {\n body: SceneLayout;\n getLayoutChild(data: PanelData, frame: DataFrame, frameIndex: number): SceneObject;\n}\n\nexport class SceneByFrameRepeater extends SceneObjectBase<SceneByFrameRepeaterState> {\n public constructor(state: SceneByFrameRepeaterState) {\n super(state);\n\n this.addActivationHandler(() => {\n const dataProvider = sceneGraph.getData(this);\n\n this._subs.add(\n dataProvider.subscribeToState((data) => {\n if (data.data?.state === LoadingState.Done) {\n this.performRepeat(data.data);\n }\n })\n );\n\n if (dataProvider.state.data) {\n this.performRepeat(dataProvider.state.data);\n }\n });\n }\n\n private performRepeat(data: PanelData) {\n const newChildren: SceneObject[] = [];\n\n for (let seriesIndex = 0; seriesIndex < data.series.length; seriesIndex++) {\n const layoutChild = this.state.getLayoutChild(data, data.series[seriesIndex], seriesIndex);\n newChildren.push(layoutChild);\n }\n\n this.state.body.setState({ children: newChildren });\n }\n\n public static Component = ({ model }: SceneComponentProps<SceneByFrameRepeater>) => {\n const { body } = model.useState();\n return <body.Component model={body} />;\n };\n}\n"],"names":[],"mappings":";;;;;AAaO,MAAM,6BAA6B,eAA2C,CAAA;AAAA,EAC5E,YAAY,KAAkC,EAAA;AACnD,IAAA,KAAA,CAAM,KAAK,CAAA;AAEX,IAAA,IAAA,CAAK,qBAAqB,MAAM;AAC9B,MAAM,MAAA,YAAA,GAAe,UAAW,CAAA,OAAA,CAAQ,IAAI,CAAA;AAE5C,MAAA,IAAA,CAAK,KAAM,CAAA,GAAA;AAAA,QACT,YAAA,CAAa,gBAAiB,CAAA,CAAC,IAAS,KAAA;AArBhD,UAAA,IAAA,EAAA;AAsBU,UAAA,IAAA,CAAA,CAAI,EAAK,GAAA,IAAA,CAAA,IAAA,KAAL,IAAW,GAAA,MAAA,GAAA,EAAA,CAAA,KAAA,MAAU,aAAa,IAAM,EAAA;AAC1C,YAAK,IAAA,CAAA,aAAA,CAAc,KAAK,IAAI,CAAA;AAAA;AAC9B,SACD;AAAA,OACH;AAEA,MAAI,IAAA,YAAA,CAAa,MAAM,IAAM,EAAA;AAC3B,QAAK,IAAA,CAAA,aAAA,CAAc,YAAa,CAAA,KAAA,CAAM,IAAI,CAAA;AAAA;AAC5C,KACD,CAAA;AAAA;AACH,EAEQ,cAAc,IAAiB,EAAA;AACrC,IAAA,MAAM,cAA6B,EAAC;AAEpC,IAAA,KAAA,IAAS,cAAc,CAAG,EAAA,WAAA,GAAc,IAAK,CAAA,MAAA,CAAO,QAAQ,WAAe,EAAA,EAAA;AACzE,MAAM,MAAA,WAAA,GAAc,KAAK,KAAM,CAAA,cAAA,CAAe,MAAM,IAAK,CAAA,MAAA,CAAO,WAAW,CAAA,EAAG,WAAW,CAAA;AACzF,MAAA,WAAA,CAAY,KAAK,WAAW,CAAA;AAAA;AAG9B,IAAA,IAAA,CAAK,MAAM,IAAK,CAAA,QAAA,CAAS,EAAE,QAAA,EAAU,aAAa,CAAA;AAAA;AAOtD;AApCa,oBAAA,CAgCG,SAAY,GAAA,CAAC,EAAE,KAAA,EAAuD,KAAA;AAClF,EAAA,MAAM,EAAE,IAAA,EAAS,GAAA,KAAA,CAAM,QAAS,EAAA;AAChC,EAAA,uBAAQ,KAAA,CAAA,aAAA,CAAA,IAAA,CAAK,SAAL,EAAA,EAAe,OAAO,IAAM,EAAA,CAAA;AACtC,CAAA;;;;"}
|
|
@@ -36,9 +36,7 @@ class SceneByVariableRepeater extends SceneObjectBase {
|
|
|
36
36
|
}
|
|
37
37
|
SceneByVariableRepeater.Component = ({ model }) => {
|
|
38
38
|
const { body } = model.useState();
|
|
39
|
-
return /* @__PURE__ */ React.createElement(body.Component, {
|
|
40
|
-
model: body
|
|
41
|
-
});
|
|
39
|
+
return /* @__PURE__ */ React.createElement(body.Component, { model: body });
|
|
42
40
|
};
|
|
43
41
|
function getMultiVariableValues(variable) {
|
|
44
42
|
const { value, text, options } = variable.state;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SceneByVariableRepeater.js","sources":["../../../src/components/SceneByVariableRepeater.tsx"],"sourcesContent":["import React from 'react';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneComponentProps, SceneLayout, SceneObject, SceneObjectState } from '../core/types';\nimport { VariableDependencyConfig } from '../variables/VariableDependencyConfig';\nimport { VariableValueOption } from '../variables/types';\nimport { MultiValueVariable } from '../variables/variants/MultiValueVariable';\n\ninterface SceneByVariableRepeaterState extends SceneObjectState {\n body: SceneLayout;\n variableName: string;\n getLayoutChild(option: VariableValueOption): SceneObject;\n}\n\nexport class SceneByVariableRepeater extends SceneObjectBase<SceneByVariableRepeaterState> {\n protected _variableDependency: VariableDependencyConfig<SceneByVariableRepeaterState> = new VariableDependencyConfig(\n this,\n {\n variableNames: [this.state.variableName],\n onVariableUpdateCompleted: () => this.performRepeat(),\n }\n );\n\n public constructor(state: SceneByVariableRepeaterState) {\n super(state);\n\n this.addActivationHandler(() => this.performRepeat());\n }\n\n private performRepeat() {\n if (this._variableDependency.hasDependencyInLoadingState()) {\n return;\n }\n\n const variable = sceneGraph.lookupVariable(this.state.variableName, this);\n if (!(variable instanceof MultiValueVariable)) {\n console.error('SceneByVariableRepeater: variable is not a MultiValueVariable');\n return;\n }\n\n const values = getMultiVariableValues(variable);\n const newChildren: SceneObject[] = [];\n\n for (const option of values) {\n const layoutChild = this.state.getLayoutChild(option);\n newChildren.push(layoutChild);\n }\n\n this.state.body.setState({ children: newChildren });\n }\n\n public static Component = ({ model }: SceneComponentProps<SceneByVariableRepeater>) => {\n const { body } = model.useState();\n return <body.Component model={body} />;\n };\n}\n\nexport function getMultiVariableValues(variable: MultiValueVariable): VariableValueOption[] {\n const { value, text, options } = variable.state;\n\n if (variable.hasAllValue()) {\n return options;\n }\n\n if (Array.isArray(value) && Array.isArray(text)) {\n return value.map((v, i) => ({ value: v, label: text[i] as string }));\n }\n\n return [{ value: value as string, label: text as string }];\n}\n"],"names":[],"mappings":";;;;;;AAeO,MAAM,gCAAgC,eAA8C,CAAA;AAAA,EASlF,YAAY,KAAqC,EAAA;AACtD,IAAA,KAAA,CAAM,KAAK,CAAA
|
|
1
|
+
{"version":3,"file":"SceneByVariableRepeater.js","sources":["../../../src/components/SceneByVariableRepeater.tsx"],"sourcesContent":["import React from 'react';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneComponentProps, SceneLayout, SceneObject, SceneObjectState } from '../core/types';\nimport { VariableDependencyConfig } from '../variables/VariableDependencyConfig';\nimport { VariableValueOption } from '../variables/types';\nimport { MultiValueVariable } from '../variables/variants/MultiValueVariable';\n\ninterface SceneByVariableRepeaterState extends SceneObjectState {\n body: SceneLayout;\n variableName: string;\n getLayoutChild(option: VariableValueOption): SceneObject;\n}\n\nexport class SceneByVariableRepeater extends SceneObjectBase<SceneByVariableRepeaterState> {\n protected _variableDependency: VariableDependencyConfig<SceneByVariableRepeaterState> = new VariableDependencyConfig(\n this,\n {\n variableNames: [this.state.variableName],\n onVariableUpdateCompleted: () => this.performRepeat(),\n }\n );\n\n public constructor(state: SceneByVariableRepeaterState) {\n super(state);\n\n this.addActivationHandler(() => this.performRepeat());\n }\n\n private performRepeat() {\n if (this._variableDependency.hasDependencyInLoadingState()) {\n return;\n }\n\n const variable = sceneGraph.lookupVariable(this.state.variableName, this);\n if (!(variable instanceof MultiValueVariable)) {\n console.error('SceneByVariableRepeater: variable is not a MultiValueVariable');\n return;\n }\n\n const values = getMultiVariableValues(variable);\n const newChildren: SceneObject[] = [];\n\n for (const option of values) {\n const layoutChild = this.state.getLayoutChild(option);\n newChildren.push(layoutChild);\n }\n\n this.state.body.setState({ children: newChildren });\n }\n\n public static Component = ({ model }: SceneComponentProps<SceneByVariableRepeater>) => {\n const { body } = model.useState();\n return <body.Component model={body} />;\n };\n}\n\nexport function getMultiVariableValues(variable: MultiValueVariable): VariableValueOption[] {\n const { value, text, options } = variable.state;\n\n if (variable.hasAllValue()) {\n return options;\n }\n\n if (Array.isArray(value) && Array.isArray(text)) {\n return value.map((v, i) => ({ value: v, label: text[i] as string }));\n }\n\n return [{ value: value as string, label: text as string }];\n}\n"],"names":[],"mappings":";;;;;;AAeO,MAAM,gCAAgC,eAA8C,CAAA;AAAA,EASlF,YAAY,KAAqC,EAAA;AACtD,IAAA,KAAA,CAAM,KAAK,CAAA;AATb,IAAA,IAAA,CAAU,sBAA8E,IAAI,wBAAA;AAAA,MAC1F,IAAA;AAAA,MACA;AAAA,QACE,aAAe,EAAA,CAAC,IAAK,CAAA,KAAA,CAAM,YAAY,CAAA;AAAA,QACvC,yBAAA,EAA2B,MAAM,IAAA,CAAK,aAAc;AAAA;AACtD,KACF;AAKE,IAAA,IAAA,CAAK,oBAAqB,CAAA,MAAM,IAAK,CAAA,aAAA,EAAe,CAAA;AAAA;AACtD,EAEQ,aAAgB,GAAA;AACtB,IAAI,IAAA,IAAA,CAAK,mBAAoB,CAAA,2BAAA,EAA+B,EAAA;AAC1D,MAAA;AAAA;AAGF,IAAA,MAAM,WAAW,UAAW,CAAA,cAAA,CAAe,IAAK,CAAA,KAAA,CAAM,cAAc,IAAI,CAAA;AACxE,IAAI,IAAA,EAAE,oBAAoB,kBAAqB,CAAA,EAAA;AAC7C,MAAA,OAAA,CAAQ,MAAM,+DAA+D,CAAA;AAC7E,MAAA;AAAA;AAGF,IAAM,MAAA,MAAA,GAAS,uBAAuB,QAAQ,CAAA;AAC9C,IAAA,MAAM,cAA6B,EAAC;AAEpC,IAAA,KAAA,MAAW,UAAU,MAAQ,EAAA;AAC3B,MAAA,MAAM,WAAc,GAAA,IAAA,CAAK,KAAM,CAAA,cAAA,CAAe,MAAM,CAAA;AACpD,MAAA,WAAA,CAAY,KAAK,WAAW,CAAA;AAAA;AAG9B,IAAA,IAAA,CAAK,MAAM,IAAK,CAAA,QAAA,CAAS,EAAE,QAAA,EAAU,aAAa,CAAA;AAAA;AAOtD;AAzCa,uBAAA,CAqCG,SAAY,GAAA,CAAC,EAAE,KAAA,EAA0D,KAAA;AACrF,EAAA,MAAM,EAAE,IAAA,EAAS,GAAA,KAAA,CAAM,QAAS,EAAA;AAChC,EAAA,uBAAQ,KAAA,CAAA,aAAA,CAAA,IAAA,CAAK,SAAL,EAAA,EAAe,OAAO,IAAM,EAAA,CAAA;AACtC,CAAA;AAGK,SAAS,uBAAuB,QAAqD,EAAA;AAC1F,EAAA,MAAM,EAAE,KAAA,EAAO,IAAM,EAAA,OAAA,KAAY,QAAS,CAAA,KAAA;AAE1C,EAAI,IAAA,QAAA,CAAS,aAAe,EAAA;AAC1B,IAAO,OAAA,OAAA;AAAA;AAGT,EAAA,IAAI,MAAM,OAAQ,CAAA,KAAK,KAAK,KAAM,CAAA,OAAA,CAAQ,IAAI,CAAG,EAAA;AAC/C,IAAA,OAAO,KAAM,CAAA,GAAA,CAAI,CAAC,CAAA,EAAG,CAAO,MAAA,EAAE,KAAO,EAAA,CAAA,EAAG,KAAO,EAAA,IAAA,CAAK,CAAC,CAAA,EAAc,CAAA,CAAA;AAAA;AAGrE,EAAA,OAAO,CAAC,EAAE,KAAwB,EAAA,KAAA,EAAO,MAAgB,CAAA;AAC3D;;;;"}
|
|
@@ -22,10 +22,7 @@ SceneCanvasText.Component = ({ model }) => {
|
|
|
22
22
|
padding: spacing ? theme.spacing(spacing, 0) : void 0,
|
|
23
23
|
justifyContent: align
|
|
24
24
|
});
|
|
25
|
-
return /* @__PURE__ */ React.createElement("div", {
|
|
26
|
-
className: style,
|
|
27
|
-
"data-testid": key
|
|
28
|
-
}, sceneGraph.interpolate(model, text));
|
|
25
|
+
return /* @__PURE__ */ React.createElement("div", { className: style, "data-testid": key }, sceneGraph.interpolate(model, text));
|
|
29
26
|
};
|
|
30
27
|
|
|
31
28
|
export { SceneCanvasText };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SceneCanvasText.js","sources":["../../../src/components/SceneCanvasText.tsx"],"sourcesContent":["import React from 'react';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneComponentProps, SceneObjectState } from '../core/types';\nimport { VariableDependencyConfig } from '../variables/VariableDependencyConfig';\nimport { useTheme2 } from '@grafana/ui';\nimport { css } from '@emotion/css';\n\nexport interface SceneCanvasTextState extends SceneObjectState {\n text: string;\n fontSize?: number;\n align?: 'left' | 'center' | 'right';\n spacing?: number;\n}\n\n/**\n * Not a really useful component, just an example of how to create one\n * @internal\n */\nexport class SceneCanvasText extends SceneObjectBase<SceneCanvasTextState> {\n protected _variableDependency = new VariableDependencyConfig(this, { statePaths: ['text'] });\n\n public static Component = ({ model }: SceneComponentProps<SceneCanvasText>) => {\n const { text, fontSize = 20, align = 'left', key, spacing } = model.useState();\n const theme = useTheme2();\n\n const style = css({\n fontSize: fontSize,\n display: 'flex',\n flexGrow: 1,\n alignItems: 'center',\n padding: spacing ? theme.spacing(spacing, 0) : undefined,\n justifyContent: align,\n });\n\n return (\n <div className={style} data-testid={key}>\n {sceneGraph.interpolate(model, text)}\n </div>\n );\n };\n}\n"],"names":[],"mappings":";;;;;;;AAoBO,MAAM,wBAAwB,eAAsC,CAAA;AAAA,EAApE,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA
|
|
1
|
+
{"version":3,"file":"SceneCanvasText.js","sources":["../../../src/components/SceneCanvasText.tsx"],"sourcesContent":["import React from 'react';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { SceneComponentProps, SceneObjectState } from '../core/types';\nimport { VariableDependencyConfig } from '../variables/VariableDependencyConfig';\nimport { useTheme2 } from '@grafana/ui';\nimport { css } from '@emotion/css';\n\nexport interface SceneCanvasTextState extends SceneObjectState {\n text: string;\n fontSize?: number;\n align?: 'left' | 'center' | 'right';\n spacing?: number;\n}\n\n/**\n * Not a really useful component, just an example of how to create one\n * @internal\n */\nexport class SceneCanvasText extends SceneObjectBase<SceneCanvasTextState> {\n protected _variableDependency = new VariableDependencyConfig(this, { statePaths: ['text'] });\n\n public static Component = ({ model }: SceneComponentProps<SceneCanvasText>) => {\n const { text, fontSize = 20, align = 'left', key, spacing } = model.useState();\n const theme = useTheme2();\n\n const style = css({\n fontSize: fontSize,\n display: 'flex',\n flexGrow: 1,\n alignItems: 'center',\n padding: spacing ? theme.spacing(spacing, 0) : undefined,\n justifyContent: align,\n });\n\n return (\n <div className={style} data-testid={key}>\n {sceneGraph.interpolate(model, text)}\n </div>\n );\n };\n}\n"],"names":[],"mappings":";;;;;;;AAoBO,MAAM,wBAAwB,eAAsC,CAAA;AAAA,EAApE,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AACL,IAAU,IAAA,CAAA,mBAAA,GAAsB,IAAI,wBAAyB,CAAA,IAAA,EAAM,EAAE,UAAY,EAAA,CAAC,MAAM,CAAA,EAAG,CAAA;AAAA;AAqB7F;AAtBa,eAAA,CAGG,SAAY,GAAA,CAAC,EAAE,KAAA,EAAkD,KAAA;AAC7E,EAAM,MAAA,EAAE,IAAM,EAAA,QAAA,GAAW,EAAI,EAAA,KAAA,GAAQ,QAAQ,GAAK,EAAA,OAAA,EAAY,GAAA,KAAA,CAAM,QAAS,EAAA;AAC7E,EAAA,MAAM,QAAQ,SAAU,EAAA;AAExB,EAAA,MAAM,QAAQ,GAAI,CAAA;AAAA,IAChB,QAAA;AAAA,IACA,OAAS,EAAA,MAAA;AAAA,IACT,QAAU,EAAA,CAAA;AAAA,IACV,UAAY,EAAA,QAAA;AAAA,IACZ,SAAS,OAAU,GAAA,KAAA,CAAM,OAAQ,CAAA,OAAA,EAAS,CAAC,CAAI,GAAA,MAAA;AAAA,IAC/C,cAAgB,EAAA;AAAA,GACjB,CAAA;AAED,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAW,KAAO,EAAA,aAAA,EAAa,OACjC,UAAW,CAAA,WAAA,CAAY,KAAO,EAAA,IAAI,CACrC,CAAA;AAEJ,CAAA;;;;"}
|
|
@@ -8,9 +8,7 @@ class SceneControlsSpacer extends SceneObjectBase {
|
|
|
8
8
|
}
|
|
9
9
|
}
|
|
10
10
|
SceneControlsSpacer.Component = (_props) => {
|
|
11
|
-
return /* @__PURE__ */ React.createElement("div", {
|
|
12
|
-
style: { flexGrow: 1 }
|
|
13
|
-
});
|
|
11
|
+
return /* @__PURE__ */ React.createElement("div", { style: { flexGrow: 1 } });
|
|
14
12
|
};
|
|
15
13
|
|
|
16
14
|
export { SceneControlsSpacer };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SceneControlsSpacer.js","sources":["../../../src/components/SceneControlsSpacer.tsx"],"sourcesContent":["import React from 'react';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { SceneComponentProps } from '../core/types';\n\nexport class SceneControlsSpacer extends SceneObjectBase {\n public constructor() {\n super({});\n\n this._renderBeforeActivation = true;\n }\n\n public static Component = (_props: SceneComponentProps<SceneControlsSpacer>) => {\n return <div style={{ flexGrow: 1 }} />;\n };\n}\n"],"names":[],"mappings":";;;AAKO,MAAM,4BAA4B,eAAgB,CAAA;AAAA,EAChD,WAAc,GAAA;AACnB,IAAA,KAAA,CAAM,EAAE,CAAA
|
|
1
|
+
{"version":3,"file":"SceneControlsSpacer.js","sources":["../../../src/components/SceneControlsSpacer.tsx"],"sourcesContent":["import React from 'react';\n\nimport { SceneObjectBase } from '../core/SceneObjectBase';\nimport { SceneComponentProps } from '../core/types';\n\nexport class SceneControlsSpacer extends SceneObjectBase {\n public constructor() {\n super({});\n\n this._renderBeforeActivation = true;\n }\n\n public static Component = (_props: SceneComponentProps<SceneControlsSpacer>) => {\n return <div style={{ flexGrow: 1 }} />;\n };\n}\n"],"names":[],"mappings":";;;AAKO,MAAM,4BAA4B,eAAgB,CAAA;AAAA,EAChD,WAAc,GAAA;AACnB,IAAA,KAAA,CAAM,EAAE,CAAA;AAER,IAAA,IAAA,CAAK,uBAA0B,GAAA,IAAA;AAAA;AAMnC;AAVa,mBAOG,CAAA,SAAA,GAAY,CAAC,MAAqD,KAAA;AAC9E,EAAA,2CAAQ,KAAI,EAAA,EAAA,KAAA,EAAO,EAAE,QAAA,EAAU,GAAK,EAAA,CAAA;AACtC,CAAA;;;;"}
|
|
@@ -7,16 +7,7 @@ import { isSceneObject } from '../../core/types.js';
|
|
|
7
7
|
function DebugDetails({ node }) {
|
|
8
8
|
const state = node.useState();
|
|
9
9
|
const styles = useStyles2(getStyles);
|
|
10
|
-
return /* @__PURE__ */ React.createElement("div", {
|
|
11
|
-
className: styles.container
|
|
12
|
-
}, Object.keys(state).map((key) => /* @__PURE__ */ React.createElement("div", {
|
|
13
|
-
className: styles.row,
|
|
14
|
-
key
|
|
15
|
-
}, /* @__PURE__ */ React.createElement("div", {
|
|
16
|
-
className: styles.keyName
|
|
17
|
-
}, key), /* @__PURE__ */ React.createElement("div", {
|
|
18
|
-
className: styles.value
|
|
19
|
-
}, renderValue(key, state[key], node)))));
|
|
10
|
+
return /* @__PURE__ */ React.createElement("div", { className: styles.container }, Object.keys(state).map((key) => /* @__PURE__ */ React.createElement("div", { className: styles.row, key }, /* @__PURE__ */ React.createElement("div", { className: styles.keyName }, key), /* @__PURE__ */ React.createElement("div", { className: styles.value }, renderValue(key, state[key], node)))));
|
|
20
11
|
}
|
|
21
12
|
function renderValue(key, value, node) {
|
|
22
13
|
if (value === null) {
|
|
@@ -24,26 +15,22 @@ function renderValue(key, value, node) {
|
|
|
24
15
|
}
|
|
25
16
|
switch (typeof value) {
|
|
26
17
|
case "number":
|
|
27
|
-
return /* @__PURE__ */ React.createElement(
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
18
|
+
return /* @__PURE__ */ React.createElement(
|
|
19
|
+
Input,
|
|
20
|
+
{
|
|
21
|
+
type: "number",
|
|
22
|
+
defaultValue: value,
|
|
23
|
+
onBlur: (evt) => node.setState({ [key]: evt.currentTarget.valueAsNumber })
|
|
24
|
+
}
|
|
25
|
+
);
|
|
32
26
|
case "string":
|
|
33
|
-
return /* @__PURE__ */ React.createElement(Input, {
|
|
34
|
-
type: "text",
|
|
35
|
-
defaultValue: value,
|
|
36
|
-
onBlur: (evt) => node.setState({ [key]: evt.currentTarget.value })
|
|
37
|
-
});
|
|
27
|
+
return /* @__PURE__ */ React.createElement(Input, { type: "text", defaultValue: value, onBlur: (evt) => node.setState({ [key]: evt.currentTarget.value }) });
|
|
38
28
|
case "object":
|
|
39
29
|
if (isSceneObject(value)) {
|
|
40
30
|
return value.constructor.name;
|
|
41
31
|
}
|
|
42
32
|
if (isPlainObject(value) || isArray(value)) {
|
|
43
|
-
return /* @__PURE__ */ React.createElement(JSONFormatter, {
|
|
44
|
-
json: value,
|
|
45
|
-
open: 0
|
|
46
|
-
});
|
|
33
|
+
return /* @__PURE__ */ React.createElement(JSONFormatter, { json: value, open: 0 });
|
|
47
34
|
}
|
|
48
35
|
return String(value);
|
|
49
36
|
default:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DebugDetails.js","sources":["../../../../src/components/SceneDebugger/DebugDetails.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Input, JSONFormatter, useStyles2 } from '@grafana/ui';\nimport { isArray, isPlainObject } from 'lodash';\nimport React from 'react';\nimport { isSceneObject, SceneObject } from '../../core/types';\n\nexport interface Props {\n node: SceneObject;\n}\n\nexport function DebugDetails({ node }: Props) {\n const state = node.useState();\n const styles = useStyles2(getStyles);\n\n return (\n <div className={styles.container}>\n {Object.keys(state).map((key) => (\n <div className={styles.row} key={key}>\n <div className={styles.keyName}>{key}</div>\n <div className={styles.value}>{renderValue(key, (state as any)[key], node)}</div>\n </div>\n ))}\n </div>\n );\n}\n\nfunction renderValue(key: string, value: any, node: SceneObject) {\n if (value === null) {\n return 'null';\n }\n\n switch (typeof value) {\n case 'number':\n return (\n <Input\n type=\"number\"\n defaultValue={value}\n onBlur={(evt) => node.setState({ [key]: evt.currentTarget.valueAsNumber })}\n />\n );\n case 'string':\n return (\n <Input type=\"text\" defaultValue={value} onBlur={(evt) => node.setState({ [key]: evt.currentTarget.value })} />\n );\n case 'object':\n if (isSceneObject(value)) {\n return value.constructor.name;\n }\n if (isPlainObject(value) || isArray(value)) {\n return <JSONFormatter json={value} open={0} />;\n }\n return String(value);\n default:\n return typeof value;\n }\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n container: css({\n flexGrow: 1,\n display: 'flex',\n gap: theme.spacing(0.5),\n flexDirection: 'column',\n }),\n row: css({\n display: 'flex',\n gap: theme.spacing(2),\n }),\n keyName: css({\n display: 'flex',\n flexGrow: '0',\n width: 120,\n alignItems: 'center',\n height: theme.spacing(theme.components.height.md),\n }),\n value: css({\n flexGrow: 1,\n minHeight: theme.spacing(theme.components.height.md),\n display: 'flex',\n alignItems: 'center',\n }),\n };\n}\n"],"names":[],"mappings":";;;;;;AAWgB,SAAA,YAAA,CAAa,EAAE,IAAA,EAAe,EAAA;AAC5C,EAAM,MAAA,KAAA,GAAQ,KAAK,QAAS,EAAA
|
|
1
|
+
{"version":3,"file":"DebugDetails.js","sources":["../../../../src/components/SceneDebugger/DebugDetails.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Input, JSONFormatter, useStyles2 } from '@grafana/ui';\nimport { isArray, isPlainObject } from 'lodash';\nimport React from 'react';\nimport { isSceneObject, SceneObject } from '../../core/types';\n\nexport interface Props {\n node: SceneObject;\n}\n\nexport function DebugDetails({ node }: Props) {\n const state = node.useState();\n const styles = useStyles2(getStyles);\n\n return (\n <div className={styles.container}>\n {Object.keys(state).map((key) => (\n <div className={styles.row} key={key}>\n <div className={styles.keyName}>{key}</div>\n <div className={styles.value}>{renderValue(key, (state as any)[key], node)}</div>\n </div>\n ))}\n </div>\n );\n}\n\nfunction renderValue(key: string, value: any, node: SceneObject) {\n if (value === null) {\n return 'null';\n }\n\n switch (typeof value) {\n case 'number':\n return (\n <Input\n type=\"number\"\n defaultValue={value}\n onBlur={(evt) => node.setState({ [key]: evt.currentTarget.valueAsNumber })}\n />\n );\n case 'string':\n return (\n <Input type=\"text\" defaultValue={value} onBlur={(evt) => node.setState({ [key]: evt.currentTarget.value })} />\n );\n case 'object':\n if (isSceneObject(value)) {\n return value.constructor.name;\n }\n if (isPlainObject(value) || isArray(value)) {\n return <JSONFormatter json={value} open={0} />;\n }\n return String(value);\n default:\n return typeof value;\n }\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n container: css({\n flexGrow: 1,\n display: 'flex',\n gap: theme.spacing(0.5),\n flexDirection: 'column',\n }),\n row: css({\n display: 'flex',\n gap: theme.spacing(2),\n }),\n keyName: css({\n display: 'flex',\n flexGrow: '0',\n width: 120,\n alignItems: 'center',\n height: theme.spacing(theme.components.height.md),\n }),\n value: css({\n flexGrow: 1,\n minHeight: theme.spacing(theme.components.height.md),\n display: 'flex',\n alignItems: 'center',\n }),\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -8,22 +8,10 @@ function DebugTreeNode({ node, selectedObject, onSelect }) {
|
|
|
8
8
|
const isSelected = node === selectedObject;
|
|
9
9
|
node.forEachChild((child) => {
|
|
10
10
|
children.push(
|
|
11
|
-
/* @__PURE__ */ React.createElement(DebugTreeNode, {
|
|
12
|
-
node: child,
|
|
13
|
-
key: child.state.key,
|
|
14
|
-
selectedObject,
|
|
15
|
-
onSelect
|
|
16
|
-
})
|
|
11
|
+
/* @__PURE__ */ React.createElement(DebugTreeNode, { node: child, key: child.state.key, selectedObject, onSelect })
|
|
17
12
|
);
|
|
18
13
|
});
|
|
19
|
-
return /* @__PURE__ */ React.createElement("div", {
|
|
20
|
-
className: styles.container
|
|
21
|
-
}, /* @__PURE__ */ React.createElement("div", {
|
|
22
|
-
className: cx(styles.name, isSelected && styles.selected),
|
|
23
|
-
onClick: () => onSelect(node)
|
|
24
|
-
}, node.constructor.name), /* @__PURE__ */ React.createElement("div", {
|
|
25
|
-
className: styles.children
|
|
26
|
-
}, children));
|
|
14
|
+
return /* @__PURE__ */ React.createElement("div", { className: styles.container }, /* @__PURE__ */ React.createElement("div", { className: cx(styles.name, isSelected && styles.selected), onClick: () => onSelect(node) }, node.constructor.name), /* @__PURE__ */ React.createElement("div", { className: styles.children }, children));
|
|
27
15
|
}
|
|
28
16
|
function getStyles(theme) {
|
|
29
17
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DebugTreeNode.js","sources":["../../../../src/components/SceneDebugger/DebugTreeNode.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\nimport React, { ReactNode } from 'react';\nimport { SceneObject } from '../../core/types';\n\nexport interface Props {\n node: SceneObject;\n selectedObject?: SceneObject;\n onSelect: (node: SceneObject) => void;\n}\n\nexport function DebugTreeNode({ node, selectedObject, onSelect }: Props) {\n const styles = useStyles2(getStyles);\n const children: ReactNode[] = [];\n const isSelected = node === selectedObject;\n\n node.forEachChild((child) => {\n children.push(\n <DebugTreeNode node={child} key={child.state.key} selectedObject={selectedObject} onSelect={onSelect} />\n );\n });\n\n return (\n <div className={styles.container}>\n <div className={cx(styles.name, isSelected && styles.selected)} onClick={() => onSelect(node)}>\n {node.constructor.name}\n </div>\n <div className={styles.children}>{children}</div>\n </div>\n );\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n container: css({\n flexGrow: 1,\n display: 'flex',\n gap: theme.spacing(0.5),\n flexDirection: 'column',\n }),\n name: css({\n flexGrow: 1,\n display: 'flex',\n gap: theme.spacing(1),\n fontSize: theme.typography.bodySmall.fontSize,\n cursor: 'pointer',\n padding: theme.spacing(0, 1),\n borderRadius: theme.shape.borderRadius(2),\n position: 'relative',\n '&:hover': {\n background: theme.colors.background.secondary,\n },\n }),\n selected: css({\n '&::before': {\n display: 'block',\n content: \"' '\",\n position: 'absolute',\n left: 0,\n width: 4,\n bottom: 2,\n top: 2,\n borderRadius: theme.shape.radius.default,\n backgroundImage: theme.colors.gradients.brandVertical,\n },\n }),\n children: css({\n flexGrow: 1,\n display: 'flex',\n flexDirection: 'column',\n paddingLeft: theme.spacing(1),\n }),\n };\n}\n"],"names":[],"mappings":";;;;AAYO,SAAS,aAAc,CAAA,EAAE,IAAM,EAAA,cAAA,EAAgB,UAAmB,EAAA;AACvE,EAAM,MAAA,MAAA,GAAS,WAAW,SAAS,CAAA
|
|
1
|
+
{"version":3,"file":"DebugTreeNode.js","sources":["../../../../src/components/SceneDebugger/DebugTreeNode.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\nimport React, { ReactNode } from 'react';\nimport { SceneObject } from '../../core/types';\n\nexport interface Props {\n node: SceneObject;\n selectedObject?: SceneObject;\n onSelect: (node: SceneObject) => void;\n}\n\nexport function DebugTreeNode({ node, selectedObject, onSelect }: Props) {\n const styles = useStyles2(getStyles);\n const children: ReactNode[] = [];\n const isSelected = node === selectedObject;\n\n node.forEachChild((child) => {\n children.push(\n <DebugTreeNode node={child} key={child.state.key} selectedObject={selectedObject} onSelect={onSelect} />\n );\n });\n\n return (\n <div className={styles.container}>\n <div className={cx(styles.name, isSelected && styles.selected)} onClick={() => onSelect(node)}>\n {node.constructor.name}\n </div>\n <div className={styles.children}>{children}</div>\n </div>\n );\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n container: css({\n flexGrow: 1,\n display: 'flex',\n gap: theme.spacing(0.5),\n flexDirection: 'column',\n }),\n name: css({\n flexGrow: 1,\n display: 'flex',\n gap: theme.spacing(1),\n fontSize: theme.typography.bodySmall.fontSize,\n cursor: 'pointer',\n padding: theme.spacing(0, 1),\n borderRadius: theme.shape.borderRadius(2),\n position: 'relative',\n '&:hover': {\n background: theme.colors.background.secondary,\n },\n }),\n selected: css({\n '&::before': {\n display: 'block',\n content: \"' '\",\n position: 'absolute',\n left: 0,\n width: 4,\n bottom: 2,\n top: 2,\n borderRadius: theme.shape.radius.default,\n backgroundImage: theme.colors.gradients.brandVertical,\n },\n }),\n children: css({\n flexGrow: 1,\n display: 'flex',\n flexDirection: 'column',\n paddingLeft: theme.spacing(1),\n }),\n };\n}\n"],"names":[],"mappings":";;;;AAYO,SAAS,aAAc,CAAA,EAAE,IAAM,EAAA,cAAA,EAAgB,UAAmB,EAAA;AACvE,EAAM,MAAA,MAAA,GAAS,WAAW,SAAS,CAAA;AACnC,EAAA,MAAM,WAAwB,EAAC;AAC/B,EAAA,MAAM,aAAa,IAAS,KAAA,cAAA;AAE5B,EAAK,IAAA,CAAA,YAAA,CAAa,CAAC,KAAU,KAAA;AAC3B,IAAS,QAAA,CAAA,IAAA;AAAA,sBACP,KAAA,CAAA,aAAA,CAAC,iBAAc,IAAM,EAAA,KAAA,EAAO,KAAK,KAAM,CAAA,KAAA,CAAM,GAAK,EAAA,cAAA,EAAgC,QAAoB,EAAA;AAAA,KACxG;AAAA,GACD,CAAA;AAED,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,MAAA,CAAO,SACrB,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAW,EAAG,CAAA,MAAA,CAAO,IAAM,EAAA,UAAA,IAAc,OAAO,QAAQ,CAAA,EAAG,OAAS,EAAA,MAAM,QAAS,CAAA,IAAI,CACzF,EAAA,EAAA,IAAA,CAAK,WAAY,CAAA,IACpB,CACA,kBAAA,KAAA,CAAA,aAAA,CAAC,KAAI,EAAA,EAAA,SAAA,EAAW,MAAO,CAAA,QAAA,EAAA,EAAW,QAAS,CAC7C,CAAA;AAEJ;AAEA,SAAS,UAAU,KAAsB,EAAA;AACvC,EAAO,OAAA;AAAA,IACL,WAAW,GAAI,CAAA;AAAA,MACb,QAAU,EAAA,CAAA;AAAA,MACV,OAAS,EAAA,MAAA;AAAA,MACT,GAAA,EAAK,KAAM,CAAA,OAAA,CAAQ,GAAG,CAAA;AAAA,MACtB,aAAe,EAAA;AAAA,KAChB,CAAA;AAAA,IACD,MAAM,GAAI,CAAA;AAAA,MACR,QAAU,EAAA,CAAA;AAAA,MACV,OAAS,EAAA,MAAA;AAAA,MACT,GAAA,EAAK,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,MACpB,QAAA,EAAU,KAAM,CAAA,UAAA,CAAW,SAAU,CAAA,QAAA;AAAA,MACrC,MAAQ,EAAA,SAAA;AAAA,MACR,OAAS,EAAA,KAAA,CAAM,OAAQ,CAAA,CAAA,EAAG,CAAC,CAAA;AAAA,MAC3B,YAAc,EAAA,KAAA,CAAM,KAAM,CAAA,YAAA,CAAa,CAAC,CAAA;AAAA,MACxC,QAAU,EAAA,UAAA;AAAA,MACV,SAAW,EAAA;AAAA,QACT,UAAA,EAAY,KAAM,CAAA,MAAA,CAAO,UAAW,CAAA;AAAA;AACtC,KACD,CAAA;AAAA,IACD,UAAU,GAAI,CAAA;AAAA,MACZ,WAAa,EAAA;AAAA,QACX,OAAS,EAAA,OAAA;AAAA,QACT,OAAS,EAAA,KAAA;AAAA,QACT,QAAU,EAAA,UAAA;AAAA,QACV,IAAM,EAAA,CAAA;AAAA,QACN,KAAO,EAAA,CAAA;AAAA,QACP,MAAQ,EAAA,CAAA;AAAA,QACR,GAAK,EAAA,CAAA;AAAA,QACL,YAAA,EAAc,KAAM,CAAA,KAAA,CAAM,MAAO,CAAA,OAAA;AAAA,QACjC,eAAA,EAAiB,KAAM,CAAA,MAAA,CAAO,SAAU,CAAA;AAAA;AAC1C,KACD,CAAA;AAAA,IACD,UAAU,GAAI,CAAA;AAAA,MACZ,QAAU,EAAA,CAAA;AAAA,MACV,OAAS,EAAA,MAAA;AAAA,MACT,aAAe,EAAA,QAAA;AAAA,MACf,WAAA,EAAa,KAAM,CAAA,OAAA,CAAQ,CAAC;AAAA,KAC7B;AAAA,GACH;AACF;;;;"}
|
|
@@ -8,35 +8,7 @@ function SceneDebugger({ scene }) {
|
|
|
8
8
|
const styles = useStyles2(getStyles);
|
|
9
9
|
const [isOpen, setIsOpen] = useState(false);
|
|
10
10
|
const [selectedObject, setSelectedObject] = useState();
|
|
11
|
-
return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(ToolbarButton, {
|
|
12
|
-
variant: "canvas",
|
|
13
|
-
icon: "bug",
|
|
14
|
-
onClick: () => setIsOpen(true)
|
|
15
|
-
}), isOpen && /* @__PURE__ */ React.createElement(Drawer, {
|
|
16
|
-
title: "Scene debugger",
|
|
17
|
-
onClose: () => setIsOpen(false),
|
|
18
|
-
size: "lg"
|
|
19
|
-
}, /* @__PURE__ */ React.createElement("div", {
|
|
20
|
-
className: styles.panes
|
|
21
|
-
}, /* @__PURE__ */ React.createElement("div", {
|
|
22
|
-
className: styles.pane1
|
|
23
|
-
}, /* @__PURE__ */ React.createElement("div", {
|
|
24
|
-
className: styles.paneHeading
|
|
25
|
-
}, "Scene graph"), /* @__PURE__ */ React.createElement(CustomScrollbar, {
|
|
26
|
-
autoHeightMin: "100%"
|
|
27
|
-
}, /* @__PURE__ */ React.createElement("div", {
|
|
28
|
-
className: styles.treeWrapper
|
|
29
|
-
}, /* @__PURE__ */ React.createElement(DebugTreeNode, {
|
|
30
|
-
node: scene,
|
|
31
|
-
selectedObject,
|
|
32
|
-
onSelect: setSelectedObject
|
|
33
|
-
})))), /* @__PURE__ */ React.createElement("div", {
|
|
34
|
-
className: styles.pane2
|
|
35
|
-
}, /* @__PURE__ */ React.createElement("div", {
|
|
36
|
-
className: styles.paneHeading
|
|
37
|
-
}, "Object details"), selectedObject && /* @__PURE__ */ React.createElement(DebugDetails, {
|
|
38
|
-
node: selectedObject
|
|
39
|
-
})))));
|
|
11
|
+
return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(ToolbarButton, { variant: "canvas", icon: "bug", onClick: () => setIsOpen(true) }), isOpen && /* @__PURE__ */ React.createElement(Drawer, { title: "Scene debugger", onClose: () => setIsOpen(false), size: "lg" }, /* @__PURE__ */ React.createElement("div", { className: styles.panes }, /* @__PURE__ */ React.createElement("div", { className: styles.pane1 }, /* @__PURE__ */ React.createElement("div", { className: styles.paneHeading }, "Scene graph"), /* @__PURE__ */ React.createElement(CustomScrollbar, { autoHeightMin: "100%" }, /* @__PURE__ */ React.createElement("div", { className: styles.treeWrapper }, /* @__PURE__ */ React.createElement(DebugTreeNode, { node: scene, selectedObject, onSelect: setSelectedObject })))), /* @__PURE__ */ React.createElement("div", { className: styles.pane2 }, /* @__PURE__ */ React.createElement("div", { className: styles.paneHeading }, "Object details"), selectedObject && /* @__PURE__ */ React.createElement(DebugDetails, { node: selectedObject })))));
|
|
40
12
|
}
|
|
41
13
|
function getStyles(theme) {
|
|
42
14
|
return {
|