@grafana/scenes 0.3.0 → 0.4.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.
Files changed (56) hide show
  1. package/CHANGELOG.md +51 -5
  2. package/README.md +1 -1
  3. package/dist/esm/components/EmbeddedScene.js +8 -5
  4. package/dist/esm/components/EmbeddedScene.js.map +1 -1
  5. package/dist/esm/components/NestedScene.js.map +1 -1
  6. package/dist/esm/components/SceneApp/SceneApp.js +2 -5
  7. package/dist/esm/components/SceneApp/SceneApp.js.map +1 -1
  8. package/dist/esm/components/SceneApp/SceneAppPage.js +122 -104
  9. package/dist/esm/components/SceneApp/SceneAppPage.js.map +1 -1
  10. package/dist/esm/components/SceneApp/SceneAppPageView.js +82 -0
  11. package/dist/esm/components/SceneApp/SceneAppPageView.js.map +1 -0
  12. package/dist/esm/components/SceneApp/utils.js +5 -1
  13. package/dist/esm/components/SceneApp/utils.js.map +1 -1
  14. package/dist/esm/components/layout/SceneFlexLayout.js +40 -19
  15. package/dist/esm/components/layout/SceneFlexLayout.js.map +1 -1
  16. package/dist/esm/components/layout/grid/LazyLoader.js +87 -0
  17. package/dist/esm/components/layout/grid/LazyLoader.js.map +1 -0
  18. package/dist/esm/components/layout/grid/SceneGridLayout.js +2 -50
  19. package/dist/esm/components/layout/grid/SceneGridLayout.js.map +1 -1
  20. package/dist/esm/components/layout/grid/SceneGridLayoutRenderer.js +70 -0
  21. package/dist/esm/components/layout/grid/SceneGridLayoutRenderer.js.map +1 -0
  22. package/dist/esm/core/SceneComponentWrapper.js +8 -1
  23. package/dist/esm/core/SceneComponentWrapper.js.map +1 -1
  24. package/dist/esm/core/SceneObjectBase.js +16 -2
  25. package/dist/esm/core/SceneObjectBase.js.map +1 -1
  26. package/dist/esm/core/sceneGraph.js +49 -30
  27. package/dist/esm/core/sceneGraph.js.map +1 -1
  28. package/dist/esm/core/types.js.map +1 -1
  29. package/dist/esm/index.js +1 -1
  30. package/dist/esm/querying/SceneQueryRunner.js +11 -14
  31. package/dist/esm/querying/SceneQueryRunner.js.map +1 -1
  32. package/dist/esm/services/UrlSyncManager.js +52 -17
  33. package/dist/esm/services/UrlSyncManager.js.map +1 -1
  34. package/dist/esm/utils/getDataSource.js.map +1 -1
  35. package/dist/esm/variables/interpolation/ScopedVarsVariable.js +4 -13
  36. package/dist/esm/variables/interpolation/ScopedVarsVariable.js.map +1 -1
  37. package/dist/esm/variables/interpolation/fieldAccessorCache.js +13 -0
  38. package/dist/esm/variables/interpolation/fieldAccessorCache.js.map +1 -0
  39. package/dist/esm/variables/macros/dataMacros.js +134 -0
  40. package/dist/esm/variables/macros/dataMacros.js.map +1 -0
  41. package/dist/esm/variables/macros/index.js +5 -2
  42. package/dist/esm/variables/macros/index.js.map +1 -1
  43. package/dist/esm/variables/macros/templateProxies.js +51 -0
  44. package/dist/esm/variables/macros/templateProxies.js.map +1 -0
  45. package/dist/esm/variables/sets/SceneVariableSet.js +17 -1
  46. package/dist/esm/variables/sets/SceneVariableSet.js.map +1 -1
  47. package/dist/esm/variables/variants/TestVariable.js +3 -1
  48. package/dist/esm/variables/variants/TestVariable.js.map +1 -1
  49. package/dist/esm/variables/variants/query/QueryVariable.js +1 -17
  50. package/dist/esm/variables/variants/query/QueryVariable.js.map +1 -1
  51. package/dist/index.d.ts +84 -32
  52. package/dist/index.js +986 -585
  53. package/dist/index.js.map +1 -1
  54. package/package.json +2 -2
  55. package/dist/esm/variables/macros/DataValueMacro.js +0 -60
  56. package/dist/esm/variables/macros/DataValueMacro.js.map +0 -1
