@grafana/scenes 6.5.0 → 6.5.1--canary.1077.13964702348.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/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 +88 -104
- 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 +15 -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 +23 -47
- 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 +43 -55
- 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 +20 -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 +36 -6
- package/dist/index.js +2035 -2791
- package/dist/index.js.map +1 -1
- package/package.json +9 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../../../../../src/querying/layers/annotations/utils.ts"],"sourcesContent":["// These opt outs are here only for quicker and easier migration to react based annotations editors and because\n// annotation support API needs some work to support less \"standard\" editors like prometheus and here it is not\n// polluting public API.\n\nimport { AnnotationEvent, AnnotationQuery, DataSourceApi } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { cloneDeep, concat, every, find, groupBy, head, map, partition } from 'lodash';\n\nconst legacyRunner = [\n 'prometheus',\n 'loki',\n 'elasticsearch',\n 'grafana-opensearch-datasource', // external\n];\n\n/**\n * Use legacy runner. Used only as an escape hatch for easier transition to React based annotation editor.\n */\nexport function shouldUseLegacyRunner(datasource: DataSourceApi): boolean {\n const { type } = datasource;\n return !datasource.annotations || legacyRunner.includes(type);\n}\n\nexport function postProcessQueryResult(annotation: AnnotationQuery, results: AnnotationEvent[]): AnnotationEvent[] {\n // if annotation has snapshotData\n // make clone and remove it\n if (annotation.snapshotData) {\n annotation = cloneDeep(annotation);\n delete annotation.snapshotData;\n }\n\n //\n const processed = results.map((item) => {\n const processedItem = { ...item };\n\n processedItem.source = annotation;\n processedItem.color = config.theme2.visualization.getColorByName(annotation.iconColor);\n processedItem.type = annotation.name;\n processedItem.isRegion = Boolean(processedItem.timeEnd && processedItem.time !== processedItem.timeEnd);\n\n switch (processedItem.newState?.toLowerCase()) {\n case 'pending':\n processedItem.color = 'yellow';\n break;\n case 'alerting':\n processedItem.color = 'red';\n break;\n case 'ok':\n processedItem.color = 'green';\n break;\n case 'normal': // ngalert (\"normal\" instead of \"ok\")\n processedItem.color = 'green';\n break;\n case 'no_data':\n processedItem.color = 'gray';\n break;\n case 'nodata': // ngalert\n processedItem.color = 'gray';\n break;\n }\n\n return processedItem;\n });\n\n return processed;\n}\n\nexport function dedupAnnotations(annotations: any) {\n let dedup = [];\n\n // Split events by annotationId property existence\n const events = partition(annotations, 'id');\n\n const eventsById = groupBy(events[0], 'id');\n dedup = map(eventsById, (eventGroup) => {\n if (eventGroup.length > 1 && !every(eventGroup, isPanelAlert)) {\n // Get first non-panel alert\n return find(eventGroup, (event) => {\n return event.eventType !== 'panel-alert';\n });\n } else {\n return head(eventGroup);\n }\n });\n\n dedup = concat(dedup, events[1]);\n return dedup;\n}\n\nfunction isPanelAlert(event: { eventType: string }) {\n return event.eventType === 'panel-alert';\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../../../src/querying/layers/annotations/utils.ts"],"sourcesContent":["// These opt outs are here only for quicker and easier migration to react based annotations editors and because\n// annotation support API needs some work to support less \"standard\" editors like prometheus and here it is not\n// polluting public API.\n\nimport { AnnotationEvent, AnnotationQuery, DataSourceApi } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { cloneDeep, concat, every, find, groupBy, head, map, partition } from 'lodash';\n\nconst legacyRunner = [\n 'prometheus',\n 'loki',\n 'elasticsearch',\n 'grafana-opensearch-datasource', // external\n];\n\n/**\n * Use legacy runner. Used only as an escape hatch for easier transition to React based annotation editor.\n */\nexport function shouldUseLegacyRunner(datasource: DataSourceApi): boolean {\n const { type } = datasource;\n return !datasource.annotations || legacyRunner.includes(type);\n}\n\nexport function postProcessQueryResult(annotation: AnnotationQuery, results: AnnotationEvent[]): AnnotationEvent[] {\n // if annotation has snapshotData\n // make clone and remove it\n if (annotation.snapshotData) {\n annotation = cloneDeep(annotation);\n delete annotation.snapshotData;\n }\n\n //\n const processed = results.map((item) => {\n const processedItem = { ...item };\n\n processedItem.source = annotation;\n processedItem.color = config.theme2.visualization.getColorByName(annotation.iconColor);\n processedItem.type = annotation.name;\n processedItem.isRegion = Boolean(processedItem.timeEnd && processedItem.time !== processedItem.timeEnd);\n\n switch (processedItem.newState?.toLowerCase()) {\n case 'pending':\n processedItem.color = 'yellow';\n break;\n case 'alerting':\n processedItem.color = 'red';\n break;\n case 'ok':\n processedItem.color = 'green';\n break;\n case 'normal': // ngalert (\"normal\" instead of \"ok\")\n processedItem.color = 'green';\n break;\n case 'no_data':\n processedItem.color = 'gray';\n break;\n case 'nodata': // ngalert\n processedItem.color = 'gray';\n break;\n }\n\n return processedItem;\n });\n\n return processed;\n}\n\nexport function dedupAnnotations(annotations: any) {\n let dedup = [];\n\n // Split events by annotationId property existence\n const events = partition(annotations, 'id');\n\n const eventsById = groupBy(events[0], 'id');\n dedup = map(eventsById, (eventGroup) => {\n if (eventGroup.length > 1 && !every(eventGroup, isPanelAlert)) {\n // Get first non-panel alert\n return find(eventGroup, (event) => {\n return event.eventType !== 'panel-alert';\n });\n } else {\n return head(eventGroup);\n }\n });\n\n dedup = concat(dedup, events[1]);\n return dedup;\n}\n\nfunction isPanelAlert(event: { eventType: string }) {\n return event.eventType === 'panel-alert';\n}\n"],"names":[],"mappings":";;;AAuBgB,SAAA,sBAAA,CAAuB,YAA6B,OAA+C,EAAA;AAGjH,EAAA,IAAI,WAAW,YAAc,EAAA;AAC3B,IAAA,UAAA,GAAa,UAAU,UAAU,CAAA;AACjC,IAAA,OAAO,UAAW,CAAA,YAAA;AAAA;AAIpB,EAAA,MAAM,SAAY,GAAA,OAAA,CAAQ,GAAI,CAAA,CAAC,IAAS,KAAA;AAhC1C,IAAA,IAAA,EAAA;AAiCI,IAAM,MAAA,aAAA,GAAgB,EAAE,GAAG,IAAK,EAAA;AAEhC,IAAA,aAAA,CAAc,MAAS,GAAA,UAAA;AACvB,IAAA,aAAA,CAAc,QAAQ,MAAO,CAAA,MAAA,CAAO,aAAc,CAAA,cAAA,CAAe,WAAW,SAAS,CAAA;AACrF,IAAA,aAAA,CAAc,OAAO,UAAW,CAAA,IAAA;AAChC,IAAA,aAAA,CAAc,WAAW,OAAQ,CAAA,aAAA,CAAc,WAAW,aAAc,CAAA,IAAA,KAAS,cAAc,OAAO,CAAA;AAEtG,IAAQ,QAAA,CAAA,EAAA,GAAA,aAAA,CAAc,QAAd,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAwB,WAAe,EAAA;AAAA,MAC7C,KAAK,SAAA;AACH,QAAA,aAAA,CAAc,KAAQ,GAAA,QAAA;AACtB,QAAA;AAAA,MACF,KAAK,UAAA;AACH,QAAA,aAAA,CAAc,KAAQ,GAAA,KAAA;AACtB,QAAA;AAAA,MACF,KAAK,IAAA;AACH,QAAA,aAAA,CAAc,KAAQ,GAAA,OAAA;AACtB,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,aAAA,CAAc,KAAQ,GAAA,OAAA;AACtB,QAAA;AAAA,MACF,KAAK,SAAA;AACH,QAAA,aAAA,CAAc,KAAQ,GAAA,MAAA;AACtB,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,aAAA,CAAc,KAAQ,GAAA,MAAA;AACtB,QAAA;AAAA;AAGJ,IAAO,OAAA,aAAA;AAAA,GACR,CAAA;AAED,EAAO,OAAA,SAAA;AACT;AAEO,SAAS,iBAAiB,WAAkB,EAAA;AACjD,EAAA,IAAI,QAAQ,EAAC;AAGb,EAAM,MAAA,MAAA,GAAS,SAAU,CAAA,WAAA,EAAa,IAAI,CAAA;AAE1C,EAAA,MAAM,UAAa,GAAA,OAAA,CAAQ,MAAO,CAAA,CAAC,GAAG,IAAI,CAAA;AAC1C,EAAQ,KAAA,GAAA,GAAA,CAAI,UAAY,EAAA,CAAC,UAAe,KAAA;AACtC,IAAA,IAAI,WAAW,MAAS,GAAA,CAAA,IAAK,CAAC,KAAM,CAAA,UAAA,EAAY,YAAY,CAAG,EAAA;AAE7D,MAAO,OAAA,IAAA,CAAK,UAAY,EAAA,CAAC,KAAU,KAAA;AACjC,QAAA,OAAO,MAAM,SAAc,KAAA,aAAA;AAAA,OAC5B,CAAA;AAAA,KACI,MAAA;AACL,MAAA,OAAO,KAAK,UAAU,CAAA;AAAA;AACxB,GACD,CAAA;AAED,EAAA,KAAA,GAAQ,MAAO,CAAA,KAAA,EAAO,MAAO,CAAA,CAAC,CAAC,CAAA;AAC/B,EAAO,OAAA,KAAA;AACT;AAEA,SAAS,aAAa,KAA8B,EAAA;AAClD,EAAA,OAAO,MAAM,SAAc,KAAA,aAAA;AAC7B;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registerQueryWithController.js","sources":["../../../src/querying/registerQueryWithController.ts"],"sourcesContent":["import { Observable, catchError, from, map } from 'rxjs';\nimport { LoadingState } from '@grafana/schema';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { QueryResultWithState, SceneQueryControllerEntry } from '../behaviors/types';\n\n/**\n * Will look for a scene object with a behavior that is a SceneQueryController and register the query with it.\n */\nexport function registerQueryWithController<T extends QueryResultWithState>(entry: SceneQueryControllerEntry) {\n return (queryStream: Observable<T>) => {\n const queryControler = sceneGraph.getQueryController(entry.origin);\n if (!queryControler) {\n return queryStream;\n }\n\n return new Observable<T>((observer) => {\n if (!entry.cancel) {\n entry.cancel = () => observer.complete();\n }\n\n queryControler.queryStarted(entry);\n let markedAsCompleted = false;\n\n const sub = queryStream.subscribe({\n next: (v) => {\n if (!markedAsCompleted && v.state !== LoadingState.Loading) {\n markedAsCompleted = true;\n queryControler.queryCompleted(entry);\n }\n\n observer.next(v);\n },\n error: (e) => observer.error(e),\n complete: () => {\n observer.complete();\n },\n });\n\n return () => {\n sub.unsubscribe();\n\n if (!markedAsCompleted) {\n queryControler.queryCompleted(entry);\n }\n };\n });\n };\n}\n\n// Wraps an arbitrary Promise in an observble that emits Promise state\nexport function wrapPromiseInStateObservable(promise: Promise<any>): Observable<QueryResultWithState> {\n return new Observable<QueryResultWithState>((observer) => {\n // Emit 'loading' state initially\n observer.next({ state: LoadingState.Loading });\n\n // Convert the promise to an observable\n const promiseObservable = from(promise);\n\n // Subscribe to the promise observable\n promiseObservable\n .pipe(\n map(() => ({ state: LoadingState.Done })),\n\n catchError(() => {\n observer.next({ state: LoadingState.Error });\n return [];\n })\n )\n .subscribe({\n next: (result) => observer.next(result),\n complete: () => observer.complete(),\n });\n });\n}\n"],"names":[],"mappings":";;;;AAQO,SAAS,4BAA4D,KAAkC,EAAA;AAC5G,EAAA,OAAO,CAAC,WAA+B,KAAA;AACrC,IAAA,MAAM,cAAiB,GAAA,UAAA,CAAW,kBAAmB,CAAA,KAAA,CAAM,MAAM,CAAA
|
|
1
|
+
{"version":3,"file":"registerQueryWithController.js","sources":["../../../src/querying/registerQueryWithController.ts"],"sourcesContent":["import { Observable, catchError, from, map } from 'rxjs';\nimport { LoadingState } from '@grafana/schema';\nimport { sceneGraph } from '../core/sceneGraph';\nimport { QueryResultWithState, SceneQueryControllerEntry } from '../behaviors/types';\n\n/**\n * Will look for a scene object with a behavior that is a SceneQueryController and register the query with it.\n */\nexport function registerQueryWithController<T extends QueryResultWithState>(entry: SceneQueryControllerEntry) {\n return (queryStream: Observable<T>) => {\n const queryControler = sceneGraph.getQueryController(entry.origin);\n if (!queryControler) {\n return queryStream;\n }\n\n return new Observable<T>((observer) => {\n if (!entry.cancel) {\n entry.cancel = () => observer.complete();\n }\n\n queryControler.queryStarted(entry);\n let markedAsCompleted = false;\n\n const sub = queryStream.subscribe({\n next: (v) => {\n if (!markedAsCompleted && v.state !== LoadingState.Loading) {\n markedAsCompleted = true;\n queryControler.queryCompleted(entry);\n }\n\n observer.next(v);\n },\n error: (e) => observer.error(e),\n complete: () => {\n observer.complete();\n },\n });\n\n return () => {\n sub.unsubscribe();\n\n if (!markedAsCompleted) {\n queryControler.queryCompleted(entry);\n }\n };\n });\n };\n}\n\n// Wraps an arbitrary Promise in an observble that emits Promise state\nexport function wrapPromiseInStateObservable(promise: Promise<any>): Observable<QueryResultWithState> {\n return new Observable<QueryResultWithState>((observer) => {\n // Emit 'loading' state initially\n observer.next({ state: LoadingState.Loading });\n\n // Convert the promise to an observable\n const promiseObservable = from(promise);\n\n // Subscribe to the promise observable\n promiseObservable\n .pipe(\n map(() => ({ state: LoadingState.Done })),\n\n catchError(() => {\n observer.next({ state: LoadingState.Error });\n return [];\n })\n )\n .subscribe({\n next: (result) => observer.next(result),\n complete: () => observer.complete(),\n });\n });\n}\n"],"names":[],"mappings":";;;;AAQO,SAAS,4BAA4D,KAAkC,EAAA;AAC5G,EAAA,OAAO,CAAC,WAA+B,KAAA;AACrC,IAAA,MAAM,cAAiB,GAAA,UAAA,CAAW,kBAAmB,CAAA,KAAA,CAAM,MAAM,CAAA;AACjE,IAAA,IAAI,CAAC,cAAgB,EAAA;AACnB,MAAO,OAAA,WAAA;AAAA;AAGT,IAAO,OAAA,IAAI,UAAc,CAAA,CAAC,QAAa,KAAA;AACrC,MAAI,IAAA,CAAC,MAAM,MAAQ,EAAA;AACjB,QAAM,KAAA,CAAA,MAAA,GAAS,MAAM,QAAA,CAAS,QAAS,EAAA;AAAA;AAGzC,MAAA,cAAA,CAAe,aAAa,KAAK,CAAA;AACjC,MAAA,IAAI,iBAAoB,GAAA,KAAA;AAExB,MAAM,MAAA,GAAA,GAAM,YAAY,SAAU,CAAA;AAAA,QAChC,IAAA,EAAM,CAAC,CAAM,KAAA;AACX,UAAA,IAAI,CAAC,iBAAA,IAAqB,CAAE,CAAA,KAAA,KAAU,aAAa,OAAS,EAAA;AAC1D,YAAoB,iBAAA,GAAA,IAAA;AACpB,YAAA,cAAA,CAAe,eAAe,KAAK,CAAA;AAAA;AAGrC,UAAA,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,SACjB;AAAA,QACA,KAAO,EAAA,CAAC,CAAM,KAAA,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA,QAC9B,UAAU,MAAM;AACd,UAAA,QAAA,CAAS,QAAS,EAAA;AAAA;AACpB,OACD,CAAA;AAED,MAAA,OAAO,MAAM;AACX,QAAA,GAAA,CAAI,WAAY,EAAA;AAEhB,QAAA,IAAI,CAAC,iBAAmB,EAAA;AACtB,UAAA,cAAA,CAAe,eAAe,KAAK,CAAA;AAAA;AACrC,OACF;AAAA,KACD,CAAA;AAAA,GACH;AACF;AAGO,SAAS,6BAA6B,OAAyD,EAAA;AACpG,EAAO,OAAA,IAAI,UAAiC,CAAA,CAAC,QAAa,KAAA;AAExD,IAAA,QAAA,CAAS,IAAK,CAAA,EAAE,KAAO,EAAA,YAAA,CAAa,SAAS,CAAA;AAG7C,IAAM,MAAA,iBAAA,GAAoB,KAAK,OAAO,CAAA;AAGtC,IACG,iBAAA,CAAA,IAAA;AAAA,MACC,IAAI,OAAO,EAAE,KAAO,EAAA,YAAA,CAAa,MAAO,CAAA,CAAA;AAAA,MAExC,WAAW,MAAM;AACf,QAAA,QAAA,CAAS,IAAK,CAAA,EAAE,KAAO,EAAA,YAAA,CAAa,OAAO,CAAA;AAC3C,QAAA,OAAO,EAAC;AAAA,OACT;AAAA,MAEF,SAAU,CAAA;AAAA,MACT,IAAM,EAAA,CAAC,MAAW,KAAA,QAAA,CAAS,KAAK,MAAM,CAAA;AAAA,MACtC,QAAA,EAAU,MAAM,QAAA,CAAS,QAAS;AAAA,KACnC,CAAA;AAAA,GACJ,CAAA;AACH;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SceneObjectUrlSyncConfig.js","sources":["../../../src/services/SceneObjectUrlSyncConfig.ts"],"sourcesContent":["import { SceneObjectUrlSyncHandler, SceneObjectWithUrlSync, SceneObjectUrlValues } from '../core/types';\n\ninterface SceneObjectUrlSyncConfigOptions {\n keys: string[] | (() => string[]);\n}\n\nexport class SceneObjectUrlSyncConfig implements SceneObjectUrlSyncHandler {\n private _keys: string[] | (() => string[]);\n private _nextChangeShouldAddHistoryStep = false;\n\n public constructor(private _sceneObject: SceneObjectWithUrlSync, _options: SceneObjectUrlSyncConfigOptions) {\n this._keys = _options.keys;\n }\n\n public getKeys(): string[] {\n if (typeof this._keys === 'function') {\n return this._keys();\n }\n\n return this._keys;\n }\n\n public getUrlState(): SceneObjectUrlValues {\n return this._sceneObject.getUrlState();\n }\n\n public updateFromUrl(values: SceneObjectUrlValues): void {\n this._sceneObject.updateFromUrl(values);\n }\n\n public shouldCreateHistoryStep(values: SceneObjectUrlValues): boolean {\n return this._nextChangeShouldAddHistoryStep;\n }\n\n public performBrowserHistoryAction(callback: () => void) {\n this._nextChangeShouldAddHistoryStep = true;\n callback();\n this._nextChangeShouldAddHistoryStep = false;\n }\n}\n"],"names":[],"mappings":"AAMO,MAAM,wBAA8D,CAAA;AAAA,EAIlE,WAAA,CAAoB,cAAsC,QAA2C,EAAA;AAAjF,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA
|
|
1
|
+
{"version":3,"file":"SceneObjectUrlSyncConfig.js","sources":["../../../src/services/SceneObjectUrlSyncConfig.ts"],"sourcesContent":["import { SceneObjectUrlSyncHandler, SceneObjectWithUrlSync, SceneObjectUrlValues } from '../core/types';\n\ninterface SceneObjectUrlSyncConfigOptions {\n keys: string[] | (() => string[]);\n}\n\nexport class SceneObjectUrlSyncConfig implements SceneObjectUrlSyncHandler {\n private _keys: string[] | (() => string[]);\n private _nextChangeShouldAddHistoryStep = false;\n\n public constructor(private _sceneObject: SceneObjectWithUrlSync, _options: SceneObjectUrlSyncConfigOptions) {\n this._keys = _options.keys;\n }\n\n public getKeys(): string[] {\n if (typeof this._keys === 'function') {\n return this._keys();\n }\n\n return this._keys;\n }\n\n public getUrlState(): SceneObjectUrlValues {\n return this._sceneObject.getUrlState();\n }\n\n public updateFromUrl(values: SceneObjectUrlValues): void {\n this._sceneObject.updateFromUrl(values);\n }\n\n public shouldCreateHistoryStep(values: SceneObjectUrlValues): boolean {\n return this._nextChangeShouldAddHistoryStep;\n }\n\n public performBrowserHistoryAction(callback: () => void) {\n this._nextChangeShouldAddHistoryStep = true;\n callback();\n this._nextChangeShouldAddHistoryStep = false;\n }\n}\n"],"names":[],"mappings":"AAMO,MAAM,wBAA8D,CAAA;AAAA,EAIlE,WAAA,CAAoB,cAAsC,QAA2C,EAAA;AAAjF,IAAA,IAAA,CAAA,YAAA,GAAA,YAAA;AAF3B,IAAA,IAAA,CAAQ,+BAAkC,GAAA,KAAA;AAGxC,IAAA,IAAA,CAAK,QAAQ,QAAS,CAAA,IAAA;AAAA;AACxB,EAEO,OAAoB,GAAA;AACzB,IAAI,IAAA,OAAO,IAAK,CAAA,KAAA,KAAU,UAAY,EAAA;AACpC,MAAA,OAAO,KAAK,KAAM,EAAA;AAAA;AAGpB,IAAA,OAAO,IAAK,CAAA,KAAA;AAAA;AACd,EAEO,WAAoC,GAAA;AACzC,IAAO,OAAA,IAAA,CAAK,aAAa,WAAY,EAAA;AAAA;AACvC,EAEO,cAAc,MAAoC,EAAA;AACvD,IAAK,IAAA,CAAA,YAAA,CAAa,cAAc,MAAM,CAAA;AAAA;AACxC,EAEO,wBAAwB,MAAuC,EAAA;AACpE,IAAA,OAAO,IAAK,CAAA,+BAAA;AAAA;AACd,EAEO,4BAA4B,QAAsB,EAAA;AACvD,IAAA,IAAA,CAAK,+BAAkC,GAAA,IAAA;AACvC,IAAS,QAAA,EAAA;AACT,IAAA,IAAA,CAAK,+BAAkC,GAAA,KAAA;AAAA;AAE3C;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UniqueUrlKeyMapper.js","sources":["../../../src/services/UniqueUrlKeyMapper.ts"],"sourcesContent":["import { sceneGraph } from '../core/sceneGraph';\nimport { SceneObject } from '../core/types';\n\nexport interface SceneObjectWithDepth {\n sceneObject: SceneObject;\n depth: number;\n}\n\nexport class UniqueUrlKeyMapper {\n private index = new Map<string, SceneObject[]>();\n\n public getUniqueKey(key: string, obj: SceneObject) {\n const objectsWithKey = this.index.get(key);\n\n if (!objectsWithKey) {\n this.index.set(key, [obj]);\n return key;\n }\n\n let address = objectsWithKey.findIndex((o) => o === obj);\n if (address === -1) {\n filterOutOrphanedObjects(objectsWithKey);\n objectsWithKey.push(obj);\n\n address = objectsWithKey.length - 1;\n }\n\n if (address > 0) {\n return `${key}-${address + 1}`;\n }\n\n return key;\n }\n\n public clear() {\n this.index.clear();\n }\n}\n\nfunction filterOutOrphanedObjects(sceneObjects: SceneObject[]) {\n for (const obj of sceneObjects) {\n if (isOrphanOrInActive(obj)) {\n const index = sceneObjects.indexOf(obj);\n sceneObjects.splice(index, 1);\n }\n }\n}\n\nfunction isOrphanOrInActive(obj: SceneObject) {\n const root = obj.getRoot();\n\n // If we cannot find it from the root it's an orphan\n if (!sceneGraph.findObject(root, (child) => child === obj)) {\n return true;\n }\n\n return false;\n}\n"],"names":[],"mappings":";;AAQO,MAAM,kBAAmB,CAAA;AAAA,EAAzB,WAAA,GAAA;AACL,IAAQ,IAAA,CAAA,KAAA,uBAAY,GAA2B,EAAA
|
|
1
|
+
{"version":3,"file":"UniqueUrlKeyMapper.js","sources":["../../../src/services/UniqueUrlKeyMapper.ts"],"sourcesContent":["import { sceneGraph } from '../core/sceneGraph';\nimport { SceneObject } from '../core/types';\n\nexport interface SceneObjectWithDepth {\n sceneObject: SceneObject;\n depth: number;\n}\n\nexport class UniqueUrlKeyMapper {\n private index = new Map<string, SceneObject[]>();\n\n public getUniqueKey(key: string, obj: SceneObject) {\n const objectsWithKey = this.index.get(key);\n\n if (!objectsWithKey) {\n this.index.set(key, [obj]);\n return key;\n }\n\n let address = objectsWithKey.findIndex((o) => o === obj);\n if (address === -1) {\n filterOutOrphanedObjects(objectsWithKey);\n objectsWithKey.push(obj);\n\n address = objectsWithKey.length - 1;\n }\n\n if (address > 0) {\n return `${key}-${address + 1}`;\n }\n\n return key;\n }\n\n public clear() {\n this.index.clear();\n }\n}\n\nfunction filterOutOrphanedObjects(sceneObjects: SceneObject[]) {\n for (const obj of sceneObjects) {\n if (isOrphanOrInActive(obj)) {\n const index = sceneObjects.indexOf(obj);\n sceneObjects.splice(index, 1);\n }\n }\n}\n\nfunction isOrphanOrInActive(obj: SceneObject) {\n const root = obj.getRoot();\n\n // If we cannot find it from the root it's an orphan\n if (!sceneGraph.findObject(root, (child) => child === obj)) {\n return true;\n }\n\n return false;\n}\n"],"names":[],"mappings":";;AAQO,MAAM,kBAAmB,CAAA;AAAA,EAAzB,WAAA,GAAA;AACL,IAAQ,IAAA,CAAA,KAAA,uBAAY,GAA2B,EAAA;AAAA;AAAA,EAExC,YAAA,CAAa,KAAa,GAAkB,EAAA;AACjD,IAAA,MAAM,cAAiB,GAAA,IAAA,CAAK,KAAM,CAAA,GAAA,CAAI,GAAG,CAAA;AAEzC,IAAA,IAAI,CAAC,cAAgB,EAAA;AACnB,MAAA,IAAA,CAAK,KAAM,CAAA,GAAA,CAAI,GAAK,EAAA,CAAC,GAAG,CAAC,CAAA;AACzB,MAAO,OAAA,GAAA;AAAA;AAGT,IAAA,IAAI,UAAU,cAAe,CAAA,SAAA,CAAU,CAAC,CAAA,KAAM,MAAM,GAAG,CAAA;AACvD,IAAA,IAAI,YAAY,EAAI,EAAA;AAClB,MAAA,wBAAA,CAAyB,cAAc,CAAA;AACvC,MAAA,cAAA,CAAe,KAAK,GAAG,CAAA;AAEvB,MAAA,OAAA,GAAU,eAAe,MAAS,GAAA,CAAA;AAAA;AAGpC,IAAA,IAAI,UAAU,CAAG,EAAA;AACf,MAAA,OAAO,CAAG,EAAA,GAAG,CAAI,CAAA,EAAA,OAAA,GAAU,CAAC,CAAA,CAAA;AAAA;AAG9B,IAAO,OAAA,GAAA;AAAA;AACT,EAEO,KAAQ,GAAA;AACb,IAAA,IAAA,CAAK,MAAM,KAAM,EAAA;AAAA;AAErB;AAEA,SAAS,yBAAyB,YAA6B,EAAA;AAC7D,EAAA,KAAA,MAAW,OAAO,YAAc,EAAA;AAC9B,IAAI,IAAA,kBAAA,CAAmB,GAAG,CAAG,EAAA;AAC3B,MAAM,MAAA,KAAA,GAAQ,YAAa,CAAA,OAAA,CAAQ,GAAG,CAAA;AACtC,MAAa,YAAA,CAAA,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA;AAC9B;AAEJ;AAEA,SAAS,mBAAmB,GAAkB,EAAA;AAC5C,EAAM,MAAA,IAAA,GAAO,IAAI,OAAQ,EAAA;AAGzB,EAAI,IAAA,CAAC,WAAW,UAAW,CAAA,IAAA,EAAM,CAAC,KAAU,KAAA,KAAA,KAAU,GAAG,CAAG,EAAA;AAC1D,IAAO,OAAA,IAAA;AAAA;AAGT,EAAO,OAAA,KAAA;AACT;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UrlSyncContextProvider.js","sources":["../../../src/services/UrlSyncContextProvider.ts"],"sourcesContent":["import { SceneObject, SceneUrlSyncOptions } from '../core/types';\nimport { useUrlSync } from './useUrlSync';\n\nexport interface UrlSyncContextProviderProps extends SceneUrlSyncOptions {\n scene: SceneObject;\n children: React.ReactNode;\n}\n\n/**\n * Right now this is actually not defining a context, but think it might in the future (with UrlSyncManager as the context value)\n */\n\nexport function UrlSyncContextProvider({\n children,\n scene,\n updateUrlOnInit,\n createBrowserHistorySteps,\n}: UrlSyncContextProviderProps) {\n const isInitialized = useUrlSync(scene, { updateUrlOnInit, createBrowserHistorySteps });\n\n if (!isInitialized) {\n return null;\n }\n\n return children;\n}\n"],"names":[],"mappings":";;AAYO,SAAS,sBAAuB,CAAA;AAAA,EACrC,QAAA;AAAA,EACA,KAAA;AAAA,EACA,eAAA;AAAA,EACA
|
|
1
|
+
{"version":3,"file":"UrlSyncContextProvider.js","sources":["../../../src/services/UrlSyncContextProvider.ts"],"sourcesContent":["import { SceneObject, SceneUrlSyncOptions } from '../core/types';\nimport { useUrlSync } from './useUrlSync';\n\nexport interface UrlSyncContextProviderProps extends SceneUrlSyncOptions {\n scene: SceneObject;\n children: React.ReactNode;\n}\n\n/**\n * Right now this is actually not defining a context, but think it might in the future (with UrlSyncManager as the context value)\n */\n\nexport function UrlSyncContextProvider({\n children,\n scene,\n updateUrlOnInit,\n createBrowserHistorySteps,\n}: UrlSyncContextProviderProps) {\n const isInitialized = useUrlSync(scene, { updateUrlOnInit, createBrowserHistorySteps });\n\n if (!isInitialized) {\n return null;\n }\n\n return children;\n}\n"],"names":[],"mappings":";;AAYO,SAAS,sBAAuB,CAAA;AAAA,EACrC,QAAA;AAAA,EACA,KAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAgC,EAAA;AAC9B,EAAA,MAAM,gBAAgB,UAAW,CAAA,KAAA,EAAO,EAAE,eAAA,EAAiB,2BAA2B,CAAA;AAEtF,EAAA,IAAI,CAAC,aAAe,EAAA;AAClB,IAAO,OAAA,IAAA;AAAA;AAGT,EAAO,OAAA,QAAA;AACT;;;;"}
|
|
@@ -7,24 +7,13 @@ import { getUrlState, syncStateFromUrl, isUrlValueEqual } from './utils.js';
|
|
|
7
7
|
import { BusEventWithPayload } from '@grafana/data';
|
|
8
8
|
import { useMemo } from 'react';
|
|
9
9
|
|
|
10
|
-
var
|
|
11
|
-
|
|
12
|
-
throw TypeError("Cannot " + msg);
|
|
13
|
-
};
|
|
14
|
-
var __privateGet = (obj, member, getter) => {
|
|
15
|
-
__accessCheck(obj, member, "read from private field");
|
|
16
|
-
return getter ? getter.call(obj) : member.get(obj);
|
|
17
|
-
};
|
|
18
|
-
var __privateAdd = (obj, member, value) => {
|
|
19
|
-
if (member.has(obj))
|
|
20
|
-
throw TypeError("Cannot add the same private member more than once");
|
|
21
|
-
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
22
|
-
};
|
|
23
|
-
var __privateSet = (obj, member, value, setter) => {
|
|
24
|
-
__accessCheck(obj, member, "write to private field");
|
|
25
|
-
setter ? setter.call(obj, value) : member.set(obj, value);
|
|
26
|
-
return value;
|
|
10
|
+
var __typeError = (msg) => {
|
|
11
|
+
throw TypeError(msg);
|
|
27
12
|
};
|
|
13
|
+
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
14
|
+
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
15
|
+
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
16
|
+
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
|
|
28
17
|
var _cache, _location;
|
|
29
18
|
class NewSceneObjectAddedEvent extends BusEventWithPayload {
|
|
30
19
|
}
|
|
@@ -36,6 +25,9 @@ class UrlSyncManager {
|
|
|
36
25
|
this._locationService = locationService$1;
|
|
37
26
|
this._paramsCache = new UrlParamsCache(locationService$1);
|
|
38
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Updates the current scene state to match URL state.
|
|
30
|
+
*/
|
|
39
31
|
initSync(root) {
|
|
40
32
|
var _a;
|
|
41
33
|
if (this._subs) {
|
|
@@ -127,8 +119,8 @@ class UrlSyncManager {
|
|
|
127
119
|
class UrlParamsCache {
|
|
128
120
|
constructor(locationService) {
|
|
129
121
|
this.locationService = locationService;
|
|
130
|
-
__privateAdd(this, _cache
|
|
131
|
-
__privateAdd(this, _location
|
|
122
|
+
__privateAdd(this, _cache);
|
|
123
|
+
__privateAdd(this, _location);
|
|
132
124
|
}
|
|
133
125
|
getParams() {
|
|
134
126
|
const location = this.locationService.getLocation();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UrlSyncManager.js","sources":["../../../src/services/UrlSyncManager.ts"],"sourcesContent":["import { Location } from 'history';\n\nimport { LocationService, locationService as locationServiceRuntime } from '@grafana/runtime';\n\nimport { SceneObjectStateChangedEvent } from '../core/events';\nimport { SceneObject, SceneObjectUrlValues, SceneUrlSyncOptions } from '../core/types';\nimport { writeSceneLog } from '../utils/writeSceneLog';\nimport { Subscription } from 'rxjs';\nimport { UniqueUrlKeyMapper } from './UniqueUrlKeyMapper';\nimport { getUrlState, isUrlValueEqual, syncStateFromUrl } from './utils';\nimport { BusEventWithPayload } from '@grafana/data';\nimport { useMemo } from 'react';\n\nexport interface UrlSyncManagerLike {\n initSync(root: SceneObject): void;\n cleanUp(root: SceneObject): void;\n handleNewLocation(location: Location): void;\n handleNewObject(sceneObj: SceneObject): void;\n}\n\n/**\n * Notify the url sync manager of a new object that has been added to the scene\n * that needs to init state from URL.\n */\nexport class NewSceneObjectAddedEvent extends BusEventWithPayload<SceneObject> {\n public static readonly type = 'new-scene-object-added';\n}\n\nexport class UrlSyncManager implements UrlSyncManagerLike {\n private _urlKeyMapper = new UniqueUrlKeyMapper();\n private _sceneRoot?: SceneObject;\n private _subs: Subscription | undefined;\n private _lastLocation: Location | undefined;\n private _locationService: LocationService;\n private _paramsCache: UrlParamsCache;\n private _options: SceneUrlSyncOptions;\n\n public constructor(_options: SceneUrlSyncOptions = {}, locationService: LocationService = locationServiceRuntime) {\n this._options = _options;\n this._locationService = locationService;\n this._paramsCache = new UrlParamsCache(locationService);\n }\n\n /**\n * Updates the current scene state to match URL state.\n */\n public initSync(root: SceneObject) {\n if (this._subs) {\n writeSceneLog('UrlSyncManager', 'Unregister previous scene state subscription', this._sceneRoot?.state.key);\n this._subs.unsubscribe();\n }\n\n writeSceneLog('UrlSyncManager', 'init', root.state.key);\n\n this._sceneRoot = root;\n this._subs = new Subscription();\n\n this._subs.add(\n root.subscribeToEvent(SceneObjectStateChangedEvent, (evt) => {\n this.handleSceneObjectStateChanged(evt.payload.changedObject);\n })\n );\n\n this._subs.add(\n root.subscribeToEvent(NewSceneObjectAddedEvent, (evt) => {\n this.handleNewObject(evt.payload);\n })\n );\n\n this._urlKeyMapper.clear();\n this._lastLocation = this._locationService.getLocation();\n\n // Sync current url with state\n this.handleNewObject(this._sceneRoot);\n\n if (this._options.updateUrlOnInit) {\n // Get current url state and update url to match\n const urlState = getUrlState(root);\n\n if (isUrlStateDifferent(urlState, this._paramsCache.getParams())) {\n this._locationService.partial(urlState, true);\n }\n }\n }\n\n public cleanUp(root: SceneObject) {\n // Ignore this if we have a new or different root\n if (this._sceneRoot !== root) {\n return;\n }\n\n writeSceneLog('UrlSyncManager', 'Clean up');\n\n if (this._subs) {\n this._subs.unsubscribe();\n this._subs = undefined;\n\n writeSceneLog(\n 'UrlSyncManager',\n 'Root deactived, unsub to state',\n 'same key',\n this._sceneRoot.state.key === root.state.key\n );\n }\n\n this._sceneRoot = undefined;\n this._lastLocation = undefined;\n }\n\n public handleNewLocation(location: Location) {\n if (!this._sceneRoot || this._lastLocation === location) {\n return;\n }\n\n writeSceneLog('UrlSyncManager', 'handleNewLocation');\n\n this._lastLocation = location;\n\n // Sync scene state tree from url\n syncStateFromUrl(this._sceneRoot!, this._paramsCache.getParams(), this._urlKeyMapper);\n }\n\n public handleNewObject(sceneObj: SceneObject) {\n if (!this._sceneRoot) {\n return;\n }\n\n syncStateFromUrl(sceneObj, this._paramsCache.getParams(), this._urlKeyMapper);\n }\n\n private handleSceneObjectStateChanged(changedObject: SceneObject) {\n if (!changedObject.urlSync) {\n return;\n }\n\n const newUrlState = changedObject.urlSync.getUrlState();\n\n const searchParams = this._locationService.getSearch();\n const mappedUpdated: SceneObjectUrlValues = {};\n\n for (const [key, newUrlValue] of Object.entries(newUrlState)) {\n const uniqueKey = this._urlKeyMapper.getUniqueKey(key, changedObject);\n const currentUrlValue = searchParams.getAll(uniqueKey);\n\n if (!isUrlValueEqual(currentUrlValue, newUrlValue)) {\n mappedUpdated[uniqueKey] = newUrlValue;\n }\n }\n\n if (Object.keys(mappedUpdated).length > 0) {\n const shouldCreateHistoryEntry = changedObject.urlSync.shouldCreateHistoryStep?.(newUrlState);\n const shouldReplace = shouldCreateHistoryEntry !== true;\n\n writeSceneLog('UrlSyncManager', 'onStateChange updating URL');\n this._locationService.partial(mappedUpdated, shouldReplace);\n\n /// Mark the location already handled\n this._lastLocation = this._locationService.getLocation();\n }\n }\n\n public getUrlState(root: SceneObject): SceneObjectUrlValues {\n return getUrlState(root);\n }\n}\n\nclass UrlParamsCache {\n #cache: URLSearchParams | undefined;\n #location: Location | undefined;\n\n public constructor(private locationService: LocationService) {}\n\n public getParams(): URLSearchParams {\n const location = this.locationService.getLocation();\n\n if (this.#location === location) {\n return this.#cache!;\n }\n\n this.#location = location;\n this.#cache = new URLSearchParams(location.search);\n\n return this.#cache;\n }\n}\n\nfunction isUrlStateDifferent(sceneUrlState: SceneObjectUrlValues, currentParams: URLSearchParams) {\n for (let key in sceneUrlState) {\n if (!isUrlValueEqual(currentParams.getAll(key), sceneUrlState[key])) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Creates a new memoized instance of the UrlSyncManager based on options\n */\nexport function useUrlSyncManager(options: SceneUrlSyncOptions, locationService: LocationService): UrlSyncManagerLike {\n return useMemo(\n () =>\n new UrlSyncManager(\n {\n updateUrlOnInit: options.updateUrlOnInit,\n createBrowserHistorySteps: options.createBrowserHistorySteps,\n },\n locationService\n ),\n [options.updateUrlOnInit, options.createBrowserHistorySteps, locationService]\n );\n}\n"],"names":["locationService","locationServiceRuntime"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"UrlSyncManager.js","sources":["../../../src/services/UrlSyncManager.ts"],"sourcesContent":["import { Location } from 'history';\n\nimport { LocationService, locationService as locationServiceRuntime } from '@grafana/runtime';\n\nimport { SceneObjectStateChangedEvent } from '../core/events';\nimport { SceneObject, SceneObjectUrlValues, SceneUrlSyncOptions } from '../core/types';\nimport { writeSceneLog } from '../utils/writeSceneLog';\nimport { Subscription } from 'rxjs';\nimport { UniqueUrlKeyMapper } from './UniqueUrlKeyMapper';\nimport { getUrlState, isUrlValueEqual, syncStateFromUrl } from './utils';\nimport { BusEventWithPayload } from '@grafana/data';\nimport { useMemo } from 'react';\n\nexport interface UrlSyncManagerLike {\n initSync(root: SceneObject): void;\n cleanUp(root: SceneObject): void;\n handleNewLocation(location: Location): void;\n handleNewObject(sceneObj: SceneObject): void;\n}\n\n/**\n * Notify the url sync manager of a new object that has been added to the scene\n * that needs to init state from URL.\n */\nexport class NewSceneObjectAddedEvent extends BusEventWithPayload<SceneObject> {\n public static readonly type = 'new-scene-object-added';\n}\n\nexport class UrlSyncManager implements UrlSyncManagerLike {\n private _urlKeyMapper = new UniqueUrlKeyMapper();\n private _sceneRoot?: SceneObject;\n private _subs: Subscription | undefined;\n private _lastLocation: Location | undefined;\n private _locationService: LocationService;\n private _paramsCache: UrlParamsCache;\n private _options: SceneUrlSyncOptions;\n\n public constructor(_options: SceneUrlSyncOptions = {}, locationService: LocationService = locationServiceRuntime) {\n this._options = _options;\n this._locationService = locationService;\n this._paramsCache = new UrlParamsCache(locationService);\n }\n\n /**\n * Updates the current scene state to match URL state.\n */\n public initSync(root: SceneObject) {\n if (this._subs) {\n writeSceneLog('UrlSyncManager', 'Unregister previous scene state subscription', this._sceneRoot?.state.key);\n this._subs.unsubscribe();\n }\n\n writeSceneLog('UrlSyncManager', 'init', root.state.key);\n\n this._sceneRoot = root;\n this._subs = new Subscription();\n\n this._subs.add(\n root.subscribeToEvent(SceneObjectStateChangedEvent, (evt) => {\n this.handleSceneObjectStateChanged(evt.payload.changedObject);\n })\n );\n\n this._subs.add(\n root.subscribeToEvent(NewSceneObjectAddedEvent, (evt) => {\n this.handleNewObject(evt.payload);\n })\n );\n\n this._urlKeyMapper.clear();\n this._lastLocation = this._locationService.getLocation();\n\n // Sync current url with state\n this.handleNewObject(this._sceneRoot);\n\n if (this._options.updateUrlOnInit) {\n // Get current url state and update url to match\n const urlState = getUrlState(root);\n\n if (isUrlStateDifferent(urlState, this._paramsCache.getParams())) {\n this._locationService.partial(urlState, true);\n }\n }\n }\n\n public cleanUp(root: SceneObject) {\n // Ignore this if we have a new or different root\n if (this._sceneRoot !== root) {\n return;\n }\n\n writeSceneLog('UrlSyncManager', 'Clean up');\n\n if (this._subs) {\n this._subs.unsubscribe();\n this._subs = undefined;\n\n writeSceneLog(\n 'UrlSyncManager',\n 'Root deactived, unsub to state',\n 'same key',\n this._sceneRoot.state.key === root.state.key\n );\n }\n\n this._sceneRoot = undefined;\n this._lastLocation = undefined;\n }\n\n public handleNewLocation(location: Location) {\n if (!this._sceneRoot || this._lastLocation === location) {\n return;\n }\n\n writeSceneLog('UrlSyncManager', 'handleNewLocation');\n\n this._lastLocation = location;\n\n // Sync scene state tree from url\n syncStateFromUrl(this._sceneRoot!, this._paramsCache.getParams(), this._urlKeyMapper);\n }\n\n public handleNewObject(sceneObj: SceneObject) {\n if (!this._sceneRoot) {\n return;\n }\n\n syncStateFromUrl(sceneObj, this._paramsCache.getParams(), this._urlKeyMapper);\n }\n\n private handleSceneObjectStateChanged(changedObject: SceneObject) {\n if (!changedObject.urlSync) {\n return;\n }\n\n const newUrlState = changedObject.urlSync.getUrlState();\n\n const searchParams = this._locationService.getSearch();\n const mappedUpdated: SceneObjectUrlValues = {};\n\n for (const [key, newUrlValue] of Object.entries(newUrlState)) {\n const uniqueKey = this._urlKeyMapper.getUniqueKey(key, changedObject);\n const currentUrlValue = searchParams.getAll(uniqueKey);\n\n if (!isUrlValueEqual(currentUrlValue, newUrlValue)) {\n mappedUpdated[uniqueKey] = newUrlValue;\n }\n }\n\n if (Object.keys(mappedUpdated).length > 0) {\n const shouldCreateHistoryEntry = changedObject.urlSync.shouldCreateHistoryStep?.(newUrlState);\n const shouldReplace = shouldCreateHistoryEntry !== true;\n\n writeSceneLog('UrlSyncManager', 'onStateChange updating URL');\n this._locationService.partial(mappedUpdated, shouldReplace);\n\n /// Mark the location already handled\n this._lastLocation = this._locationService.getLocation();\n }\n }\n\n public getUrlState(root: SceneObject): SceneObjectUrlValues {\n return getUrlState(root);\n }\n}\n\nclass UrlParamsCache {\n #cache: URLSearchParams | undefined;\n #location: Location | undefined;\n\n public constructor(private locationService: LocationService) {}\n\n public getParams(): URLSearchParams {\n const location = this.locationService.getLocation();\n\n if (this.#location === location) {\n return this.#cache!;\n }\n\n this.#location = location;\n this.#cache = new URLSearchParams(location.search);\n\n return this.#cache;\n }\n}\n\nfunction isUrlStateDifferent(sceneUrlState: SceneObjectUrlValues, currentParams: URLSearchParams) {\n for (let key in sceneUrlState) {\n if (!isUrlValueEqual(currentParams.getAll(key), sceneUrlState[key])) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * Creates a new memoized instance of the UrlSyncManager based on options\n */\nexport function useUrlSyncManager(options: SceneUrlSyncOptions, locationService: LocationService): UrlSyncManagerLike {\n return useMemo(\n () =>\n new UrlSyncManager(\n {\n updateUrlOnInit: options.updateUrlOnInit,\n createBrowserHistorySteps: options.createBrowserHistorySteps,\n },\n locationService\n ),\n [options.updateUrlOnInit, options.createBrowserHistorySteps, locationService]\n );\n}\n"],"names":["locationService","locationServiceRuntime"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useUrlSync.js","sources":["../../../src/services/useUrlSync.ts"],"sourcesContent":["import { SceneObject, SceneUrlSyncOptions } from '../core/types';\nimport { useEffect, useState } from 'react';\nimport { useLocation } from 'react-router-dom';\nimport { writeSceneLog } from '../utils/writeSceneLog';\nimport { useUrlSyncManager } from './UrlSyncManager';\nimport { useLocationServiceSafe } from '../utils/utils';\n\nexport function useUrlSync(sceneRoot: SceneObject, options: SceneUrlSyncOptions = {}): boolean {\n const location = useLocation();\n const locationService = useLocationServiceSafe();\n const [isInitialized, setIsInitialized] = useState(false);\n const urlSyncManager = useUrlSyncManager(options, locationService);\n\n useEffect(() => {\n urlSyncManager.initSync(sceneRoot);\n setIsInitialized(true);\n return () => urlSyncManager.cleanUp(sceneRoot);\n }, [sceneRoot, urlSyncManager]);\n\n useEffect(() => {\n // Use latest location, as by the time this effect runs, the location might have changed again\n const latestLocation = locationService.getLocation();\n const locationToHandle = latestLocation !== location ? latestLocation : location;\n\n if (latestLocation !== location) {\n writeSceneLog('useUrlSync', 'latestLocation different from location');\n }\n\n urlSyncManager.handleNewLocation(locationToHandle);\n }, [sceneRoot, urlSyncManager, location, locationService]);\n\n return isInitialized;\n}\n\nexport interface UrlSyncContextProviderProps {\n scene: SceneObject;\n children: React.ReactNode;\n}\n"],"names":[],"mappings":";;;;;;AAOO,SAAS,UAAW,CAAA,SAAA,EAAwB,OAA+B,GAAA,EAAa,EAAA;AAC7F,EAAA,MAAM,WAAW,WAAY,EAAA
|
|
1
|
+
{"version":3,"file":"useUrlSync.js","sources":["../../../src/services/useUrlSync.ts"],"sourcesContent":["import { SceneObject, SceneUrlSyncOptions } from '../core/types';\nimport { useEffect, useState } from 'react';\nimport { useLocation } from 'react-router-dom';\nimport { writeSceneLog } from '../utils/writeSceneLog';\nimport { useUrlSyncManager } from './UrlSyncManager';\nimport { useLocationServiceSafe } from '../utils/utils';\n\nexport function useUrlSync(sceneRoot: SceneObject, options: SceneUrlSyncOptions = {}): boolean {\n const location = useLocation();\n const locationService = useLocationServiceSafe();\n const [isInitialized, setIsInitialized] = useState(false);\n const urlSyncManager = useUrlSyncManager(options, locationService);\n\n useEffect(() => {\n urlSyncManager.initSync(sceneRoot);\n setIsInitialized(true);\n return () => urlSyncManager.cleanUp(sceneRoot);\n }, [sceneRoot, urlSyncManager]);\n\n useEffect(() => {\n // Use latest location, as by the time this effect runs, the location might have changed again\n const latestLocation = locationService.getLocation();\n const locationToHandle = latestLocation !== location ? latestLocation : location;\n\n if (latestLocation !== location) {\n writeSceneLog('useUrlSync', 'latestLocation different from location');\n }\n\n urlSyncManager.handleNewLocation(locationToHandle);\n }, [sceneRoot, urlSyncManager, location, locationService]);\n\n return isInitialized;\n}\n\nexport interface UrlSyncContextProviderProps {\n scene: SceneObject;\n children: React.ReactNode;\n}\n"],"names":[],"mappings":";;;;;;AAOO,SAAS,UAAW,CAAA,SAAA,EAAwB,OAA+B,GAAA,EAAa,EAAA;AAC7F,EAAA,MAAM,WAAW,WAAY,EAAA;AAC7B,EAAA,MAAM,kBAAkB,sBAAuB,EAAA;AAC/C,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,SAAS,KAAK,CAAA;AACxD,EAAM,MAAA,cAAA,GAAiB,iBAAkB,CAAA,OAAA,EAAS,eAAe,CAAA;AAEjE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,cAAA,CAAe,SAAS,SAAS,CAAA;AACjC,IAAA,gBAAA,CAAiB,IAAI,CAAA;AACrB,IAAO,OAAA,MAAM,cAAe,CAAA,OAAA,CAAQ,SAAS,CAAA;AAAA,GAC5C,EAAA,CAAC,SAAW,EAAA,cAAc,CAAC,CAAA;AAE9B,EAAA,SAAA,CAAU,MAAM;AAEd,IAAM,MAAA,cAAA,GAAiB,gBAAgB,WAAY,EAAA;AACnD,IAAM,MAAA,gBAAA,GAAmB,cAAmB,KAAA,QAAA,GAAW,cAAiB,GAAA,QAAA;AAExE,IAAA,IAAI,mBAAmB,QAAU,EAAA;AAC/B,MAAA,aAAA,CAAc,cAAc,wCAAwC,CAAA;AAAA;AAGtE,IAAA,cAAA,CAAe,kBAAkB,gBAAgB,CAAA;AAAA,KAChD,CAAC,SAAA,EAAW,cAAgB,EAAA,QAAA,EAAU,eAAe,CAAC,CAAA;AAEzD,EAAO,OAAA,aAAA;AACT;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../../../src/services/utils.ts"],"sourcesContent":["import { isEqual } from 'lodash';\n\nimport { SceneObject, SceneObjectUrlValue, SceneObjectUrlValues } from '../core/types';\nimport { UniqueUrlKeyMapper } from './UniqueUrlKeyMapper';\n\n/**\n * @param root\n * @returns the full scene url state as a object with keys and values\n */\nexport function getUrlState(root: SceneObject): SceneObjectUrlValues {\n const urlKeyMapper = new UniqueUrlKeyMapper();\n const result: SceneObjectUrlValues = {};\n\n const visitNode = (obj: SceneObject) => {\n if (obj.urlSync) {\n const newUrlState = obj.urlSync.getUrlState();\n\n for (const [key, value] of Object.entries(newUrlState)) {\n if (value != null) {\n const uniqueKey = urlKeyMapper.getUniqueKey(key, obj);\n result[uniqueKey] = value;\n }\n }\n }\n\n obj.forEachChild(visitNode);\n };\n\n visitNode(root);\n return result;\n}\n\n/**\n * Exported util function to sync state from an initial url state.\n * Useful for initializing an embedded scenes with a url state string.\n */\nexport function syncStateFromSearchParams(root: SceneObject, urlParams: URLSearchParams) {\n const urlKeyMapper = new UniqueUrlKeyMapper();\n syncStateFromUrl(root, urlParams, urlKeyMapper);\n}\n\nexport function syncStateFromUrl(\n root: SceneObject,\n urlParams: URLSearchParams,\n urlKeyMapper: UniqueUrlKeyMapper,\n onlyChildren?: boolean\n) {\n if (!onlyChildren) {\n syncUrlStateToObject(root, urlParams, urlKeyMapper);\n }\n\n // These two forEachChild loops might look strange but it's to make sure we walk through the scene graph one level at a time as url key conflicts depend depth in the scene tree\n root.forEachChild((child) => {\n syncUrlStateToObject(child, urlParams, urlKeyMapper);\n });\n\n root.forEachChild((child) => syncStateFromUrl(child, urlParams, urlKeyMapper, true));\n}\n\nfunction syncUrlStateToObject(sceneObject: SceneObject, urlParams: URLSearchParams, urlKeyMapper: UniqueUrlKeyMapper) {\n if (sceneObject.urlSync) {\n const urlState: SceneObjectUrlValues = {};\n const currentState = sceneObject.urlSync.getUrlState();\n\n for (const key of sceneObject.urlSync.getKeys()) {\n const uniqueKey = urlKeyMapper.getUniqueKey(key, sceneObject);\n const newValue = urlParams.getAll(uniqueKey);\n const currentValue = currentState[key];\n\n if (isUrlValueEqual(newValue, currentValue)) {\n continue;\n }\n\n if (newValue.length > 0) {\n if (Array.isArray(currentValue)) {\n urlState[key] = newValue;\n } else {\n urlState[key] = newValue[0];\n }\n } else {\n // mark this key as having no url state\n urlState[key] = null;\n }\n }\n\n if (Object.keys(urlState).length > 0) {\n sceneObject.urlSync.updateFromUrl(urlState);\n }\n }\n}\n\nexport function isUrlValueEqual(currentUrlValue: string[], newUrlValue: SceneObjectUrlValue): boolean {\n if (currentUrlValue.length === 0 && newUrlValue == null) {\n return true;\n }\n\n if (!Array.isArray(newUrlValue) && currentUrlValue?.length === 1) {\n return newUrlValue === currentUrlValue[0];\n }\n\n if (newUrlValue?.length === 0 && currentUrlValue === null) {\n return true;\n }\n\n // We have two arrays, lets compare them\n return isEqual(currentUrlValue, newUrlValue);\n}\n"],"names":[],"mappings":";;;AASO,SAAS,YAAY,IAAyC,EAAA;AACnE,EAAM,MAAA,YAAA,GAAe,IAAI,kBAAmB,EAAA
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../src/services/utils.ts"],"sourcesContent":["import { isEqual } from 'lodash';\n\nimport { SceneObject, SceneObjectUrlValue, SceneObjectUrlValues } from '../core/types';\nimport { UniqueUrlKeyMapper } from './UniqueUrlKeyMapper';\n\n/**\n * @param root\n * @returns the full scene url state as a object with keys and values\n */\nexport function getUrlState(root: SceneObject): SceneObjectUrlValues {\n const urlKeyMapper = new UniqueUrlKeyMapper();\n const result: SceneObjectUrlValues = {};\n\n const visitNode = (obj: SceneObject) => {\n if (obj.urlSync) {\n const newUrlState = obj.urlSync.getUrlState();\n\n for (const [key, value] of Object.entries(newUrlState)) {\n if (value != null) {\n const uniqueKey = urlKeyMapper.getUniqueKey(key, obj);\n result[uniqueKey] = value;\n }\n }\n }\n\n obj.forEachChild(visitNode);\n };\n\n visitNode(root);\n return result;\n}\n\n/**\n * Exported util function to sync state from an initial url state.\n * Useful for initializing an embedded scenes with a url state string.\n */\nexport function syncStateFromSearchParams(root: SceneObject, urlParams: URLSearchParams) {\n const urlKeyMapper = new UniqueUrlKeyMapper();\n syncStateFromUrl(root, urlParams, urlKeyMapper);\n}\n\nexport function syncStateFromUrl(\n root: SceneObject,\n urlParams: URLSearchParams,\n urlKeyMapper: UniqueUrlKeyMapper,\n onlyChildren?: boolean\n) {\n if (!onlyChildren) {\n syncUrlStateToObject(root, urlParams, urlKeyMapper);\n }\n\n // These two forEachChild loops might look strange but it's to make sure we walk through the scene graph one level at a time as url key conflicts depend depth in the scene tree\n root.forEachChild((child) => {\n syncUrlStateToObject(child, urlParams, urlKeyMapper);\n });\n\n root.forEachChild((child) => syncStateFromUrl(child, urlParams, urlKeyMapper, true));\n}\n\nfunction syncUrlStateToObject(sceneObject: SceneObject, urlParams: URLSearchParams, urlKeyMapper: UniqueUrlKeyMapper) {\n if (sceneObject.urlSync) {\n const urlState: SceneObjectUrlValues = {};\n const currentState = sceneObject.urlSync.getUrlState();\n\n for (const key of sceneObject.urlSync.getKeys()) {\n const uniqueKey = urlKeyMapper.getUniqueKey(key, sceneObject);\n const newValue = urlParams.getAll(uniqueKey);\n const currentValue = currentState[key];\n\n if (isUrlValueEqual(newValue, currentValue)) {\n continue;\n }\n\n if (newValue.length > 0) {\n if (Array.isArray(currentValue)) {\n urlState[key] = newValue;\n } else {\n urlState[key] = newValue[0];\n }\n } else {\n // mark this key as having no url state\n urlState[key] = null;\n }\n }\n\n if (Object.keys(urlState).length > 0) {\n sceneObject.urlSync.updateFromUrl(urlState);\n }\n }\n}\n\nexport function isUrlValueEqual(currentUrlValue: string[], newUrlValue: SceneObjectUrlValue): boolean {\n if (currentUrlValue.length === 0 && newUrlValue == null) {\n return true;\n }\n\n if (!Array.isArray(newUrlValue) && currentUrlValue?.length === 1) {\n return newUrlValue === currentUrlValue[0];\n }\n\n if (newUrlValue?.length === 0 && currentUrlValue === null) {\n return true;\n }\n\n // We have two arrays, lets compare them\n return isEqual(currentUrlValue, newUrlValue);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -8,63 +8,38 @@ function ControlsLabel(props) {
|
|
|
8
8
|
const styles = useStyles2(getStyles);
|
|
9
9
|
const theme = useTheme2();
|
|
10
10
|
const isVertical = props.layout === "vertical";
|
|
11
|
-
const loadingIndicator = Boolean(props.isLoading) ? /* @__PURE__ */ React.createElement(
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
11
|
+
const loadingIndicator = Boolean(props.isLoading) ? /* @__PURE__ */ React.createElement(
|
|
12
|
+
"div",
|
|
13
|
+
{
|
|
14
|
+
style: { marginLeft: theme.spacing(1), marginTop: "-1px" },
|
|
15
|
+
"aria-label": selectors.components.LoadingIndicator.icon
|
|
16
|
+
},
|
|
17
|
+
/* @__PURE__ */ React.createElement(
|
|
18
|
+
LoadingIndicator,
|
|
19
|
+
{
|
|
20
|
+
onCancel: (e) => {
|
|
21
|
+
var _a;
|
|
22
|
+
e.preventDefault();
|
|
23
|
+
e.stopPropagation();
|
|
24
|
+
(_a = props.onCancel) == null ? void 0 : _a.call(props);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
)
|
|
28
|
+
) : null;
|
|
22
29
|
let errorIndicator = null;
|
|
23
30
|
if (props.error) {
|
|
24
|
-
errorIndicator = /* @__PURE__ */ React.createElement(Tooltip, {
|
|
25
|
-
content: props.error,
|
|
26
|
-
placement: "bottom"
|
|
27
|
-
}, /* @__PURE__ */ React.createElement(Icon, {
|
|
28
|
-
className: styles.errorIcon,
|
|
29
|
-
name: "exclamation-triangle"
|
|
30
|
-
}));
|
|
31
|
+
errorIndicator = /* @__PURE__ */ React.createElement(Tooltip, { content: props.error, placement: "bottom" }, /* @__PURE__ */ React.createElement(Icon, { className: styles.errorIcon, name: "exclamation-triangle" }));
|
|
31
32
|
}
|
|
32
33
|
let descriptionIndicator = null;
|
|
33
34
|
if (props.description) {
|
|
34
|
-
descriptionIndicator = /* @__PURE__ */ React.createElement(Tooltip, {
|
|
35
|
-
content: props.description,
|
|
36
|
-
placement: isVertical ? "top" : "bottom"
|
|
37
|
-
}, /* @__PURE__ */ React.createElement(Icon, {
|
|
38
|
-
className: styles.normalIcon,
|
|
39
|
-
name: "info-circle"
|
|
40
|
-
}));
|
|
35
|
+
descriptionIndicator = /* @__PURE__ */ React.createElement(Tooltip, { content: props.description, placement: isVertical ? "top" : "bottom" }, /* @__PURE__ */ React.createElement(Icon, { className: styles.normalIcon, name: "info-circle" }));
|
|
41
36
|
}
|
|
42
37
|
const testId = typeof props.label === "string" ? selectors.pages.Dashboard.SubMenu.submenuItemLabels(props.label) : "";
|
|
43
38
|
let labelElement;
|
|
44
39
|
if (isVertical) {
|
|
45
|
-
labelElement = /* @__PURE__ */ React.createElement("label", {
|
|
46
|
-
className: styles.verticalLabel,
|
|
47
|
-
"data-testid": testId,
|
|
48
|
-
htmlFor: props.htmlFor
|
|
49
|
-
}, props.label, descriptionIndicator, errorIndicator, props.icon && /* @__PURE__ */ React.createElement(Icon, {
|
|
50
|
-
name: props.icon,
|
|
51
|
-
className: styles.normalIcon
|
|
52
|
-
}), loadingIndicator, props.onRemove && /* @__PURE__ */ React.createElement(IconButton, {
|
|
53
|
-
variant: "secondary",
|
|
54
|
-
size: "xs",
|
|
55
|
-
name: "times",
|
|
56
|
-
onClick: props.onRemove,
|
|
57
|
-
tooltip: "Remove"
|
|
58
|
-
}));
|
|
40
|
+
labelElement = /* @__PURE__ */ React.createElement("label", { className: styles.verticalLabel, "data-testid": testId, htmlFor: props.htmlFor }, props.label, descriptionIndicator, errorIndicator, props.icon && /* @__PURE__ */ React.createElement(Icon, { name: props.icon, className: styles.normalIcon }), loadingIndicator, props.onRemove && /* @__PURE__ */ React.createElement(IconButton, { variant: "secondary", size: "xs", name: "times", onClick: props.onRemove, tooltip: "Remove" }));
|
|
59
41
|
} else {
|
|
60
|
-
labelElement = /* @__PURE__ */ React.createElement("label", {
|
|
61
|
-
className: styles.horizontalLabel,
|
|
62
|
-
"data-testid": testId,
|
|
63
|
-
htmlFor: props.htmlFor
|
|
64
|
-
}, errorIndicator, props.icon && /* @__PURE__ */ React.createElement(Icon, {
|
|
65
|
-
name: props.icon,
|
|
66
|
-
className: styles.normalIcon
|
|
67
|
-
}), props.label, descriptionIndicator, loadingIndicator);
|
|
42
|
+
labelElement = /* @__PURE__ */ React.createElement("label", { className: styles.horizontalLabel, "data-testid": testId, htmlFor: props.htmlFor }, errorIndicator, props.icon && /* @__PURE__ */ React.createElement(Icon, { name: props.icon, className: styles.normalIcon }), props.label, descriptionIndicator, loadingIndicator);
|
|
68
43
|
}
|
|
69
44
|
return labelElement;
|
|
70
45
|
}
|
|
@@ -81,6 +56,7 @@ const getStyles = (theme) => ({
|
|
|
81
56
|
borderRadius: `${theme.shape.radius.default} 0 0 ${theme.shape.radius.default}`,
|
|
82
57
|
border: `1px solid ${theme.components.input.borderColor}`,
|
|
83
58
|
position: "relative",
|
|
59
|
+
// To make the border line up with the input border
|
|
84
60
|
right: -1,
|
|
85
61
|
whiteSpace: "nowrap",
|
|
86
62
|
gap: theme.spacing(0.5)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ControlsLabel.js","sources":["../../../src/utils/ControlsLabel.tsx"],"sourcesContent":["import React from 'react';\nimport { Icon, IconButton, Tooltip, useStyles2, useTheme2 } from '@grafana/ui';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { GrafanaTheme2, IconName } from '@grafana/data';\nimport { css } from '@emotion/css';\nimport { LoadingIndicator } from './LoadingIndicator';\nimport { ControlsLayout } from '../core/types';\n\ninterface ControlsLabelProps {\n label: string;\n htmlFor?: string;\n description?: string;\n isLoading?: boolean;\n error?: string;\n icon?: IconName;\n layout?: ControlsLayout;\n onCancel?: () => void;\n onRemove?: () => void;\n}\n\nexport function ControlsLabel(props: ControlsLabelProps) {\n const styles = useStyles2(getStyles);\n const theme = useTheme2();\n const isVertical = props.layout === 'vertical';\n\n const loadingIndicator = Boolean(props.isLoading) ? (\n <div\n style={{ marginLeft: theme.spacing(1), marginTop: '-1px' }}\n aria-label={selectors.components.LoadingIndicator.icon}\n >\n <LoadingIndicator\n onCancel={(e) => {\n e.preventDefault();\n e.stopPropagation();\n props.onCancel?.();\n }}\n />\n </div>\n ) : null;\n\n let errorIndicator = null;\n if (props.error) {\n errorIndicator = (\n <Tooltip content={props.error} placement={'bottom'}>\n <Icon className={styles.errorIcon} name=\"exclamation-triangle\" />\n </Tooltip>\n );\n }\n\n let descriptionIndicator = null;\n if (props.description) {\n descriptionIndicator = (\n <Tooltip content={props.description} placement={isVertical ? 'top' : 'bottom'}>\n <Icon className={styles.normalIcon} name=\"info-circle\" />\n </Tooltip>\n );\n }\n\n const testId =\n typeof props.label === 'string' ? selectors.pages.Dashboard.SubMenu.submenuItemLabels(props.label) : '';\n let labelElement: JSX.Element;\n\n // The vertical layout has different css class and order of elements (label always first)\n\n if (isVertical) {\n labelElement = (\n <label className={styles.verticalLabel} data-testid={testId} htmlFor={props.htmlFor}>\n {props.label}\n {descriptionIndicator}\n {errorIndicator}\n {props.icon && <Icon name={props.icon} className={styles.normalIcon} />}\n {loadingIndicator}\n {props.onRemove && (\n <IconButton variant=\"secondary\" size=\"xs\" name=\"times\" onClick={props.onRemove} tooltip={'Remove'} />\n )}\n </label>\n );\n } else {\n labelElement = (\n <label className={styles.horizontalLabel} data-testid={testId} htmlFor={props.htmlFor}>\n {errorIndicator}\n {props.icon && <Icon name={props.icon} className={styles.normalIcon} />}\n {props.label}\n {descriptionIndicator}\n {loadingIndicator}\n </label>\n );\n }\n\n return labelElement;\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n horizontalLabel: css({\n background: theme.isDark ? theme.colors.background.primary : theme.colors.background.secondary,\n display: `flex`,\n alignItems: 'center',\n padding: theme.spacing(0, 1),\n fontWeight: theme.typography.fontWeightMedium,\n fontSize: theme.typography.bodySmall.fontSize,\n height: theme.spacing(theme.components.height.md),\n lineHeight: theme.spacing(theme.components.height.md),\n borderRadius: `${theme.shape.radius.default} 0 0 ${theme.shape.radius.default}`,\n border: `1px solid ${theme.components.input.borderColor}`,\n position: 'relative',\n // To make the border line up with the input border\n right: -1,\n whiteSpace: 'nowrap',\n gap: theme.spacing(0.5),\n }),\n verticalLabel: css({\n display: `flex`,\n alignItems: 'center',\n fontWeight: theme.typography.fontWeightMedium,\n fontSize: theme.typography.bodySmall.fontSize,\n lineHeight: theme.typography.bodySmall.lineHeight,\n whiteSpace: 'nowrap',\n marginBottom: theme.spacing(0.5),\n gap: theme.spacing(1),\n }),\n errorIcon: css({\n color: theme.colors.error.text,\n }),\n normalIcon: css({\n color: theme.colors.text.secondary,\n }),\n});\n"],"names":[],"mappings":";;;;;;AAoBO,SAAS,cAAc,KAA2B,EAAA;AACvD,EAAM,MAAA,MAAA,GAAS,WAAW,SAAS,CAAA
|
|
1
|
+
{"version":3,"file":"ControlsLabel.js","sources":["../../../src/utils/ControlsLabel.tsx"],"sourcesContent":["import React from 'react';\nimport { Icon, IconButton, Tooltip, useStyles2, useTheme2 } from '@grafana/ui';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { GrafanaTheme2, IconName } from '@grafana/data';\nimport { css } from '@emotion/css';\nimport { LoadingIndicator } from './LoadingIndicator';\nimport { ControlsLayout } from '../core/types';\n\ninterface ControlsLabelProps {\n label: string;\n htmlFor?: string;\n description?: string;\n isLoading?: boolean;\n error?: string;\n icon?: IconName;\n layout?: ControlsLayout;\n onCancel?: () => void;\n onRemove?: () => void;\n}\n\nexport function ControlsLabel(props: ControlsLabelProps) {\n const styles = useStyles2(getStyles);\n const theme = useTheme2();\n const isVertical = props.layout === 'vertical';\n\n const loadingIndicator = Boolean(props.isLoading) ? (\n <div\n style={{ marginLeft: theme.spacing(1), marginTop: '-1px' }}\n aria-label={selectors.components.LoadingIndicator.icon}\n >\n <LoadingIndicator\n onCancel={(e) => {\n e.preventDefault();\n e.stopPropagation();\n props.onCancel?.();\n }}\n />\n </div>\n ) : null;\n\n let errorIndicator = null;\n if (props.error) {\n errorIndicator = (\n <Tooltip content={props.error} placement={'bottom'}>\n <Icon className={styles.errorIcon} name=\"exclamation-triangle\" />\n </Tooltip>\n );\n }\n\n let descriptionIndicator = null;\n if (props.description) {\n descriptionIndicator = (\n <Tooltip content={props.description} placement={isVertical ? 'top' : 'bottom'}>\n <Icon className={styles.normalIcon} name=\"info-circle\" />\n </Tooltip>\n );\n }\n\n const testId =\n typeof props.label === 'string' ? selectors.pages.Dashboard.SubMenu.submenuItemLabels(props.label) : '';\n let labelElement: JSX.Element;\n\n // The vertical layout has different css class and order of elements (label always first)\n\n if (isVertical) {\n labelElement = (\n <label className={styles.verticalLabel} data-testid={testId} htmlFor={props.htmlFor}>\n {props.label}\n {descriptionIndicator}\n {errorIndicator}\n {props.icon && <Icon name={props.icon} className={styles.normalIcon} />}\n {loadingIndicator}\n {props.onRemove && (\n <IconButton variant=\"secondary\" size=\"xs\" name=\"times\" onClick={props.onRemove} tooltip={'Remove'} />\n )}\n </label>\n );\n } else {\n labelElement = (\n <label className={styles.horizontalLabel} data-testid={testId} htmlFor={props.htmlFor}>\n {errorIndicator}\n {props.icon && <Icon name={props.icon} className={styles.normalIcon} />}\n {props.label}\n {descriptionIndicator}\n {loadingIndicator}\n </label>\n );\n }\n\n return labelElement;\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n horizontalLabel: css({\n background: theme.isDark ? theme.colors.background.primary : theme.colors.background.secondary,\n display: `flex`,\n alignItems: 'center',\n padding: theme.spacing(0, 1),\n fontWeight: theme.typography.fontWeightMedium,\n fontSize: theme.typography.bodySmall.fontSize,\n height: theme.spacing(theme.components.height.md),\n lineHeight: theme.spacing(theme.components.height.md),\n borderRadius: `${theme.shape.radius.default} 0 0 ${theme.shape.radius.default}`,\n border: `1px solid ${theme.components.input.borderColor}`,\n position: 'relative',\n // To make the border line up with the input border\n right: -1,\n whiteSpace: 'nowrap',\n gap: theme.spacing(0.5),\n }),\n verticalLabel: css({\n display: `flex`,\n alignItems: 'center',\n fontWeight: theme.typography.fontWeightMedium,\n fontSize: theme.typography.bodySmall.fontSize,\n lineHeight: theme.typography.bodySmall.lineHeight,\n whiteSpace: 'nowrap',\n marginBottom: theme.spacing(0.5),\n gap: theme.spacing(1),\n }),\n errorIcon: css({\n color: theme.colors.error.text,\n }),\n normalIcon: css({\n color: theme.colors.text.secondary,\n }),\n});\n"],"names":[],"mappings":"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"}
|
|
@@ -2,17 +2,18 @@ import { Tooltip, Icon } from '@grafana/ui';
|
|
|
2
2
|
import React from 'react';
|
|
3
3
|
|
|
4
4
|
function LoadingIndicator(props) {
|
|
5
|
-
return /* @__PURE__ */ React.createElement(Tooltip, {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
5
|
+
return /* @__PURE__ */ React.createElement(Tooltip, { content: "Cancel query" }, /* @__PURE__ */ React.createElement(
|
|
6
|
+
Icon,
|
|
7
|
+
{
|
|
8
|
+
className: "spin-clockwise",
|
|
9
|
+
name: "sync",
|
|
10
|
+
size: "xs",
|
|
11
|
+
role: "button",
|
|
12
|
+
onMouseDown: (e) => {
|
|
13
|
+
props.onCancel(e);
|
|
14
|
+
}
|
|
14
15
|
}
|
|
15
|
-
|
|
16
|
+
));
|
|
16
17
|
}
|
|
17
18
|
|
|
18
19
|
export { LoadingIndicator };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LoadingIndicator.js","sources":["../../../src/utils/LoadingIndicator.tsx"],"sourcesContent":["import { Icon, Tooltip } from '@grafana/ui';\nimport React, { useCallback } from 'react';\nimport { LoadingIndicatorProps as SelectLoadingIndicatorProps } from 'react-select';\n\nexport const SelectLoadingIndicator = ({\n innerProps,\n ...props\n}: SelectLoadingIndicatorProps & { selectProps: { onCancel: () => void } }) => {\n const { onCancel } = props.selectProps;\n const onMouseDown = useCallback(\n (event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n onCancel();\n },\n [onCancel]\n );\n\n return <LoadingIndicator onCancel={onMouseDown} />;\n};\n\ninterface LoadingIndicatorProps {\n onCancel: (event: React.MouseEvent) => void;\n}\n\nexport function LoadingIndicator(props: LoadingIndicatorProps) {\n return (\n <Tooltip content=\"Cancel query\">\n <Icon\n className=\"spin-clockwise\"\n name=\"sync\"\n size=\"xs\"\n role=\"button\"\n onMouseDown={(e) => {\n props.onCancel(e);\n }}\n />\n </Tooltip>\n );\n}\n"],"names":[],"mappings":";;;AAyBO,SAAS,iBAAiB,KAA8B,EAAA;AAC7D,
|
|
1
|
+
{"version":3,"file":"LoadingIndicator.js","sources":["../../../src/utils/LoadingIndicator.tsx"],"sourcesContent":["import { Icon, Tooltip } from '@grafana/ui';\nimport React, { useCallback } from 'react';\nimport { LoadingIndicatorProps as SelectLoadingIndicatorProps } from 'react-select';\n\nexport const SelectLoadingIndicator = ({\n innerProps,\n ...props\n}: SelectLoadingIndicatorProps & { selectProps: { onCancel: () => void } }) => {\n const { onCancel } = props.selectProps;\n const onMouseDown = useCallback(\n (event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n onCancel();\n },\n [onCancel]\n );\n\n return <LoadingIndicator onCancel={onMouseDown} />;\n};\n\ninterface LoadingIndicatorProps {\n onCancel: (event: React.MouseEvent) => void;\n}\n\nexport function LoadingIndicator(props: LoadingIndicatorProps) {\n return (\n <Tooltip content=\"Cancel query\">\n <Icon\n className=\"spin-clockwise\"\n name=\"sync\"\n size=\"xs\"\n role=\"button\"\n onMouseDown={(e) => {\n props.onCancel(e);\n }}\n />\n </Tooltip>\n );\n}\n"],"names":[],"mappings":";;;AAyBO,SAAS,iBAAiB,KAA8B,EAAA;AAC7D,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,OAAQ,EAAA,EAAA,OAAA,EAAQ,cACf,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,SAAU,EAAA,gBAAA;AAAA,MACV,IAAK,EAAA,MAAA;AAAA,MACL,IAAK,EAAA,IAAA;AAAA,MACL,IAAK,EAAA,QAAA;AAAA,MACL,WAAA,EAAa,CAAC,CAAM,KAAA;AAClB,QAAA,KAAA,CAAM,SAAS,CAAC,CAAA;AAAA;AAClB;AAAA,GAEJ,CAAA;AAEJ;;;;"}
|
|
@@ -1,25 +1,14 @@
|
|
|
1
|
-
var
|
|
2
|
-
|
|
3
|
-
throw TypeError("Cannot " + msg);
|
|
4
|
-
};
|
|
5
|
-
var __privateGet = (obj, member, getter) => {
|
|
6
|
-
__accessCheck(obj, member, "read from private field");
|
|
7
|
-
return getter ? getter.call(obj) : member.get(obj);
|
|
8
|
-
};
|
|
9
|
-
var __privateAdd = (obj, member, value) => {
|
|
10
|
-
if (member.has(obj))
|
|
11
|
-
throw TypeError("Cannot add the same private member more than once");
|
|
12
|
-
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
13
|
-
};
|
|
14
|
-
var __privateSet = (obj, member, value, setter) => {
|
|
15
|
-
__accessCheck(obj, member, "write to private field");
|
|
16
|
-
setter ? setter.call(obj, value) : member.set(obj, value);
|
|
17
|
-
return value;
|
|
1
|
+
var __typeError = (msg) => {
|
|
2
|
+
throw TypeError(msg);
|
|
18
3
|
};
|
|
4
|
+
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
5
|
+
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
6
|
+
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
7
|
+
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
|
|
19
8
|
var _value;
|
|
20
9
|
class SafeSerializableSceneObject {
|
|
21
10
|
constructor(value) {
|
|
22
|
-
__privateAdd(this, _value
|
|
11
|
+
__privateAdd(this, _value);
|
|
23
12
|
this.text = "__sceneObject";
|
|
24
13
|
this.valueOf = () => {
|
|
25
14
|
return __privateGet(this, _value);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SafeSerializableSceneObject.js","sources":["../../../src/utils/SafeSerializableSceneObject.ts"],"sourcesContent":["import { ScopedVar } from '@grafana/data';\nimport { SceneObject } from '../core/types';\n\nexport class SafeSerializableSceneObject implements ScopedVar {\n #value: SceneObject;\n\n public text = '__sceneObject';\n\n public constructor(value: SceneObject) {\n this.#value = value;\n }\n\n public toString() {\n return undefined;\n }\n\n public valueOf = () => {\n return this.#value;\n };\n\n public get value() {\n return this;\n }\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"SafeSerializableSceneObject.js","sources":["../../../src/utils/SafeSerializableSceneObject.ts"],"sourcesContent":["import { ScopedVar } from '@grafana/data';\nimport { SceneObject } from '../core/types';\n\nexport class SafeSerializableSceneObject implements ScopedVar {\n #value: SceneObject;\n\n public text = '__sceneObject';\n\n public constructor(value: SceneObject) {\n this.#value = value;\n }\n\n public toString() {\n return undefined;\n }\n\n public valueOf = () => {\n return this.#value;\n };\n\n public get value() {\n return this;\n }\n}\n"],"names":[],"mappings":";;;;;;;AAAA,IAAA,MAAA;AAGO,MAAM,2BAAiD,CAAA;AAAA,EAKrD,YAAY,KAAoB,EAAA;AAJvC,IAAA,YAAA,CAAA,IAAA,EAAA,MAAA,CAAA;AAEA,IAAA,IAAA,CAAO,IAAO,GAAA,eAAA;AAUd,IAAA,IAAA,CAAO,UAAU,MAAM;AACrB,MAAA,OAAO,YAAK,CAAA,IAAA,EAAA,MAAA,CAAA;AAAA,KACd;AATE,IAAA,YAAA,CAAA,IAAA,EAAK,MAAS,EAAA,KAAA,CAAA;AAAA;AAChB,EAEO,QAAW,GAAA;AAChB,IAAO,OAAA,MAAA;AAAA;AACT,EAMA,IAAW,KAAQ,GAAA;AACjB,IAAO,OAAA,IAAA;AAAA;AAEX;AAnBE,MAAA,GAAA,IAAA,OAAA,EAAA;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setWindowGrafanaSceneContext.js","sources":["../../../../src/utils/compatibility/setWindowGrafanaSceneContext.ts"],"sourcesContent":["import { SceneObject } from '../../core/types';\nimport { writeSceneLog } from '../writeSceneLog';\n\n/**\n * Adds the scene object to the global window state so that templateSrv in core can interpolate strings using the scene interpolation engine with the scene as scope.\n * This is needed for old datasources that call templateSrv.replace without passing scopedVars. For example in DataSourceAPI.metricFindQuery.\n *\n * This is also used from TimeSrv to access scene time range.\n */\nexport function setWindowGrafanaSceneContext(activeScene: SceneObject) {\n const prevScene = (window as any).__grafanaSceneContext;\n\n writeSceneLog('setWindowGrafanaScene', 'set window.__grafanaSceneContext', activeScene);\n (window as any).__grafanaSceneContext = activeScene;\n\n return () => {\n if ((window as any).__grafanaSceneContext === activeScene) {\n writeSceneLog('setWindowGrafanaScene', 'restore window.__grafanaSceneContext', prevScene);\n (window as any).__grafanaSceneContext = prevScene;\n }\n };\n}\n"],"names":[],"mappings":";;AASO,SAAS,6BAA6B,WAA0B,EAAA;AACrE,EAAA,MAAM,YAAa,MAAe,CAAA,qBAAA
|
|
1
|
+
{"version":3,"file":"setWindowGrafanaSceneContext.js","sources":["../../../../src/utils/compatibility/setWindowGrafanaSceneContext.ts"],"sourcesContent":["import { SceneObject } from '../../core/types';\nimport { writeSceneLog } from '../writeSceneLog';\n\n/**\n * Adds the scene object to the global window state so that templateSrv in core can interpolate strings using the scene interpolation engine with the scene as scope.\n * This is needed for old datasources that call templateSrv.replace without passing scopedVars. For example in DataSourceAPI.metricFindQuery.\n *\n * This is also used from TimeSrv to access scene time range.\n */\nexport function setWindowGrafanaSceneContext(activeScene: SceneObject) {\n const prevScene = (window as any).__grafanaSceneContext;\n\n writeSceneLog('setWindowGrafanaScene', 'set window.__grafanaSceneContext', activeScene);\n (window as any).__grafanaSceneContext = activeScene;\n\n return () => {\n if ((window as any).__grafanaSceneContext === activeScene) {\n writeSceneLog('setWindowGrafanaScene', 'restore window.__grafanaSceneContext', prevScene);\n (window as any).__grafanaSceneContext = prevScene;\n }\n };\n}\n"],"names":[],"mappings":";;AASO,SAAS,6BAA6B,WAA0B,EAAA;AACrE,EAAA,MAAM,YAAa,MAAe,CAAA,qBAAA;AAElC,EAAc,aAAA,CAAA,uBAAA,EAAyB,oCAAoC,WAAW,CAAA;AACtF,EAAC,OAAe,qBAAwB,GAAA,WAAA;AAExC,EAAA,OAAO,MAAM;AACX,IAAK,IAAA,MAAA,CAAe,0BAA0B,WAAa,EAAA;AACzD,MAAc,aAAA,CAAA,uBAAA,EAAyB,wCAAwC,SAAS,CAAA;AACxF,MAAC,OAAe,qBAAwB,GAAA,SAAA;AAAA;AAC1C,GACF;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date.js","sources":["../../../src/utils/date.ts"],"sourcesContent":["import { isDateTime, dateMath, dateTimeParse } from '@grafana/data';\nimport { TimeZone } from '@grafana/schema';\n\nexport function isValid(value: string, roundUp?: boolean, timeZone?: TimeZone): boolean {\n if (isDateTime(value)) {\n return value.isValid();\n }\n\n if (dateMath.isMathString(value)) {\n return dateMath.isValid(value);\n }\n\n const parsed = dateTimeParse(value, { roundUp, timeZone });\n return parsed.isValid();\n}\n"],"names":[],"mappings":";;AAGgB,SAAA,OAAA,CAAQ,KAAe,EAAA,OAAA,EAAmB,QAA8B,EAAA;AACtF,EAAI,IAAA,UAAA,CAAW,KAAK,CAAG,EAAA;AACrB,IAAA,OAAO,MAAM,OAAQ,EAAA
|
|
1
|
+
{"version":3,"file":"date.js","sources":["../../../src/utils/date.ts"],"sourcesContent":["import { isDateTime, dateMath, dateTimeParse } from '@grafana/data';\nimport { TimeZone } from '@grafana/schema';\n\nexport function isValid(value: string, roundUp?: boolean, timeZone?: TimeZone): boolean {\n if (isDateTime(value)) {\n return value.isValid();\n }\n\n if (dateMath.isMathString(value)) {\n return dateMath.isValid(value);\n }\n\n const parsed = dateTimeParse(value, { roundUp, timeZone });\n return parsed.isValid();\n}\n"],"names":[],"mappings":";;AAGgB,SAAA,OAAA,CAAQ,KAAe,EAAA,OAAA,EAAmB,QAA8B,EAAA;AACtF,EAAI,IAAA,UAAA,CAAW,KAAK,CAAG,EAAA;AACrB,IAAA,OAAO,MAAM,OAAQ,EAAA;AAAA;AAGvB,EAAI,IAAA,QAAA,CAAS,YAAa,CAAA,KAAK,CAAG,EAAA;AAChC,IAAO,OAAA,QAAA,CAAS,QAAQ,KAAK,CAAA;AAAA;AAG/B,EAAA,MAAM,SAAS,aAAc,CAAA,KAAA,EAAO,EAAE,OAAA,EAAS,UAAU,CAAA;AACzD,EAAA,OAAO,OAAO,OAAQ,EAAA;AACxB;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluateTimeRange.js","sources":["../../../src/utils/evaluateTimeRange.ts"],"sourcesContent":["import { dateMath, DateTime, DateTimeInput, setWeekStart, TimeRange } from '@grafana/data';\nimport { TimeZone } from '@grafana/schema';\nimport { WeekStart } from '@grafana/ui';\n\nexport function evaluateTimeRange(\n from: string | DateTime,\n to: string | DateTime,\n timeZone: TimeZone,\n fiscalYearStartMonth: number | undefined,\n delay: string | undefined,\n weekStart: WeekStart | undefined\n): TimeRange {\n const hasDelay = delay && to === 'now';\n const now = Date.now();\n\n if (weekStart) {\n setWeekStartIfDifferent(weekStart);\n }\n\n /** This tries to use dateMath.toDateTime if available, otherwise falls back to dateMath.parse.\n * Using dateMath.parse can potentially result in to and from being calculated using two different timestamps.\n * If two different timestamps are used, the time range \"now-24h to now\" will potentially be 24h +- number of milliseconds it takes between calculations.\n */\n const parseOrToDateTime = (\n val: string | DateTime,\n options: { roundUp: boolean; timezone: TimeZone; fiscalYearStartMonth?: number; now?: DateTimeInput }\n ) => {\n // @ts-ignore\n if (dateMath.toDateTime) {\n // @ts-ignore\n return dateMath.toDateTime(val, options);\n } else {\n return dateMath.parse(val, options.roundUp, options.timezone, options.fiscalYearStartMonth);\n }\n };\n\n /** The order of calculating to and from is important. This is because if we're using the old dateMath.parse we could potentially get two different timestamps.\n * If we calculate to first, then from. The timerange \"now-24h to now\" will err on the side of being shorter than 24h. This will aleviate some of the issues arising\n * from the timerange indeterminently alternating between less than or equal to 24h and being greater than 24h.\n */\n return {\n to: parseOrToDateTime(hasDelay ? 'now-' + delay : to, {\n roundUp: true,\n timezone: timeZone,\n fiscalYearStartMonth: fiscalYearStartMonth,\n now: now,\n })!,\n from: parseOrToDateTime(from, {\n roundUp: false,\n timezone: timeZone,\n fiscalYearStartMonth: fiscalYearStartMonth,\n now: now,\n })!,\n raw: {\n from: from,\n to: to,\n },\n };\n}\n\nlet prevWeekStart: WeekStart | undefined;\n\nfunction setWeekStartIfDifferent(weekStart: WeekStart) {\n if (weekStart !== prevWeekStart) {\n prevWeekStart = weekStart;\n setWeekStart(weekStart);\n }\n}\n"],"names":[],"mappings":";;AAIO,SAAS,kBACd,IACA,EAAA,EAAA,EACA,QACA,EAAA,oBAAA,EACA,OACA,SACW,EAAA;AACX,EAAM,MAAA,QAAA,GAAW,SAAS,EAAO,KAAA,KAAA
|
|
1
|
+
{"version":3,"file":"evaluateTimeRange.js","sources":["../../../src/utils/evaluateTimeRange.ts"],"sourcesContent":["import { dateMath, DateTime, DateTimeInput, setWeekStart, TimeRange } from '@grafana/data';\nimport { TimeZone } from '@grafana/schema';\nimport { WeekStart } from '@grafana/ui';\n\nexport function evaluateTimeRange(\n from: string | DateTime,\n to: string | DateTime,\n timeZone: TimeZone,\n fiscalYearStartMonth: number | undefined,\n delay: string | undefined,\n weekStart: WeekStart | undefined\n): TimeRange {\n const hasDelay = delay && to === 'now';\n const now = Date.now();\n\n if (weekStart) {\n setWeekStartIfDifferent(weekStart);\n }\n\n /** This tries to use dateMath.toDateTime if available, otherwise falls back to dateMath.parse.\n * Using dateMath.parse can potentially result in to and from being calculated using two different timestamps.\n * If two different timestamps are used, the time range \"now-24h to now\" will potentially be 24h +- number of milliseconds it takes between calculations.\n */\n const parseOrToDateTime = (\n val: string | DateTime,\n options: { roundUp: boolean; timezone: TimeZone; fiscalYearStartMonth?: number; now?: DateTimeInput }\n ) => {\n // @ts-ignore\n if (dateMath.toDateTime) {\n // @ts-ignore\n return dateMath.toDateTime(val, options);\n } else {\n return dateMath.parse(val, options.roundUp, options.timezone, options.fiscalYearStartMonth);\n }\n };\n\n /** The order of calculating to and from is important. This is because if we're using the old dateMath.parse we could potentially get two different timestamps.\n * If we calculate to first, then from. The timerange \"now-24h to now\" will err on the side of being shorter than 24h. This will aleviate some of the issues arising\n * from the timerange indeterminently alternating between less than or equal to 24h and being greater than 24h.\n */\n return {\n to: parseOrToDateTime(hasDelay ? 'now-' + delay : to, {\n roundUp: true,\n timezone: timeZone,\n fiscalYearStartMonth: fiscalYearStartMonth,\n now: now,\n })!,\n from: parseOrToDateTime(from, {\n roundUp: false,\n timezone: timeZone,\n fiscalYearStartMonth: fiscalYearStartMonth,\n now: now,\n })!,\n raw: {\n from: from,\n to: to,\n },\n };\n}\n\nlet prevWeekStart: WeekStart | undefined;\n\nfunction setWeekStartIfDifferent(weekStart: WeekStart) {\n if (weekStart !== prevWeekStart) {\n prevWeekStart = weekStart;\n setWeekStart(weekStart);\n }\n}\n"],"names":[],"mappings":";;AAIO,SAAS,kBACd,IACA,EAAA,EAAA,EACA,QACA,EAAA,oBAAA,EACA,OACA,SACW,EAAA;AACX,EAAM,MAAA,QAAA,GAAW,SAAS,EAAO,KAAA,KAAA;AACjC,EAAM,MAAA,GAAA,GAAM,KAAK,GAAI,EAAA;AAErB,EAAA,IAAI,SAAW,EAAA;AACb,IAAA,uBAAA,CAAwB,SAAS,CAAA;AAAA;AAOnC,EAAM,MAAA,iBAAA,GAAoB,CACxB,GAAA,EACA,OACG,KAAA;AAEH,IAAA,IAAI,SAAS,UAAY,EAAA;AAEvB,MAAO,OAAA,QAAA,CAAS,UAAW,CAAA,GAAA,EAAK,OAAO,CAAA;AAAA,KAClC,MAAA;AACL,MAAO,OAAA,QAAA,CAAS,MAAM,GAAK,EAAA,OAAA,CAAQ,SAAS,OAAQ,CAAA,QAAA,EAAU,QAAQ,oBAAoB,CAAA;AAAA;AAC5F,GACF;AAMA,EAAO,OAAA;AAAA,IACL,EAAI,EAAA,iBAAA,CAAkB,QAAW,GAAA,MAAA,GAAS,QAAQ,EAAI,EAAA;AAAA,MACpD,OAAS,EAAA,IAAA;AAAA,MACT,QAAU,EAAA,QAAA;AAAA,MACV,oBAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,IACD,IAAA,EAAM,kBAAkB,IAAM,EAAA;AAAA,MAC5B,OAAS,EAAA,KAAA;AAAA,MACT,QAAU,EAAA,QAAA;AAAA,MACV,oBAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,IACD,GAAK,EAAA;AAAA,MACH,IAAA;AAAA,MACA;AAAA;AACF,GACF;AACF;AAEA,IAAI,aAAA;AAEJ,SAAS,wBAAwB,SAAsB,EAAA;AACrD,EAAA,IAAI,cAAc,aAAe,EAAA;AAC/B,IAAgB,aAAA,GAAA,SAAA;AAChB,IAAA,YAAA,CAAa,SAAS,CAAA;AAAA;AAE1B;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"explore.js","sources":["../../../src/utils/explore.ts"],"sourcesContent":["import { PanelData, RawTimeRange, ScopedVars } from '@grafana/data';\nimport { SceneObject } from '../core/types';\nimport { wrapInSafeSerializableSceneObject } from './wrapInSafeSerializableSceneObject';\nimport { getDataSourceSrv } from '@grafana/runtime';\nimport { DataQuery } from '@grafana/schema';\n\n/**\n * Returns URL to Grafana explore for the queries in the given panel data and time range.\n */\nexport async function getExploreURL(\n data: PanelData,\n model: SceneObject,\n timeRange: RawTimeRange,\n transform?: (query: DataQuery) => DataQuery\n): Promise<string> {\n const targets = data.request?.targets;\n if (!targets) {\n return '';\n }\n\n const { from, to } = timeRange;\n const filters = data.request?.filters;\n\n const scopedVars: ScopedVars = {\n __sceneObject: wrapInSafeSerializableSceneObject(model),\n };\n\n const interpolatedQueries = (\n await Promise.allSettled(\n targets.map(async (q) => {\n const queryDs = await getDataSourceSrv().get(q.datasource);\n return queryDs.interpolateVariablesInQueries?.([q], scopedVars ?? {}, filters)[0] || q;\n })\n )\n )\n .filter((promise): promise is PromiseFulfilledResult<DataQuery> => promise.status === 'fulfilled')\n .map((q) => q.value)\n .map((q) => transform?.(q) ?? q);\n\n const queries: DataQuery[] = interpolatedQueries ?? [];\n\n // Check if we have mixed datasources (more than one unique datasource)\n const hasMixedDatasources = new Set(queries.map((q) => q.datasource?.uid)).size > 1;\n\n // For mixed datasources, mark the datasource as \"-- Mixed --\"\n let datasource = hasMixedDatasources\n ? '-- Mixed --'\n : queries.find((query) => !!query.datasource?.uid)?.datasource?.uid;\n\n if (queries?.length && datasource && from && to) {\n const left = encodeURIComponent(\n JSON.stringify({\n datasource,\n queries,\n range: {\n from,\n to,\n },\n })\n );\n\n return `/explore?left=${left}`;\n }\n return '';\n}\n"],"names":["_a"],"mappings":";;;AASA,eAAsB,aACpB,CAAA,IAAA,EACA,KACA,EAAA,SAAA,EACA,SACiB,EAAA;AAdnB,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA
|
|
1
|
+
{"version":3,"file":"explore.js","sources":["../../../src/utils/explore.ts"],"sourcesContent":["import { PanelData, RawTimeRange, ScopedVars } from '@grafana/data';\nimport { SceneObject } from '../core/types';\nimport { wrapInSafeSerializableSceneObject } from './wrapInSafeSerializableSceneObject';\nimport { getDataSourceSrv } from '@grafana/runtime';\nimport { DataQuery } from '@grafana/schema';\n\n/**\n * Returns URL to Grafana explore for the queries in the given panel data and time range.\n */\nexport async function getExploreURL(\n data: PanelData,\n model: SceneObject,\n timeRange: RawTimeRange,\n transform?: (query: DataQuery) => DataQuery\n): Promise<string> {\n const targets = data.request?.targets;\n if (!targets) {\n return '';\n }\n\n const { from, to } = timeRange;\n const filters = data.request?.filters;\n\n const scopedVars: ScopedVars = {\n __sceneObject: wrapInSafeSerializableSceneObject(model),\n };\n\n const interpolatedQueries = (\n await Promise.allSettled(\n targets.map(async (q) => {\n const queryDs = await getDataSourceSrv().get(q.datasource);\n return queryDs.interpolateVariablesInQueries?.([q], scopedVars ?? {}, filters)[0] || q;\n })\n )\n )\n .filter((promise): promise is PromiseFulfilledResult<DataQuery> => promise.status === 'fulfilled')\n .map((q) => q.value)\n .map((q) => transform?.(q) ?? q);\n\n const queries: DataQuery[] = interpolatedQueries ?? [];\n\n // Check if we have mixed datasources (more than one unique datasource)\n const hasMixedDatasources = new Set(queries.map((q) => q.datasource?.uid)).size > 1;\n\n // For mixed datasources, mark the datasource as \"-- Mixed --\"\n let datasource = hasMixedDatasources\n ? '-- Mixed --'\n : queries.find((query) => !!query.datasource?.uid)?.datasource?.uid;\n\n if (queries?.length && datasource && from && to) {\n const left = encodeURIComponent(\n JSON.stringify({\n datasource,\n queries,\n range: {\n from,\n to,\n },\n })\n );\n\n return `/explore?left=${left}`;\n }\n return '';\n}\n"],"names":["_a"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getCompareSeriesRefId.js","sources":["../../../src/utils/getCompareSeriesRefId.ts"],"sourcesContent":["export const getCompareSeriesRefId = (refId: string) => `${refId}-compare`;\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"getCompareSeriesRefId.js","sources":["../../../src/utils/getCompareSeriesRefId.ts"],"sourcesContent":["export const getCompareSeriesRefId = (refId: string) => `${refId}-compare`;\n"],"names":[],"mappings":"AAAO,MAAM,qBAAwB,GAAA,CAAC,KAAkB,KAAA,CAAA,EAAG,KAAK,CAAA,QAAA;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getDataSource.js","sources":["../../../src/utils/getDataSource.ts"],"sourcesContent":["import { DataSourceApi, ScopedVars } from '@grafana/data';\nimport { getDataSourceSrv } from '@grafana/runtime';\nimport { DataSourceRef } from '@grafana/schema';\nimport { runtimeDataSources } from '../querying/RuntimeDataSource';\nimport { registerQueryWithController, wrapPromiseInStateObservable } from '../querying/registerQueryWithController';\nimport { SceneObject } from '../core/types';\nimport { sceneGraph } from '../core/sceneGraph';\n\nexport async function getDataSource(\n datasource: DataSourceRef | undefined | null,\n scopedVars: ScopedVars\n): Promise<DataSourceApi> {\n if (datasource?.uid) {\n const runtimeDataSource = runtimeDataSources.get(datasource.uid);\n if (runtimeDataSource) {\n return runtimeDataSource;\n }\n }\n\n if (datasource && (datasource as any).query) {\n return datasource as DataSourceApi;\n }\n\n const dsPromise = getDataSourceSrv().get(datasource as string, scopedVars);\n\n if (scopedVars.__sceneObject && scopedVars.__sceneObject.value.valueOf()) {\n const queryControler = sceneGraph.getQueryController(scopedVars.__sceneObject.value.valueOf() as SceneObject);\n if (queryControler && queryControler.state.enableProfiling) {\n wrapPromiseInStateObservable(dsPromise)\n .pipe(\n registerQueryWithController({\n type: 'plugin',\n origin: scopedVars.__sceneObject.value.valueOf() as SceneObject,\n })\n )\n .subscribe(() => {});\n }\n }\n\n const result = await dsPromise;\n return result;\n}\n"],"names":[],"mappings":";;;;;AAQsB,eAAA,aAAA,CACpB,YACA,UACwB,EAAA;AACxB,EAAA,IAAI,yCAAY,GAAK,EAAA;AACnB,IAAA,MAAM,iBAAoB,GAAA,kBAAA,CAAmB,GAAI,CAAA,UAAA,CAAW,GAAG,CAAA
|
|
1
|
+
{"version":3,"file":"getDataSource.js","sources":["../../../src/utils/getDataSource.ts"],"sourcesContent":["import { DataSourceApi, ScopedVars } from '@grafana/data';\nimport { getDataSourceSrv } from '@grafana/runtime';\nimport { DataSourceRef } from '@grafana/schema';\nimport { runtimeDataSources } from '../querying/RuntimeDataSource';\nimport { registerQueryWithController, wrapPromiseInStateObservable } from '../querying/registerQueryWithController';\nimport { SceneObject } from '../core/types';\nimport { sceneGraph } from '../core/sceneGraph';\n\nexport async function getDataSource(\n datasource: DataSourceRef | undefined | null,\n scopedVars: ScopedVars\n): Promise<DataSourceApi> {\n if (datasource?.uid) {\n const runtimeDataSource = runtimeDataSources.get(datasource.uid);\n if (runtimeDataSource) {\n return runtimeDataSource;\n }\n }\n\n if (datasource && (datasource as any).query) {\n return datasource as DataSourceApi;\n }\n\n const dsPromise = getDataSourceSrv().get(datasource as string, scopedVars);\n\n if (scopedVars.__sceneObject && scopedVars.__sceneObject.value.valueOf()) {\n const queryControler = sceneGraph.getQueryController(scopedVars.__sceneObject.value.valueOf() as SceneObject);\n if (queryControler && queryControler.state.enableProfiling) {\n wrapPromiseInStateObservable(dsPromise)\n .pipe(\n registerQueryWithController({\n type: 'plugin',\n origin: scopedVars.__sceneObject.value.valueOf() as SceneObject,\n })\n )\n .subscribe(() => {});\n }\n }\n\n const result = await dsPromise;\n return result;\n}\n"],"names":[],"mappings":";;;;;AAQsB,eAAA,aAAA,CACpB,YACA,UACwB,EAAA;AACxB,EAAA,IAAI,yCAAY,GAAK,EAAA;AACnB,IAAA,MAAM,iBAAoB,GAAA,kBAAA,CAAmB,GAAI,CAAA,UAAA,CAAW,GAAG,CAAA;AAC/D,IAAA,IAAI,iBAAmB,EAAA;AACrB,MAAO,OAAA,iBAAA;AAAA;AACT;AAGF,EAAI,IAAA,UAAA,IAAe,WAAmB,KAAO,EAAA;AAC3C,IAAO,OAAA,UAAA;AAAA;AAGT,EAAA,MAAM,SAAY,GAAA,gBAAA,EAAmB,CAAA,GAAA,CAAI,YAAsB,UAAU,CAAA;AAEzE,EAAA,IAAI,WAAW,aAAiB,IAAA,UAAA,CAAW,aAAc,CAAA,KAAA,CAAM,SAAW,EAAA;AACxE,IAAA,MAAM,iBAAiB,UAAW,CAAA,kBAAA,CAAmB,WAAW,aAAc,CAAA,KAAA,CAAM,SAAwB,CAAA;AAC5G,IAAI,IAAA,cAAA,IAAkB,cAAe,CAAA,KAAA,CAAM,eAAiB,EAAA;AAC1D,MAAA,4BAAA,CAA6B,SAAS,CACnC,CAAA,IAAA;AAAA,QACC,2BAA4B,CAAA;AAAA,UAC1B,IAAM,EAAA,QAAA;AAAA,UACN,MAAQ,EAAA,UAAA,CAAW,aAAc,CAAA,KAAA,CAAM,OAAQ;AAAA,SAChD;AAAA,OACH,CACC,UAAU,MAAM;AAAA,OAAE,CAAA;AAAA;AACvB;AAGF,EAAA,MAAM,SAAS,MAAM,SAAA;AACrB,EAAO,OAAA,MAAA;AACT;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getMessageFromError.js","sources":["../../../src/utils/getMessageFromError.ts"],"sourcesContent":["import { isFetchError } from '@grafana/runtime';\n\nexport function getMessageFromError(err: unknown): string {\n if (typeof err === 'string') {\n return err;\n }\n\n if (err) {\n if (err instanceof Error) {\n return err.message;\n } else if (isFetchError(err)) {\n if (err.data && err.data.message) {\n return err.data.message;\n } else if (err.statusText) {\n return err.statusText;\n }\n } else if (err.hasOwnProperty('message')) {\n // @ts-expect-error\n return err.message;\n }\n }\n\n return JSON.stringify(err);\n}\n"],"names":[],"mappings":";;AAEO,SAAS,oBAAoB,GAAsB,EAAA;AACxD,EAAI,IAAA,OAAO,QAAQ,QAAU,EAAA;AAC3B,IAAO,OAAA,GAAA
|
|
1
|
+
{"version":3,"file":"getMessageFromError.js","sources":["../../../src/utils/getMessageFromError.ts"],"sourcesContent":["import { isFetchError } from '@grafana/runtime';\n\nexport function getMessageFromError(err: unknown): string {\n if (typeof err === 'string') {\n return err;\n }\n\n if (err) {\n if (err instanceof Error) {\n return err.message;\n } else if (isFetchError(err)) {\n if (err.data && err.data.message) {\n return err.data.message;\n } else if (err.statusText) {\n return err.statusText;\n }\n } else if (err.hasOwnProperty('message')) {\n // @ts-expect-error\n return err.message;\n }\n }\n\n return JSON.stringify(err);\n}\n"],"names":[],"mappings":";;AAEO,SAAS,oBAAoB,GAAsB,EAAA;AACxD,EAAI,IAAA,OAAO,QAAQ,QAAU,EAAA;AAC3B,IAAO,OAAA,GAAA;AAAA;AAGT,EAAA,IAAI,GAAK,EAAA;AACP,IAAA,IAAI,eAAe,KAAO,EAAA;AACxB,MAAA,OAAO,GAAI,CAAA,OAAA;AAAA,KACb,MAAA,IAAW,YAAa,CAAA,GAAG,CAAG,EAAA;AAC5B,MAAA,IAAI,GAAI,CAAA,IAAA,IAAQ,GAAI,CAAA,IAAA,CAAK,OAAS,EAAA;AAChC,QAAA,OAAO,IAAI,IAAK,CAAA,OAAA;AAAA,OAClB,MAAA,IAAW,IAAI,UAAY,EAAA;AACzB,QAAA,OAAO,GAAI,CAAA,UAAA;AAAA;AACb,KACS,MAAA,IAAA,GAAA,CAAI,cAAe,CAAA,SAAS,CAAG,EAAA;AAExC,MAAA,OAAO,GAAI,CAAA,OAAA;AAAA;AACb;AAGF,EAAO,OAAA,IAAA,CAAK,UAAU,GAAG,CAAA;AAC3B;;;;"}
|