@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.
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFilterPill.js +38 -16
- package/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFilterPill.js.map +1 -1
- package/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersCombobox.js +3 -0
- package/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersCombobox.js.map +1 -1
- package/dist/esm/variables/adhoc/AdHocFiltersVariable.js +93 -57
- package/dist/esm/variables/adhoc/AdHocFiltersVariable.js.map +1 -1
- package/dist/esm/variables/adhoc/AdHocFiltersVariableUrlSyncHandler.js +30 -19
- package/dist/esm/variables/adhoc/AdHocFiltersVariableUrlSyncHandler.js.map +1 -1
- package/dist/esm/variables/adhoc/getAdHocFiltersFromScopes.js +2 -3
- package/dist/esm/variables/adhoc/getAdHocFiltersFromScopes.js.map +1 -1
- package/dist/index.d.ts +6 -6
- package/dist/index.js +163 -93
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -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
|
|
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":"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"}
|
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
|
-
|
|
862
|
+
matchAllFilter?: boolean;
|
|
863
863
|
readOnly?: boolean;
|
|
864
|
+
restorable?: boolean;
|
|
864
865
|
}
|
|
865
866
|
type AdHocControlsLayout = ControlsLayout | 'combobox';
|
|
866
|
-
|
|
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,
|
|
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.
|
|
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
|
-
|
|
3806
|
-
|
|
3807
|
-
|
|
3808
|
-
|
|
3809
|
-
|
|
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,
|
|
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
|
-
|
|
3855
|
-
|
|
3865
|
+
...isFilterOrigin(origin) && { origin },
|
|
3866
|
+
...!!restorable && { restorable: true }
|
|
3856
3867
|
};
|
|
3857
3868
|
}
|
|
3858
3869
|
function isFilterOrigin(value) {
|
|
3859
|
-
return value ===
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
4991
|
-
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
5301
|
-
|
|
5302
|
-
|
|
5303
|
-
|
|
5304
|
-
|
|
5305
|
-
|
|
5306
|
-
|
|
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
|
-
|
|
5439
|
+
matchAllFilter: false,
|
|
5440
|
+
restorable: false
|
|
5384
5441
|
};
|
|
5385
|
-
if (
|
|
5386
|
-
|
|
5387
|
-
original.
|
|
5388
|
-
original.
|
|
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
|
|
5458
|
+
const originalValues = this._originalValues.get(filter.key);
|
|
5400
5459
|
const updateValues = update.values || (update.value ? [update.value] : void 0);
|
|
5401
|
-
const
|
|
5402
|
-
if (!
|
|
5403
|
-
update.
|
|
5404
|
-
}
|
|
5405
|
-
|
|
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 === "
|
|
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;
|