@grafana/scenes 0.0.7 → 0.0.9

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/index.d.ts CHANGED
@@ -623,14 +623,17 @@ declare class UrlSyncManager {
623
623
  private syncSceneStateFromUrl;
624
624
  }
625
625
 
626
- interface SceneState extends SceneObjectStatePlain {
627
- title: string;
626
+ interface EmbeddedSceneState extends SceneObjectStatePlain {
627
+ /**
628
+ * The main content of the scene (usually a SceneFlexLayout)
629
+ */
628
630
  body: SceneObject;
629
- actions?: SceneObject[];
630
- subMenu?: SceneObject;
631
- isEditing?: boolean;
631
+ /**
632
+ * Top row of variable selectors, filters, time pickers and custom actions.
633
+ */
634
+ controls?: SceneObject[];
632
635
  }
633
- declare class EmbeddedScene extends SceneObjectBase<SceneState> {
636
+ declare class EmbeddedScene extends SceneObjectBase<EmbeddedSceneState> {
634
637
  static Component: typeof EmbeddedSceneRenderer;
635
638
  private urlSyncManager?;
636
639
  activate(): void;
@@ -653,7 +656,7 @@ interface VizPanelState<TOptions = {}, TFieldConfig = {}> extends SceneLayoutChi
653
656
  }
654
657
  declare class VizPanel<TOptions = {}, TFieldConfig = {}> extends SceneObjectBase<VizPanelState<TOptions, TFieldConfig>> {
655
658
  static Component: typeof VizPanelRenderer;
656
- static Editor: typeof VizPanelEditor;
659
+ protected _variableDependency: VariableDependencyConfig<VizPanelState<TOptions, TFieldConfig>>;
657
660
  private _plugin?;
658
661
  constructor(state: Partial<VizPanelState<TOptions, TFieldConfig>>);
659
662
  activate(): void;
@@ -664,7 +667,6 @@ declare class VizPanel<TOptions = {}, TFieldConfig = {}> extends SceneObjectBase
664
667
  onOptionsChange: (options: TOptions) => void;
665
668
  onFieldConfigChange: (fieldConfig: FieldConfigSource<TFieldConfig>) => void;
666
669
  }
667
- declare function VizPanelEditor({ model }: SceneComponentProps<VizPanel>): JSX.Element;
668
670
 
669
671
  interface NestedSceneState extends SceneLayoutChildState {
670
672
  title: string;
@@ -674,6 +676,10 @@ interface NestedSceneState extends SceneLayoutChildState {
674
676
  body: SceneLayout;
675
677
  actions?: SceneObject[];
676
678
  }
679
+ /**
680
+ * @internal
681
+ * POC status, don't use this yet
682
+ */
677
683
  declare class NestedScene extends SceneObjectBase<NestedSceneState> {
678
684
  static Component: typeof NestedSceneRenderer;
679
685
  onToggle: () => void;
@@ -711,6 +717,7 @@ declare class SceneToolbarInput extends SceneObjectBase<SceneToolbarInputState>
711
717
 
712
718
  interface SceneTimePickerState extends SceneObjectStatePlain {
713
719
  hidePicker?: boolean;
720
+ isOnCanvas?: boolean;
714
721
  }
715
722
  declare class SceneTimePicker extends SceneObjectBase<SceneTimePickerState> {
716
723
  static Component: typeof SceneTimePickerRenderer;
@@ -727,12 +734,10 @@ declare class SceneByFrameRepeater extends SceneObjectBase<RepeatOptions> {
727
734
  static Component: ({ model, isEditing }: SceneComponentProps<SceneByFrameRepeater>) => JSX.Element;
728
735
  }
729
736
 
730
- interface SceneSubMenuState extends SceneLayoutState {
731
- }
732
- declare class SceneSubMenu extends SceneObjectBase<SceneSubMenuState> {
733
- static Component: typeof SceneSubMenuRenderer;
737
+ declare class SceneControlsSpacer extends SceneObjectBase<{}> {
738
+ constructor();
739
+ static Component: (_props: SceneComponentProps<SceneControlsSpacer>) => JSX.Element;
734
740
  }
735
- declare function SceneSubMenuRenderer({ model }: SceneComponentProps<SceneSubMenu>): JSX.Element;
736
741
 
737
742
  type FlexLayoutDirection = 'column' | 'row';
738
743
  interface SceneFlexLayoutState extends SceneLayoutState {
@@ -793,4 +798,4 @@ declare class SceneGridLayout extends SceneObjectBase<SceneGridLayoutState> {
793
798
  }
794
799
  declare function SceneGridLayoutRenderer({ model }: SceneComponentProps<SceneGridLayout>): JSX.Element;
795
800
 
796
- export { ConstantVariable, CustomFormatterFn, CustomVariable, DataSourceVariable, DeepPartial, EmbeddedScene, FormatRegistryID, FormatVariable, NestedScene, QueryRunnerState, QueryVariable, SceneByFrameRepeater, SceneCanvasText, SceneComponent, SceneComponentProps, SceneDataNode, SceneDataState, SceneDataTransformer, SceneEditor, SceneEditorState, SceneFlexLayout, SceneGridLayout, SceneGridRow, SceneLayout, SceneLayoutChild, SceneLayoutChildOptions, SceneLayoutChildState, SceneLayoutState, SceneObject, SceneObjectBase, SceneObjectRef, SceneObjectState, SceneObjectStateChangedEvent, SceneObjectStateChangedPayload, SceneObjectStatePlain, SceneObjectUrlSyncConfig, SceneObjectUrlSyncHandler, SceneObjectUrlValue, SceneObjectUrlValues, SceneObjectWithUrlSync, SceneQueryRunner, SceneState, SceneSubMenu, SceneTimePicker, SceneTimeRange, SceneTimeRangeLike, SceneTimeRangeState, SceneToolbarButton, SceneToolbarInput, SceneVariable, SceneVariableDependencyConfigLike, SceneVariableSet, SceneVariableSetState, SceneVariableState, SceneVariableValueChangedEvent, SceneVariables, TestVariable, UrlSyncManager, ValidateAndUpdateResult, VariableValue, VariableValueCustom, VariableValueOption, VariableValueSelectors, VariableValueSingle, VizPanel, VizPanelState, formatRegistry, isSceneObject, sceneGraph };
801
+ export { ConstantVariable, CustomFormatterFn, CustomVariable, DataSourceVariable, DeepPartial, EmbeddedScene, EmbeddedSceneState, FormatRegistryID, FormatVariable, NestedScene, QueryRunnerState, QueryVariable, SceneByFrameRepeater, SceneCanvasText, SceneComponent, SceneComponentProps, SceneControlsSpacer, SceneDataNode, SceneDataState, SceneDataTransformer, SceneEditor, SceneEditorState, SceneFlexLayout, SceneGridLayout, SceneGridRow, SceneLayout, SceneLayoutChild, SceneLayoutChildOptions, SceneLayoutChildState, SceneLayoutState, SceneObject, SceneObjectBase, SceneObjectRef, SceneObjectState, SceneObjectStateChangedEvent, SceneObjectStateChangedPayload, SceneObjectStatePlain, SceneObjectUrlSyncConfig, SceneObjectUrlSyncHandler, SceneObjectUrlValue, SceneObjectUrlValues, SceneObjectWithUrlSync, SceneQueryRunner, SceneTimePicker, SceneTimeRange, SceneTimeRangeLike, SceneTimeRangeState, SceneToolbarButton, SceneToolbarInput, SceneVariable, SceneVariableDependencyConfigLike, SceneVariableSet, SceneVariableSetState, SceneVariableState, SceneVariableValueChangedEvent, SceneVariables, TestVariable, UrlSyncManager, ValidateAndUpdateResult, VariableDependencyConfig, VariableValue, VariableValueCustom, VariableValueOption, VariableValueSelectors, VariableValueSingle, VizPanel, VizPanelState, formatRegistry, isSceneObject, sceneGraph };
package/dist/index.js CHANGED
@@ -10,8 +10,8 @@ var ui = require('@grafana/ui');
10
10
  var lodash = require('lodash');
11
11
  var runtime = require('@grafana/runtime');
12
12
  var e2eSelectors = require('@grafana/e2e-selectors');
13
- var reactUse = require('react-use');
14
13
  var css = require('@emotion/css');
14
+ var reactUse = require('react-use');
15
15
  var experimental = require('@grafana/experimental');
16
16
  var ReactGridLayout = require('react-grid-layout');
17
17
  var AutoSizer = require('react-virtualized-auto-sizer');
@@ -451,10 +451,12 @@ class SceneVariableSet extends SceneObjectBase {
451
451
  deactivate() {
452
452
  var _a;
453
453
  super.deactivate();
454
- this.variablesToUpdate.clear();
455
454
  for (const update of this.updating.values()) {
456
455
  (_a = update.subscription) == null ? void 0 : _a.unsubscribe();
457
456
  }
457
+ this.variablesToUpdate.clear();
458
+ this.updating.clear();
459
+ this.variablesThatHaveChanged.clear();
458
460
  }
459
461
  updateNextBatch() {
460
462
  if (this.variablesToUpdate.size === 0 && this.variablesThatHaveChanged.size > 0) {
@@ -811,6 +813,9 @@ const formatRegistry = new data.Registry(() => {
811
813
  case "iso":
812
814
  return data.dateTime(nrValue).toISOString();
813
815
  default:
816
+ if ((args || []).length > 1) {
817
+ return data.dateTime(nrValue).format(args.join(":"));
818
+ }
814
819
  return data.dateTime(nrValue).format(arg);
815
820
  }
816
821
  }
@@ -869,13 +874,10 @@ function formatQueryParameter(name, value) {
869
874
  return `var-${name}=${encodeURIComponentStrict(value)}`;
870
875
  }
871
876
 
872
- function sceneInterpolator(sceneObject, target, getVariables, scopedVars, format) {
877
+ function sceneInterpolator(sceneObject, target, scopedVars, format) {
873
878
  if (!target) {
874
879
  return target != null ? target : "";
875
880
  }
876
- if (getVariables(sceneObject) === EmptyVariableSet) {
877
- return target;
878
- }
879
881
  VARIABLE_REGEX.lastIndex = 0;
880
882
  return target.replace(VARIABLE_REGEX, (match, var1, var2, fmt2, var3, fieldPath, fmt3) => {
881
883
  const variableName = var1 || var2 || var3;
@@ -994,10 +996,10 @@ function getLayout(scene) {
994
996
  throw new Error("No layout found in scene tree");
995
997
  }
996
998
  function interpolate(sceneObject, value, scopedVars, format) {
997
- if (!value || !sceneObject.variableDependency || sceneObject.variableDependency.getNames().size === 0) {
998
- return value != null ? value : "";
999
+ if (value === "" || value == null) {
1000
+ return "";
999
1001
  }
1000
- return sceneInterpolator(sceneObject, value, getVariables, scopedVars, format);
1002
+ return sceneInterpolator(sceneObject, value, scopedVars, format);
1001
1003
  }
1002
1004
  const sceneGraph = {
1003
1005
  getVariables,
@@ -2382,24 +2384,41 @@ class EmbeddedScene extends SceneObjectBase {
2382
2384
  }
2383
2385
  EmbeddedScene.Component = EmbeddedSceneRenderer;
2384
2386
  function EmbeddedSceneRenderer({ model }) {
2385
- const { body, isEditing, subMenu } = model.useState();
2387
+ const { body, controls } = model.useState();
2388
+ const styles = ui.useStyles2(getStyles$1);
2386
2389
  return /* @__PURE__ */ React__default["default"].createElement("div", {
2387
- style: {
2390
+ className: styles.container
2391
+ }, controls && /* @__PURE__ */ React__default["default"].createElement("div", {
2392
+ className: styles.controls
2393
+ }, controls.map((control) => /* @__PURE__ */ React__default["default"].createElement(control.Component, {
2394
+ key: control.state.key,
2395
+ model: control
2396
+ }))), /* @__PURE__ */ React__default["default"].createElement("div", {
2397
+ className: styles.body
2398
+ }, /* @__PURE__ */ React__default["default"].createElement(body.Component, {
2399
+ model: body
2400
+ })));
2401
+ }
2402
+ function getStyles$1(theme) {
2403
+ return {
2404
+ container: css.css({
2388
2405
  flexGrow: 1,
2389
2406
  display: "flex",
2390
2407
  gap: "8px",
2391
- overflow: "auto",
2392
2408
  minHeight: "100%",
2393
2409
  flexDirection: "column"
2394
- }
2395
- }, subMenu && /* @__PURE__ */ React__default["default"].createElement(subMenu.Component, {
2396
- model: subMenu
2397
- }), /* @__PURE__ */ React__default["default"].createElement("div", {
2398
- style: { flexGrow: 1, display: "flex", gap: "8px", overflow: "auto" }
2399
- }, /* @__PURE__ */ React__default["default"].createElement(body.Component, {
2400
- model: body,
2401
- isEditing
2402
- })));
2410
+ }),
2411
+ body: css.css({
2412
+ flexGrow: 1,
2413
+ display: "flex",
2414
+ gap: "8px"
2415
+ }),
2416
+ controls: css.css({
2417
+ display: "flex",
2418
+ gap: theme.spacing(1),
2419
+ alignItems: "center"
2420
+ })
2421
+ };
2403
2422
  }
2404
2423
 
2405
2424
  function SceneDragHandle({ layoutKey, className }) {
@@ -2504,6 +2523,9 @@ class VizPanel extends SceneObjectBase {
2504
2523
  title: "Title",
2505
2524
  pluginId: "timeseries"
2506
2525
  }, state));
2526
+ this._variableDependency = new VariableDependencyConfig(this, {
2527
+ statePaths: ["title", "options", "fieldConfig"]
2528
+ });
2507
2529
  this.onChangeTimeRange = (timeRange) => {
2508
2530
  const sceneTimeRange = sceneGraph.getTimeRange(this);
2509
2531
  sceneTimeRange.onTimeRangeChange({
@@ -2564,16 +2586,6 @@ class VizPanel extends SceneObjectBase {
2564
2586
  }
2565
2587
  }
2566
2588
  VizPanel.Component = VizPanelRenderer;
2567
- VizPanel.Editor = VizPanelEditor;
2568
- function VizPanelEditor({ model }) {
2569
- const { title } = model.useState();
2570
- return /* @__PURE__ */ React__default["default"].createElement(ui.Field, {
2571
- label: "Title"
2572
- }, /* @__PURE__ */ React__default["default"].createElement(ui.Input, {
2573
- defaultValue: title,
2574
- onBlur: (evt) => model.setState({ title: evt.currentTarget.value })
2575
- }));
2576
- }
2577
2589
 
2578
2590
  var __defProp$2 = Object.defineProperty;
2579
2591
  var __defProps$2 = Object.defineProperties;
@@ -2745,7 +2757,7 @@ class SceneTimePicker extends SceneObjectBase {
2745
2757
  }
2746
2758
  SceneTimePicker.Component = SceneTimePickerRenderer;
2747
2759
  function SceneTimePickerRenderer({ model }) {
2748
- const { hidePicker } = model.useState();
2760
+ const { hidePicker, isOnCanvas } = model.useState();
2749
2761
  const timeRange = sceneGraph.getTimeRange(model);
2750
2762
  const timeRangeState = timeRange.useState();
2751
2763
  if (hidePicker) {
@@ -2754,6 +2766,7 @@ function SceneTimePickerRenderer({ model }) {
2754
2766
  return /* @__PURE__ */ React__default["default"].createElement(ui.ToolbarButtonRow, {
2755
2767
  alignment: "right"
2756
2768
  }, /* @__PURE__ */ React__default["default"].createElement(ui.TimeRangePicker, {
2769
+ isOnCanvas,
2757
2770
  value: timeRangeState.value,
2758
2771
  onChange: timeRange.onTimeRangeChange,
2759
2772
  timeZone: "browser",
@@ -2805,18 +2818,16 @@ SceneByFrameRepeater.Component = ({ model, isEditing }) => {
2805
2818
  });
2806
2819
  };
2807
2820
 
2808
- class SceneSubMenu extends SceneObjectBase {
2821
+ class SceneControlsSpacer extends SceneObjectBase {
2822
+ constructor() {
2823
+ super({});
2824
+ }
2809
2825
  }
2810
- SceneSubMenu.Component = SceneSubMenuRenderer;
2811
- function SceneSubMenuRenderer({ model }) {
2812
- const { children } = model.useState();
2826
+ SceneControlsSpacer.Component = (_props) => {
2813
2827
  return /* @__PURE__ */ React__default["default"].createElement("div", {
2814
- style: { display: "flex", gap: "16px" }
2815
- }, children.map((child) => /* @__PURE__ */ React__default["default"].createElement(child.Component, {
2816
- key: child.state.key,
2817
- model: child
2818
- })));
2819
- }
2828
+ style: { flexGrow: 1 }
2829
+ });
2830
+ };
2820
2831
 
2821
2832
  class SceneFlexLayout extends SceneObjectBase {
2822
2833
  toggleDirection() {
@@ -3305,6 +3316,7 @@ exports.NestedScene = NestedScene;
3305
3316
  exports.QueryVariable = QueryVariable;
3306
3317
  exports.SceneByFrameRepeater = SceneByFrameRepeater;
3307
3318
  exports.SceneCanvasText = SceneCanvasText;
3319
+ exports.SceneControlsSpacer = SceneControlsSpacer;
3308
3320
  exports.SceneDataNode = SceneDataNode;
3309
3321
  exports.SceneDataTransformer = SceneDataTransformer;
3310
3322
  exports.SceneFlexLayout = SceneFlexLayout;
@@ -3314,7 +3326,6 @@ exports.SceneObjectBase = SceneObjectBase;
3314
3326
  exports.SceneObjectStateChangedEvent = SceneObjectStateChangedEvent;
3315
3327
  exports.SceneObjectUrlSyncConfig = SceneObjectUrlSyncConfig;
3316
3328
  exports.SceneQueryRunner = SceneQueryRunner;
3317
- exports.SceneSubMenu = SceneSubMenu;
3318
3329
  exports.SceneTimePicker = SceneTimePicker;
3319
3330
  exports.SceneTimeRange = SceneTimeRange;
3320
3331
  exports.SceneToolbarButton = SceneToolbarButton;
@@ -3323,6 +3334,7 @@ exports.SceneVariableSet = SceneVariableSet;
3323
3334
  exports.SceneVariableValueChangedEvent = SceneVariableValueChangedEvent;
3324
3335
  exports.TestVariable = TestVariable;
3325
3336
  exports.UrlSyncManager = UrlSyncManager;
3337
+ exports.VariableDependencyConfig = VariableDependencyConfig;
3326
3338
  exports.VariableValueSelectors = VariableValueSelectors;
3327
3339
  exports.VizPanel = VizPanel;
3328
3340
  exports.formatRegistry = formatRegistry;