@grafana/scenes 4.19.0 → 4.20.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/index.d.ts CHANGED
@@ -927,6 +927,7 @@ type getTagKeysProvider = (set: GroupByVariable, currentKey: string | null) => P
927
927
  declare class GroupByVariable extends MultiValueVariable<GroupByVariableState> {
928
928
  static Component: typeof GroupByVariableRenderer;
929
929
  isLazy: boolean;
930
+ protected _urlSync: SceneObjectUrlSyncHandler;
930
931
  validateAndUpdate(): Observable<ValidateAndUpdateResult>;
931
932
  private _updateValueGivenNewOptions;
932
933
  getValueOptions(args: VariableGetOptionsArgs): Observable<VariableValueOption[]>;
@@ -1130,7 +1131,7 @@ declare class LiveNowTimer extends SceneObjectBase<LiveNowTimerState> {
1130
1131
  private timerId;
1131
1132
  private static REFRESH_RATE;
1132
1133
  constructor({ enabled }: {
1133
- enabled?: boolean;
1134
+ enabled?: boolean | undefined;
1134
1135
  });
1135
1136
  private _activationHandler;
1136
1137
  enable(): void;
@@ -1225,18 +1226,18 @@ declare class AnnotationsDataLayer extends SceneDataLayerBase<AnnotationsDataLay
1225
1226
  protected processEvents(query: AnnotationQuery, events: AnnotationQueryResults): {
1226
1227
  state: LoadingState;
1227
1228
  series: _grafana_data.DataFrame[];
1228
- structureRev?: number;
1229
- annotations?: _grafana_data.DataFrame[];
1230
- alertState?: _grafana_data.AlertStateInfo;
1231
- request?: _grafana_data.DataQueryRequest<_grafana_data.DataQuery>;
1232
- timings?: _grafana_data.DataQueryTimings;
1233
- errors?: _grafana_data.DataQueryError[];
1234
- error?: _grafana_data.DataQueryError;
1229
+ structureRev?: number | undefined;
1230
+ annotations?: _grafana_data.DataFrame[] | undefined;
1231
+ alertState?: _grafana_data.AlertStateInfo | undefined;
1232
+ request?: _grafana_data.DataQueryRequest<_grafana_data.DataQuery> | undefined;
1233
+ timings?: _grafana_data.DataQueryTimings | undefined;
1234
+ errors?: _grafana_data.DataQueryError[] | undefined;
1235
+ error?: _grafana_data.DataQueryError | undefined;
1235
1236
  timeRange: _grafana_data.TimeRange;
1236
- traceIds?: string[];
1237
+ traceIds?: string[] | undefined;
1237
1238
  };
1238
1239
  }
1239
- declare function AnnotationsDataLayerRenderer({ model }: SceneComponentProps<AnnotationsDataLayer>): React__default.JSX.Element;
1240
+ declare function AnnotationsDataLayerRenderer({ model }: SceneComponentProps<AnnotationsDataLayer>): React__default.JSX.Element | null;
1240
1241
 
1241
1242
  type index_AnnotationsDataLayer = AnnotationsDataLayer;
1242
1243
  declare const index_AnnotationsDataLayer: typeof AnnotationsDataLayer;
@@ -1343,7 +1344,7 @@ declare class SceneDataLayerControls extends SceneObjectBase<SceneDataLayerContr
1343
1344
  static Component: typeof SceneDataLayerControlsRenderer;
1344
1345
  constructor();
1345
1346
  }
1346
- declare function SceneDataLayerControlsRenderer({ model }: SceneComponentProps<SceneDataLayerControls>): React__default.JSX.Element;
1347
+ declare function SceneDataLayerControlsRenderer({ model }: SceneComponentProps<SceneDataLayerControls>): React__default.JSX.Element | null;
1347
1348
 
