@grafana/scenes 6.9.1 → 6.10.0--canary.1095.14616898973.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.
@@ -1 +1 @@
1
- {"version":3,"file":"getAdHocFiltersFromScopes.js","sources":["../../../../src/variables/adhoc/getAdHocFiltersFromScopes.ts"],"sourcesContent":["import { Scope, ScopeFilterOperator, ScopeSpecFilter, scopeFilterOperatorMap } from '@grafana/data';\nimport { AdHocFilterWithLabels, FilterOrigin } from './AdHocFiltersVariable';\n\nexport type EqualityOrMultiOperator = Extract<ScopeFilterOperator, 'equals' | 'not-equals' | 'one-of' | 'not-one-of'>;\n\nexport const reverseScopeFilterOperatorMap: Record<ScopeFilterOperator, string> = Object.fromEntries(\n Object.entries(scopeFilterOperatorMap).map(([symbol, operator]) => [operator, symbol])\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n) as Record<ScopeFilterOperator, string>;\n\nexport function isEqualityOrMultiOperator(value: string): value is EqualityOrMultiOperator {\n const operators = new Set(['equals', 'not-equals', 'one-of', 'not-one-of']);\n return operators.has(value);\n}\n\n// this function returns processed adhoc filters after parsing and processing\n// all scope filters from a scope list. The reason we need to process these filters is\n// because scopes can have multiple filter values with the same key. For example:\n// we have selected ScopeA which has a filter with a key1, operator one-of, a value1,\n// and a ScopeB which has a filter with key1, operator one-of, and value2. After processing,\n// the result will be just one adhoc filter with both values. This is held in formattedFilters.\n// DuplicatedFilters will containg unprocessable filters: if scopeA has instead of the one-of op\n// an equal op, then the result will be 2 adhoc filters with the same key, but diferent operator\n// and value. We return them this way and let the adhoc interface deal with this.\nexport function getAdHocFiltersFromScopes(scopes: Scope[]): AdHocFilterWithLabels[] {\n const formattedFilters: Map<string, AdHocFilterWithLabels> = new Map();\n // duplicated filters that could not be processed in any way are just appended to the list\n const duplicatedFilters: AdHocFilterWithLabels[] = [];\n const allFilters = scopes.flatMap((scope) => scope.spec.filters);\n\n for (const filter of allFilters) {\n processFilter(formattedFilters, duplicatedFilters, filter);\n }\n\n return [...formattedFilters.values(), ...duplicatedFilters];\n}\n\nfunction processFilter(\n formattedFilters: Map<string, AdHocFilterWithLabels>,\n duplicatedFilters: AdHocFilterWithLabels[],\n filter: ScopeSpecFilter\n) {\n const existingFilter = formattedFilters.get(filter.key);\n\n if (existingFilter && canValueBeMerged(existingFilter.operator, filter.operator)) {\n mergeFilterValues(existingFilter, filter);\n } else if (!existingFilter) {\n // Add filter to map either only if it is new.\n // Otherwise it is an existing filter that cannot be converted to multi-value\n // and thus will be moved to the duplicatedFilters list\n formattedFilters.set(filter.key, {\n key: filter.key,\n operator: reverseScopeFilterOperatorMap[filter.operator],\n value: filter.value,\n values: filter.values ?? [filter.value],\n origin: FilterOrigin.Scopes,\n });\n } else {\n duplicatedFilters.push({\n key: filter.key,\n operator: reverseScopeFilterOperatorMap[filter.operator],\n value: filter.value,\n values: filter.values ?? [filter.value],\n origin: FilterOrigin.Scopes,\n });\n }\n}\n\nfunction mergeFilterValues(adHocFilter: AdHocFilterWithLabels, filter: ScopeSpecFilter) {\n const values = filter.values ?? [filter.value];\n\n for (const value of values) {\n if (!adHocFilter.values?.includes(value)) {\n adHocFilter.values?.push(value);\n }\n }\n\n // If there's only one value, there's no need to update the\n // operator to its multi-value equivalent\n if (adHocFilter.values?.length === 1) {\n return;\n }\n\n // Otherwise update it to the equivalent multi-value operator\n if (filter.operator === 'equals' && adHocFilter.operator === reverseScopeFilterOperatorMap['equals']) {\n adHocFilter.operator = reverseScopeFilterOperatorMap['one-of'];\n } else if (filter.operator === 'not-equals' && adHocFilter.operator === reverseScopeFilterOperatorMap['not-equals']) {\n adHocFilter.operator = reverseScopeFilterOperatorMap['not-one-of'];\n }\n}\n\nfunction canValueBeMerged(adHocFilterOperator: string, filterOperator: string) {\n const scopeConvertedOperator = scopeFilterOperatorMap[adHocFilterOperator];\n\n if (!isEqualityOrMultiOperator(scopeConvertedOperator) || !isEqualityOrMultiOperator(filterOperator)) {\n return false;\n }\n\n if (\n (scopeConvertedOperator.includes('not') && !filterOperator.includes('not')) ||\n (!scopeConvertedOperator.includes('not') && filterOperator.includes('not'))\n ) {\n return false;\n }\n\n return true;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"getAdHocFiltersFromScopes.js","sources":["../../../../src/variables/adhoc/getAdHocFiltersFromScopes.ts"],"sourcesContent":["import { Scope, ScopeFilterOperator, ScopeSpecFilter, scopeFilterOperatorMap } from '@grafana/data';\nimport { AdHocFilterWithLabels } from './AdHocFiltersVariable';\n\nexport type EqualityOrMultiOperator = Extract<ScopeFilterOperator, 'equals' | 'not-equals' | 'one-of' | 'not-one-of'>;\n\nexport const reverseScopeFilterOperatorMap: Record<ScopeFilterOperator, string> = Object.fromEntries(\n Object.entries(scopeFilterOperatorMap).map(([symbol, operator]) => [operator, symbol])\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n) as Record<ScopeFilterOperator, string>;\n\nexport function isEqualityOrMultiOperator(value: string): value is EqualityOrMultiOperator {\n const operators = new Set(['equals', 'not-equals', 'one-of', 'not-one-of']);\n return operators.has(value);\n}\n\n// this function returns processed adhoc filters after parsing and processing\n// all scope filters from a scope list. The reason we need to process these filters is\n// because scopes can have multiple filter values with the same key. For example:\n// we have selected ScopeA which has a filter with a key1, operator one-of, a value1,\n// and a ScopeB which has a filter with key1, operator one-of, and value2. After processing,\n// the result will be just one adhoc filter with both values. This is held in formattedFilters.\n// DuplicatedFilters will containg unprocessable filters: if scopeA has instead of the one-of op\n// an equal op, then the result will be 2 adhoc filters with the same key, but diferent operator\n// and value. We return them this way and let the adhoc interface deal with this.\nexport function getAdHocFiltersFromScopes(scopes: Scope[]): AdHocFilterWithLabels[] {\n const formattedFilters: Map<string, AdHocFilterWithLabels> = new Map();\n // duplicated filters that could not be processed in any way are just appended to the list\n const duplicatedFilters: AdHocFilterWithLabels[] = [];\n const allFilters = scopes.flatMap((scope) => scope.spec.filters);\n\n for (const filter of allFilters) {\n processFilter(formattedFilters, duplicatedFilters, filter);\n }\n\n return [...formattedFilters.values(), ...duplicatedFilters];\n}\n\nfunction processFilter(\n formattedFilters: Map<string, AdHocFilterWithLabels>,\n duplicatedFilters: AdHocFilterWithLabels[],\n filter: ScopeSpecFilter\n) {\n const existingFilter = formattedFilters.get(filter.key);\n\n if (existingFilter && canValueBeMerged(existingFilter.operator, filter.operator)) {\n mergeFilterValues(existingFilter, filter);\n } else if (!existingFilter) {\n // Add filter to map either only if it is new.\n // Otherwise it is an existing filter that cannot be converted to multi-value\n // and thus will be moved to the duplicatedFilters list\n formattedFilters.set(filter.key, {\n key: filter.key,\n operator: reverseScopeFilterOperatorMap[filter.operator],\n value: filter.value,\n values: filter.values ?? [filter.value],\n origin: 'scope',\n });\n } else {\n duplicatedFilters.push({\n key: filter.key,\n operator: reverseScopeFilterOperatorMap[filter.operator],\n value: filter.value,\n values: filter.values ?? [filter.value],\n origin: 'scope',\n });\n }\n}\n\nfunction mergeFilterValues(adHocFilter: AdHocFilterWithLabels, filter: ScopeSpecFilter) {\n const values = filter.values ?? [filter.value];\n\n for (const value of values) {\n if (!adHocFilter.values?.includes(value)) {\n adHocFilter.values?.push(value);\n }\n }\n\n // If there's only one value, there's no need to update the\n // operator to its multi-value equivalent\n if (adHocFilter.values?.length === 1) {\n return;\n }\n\n // Otherwise update it to the equivalent multi-value operator\n if (filter.operator === 'equals' && adHocFilter.operator === reverseScopeFilterOperatorMap['equals']) {\n adHocFilter.operator = reverseScopeFilterOperatorMap['one-of'];\n } else if (filter.operator === 'not-equals' && adHocFilter.operator === reverseScopeFilterOperatorMap['not-equals']) {\n adHocFilter.operator = reverseScopeFilterOperatorMap['not-one-of'];\n }\n}\n\nfunction canValueBeMerged(adHocFilterOperator: string, filterOperator: string) {\n const scopeConvertedOperator = scopeFilterOperatorMap[adHocFilterOperator];\n\n if (!isEqualityOrMultiOperator(scopeConvertedOperator) || !isEqualityOrMultiOperator(filterOperator)) {\n return false;\n }\n\n if (\n (scopeConvertedOperator.includes('not') && !filterOperator.includes('not')) ||\n (!scopeConvertedOperator.includes('not') && filterOperator.includes('not'))\n ) {\n return false;\n }\n\n return true;\n}\n"],"names":[],"mappings":";;AAKO,MAAM,gCAAqE,MAAO,CAAA,WAAA;AAAA,EACvF,MAAO,CAAA,OAAA,CAAQ,sBAAsB,CAAA,CAAE,GAAI,CAAA,CAAC,CAAC,MAAA,EAAQ,QAAQ,CAAA,KAAM,CAAC,QAAA,EAAU,MAAM,CAAC;AAAA;AAEvF;AAEO,SAAS,0BAA0B,KAAiD,EAAA;AACzF,EAAM,MAAA,SAAA,uBAAgB,GAAI,CAAA,CAAC,UAAU,YAAc,EAAA,QAAA,EAAU,YAAY,CAAC,CAAA;AAC1E,EAAO,OAAA,SAAA,CAAU,IAAI,KAAK,CAAA;AAC5B;AAWO,SAAS,0BAA0B,MAA0C,EAAA;AAClF,EAAM,MAAA,gBAAA,uBAA2D,GAAI,EAAA;AAErE,EAAA,MAAM,oBAA6C,EAAC;AACpD,EAAA,MAAM,aAAa,MAAO,CAAA,OAAA,CAAQ,CAAC,KAAU,KAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAE/D,EAAA,KAAA,MAAW,UAAU,UAAY,EAAA;AAC/B,IAAc,aAAA,CAAA,gBAAA,EAAkB,mBAAmB,MAAM,CAAA;AAAA;AAG3D,EAAA,OAAO,CAAC,GAAG,gBAAA,CAAiB,MAAO,EAAA,EAAG,GAAG,iBAAiB,CAAA;AAC5D;AAEA,SAAS,aAAA,CACP,gBACA,EAAA,iBAAA,EACA,MACA,EAAA;AAzCF,EAAA,IAAA,EAAA,EAAA,EAAA;AA0CE,EAAA,MAAM,cAAiB,GAAA,gBAAA,CAAiB,GAAI,CAAA,MAAA,CAAO,GAAG,CAAA;AAEtD,EAAA,IAAI,kBAAkB,gBAAiB,CAAA,cAAA,CAAe,QAAU,EAAA,MAAA,CAAO,QAAQ,CAAG,EAAA;AAChF,IAAA,iBAAA,CAAkB,gBAAgB,MAAM,CAAA;AAAA,GAC1C,MAAA,IAAW,CAAC,cAAgB,EAAA;AAI1B,IAAiB,gBAAA,CAAA,GAAA,CAAI,OAAO,GAAK,EAAA;AAAA,MAC/B,KAAK,MAAO,CAAA,GAAA;AAAA,MACZ,QAAA,EAAU,6BAA8B,CAAA,MAAA,CAAO,QAAQ,CAAA;AAAA,MACvD,OAAO,MAAO,CAAA,KAAA;AAAA,MACd,SAAQ,EAAO,GAAA,MAAA,CAAA,MAAA,KAAP,IAAiB,GAAA,EAAA,GAAA,CAAC,OAAO,KAAK,CAAA;AAAA,MACtC,MAAQ,EAAA;AAAA,KACT,CAAA;AAAA,GACI,MAAA;AACL,IAAA,iBAAA,CAAkB,IAAK,CAAA;AAAA,MACrB,KAAK,MAAO,CAAA,GAAA;AAAA,MACZ,QAAA,EAAU,6BAA8B,CAAA,MAAA,CAAO,QAAQ,CAAA;AAAA,MACvD,OAAO,MAAO,CAAA,KAAA;AAAA,MACd,SAAQ,EAAO,GAAA,MAAA,CAAA,MAAA,KAAP,IAAiB,GAAA,EAAA,GAAA,CAAC,OAAO,KAAK,CAAA;AAAA,MACtC,MAAQ,EAAA;AAAA,KACT,CAAA;AAAA;AAEL;AAEA,SAAS,iBAAA,CAAkB,aAAoC,MAAyB,EAAA;AApExF,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAqEE,EAAA,MAAM,UAAS,EAAO,GAAA,MAAA,CAAA,MAAA,KAAP,IAAiB,GAAA,EAAA,GAAA,CAAC,OAAO,KAAK,CAAA;AAE7C,EAAA,KAAA,MAAW,SAAS,MAAQ,EAAA;AAC1B,IAAA,IAAI,EAAC,CAAA,EAAA,GAAA,WAAA,CAAY,MAAZ,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAoB,SAAS,KAAQ,CAAA,CAAA,EAAA;AACxC,MAAY,CAAA,EAAA,GAAA,WAAA,CAAA,MAAA,KAAZ,mBAAoB,IAAK,CAAA,KAAA,CAAA;AAAA;AAC3B;AAKF,EAAA,IAAA,CAAA,CAAI,EAAY,GAAA,WAAA,CAAA,MAAA,KAAZ,IAAoB,GAAA,MAAA,GAAA,EAAA,CAAA,MAAA,MAAW,CAAG,EAAA;AACpC,IAAA;AAAA;AAIF,EAAA,IAAI,OAAO,QAAa,KAAA,QAAA,IAAY,YAAY,QAAa,KAAA,6BAAA,CAA8B,QAAQ,CAAG,EAAA;AACpG,IAAY,WAAA,CAAA,QAAA,GAAW,8BAA8B,QAAQ,CAAA;AAAA,GAC/D,MAAA,IAAW,OAAO,QAAa,KAAA,YAAA,IAAgB,YAAY,QAAa,KAAA,6BAAA,CAA8B,YAAY,CAAG,EAAA;AACnH,IAAY,WAAA,CAAA,QAAA,GAAW,8BAA8B,YAAY,CAAA;AAAA;AAErE;AAEA,SAAS,gBAAA,CAAiB,qBAA6B,cAAwB,EAAA;AAC7E,EAAM,MAAA,sBAAA,GAAyB,uBAAuB,mBAAmB,CAAA;AAEzE,EAAA,IAAI,CAAC,yBAA0B,CAAA,sBAAsB,KAAK,CAAC,yBAAA,CAA0B,cAAc,CAAG,EAAA;AACpG,IAAO,OAAA,KAAA;AAAA;AAGT,EAAA,IACG,uBAAuB,QAAS,CAAA,KAAK,CAAK,IAAA,CAAC,eAAe,QAAS,CAAA,KAAK,CACxE,IAAA,CAAC,uBAAuB,QAAS,CAAA,KAAK,KAAK,cAAe,CAAA,QAAA,CAAS,KAAK,CACzE,EAAA;AACA,IAAO,OAAA,KAAA;AAAA;AAGT,EAAO,OAAA,IAAA;AACT;;;;"}
package/dist/index.d.ts CHANGED
@@ -859,14 +859,12 @@ interface AdHocFilterWithLabels<M extends Record<string, any> = {}> extends AdHo
859
859
  hidden?: boolean;
860
860
  meta?: M;
861
861
  origin?: FilterOrigin;
862
- originalValue?: string[];
862
+ matchAllFilter?: boolean;
863
863
  readOnly?: boolean;
864
+ restorable?: boolean;
864
865
  }
865
866
  type AdHocControlsLayout = ControlsLayout | 'combobox';
866
- declare enum FilterOrigin {
867
- Scopes = "scopes",
868
- Dashboards = "dashboards"
869
- }
867
+ type FilterOrigin = 'dashboard' | 'scope';
870
868
  interface AdHocFiltersVariableState extends SceneVariableState {
871
869
  /** Optional text to display on the 'add filter' button */
872
870
  addFilterButtonText?: string;
@@ -968,6 +966,7 @@ declare class AdHocFiltersVariable extends SceneObjectBase<AdHocFiltersVariableS
968
966
  private _scopedVars;
969
967
  private _dataSourceSrv;
970
968
  private _scopesBridge;
969
+ private _originalValues;
971
970
  protected _urlSync: AdHocFiltersVariableUrlSyncHandler;
972
971
  constructor(state: Partial<AdHocFiltersVariableState>);
973
972
  private _activationHandler;
@@ -985,6 +984,7 @@ declare class AdHocFiltersVariable extends SceneObjectBase<AdHocFiltersVariableS
985
984
  restoreOriginalFilter(filter: AdHocFilterWithLabels): void;
986
985
  getValue(): VariableValue | undefined;
987
986
  _updateFilter(filter: AdHocFilterWithLabels, update: Partial<AdHocFilterWithLabels>): void;
987
+ updateToMatchAll(filter: AdHocFilterWithLabels): void;
988
988
  _removeFilter(filter: AdHocFilterWithLabels): void;
989
989
  _removeLastFilter(): void;
990
990
  _handleComboboxBackspace(filter: AdHocFilterWithLabels): void;
@@ -3023,5 +3023,5 @@ declare const sceneUtils: {
3023
3023
  isGroupByVariable: typeof isGroupByVariable;
3024
3024
  };
3025
3025
 
3026
- export { AdHocFiltersVariable, ConstantVariable, ControlsLabel, CustomVariable, DataProviderProxy, DataSourceVariable, EmbeddedScene, FieldConfigBuilder, FieldConfigBuilders, FieldConfigOverridesBuilder, FilterOrigin, GroupByVariable, IntervalVariable, LazyLoader, LocalValueVariable, MultiOrSingleValueSelect, MultiValueVariable, NestedScene, NewSceneObjectAddedEvent, PanelBuilders, PanelOptionsBuilders, QueryVariable, RuntimeDataSource, SafeSerializableSceneObject, SceneApp, SceneAppPage, SceneByFrameRepeater, SceneByVariableRepeater, SceneCSSGridItem, SceneCSSGridLayout, SceneCanvasText, SceneControlsSpacer, SceneDataLayerBase, SceneDataLayerControls, SceneDataLayerSet, SceneDataLayerSetBase, SceneDataNode, SceneDataTransformer, SceneDebugger, SceneFlexItem, SceneFlexLayout, SceneGridItem, SceneGridLayout, SceneGridLayoutDragStartEvent, SceneGridRow, SceneObjectBase, SceneObjectRef, SceneObjectStateChangedEvent, SceneObjectUrlSyncConfig, SceneQueryRunner, SceneReactObject, SceneRefreshPicker, SceneScopesBridge, SceneTimePicker, SceneTimeRange, SceneTimeRangeCompare, SceneTimeRangeTransformerBase, SceneTimeZoneOverride, SceneToolbarButton, SceneToolbarInput, SceneVariableSet, SceneVariableValueChangedEvent, SplitLayout, TestVariable, TextBoxVariable, UrlSyncContextProvider, UrlSyncManager, UserActionEvent, VariableDependencyConfig, VariableValueControl, VariableValueSelectWrapper, VariableValueSelectors, VizConfigBuilder, VizConfigBuilders, VizPanel, VizPanelBuilder, VizPanelExploreButton, VizPanelMenu, index$1 as behaviors, index as dataLayers, formatRegistry, getExploreURL, isCustomVariableValue, isDataLayer, isDataRequestEnricher, isFiltersRequestEnricher, isSceneObject, registerQueryWithController, registerRuntimeDataSource, sceneGraph, sceneUtils, useSceneApp, useSceneObjectState, useUrlSync };
3026
+ export { AdHocFiltersVariable, ConstantVariable, ControlsLabel, CustomVariable, DataProviderProxy, DataSourceVariable, EmbeddedScene, FieldConfigBuilder, FieldConfigBuilders, FieldConfigOverridesBuilder, GroupByVariable, IntervalVariable, LazyLoader, LocalValueVariable, MultiOrSingleValueSelect, MultiValueVariable, NestedScene, NewSceneObjectAddedEvent, PanelBuilders, PanelOptionsBuilders, QueryVariable, RuntimeDataSource, SafeSerializableSceneObject, SceneApp, SceneAppPage, SceneByFrameRepeater, SceneByVariableRepeater, SceneCSSGridItem, SceneCSSGridLayout, SceneCanvasText, SceneControlsSpacer, SceneDataLayerBase, SceneDataLayerControls, SceneDataLayerSet, SceneDataLayerSetBase, SceneDataNode, SceneDataTransformer, SceneDebugger, SceneFlexItem, SceneFlexLayout, SceneGridItem, SceneGridLayout, SceneGridLayoutDragStartEvent, SceneGridRow, SceneObjectBase, SceneObjectRef, SceneObjectStateChangedEvent, SceneObjectUrlSyncConfig, SceneQueryRunner, SceneReactObject, SceneRefreshPicker, SceneScopesBridge, SceneTimePicker, SceneTimeRange, SceneTimeRangeCompare, SceneTimeRangeTransformerBase, SceneTimeZoneOverride, SceneToolbarButton, SceneToolbarInput, SceneVariableSet, SceneVariableValueChangedEvent, SplitLayout, TestVariable, TextBoxVariable, UrlSyncContextProvider, UrlSyncManager, UserActionEvent, VariableDependencyConfig, VariableValueControl, VariableValueSelectWrapper, VariableValueSelectors, VizConfigBuilder, VizConfigBuilders, VizPanel, VizPanelBuilder, VizPanelExploreButton, VizPanelMenu, index$1 as behaviors, index as dataLayers, formatRegistry, getExploreURL, isCustomVariableValue, isDataLayer, isDataRequestEnricher, isFiltersRequestEnricher, isSceneObject, registerQueryWithController, registerRuntimeDataSource, sceneGraph, sceneUtils, useSceneApp, useSceneObjectState, useUrlSync };
3027
3027
  export type { AdHocFilterWithLabels, CancelActivationHandler, ControlsLayout, CustomFormatterVariable, CustomTransformOperator, CustomTransformerDefinition, CustomVariableValue, DataLayerFilter, DataRequestEnricher, DeepPartial, EmbeddedSceneState, ExtraQueryDataProcessor, ExtraQueryDescriptor, ExtraQueryProvider, FiltersRequestEnricher, FormatVariable, InterpolationFormatParameter, MacroVariableConstructor, MultiValueVariableState, QueryRunnerState, SceneActivationHandler, SceneAppDrilldownView, SceneAppPageLike, SceneAppPageState, SceneAppRoute, SceneComponent, SceneComponentProps, SceneDataLayerProvider, SceneDataLayerProviderState, SceneDataProvider, SceneDataProviderResult, SceneDataQuery, SceneDataState, SceneDataTransformerState, SceneDeactivationHandler, SceneFlexItemLike, SceneFlexItemState, SceneGridItemLike, SceneGridItemStateLike, SceneInteractionProfileEvent, SceneLayout, SceneLayoutChildOptions, SceneLayoutState, SceneObject, SceneObjectState, SceneObjectStateChangedPayload, SceneObjectUrlSyncHandler, SceneObjectUrlValue, SceneObjectUrlValues, SceneObjectWithUrlSync, SceneQueryControllerEntry, SceneQueryControllerEntryType, SceneQueryControllerLike, SceneRefreshPickerState, SceneRouteMatch, SceneStateChangedHandler, SceneStatelessBehavior, SceneTimeRangeLike, SceneTimeRangeState, SceneUrlSyncOptions, SceneVariable, SceneVariableDependencyConfigLike, SceneVariableSetState, SceneVariableState, SceneVariables, UrlSyncManagerLike, UseStateHookOptions, ValidateAndUpdateResult, VariableCustomFormatterFn, VariableGetOptionsArgs, VariableValue, VariableValueOption, VariableValueSingle, VizConfig, VizPanelState };
package/dist/index.js CHANGED
@@ -3783,13 +3783,8 @@ class AdHocFiltersVariableUrlSyncHandler {
3783
3783
  }
3784
3784
  if (baseFilters == null ? void 0 : baseFilters.length) {
3785
3785
  value.push(
3786
- ...baseFilters == null ? void 0 : baseFilters.filter(isFilterComplete).filter((filter) => !filter.hidden && filter.origin && filter.originalValue).map(
3787
- (filter) => {
3788
- var _a, _b;
3789
- return toArray(filter).map(escapeInjectedFilterUrlDelimiters).join("|").concat(
3790
- `#${(_b = (_a = filter.originalValue) == null ? void 0 : _a.map(escapeInjectedFilterUrlDelimiters).join("|")) != null ? _b : ""}#${filter.origin}`
3791
- );
3792
- }
3786
+ ...baseFilters == null ? void 0 : baseFilters.filter(isFilterComplete).filter((filter) => !filter.hidden && filter.origin && filter.restorable).map(
3787
+ (filter) => toArray(filter).map(escapeInjectedFilterUrlDelimiters).join("|").concat(`#${filter.origin}#restorable`)
3793
3788
  )
3794
3789
  );
3795
3790
  }
@@ -3802,13 +3797,30 @@ class AdHocFiltersVariableUrlSyncHandler {
3802
3797
  if (urlValue == null) {
3803
3798
  return;
3804
3799
  }
3805
- if (urlValue) {
3806
- const filters = deserializeUrlToFilters(urlValue);
3807
- this._variable.setState({
3808
- filters: filters.filter((f) => !f.origin),
3809
- baseFilters: filters.filter((f) => f.origin)
3810
- });
3811
- }
3800
+ const filters = deserializeUrlToFilters(urlValue);
3801
+ const baseFilters = [...this._variable.state.baseFilters || []];
3802
+ for (let i = 0; i < filters.length; i++) {
3803
+ const foundBaseFilterIndex = baseFilters.findIndex((f) => f.key === filters[i].key);
3804
+ if (foundBaseFilterIndex > -1) {
3805
+ if (!filters[i].origin && baseFilters[foundBaseFilterIndex].origin === "dashboard") {
3806
+ filters[i].origin = "dashboard";
3807
+ filters[i].restorable = true;
3808
+ }
3809
+ if (isMatchAllFilter(filters[i])) {
3810
+ filters[i].matchAllFilter = true;
3811
+ }
3812
+ baseFilters[foundBaseFilterIndex] = filters[i];
3813
+ } else if (filters[i].origin === "dashboard") {
3814
+ delete filters[i].origin;
3815
+ delete filters[i].restorable;
3816
+ } else if (foundBaseFilterIndex === -1 && filters[i].origin === "scope" && filters[i].restorable) {
3817
+ baseFilters.push(filters[i]);
3818
+ }
3819
+ }
3820
+ this._variable.setState({
3821
+ filters: filters.filter((f) => !f.origin),
3822
+ baseFilters
3823
+ });
3812
3824
  }
3813
3825
  }
3814
3826
  function deserializeUrlToFilters(value) {
@@ -3833,11 +3845,10 @@ function toArray(filter) {
3833
3845
  return result;
3834
3846
  }
3835
3847
  function toFilter(urlValue) {
3836
- var _a;
3837
3848
  if (typeof urlValue !== "string" || urlValue.length === 0) {
3838
3849
  return null;
3839
3850
  }
3840
- const [filter, originalValues, origin] = urlValue.split("#");
3851
+ const [filter, origin, restorable] = urlValue.split("#");
3841
3852
  const [key, keyLabel, operator, _operatorLabel, ...values] = filter.split("|").reduce((acc, v) => {
3842
3853
  const [key2, label] = v.split(",");
3843
3854
  acc.push(key2, label != null ? label : key2);
@@ -3851,12 +3862,12 @@ function toFilter(urlValue) {
3851
3862
  values: isMultiValueOperator(operator) ? values.filter((_, index) => index % 2 === 0) : void 0,
3852
3863
  valueLabels: values.filter((_, index) => index % 2 === 1),
3853
3864
  condition: "",
3854
- origin: isFilterOrigin(origin) ? origin : void 0,
3855
- originalValue: originalValues && originalValues.length ? (_a = originalValues.split("|")) != null ? _a : [originalValues] : void 0
3865
+ ...isFilterOrigin(origin) && { origin },
3866
+ ...!!restorable && { restorable: true }
3856
3867
  };
3857
3868
  }
3858
3869
  function isFilterOrigin(value) {
3859
- return value === FilterOrigin.Scopes || value === FilterOrigin.Dashboards;
3870
+ return value === "scope" || value === "dashboard";
3860
3871
  }
3861
3872
  function isFilter(filter) {
3862
3873
  return filter !== null && typeof filter.key === "string" && typeof filter.value === "string";
@@ -4298,6 +4309,9 @@ const AdHocCombobox = React.forwardRef(function AdHocCombobox2({ filter, model,
4298
4309
  }, [model, isAlwaysWip]);
4299
4310
  const handleMultiValueFilterCommit = React.useCallback(
4300
4311
  (model2, filter2, filterMultiValues2, preventFocus) => {
4312
+ if (!filterMultiValues2.length && filter2.origin) {
4313
+ model2.updateToMatchAll(filter2);
4314
+ }
4301
4315
  if (filterMultiValues2.length) {
4302
4316
  const valueLabels = [];
4303
4317
  const values = [];
@@ -4947,7 +4961,11 @@ function AdHocFilterPill({ filter, model, readOnly, focusOnWipInputRef }) {
4947
4961
  return /* @__PURE__ */ React__default.default.createElement(
4948
4962
  "div",
4949
4963
  {
4950
- className: css.cx(styles.combinedFilterPill, readOnly && styles.readOnlyCombinedFilter),
4964
+ className: css.cx(
4965
+ styles.combinedFilterPill,
4966
+ readOnly && styles.readOnlyCombinedFilter,
4967
+ isMatchAllFilter(filter) && styles.matchAllPill
4968
+ ),
4951
4969
  onClick: (e) => {
4952
4970
  e.stopPropagation();
4953
4971
  setPopulateInputOnEdit(true);
@@ -4965,19 +4983,27 @@ function AdHocFilterPill({ filter, model, readOnly, focusOnWipInputRef }) {
4965
4983
  ref: pillWrapperRef
4966
4984
  },
4967
4985
  valueLabel.length < LABEL_MAX_VISIBLE_LENGTH ? pillText : /* @__PURE__ */ React__default.default.createElement(ui.Tooltip, { content: /* @__PURE__ */ React__default.default.createElement("div", { className: styles.tooltipText }, valueLabel), placement: "top" }, pillText),
4968
- !readOnly && !filter.origin ? /* @__PURE__ */ React__default.default.createElement(
4986
+ !readOnly && !filter.matchAllFilter && (!filter.origin || filter.origin === "dashboard") ? /* @__PURE__ */ React__default.default.createElement(
4969
4987
  ui.IconButton,
4970
4988
  {
4971
4989
  onClick: (e) => {
4972
4990
  e.stopPropagation();
4973
- model._removeFilter(filter);
4991
+ if (filter.origin && filter.origin === "dashboard") {
4992
+ model.updateToMatchAll(filter);
4993
+ } else {
4994
+ model._removeFilter(filter);
4995
+ }
4974
4996
  setTimeout(() => focusOnWipInputRef == null ? void 0 : focusOnWipInputRef());
4975
4997
  },
4976
4998
  onKeyDownCapture: (e) => {
4977
4999
  if (e.key === "Enter") {
4978
5000
  e.preventDefault();
4979
5001
  e.stopPropagation();
4980
- model._removeFilter(filter);
5002
+ if (filter.origin && filter.origin === "dashboard") {
5003
+ model.updateToMatchAll(filter);
5004
+ } else {
5005
+ model._removeFilter(filter);
5006
+ }
4981
5007
  setTimeout(() => focusOnWipInputRef == null ? void 0 : focusOnWipInputRef());
4982
5008
  }
4983
5009
  },
@@ -4987,16 +5013,8 @@ function AdHocFilterPill({ filter, model, readOnly, focusOnWipInputRef }) {
4987
5013
  tooltip: `Remove filter with key ${keyLabel}`
4988
5014
  }
4989
5015
  ) : null,
4990
- filter.origin && !filter.originalValue && /* @__PURE__ */ React__default.default.createElement(
4991
- ui.IconButton,
4992
- {
4993
- name: "info-circle",
4994
- size: "md",
4995
- className: styles.pillIcon,
4996
- tooltip: `This is a ${filter.origin} injected filter`
4997
- }
4998
- ),
4999
- filter.origin && filter.originalValue && /* @__PURE__ */ React__default.default.createElement(
5016
+ filter.origin && !filter.restorable && /* @__PURE__ */ React__default.default.createElement(ui.Tooltip, { content: `This is a ${filter.origin} injected filter`, placement: "bottom" }, /* @__PURE__ */ React__default.default.createElement(ui.Icon, { name: "info-circle", size: "md", className: styles.infoPillIcon })),
5017
+ filter.origin && filter.restorable && /* @__PURE__ */ React__default.default.createElement(
5000
5018
  ui.IconButton,
5001
5019
  {
5002
5020
  onClick: (e) => {
@@ -5012,7 +5030,7 @@ function AdHocFilterPill({ filter, model, readOnly, focusOnWipInputRef }) {
5012
5030
  },
5013
5031
  name: "history",
5014
5032
  size: "md",
5015
- className: styles.pillIcon,
5033
+ className: isMatchAllFilter(filter) ? styles.matchAllPillIcon : styles.pillIcon,
5016
5034
  tooltip: `Restore filter to its original value`
5017
5035
  }
5018
5036
  )
@@ -5070,6 +5088,23 @@ const getStyles$b = (theme) => ({
5070
5088
  }),
5071
5089
  tooltipText: css.css({
5072
5090
  textAlign: "center"
5091
+ }),
5092
+ infoPillIcon: css.css({
5093
+ marginInline: theme.spacing(0.5),
5094
+ cursor: "pointer"
5095
+ }),
5096
+ matchAllPillIcon: css.css({
5097
+ marginInline: theme.spacing(0.5),
5098
+ cursor: "pointer",
5099
+ color: theme.colors.text.disabled
5100
+ }),
5101
+ matchAllPill: css.css({
5102
+ background: theme.colors.action.selected,
5103
+ color: theme.colors.text.disabled,
5104
+ border: 0,
5105
+ "&:hover": {
5106
+ background: theme.colors.action.selected
5107
+ }
5073
5108
  })
5074
5109
  });
5075
5110
 
@@ -5181,7 +5216,7 @@ function processFilter(formattedFilters, duplicatedFilters, filter) {
5181
5216
  operator: reverseScopeFilterOperatorMap[filter.operator],
5182
5217
  value: filter.value,
5183
5218
  values: (_a = filter.values) != null ? _a : [filter.value],
5184
- origin: FilterOrigin.Scopes
5219
+ origin: "scope"
5185
5220
  });
5186
5221
  } else {
5187
5222
  duplicatedFilters.push({
@@ -5189,7 +5224,7 @@ function processFilter(formattedFilters, duplicatedFilters, filter) {
5189
5224
  operator: reverseScopeFilterOperatorMap[filter.operator],
5190
5225
  value: filter.value,
5191
5226
  values: (_b = filter.values) != null ? _b : [filter.value],
5192
- origin: FilterOrigin.Scopes
5227
+ origin: "scope"
5193
5228
  });
5194
5229
  }
5195
5230
  }
@@ -5221,11 +5256,6 @@ function canValueBeMerged(adHocFilterOperator, filterOperator) {
5221
5256
  return true;
5222
5257
  }
5223
5258
 
5224
- var FilterOrigin = /* @__PURE__ */ ((FilterOrigin2) => {
5225
- FilterOrigin2["Scopes"] = "scopes";
5226
- FilterOrigin2["Dashboards"] = "dashboards";
5227
- return FilterOrigin2;
5228
- })(FilterOrigin || {});
5229
5259
  const OPERATORS = [
5230
5260
  {
5231
5261
  value: "=",
@@ -5266,7 +5296,7 @@ const OPERATORS = [
5266
5296
  ];
5267
5297
  class AdHocFiltersVariable extends SceneObjectBase {
5268
5298
  constructor(state) {
5269
- var _a, _b, _c, _d, _e;
5299
+ var _a, _b, _c, _d, _e, _f;
5270
5300
  super({
5271
5301
  type: "adhoc",
5272
5302
  name: (_a = state.name) != null ? _a : "Filters",
@@ -5281,6 +5311,10 @@ class AdHocFiltersVariable extends SceneObjectBase {
5281
5311
  });
5282
5312
  this._scopedVars = { __sceneObject: wrapInSafeSerializableSceneObject(this) };
5283
5313
  this._dataSourceSrv = runtime.getDataSourceSrv();
5314
+ // holds the originalValues of all baseFilters in a map. The values
5315
+ // are set on construct and used to restore a baseFilter with an origin
5316
+ // to its original value if edited at some point
5317
+ this._originalValues = /* @__PURE__ */ new Map();
5284
5318
  this._urlSync = new AdHocFiltersVariableUrlSyncHandler(this);
5285
5319
  this._activationHandler = () => {
5286
5320
  var _a, _b;
@@ -5290,52 +5324,75 @@ class AdHocFiltersVariable extends SceneObjectBase {
5290
5324
  this._updateScopesFilters(scopes);
5291
5325
  }
5292
5326
  const sub = (_b = this._scopesBridge) == null ? void 0 : _b.subscribeToValue((n, _) => {
5293
- var _a2;
5294
- this._updateScopesFilters(n, (_a2 = this._scopesBridge) == null ? void 0 : _a2.isLoading());
5327
+ this._updateScopesFilters(n);
5295
5328
  });
5296
5329
  return () => {
5330
+ var _a2, _b2;
5297
5331
  sub == null ? void 0 : sub.unsubscribe();
5298
- };
5299
- };
5300
- this._updateScopesFilters = (scopes, areScopesLoading) => {
5301
- var _a, _b;
5302
- if (!scopes.length) {
5303
- this.setState({
5304
- baseFilters: (_a = this.state.baseFilters) == null ? void 0 : _a.filter((filter) => filter.origin !== "scopes" /* Scopes */)
5305
- });
5306
- return;
5307
- }
5308
- const scopeFilters = getAdHocFiltersFromScopes(scopes);
5309
- let finalFilters = scopeFilters;
5310
- const scopeInjectedFilters = [];
5311
- const remainingFilters = [];
5312
- (_b = this.state.baseFilters) == null ? void 0 : _b.forEach((filter) => {
5313
- if (filter.origin === "scopes" /* Scopes */) {
5314
- scopeInjectedFilters.push(filter);
5315
- } else {
5316
- remainingFilters.push(filter);
5332
+ if ((_a2 = this.state.baseFilters) == null ? void 0 : _a2.length) {
5333
+ this.setState({
5334
+ baseFilters: [...this.state.baseFilters.filter((filter) => filter.origin !== "scope")]
5335
+ });
5336
+ (_b2 = this.state.baseFilters) == null ? void 0 : _b2.forEach((filter) => {
5337
+ if (filter.origin === "dashboard" && filter.restorable) {
5338
+ this.restoreOriginalFilter(filter);
5339
+ }
5340
+ });
5317
5341
  }
5318
- });
5319
- if (!scopeFilters.length) {
5320
- return;
5321
- }
5322
- const editedScopeFilters = scopeInjectedFilters.filter((filter) => {
5323
- var _a2;
5324
- return (_a2 = filter.originalValue) == null ? void 0 : _a2.length;
5325
- });
5326
- const editedScopeFilterKeys = editedScopeFilters.map((filter) => filter.key);
5327
- const scopeFilterKeys = scopeFilters.map((filter) => filter.key);
5328
- finalFilters = [
5329
- ...editedScopeFilters.filter((filter) => scopeFilterKeys.includes(filter.key)),
5330
- ...scopeFilters.filter((filter) => !editedScopeFilterKeys.includes(filter.key))
5331
- ];
5332
- this.setState({ baseFilters: [...remainingFilters, ...finalFilters] });
5342
+ };
5333
5343
  };
5334
5344
  if (this.state.applyMode === "auto") {
5335
5345
  patchGetAdhocFilters(this);
5336
5346
  }
5347
+ (_f = this.state.baseFilters) == null ? void 0 : _f.forEach((baseFilter) => {
5348
+ var _a2;
5349
+ if (baseFilter.origin === "dashboard") {
5350
+ this._originalValues.set(baseFilter.key, {
5351
+ operator: baseFilter.operator,
5352
+ value: (_a2 = baseFilter.values) != null ? _a2 : [baseFilter.value]
5353
+ });
5354
+ }
5355
+ });
5337
5356
  this.addActivationHandler(this._activationHandler);
5338
5357
  }
5358
+ _updateScopesFilters(scopes) {
5359
+ var _a, _b;
5360
+ if (!scopes.length) {
5361
+ this.setState({
5362
+ baseFilters: (_a = this.state.baseFilters) == null ? void 0 : _a.filter((filter) => filter.origin !== "scope")
5363
+ });
5364
+ return;
5365
+ }
5366
+ const scopeFilters = getAdHocFiltersFromScopes(scopes);
5367
+ if (!scopeFilters.length) {
5368
+ return;
5369
+ }
5370
+ let finalFilters = scopeFilters;
5371
+ const scopeInjectedFilters = [];
5372
+ const remainingFilters = [];
5373
+ finalFilters.forEach((scopeFilter) => {
5374
+ var _a2;
5375
+ this._originalValues.set(scopeFilter.key, {
5376
+ value: (_a2 = scopeFilter.values) != null ? _a2 : [scopeFilter.value],
5377
+ operator: scopeFilter.operator
5378
+ });
5379
+ });
5380
+ (_b = this.state.baseFilters) == null ? void 0 : _b.forEach((filter) => {
5381
+ if (filter.origin === "scope") {
5382
+ scopeInjectedFilters.push(filter);
5383
+ } else {
5384
+ remainingFilters.push(filter);
5385
+ }
5386
+ });
5387
+ const editedScopeFilters = scopeInjectedFilters.filter((filter) => filter.restorable);
5388
+ const editedScopeFilterKeys = editedScopeFilters.map((filter) => filter.key);
5389
+ const scopeFilterKeys = scopeFilters.map((filter) => filter.key);
5390
+ finalFilters = [
5391
+ ...editedScopeFilters.filter((filter) => scopeFilterKeys.includes(filter.key)),
5392
+ ...scopeFilters.filter((filter) => !editedScopeFilterKeys.includes(filter.key))
5393
+ ];
5394
+ this.setState({ baseFilters: [...finalFilters, ...remainingFilters] });
5395
+ }
5339
5396
  setState(update) {
5340
5397
  var _a, _b, _c;
5341
5398
  let filterExpressionChanged = false;
@@ -5378,14 +5435,16 @@ class AdHocFiltersVariable extends SceneObjectBase {
5378
5435
  }
5379
5436
  }
5380
5437
  restoreOriginalFilter(filter) {
5381
- var _a;
5382
5438
  const original = {
5383
- originalValue: void 0
5439
+ matchAllFilter: false,
5440
+ restorable: false
5384
5441
  };
5385
- if ((_a = filter.originalValue) == null ? void 0 : _a.length) {
5386
- original.value = filter.originalValue[0];
5387
- original.values = filter.originalValue;
5388
- original.valueLabels = filter.originalValue;
5442
+ if (filter.restorable) {
5443
+ const originalFilter = this._originalValues.get(filter.key);
5444
+ original.value = originalFilter == null ? void 0 : originalFilter.value[0];
5445
+ original.values = originalFilter == null ? void 0 : originalFilter.value;
5446
+ original.valueLabels = originalFilter == null ? void 0 : originalFilter.value;
5447
+ original.operator = originalFilter == null ? void 0 : originalFilter.operator;
5389
5448
  }
5390
5449
  this._updateFilter(filter, original);
5391
5450
  }
@@ -5396,14 +5455,13 @@ class AdHocFiltersVariable extends SceneObjectBase {
5396
5455
  var _a;
5397
5456
  const { baseFilters, filters, _wip } = this.state;
5398
5457
  if (filter.origin) {
5399
- const currentValues = filter.values ? filter.values : [filter.value];
5458
+ const originalValues = this._originalValues.get(filter.key);
5400
5459
  const updateValues = update.values || (update.value ? [update.value] : void 0);
5401
- const originalValueOverride = update.hasOwnProperty("originalValue");
5402
- if (!originalValueOverride && updateValues && !filter.originalValue && !lodash.isEqual(currentValues, updateValues)) {
5403
- update.originalValue = currentValues;
5404
- }
5405
- if (!originalValueOverride && lodash.isEqual(updateValues, filter.originalValue)) {
5406
- update.originalValue = void 0;
5460
+ const isRestorableOverride = update.hasOwnProperty("restorable");
5461
+ if (!isRestorableOverride && (updateValues && !lodash.isEqual(updateValues, originalValues == null ? void 0 : originalValues.value) || update.operator && update.operator !== (originalValues == null ? void 0 : originalValues.operator))) {
5462
+ update.restorable = true;
5463
+ } else if (updateValues && lodash.isEqual(updateValues, originalValues == null ? void 0 : originalValues.value)) {
5464
+ update.restorable = false;
5407
5465
  }
5408
5466
  const updatedBaseFilters = (_a = baseFilters == null ? void 0 : baseFilters.map((f) => {
5409
5467
  return f === filter ? { ...f, ...update } : f;
@@ -5424,6 +5482,16 @@ class AdHocFiltersVariable extends SceneObjectBase {
5424
5482
  });
5425
5483
  this.setState({ filters: updatedFilters });
5426
5484
  }
5485
+ updateToMatchAll(filter) {
5486
+ this._updateFilter(filter, {
5487
+ operator: "=~",
5488
+ value: ".*",
5489
+ values: [".*"],
5490
+ valueLabels: ["All"],
5491
+ matchAllFilter: true,
5492
+ restorable: true
5493
+ });
5494
+ }
5427
5495
  _removeFilter(filter) {
5428
5496
  if (filter === this.state._wip) {
5429
5497
  this.setState({ _wip: void 0 });
@@ -5542,7 +5610,7 @@ class AdHocFiltersVariable extends SceneObjectBase {
5542
5610
  const timeRange = sceneGraph.getTimeRange(this).state.value;
5543
5611
  const queries = this.state.useQueriesAsFilterForOptions ? getQueriesForVariables(this) : void 0;
5544
5612
  let scopes = (_e = this._scopesBridge) == null ? void 0 : _e.getValue();
5545
- if (filter.origin === "scopes" /* Scopes */) {
5613
+ if (filter.origin === "scope") {
5546
5614
  scopes = scopes == null ? void 0 : scopes.map((scope) => {
5547
5615
  return {
5548
5616
  ...scope,
@@ -5629,6 +5697,9 @@ function toSelectableValue(input) {
5629
5697
  }
5630
5698
  return result;
5631
5699
  }
5700
+ function isMatchAllFilter(filter) {
5701
+ return filter.operator === "=~" && filter.value === ".*";
5702
+ }
5632
5703
  function isFilterComplete(filter) {
5633
5704
  return filter.key !== "" && filter.operator !== "" && filter.value !== "";
5634
5705
  }
@@ -13896,7 +13967,6 @@ exports.EmbeddedScene = EmbeddedScene;
13896
13967
  exports.FieldConfigBuilder = FieldConfigBuilder;
13897
13968
  exports.FieldConfigBuilders = FieldConfigBuilders;
13898
13969
  exports.FieldConfigOverridesBuilder = FieldConfigOverridesBuilder;
13899
- exports.FilterOrigin = FilterOrigin;
13900
13970
  exports.GroupByVariable = GroupByVariable;
13901
13971
  exports.IntervalVariable = IntervalVariable;
13902
13972
  exports.LazyLoader = LazyLoader;