package/dist/index.d.ts CHANGED
@@ -4,6 +4,7 @@ import { BusEventWithPayload, PanelData, BusEvent, BusEventType, BusEventHandler
4
4
  import { VariableType, VariableHide, DataSourceRef, DataQuery } from '@grafana/schema';
5
5
  import { PanelContext, IconName } from '@grafana/ui';
6
6
  import ReactGridLayout from 'react-grid-layout';
7
+ import { RouteComponentProps } from 'react-router-dom';
7
8
 
8
9
  interface SceneVariableState extends SceneObjectState {
9
10
  type: VariableType;
@@ -93,9 +94,12 @@ interface SceneObjectState {
93
94
  $timeRange?: SceneTimeRangeLike;
94
95
  $data?: SceneDataProvider;
95
96
  $variables?: SceneVariables;
96
- }
97
- interface SceneLayoutItemState extends SceneObjectState {
98
- body: SceneObject | undefined;
97
+ /**
98
+ * @experimental
99
+ * Can be used to add extra behaviors to a scene object.
100
+ * These are activated when the their parent scene object is activated.
101
+ */
102
+ $behaviors?: Array<SceneObject | SceneStatelessBehavior>;
99
103
  }
100
104
  interface SceneLayoutChildOptions {
101
105
  width?: number | string;
@@ -209,6 +213,7 @@ type DeepPartial<T> = {
209
213
  interface SceneDataProvider extends SceneObject<SceneDataState> {
210
214
  setContainerWidth?: (width: number) => void;
211
215
  }
216
+ type SceneStatelessBehavior = (sceneObject: SceneObject) => CancelActivationHandler | void;
212
217
 
213
218
  interface SceneObjectStateChangedPayload<TState extends SceneObjectState = SceneObjectState> {
214
219
  prevState: TState;
@@ -249,6 +254,10 @@ declare function interpolate(sceneObject: SceneObject, value: string | undefined
249
254
  * Checks if the variable is currently loading or waiting to update
250
255
  */
251
256
  declare function hasVariableDependencyInLoadingState(sceneObject: SceneObject): boolean;
257
+ /**
258
+ * This will search the full scene graph, starting with the scene node passed in, then walking up the parent chain. *
259
+ */
260
+ declare function findObject(scene: SceneObject, check: (obj: SceneObject) => boolean): SceneObject | null;
252
261
  declare const sceneGraph: {
253
262
  getVariables: typeof getVariables;
254
263
  getData: typeof getData;
@@ -257,6 +266,7 @@ declare const sceneGraph: {
257
266
  interpolate: typeof interpolate;
258
267
  lookupVariable: typeof lookupVariable;
259
268
  hasVariableDependencyInLoadingState: typeof hasVariableDependencyInLoadingState;
269
+ findObject: typeof findObject;
260
270
  };
261
271
 
262
272
  declare abstract class SceneObjectBase<TState extends SceneObjectState = SceneObjectState> implements SceneObject<TState> {
@@ -405,7 +415,6 @@ declare class VariableDependencyConfig<TState extends SceneObjectState> implemen
405
415
 
406
416
  interface QueryRunnerState extends SceneObjectState {
407
417
  data?: PanelData;
408
- dataPreTransforms?: PanelData;
409
418
  queries: DataQueryExtended[];
410
419
  datasource?: DataSourceRef;
411
420
  minInterval?: string;
@@ -435,6 +444,7 @@ declare class SceneQueryRunner extends SceneObjectBase<QueryRunnerState> impleme
435
444
  private getMaxDataPoints;
436
445
  private runWithTimeRange;
437
446
  private onDataReceived;
447
+ private _setNoDataState;
438
448
  }
439
449
 
440
450
  interface SceneDataTransformerState extends SceneDataState {
@@ -504,6 +514,10 @@ declare class SceneVariableSet extends SceneObjectBase<SceneVariableSetState> im
504
514
  * Subscribes to child variable value changes, and starts the variable value validation process
505
515
  */
506
516
  private _onActivate;
517
+ /**
518
+ * Add all variables that depend on the changed variable to the update queue
519
+ */
520
+ private _refreshTimeRangeBasedVariables;
507
521
  /**
508
522
  * Cancel all currently running updates
509
523
  */
@@ -518,7 +532,7 @@ declare class SceneVariableSet extends SceneObjectBase<SceneVariableSetState> im
518
532
  private _checkForVariablesThatChangedWhileInactive;
519
533
  private _variableNeedsUpdate;
520
534
  /**
521
- * This loops through variablesToUpdate and update all that that can.
535
+ * This loops through variablesToUpdate and update all that can.
522
536
  * If one has a dependency that is currently in variablesToUpdate it will be skipped for now.
523
537
  */
524
538
  private _updateNextBatch;
@@ -639,10 +653,8 @@ interface QueryVariableState extends MultiValueVariableState {
639
653
  sort: VariableSort;
640
654
  }
641
655
  declare class QueryVariable extends MultiValueVariable<QueryVariableState> {
642
- private updateSubscription?;
643
656
  protected _variableDependency: VariableDependencyConfig<QueryVariableState>;
644
657
  constructor(initialState: Partial<QueryVariableState>);
645
- private _onActivate;
646
658
  getValueOptions(args: VariableGetOptionsArgs): Observable<VariableValueOption[]>;
647
659
  private getRequest;
648
660
  static Component: ({ model }: SceneComponentProps<MultiValueVariable>) => JSX.Element;
@@ -652,6 +664,7 @@ interface TestVariableState extends MultiValueVariableState {
652
664
  query: string;
653
665
  delayMs?: number;
654
666
  issuedQuery?: string;
667
+ refresh?: VariableRefresh;
655
668
  }
656
669
  /**
657
670
  * This variable is only designed for unit tests and potentially e2e tests.
@@ -685,18 +698,11 @@ declare class TextBoxVariable extends SceneObjectBase<TextBoxVariableState> impl
685
698
  static Component: ({ model }: SceneComponentProps<TextBoxVariable>) => JSX.Element;
686
699
  }
687
700
 
688
- declare class UrlSyncManager {
689
- private sceneRoot;
690
- private urlKeyMapper;
691
- constructor(sceneRoot: SceneObject);
692
- /**
693
- * Updates the current scene state to match URL state.
694
- */
695
- initSync(): void;
696
- private _onLocationUpdate;
697
- private _onStateChanged;
698
- private _syncSceneStateFromUrl;
701
+ interface UrlSyncManagerLike {
702
+ initSync(root: SceneObject): void;
703
+ cleanUp(root: SceneObject): void;
699
704
  }
705
+ declare function getUrlSyncManager(): UrlSyncManagerLike;
700
706
 
701
707
  interface EmbeddedSceneState extends SceneObjectState {
702
708
  /**
@@ -710,11 +716,12 @@ interface EmbeddedSceneState extends SceneObjectState {
710
716
  }
711
717
  declare class EmbeddedScene extends SceneObjectBase<EmbeddedSceneState> {
712
718
  static Component: typeof EmbeddedSceneRenderer;
713
- private urlSyncManager?;
719
+ constructor(state: EmbeddedSceneState);
714
720
  /**
715
721
  * initUrlSync should be called before the scene is rendered to ensure that objects are in sync
716
722
  * before they get activated. This saves some unnecessary re-renders and makes sure variables
717
- * queries are issued as needed.
723
+ * queries are issued as needed. If your using SceneAppPage you will not need to call this as
724
+ * url sync is handled on the SceneAppPage level not this level.
718
725
  */
719
726
  initUrlSync(): void;
720
727
  }
@@ -857,9 +864,11 @@ declare class SceneRefreshPicker extends SceneObjectBase<SceneRefreshPickerState
857
864
  }
858
865
  declare function SceneRefreshPickerRenderer({ model }: SceneComponentProps<SceneRefreshPicker>): JSX.Element;
859
866
 
860
- interface SceneFlexItemLike extends SceneObject<SceneFlexItemState> {
867
+ interface SceneFlexItemStateLike extends SceneFlexItemPlacement, SceneObjectState {
861
868
  }
862
- interface SceneFlexLayoutState extends SceneObjectState {
869
+ interface SceneFlexItemLike extends SceneObject<SceneFlexItemStateLike> {
870
+ }
871
+ interface SceneFlexLayoutState extends SceneObjectState, SceneFlexItemPlacement {
863
872
  direction?: CSSProperties['flexDirection'];
864
873
  wrap?: CSSProperties['flexWrap'];
865
874
  children: SceneFlexItemLike[];
@@ -869,8 +878,8 @@ declare class SceneFlexLayout extends SceneObjectBase<SceneFlexLayoutState> impl
869
878
  toggleDirection(): void;
870
879
  isDraggable(): boolean;
871
880
  }
872
- declare function SceneFlexLayoutRenderer({ model }: SceneComponentProps<SceneFlexLayout>): JSX.Element;
873
- interface SceneFlexItemState extends SceneLayoutItemState {
881
+ declare function SceneFlexLayoutRenderer({ model, parentDirection }: SceneFlexItemRenderProps<SceneFlexLayout>): JSX.Element | null;
882
+ interface SceneFlexItemPlacement {
874
883
  flexGrow?: CSSProperties['flexGrow'];
875
884
  alignSelf?: CSSProperties['alignSelf'];
876
885
  width?: CSSProperties['width'];
@@ -881,11 +890,23 @@ interface SceneFlexItemState extends SceneLayoutItemState {
881
890
  maxHeight?: CSSProperties['maxHeight'];
882
891
  xSizing?: 'fill' | 'content';
883
892
  ySizing?: 'fill' | 'content';
893
+ /**
894
+ * True when the item should rendered but not visible.
895
+ * Useful for conditional display of layout items
896
+ */
897
+ isHidden?: boolean;
898
+ }
899
+ interface SceneFlexItemState extends SceneFlexItemPlacement, SceneObjectState {
900
+ body: SceneObject | undefined;
901
+ isHidden?: boolean;
902
+ }
903
+ interface SceneFlexItemRenderProps<T> extends SceneComponentProps<T> {
904
+ parentDirection?: CSSProperties['flexDirection'];
884
905
  }
885
906
  declare class SceneFlexItem extends SceneObjectBase<SceneFlexItemState> {
886
907
  static Component: typeof SceneFlexItemRenderer;
887
908
  }
888
- declare function SceneFlexItemRenderer({ model }: SceneComponentProps<SceneFlexItem>): JSX.Element | null;
909
+ declare function SceneFlexItemRenderer({ model, parentDirection }: SceneFlexItemRenderProps<SceneFlexItem>): JSX.Element | null;
889
910
 
890
911
  interface SceneByFrameRepeaterState extends SceneObjectState {
891
912
  body: SceneFlexLayout;
@@ -902,6 +923,8 @@ declare class SceneControlsSpacer extends SceneObjectBase<{}> {
902
923
  static Component: (_props: SceneComponentProps<SceneControlsSpacer>) => JSX.Element;
903
924
  }
904
925
 
926
+ declare function SceneGridLayoutRenderer({ model }: SceneComponentProps<SceneGridLayout>): JSX.Element;
927
+
905
928
  interface SceneGridItemPlacement {
906
929
  x?: number;
907
930
  y?: number;
@@ -938,6 +961,7 @@ interface SceneGridLayoutState extends SceneObjectState {
938
961
  * Turn on or off dragging for all items. Indiviadual items can still disabled via isDraggable property
939
962
  **/
940
963
  isDraggable?: boolean;
964
+ isLazy?: boolean;
941
965
  children: SceneGridItemLike[];
942
966
  }
943
967
  declare class SceneGridLayout extends SceneObjectBase<SceneGridLayoutState> implements SceneLayout {
@@ -971,8 +995,8 @@ declare class SceneGridLayout extends SceneObjectBase<SceneGridLayoutState> impl
971
995
  private toGridCell;
972
996
  buildGridLayout(width: number): ReactGridLayout.Layout[];
973
997
  }
974
- declare function SceneGridLayoutRenderer({ model }: SceneComponentProps<SceneGridLayout>): JSX.Element;
975
- interface SceneGridItemState extends SceneGridItemStateLike, SceneLayoutItemState {
998
+ interface SceneGridItemState extends SceneGridItemStateLike {
999
+ body: SceneObject | undefined;
976
1000
  }
977
1001
  declare class SceneGridItem extends SceneObjectBase<SceneGridItemState> implements SceneGridItemLike {
978
1002
  static Component: typeof SceneGridItemRenderer;
@@ -1006,16 +1030,35 @@ interface SceneAppPageState extends SceneObjectState {
1006
1030
  titleIcon?: IconName$1;
1007
1031
  url: string;
1008
1032
  routePath?: string;
1033
+ /** Shown in the top right inline with the page title */
1034
+ controls?: SceneObject[];
1009
1035
  hideFromBreadcrumbs?: boolean;
1010
1036
  tabs?: SceneAppPageLike[];
1011
- getScene: (routeMatch: SceneRouteMatch) => EmbeddedScene;
1037
+ getScene?: (routeMatch: SceneRouteMatch) => EmbeddedScene;
1012
1038
  drilldowns?: SceneAppDrilldownView[];
1013
1039
  getParentPage?: () => SceneAppPageLike;
1014
1040
  preserveUrlKeys?: string[];
1041
+ /**
1042
+ * The current initialized scene, this is set by the framework after scene url initialization
1043
+ **/
1044
+ initializedScene?: SceneObject;
1045
+ }
1046
+ interface SceneAppPageLike extends SceneObject<SceneAppPageState> {
1047
+ initializeScene(scene: SceneObject): void;
1048
+ /**
1049
+ * @internal. Please don't call this from plugin code.
1050
+ * Will call the state.getScene function with the current routeMatch and will cache the resulting Scene using the routeMatch.url as key.
1051
+ */
1052
+ getScene(routeMatch: SceneRouteMatch): EmbeddedScene;
1053
+ /**
1054
+ * @internal. Please don't call this from plugin code.
1055
+ * Get drilldown scene. Will call the drilldown.getPage function with the current routeMatch and will cache the resulting page using the routeMatch.url as key.
1056
+ */
1057
+ getDrilldownPage(drilldown: SceneAppDrilldownView, routeMatch: SceneRouteMatch): SceneAppPageLike;
1015
1058
  }
1016
- type SceneAppPageLike = SceneObject<SceneAppPageState>;
1017
1059
  interface SceneAppDrilldownView {
1018
1060
  routePath: string;
1061
+ defaultRoute?: boolean;
1019
1062
  getPage: (routeMatch: SceneRouteMatch<any>, parent: SceneAppPageLike) => SceneAppPageLike;
1020
1063
  }
1021
1064
 
@@ -1029,10 +1072,19 @@ declare class SceneApp extends SceneObjectBase<SceneAppState> {
1029
1072
  /**
1030
1073
  * Responsible for page's drilldown & tabs routing
1031
1074
  */
1032
- declare class SceneAppPage extends SceneObjectBase<SceneAppPageState> {
1075
+ declare class SceneAppPage extends SceneObjectBase<SceneAppPageState> implements SceneAppPageLike {
1033
1076
  static Component: typeof SceneAppPageRenderer;
1077
+ private _sceneCache;
1078
+ private _drilldownCache;
1079
+ constructor(state: SceneAppPageState);
1080
+ initializeScene(scene: EmbeddedScene): void;
1081
+ getScene(routeMatch: SceneRouteMatch): EmbeddedScene;
1082
+ getDrilldownPage(drilldown: SceneAppDrilldownView, routeMatch: SceneRouteMatch<{}>): SceneAppPageLike;
1083
+ }
1084
+ interface SceneAppPageRendererProps extends SceneComponentProps<SceneAppPage> {
1085
+ routeProps: RouteComponentProps;
1034
1086
  }
1035
- declare function SceneAppPageRenderer({ model }: SceneComponentProps<SceneAppPage>): JSX.Element;
1087
+ declare function SceneAppPageRenderer({ model, routeProps }: SceneAppPageRendererProps): JSX.Element;
1036
1088
 
1037
1089
  interface SceneReactObjectState<TProps = {}> extends SceneObjectState {
1038
1090
  /**
@@ -1055,4 +1107,4 @@ declare class SceneReactObject extends SceneObjectBase<SceneReactObjectState> {
1055
1107
  static Component: ({ model }: SceneComponentProps<SceneReactObject>) => {} | null;
1056
1108
  }
1057
1109
 
1058
- export { CancelActivationHandler, ConstantVariable, CustomFormatterVariable, CustomTransformOperator, CustomVariable, CustomVariableValue, DataSourceVariable, DeepPartial, EmbeddedScene, EmbeddedSceneState, FormatVariable, InterpolationFormatParameter, NestedScene, QueryRunnerState, QueryVariable, SceneActivationHandler, SceneApp, SceneAppDrilldownView, SceneAppPage, SceneAppPageLike, SceneAppPageState, SceneAppRoute, SceneByFrameRepeater, SceneCanvasText, SceneComponent, SceneComponentProps, SceneControlsSpacer, SceneDataNode, SceneDataProvider, SceneDataState, SceneDataTransformer, SceneDeactivationHandler, SceneFlexItem, SceneFlexLayout, SceneGridItem, SceneGridLayout, SceneGridRow, SceneLayout, SceneLayoutChildOptions, SceneLayoutItemState, SceneLayoutState, SceneObject, SceneObjectBase, SceneObjectRef, SceneObjectState, SceneObjectStateChangedEvent, SceneObjectStateChangedPayload, SceneObjectUrlSyncConfig, SceneObjectUrlSyncHandler, SceneObjectUrlValue, SceneObjectUrlValues, SceneObjectWithUrlSync, SceneQueryRunner, SceneReactObject, SceneRefreshPicker, SceneRouteMatch, SceneStateChangedHandler, SceneTimePicker, SceneTimeRange, SceneTimeRangeLike, SceneTimeRangeState, SceneToolbarButton, SceneToolbarInput, SceneVariable, SceneVariableDependencyConfigLike, SceneVariableSet, SceneVariableSetState, SceneVariableState, SceneVariableValueChangedEvent, SceneVariables, TestVariable, TextBoxVariable, UrlSyncManager, ValidateAndUpdateResult, VariableCustomFormatterFn, VariableDependencyConfig, VariableValue, VariableValueOption, VariableValueSelectors, VariableValueSingle, VizPanel, VizPanelMenu, VizPanelState, formatRegistry, isCustomVariableValue, isSceneObject, sceneGraph };
1110
+ export { CancelActivationHandler, ConstantVariable, CustomFormatterVariable, CustomTransformOperator, CustomVariable, CustomVariableValue, DataSourceVariable, DeepPartial, EmbeddedScene, EmbeddedSceneState, FormatVariable, InterpolationFormatParameter, NestedScene, QueryRunnerState, QueryVariable, SceneActivationHandler, SceneApp, SceneAppDrilldownView, SceneAppPage, SceneAppPageLike, SceneAppPageState, SceneAppRoute, SceneByFrameRepeater, SceneCanvasText, SceneComponent, SceneComponentProps, SceneControlsSpacer, SceneDataNode, SceneDataProvider, SceneDataState, SceneDataTransformer, SceneDeactivationHandler, SceneFlexItem, SceneFlexLayout, SceneGridItem, SceneGridLayout, SceneGridRow, SceneLayout, SceneLayoutChildOptions, SceneLayoutState, SceneObject, SceneObjectBase, SceneObjectRef, SceneObjectState, SceneObjectStateChangedEvent, SceneObjectStateChangedPayload, SceneObjectUrlSyncConfig, SceneObjectUrlSyncHandler, SceneObjectUrlValue, SceneObjectUrlValues, SceneObjectWithUrlSync, SceneQueryRunner, SceneReactObject, SceneRefreshPicker, SceneRouteMatch, SceneStateChangedHandler, SceneStatelessBehavior, SceneTimePicker, SceneTimeRange, SceneTimeRangeLike, SceneTimeRangeState, SceneToolbarButton, SceneToolbarInput, SceneVariable, SceneVariableDependencyConfigLike, SceneVariableSet, SceneVariableSetState, SceneVariableState, SceneVariableValueChangedEvent, SceneVariables, TestVariable, TextBoxVariable, UrlSyncManagerLike as UrlSyncManager, ValidateAndUpdateResult, VariableCustomFormatterFn, VariableDependencyConfig, VariableValue, VariableValueOption, VariableValueSelectors, VariableValueSingle, VizPanel, VizPanelMenu, VizPanelState, formatRegistry, getUrlSyncManager, isCustomVariableValue, isSceneObject, sceneGraph };