1348
1349
  interface SceneDataTransformerState extends SceneDataState {
1349
1350
  /**
@@ -1401,7 +1402,7 @@ interface VariableValueControlState extends SceneObjectState {
1401
1402
  declare class VariableValueControl extends SceneObjectBase<VariableValueControlState> {
1402
1403
  static Component: typeof VariableValueControlRenderer;
1403
1404
  }
1404
- declare function VariableValueControlRenderer({ model }: SceneComponentProps<VariableValueControl>): React__default.JSX.Element;
1405
+ declare function VariableValueControlRenderer({ model }: SceneComponentProps<VariableValueControl>): React__default.JSX.Element | null;
1405
1406
 
1406
1407
  declare class SceneVariableSet extends SceneObjectBase<SceneVariableSetState> implements SceneVariables {
1407
1408
  /** Variables that have changed in since the activation or since the first manual value change */
@@ -1737,7 +1738,7 @@ declare class SceneTimePicker extends SceneObjectBase<SceneTimePickerState> {
1737
1738
  onMoveBackward: () => void;
1738
1739
  onMoveForward: () => void;
1739
1740
  }
1740
- declare function SceneTimePickerRenderer({ model }: SceneComponentProps<SceneTimePicker>): React__default.JSX.Element;
1741
+ declare function SceneTimePickerRenderer({ model }: SceneComponentProps<SceneTimePicker>): React__default.JSX.Element | null;
1741
1742
 
1742
1743
  interface SceneRefreshPickerState extends SceneObjectState {
1743
1744
  refresh: string;
@@ -1834,7 +1835,7 @@ declare class SceneFlexLayout extends SceneObjectBase<SceneFlexLayoutState> impl
1834
1835
  toggleDirection(): void;
1835
1836
  isDraggable(): boolean;
1836
1837
  }
1837
- declare function SceneFlexLayoutRenderer({ model, parentState }: SceneFlexItemRenderProps$1<SceneFlexLayout>): React__default.JSX.Element;
1838
+ declare function SceneFlexLayoutRenderer({ model, parentState }: SceneFlexItemRenderProps$1<SceneFlexLayout>): React__default.JSX.Element | null;
1838
1839
  interface SceneFlexItemPlacement {
1839
1840
  wrap?: CSSProperties['flexWrap'];
1840
1841
  direction?: CSSProperties['flexDirection'];
@@ -1866,7 +1867,7 @@ interface SceneFlexItemRenderProps$1<T> extends SceneComponentProps<T> {
1866
1867
  declare class SceneFlexItem extends SceneObjectBase<SceneFlexItemState> {
1867
1868
  static Component: typeof SceneFlexItemRenderer;
1868
1869
  }
1869
- declare function SceneFlexItemRenderer({ model, parentState }: SceneFlexItemRenderProps$1<SceneFlexItem>): React__default.JSX.Element;
1870
+ declare function SceneFlexItemRenderer({ model, parentState }: SceneFlexItemRenderProps$1<SceneFlexItem>): React__default.JSX.Element | null;
1870
1871
 
1871
1872
  interface SceneCSSGridLayoutState extends SceneObjectState, SceneCSSGridLayoutOptions {
1872
1873
  children: Array<SceneCSSGridItem | SceneObject>;
@@ -1910,7 +1911,7 @@ declare class SceneCSSGridLayout extends SceneObjectBase<SceneCSSGridLayoutState
1910
1911
  constructor(state: Partial<SceneCSSGridLayoutState>);
1911
1912
  isDraggable(): boolean;
1912
1913
  }
1913
- declare function SceneCSSGridLayoutRenderer({ model }: SceneCSSGridItemRenderProps<SceneCSSGridLayout>): React__default.JSX.Element;
1914
+ declare function SceneCSSGridLayoutRenderer({ model }: SceneCSSGridItemRenderProps<SceneCSSGridLayout>): React__default.JSX.Element | null;
1914
1915
  interface SceneCSSGridItemPlacement {
1915
1916
  /**
1916
1917
  * True when the item should rendered but not visible.
@@ -1932,7 +1933,7 @@ interface SceneCSSGridItemRenderProps<T> extends SceneComponentProps<T> {
1932
1933
  declare class SceneCSSGridItem extends SceneObjectBase<SceneCSSGridItemState> {
1933
1934
  static Component: typeof SceneCSSGridItemRenderer;
1934
1935
  }
1935
- declare function SceneCSSGridItemRenderer({ model, parentState }: SceneCSSGridItemRenderProps<SceneCSSGridItem>): React__default.JSX.Element;
1936
+ declare function SceneCSSGridItemRenderer({ model, parentState }: SceneCSSGridItemRenderProps<SceneCSSGridItem>): React__default.JSX.Element | null;
1936
1937
 
1937
1938
  declare function SceneGridLayoutRenderer({ model }: SceneComponentProps<SceneGridLayout>): React__default.JSX.Element;
1938
1939
 
@@ -2029,9 +2030,9 @@ interface SceneGridItemState extends SceneGridItemStateLike {
2029
2030
  declare class SceneGridItem extends SceneObjectBase<SceneGridItemState> implements SceneGridItemLike {
2030
2031
  static Component: typeof SceneGridItemRenderer;
2031
2032
  }
2032
- declare function SceneGridItemRenderer({ model }: SceneComponentProps<SceneGridItem>): React__default.JSX.Element;
2033
+ declare function SceneGridItemRenderer({ model }: SceneComponentProps<SceneGridItem>): React__default.JSX.Element | null;
2033
2034
 
2034
- declare function SplitLayoutRenderer({ model }: SceneFlexItemRenderProps<SplitLayout>): React__default.JSX.Element;
2035
+ declare function SplitLayoutRenderer({ model }: SceneFlexItemRenderProps<SplitLayout>): React__default.JSX.Element | null;
2035
2036
  interface SceneFlexItemRenderProps<T> extends SceneComponentProps<T> {
2036
2037
  parentState?: SceneFlexItemPlacement;
2037
2038
  }
@@ -2149,7 +2150,7 @@ declare class SceneAppPage extends SceneObjectBase<SceneAppPageState> implements
2149
2150
  initializeScene(scene: EmbeddedScene): void;
2150
2151
  getScene(routeMatch: SceneRouteMatch): EmbeddedScene;
2151
2152
  getDrilldownPage(drilldown: SceneAppDrilldownView, routeMatch: SceneRouteMatch<{}>): SceneAppPageLike;
2152
- enrichDataRequest(source: SceneObject): Partial<_grafana_data.DataQueryRequest<_grafana_data.DataQuery>>;
2153
+ enrichDataRequest(source: SceneObject): Partial<_grafana_data.DataQueryRequest<_grafana_data.DataQuery>> | null;
2153
2154
  }
2154
2155
  interface SceneAppPageRendererProps extends SceneComponentProps<SceneAppPage> {
2155
2156
  routeProps: RouteComponentProps;
@@ -2174,7 +2175,7 @@ interface SceneReactObjectState<TProps = {}> extends SceneObjectState {
2174
2175
  * A utility object that can be used to render any React component or ReactNode
2175
2176
  */
2176
2177
  declare class SceneReactObject<TProps = {}> extends SceneObjectBase<SceneReactObjectState<TProps>> {
2177
- static Component: ({ model }: SceneComponentProps<SceneReactObject>) => string | number | true | Iterable<React__default.ReactNode> | React__default.JSX.Element;
2178
+ static Component: ({ model }: SceneComponentProps<SceneReactObject>) => string | number | true | Iterable<React__default.ReactNode> | React__default.JSX.Element | null;
2178
2179
  }
2179
2180
 
2180
2181
  type StandardFieldConfigInterface<T, C, Prefix extends string> = {
@@ -2327,7 +2328,7 @@ declare class VizPanelBuilder<TOptions extends {}, TFieldConfig extends {}> impl
2327
2328
  declare class PanelOptionsBuilder<TOptions extends {} = {}> {
2328
2329
  private defaultOptions?;
2329
2330
  private _options;
2330
- constructor(defaultOptions?: () => Partial<TOptions>);
2331
+ constructor(defaultOptions?: (() => Partial<TOptions>) | undefined);
2331
2332
  private setDefaults;
2332
2333
  /**
2333
2334
  * Set an individual panel option. This will merge the value with the existing options.
@@ -2364,7 +2365,7 @@ declare class FieldConfigBuilder<TFieldConfig extends {}> implements StandardFie
2364
2365
  private defaultFieldConfig?;
2365
2366
  private _fieldConfig;
2366
2367
  private _overridesBuilder;
2367
- constructor(defaultFieldConfig?: () => TFieldConfig);
2368
+ constructor(defaultFieldConfig?: (() => TFieldConfig) | undefined);
2368
2369
  private setDefaults;
2369
2370
  /**
2370
2371
  * Set color.
package/dist/index.js CHANGED
@@ -3045,6 +3045,65 @@ function renderSelectForVariable(model) {
3045
3045
  }
3046
3046
  }
3047
3047
 
3048
+ class GroupByVariableUrlSyncHandler {
3049
+ constructor(_sceneObject) {
3050
+ this._sceneObject = _sceneObject;
3051
+ }
3052
+ getKey() {
3053
+ return `var-${this._sceneObject.state.name}`;
3054
+ }
3055
+ getKeys() {
3056
+ if (this._sceneObject.state.skipUrlSync) {
3057
+ return [];
3058
+ }
3059
+ return [this.getKey()];
3060
+ }
3061
+ getUrlState() {
3062
+ if (this._sceneObject.state.skipUrlSync) {
3063
+ return {};
3064
+ }
3065
+ return { [this.getKey()]: toUrlValues(this._sceneObject.state.value, this._sceneObject.state.text) };
3066
+ }
3067
+ updateFromUrl(values) {
3068
+ let urlValue = values[this.getKey()];
3069
+ if (urlValue != null) {
3070
+ if (!this._sceneObject.isActive) {
3071
+ this._sceneObject.skipNextValidation = true;
3072
+ }
3073
+ const { values: values2, texts } = fromUrlValues(urlValue);
3074
+ this._sceneObject.changeValueTo(values2, texts);
3075
+ }
3076
+ }
3077
+ }
3078
+ function toUrlValues(values, texts) {
3079
+ values = Array.isArray(values) ? values : [values];
3080
+ texts = Array.isArray(texts) ? texts : [texts];
3081
+ return values.map((value, idx) => {
3082
+ if (value === void 0 || value === null) {
3083
+ return "";
3084
+ }
3085
+ value = String(value);
3086
+ let text = texts[idx];
3087
+ text = text === void 0 || text === null ? value : String(text);
3088
+ return toUrlCommaDelimitedString(value, text);
3089
+ });
3090
+ }
3091
+ function fromUrlValues(urlValues) {
3092
+ urlValues = Array.isArray(urlValues) ? urlValues : [urlValues];
3093
+ return urlValues.reduce(
3094
+ (acc, urlValue) => {
3095
+ const [value, label] = (urlValue != null ? urlValue : "").split(",");
3096
+ acc.values.push(unescapeUrlDelimiters(value));
3097
+ acc.texts.push(unescapeUrlDelimiters(label != null ? label : value));
3098
+ return acc;
3099
+ },
3100
+ {
3101
+ values: [],
3102
+ texts: []
3103
+ }
3104
+ );
3105
+ }
3106
+
3048
3107
  var __defProp$y = Object.defineProperty;
3049
3108
  var __defProps$m = Object.defineProperties;
3050
3109
  var __getOwnPropDescs$m = Object.getOwnPropertyDescriptors;
@@ -3081,6 +3140,7 @@ class GroupByVariable extends MultiValueVariable {
3081
3140
  noValueOnClear: true
3082
3141
  }));
3083
3142
  this.isLazy = true;
3143
+ this._urlSync = new GroupByVariableUrlSyncHandler(this);
3084
3144
  this._getKeys = async (ds) => {
3085
3145
  var _a, _b, _c;
3086
3146
  const override = await ((_b = (_a = this.state).getTagKeysProvider) == null ? void 0 : _b.call(_a, this, null));
@@ -3166,15 +3226,25 @@ class GroupByVariable extends MultiValueVariable {
3166
3226
  }
3167
3227
  GroupByVariable.Component = GroupByVariableRenderer;
3168
3228
  function GroupByVariableRenderer({ model }) {
3169
- const { value, key, maxVisibleValues, noValueOnClear } = model.useState();
3170
- const arrayValue = React.useMemo(() => lodash.isArray(value) ? value : [value], [value]);
3229
+ const { value, text, key, maxVisibleValues, noValueOnClear } = model.useState();
3230
+ const values = React.useMemo(() => {
3231
+ const arrayValue = lodash.isArray(value) ? value : [value];
3232
+ const arrayText = lodash.isArray(text) ? text : [text];
3233
+ return arrayValue.map((value2, idx) => {
3234
+ var _a;
3235
+ return {
3236
+ value: value2,
3237
+ label: String((_a = arrayText[idx]) != null ? _a : value2)
3238
+ };
3239
+ });
3240
+ }, [value, text]);
3171
3241
  const [isFetchingOptions, setIsFetchingOptions] = React.useState(false);
3172
3242
  const [isOptionsOpen, setIsOptionsOpen] = React.useState(false);
3173
3243
  const [inputValue, setInputValue] = React.useState("");
3174
- const [uncommittedValue, setUncommittedValue] = React.useState(arrayValue);
3244
+ const [uncommittedValue, setUncommittedValue] = React.useState(values);
3175
3245
  React.useEffect(() => {
3176
- setUncommittedValue(arrayValue);
3177
- }, [arrayValue]);
3246
+ setUncommittedValue(values);
3247
+ }, [values]);
3178
3248
  const onInputChange = (value2, { action }) => {
3179
3249
  if (action === "input-change") {
3180
3250
  setInputValue(value2);
@@ -3211,13 +3281,16 @@ function GroupByVariableRenderer({ model }) {
3211
3281
  components: { Option: OptionWithCheckbox },
3212
3282
  onInputChange,
3213
3283
  onBlur: () => {
3214
- model.changeValueTo(uncommittedValue);
3284
+ model.changeValueTo(
3285
+ uncommittedValue.map((x) => x.value),
3286
+ uncommittedValue.map((x) => x.label)
3287
+ );
3215
3288
  },
3216
3289
  onChange: (newValue, action) => {
3217
3290
  if (action.action === "clear" && noValueOnClear) {
3218
3291
  model.changeValueTo([]);
3219
3292
  }
3220
- setUncommittedValue(newValue.map((x) => x.value));
3293
+ setUncommittedValue(newValue);
3221
3294
  },
3222
3295
  onOpenMenu: async () => {
3223
3296
  setIsFetchingOptions(true);
@@ -3532,7 +3605,7 @@ class AdHocFiltersVariableUrlSyncHandler {
3532
3605
  if (filters.length === 0) {
3533
3606
  return { [this.getKey()]: [""] };
3534
3607
  }
3535
- const value = filters.filter(isFilterComplete).map((filter) => toArray(filter).map(escapePipeDelimiters).join("|"));
3608
+ const value = filters.filter(isFilterComplete).map((filter) => toArray(filter).map(escapeUrlPipeDelimiters).join("|"));
3536
3609
  return { [this.getKey()]: value };
3537
3610
  }
3538
3611
  updateFromUrl(values) {
@@ -3552,39 +3625,13 @@ function deserializeUrlToFilters(value) {
3552
3625
  const filter = toFilter(value);
3553
3626
  return filter === null ? [] : [filter];
3554
3627
  }
3555
- function escapePipeDelimiters(value) {
3556
- if (value === null || value === void 0) {
3557
- return "";
3558
- }
3559
- return value = /\|/g[Symbol.replace](value, "__gfp__");
3560
- }
3561
- function escapeCommaDelimiters(value) {
3562
- if (value === null || value === void 0) {
3563
- return "";
3564
- }
3565
- return /,/g[Symbol.replace](value, "__gfc__");
3566
- }
3567
- function unescapeDelimiters(value) {
3568
- if (value === null || value === void 0) {
3569
- return "";
3570
- }
3571
- value = /__gfp__/g[Symbol.replace](value, "|");
3572
- value = /__gfc__/g[Symbol.replace](value, ",");
3573
- return value;
3574
- }
3575
3628
  function toArray(filter) {
3576
3629
  return [
3577
- toCommaDelimitedString(filter.key, filter.keyLabel),
3630
+ toUrlCommaDelimitedString(filter.key, filter.keyLabel),
3578
3631
  filter.operator,
3579
- toCommaDelimitedString(filter.value, filter.valueLabel)
3632
+ toUrlCommaDelimitedString(filter.value, filter.valueLabel)
3580
3633
  ];
3581
3634
  }
3582
- function toCommaDelimitedString(key, label) {
3583
- if (!label || key === label) {
3584
- return escapeCommaDelimiters(key);
3585
- }
3586
- return [key, label].map(escapeCommaDelimiters).join(",");
3587
- }
3588
3635
  function toFilter(urlValue) {
3589
3636
  if (typeof urlValue !== "string" || urlValue.length === 0) {
3590
3637
  return null;
@@ -3593,7 +3640,7 @@ function toFilter(urlValue) {
3593
3640
  const [key2, label] = v.split(",");
3594
3641
  acc.push(key2, label != null ? label : key2);
3595
3642
  return acc;
3596
- }, []).map(unescapeDelimiters);
3643
+ }, []).map(unescapeUrlDelimiters);
3597
3644
  return {
3598
3645
  key,
3599
3646
  keyLabel,
@@ -4314,6 +4361,32 @@ function filterOutInactiveRunnerDuplicates(runners) {
4314
4361
  return activeItems;
4315
4362
  });
4316
4363
  }
4364
+ function escapeUrlPipeDelimiters(value) {
4365
+ if (value === null || value === void 0) {
4366
+ return "";
4367
+ }
4368
+ return value = /\|/g[Symbol.replace](value, "__gfp__");
4369
+ }
4370
+ function escapeUrlCommaDelimiters(value) {
4371
+ if (value === null || value === void 0) {
4372
+ return "";
4373
+ }
4374
+ return /,/g[Symbol.replace](value, "__gfc__");
4375
+ }
4376
+ function unescapeUrlDelimiters(value) {
4377
+ if (value === null || value === void 0) {
4378
+ return "";
4379
+ }
4380
+ value = /__gfp__/g[Symbol.replace](value, "|");
4381
+ value = /__gfc__/g[Symbol.replace](value, ",");
4382
+ return value;
4383
+ }
4384
+ function toUrlCommaDelimitedString(key, label) {
4385
+ if (!label || key === label) {
4386
+ return escapeUrlCommaDelimiters(key);
4387
+ }
4388
+ return [key, label].map(escapeUrlCommaDelimiters).join(",");
4389
+ }
4317
4390
 
4318
4391
  function isAdHocVariable(variable) {
4319
4392
  return variable.state.type === "adhoc";
@@ -7952,6 +8025,10 @@ var __objRest = (source, exclude) => {
7952
8025
  };
7953
8026
  function SceneGridLayoutRenderer({ model }) {
7954
8027
  const { children, isLazy, isDraggable, isResizable } = model.useState();
8028
+ const ref = React.useRef(null);
8029
+ React.useEffect(() => {
8030
+ updateAnimationClass(ref, !!isDraggable);
8031
+ }, [isDraggable]);
7955
8032
  validateChildrenSize(children);
7956
8033
  return /* @__PURE__ */ React__default["default"].createElement(AutoSizer__default["default"], null, ({ width, height }) => {
7957
8034
  if (width === 0) {
@@ -7959,8 +8036,9 @@ function SceneGridLayoutRenderer({ model }) {
7959
8036
  }
7960
8037
  const layout = model.buildGridLayout(width, height);
7961
8038
  return /* @__PURE__ */ React__default["default"].createElement("div", {
8039
+ ref,
7962
8040
  style: { width: `${width}px`, height: "100%", position: "relative", zIndex: 1 },
7963
- className: css.cx("react-grid-layout", isDraggable && "react-grid-layout--enable-move-animations")
8041
+ className: "react-grid-layout"
7964
8042
  }, /* @__PURE__ */ React__default["default"].createElement(ReactGridLayout__default["default"], {
7965
8043
  width,
7966
8044
  isDraggable: isDraggable && width > 768,
@@ -8023,6 +8101,17 @@ function validateChildrenSize(children) {
8023
8101
  throw new Error("All children must have a size specified");
8024
8102
  }
8025
8103
  }
8104
+ function updateAnimationClass(ref, isDraggable, retry) {
8105
+ if (ref.current) {
8106
+ if (isDraggable) {
8107
+ ref.current.classList.add("react-grid-layout--enable-move-animations");
8108
+ } else {
8109
+ ref.current.classList.remove("react-grid-layout--enable-move-animations");
8110
+ }
8111
+ } else if (!retry) {
8112
+ setTimeout(() => updateAnimationClass(ref, isDraggable, true), 50);
8113
+ }
8114
+ }
8026
8115
  const ResizeHandle = React__default["default"].forwardRef((_a, ref) => {
8027
8116
  var _b = _a, divProps = __objRest(_b, ["handleAxis"]);
8028
8117
  const customCssClass = ui.useStyles2(getResizeHandleStyles);