@grafana/scenes 6.28.2--canary.1194.16495109548.0 → 6.28.2--canary.1195.16517016489.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/behaviors/SceneRenderProfiler.js +26 -9
- package/dist/esm/behaviors/SceneRenderProfiler.js.map +1 -1
- package/dist/esm/components/SceneRefreshPicker.js +3 -2
- package/dist/esm/components/SceneRefreshPicker.js.map +1 -1
- package/dist/esm/components/VizPanel/VizPanel.js +1 -1
- package/dist/esm/components/VizPanel/VizPanel.js.map +1 -1
- package/dist/esm/core/SceneTimeRange.js +3 -2
- package/dist/esm/core/SceneTimeRange.js.map +1 -1
- package/dist/esm/utils/getDataSource.js +2 -1
- package/dist/esm/utils/getDataSource.js.map +1 -1
- package/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersCombobox.js +37 -19
- package/dist/esm/variables/adhoc/AdHocFiltersCombobox/AdHocFiltersCombobox.js.map +1 -1
- package/dist/esm/variables/adhoc/AdHocFiltersVariable.js +6 -0
- package/dist/esm/variables/adhoc/AdHocFiltersVariable.js.map +1 -1
- package/dist/esm/variables/components/VariableValueSelect.js +3 -2
- package/dist/esm/variables/components/VariableValueSelect.js.map +1 -1
- package/dist/esm/variables/variants/ScopesVariable.js +4 -0
- package/dist/esm/variables/variants/ScopesVariable.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +74 -34
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdHocFiltersVariable.js","sources":["../../../../src/variables/adhoc/AdHocFiltersVariable.tsx"],"sourcesContent":["import React from 'react';\nimport {\n AdHocVariableFilter,\n GetTagResponse,\n GrafanaTheme2,\n MetricFindValue,\n // @ts-expect-error (temporary till we update grafana/data)\n FiltersApplicability,\n Scope,\n SelectableValue,\n} from '@grafana/data';\nimport { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { SceneVariable, SceneVariableState, SceneVariableValueChangedEvent, VariableValue } from '../types';\nimport { ControlsLayout, SceneComponentProps } from '../../core/types';\nimport { DataSourceRef } from '@grafana/schema';\nimport { dataFromResponse, getQueriesForVariables, renderPrometheusLabelFilters, responseHasError } from '../utils';\nimport { patchGetAdhocFilters } from './patchGetAdhocFilters';\nimport { useStyles2 } from '@grafana/ui';\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { AdHocFilterBuilder } from './AdHocFilterBuilder';\nimport { AdHocFilterRenderer } from './AdHocFilterRenderer';\nimport { getDataSourceSrv } from '@grafana/runtime';\nimport { AdHocFiltersVariableUrlSyncHandler } from './AdHocFiltersVariableUrlSyncHandler';\nimport { css } from '@emotion/css';\nimport { getEnrichedFiltersRequest } from '../getEnrichedFiltersRequest';\nimport { AdHocFiltersComboboxRenderer } from './AdHocFiltersCombobox/AdHocFiltersComboboxRenderer';\nimport { wrapInSafeSerializableSceneObject } from '../../utils/wrapInSafeSerializableSceneObject';\nimport { isEqual } from 'lodash';\nimport { getAdHocFiltersFromScopes } from './getAdHocFiltersFromScopes';\nimport { VariableDependencyConfig } from '../VariableDependencyConfig';\n\nexport interface AdHocFilterWithLabels<M extends Record<string, any> = {}> extends AdHocVariableFilter {\n keyLabel?: string;\n valueLabels?: string[];\n // this is used to externally trigger edit mode in combobox filter UI\n forceEdit?: boolean;\n // hide the filter from AdHocFiltersVariableRenderer and the URL\n hidden?: boolean;\n meta?: M;\n // filter origin, it can be either scopes, dashboards or undefined,\n // which means it won't appear in the UI\n origin?: FilterOrigin;\n // whether this is basically a cancelled filter through filter-key =~ .*\n matchAllFilter?: boolean;\n // whether this specific filter is read-only and cannot be edited\n readOnly?: boolean;\n // whether this specific filter is restorable to some value from _originalValues\n restorable?: boolean;\n // sets this filter as non-applicable\n nonApplicable?: boolean;\n // reason with reason for nonApplicable filters\n nonApplicableReason?: string;\n}\n\nexport type AdHocControlsLayout = ControlsLayout | 'combobox';\n\nexport type FilterOrigin = 'dashboard' | 'scope' | string;\n\nexport interface AdHocFiltersVariableState extends SceneVariableState {\n /** Optional text to display on the 'add filter' button */\n addFilterButtonText?: string;\n /** The visible filters */\n filters: AdHocFilterWithLabels[];\n /** Base filters to always apply when looking up keys*/\n baseFilters?: AdHocFilterWithLabels[];\n /** Filters originated from a source */\n originFilters?: AdHocFilterWithLabels[];\n /** Datasource to use for getTagKeys and getTagValues and also controls which scene queries the filters should apply to */\n datasource: DataSourceRef | null;\n /** Controls if the filters can be changed */\n readOnly?: boolean;\n /**\n * @experimental\n * Controls the layout and design of the label.\n */\n layout?: AdHocControlsLayout;\n /**\n * Defaults to automatic which means filters will automatically be applied to all queries with the same data source as this AdHocFilterSet.\n * In manual mode you either have to use the filters programmatically or as a variable inside query expressions.\n */\n applyMode: 'auto' | 'manual';\n /**\n * Filter out the keys that do not match the regex.\n */\n tagKeyRegexFilter?: RegExp;\n /**\n * Extension hook for customizing the key lookup.\n * Return replace: true if you want to override the default lookup\n * Return replace: false if you want to combine the results with the default lookup\n */\n getTagKeysProvider?: getTagKeysProvider;\n /**\n * Extension hook for customizing the value lookup.\n * Return replace: true if you want to override the default lookup.\n * Return replace: false if you want to combine the results with the default lookup\n */\n getTagValuesProvider?: getTagValuesProvider;\n\n /**\n * Optionally provide an array of static keys that override getTagKeys\n */\n defaultKeys?: MetricFindValue[];\n\n /**\n * This is the expression that the filters resulted in. Defaults to\n * Prometheus / Loki compatible label filter expression\n */\n filterExpression?: string;\n\n /**\n * The default builder creates a Prometheus/Loki compatible filter expression,\n * this can be overridden to create a different expression based on the current filters.\n */\n expressionBuilder?: AdHocVariableExpressionBuilderFn;\n\n /**\n * Whether the filter supports new multi-value operators like =| and !=|\n */\n supportsMultiValueOperators?: boolean;\n\n /**\n * When querying the datasource for label names and values to determine keys and values\n * for this ad hoc filter, consider the queries in the scene and use them as a filter.\n * This queries filter can be used to ensure that only ad hoc filter options that would\n * impact the current queries are presented to the user.\n */\n useQueriesAsFilterForOptions?: boolean;\n\n /**\n * Flag that decides whether custom values can be added to the filter\n */\n allowCustomValue?: boolean;\n\n /**\n * @internal state of the new filter being added\n */\n _wip?: AdHocFilterWithLabels;\n\n /**\n * Allows custom formatting of a value before saving to filter state\n */\n onAddCustomValue?: OnAddCustomValueFn;\n}\n\nexport type AdHocVariableExpressionBuilderFn = (filters: AdHocFilterWithLabels[]) => string;\nexport type OnAddCustomValueFn = (\n item: SelectableValue<string> & { isCustom?: boolean },\n filter: AdHocFilterWithLabels\n) => { value: string | undefined; valueLabels: string[] };\n\nexport type getTagKeysProvider = (\n variable: AdHocFiltersVariable,\n currentKey: string | null,\n operators?: OperatorDefinition[]\n) => Promise<{ replace?: boolean; values: GetTagResponse | MetricFindValue[] }>;\n\nexport type getTagValuesProvider = (\n variable: AdHocFiltersVariable,\n filter: AdHocFilterWithLabels\n) => Promise<{ replace?: boolean; values: GetTagResponse | MetricFindValue[] }>;\n\nexport type AdHocFiltersVariableCreateHelperArgs = AdHocFiltersVariableState;\n\nexport type OperatorDefinition = {\n value: string;\n description?: string;\n isMulti?: Boolean;\n isRegex?: Boolean;\n};\n\nexport const OPERATORS: OperatorDefinition[] = [\n {\n value: '=',\n description: 'Equals',\n },\n {\n value: '!=',\n description: 'Not equal',\n },\n {\n value: '=|',\n description: 'One of. Use to filter on multiple values.',\n isMulti: true,\n },\n {\n value: '!=|',\n description: 'Not one of. Use to exclude multiple values.',\n isMulti: true,\n },\n {\n value: '=~',\n description: 'Matches regex',\n isRegex: true,\n },\n {\n value: '!~',\n description: 'Does not match regex',\n isRegex: true,\n },\n {\n value: '<',\n description: 'Less than',\n },\n {\n value: '>',\n description: 'Greater than',\n },\n];\n\ninterface OriginalValue {\n value: string[];\n operator: string;\n nonApplicable?: boolean;\n nonApplicableReason?: string;\n}\n\nexport class AdHocFiltersVariable\n extends SceneObjectBase<AdHocFiltersVariableState>\n implements SceneVariable<AdHocFiltersVariableState>\n{\n static Component = AdHocFiltersVariableRenderer;\n\n private _scopedVars = { __sceneObject: wrapInSafeSerializableSceneObject(this) };\n private _dataSourceSrv = getDataSourceSrv();\n // holds the originalValues of all baseFilters in a map. The values\n // are set on construct and used to restore a baseFilter with an origin\n // to its original value if edited at some point\n private _originalValues: Map<string, OriginalValue> = new Map();\n private _prevScopes: Scope[] = [];\n\n /** Needed for scopes dependency */\n protected _variableDependency = new VariableDependencyConfig(this, {\n dependsOnScopes: true,\n onReferencedVariableValueChanged: () => this._updateScopesFilters(),\n });\n\n protected _urlSync = new AdHocFiltersVariableUrlSyncHandler(this);\n\n public constructor(state: Partial<AdHocFiltersVariableState>) {\n super({\n type: 'adhoc',\n name: state.name ?? 'Filters',\n filters: [],\n datasource: null,\n applyMode: 'auto',\n filterExpression:\n state.filterExpression ??\n renderExpression(state.expressionBuilder, [...(state.originFilters ?? []), ...(state.filters ?? [])]),\n ...state,\n });\n\n if (this.state.applyMode === 'auto') {\n patchGetAdhocFilters(this);\n }\n\n this.state.originFilters?.forEach((filter) => {\n this._originalValues.set(`${filter.key}-${filter.origin}`, {\n operator: filter.operator,\n value: filter.values ?? [filter.value],\n });\n });\n\n this.addActivationHandler(this._activationHandler);\n }\n\n private _activationHandler = () => {\n this._setStateWithFiltersApplicabilityCheck({\n filters: this.state.filters,\n originFilters: this.state.originFilters,\n });\n\n return () => {\n this.state.originFilters?.forEach((filter) => {\n if (filter.restorable) {\n this.restoreOriginalFilter(filter);\n }\n });\n };\n };\n\n private _updateScopesFilters() {\n const scopes = sceneGraph.getScopes(this);\n\n if (!scopes || !scopes.length) {\n this.setState({\n originFilters: this.state.originFilters?.filter((filter) => filter.origin !== 'scope'),\n });\n return;\n }\n\n const scopeFilters = getAdHocFiltersFromScopes(scopes);\n\n if (!scopeFilters.length) {\n return;\n }\n\n let finalFilters = scopeFilters;\n const scopeInjectedFilters: AdHocFilterWithLabels[] = [];\n const remainingFilters: AdHocFilterWithLabels[] = [];\n\n // set original values for scope filters as well\n finalFilters.forEach((scopeFilter) => {\n this._originalValues.set(`${scopeFilter.key}-${scopeFilter.origin}`, {\n value: scopeFilter.values ?? [scopeFilter.value],\n operator: scopeFilter.operator,\n });\n });\n\n this.state.originFilters?.forEach((filter) => {\n if (filter.origin === 'scope') {\n scopeInjectedFilters.push(filter);\n } else {\n remainingFilters.push(filter);\n }\n });\n\n if (this._prevScopes.length) {\n this.setState({ originFilters: [...finalFilters, ...remainingFilters] });\n this._prevScopes = scopes;\n return;\n }\n\n const editedScopeFilters = scopeInjectedFilters.filter((filter) => filter.restorable);\n const editedScopeFilterKeys = editedScopeFilters.map((filter) => filter.key);\n const scopeFilterKeys = scopeFilters.map((filter) => filter.key);\n\n // if the scope filters contain the key of an edited scope filter, we replace\n // with the edited filter. We also add the remaining unedited scope filters\n // when not overwriting\n finalFilters = [\n ...editedScopeFilters.filter((filter) => scopeFilterKeys.includes(filter.key)),\n ...scopeFilters.filter((filter) => !editedScopeFilterKeys.includes(filter.key)),\n ];\n\n // maintain other originFilters in the array, only update scopes ones\n this._setStateWithFiltersApplicabilityCheck({\n filters: this.state.filters,\n originFilters: [...finalFilters, ...remainingFilters],\n });\n this._prevScopes = scopes;\n }\n\n public setState(update: Partial<AdHocFiltersVariableState>): void {\n let filterExpressionChanged = false;\n\n if (\n ((update.filters && update.filters !== this.state.filters) ||\n (update.originFilters && update.originFilters !== this.state.originFilters)) &&\n !update.filterExpression\n ) {\n const filters = update.filters ?? this.state.filters;\n const originFilters = update.originFilters ?? this.state.originFilters;\n\n update.filterExpression = renderExpression(this.state.expressionBuilder, [...(originFilters ?? []), ...filters]);\n filterExpressionChanged = update.filterExpression !== this.state.filterExpression;\n }\n\n super.setState(update);\n\n if (filterExpressionChanged) {\n this.publishEvent(new SceneVariableValueChangedEvent(this), true);\n }\n }\n\n /**\n * Updates the variable's `filters` and `filterExpression` state.\n * If `skipPublish` option is true, this will not emit the `SceneVariableValueChangedEvent`,\n * allowing consumers to update the filters without triggering dependent data providers.\n */\n public updateFilters(\n filters: AdHocFilterWithLabels[],\n options?: {\n skipPublish?: boolean;\n forcePublish?: boolean;\n }\n ): void {\n let filterExpressionChanged = false;\n let filterExpression: string | undefined = undefined;\n\n if (filters && filters !== this.state.filters) {\n filterExpression = renderExpression(this.state.expressionBuilder, [\n ...(this.state.originFilters ?? []),\n ...filters,\n ]);\n filterExpressionChanged = filterExpression !== this.state.filterExpression;\n }\n\n super.setState({\n filters,\n filterExpression,\n });\n\n if ((filterExpressionChanged && options?.skipPublish !== true) || options?.forcePublish) {\n this.publishEvent(new SceneVariableValueChangedEvent(this), true);\n }\n }\n\n public restoreOriginalFilter(filter: AdHocFilterWithLabels) {\n const original: Partial<AdHocFilterWithLabels> = {\n matchAllFilter: false,\n restorable: false,\n };\n\n if (filter.restorable) {\n const originalFilter = this._originalValues.get(`${filter.key}-${filter.origin}`);\n\n if (!originalFilter) {\n return;\n }\n\n original.value = originalFilter?.value[0];\n original.values = originalFilter?.value;\n original.valueLabels = originalFilter?.value;\n original.operator = originalFilter?.operator;\n original.nonApplicable = originalFilter?.nonApplicable;\n\n this._updateFilter(filter, original);\n }\n }\n\n public getValue(): VariableValue | undefined {\n return this.state.filterExpression;\n }\n\n public _updateFilter(filter: AdHocFilterWithLabels, update: Partial<AdHocFilterWithLabels>) {\n const { originFilters, filters, _wip } = this.state;\n\n if (filter.origin) {\n const originalValues = this._originalValues.get(`${filter.key}-${filter.origin}`);\n const updateValues = update.values || (update.value ? [update.value] : undefined);\n\n if (\n (updateValues && !isEqual(updateValues, originalValues?.value)) ||\n (update.operator && update.operator !== originalValues?.operator)\n ) {\n update.restorable = true;\n } else if (updateValues && isEqual(updateValues, originalValues?.value)) {\n update.restorable = false;\n }\n\n const updatedFilters =\n originFilters?.map((f) => {\n return f === filter ? { ...f, ...update } : f;\n }) ?? [];\n this.setState({ originFilters: updatedFilters });\n\n return;\n }\n\n if (filter === _wip) {\n // If we set value we are done with this \"work in progress\" filter and we can add it\n if ('value' in update && update['value'] !== '') {\n this._setStateWithFiltersApplicabilityCheck({\n filters: [...filters, { ..._wip, ...update }],\n originFilters: this.state.originFilters,\n _wip: undefined,\n });\n } else {\n this.setState({ _wip: { ...filter, ...update } });\n }\n return;\n }\n\n const updatedFilters = this.state.filters.map((f) => {\n return f === filter ? { ...f, ...update } : f;\n });\n\n this.setState({ filters: updatedFilters });\n }\n\n public updateToMatchAll(filter: AdHocFilterWithLabels) {\n this._updateFilter(filter, {\n operator: '=~',\n value: '.*',\n values: ['.*'],\n valueLabels: ['All'],\n matchAllFilter: true,\n nonApplicable: false,\n restorable: true,\n });\n }\n\n public _removeFilter(filter: AdHocFilterWithLabels) {\n if (filter === this.state._wip) {\n this.setState({ _wip: undefined });\n return;\n }\n\n this._setStateWithFiltersApplicabilityCheck({\n filters: this.state.filters.filter((f) => f !== filter),\n originFilters: this.state.originFilters,\n });\n }\n\n public _removeLastFilter() {\n const filterToRemove = this.state.filters.at(-1);\n\n if (filterToRemove) {\n this._removeFilter(filterToRemove);\n }\n }\n\n public _handleComboboxBackspace(filter: AdHocFilterWithLabels) {\n if (this.state.filters.length) {\n // default forceEdit last filter (when triggering from wip filter)\n let filterToForceIndex = this.state.filters.length - 1;\n\n // adjust filterToForceIndex index to -1 if backspace triggered from non wip filter\n // to avoid triggering forceEdit logic\n if (filter !== this.state._wip) {\n filterToForceIndex = -1;\n }\n\n this.setState({\n filters: this.state.filters.reduce<AdHocFilterWithLabels[]>((acc, f, index) => {\n // adjust forceEdit of preceding filter if not readOnly\n if (index === filterToForceIndex && !f.readOnly) {\n return [\n ...acc,\n {\n ...f,\n forceEdit: true,\n },\n ];\n }\n // remove current filter\n if (f === filter) {\n return acc;\n }\n\n return [...acc, f];\n }, []),\n });\n } else if (this.state.originFilters?.length) {\n // default forceEdit last filter (when triggering from wip filter)\n let filterToForceIndex = this.state.originFilters.length - 1;\n\n // adjust filterToForceIndex index to -1 if backspace triggered from non wip filter\n // to avoid triggering forceEdit logic\n if (filter !== this.state._wip) {\n filterToForceIndex = -1;\n }\n\n this.setState({\n originFilters: this.state.originFilters.reduce<AdHocFilterWithLabels[]>((acc, f, index) => {\n // adjust forceEdit of preceding filter\n if (index === filterToForceIndex && !f.readOnly) {\n return [\n ...acc,\n {\n ...f,\n forceEdit: true,\n },\n ];\n }\n // remove current filter\n if (f === filter) {\n return acc;\n }\n\n return [...acc, f];\n }, []),\n });\n }\n }\n\n public async _setStateWithFiltersApplicabilityCheck(update: Partial<AdHocFiltersVariableState>) {\n const ds = await this._dataSourceSrv.get(this.state.datasource, this._scopedVars);\n // @ts-expect-error (temporary till we update grafana/data)\n if (!ds || !ds.getFiltersApplicability) {\n this.setState(update);\n return;\n }\n\n if (!update.filters) {\n return;\n }\n\n const timeRange = sceneGraph.getTimeRange(this).state.value;\n const queries = this.state.useQueriesAsFilterForOptions ? getQueriesForVariables(this) : undefined;\n\n // @ts-expect-error (temporary till we update grafana/data)\n const response: FiltersApplicability[] = await ds.getFiltersApplicability({\n filters: [...update.filters, ...(update.originFilters ?? [])],\n queries,\n timeRange,\n scopes: sceneGraph.getScopes(this),\n ...getEnrichedFiltersRequest(this),\n });\n\n const responseMap = new Map<string, FiltersApplicability>();\n response.forEach((filter) => {\n responseMap.set(`${filter.key}${filter.origin ? `-${filter.origin}` : ''}`, filter);\n });\n\n update.filters.forEach((f) => {\n const filter = responseMap.get(f.key);\n\n if (filter) {\n f.nonApplicable = !filter.applicable;\n f.nonApplicableReason = filter.reason;\n }\n });\n\n update.originFilters?.forEach((f) => {\n const filter = responseMap.get(`${f.key}-${f.origin}`);\n\n if (filter) {\n if (!f.matchAllFilter) {\n f.nonApplicable = !filter.applicable;\n f.nonApplicableReason = filter.reason;\n }\n\n const originalValue = this._originalValues.get(`${f.key}-${f.origin}`);\n if (originalValue) {\n originalValue.nonApplicable = !filter.applicable;\n originalValue.nonApplicableReason = filter?.reason;\n }\n }\n });\n\n this.setState(update);\n }\n\n /**\n * Get possible keys given current filters. Do not call from plugins directly\n */\n public async _getKeys(currentKey: string | null): Promise<Array<SelectableValue<string>>> {\n const override = await this.state.getTagKeysProvider?.(this, currentKey);\n\n if (override && override.replace) {\n return dataFromResponse(override.values).map(toSelectableValue);\n }\n\n if (this.state.defaultKeys) {\n return this.state.defaultKeys.map(toSelectableValue);\n }\n\n const ds = await this._dataSourceSrv.get(this.state.datasource, this._scopedVars);\n if (!ds || !ds.getTagKeys) {\n return [];\n }\n\n const applicableOriginFilters = this.state.originFilters?.filter((f) => !f.nonApplicable) ?? [];\n const otherFilters = this.state.filters\n .filter((f) => f.key !== currentKey && !f.nonApplicable)\n .concat(this.state.baseFilters ?? [])\n .concat(applicableOriginFilters);\n const timeRange = sceneGraph.getTimeRange(this).state.value;\n const queries = this.state.useQueriesAsFilterForOptions ? getQueriesForVariables(this) : undefined;\n const response = await ds.getTagKeys({\n filters: otherFilters,\n queries,\n timeRange,\n scopes: sceneGraph.getScopes(this),\n ...getEnrichedFiltersRequest(this),\n });\n\n if (responseHasError(response)) {\n this.setState({ error: response.error.message });\n }\n\n let keys = dataFromResponse(response);\n if (override) {\n keys = keys.concat(dataFromResponse(override.values));\n }\n\n const tagKeyRegexFilter = this.state.tagKeyRegexFilter;\n if (tagKeyRegexFilter) {\n keys = keys.filter((f) => f.text.match(tagKeyRegexFilter));\n }\n\n return keys.map(toSelectableValue);\n }\n\n /**\n * Get possible key values for a specific key given current filters. Do not call from plugins directly\n */\n public async _getValuesFor(filter: AdHocFilterWithLabels): Promise<Array<SelectableValue<string>>> {\n const override = await this.state.getTagValuesProvider?.(this, filter);\n\n if (override && override.replace) {\n return dataFromResponse(override.values).map(toSelectableValue);\n }\n\n const ds = await this._dataSourceSrv.get(this.state.datasource, this._scopedVars);\n\n if (!ds || !ds.getTagValues) {\n return [];\n }\n\n const originFilters = this.state.originFilters?.filter((f) => f.key !== filter.key) ?? [];\n // Filter out the current filter key from the list of all filters\n const otherFilters = this.state.filters.filter((f) => f.key !== filter.key).concat(originFilters);\n\n const timeRange = sceneGraph.getTimeRange(this).state.value;\n const queries = this.state.useQueriesAsFilterForOptions ? getQueriesForVariables(this) : undefined;\n\n let scopes = sceneGraph.getScopes(this);\n\n // if current filter is a scope originated one we need to filter out\n // filters with same key in scopes prop, similar to how we do in adhocFilters prop\n if (filter.origin === 'scope') {\n scopes = scopes?.map((scope) => {\n return {\n ...scope,\n spec: {\n ...scope.spec,\n filters: scope.spec.filters.filter((f) => f.key !== filter.key),\n },\n };\n });\n }\n\n const response = await ds.getTagValues({\n key: filter.key,\n filters: otherFilters,\n timeRange,\n queries,\n scopes,\n ...getEnrichedFiltersRequest(this),\n });\n\n if (responseHasError(response)) {\n this.setState({ error: response.error.message });\n }\n\n let values = dataFromResponse(response);\n if (override) {\n values = values.concat(dataFromResponse(override.values));\n }\n\n return values.map(toSelectableValue);\n }\n\n public _addWip() {\n this.setState({\n _wip: { key: '', value: '', operator: '=', condition: '' },\n });\n }\n\n public _getOperators() {\n const { supportsMultiValueOperators, allowCustomValue = true } = this.state;\n\n return OPERATORS.filter(({ isMulti, isRegex }) => {\n if (!supportsMultiValueOperators && isMulti) {\n return false;\n }\n if (!allowCustomValue && isRegex) {\n return false;\n }\n return true;\n }).map<SelectableValue<string>>(({ value, description }) => ({\n label: value,\n value,\n description,\n }));\n }\n}\n\nfunction renderExpression(\n builder: AdHocVariableExpressionBuilderFn | undefined,\n filters: AdHocFilterWithLabels[] | undefined\n) {\n return (builder ?? renderPrometheusLabelFilters)(filters?.filter((f) => isFilterApplicable(f)) ?? []);\n}\n\nexport function AdHocFiltersVariableRenderer({ model }: SceneComponentProps<AdHocFiltersVariable>) {\n const { filters, readOnly, addFilterButtonText } = model.useState();\n const styles = useStyles2(getStyles);\n\n if (model.state.layout === 'combobox') {\n return <AdHocFiltersComboboxRenderer model={model} />;\n }\n\n return (\n <div className={styles.wrapper}>\n {filters\n .filter((filter) => !filter.hidden)\n .map((filter, index) => (\n <React.Fragment key={index}>\n <AdHocFilterRenderer filter={filter} model={model} />\n </React.Fragment>\n ))}\n\n {!readOnly && <AdHocFilterBuilder model={model} key=\"'builder\" addFilterButtonText={addFilterButtonText} />}\n </div>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css({\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'flex-end',\n columnGap: theme.spacing(2),\n rowGap: theme.spacing(1),\n }),\n});\n\nexport function toSelectableValue(input: MetricFindValue): SelectableValue<string> {\n const { text, value } = input;\n const result: SelectableValue<string> = {\n // converting text to string due to some edge cases where it can be a number\n // TODO: remove once https://github.com/grafana/grafana/issues/99021 is closed\n label: String(text),\n value: String(value ?? text),\n };\n\n if ('group' in input) {\n result.group = input.group;\n }\n\n if ('meta' in input) {\n result.meta = input.meta;\n }\n\n return result;\n}\n\nexport function isMatchAllFilter(filter: AdHocFilterWithLabels): boolean {\n return filter.operator === '=~' && filter.value === '.*';\n}\n\nexport function isFilterComplete(filter: AdHocFilterWithLabels): boolean {\n return filter.key !== '' && filter.operator !== '' && filter.value !== '';\n}\n\nexport function isFilterApplicable(filter: AdHocFilterWithLabels): boolean {\n return !filter.nonApplicable;\n}\n\nexport function isMultiValueOperator(operatorValue: string): boolean {\n const operator = OPERATORS.find((o) => o.value === operatorValue);\n if (!operator) {\n // default to false if operator is not found\n return false;\n }\n return Boolean(operator.isMulti);\n}\n"],"names":["_a","updatedFilters"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AdHocFiltersVariable.js","sources":["../../../../src/variables/adhoc/AdHocFiltersVariable.tsx"],"sourcesContent":["import React from 'react';\nimport {\n AdHocVariableFilter,\n GetTagResponse,\n GrafanaTheme2,\n MetricFindValue,\n // @ts-expect-error (temporary till we update grafana/data)\n FiltersApplicability,\n Scope,\n SelectableValue,\n} from '@grafana/data';\nimport { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { SceneVariable, SceneVariableState, SceneVariableValueChangedEvent, VariableValue } from '../types';\nimport { ControlsLayout, SceneComponentProps } from '../../core/types';\nimport { DataSourceRef } from '@grafana/schema';\nimport { dataFromResponse, getQueriesForVariables, renderPrometheusLabelFilters, responseHasError } from '../utils';\nimport { patchGetAdhocFilters } from './patchGetAdhocFilters';\nimport { useStyles2 } from '@grafana/ui';\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { AdHocFilterBuilder } from './AdHocFilterBuilder';\nimport { AdHocFilterRenderer } from './AdHocFilterRenderer';\nimport { getDataSourceSrv } from '@grafana/runtime';\nimport { AdHocFiltersVariableUrlSyncHandler } from './AdHocFiltersVariableUrlSyncHandler';\nimport { css } from '@emotion/css';\nimport { getEnrichedFiltersRequest } from '../getEnrichedFiltersRequest';\nimport { AdHocFiltersComboboxRenderer } from './AdHocFiltersCombobox/AdHocFiltersComboboxRenderer';\nimport { wrapInSafeSerializableSceneObject } from '../../utils/wrapInSafeSerializableSceneObject';\nimport { isEqual } from 'lodash';\nimport { getAdHocFiltersFromScopes } from './getAdHocFiltersFromScopes';\nimport { VariableDependencyConfig } from '../VariableDependencyConfig';\nimport { getQueryController } from '../../core/sceneGraph/getQueryController';\nimport { FILTER_REMOVED_INTERACTION, FILTER_RESTORED_INTERACTION } from '../../behaviors/SceneRenderProfiler';\n\nexport interface AdHocFilterWithLabels<M extends Record<string, any> = {}> extends AdHocVariableFilter {\n keyLabel?: string;\n valueLabels?: string[];\n // this is used to externally trigger edit mode in combobox filter UI\n forceEdit?: boolean;\n // hide the filter from AdHocFiltersVariableRenderer and the URL\n hidden?: boolean;\n meta?: M;\n // filter origin, it can be either scopes, dashboards or undefined,\n // which means it won't appear in the UI\n origin?: FilterOrigin;\n // whether this is basically a cancelled filter through filter-key =~ .*\n matchAllFilter?: boolean;\n // whether this specific filter is read-only and cannot be edited\n readOnly?: boolean;\n // whether this specific filter is restorable to some value from _originalValues\n restorable?: boolean;\n // sets this filter as non-applicable\n nonApplicable?: boolean;\n // reason with reason for nonApplicable filters\n nonApplicableReason?: string;\n}\n\nexport type AdHocControlsLayout = ControlsLayout | 'combobox';\n\nexport type FilterOrigin = 'dashboard' | 'scope' | string;\n\nexport interface AdHocFiltersVariableState extends SceneVariableState {\n /** Optional text to display on the 'add filter' button */\n addFilterButtonText?: string;\n /** The visible filters */\n filters: AdHocFilterWithLabels[];\n /** Base filters to always apply when looking up keys*/\n baseFilters?: AdHocFilterWithLabels[];\n /** Filters originated from a source */\n originFilters?: AdHocFilterWithLabels[];\n /** Datasource to use for getTagKeys and getTagValues and also controls which scene queries the filters should apply to */\n datasource: DataSourceRef | null;\n /** Controls if the filters can be changed */\n readOnly?: boolean;\n /**\n * @experimental\n * Controls the layout and design of the label.\n */\n layout?: AdHocControlsLayout;\n /**\n * Defaults to automatic which means filters will automatically be applied to all queries with the same data source as this AdHocFilterSet.\n * In manual mode you either have to use the filters programmatically or as a variable inside query expressions.\n */\n applyMode: 'auto' | 'manual';\n /**\n * Filter out the keys that do not match the regex.\n */\n tagKeyRegexFilter?: RegExp;\n /**\n * Extension hook for customizing the key lookup.\n * Return replace: true if you want to override the default lookup\n * Return replace: false if you want to combine the results with the default lookup\n */\n getTagKeysProvider?: getTagKeysProvider;\n /**\n * Extension hook for customizing the value lookup.\n * Return replace: true if you want to override the default lookup.\n * Return replace: false if you want to combine the results with the default lookup\n */\n getTagValuesProvider?: getTagValuesProvider;\n\n /**\n * Optionally provide an array of static keys that override getTagKeys\n */\n defaultKeys?: MetricFindValue[];\n\n /**\n * This is the expression that the filters resulted in. Defaults to\n * Prometheus / Loki compatible label filter expression\n */\n filterExpression?: string;\n\n /**\n * The default builder creates a Prometheus/Loki compatible filter expression,\n * this can be overridden to create a different expression based on the current filters.\n */\n expressionBuilder?: AdHocVariableExpressionBuilderFn;\n\n /**\n * Whether the filter supports new multi-value operators like =| and !=|\n */\n supportsMultiValueOperators?: boolean;\n\n /**\n * When querying the datasource for label names and values to determine keys and values\n * for this ad hoc filter, consider the queries in the scene and use them as a filter.\n * This queries filter can be used to ensure that only ad hoc filter options that would\n * impact the current queries are presented to the user.\n */\n useQueriesAsFilterForOptions?: boolean;\n\n /**\n * Flag that decides whether custom values can be added to the filter\n */\n allowCustomValue?: boolean;\n\n /**\n * @internal state of the new filter being added\n */\n _wip?: AdHocFilterWithLabels;\n\n /**\n * Allows custom formatting of a value before saving to filter state\n */\n onAddCustomValue?: OnAddCustomValueFn;\n}\n\nexport type AdHocVariableExpressionBuilderFn = (filters: AdHocFilterWithLabels[]) => string;\nexport type OnAddCustomValueFn = (\n item: SelectableValue<string> & { isCustom?: boolean },\n filter: AdHocFilterWithLabels\n) => { value: string | undefined; valueLabels: string[] };\n\nexport type getTagKeysProvider = (\n variable: AdHocFiltersVariable,\n currentKey: string | null,\n operators?: OperatorDefinition[]\n) => Promise<{ replace?: boolean; values: GetTagResponse | MetricFindValue[] }>;\n\nexport type getTagValuesProvider = (\n variable: AdHocFiltersVariable,\n filter: AdHocFilterWithLabels\n) => Promise<{ replace?: boolean; values: GetTagResponse | MetricFindValue[] }>;\n\nexport type AdHocFiltersVariableCreateHelperArgs = AdHocFiltersVariableState;\n\nexport type OperatorDefinition = {\n value: string;\n description?: string;\n isMulti?: Boolean;\n isRegex?: Boolean;\n};\n\nexport const OPERATORS: OperatorDefinition[] = [\n {\n value: '=',\n description: 'Equals',\n },\n {\n value: '!=',\n description: 'Not equal',\n },\n {\n value: '=|',\n description: 'One of. Use to filter on multiple values.',\n isMulti: true,\n },\n {\n value: '!=|',\n description: 'Not one of. Use to exclude multiple values.',\n isMulti: true,\n },\n {\n value: '=~',\n description: 'Matches regex',\n isRegex: true,\n },\n {\n value: '!~',\n description: 'Does not match regex',\n isRegex: true,\n },\n {\n value: '<',\n description: 'Less than',\n },\n {\n value: '>',\n description: 'Greater than',\n },\n];\n\ninterface OriginalValue {\n value: string[];\n operator: string;\n nonApplicable?: boolean;\n nonApplicableReason?: string;\n}\n\nexport class AdHocFiltersVariable\n extends SceneObjectBase<AdHocFiltersVariableState>\n implements SceneVariable<AdHocFiltersVariableState>\n{\n static Component = AdHocFiltersVariableRenderer;\n\n private _scopedVars = { __sceneObject: wrapInSafeSerializableSceneObject(this) };\n private _dataSourceSrv = getDataSourceSrv();\n // holds the originalValues of all baseFilters in a map. The values\n // are set on construct and used to restore a baseFilter with an origin\n // to its original value if edited at some point\n private _originalValues: Map<string, OriginalValue> = new Map();\n private _prevScopes: Scope[] = [];\n\n /** Needed for scopes dependency */\n protected _variableDependency = new VariableDependencyConfig(this, {\n dependsOnScopes: true,\n onReferencedVariableValueChanged: () => this._updateScopesFilters(),\n });\n\n protected _urlSync = new AdHocFiltersVariableUrlSyncHandler(this);\n\n public constructor(state: Partial<AdHocFiltersVariableState>) {\n super({\n type: 'adhoc',\n name: state.name ?? 'Filters',\n filters: [],\n datasource: null,\n applyMode: 'auto',\n filterExpression:\n state.filterExpression ??\n renderExpression(state.expressionBuilder, [...(state.originFilters ?? []), ...(state.filters ?? [])]),\n ...state,\n });\n\n if (this.state.applyMode === 'auto') {\n patchGetAdhocFilters(this);\n }\n\n this.state.originFilters?.forEach((filter) => {\n this._originalValues.set(`${filter.key}-${filter.origin}`, {\n operator: filter.operator,\n value: filter.values ?? [filter.value],\n });\n });\n\n this.addActivationHandler(this._activationHandler);\n }\n\n private _activationHandler = () => {\n this._setStateWithFiltersApplicabilityCheck({\n filters: this.state.filters,\n originFilters: this.state.originFilters,\n });\n\n return () => {\n this.state.originFilters?.forEach((filter) => {\n if (filter.restorable) {\n this.restoreOriginalFilter(filter);\n }\n });\n };\n };\n\n private _updateScopesFilters() {\n const scopes = sceneGraph.getScopes(this);\n\n if (!scopes || !scopes.length) {\n this.setState({\n originFilters: this.state.originFilters?.filter((filter) => filter.origin !== 'scope'),\n });\n return;\n }\n\n const scopeFilters = getAdHocFiltersFromScopes(scopes);\n\n if (!scopeFilters.length) {\n return;\n }\n\n let finalFilters = scopeFilters;\n const scopeInjectedFilters: AdHocFilterWithLabels[] = [];\n const remainingFilters: AdHocFilterWithLabels[] = [];\n\n // set original values for scope filters as well\n finalFilters.forEach((scopeFilter) => {\n this._originalValues.set(`${scopeFilter.key}-${scopeFilter.origin}`, {\n value: scopeFilter.values ?? [scopeFilter.value],\n operator: scopeFilter.operator,\n });\n });\n\n this.state.originFilters?.forEach((filter) => {\n if (filter.origin === 'scope') {\n scopeInjectedFilters.push(filter);\n } else {\n remainingFilters.push(filter);\n }\n });\n\n if (this._prevScopes.length) {\n this.setState({ originFilters: [...finalFilters, ...remainingFilters] });\n this._prevScopes = scopes;\n return;\n }\n\n const editedScopeFilters = scopeInjectedFilters.filter((filter) => filter.restorable);\n const editedScopeFilterKeys = editedScopeFilters.map((filter) => filter.key);\n const scopeFilterKeys = scopeFilters.map((filter) => filter.key);\n\n // if the scope filters contain the key of an edited scope filter, we replace\n // with the edited filter. We also add the remaining unedited scope filters\n // when not overwriting\n finalFilters = [\n ...editedScopeFilters.filter((filter) => scopeFilterKeys.includes(filter.key)),\n ...scopeFilters.filter((filter) => !editedScopeFilterKeys.includes(filter.key)),\n ];\n\n // maintain other originFilters in the array, only update scopes ones\n this._setStateWithFiltersApplicabilityCheck({\n filters: this.state.filters,\n originFilters: [...finalFilters, ...remainingFilters],\n });\n this._prevScopes = scopes;\n }\n\n public setState(update: Partial<AdHocFiltersVariableState>): void {\n let filterExpressionChanged = false;\n\n if (\n ((update.filters && update.filters !== this.state.filters) ||\n (update.originFilters && update.originFilters !== this.state.originFilters)) &&\n !update.filterExpression\n ) {\n const filters = update.filters ?? this.state.filters;\n const originFilters = update.originFilters ?? this.state.originFilters;\n\n update.filterExpression = renderExpression(this.state.expressionBuilder, [...(originFilters ?? []), ...filters]);\n filterExpressionChanged = update.filterExpression !== this.state.filterExpression;\n }\n\n super.setState(update);\n\n if (filterExpressionChanged) {\n this.publishEvent(new SceneVariableValueChangedEvent(this), true);\n }\n }\n\n /**\n * Updates the variable's `filters` and `filterExpression` state.\n * If `skipPublish` option is true, this will not emit the `SceneVariableValueChangedEvent`,\n * allowing consumers to update the filters without triggering dependent data providers.\n */\n public updateFilters(\n filters: AdHocFilterWithLabels[],\n options?: {\n skipPublish?: boolean;\n forcePublish?: boolean;\n }\n ): void {\n let filterExpressionChanged = false;\n let filterExpression: string | undefined = undefined;\n\n if (filters && filters !== this.state.filters) {\n filterExpression = renderExpression(this.state.expressionBuilder, [\n ...(this.state.originFilters ?? []),\n ...filters,\n ]);\n filterExpressionChanged = filterExpression !== this.state.filterExpression;\n }\n\n super.setState({\n filters,\n filterExpression,\n });\n\n if ((filterExpressionChanged && options?.skipPublish !== true) || options?.forcePublish) {\n this.publishEvent(new SceneVariableValueChangedEvent(this), true);\n }\n }\n\n public restoreOriginalFilter(filter: AdHocFilterWithLabels) {\n const original: Partial<AdHocFilterWithLabels> = {\n matchAllFilter: false,\n restorable: false,\n };\n\n if (filter.restorable) {\n const originalFilter = this._originalValues.get(`${filter.key}-${filter.origin}`);\n\n if (!originalFilter) {\n return;\n }\n\n original.value = originalFilter?.value[0];\n original.values = originalFilter?.value;\n original.valueLabels = originalFilter?.value;\n original.operator = originalFilter?.operator;\n original.nonApplicable = originalFilter?.nonApplicable;\n const queryController = getQueryController(this);\n queryController?.startProfile(FILTER_RESTORED_INTERACTION);\n this._updateFilter(filter, original);\n }\n }\n\n public getValue(): VariableValue | undefined {\n return this.state.filterExpression;\n }\n\n public _updateFilter(filter: AdHocFilterWithLabels, update: Partial<AdHocFilterWithLabels>) {\n const { originFilters, filters, _wip } = this.state;\n\n if (filter.origin) {\n const originalValues = this._originalValues.get(`${filter.key}-${filter.origin}`);\n const updateValues = update.values || (update.value ? [update.value] : undefined);\n\n if (\n (updateValues && !isEqual(updateValues, originalValues?.value)) ||\n (update.operator && update.operator !== originalValues?.operator)\n ) {\n update.restorable = true;\n } else if (updateValues && isEqual(updateValues, originalValues?.value)) {\n update.restorable = false;\n }\n\n const updatedFilters =\n originFilters?.map((f) => {\n return f === filter ? { ...f, ...update } : f;\n }) ?? [];\n this.setState({ originFilters: updatedFilters });\n\n return;\n }\n\n if (filter === _wip) {\n // If we set value we are done with this \"work in progress\" filter and we can add it\n if ('value' in update && update['value'] !== '') {\n this._setStateWithFiltersApplicabilityCheck({\n filters: [...filters, { ..._wip, ...update }],\n originFilters: this.state.originFilters,\n _wip: undefined,\n });\n } else {\n this.setState({ _wip: { ...filter, ...update } });\n }\n return;\n }\n\n const updatedFilters = this.state.filters.map((f) => {\n return f === filter ? { ...f, ...update } : f;\n });\n\n this.setState({ filters: updatedFilters });\n }\n\n public updateToMatchAll(filter: AdHocFilterWithLabels) {\n this._updateFilter(filter, {\n operator: '=~',\n value: '.*',\n values: ['.*'],\n valueLabels: ['All'],\n matchAllFilter: true,\n nonApplicable: false,\n restorable: true,\n });\n }\n\n public _removeFilter(filter: AdHocFilterWithLabels) {\n if (filter === this.state._wip) {\n this.setState({ _wip: undefined });\n return;\n }\n const queryController = getQueryController(this);\n queryController?.startProfile(FILTER_REMOVED_INTERACTION);\n\n this._setStateWithFiltersApplicabilityCheck({\n filters: this.state.filters.filter((f) => f !== filter),\n originFilters: this.state.originFilters,\n });\n }\n\n public _removeLastFilter() {\n const filterToRemove = this.state.filters.at(-1);\n\n if (filterToRemove) {\n this._removeFilter(filterToRemove);\n }\n }\n\n public _handleComboboxBackspace(filter: AdHocFilterWithLabels) {\n if (this.state.filters.length) {\n // default forceEdit last filter (when triggering from wip filter)\n let filterToForceIndex = this.state.filters.length - 1;\n\n // adjust filterToForceIndex index to -1 if backspace triggered from non wip filter\n // to avoid triggering forceEdit logic\n if (filter !== this.state._wip) {\n filterToForceIndex = -1;\n }\n\n this.setState({\n filters: this.state.filters.reduce<AdHocFilterWithLabels[]>((acc, f, index) => {\n // adjust forceEdit of preceding filter if not readOnly\n if (index === filterToForceIndex && !f.readOnly) {\n return [\n ...acc,\n {\n ...f,\n forceEdit: true,\n },\n ];\n }\n // remove current filter\n if (f === filter) {\n return acc;\n }\n\n return [...acc, f];\n }, []),\n });\n } else if (this.state.originFilters?.length) {\n // default forceEdit last filter (when triggering from wip filter)\n let filterToForceIndex = this.state.originFilters.length - 1;\n\n // adjust filterToForceIndex index to -1 if backspace triggered from non wip filter\n // to avoid triggering forceEdit logic\n if (filter !== this.state._wip) {\n filterToForceIndex = -1;\n }\n\n this.setState({\n originFilters: this.state.originFilters.reduce<AdHocFilterWithLabels[]>((acc, f, index) => {\n // adjust forceEdit of preceding filter\n if (index === filterToForceIndex && !f.readOnly) {\n return [\n ...acc,\n {\n ...f,\n forceEdit: true,\n },\n ];\n }\n // remove current filter\n if (f === filter) {\n return acc;\n }\n\n return [...acc, f];\n }, []),\n });\n }\n }\n\n public async _setStateWithFiltersApplicabilityCheck(update: Partial<AdHocFiltersVariableState>) {\n const ds = await this._dataSourceSrv.get(this.state.datasource, this._scopedVars);\n // @ts-expect-error (temporary till we update grafana/data)\n if (!ds || !ds.getFiltersApplicability) {\n this.setState(update);\n return;\n }\n\n if (!update.filters) {\n return;\n }\n\n const timeRange = sceneGraph.getTimeRange(this).state.value;\n const queries = this.state.useQueriesAsFilterForOptions ? getQueriesForVariables(this) : undefined;\n\n // @ts-expect-error (temporary till we update grafana/data)\n const response: FiltersApplicability[] = await ds.getFiltersApplicability({\n filters: [...update.filters, ...(update.originFilters ?? [])],\n queries,\n timeRange,\n scopes: sceneGraph.getScopes(this),\n ...getEnrichedFiltersRequest(this),\n });\n\n const responseMap = new Map<string, FiltersApplicability>();\n response.forEach((filter) => {\n responseMap.set(`${filter.key}${filter.origin ? `-${filter.origin}` : ''}`, filter);\n });\n\n update.filters.forEach((f) => {\n const filter = responseMap.get(f.key);\n\n if (filter) {\n f.nonApplicable = !filter.applicable;\n f.nonApplicableReason = filter.reason;\n }\n });\n\n update.originFilters?.forEach((f) => {\n const filter = responseMap.get(`${f.key}-${f.origin}`);\n\n if (filter) {\n if (!f.matchAllFilter) {\n f.nonApplicable = !filter.applicable;\n f.nonApplicableReason = filter.reason;\n }\n\n const originalValue = this._originalValues.get(`${f.key}-${f.origin}`);\n if (originalValue) {\n originalValue.nonApplicable = !filter.applicable;\n originalValue.nonApplicableReason = filter?.reason;\n }\n }\n });\n\n this.setState(update);\n }\n\n /**\n * Get possible keys given current filters. Do not call from plugins directly\n */\n public async _getKeys(currentKey: string | null): Promise<Array<SelectableValue<string>>> {\n const override = await this.state.getTagKeysProvider?.(this, currentKey);\n\n if (override && override.replace) {\n return dataFromResponse(override.values).map(toSelectableValue);\n }\n\n if (this.state.defaultKeys) {\n return this.state.defaultKeys.map(toSelectableValue);\n }\n\n const ds = await this._dataSourceSrv.get(this.state.datasource, this._scopedVars);\n if (!ds || !ds.getTagKeys) {\n return [];\n }\n\n const applicableOriginFilters = this.state.originFilters?.filter((f) => !f.nonApplicable) ?? [];\n const otherFilters = this.state.filters\n .filter((f) => f.key !== currentKey && !f.nonApplicable)\n .concat(this.state.baseFilters ?? [])\n .concat(applicableOriginFilters);\n const timeRange = sceneGraph.getTimeRange(this).state.value;\n const queries = this.state.useQueriesAsFilterForOptions ? getQueriesForVariables(this) : undefined;\n const response = await ds.getTagKeys({\n filters: otherFilters,\n queries,\n timeRange,\n scopes: sceneGraph.getScopes(this),\n ...getEnrichedFiltersRequest(this),\n });\n\n if (responseHasError(response)) {\n this.setState({ error: response.error.message });\n }\n\n let keys = dataFromResponse(response);\n if (override) {\n keys = keys.concat(dataFromResponse(override.values));\n }\n\n const tagKeyRegexFilter = this.state.tagKeyRegexFilter;\n if (tagKeyRegexFilter) {\n keys = keys.filter((f) => f.text.match(tagKeyRegexFilter));\n }\n\n return keys.map(toSelectableValue);\n }\n\n /**\n * Get possible key values for a specific key given current filters. Do not call from plugins directly\n */\n public async _getValuesFor(filter: AdHocFilterWithLabels): Promise<Array<SelectableValue<string>>> {\n const override = await this.state.getTagValuesProvider?.(this, filter);\n\n if (override && override.replace) {\n return dataFromResponse(override.values).map(toSelectableValue);\n }\n\n const ds = await this._dataSourceSrv.get(this.state.datasource, this._scopedVars);\n\n if (!ds || !ds.getTagValues) {\n return [];\n }\n\n const originFilters = this.state.originFilters?.filter((f) => f.key !== filter.key) ?? [];\n // Filter out the current filter key from the list of all filters\n const otherFilters = this.state.filters.filter((f) => f.key !== filter.key).concat(originFilters);\n\n const timeRange = sceneGraph.getTimeRange(this).state.value;\n const queries = this.state.useQueriesAsFilterForOptions ? getQueriesForVariables(this) : undefined;\n\n let scopes = sceneGraph.getScopes(this);\n\n // if current filter is a scope originated one we need to filter out\n // filters with same key in scopes prop, similar to how we do in adhocFilters prop\n if (filter.origin === 'scope') {\n scopes = scopes?.map((scope) => {\n return {\n ...scope,\n spec: {\n ...scope.spec,\n filters: scope.spec.filters.filter((f) => f.key !== filter.key),\n },\n };\n });\n }\n\n const response = await ds.getTagValues({\n key: filter.key,\n filters: otherFilters,\n timeRange,\n queries,\n scopes,\n ...getEnrichedFiltersRequest(this),\n });\n\n if (responseHasError(response)) {\n this.setState({ error: response.error.message });\n }\n\n let values = dataFromResponse(response);\n if (override) {\n values = values.concat(dataFromResponse(override.values));\n }\n\n return values.map(toSelectableValue);\n }\n\n public _addWip() {\n this.setState({\n _wip: { key: '', value: '', operator: '=', condition: '' },\n });\n }\n\n public _getOperators() {\n const { supportsMultiValueOperators, allowCustomValue = true } = this.state;\n\n return OPERATORS.filter(({ isMulti, isRegex }) => {\n if (!supportsMultiValueOperators && isMulti) {\n return false;\n }\n if (!allowCustomValue && isRegex) {\n return false;\n }\n return true;\n }).map<SelectableValue<string>>(({ value, description }) => ({\n label: value,\n value,\n description,\n }));\n }\n}\n\nfunction renderExpression(\n builder: AdHocVariableExpressionBuilderFn | undefined,\n filters: AdHocFilterWithLabels[] | undefined\n) {\n return (builder ?? renderPrometheusLabelFilters)(filters?.filter((f) => isFilterApplicable(f)) ?? []);\n}\n\nexport function AdHocFiltersVariableRenderer({ model }: SceneComponentProps<AdHocFiltersVariable>) {\n const { filters, readOnly, addFilterButtonText } = model.useState();\n const styles = useStyles2(getStyles);\n\n if (model.state.layout === 'combobox') {\n return <AdHocFiltersComboboxRenderer model={model} />;\n }\n\n return (\n <div className={styles.wrapper}>\n {filters\n .filter((filter) => !filter.hidden)\n .map((filter, index) => (\n <React.Fragment key={index}>\n <AdHocFilterRenderer filter={filter} model={model} />\n </React.Fragment>\n ))}\n\n {!readOnly && <AdHocFilterBuilder model={model} key=\"'builder\" addFilterButtonText={addFilterButtonText} />}\n </div>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css({\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'flex-end',\n columnGap: theme.spacing(2),\n rowGap: theme.spacing(1),\n }),\n});\n\nexport function toSelectableValue(input: MetricFindValue): SelectableValue<string> {\n const { text, value } = input;\n const result: SelectableValue<string> = {\n // converting text to string due to some edge cases where it can be a number\n // TODO: remove once https://github.com/grafana/grafana/issues/99021 is closed\n label: String(text),\n value: String(value ?? text),\n };\n\n if ('group' in input) {\n result.group = input.group;\n }\n\n if ('meta' in input) {\n result.meta = input.meta;\n }\n\n return result;\n}\n\nexport function isMatchAllFilter(filter: AdHocFilterWithLabels): boolean {\n return filter.operator === '=~' && filter.value === '.*';\n}\n\nexport function isFilterComplete(filter: AdHocFilterWithLabels): boolean {\n return filter.key !== '' && filter.operator !== '' && filter.value !== '';\n}\n\nexport function isFilterApplicable(filter: AdHocFilterWithLabels): boolean {\n return !filter.nonApplicable;\n}\n\nexport function isMultiValueOperator(operatorValue: string): boolean {\n const operator = OPERATORS.find((o) => o.value === operatorValue);\n if (!operator) {\n // default to false if operator is not found\n return false;\n }\n return Boolean(operator.isMulti);\n}\n"],"names":["_a","updatedFilters"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA4KO,MAAM,SAAkC,GAAA;AAAA,EAC7C;AAAA,IACE,KAAO,EAAA,GAAA;AAAA,IACP,WAAa,EAAA;AAAA,GACf;AAAA,EACA;AAAA,IACE,KAAO,EAAA,IAAA;AAAA,IACP,WAAa,EAAA;AAAA,GACf;AAAA,EACA;AAAA,IACE,KAAO,EAAA,IAAA;AAAA,IACP,WAAa,EAAA,2CAAA;AAAA,IACb,OAAS,EAAA;AAAA,GACX;AAAA,EACA;AAAA,IACE,KAAO,EAAA,KAAA;AAAA,IACP,WAAa,EAAA,6CAAA;AAAA,IACb,OAAS,EAAA;AAAA,GACX;AAAA,EACA;AAAA,IACE,KAAO,EAAA,IAAA;AAAA,IACP,WAAa,EAAA,eAAA;AAAA,IACb,OAAS,EAAA;AAAA,GACX;AAAA,EACA;AAAA,IACE,KAAO,EAAA,IAAA;AAAA,IACP,WAAa,EAAA,sBAAA;AAAA,IACb,OAAS,EAAA;AAAA,GACX;AAAA,EACA;AAAA,IACE,KAAO,EAAA,GAAA;AAAA,IACP,WAAa,EAAA;AAAA,GACf;AAAA,EACA;AAAA,IACE,KAAO,EAAA,GAAA;AAAA,IACP,WAAa,EAAA;AAAA;AAEjB;AASO,MAAM,6BACH,eAEV,CAAA;AAAA,EAmBS,YAAY,KAA2C,EAAA;AAhPhE,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAiPI,IAAM,KAAA,CAAA;AAAA,MACJ,IAAM,EAAA,OAAA;AAAA,MACN,IAAA,EAAA,CAAM,EAAM,GAAA,KAAA,CAAA,IAAA,KAAN,IAAc,GAAA,EAAA,GAAA,SAAA;AAAA,MACpB,SAAS,EAAC;AAAA,MACV,UAAY,EAAA,IAAA;AAAA,MACZ,SAAW,EAAA,MAAA;AAAA,MACX,gBAAA,EAAA,CACE,WAAM,gBAAN,KAAA,IAAA,GAAA,EAAA,GACA,iBAAiB,KAAM,CAAA,iBAAA,EAAmB,CAAC,GAAI,CAAA,EAAA,GAAA,KAAA,CAAM,kBAAN,IAAuB,GAAA,EAAA,GAAA,IAAK,GAAI,CAAA,EAAA,GAAA,KAAA,CAAM,YAAN,IAAiB,GAAA,EAAA,GAAA,EAAG,CAAC,CAAA;AAAA,MACtG,GAAG;AAAA,KACJ,CAAA;AA3BH,IAAA,IAAA,CAAQ,WAAc,GAAA,EAAE,aAAe,EAAA,iCAAA,CAAkC,IAAI,CAAE,EAAA;AAC/E,IAAA,IAAA,CAAQ,iBAAiB,gBAAiB,EAAA;AAI1C;AAAA;AAAA;AAAA,IAAQ,IAAA,CAAA,eAAA,uBAAkD,GAAI,EAAA;AAC9D,IAAA,IAAA,CAAQ,cAAuB,EAAC;AAGhC;AAAA,IAAU,IAAA,CAAA,mBAAA,GAAsB,IAAI,wBAAA,CAAyB,IAAM,EAAA;AAAA,MACjE,eAAiB,EAAA,IAAA;AAAA,MACjB,gCAAA,EAAkC,MAAM,IAAA,CAAK,oBAAqB;AAAA,KACnE,CAAA;AAED,IAAU,IAAA,CAAA,QAAA,GAAW,IAAI,kCAAA,CAAmC,IAAI,CAAA;AA6BhE,IAAA,IAAA,CAAQ,qBAAqB,MAAM;AACjC,MAAA,IAAA,CAAK,sCAAuC,CAAA;AAAA,QAC1C,OAAA,EAAS,KAAK,KAAM,CAAA,OAAA;AAAA,QACpB,aAAA,EAAe,KAAK,KAAM,CAAA;AAAA,OAC3B,CAAA;AAED,MAAA,OAAO,MAAM;AAjRjB,QAAA,IAAA,EAAA;AAkRM,QAAA,CAAA,EAAA,GAAA,IAAA,CAAK,KAAM,CAAA,aAAA,KAAX,IAA0B,GAAA,MAAA,GAAA,EAAA,CAAA,OAAA,CAAQ,CAAC,MAAW,KAAA;AAC5C,UAAA,IAAI,OAAO,UAAY,EAAA;AACrB,YAAA,IAAA,CAAK,sBAAsB,MAAM,CAAA;AAAA;AACnC,SACF,CAAA;AAAA,OACF;AAAA,KACF;AA3BE,IAAI,IAAA,IAAA,CAAK,KAAM,CAAA,SAAA,KAAc,MAAQ,EAAA;AACnC,MAAA,oBAAA,CAAqB,IAAI,CAAA;AAAA;AAG3B,IAAA,CAAA,EAAA,GAAA,IAAA,CAAK,KAAM,CAAA,aAAA,KAAX,IAA0B,GAAA,MAAA,GAAA,EAAA,CAAA,OAAA,CAAQ,CAAC,MAAW,KAAA;AAjQlD,MAAAA,IAAAA,GAAAA;AAkQM,MAAK,IAAA,CAAA,eAAA,CAAgB,IAAI,CAAG,EAAA,MAAA,CAAO,GAAG,CAAI,CAAA,EAAA,MAAA,CAAO,MAAM,CAAI,CAAA,EAAA;AAAA,QACzD,UAAU,MAAO,CAAA,QAAA;AAAA,QACjB,KAAA,EAAA,CAAOA,MAAA,MAAO,CAAA,MAAA,KAAP,OAAAA,GAAiB,GAAA,CAAC,OAAO,KAAK;AAAA,OACtC,CAAA;AAAA,KACH,CAAA;AAEA,IAAK,IAAA,CAAA,oBAAA,CAAqB,KAAK,kBAAkB,CAAA;AAAA;AACnD,EAiBQ,oBAAuB,GAAA;AA1RjC,IAAA,IAAA,EAAA,EAAA,EAAA;AA2RI,IAAM,MAAA,MAAA,GAAS,UAAW,CAAA,SAAA,CAAU,IAAI,CAAA;AAExC,IAAA,IAAI,CAAC,MAAA,IAAU,CAAC,MAAA,CAAO,MAAQ,EAAA;AAC7B,MAAA,IAAA,CAAK,QAAS,CAAA;AAAA,QACZ,aAAA,EAAA,CAAe,UAAK,KAAM,CAAA,aAAA,KAAX,mBAA0B,MAAO,CAAA,CAAC,MAAW,KAAA,MAAA,CAAO,MAAW,KAAA,OAAA;AAAA,OAC/E,CAAA;AACD,MAAA;AAAA;AAGF,IAAM,MAAA,YAAA,GAAe,0BAA0B,MAAM,CAAA;AAErD,IAAI,IAAA,CAAC,aAAa,MAAQ,EAAA;AACxB,MAAA;AAAA;AAGF,IAAA,IAAI,YAAe,GAAA,YAAA;AACnB,IAAA,MAAM,uBAAgD,EAAC;AACvD,IAAA,MAAM,mBAA4C,EAAC;AAGnD,IAAa,YAAA,CAAA,OAAA,CAAQ,CAAC,WAAgB,KAAA;AA/S1C,MAAAA,IAAAA,GAAAA;AAgTM,MAAK,IAAA,CAAA,eAAA,CAAgB,IAAI,CAAG,EAAA,WAAA,CAAY,GAAG,CAAI,CAAA,EAAA,WAAA,CAAY,MAAM,CAAI,CAAA,EAAA;AAAA,QACnE,KAAA,EAAA,CAAOA,MAAA,WAAY,CAAA,MAAA,KAAZ,OAAAA,GAAsB,GAAA,CAAC,YAAY,KAAK,CAAA;AAAA,QAC/C,UAAU,WAAY,CAAA;AAAA,OACvB,CAAA;AAAA,KACF,CAAA;AAED,IAAA,CAAA,EAAA,GAAA,IAAA,CAAK,KAAM,CAAA,aAAA,KAAX,IAA0B,GAAA,MAAA,GAAA,EAAA,CAAA,OAAA,CAAQ,CAAC,MAAW,KAAA;AAC5C,MAAI,IAAA,MAAA,CAAO,WAAW,OAAS,EAAA;AAC7B,QAAA,oBAAA,CAAqB,KAAK,MAAM,CAAA;AAAA,OAC3B,MAAA;AACL,QAAA,gBAAA,CAAiB,KAAK,MAAM,CAAA;AAAA;AAC9B,KACF,CAAA;AAEA,IAAI,IAAA,IAAA,CAAK,YAAY,MAAQ,EAAA;AAC3B,MAAK,IAAA,CAAA,QAAA,CAAS,EAAE,aAAe,EAAA,CAAC,GAAG,YAAc,EAAA,GAAG,gBAAgB,CAAA,EAAG,CAAA;AACvE,MAAA,IAAA,CAAK,WAAc,GAAA,MAAA;AACnB,MAAA;AAAA;AAGF,IAAA,MAAM,qBAAqB,oBAAqB,CAAA,MAAA,CAAO,CAAC,MAAA,KAAW,OAAO,UAAU,CAAA;AACpF,IAAA,MAAM,wBAAwB,kBAAmB,CAAA,GAAA,CAAI,CAAC,MAAA,KAAW,OAAO,GAAG,CAAA;AAC3E,IAAA,MAAM,kBAAkB,YAAa,CAAA,GAAA,CAAI,CAAC,MAAA,KAAW,OAAO,GAAG,CAAA;AAK/D,IAAe,YAAA,GAAA;AAAA,MACb,GAAG,mBAAmB,MAAO,CAAA,CAAC,WAAW,eAAgB,CAAA,QAAA,CAAS,MAAO,CAAA,GAAG,CAAC,CAAA;AAAA,MAC7E,GAAG,YAAa,CAAA,MAAA,CAAO,CAAC,MAAA,KAAW,CAAC,qBAAsB,CAAA,QAAA,CAAS,MAAO,CAAA,GAAG,CAAC;AAAA,KAChF;AAGA,IAAA,IAAA,CAAK,sCAAuC,CAAA;AAAA,MAC1C,OAAA,EAAS,KAAK,KAAM,CAAA,OAAA;AAAA,MACpB,aAAe,EAAA,CAAC,GAAG,YAAA,EAAc,GAAG,gBAAgB;AAAA,KACrD,CAAA;AACD,IAAA,IAAA,CAAK,WAAc,GAAA,MAAA;AAAA;AACrB,EAEO,SAAS,MAAkD,EAAA;AAxVpE,IAAA,IAAA,EAAA,EAAA,EAAA;AAyVI,IAAA,IAAI,uBAA0B,GAAA,KAAA;AAE9B,IAAA,IAAA,CACI,OAAO,OAAW,IAAA,MAAA,CAAO,OAAY,KAAA,IAAA,CAAK,MAAM,OAC/C,IAAA,MAAA,CAAO,aAAiB,IAAA,MAAA,CAAO,kBAAkB,IAAK,CAAA,KAAA,CAAM,aAC/D,KAAA,CAAC,OAAO,gBACR,EAAA;AACA,MAAA,MAAM,OAAU,GAAA,CAAA,EAAA,GAAA,MAAA,CAAO,OAAP,KAAA,IAAA,GAAA,EAAA,GAAkB,KAAK,KAAM,CAAA,OAAA;AAC7C,MAAA,MAAM,aAAgB,GAAA,CAAA,EAAA,GAAA,MAAA,CAAO,aAAP,KAAA,IAAA,GAAA,EAAA,GAAwB,KAAK,KAAM,CAAA,aAAA;AAEzD,MAAA,MAAA,CAAO,gBAAmB,GAAA,gBAAA,CAAiB,IAAK,CAAA,KAAA,CAAM,iBAAmB,EAAA,CAAC,GAAI,aAAA,IAAA,IAAA,GAAA,aAAA,GAAiB,EAAC,EAAI,GAAG,OAAO,CAAC,CAAA;AAC/G,MAA0B,uBAAA,GAAA,MAAA,CAAO,gBAAqB,KAAA,IAAA,CAAK,KAAM,CAAA,gBAAA;AAAA;AAGnE,IAAA,KAAA,CAAM,SAAS,MAAM,CAAA;AAErB,IAAA,IAAI,uBAAyB,EAAA;AAC3B,MAAA,IAAA,CAAK,YAAa,CAAA,IAAI,8BAA+B,CAAA,IAAI,GAAG,IAAI,CAAA;AAAA;AAClE;AACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,aAAA,CACL,SACA,OAIM,EAAA;AAzXV,IAAA,IAAA,EAAA;AA0XI,IAAA,IAAI,uBAA0B,GAAA,KAAA;AAC9B,IAAA,IAAI,gBAAuC,GAAA,MAAA;AAE3C,IAAA,IAAI,OAAW,IAAA,OAAA,KAAY,IAAK,CAAA,KAAA,CAAM,OAAS,EAAA;AAC7C,MAAmB,gBAAA,GAAA,gBAAA,CAAiB,IAAK,CAAA,KAAA,CAAM,iBAAmB,EAAA;AAAA,QAChE,GAAI,CAAA,EAAA,GAAA,IAAA,CAAK,KAAM,CAAA,aAAA,KAAX,YAA4B,EAAC;AAAA,QACjC,GAAG;AAAA,OACJ,CAAA;AACD,MAA0B,uBAAA,GAAA,gBAAA,KAAqB,KAAK,KAAM,CAAA,gBAAA;AAAA;AAG5D,IAAA,KAAA,CAAM,QAAS,CAAA;AAAA,MACb,OAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,IAAK,uBAA2B,IAAA,CAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,WAAgB,MAAA,IAAA,KAAS,mCAAS,YAAc,CAAA,EAAA;AACvF,MAAA,IAAA,CAAK,YAAa,CAAA,IAAI,8BAA+B,CAAA,IAAI,GAAG,IAAI,CAAA;AAAA;AAClE;AACF,EAEO,sBAAsB,MAA+B,EAAA;AAC1D,IAAA,MAAM,QAA2C,GAAA;AAAA,MAC/C,cAAgB,EAAA,KAAA;AAAA,MAChB,UAAY,EAAA;AAAA,KACd;AAEA,IAAA,IAAI,OAAO,UAAY,EAAA;AACrB,MAAM,MAAA,cAAA,GAAiB,IAAK,CAAA,eAAA,CAAgB,GAAI,CAAA,CAAA,EAAG,OAAO,GAAG,CAAA,CAAA,EAAI,MAAO,CAAA,MAAM,CAAE,CAAA,CAAA;AAEhF,MAAA,IAAI,CAAC,cAAgB,EAAA;AACnB,QAAA;AAAA;AAGF,MAAS,QAAA,CAAA,KAAA,GAAQ,iDAAgB,KAAM,CAAA,CAAA,CAAA;AACvC,MAAA,QAAA,CAAS,SAAS,cAAgB,IAAA,IAAA,GAAA,MAAA,GAAA,cAAA,CAAA,KAAA;AAClC,MAAA,QAAA,CAAS,cAAc,cAAgB,IAAA,IAAA,GAAA,MAAA,GAAA,cAAA,CAAA,KAAA;AACvC,MAAA,QAAA,CAAS,WAAW,cAAgB,IAAA,IAAA,GAAA,MAAA,GAAA,cAAA,CAAA,QAAA;AACpC,MAAA,QAAA,CAAS,gBAAgB,cAAgB,IAAA,IAAA,GAAA,MAAA,GAAA,cAAA,CAAA,aAAA;AACzC,MAAM,MAAA,eAAA,GAAkB,mBAAmB,IAAI,CAAA;AAC/C,MAAA,eAAA,IAAA,IAAA,GAAA,MAAA,GAAA,eAAA,CAAiB,YAAa,CAAA,2BAAA,CAAA;AAC9B,MAAK,IAAA,CAAA,aAAA,CAAc,QAAQ,QAAQ,CAAA;AAAA;AACrC;AACF,EAEO,QAAsC,GAAA;AAC3C,IAAA,OAAO,KAAK,KAAM,CAAA,gBAAA;AAAA;AACpB,EAEO,aAAA,CAAc,QAA+B,MAAwC,EAAA;AA3a9F,IAAA,IAAA,EAAA;AA4aI,IAAA,MAAM,EAAE,aAAA,EAAe,OAAS,EAAA,IAAA,KAAS,IAAK,CAAA,KAAA;AAE9C,IAAA,IAAI,OAAO,MAAQ,EAAA;AACjB,MAAM,MAAA,cAAA,GAAiB,IAAK,CAAA,eAAA,CAAgB,GAAI,CAAA,CAAA,EAAG,OAAO,GAAG,CAAA,CAAA,EAAI,MAAO,CAAA,MAAM,CAAE,CAAA,CAAA;AAChF,MAAM,MAAA,YAAA,GAAe,OAAO,MAAW,KAAA,MAAA,CAAO,QAAQ,CAAC,MAAA,CAAO,KAAK,CAAI,GAAA,MAAA,CAAA;AAEvE,MAAA,IACG,YAAgB,IAAA,CAAC,OAAQ,CAAA,YAAA,EAAc,cAAgB,IAAA,IAAA,GAAA,MAAA,GAAA,cAAA,CAAA,KAAK,CAC5D,IAAA,MAAA,CAAO,QAAY,IAAA,MAAA,CAAO,QAAa,MAAA,cAAA,IAAA,IAAA,GAAA,MAAA,GAAA,cAAA,CAAgB,QACxD,CAAA,EAAA;AACA,QAAA,MAAA,CAAO,UAAa,GAAA,IAAA;AAAA,iBACX,YAAgB,IAAA,OAAA,CAAQ,YAAc,EAAA,cAAA,IAAA,IAAA,GAAA,MAAA,GAAA,cAAA,CAAgB,KAAK,CAAG,EAAA;AACvE,QAAA,MAAA,CAAO,UAAa,GAAA,KAAA;AAAA;AAGtB,MAAA,MAAMC,eACJ,GAAA,CAAA,EAAA,GAAA,aAAA,IAAA,IAAA,GAAA,MAAA,GAAA,aAAA,CAAe,GAAI,CAAA,CAAC,CAAM,KAAA;AACxB,QAAA,OAAO,MAAM,MAAS,GAAA,EAAE,GAAG,CAAG,EAAA,GAAG,QAAW,GAAA,CAAA;AAAA,OAC9C,CAAA,KAFA,YAEM,EAAC;AACT,MAAA,IAAA,CAAK,QAAS,CAAA,EAAE,aAAeA,EAAAA,eAAAA,EAAgB,CAAA;AAE/C,MAAA;AAAA;AAGF,IAAA,IAAI,WAAW,IAAM,EAAA;AAEnB,MAAA,IAAI,OAAW,IAAA,MAAA,IAAU,MAAO,CAAA,OAAO,MAAM,EAAI,EAAA;AAC/C,QAAA,IAAA,CAAK,sCAAuC,CAAA;AAAA,UAC1C,OAAA,EAAS,CAAC,GAAG,OAAA,EAAS,EAAE,GAAG,IAAA,EAAM,GAAG,MAAA,EAAQ,CAAA;AAAA,UAC5C,aAAA,EAAe,KAAK,KAAM,CAAA,aAAA;AAAA,UAC1B,IAAM,EAAA;AAAA,SACP,CAAA;AAAA,OACI,MAAA;AACL,QAAK,IAAA,CAAA,QAAA,CAAS,EAAE,IAAM,EAAA,EAAE,GAAG,MAAQ,EAAA,GAAG,MAAO,EAAA,EAAG,CAAA;AAAA;AAElD,MAAA;AAAA;AAGF,IAAA,MAAM,iBAAiB,IAAK,CAAA,KAAA,CAAM,OAAQ,CAAA,GAAA,CAAI,CAAC,CAAM,KAAA;AACnD,MAAA,OAAO,MAAM,MAAS,GAAA,EAAE,GAAG,CAAG,EAAA,GAAG,QAAW,GAAA,CAAA;AAAA,KAC7C,CAAA;AAED,IAAA,IAAA,CAAK,QAAS,CAAA,EAAE,OAAS,EAAA,cAAA,EAAgB,CAAA;AAAA;AAC3C,EAEO,iBAAiB,MAA+B,EAAA;AACrD,IAAA,IAAA,CAAK,cAAc,MAAQ,EAAA;AAAA,MACzB,QAAU,EAAA,IAAA;AAAA,MACV,KAAO,EAAA,IAAA;AAAA,MACP,MAAA,EAAQ,CAAC,IAAI,CAAA;AAAA,MACb,WAAA,EAAa,CAAC,KAAK,CAAA;AAAA,MACnB,cAAgB,EAAA,IAAA;AAAA,MAChB,aAAe,EAAA,KAAA;AAAA,MACf,UAAY,EAAA;AAAA,KACb,CAAA;AAAA;AACH,EAEO,cAAc,MAA+B,EAAA;AAClD,IAAI,IAAA,MAAA,KAAW,IAAK,CAAA,KAAA,CAAM,IAAM,EAAA;AAC9B,MAAA,IAAA,CAAK,QAAS,CAAA,EAAE,IAAM,EAAA,MAAA,EAAW,CAAA;AACjC,MAAA;AAAA;AAEF,IAAM,MAAA,eAAA,GAAkB,mBAAmB,IAAI,CAAA;AAC/C,IAAA,eAAA,IAAA,IAAA,GAAA,MAAA,GAAA,eAAA,CAAiB,YAAa,CAAA,0BAAA,CAAA;AAE9B,IAAA,IAAA,CAAK,sCAAuC,CAAA;AAAA,MAC1C,OAAA,EAAS,KAAK,KAAM,CAAA,OAAA,CAAQ,OAAO,CAAC,CAAA,KAAM,MAAM,MAAM,CAAA;AAAA,MACtD,aAAA,EAAe,KAAK,KAAM,CAAA;AAAA,KAC3B,CAAA;AAAA;AACH,EAEO,iBAAoB,GAAA;AACzB,IAAA,MAAM,cAAiB,GAAA,IAAA,CAAK,KAAM,CAAA,OAAA,CAAQ,GAAG,EAAE,CAAA;AAE/C,IAAA,IAAI,cAAgB,EAAA;AAClB,MAAA,IAAA,CAAK,cAAc,cAAc,CAAA;AAAA;AACnC;AACF,EAEO,yBAAyB,MAA+B,EAAA;AA3fjE,IAAA,IAAA,EAAA;AA4fI,IAAI,IAAA,IAAA,CAAK,KAAM,CAAA,OAAA,CAAQ,MAAQ,EAAA;AAE7B,MAAA,IAAI,kBAAqB,GAAA,IAAA,CAAK,KAAM,CAAA,OAAA,CAAQ,MAAS,GAAA,CAAA;AAIrD,MAAI,IAAA,MAAA,KAAW,IAAK,CAAA,KAAA,CAAM,IAAM,EAAA;AAC9B,QAAqB,kBAAA,GAAA,EAAA;AAAA;AAGvB,MAAA,IAAA,CAAK,QAAS,CAAA;AAAA,QACZ,OAAA,EAAS,KAAK,KAAM,CAAA,OAAA,CAAQ,OAAgC,CAAC,GAAA,EAAK,GAAG,KAAU,KAAA;AAE7E,UAAA,IAAI,KAAU,KAAA,kBAAA,IAAsB,CAAC,CAAA,CAAE,QAAU,EAAA;AAC/C,YAAO,OAAA;AAAA,cACL,GAAG,GAAA;AAAA,cACH;AAAA,gBACE,GAAG,CAAA;AAAA,gBACH,SAAW,EAAA;AAAA;AACb,aACF;AAAA;AAGF,UAAA,IAAI,MAAM,MAAQ,EAAA;AAChB,YAAO,OAAA,GAAA;AAAA;AAGT,UAAO,OAAA,CAAC,GAAG,GAAA,EAAK,CAAC,CAAA;AAAA,SACnB,EAAG,EAAE;AAAA,OACN,CAAA;AAAA,KACQ,MAAA,IAAA,CAAA,EAAA,GAAA,IAAA,CAAK,KAAM,CAAA,aAAA,KAAX,mBAA0B,MAAQ,EAAA;AAE3C,MAAA,IAAI,kBAAqB,GAAA,IAAA,CAAK,KAAM,CAAA,aAAA,CAAc,MAAS,GAAA,CAAA;AAI3D,MAAI,IAAA,MAAA,KAAW,IAAK,CAAA,KAAA,CAAM,IAAM,EAAA;AAC9B,QAAqB,kBAAA,GAAA,EAAA;AAAA;AAGvB,MAAA,IAAA,CAAK,QAAS,CAAA;AAAA,QACZ,aAAA,EAAe,KAAK,KAAM,CAAA,aAAA,CAAc,OAAgC,CAAC,GAAA,EAAK,GAAG,KAAU,KAAA;AAEzF,UAAA,IAAI,KAAU,KAAA,kBAAA,IAAsB,CAAC,CAAA,CAAE,QAAU,EAAA;AAC/C,YAAO,OAAA;AAAA,cACL,GAAG,GAAA;AAAA,cACH;AAAA,gBACE,GAAG,CAAA;AAAA,gBACH,SAAW,EAAA;AAAA;AACb,aACF;AAAA;AAGF,UAAA,IAAI,MAAM,MAAQ,EAAA;AAChB,YAAO,OAAA,GAAA;AAAA;AAGT,UAAO,OAAA,CAAC,GAAG,GAAA,EAAK,CAAC,CAAA;AAAA,SACnB,EAAG,EAAE;AAAA,OACN,CAAA;AAAA;AACH;AACF,EAEA,MAAa,uCAAuC,MAA4C,EAAA;AA3jBlG,IAAA,IAAA,EAAA,EAAA,EAAA;AA4jBI,IAAM,MAAA,EAAA,GAAK,MAAM,IAAK,CAAA,cAAA,CAAe,IAAI,IAAK,CAAA,KAAA,CAAM,UAAY,EAAA,IAAA,CAAK,WAAW,CAAA;AAEhF,IAAA,IAAI,CAAC,EAAA,IAAM,CAAC,EAAA,CAAG,uBAAyB,EAAA;AACtC,MAAA,IAAA,CAAK,SAAS,MAAM,CAAA;AACpB,MAAA;AAAA;AAGF,IAAI,IAAA,CAAC,OAAO,OAAS,EAAA;AACnB,MAAA;AAAA;AAGF,IAAA,MAAM,SAAY,GAAA,UAAA,CAAW,YAAa,CAAA,IAAI,EAAE,KAAM,CAAA,KAAA;AACtD,IAAA,MAAM,UAAU,IAAK,CAAA,KAAA,CAAM,4BAA+B,GAAA,sBAAA,CAAuB,IAAI,CAAI,GAAA,MAAA;AAGzF,IAAM,MAAA,QAAA,GAAmC,MAAM,EAAA,CAAG,uBAAwB,CAAA;AAAA,MACxE,OAAA,EAAS,CAAC,GAAG,MAAO,CAAA,OAAA,EAAS,IAAI,EAAO,GAAA,MAAA,CAAA,aAAA,KAAP,IAAwB,GAAA,EAAA,GAAA,EAAG,CAAA;AAAA,MAC5D,OAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA,EAAQ,UAAW,CAAA,SAAA,CAAU,IAAI,CAAA;AAAA,MACjC,GAAG,0BAA0B,IAAI;AAAA,KAClC,CAAA;AAED,IAAM,MAAA,WAAA,uBAAkB,GAAkC,EAAA;AAC1D,IAAS,QAAA,CAAA,OAAA,CAAQ,CAAC,MAAW,KAAA;AAC3B,MAAA,WAAA,CAAY,GAAI,CAAA,CAAA,EAAG,MAAO,CAAA,GAAG,CAAG,EAAA,MAAA,CAAO,MAAS,GAAA,CAAA,CAAA,EAAI,MAAO,CAAA,MAAM,CAAK,CAAA,GAAA,EAAE,IAAI,MAAM,CAAA;AAAA,KACnF,CAAA;AAED,IAAO,MAAA,CAAA,OAAA,CAAQ,OAAQ,CAAA,CAAC,CAAM,KAAA;AAC5B,MAAA,MAAM,MAAS,GAAA,WAAA,CAAY,GAAI,CAAA,CAAA,CAAE,GAAG,CAAA;AAEpC,MAAA,IAAI,MAAQ,EAAA;AACV,QAAE,CAAA,CAAA,aAAA,GAAgB,CAAC,MAAO,CAAA,UAAA;AAC1B,QAAA,CAAA,CAAE,sBAAsB,MAAO,CAAA,MAAA;AAAA;AACjC,KACD,CAAA;AAED,IAAA,CAAA,EAAA,GAAA,MAAA,CAAO,aAAP,KAAA,IAAA,GAAA,MAAA,GAAA,EAAA,CAAsB,OAAQ,CAAA,CAAC,CAAM,KAAA;AACnC,MAAM,MAAA,MAAA,GAAS,YAAY,GAAI,CAAA,CAAA,EAAG,EAAE,GAAG,CAAA,CAAA,EAAI,CAAE,CAAA,MAAM,CAAE,CAAA,CAAA;AAErD,MAAA,IAAI,MAAQ,EAAA;AACV,QAAI,IAAA,CAAC,EAAE,cAAgB,EAAA;AACrB,UAAE,CAAA,CAAA,aAAA,GAAgB,CAAC,MAAO,CAAA,UAAA;AAC1B,UAAA,CAAA,CAAE,sBAAsB,MAAO,CAAA,MAAA;AAAA;AAGjC,QAAM,MAAA,aAAA,GAAgB,IAAK,CAAA,eAAA,CAAgB,GAAI,CAAA,CAAA,EAAG,EAAE,GAAG,CAAA,CAAA,EAAI,CAAE,CAAA,MAAM,CAAE,CAAA,CAAA;AACrE,QAAA,IAAI,aAAe,EAAA;AACjB,UAAc,aAAA,CAAA,aAAA,GAAgB,CAAC,MAAO,CAAA,UAAA;AACtC,UAAA,aAAA,CAAc,sBAAsB,MAAQ,IAAA,IAAA,GAAA,MAAA,GAAA,MAAA,CAAA,MAAA;AAAA;AAC9C;AACF,KACF,CAAA;AAEA,IAAA,IAAA,CAAK,SAAS,MAAM,CAAA;AAAA;AACtB;AAAA;AAAA;AAAA,EAKA,MAAa,SAAS,UAAoE,EAAA;AAxnB5F,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AAynBI,IAAA,MAAM,WAAW,OAAM,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,IAAA,CAAK,KAAM,EAAA,kBAAA,KAAX,4BAAgC,IAAM,EAAA,UAAA,CAAA,CAAA;AAE7D,IAAI,IAAA,QAAA,IAAY,SAAS,OAAS,EAAA;AAChC,MAAA,OAAO,gBAAiB,CAAA,QAAA,CAAS,MAAM,CAAA,CAAE,IAAI,iBAAiB,CAAA;AAAA;AAGhE,IAAI,IAAA,IAAA,CAAK,MAAM,WAAa,EAAA;AAC1B,MAAA,OAAO,IAAK,CAAA,KAAA,CAAM,WAAY,CAAA,GAAA,CAAI,iBAAiB,CAAA;AAAA;AAGrD,IAAM,MAAA,EAAA,GAAK,MAAM,IAAK,CAAA,cAAA,CAAe,IAAI,IAAK,CAAA,KAAA,CAAM,UAAY,EAAA,IAAA,CAAK,WAAW,CAAA;AAChF,IAAA,IAAI,CAAC,EAAA,IAAM,CAAC,EAAA,CAAG,UAAY,EAAA;AACzB,MAAA,OAAO,EAAC;AAAA;AAGV,IAAA,MAAM,uBAA0B,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,IAAA,CAAK,KAAM,CAAA,aAAA,KAAX,IAA0B,GAAA,MAAA,GAAA,EAAA,CAAA,MAAA,CAAO,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,aAA3C,CAAA,KAAA,IAAA,GAAA,EAAA,GAA6D,EAAC;AAC9F,IAAM,MAAA,YAAA,GAAe,KAAK,KAAM,CAAA,OAAA,CAC7B,OAAO,CAAC,CAAA,KAAM,CAAE,CAAA,GAAA,KAAQ,UAAc,IAAA,CAAC,EAAE,aAAa,CAAA,CACtD,MAAO,CAAA,CAAA,EAAA,GAAA,IAAA,CAAK,KAAM,CAAA,WAAA,KAAX,YAA0B,EAAE,CACnC,CAAA,MAAA,CAAO,uBAAuB,CAAA;AACjC,IAAA,MAAM,SAAY,GAAA,UAAA,CAAW,YAAa,CAAA,IAAI,EAAE,KAAM,CAAA,KAAA;AACtD,IAAA,MAAM,UAAU,IAAK,CAAA,KAAA,CAAM,4BAA+B,GAAA,sBAAA,CAAuB,IAAI,CAAI,GAAA,MAAA;AACzF,IAAM,MAAA,QAAA,GAAW,MAAM,EAAA,CAAG,UAAW,CAAA;AAAA,MACnC,OAAS,EAAA,YAAA;AAAA,MACT,OAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA,EAAQ,UAAW,CAAA,SAAA,CAAU,IAAI,CAAA;AAAA,MACjC,GAAG,0BAA0B,IAAI;AAAA,KAClC,CAAA;AAED,IAAI,IAAA,gBAAA,CAAiB,QAAQ,CAAG,EAAA;AAC9B,MAAA,IAAA,CAAK,SAAS,EAAE,KAAA,EAAO,QAAS,CAAA,KAAA,CAAM,SAAS,CAAA;AAAA;AAGjD,IAAI,IAAA,IAAA,GAAO,iBAAiB,QAAQ,CAAA;AACpC,IAAA,IAAI,QAAU,EAAA;AACZ,MAAA,IAAA,GAAO,IAAK,CAAA,MAAA,CAAO,gBAAiB,CAAA,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA;AAGtD,IAAM,MAAA,iBAAA,GAAoB,KAAK,KAAM,CAAA,iBAAA;AACrC,IAAA,IAAI,iBAAmB,EAAA;AACrB,MAAO,IAAA,GAAA,IAAA,CAAK,OAAO,CAAC,CAAA,KAAM,EAAE,IAAK,CAAA,KAAA,CAAM,iBAAiB,CAAC,CAAA;AAAA;AAG3D,IAAO,OAAA,IAAA,CAAK,IAAI,iBAAiB,CAAA;AAAA;AACnC;AAAA;AAAA;AAAA,EAKA,MAAa,cAAc,MAAwE,EAAA;AA3qBrG,IAAA,IAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAAA;AA4qBI,IAAA,MAAM,WAAW,OAAM,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,IAAA,CAAK,KAAM,EAAA,oBAAA,KAAX,4BAAkC,IAAM,EAAA,MAAA,CAAA,CAAA;AAE/D,IAAI,IAAA,QAAA,IAAY,SAAS,OAAS,EAAA;AAChC,MAAA,OAAO,gBAAiB,CAAA,QAAA,CAAS,MAAM,CAAA,CAAE,IAAI,iBAAiB,CAAA;AAAA;AAGhE,IAAM,MAAA,EAAA,GAAK,MAAM,IAAK,CAAA,cAAA,CAAe,IAAI,IAAK,CAAA,KAAA,CAAM,UAAY,EAAA,IAAA,CAAK,WAAW,CAAA;AAEhF,IAAA,IAAI,CAAC,EAAA,IAAM,CAAC,EAAA,CAAG,YAAc,EAAA;AAC3B,MAAA,OAAO,EAAC;AAAA;AAGV,IAAA,MAAM,aAAgB,GAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,IAAA,CAAK,KAAM,CAAA,aAAA,KAAX,IAA0B,GAAA,MAAA,GAAA,EAAA,CAAA,MAAA,CAAO,CAAC,CAAA,KAAM,CAAE,CAAA,GAAA,KAAQ,MAAO,CAAA,GAAA,CAAA,KAAzD,YAAiE,EAAC;AAExF,IAAA,MAAM,YAAe,GAAA,IAAA,CAAK,KAAM,CAAA,OAAA,CAAQ,MAAO,CAAA,CAAC,CAAM,KAAA,CAAA,CAAE,GAAQ,KAAA,MAAA,CAAO,GAAG,CAAA,CAAE,OAAO,aAAa,CAAA;AAEhG,IAAA,MAAM,SAAY,GAAA,UAAA,CAAW,YAAa,CAAA,IAAI,EAAE,KAAM,CAAA,KAAA;AACtD,IAAA,MAAM,UAAU,IAAK,CAAA,KAAA,CAAM,4BAA+B,GAAA,sBAAA,CAAuB,IAAI,CAAI,GAAA,MAAA;AAEzF,IAAI,IAAA,MAAA,GAAS,UAAW,CAAA,SAAA,CAAU,IAAI,CAAA;AAItC,IAAI,IAAA,MAAA,CAAO,WAAW,OAAS,EAAA;AAC7B,MAAS,MAAA,GAAA,MAAA,IAAA,IAAA,GAAA,MAAA,GAAA,MAAA,CAAQ,GAAI,CAAA,CAAC,KAAU,KAAA;AAC9B,QAAO,OAAA;AAAA,UACL,GAAG,KAAA;AAAA,UACH,IAAM,EAAA;AAAA,YACJ,GAAG,KAAM,CAAA,IAAA;AAAA,YACT,OAAA,EAAS,KAAM,CAAA,IAAA,CAAK,OAAQ,CAAA,MAAA,CAAO,CAAC,CAAM,KAAA,CAAA,CAAE,GAAQ,KAAA,MAAA,CAAO,GAAG;AAAA;AAChE,SACF;AAAA,OACF,CAAA;AAAA;AAGF,IAAM,MAAA,QAAA,GAAW,MAAM,EAAA,CAAG,YAAa,CAAA;AAAA,MACrC,KAAK,MAAO,CAAA,GAAA;AAAA,MACZ,OAAS,EAAA,YAAA;AAAA,MACT,SAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,GAAG,0BAA0B,IAAI;AAAA,KAClC,CAAA;AAED,IAAI,IAAA,gBAAA,CAAiB,QAAQ,CAAG,EAAA;AAC9B,MAAA,IAAA,CAAK,SAAS,EAAE,KAAA,EAAO,QAAS,CAAA,KAAA,CAAM,SAAS,CAAA;AAAA;AAGjD,IAAI,IAAA,MAAA,GAAS,iBAAiB,QAAQ,CAAA;AACtC,IAAA,IAAI,QAAU,EAAA;AACZ,MAAA,MAAA,GAAS,MAAO,CAAA,MAAA,CAAO,gBAAiB,CAAA,QAAA,CAAS,MAAM,CAAC,CAAA;AAAA;AAG1D,IAAO,OAAA,MAAA,CAAO,IAAI,iBAAiB,CAAA;AAAA;AACrC,EAEO,OAAU,GAAA;AACf,IAAA,IAAA,CAAK,QAAS,CAAA;AAAA,MACZ,IAAA,EAAM,EAAE,GAAK,EAAA,EAAA,EAAI,OAAO,EAAI,EAAA,QAAA,EAAU,GAAK,EAAA,SAAA,EAAW,EAAG;AAAA,KAC1D,CAAA;AAAA;AACH,EAEO,aAAgB,GAAA;AACrB,IAAA,MAAM,EAAE,2BAAA,EAA6B,gBAAmB,GAAA,IAAA,KAAS,IAAK,CAAA,KAAA;AAEtE,IAAA,OAAO,UAAU,MAAO,CAAA,CAAC,EAAE,OAAA,EAAS,SAAc,KAAA;AAChD,MAAI,IAAA,CAAC,+BAA+B,OAAS,EAAA;AAC3C,QAAO,OAAA,KAAA;AAAA;AAET,MAAI,IAAA,CAAC,oBAAoB,OAAS,EAAA;AAChC,QAAO,OAAA,KAAA;AAAA;AAET,MAAO,OAAA,IAAA;AAAA,KACR,CAAE,CAAA,GAAA,CAA6B,CAAC,EAAE,KAAA,EAAO,aAAmB,MAAA;AAAA,MAC3D,KAAO,EAAA,KAAA;AAAA,MACP,KAAA;AAAA,MACA;AAAA,KACA,CAAA,CAAA;AAAA;AAEN;AAjiBa,oBAAA,CAIJ,SAAY,GAAA,4BAAA;AA+hBrB,SAAS,gBAAA,CACP,SACA,OACA,EAAA;AAhwBF,EAAA,IAAA,EAAA;AAiwBE,EAAQ,OAAA,CAAA,OAAA,IAAA,IAAA,GAAA,OAAA,GAAW,4BAA8B,EAAA,CAAA,EAAA,GAAA,OAAA,IAAA,IAAA,GAAA,MAAA,GAAA,OAAA,CAAS,MAAO,CAAA,CAAC,CAAM,KAAA,kBAAA,CAAmB,CAAC,CAAA,CAAA,KAA3C,IAAiD,GAAA,EAAA,GAAA,EAAE,CAAA;AACtG;AAEgB,SAAA,4BAAA,CAA6B,EAAE,KAAA,EAAoD,EAAA;AACjG,EAAA,MAAM,EAAE,OAAS,EAAA,QAAA,EAAU,mBAAoB,EAAA,GAAI,MAAM,QAAS,EAAA;AAClE,EAAM,MAAA,MAAA,GAAS,WAAW,SAAS,CAAA;AAEnC,EAAI,IAAA,KAAA,CAAM,KAAM,CAAA,MAAA,KAAW,UAAY,EAAA;AACrC,IAAO,uBAAA,KAAA,CAAA,aAAA,CAAC,gCAA6B,KAAc,EAAA,CAAA;AAAA;AAGrD,EAAA,2CACG,KAAI,EAAA,EAAA,SAAA,EAAW,MAAO,CAAA,OAAA,EAAA,EACpB,QACE,MAAO,CAAA,CAAC,MAAW,KAAA,CAAC,OAAO,MAAM,CAAA,CACjC,IAAI,CAAC,MAAA,EAAQ,0BACX,KAAA,CAAA,aAAA,CAAA,KAAA,CAAM,QAAN,EAAA,EAAe,KAAK,KACnB,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,mBAAoB,EAAA,EAAA,MAAA,EAAgB,OAAc,CACrD,CACD,CAEF,EAAA,CAAC,4BAAa,KAAA,CAAA,aAAA,CAAA,kBAAA,EAAA,EAAmB,OAAc,GAAI,EAAA,UAAA,EAAW,qBAA0C,CAC3G,CAAA;AAEJ;AAEA,MAAM,SAAA,GAAY,CAAC,KAA0B,MAAA;AAAA,EAC3C,SAAS,GAAI,CAAA;AAAA,IACX,OAAS,EAAA,MAAA;AAAA,IACT,QAAU,EAAA,MAAA;AAAA,IACV,UAAY,EAAA,UAAA;AAAA,IACZ,SAAA,EAAW,KAAM,CAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,IAC1B,MAAA,EAAQ,KAAM,CAAA,OAAA,CAAQ,CAAC;AAAA,GACxB;AACH,CAAA,CAAA;AAEO,SAAS,kBAAkB,KAAiD,EAAA;AACjF,EAAM,MAAA,EAAE,IAAM,EAAA,KAAA,EAAU,GAAA,KAAA;AACxB,EAAA,MAAM,MAAkC,GAAA;AAAA;AAAA;AAAA,IAGtC,KAAA,EAAO,OAAO,IAAI,CAAA;AAAA,IAClB,KAAA,EAAO,MAAO,CAAA,KAAA,IAAA,IAAA,GAAA,KAAA,GAAS,IAAI;AAAA,GAC7B;AAEA,EAAA,IAAI,WAAW,KAAO,EAAA;AACpB,IAAA,MAAA,CAAO,QAAQ,KAAM,CAAA,KAAA;AAAA;AAGvB,EAAA,IAAI,UAAU,KAAO,EAAA;AACnB,IAAA,MAAA,CAAO,OAAO,KAAM,CAAA,IAAA;AAAA;AAGtB,EAAO,OAAA,MAAA;AACT;AAEO,SAAS,iBAAiB,MAAwC,EAAA;AACvE,EAAA,OAAO,MAAO,CAAA,QAAA,KAAa,IAAQ,IAAA,MAAA,CAAO,KAAU,KAAA,IAAA;AACtD;AAEO,SAAS,iBAAiB,MAAwC,EAAA;AACvE,EAAA,OAAO,OAAO,GAAQ,KAAA,EAAA,IAAM,OAAO,QAAa,KAAA,EAAA,IAAM,OAAO,KAAU,KAAA,EAAA;AACzE;AAEO,SAAS,mBAAmB,MAAwC,EAAA;AACzE,EAAA,OAAO,CAAC,MAAO,CAAA,aAAA;AACjB;AAEO,SAAS,qBAAqB,aAAgC,EAAA;AACnE,EAAA,MAAM,WAAW,SAAU,CAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,UAAU,aAAa,CAAA;AAChE,EAAA,IAAI,CAAC,QAAU,EAAA;AAEb,IAAO,OAAA,KAAA;AAAA;AAET,EAAO,OAAA,OAAA,CAAQ,SAAS,OAAO,CAAA;AACjC;;;;"}
|
|
@@ -6,6 +6,7 @@ import { selectors } from '@grafana/e2e-selectors';
|
|
|
6
6
|
import { css, cx } from '@emotion/css';
|
|
7
7
|
import { getOptionSearcher } from './getOptionSearcher.js';
|
|
8
8
|
import { sceneGraph } from '../../core/sceneGraph/index.js';
|
|
9
|
+
import { VARIABLE_VALUE_CHANGED_INTERACTION } from '../../behaviors/SceneRenderProfiler.js';
|
|
9
10
|
|
|
10
11
|
const filterNoOp = () => true;
|
|
11
12
|
const filterAll = (v) => v.value !== "$__all";
|
|
@@ -71,7 +72,7 @@ function VariableValueSelect({ model, state }) {
|
|
|
71
72
|
"data-testid": selectors.pages.Dashboard.SubMenu.submenuItemValueDropDownValueLinkTexts(`${value}`),
|
|
72
73
|
onChange: (newValue) => {
|
|
73
74
|
model.changeValueTo(newValue.value, newValue.label, true);
|
|
74
|
-
queryController == null ? void 0 : queryController.startProfile(
|
|
75
|
+
queryController == null ? void 0 : queryController.startProfile(VARIABLE_VALUE_CHANGED_INTERACTION);
|
|
75
76
|
if (hasCustomValue !== newValue.__isNew__) {
|
|
76
77
|
setHasCustomValue(newValue.__isNew__);
|
|
77
78
|
}
|
|
@@ -144,7 +145,7 @@ function VariableValueSelectMulti({
|
|
|
144
145
|
onInputChange,
|
|
145
146
|
onBlur: () => {
|
|
146
147
|
model.changeValueTo(uncommittedValue, void 0, true);
|
|
147
|
-
queryController == null ? void 0 : queryController.startProfile(
|
|
148
|
+
queryController == null ? void 0 : queryController.startProfile(VARIABLE_VALUE_CHANGED_INTERACTION);
|
|
148
149
|
},
|
|
149
150
|
filterOption: filterNoOp,
|
|
150
151
|
"data-testid": selectors.pages.Dashboard.SubMenu.submenuItemValueDropDownValueLinkTexts(`${uncommittedValue}`),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VariableValueSelect.js","sources":["../../../../src/variables/components/VariableValueSelect.tsx"],"sourcesContent":["import { t } from '@grafana/i18n';\nimport { isArray } from 'lodash';\nimport React, { RefCallback, useEffect, useMemo, useState } from 'react';\nimport {\n Checkbox,\n InputActionMeta,\n MultiSelect,\n Select,\n ToggleAllState,\n getSelectStyles,\n useStyles2,\n useTheme2,\n} from '@grafana/ui';\n\nimport { MultiValueVariable, MultiValueVariableState } from '../variants/MultiValueVariable';\nimport { VariableValue, VariableValueSingle } from '../types';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { GrafanaTheme2, SelectableValue } from '@grafana/data';\nimport { css, cx } from '@emotion/css';\nimport { getOptionSearcher } from './getOptionSearcher';\nimport { sceneGraph } from '../../core/sceneGraph';\n\nconst filterNoOp = () => true;\n\nconst filterAll = (v: SelectableValue<VariableValueSingle>) => v.value !== '$__all';\n\nconst determineToggleAllState = (\n selectedValues: Array<SelectableValue<VariableValueSingle>>,\n options: Array<SelectableValue<VariableValueSingle>>\n) => {\n if (selectedValues.length === options.filter(filterAll).length) {\n return ToggleAllState.allSelected;\n } else if (\n selectedValues.length === 0 ||\n (selectedValues.length === 1 && selectedValues[0] && selectedValues[0].value === '$__all')\n ) {\n return ToggleAllState.noneSelected;\n } else {\n return ToggleAllState.indeterminate;\n }\n};\n\nexport function toSelectableValue<T>(value: T, label?: string): SelectableValue<T> {\n return {\n value,\n label: label ?? String(value),\n };\n}\n\nexport function VariableValueSelect({ model, state }: { model: MultiValueVariable; state: MultiValueVariableState }) {\n const { value, text, key, options, includeAll, isReadOnly, allowCustomValue = true } = state;\n const [inputValue, setInputValue] = useState('');\n const [hasCustomValue, setHasCustomValue] = useState(false);\n const selectValue = toSelectableValue(value, String(text));\n const queryController = sceneGraph.getQueryController(model);\n const optionSearcher = useMemo(() => getOptionSearcher(options, includeAll), [options, includeAll]);\n\n const onInputChange = (value: string, { action }: InputActionMeta) => {\n if (action === 'input-change') {\n setInputValue(value);\n if (model.onSearchChange) {\n model.onSearchChange!(value);\n }\n return value;\n }\n\n return value;\n };\n\n const filteredOptions = optionSearcher(inputValue);\n\n const onOpenMenu = () => {\n if (hasCustomValue) {\n setInputValue(String(text));\n }\n };\n\n const onCloseMenu = () => {\n setInputValue('');\n };\n\n return (\n <Select<VariableValue>\n id={key}\n isValidNewOption={(inputValue) => inputValue.trim().length > 0}\n placeholder={t('grafana-scenes.variables.variable-value-select.placeholder-select-value', 'Select value')}\n width=\"auto\"\n disabled={isReadOnly}\n value={selectValue}\n inputValue={inputValue}\n allowCustomValue={allowCustomValue}\n virtualized\n filterOption={filterNoOp}\n tabSelectsValue={false}\n onInputChange={onInputChange}\n onOpenMenu={onOpenMenu}\n onCloseMenu={onCloseMenu}\n options={filteredOptions}\n data-testid={selectors.pages.Dashboard.SubMenu.submenuItemValueDropDownValueLinkTexts(`${value}`)}\n onChange={(newValue) => {\n model.changeValueTo(newValue.value!, newValue.label!, true);\n queryController?.startProfile('VariableValueSelect');\n\n if (hasCustomValue !== newValue.__isNew__) {\n setHasCustomValue(newValue.__isNew__);\n }\n }}\n />\n );\n}\n\nexport function VariableValueSelectMulti({\n model,\n state,\n}: {\n model: MultiValueVariable;\n state: MultiValueVariableState;\n}) {\n const {\n value,\n options,\n key,\n maxVisibleValues,\n noValueOnClear,\n includeAll,\n isReadOnly,\n allowCustomValue = true,\n } = state;\n const arrayValue = useMemo(() => (isArray(value) ? value : [value]), [value]);\n // To not trigger queries on every selection we store this state locally here and only update the variable onBlur\n const [uncommittedValue, setUncommittedValue] = useState(arrayValue);\n const [inputValue, setInputValue] = useState('');\n const queryController = sceneGraph.getQueryController(model);\n\n const optionSearcher = useMemo(() => getOptionSearcher(options, includeAll), [options, includeAll]);\n\n // Detect value changes outside\n useEffect(() => {\n setUncommittedValue(arrayValue);\n }, [arrayValue]);\n\n const onInputChange = (value: string, { action }: InputActionMeta) => {\n if (action === 'input-change') {\n setInputValue(value);\n if (model.onSearchChange) {\n model.onSearchChange!(value);\n }\n return value;\n }\n\n if (action === 'input-blur') {\n setInputValue('');\n return '';\n }\n\n return inputValue;\n };\n\n const placeholder = options.length > 0 ? 'Select value' : '';\n const filteredOptions = optionSearcher(inputValue);\n\n return (\n <MultiSelect<VariableValueSingle>\n id={key}\n placeholder={placeholder}\n width=\"auto\"\n inputValue={inputValue}\n disabled={isReadOnly}\n value={uncommittedValue}\n noMultiValueWrap={true}\n maxVisibleValues={maxVisibleValues ?? 5}\n tabSelectsValue={false}\n virtualized\n allowCustomValue={allowCustomValue}\n //@ts-ignore\n toggleAllOptions={{\n enabled: true,\n optionsFilter: filterAll,\n determineToggleAllState: determineToggleAllState,\n }}\n options={filteredOptions}\n closeMenuOnSelect={false}\n components={{ Option: OptionWithCheckbox }}\n isClearable={true}\n hideSelectedOptions={false}\n onInputChange={onInputChange}\n onBlur={() => {\n model.changeValueTo(uncommittedValue, undefined, true);\n queryController?.startProfile('VariableValueSelectMulti');\n }}\n filterOption={filterNoOp}\n data-testid={selectors.pages.Dashboard.SubMenu.submenuItemValueDropDownValueLinkTexts(`${uncommittedValue}`)}\n onChange={(newValue, action) => {\n if (action.action === 'clear' && noValueOnClear) {\n model.changeValueTo([], undefined, true);\n }\n setUncommittedValue(newValue.map((x) => x.value!));\n }}\n />\n );\n}\n\ninterface SelectMenuOptionProps<T> {\n isDisabled: boolean;\n isFocused: boolean;\n isSelected: boolean;\n innerProps: JSX.IntrinsicElements['div'];\n innerRef: RefCallback<HTMLDivElement>;\n renderOptionLabel?: (value: SelectableValue<T>) => JSX.Element;\n data: SelectableValue<T>;\n indeterminate: boolean;\n}\n\nexport const OptionWithCheckbox = ({\n children,\n data,\n innerProps,\n innerRef,\n isFocused,\n isSelected,\n indeterminate,\n renderOptionLabel,\n}: React.PropsWithChildren<SelectMenuOptionProps<unknown>>) => {\n // We are removing onMouseMove and onMouseOver from innerProps because they cause the whole\n // list to re-render everytime the user hovers over an option. This is a performance issue.\n // See https://github.com/JedWatson/react-select/issues/3128#issuecomment-451936743\n const { onMouseMove, onMouseOver, ...rest } = innerProps;\n const theme = useTheme2();\n const selectStyles = getSelectStyles(theme);\n const optionStyles = useStyles2(getOptionStyles);\n\n return (\n <div\n ref={innerRef}\n className={cx(selectStyles.option, isFocused && selectStyles.optionFocused)}\n {...rest}\n // TODO: use below selector once we update grafana dependencies to ^11.1.0\n // data-testid={selectors.components.Select.option}\n data-testid=\"data-testid Select option\"\n title={data.title}\n >\n <div className={optionStyles.checkbox}>\n <Checkbox indeterminate={indeterminate} value={isSelected} />\n </div>\n <div\n className={selectStyles.optionBody}\n data-testid={selectors.pages.Dashboard.SubMenu.submenuItemValueDropDownOptionTexts(\n data.label ?? String(data.value)\n )}\n >\n <span>{children}</span>\n </div>\n </div>\n );\n};\n\nOptionWithCheckbox.displayName = 'SelectMenuOptions';\n\nconst getOptionStyles = (theme: GrafanaTheme2) => ({\n checkbox: css({\n marginRight: theme.spacing(2),\n }),\n});\n\nexport function MultiOrSingleValueSelect({ model }: { model: MultiValueVariable }) {\n const state = model.useState();\n\n if (state.isMulti) {\n return <VariableValueSelectMulti model={model} state={state} />;\n } else {\n return <VariableValueSelect model={model} state={state} />;\n }\n}\n"],"names":["value","inputValue"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"VariableValueSelect.js","sources":["../../../../src/variables/components/VariableValueSelect.tsx"],"sourcesContent":["import { t } from '@grafana/i18n';\nimport { isArray } from 'lodash';\nimport React, { RefCallback, useEffect, useMemo, useState } from 'react';\nimport {\n Checkbox,\n InputActionMeta,\n MultiSelect,\n Select,\n ToggleAllState,\n getSelectStyles,\n useStyles2,\n useTheme2,\n} from '@grafana/ui';\n\nimport { MultiValueVariable, MultiValueVariableState } from '../variants/MultiValueVariable';\nimport { VariableValue, VariableValueSingle } from '../types';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { GrafanaTheme2, SelectableValue } from '@grafana/data';\nimport { css, cx } from '@emotion/css';\nimport { getOptionSearcher } from './getOptionSearcher';\nimport { sceneGraph } from '../../core/sceneGraph';\nimport { VARIABLE_VALUE_CHANGED_INTERACTION } from '../../behaviors/SceneRenderProfiler';\n\nconst filterNoOp = () => true;\n\nconst filterAll = (v: SelectableValue<VariableValueSingle>) => v.value !== '$__all';\n\nconst determineToggleAllState = (\n selectedValues: Array<SelectableValue<VariableValueSingle>>,\n options: Array<SelectableValue<VariableValueSingle>>\n) => {\n if (selectedValues.length === options.filter(filterAll).length) {\n return ToggleAllState.allSelected;\n } else if (\n selectedValues.length === 0 ||\n (selectedValues.length === 1 && selectedValues[0] && selectedValues[0].value === '$__all')\n ) {\n return ToggleAllState.noneSelected;\n } else {\n return ToggleAllState.indeterminate;\n }\n};\n\nexport function toSelectableValue<T>(value: T, label?: string): SelectableValue<T> {\n return {\n value,\n label: label ?? String(value),\n };\n}\n\nexport function VariableValueSelect({ model, state }: { model: MultiValueVariable; state: MultiValueVariableState }) {\n const { value, text, key, options, includeAll, isReadOnly, allowCustomValue = true } = state;\n const [inputValue, setInputValue] = useState('');\n const [hasCustomValue, setHasCustomValue] = useState(false);\n const selectValue = toSelectableValue(value, String(text));\n const queryController = sceneGraph.getQueryController(model);\n const optionSearcher = useMemo(() => getOptionSearcher(options, includeAll), [options, includeAll]);\n\n const onInputChange = (value: string, { action }: InputActionMeta) => {\n if (action === 'input-change') {\n setInputValue(value);\n if (model.onSearchChange) {\n model.onSearchChange!(value);\n }\n return value;\n }\n\n return value;\n };\n\n const filteredOptions = optionSearcher(inputValue);\n\n const onOpenMenu = () => {\n if (hasCustomValue) {\n setInputValue(String(text));\n }\n };\n\n const onCloseMenu = () => {\n setInputValue('');\n };\n\n return (\n <Select<VariableValue>\n id={key}\n isValidNewOption={(inputValue) => inputValue.trim().length > 0}\n placeholder={t('grafana-scenes.variables.variable-value-select.placeholder-select-value', 'Select value')}\n width=\"auto\"\n disabled={isReadOnly}\n value={selectValue}\n inputValue={inputValue}\n allowCustomValue={allowCustomValue}\n virtualized\n filterOption={filterNoOp}\n tabSelectsValue={false}\n onInputChange={onInputChange}\n onOpenMenu={onOpenMenu}\n onCloseMenu={onCloseMenu}\n options={filteredOptions}\n data-testid={selectors.pages.Dashboard.SubMenu.submenuItemValueDropDownValueLinkTexts(`${value}`)}\n onChange={(newValue) => {\n model.changeValueTo(newValue.value!, newValue.label!, true);\n queryController?.startProfile(VARIABLE_VALUE_CHANGED_INTERACTION);\n\n if (hasCustomValue !== newValue.__isNew__) {\n setHasCustomValue(newValue.__isNew__);\n }\n }}\n />\n );\n}\n\nexport function VariableValueSelectMulti({\n model,\n state,\n}: {\n model: MultiValueVariable;\n state: MultiValueVariableState;\n}) {\n const {\n value,\n options,\n key,\n maxVisibleValues,\n noValueOnClear,\n includeAll,\n isReadOnly,\n allowCustomValue = true,\n } = state;\n const arrayValue = useMemo(() => (isArray(value) ? value : [value]), [value]);\n // To not trigger queries on every selection we store this state locally here and only update the variable onBlur\n const [uncommittedValue, setUncommittedValue] = useState(arrayValue);\n const [inputValue, setInputValue] = useState('');\n const queryController = sceneGraph.getQueryController(model);\n\n const optionSearcher = useMemo(() => getOptionSearcher(options, includeAll), [options, includeAll]);\n\n // Detect value changes outside\n useEffect(() => {\n setUncommittedValue(arrayValue);\n }, [arrayValue]);\n\n const onInputChange = (value: string, { action }: InputActionMeta) => {\n if (action === 'input-change') {\n setInputValue(value);\n if (model.onSearchChange) {\n model.onSearchChange!(value);\n }\n return value;\n }\n\n if (action === 'input-blur') {\n setInputValue('');\n return '';\n }\n\n return inputValue;\n };\n\n const placeholder = options.length > 0 ? 'Select value' : '';\n const filteredOptions = optionSearcher(inputValue);\n\n return (\n <MultiSelect<VariableValueSingle>\n id={key}\n placeholder={placeholder}\n width=\"auto\"\n inputValue={inputValue}\n disabled={isReadOnly}\n value={uncommittedValue}\n noMultiValueWrap={true}\n maxVisibleValues={maxVisibleValues ?? 5}\n tabSelectsValue={false}\n virtualized\n allowCustomValue={allowCustomValue}\n //@ts-ignore\n toggleAllOptions={{\n enabled: true,\n optionsFilter: filterAll,\n determineToggleAllState: determineToggleAllState,\n }}\n options={filteredOptions}\n closeMenuOnSelect={false}\n components={{ Option: OptionWithCheckbox }}\n isClearable={true}\n hideSelectedOptions={false}\n onInputChange={onInputChange}\n onBlur={() => {\n model.changeValueTo(uncommittedValue, undefined, true);\n queryController?.startProfile(VARIABLE_VALUE_CHANGED_INTERACTION);\n }}\n filterOption={filterNoOp}\n data-testid={selectors.pages.Dashboard.SubMenu.submenuItemValueDropDownValueLinkTexts(`${uncommittedValue}`)}\n onChange={(newValue, action) => {\n if (action.action === 'clear' && noValueOnClear) {\n model.changeValueTo([], undefined, true);\n }\n setUncommittedValue(newValue.map((x) => x.value!));\n }}\n />\n );\n}\n\ninterface SelectMenuOptionProps<T> {\n isDisabled: boolean;\n isFocused: boolean;\n isSelected: boolean;\n innerProps: JSX.IntrinsicElements['div'];\n innerRef: RefCallback<HTMLDivElement>;\n renderOptionLabel?: (value: SelectableValue<T>) => JSX.Element;\n data: SelectableValue<T>;\n indeterminate: boolean;\n}\n\nexport const OptionWithCheckbox = ({\n children,\n data,\n innerProps,\n innerRef,\n isFocused,\n isSelected,\n indeterminate,\n renderOptionLabel,\n}: React.PropsWithChildren<SelectMenuOptionProps<unknown>>) => {\n // We are removing onMouseMove and onMouseOver from innerProps because they cause the whole\n // list to re-render everytime the user hovers over an option. This is a performance issue.\n // See https://github.com/JedWatson/react-select/issues/3128#issuecomment-451936743\n const { onMouseMove, onMouseOver, ...rest } = innerProps;\n const theme = useTheme2();\n const selectStyles = getSelectStyles(theme);\n const optionStyles = useStyles2(getOptionStyles);\n\n return (\n <div\n ref={innerRef}\n className={cx(selectStyles.option, isFocused && selectStyles.optionFocused)}\n {...rest}\n // TODO: use below selector once we update grafana dependencies to ^11.1.0\n // data-testid={selectors.components.Select.option}\n data-testid=\"data-testid Select option\"\n title={data.title}\n >\n <div className={optionStyles.checkbox}>\n <Checkbox indeterminate={indeterminate} value={isSelected} />\n </div>\n <div\n className={selectStyles.optionBody}\n data-testid={selectors.pages.Dashboard.SubMenu.submenuItemValueDropDownOptionTexts(\n data.label ?? String(data.value)\n )}\n >\n <span>{children}</span>\n </div>\n </div>\n );\n};\n\nOptionWithCheckbox.displayName = 'SelectMenuOptions';\n\nconst getOptionStyles = (theme: GrafanaTheme2) => ({\n checkbox: css({\n marginRight: theme.spacing(2),\n }),\n});\n\nexport function MultiOrSingleValueSelect({ model }: { model: MultiValueVariable }) {\n const state = model.useState();\n\n if (state.isMulti) {\n return <VariableValueSelectMulti model={model} state={state} />;\n } else {\n return <VariableValueSelect model={model} state={state} />;\n }\n}\n"],"names":["value","inputValue"],"mappings":"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"}
|
|
@@ -5,6 +5,8 @@ import { useContext, useEffect } from 'react';
|
|
|
5
5
|
import { VariableHide, VariableFormatID } from '@grafana/schema';
|
|
6
6
|
import { SCOPES_VARIABLE_NAME } from '../constants.js';
|
|
7
7
|
import { isEqual } from 'lodash';
|
|
8
|
+
import { getQueryController } from '../../core/sceneGraph/getQueryController.js';
|
|
9
|
+
import { SCOPES_CHANGED_INTERACTION } from '../../behaviors/SceneRenderProfiler.js';
|
|
8
10
|
|
|
9
11
|
class ScopesVariable extends SceneObjectBase {
|
|
10
12
|
constructor(state) {
|
|
@@ -62,6 +64,8 @@ class ScopesVariable extends SceneObjectBase {
|
|
|
62
64
|
const newScopes = state.value.map((scope) => scope.metadata.name);
|
|
63
65
|
const scopesHaveChanged = !isEqual(oldScopes, newScopes);
|
|
64
66
|
if (!loading && (scopesHaveChanged || newScopes.length === 0)) {
|
|
67
|
+
const queryController = getQueryController(this);
|
|
68
|
+
queryController == null ? void 0 : queryController.startProfile(SCOPES_CHANGED_INTERACTION);
|
|
65
69
|
this.setState({ scopes: state.value, loading });
|
|
66
70
|
this.publishEvent(new SceneVariableValueChangedEvent(this), true);
|
|
67
71
|
} else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScopesVariable.js","sources":["../../../../src/variables/variants/ScopesVariable.tsx"],"sourcesContent":["import { SceneObjectBase } from '../../core/SceneObjectBase';\nimport {\n CustomVariableValue,\n SceneVariable,\n SceneVariableState,\n SceneVariableValueChangedEvent,\n VariableValue,\n} from '../types';\nimport { Scope } from '@grafana/data';\nimport { SceneComponentProps } from '../../core/types';\nimport { ScopesContext, ScopesContextValue } from '@grafana/runtime';\nimport { useContext, useEffect } from 'react';\nimport { VariableFormatID, VariableHide } from '@grafana/schema';\nimport { SCOPES_VARIABLE_NAME } from '../constants';\nimport { isEqual } from 'lodash';\n\nexport interface ScopesVariableState extends SceneVariableState {\n /**\n * Last captured state from ScopesContext\n */\n scopes: Scope[];\n /**\n * Set to true if you want to the variable to enable / disable scopes when activated / deactivated\n */\n enable?: boolean;\n}\n\nexport class ScopesVariable extends SceneObjectBase<ScopesVariableState> implements SceneVariable<ScopesVariableState> {\n protected _renderBeforeActivation = true;\n protected _context: ScopesContextValue | undefined;\n\n // Special options that enables variables to be hidden but still render to access react contexts\n public UNSAFE_renderAsHidden = true;\n public static Component = ScopesVariableRenderer;\n\n public constructor(state: Partial<ScopesVariableState>) {\n super({\n skipUrlSync: true,\n loading: true,\n scopes: [],\n ...state,\n type: 'system',\n name: SCOPES_VARIABLE_NAME,\n hide: VariableHide.hideVariable,\n });\n }\n\n /**\n * Temporary simple implementation to stringify the scopes.\n */\n public getValue(): VariableValue {\n const scopes = this.state.scopes ?? [];\n return new ScopesVariableFormatter(scopes.map((scope) => scope.metadata.name));\n }\n\n public getScopes(): Scope[] | undefined {\n return this.state.scopes;\n }\n\n /**\n * This method is used to keep the context up to date with the scopes context received from React\n * 1) Subscribes to ScopesContext state changes and synchronizes it with the variable state\n * 2) Handles enable / disabling of scopes based on variable enable option.\n */\n public setContext(context: ScopesContextValue | undefined) {\n if (!context) {\n return;\n }\n\n this._context = context;\n\n const oldState = context.state;\n\n // Update scopes enable state if state.enable is defined\n if (this.state.enable != null) {\n context.setEnabled(this.state.enable);\n }\n\n // Subscribe to context state changes\n const sub = context.stateObservable.subscribe((state) => {\n this.updateStateFromContext(state);\n });\n\n return () => {\n sub.unsubscribe();\n\n if (this.state.enable != null) {\n context.setEnabled(oldState.enabled);\n }\n };\n }\n\n public updateStateFromContext(state: { loading: boolean; value: Scope[] }) {\n // There was logic in SceneQueryRunner that said if there are no scopes then loading state should not block query execution\n const loading = state.value.length === 0 ? false : state.loading;\n const oldScopes = this.state.scopes.map((scope) => scope.metadata.name);\n const newScopes = state.value.map((scope) => scope.metadata.name);\n const scopesHaveChanged = !isEqual(oldScopes, newScopes);\n\n // Only update scopes value state when loading is false and the scopes have changed\n if (!loading && (scopesHaveChanged || newScopes.length === 0)) {\n this.setState({ scopes: state.value, loading });\n this.publishEvent(new SceneVariableValueChangedEvent(this), true);\n } else {\n this.setState({ loading });\n }\n }\n}\n\nfunction ScopesVariableRenderer({ model }: SceneComponentProps<ScopesVariable>) {\n const context = useContext(ScopesContext);\n\n useEffect(() => {\n return model.setContext(context);\n }, [context, model]);\n\n return null;\n}\n\nexport class ScopesVariableFormatter implements CustomVariableValue {\n public constructor(private _value: string[]) {}\n\n public formatter(formatNameOrFn?: string): string {\n if (formatNameOrFn === VariableFormatID.QueryParam) {\n return this._value.map((scope) => `scope=${encodeURIComponent(scope)}`).join('&');\n }\n\n return this._value.join(', ');\n }\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ScopesVariable.js","sources":["../../../../src/variables/variants/ScopesVariable.tsx"],"sourcesContent":["import { SceneObjectBase } from '../../core/SceneObjectBase';\nimport {\n CustomVariableValue,\n SceneVariable,\n SceneVariableState,\n SceneVariableValueChangedEvent,\n VariableValue,\n} from '../types';\nimport { Scope } from '@grafana/data';\nimport { SceneComponentProps } from '../../core/types';\nimport { ScopesContext, ScopesContextValue } from '@grafana/runtime';\nimport { useContext, useEffect } from 'react';\nimport { VariableFormatID, VariableHide } from '@grafana/schema';\nimport { SCOPES_VARIABLE_NAME } from '../constants';\nimport { isEqual } from 'lodash';\nimport { getQueryController } from '../../core/sceneGraph/getQueryController';\nimport { SCOPES_CHANGED_INTERACTION } from '../../behaviors/SceneRenderProfiler';\n\nexport interface ScopesVariableState extends SceneVariableState {\n /**\n * Last captured state from ScopesContext\n */\n scopes: Scope[];\n /**\n * Set to true if you want to the variable to enable / disable scopes when activated / deactivated\n */\n enable?: boolean;\n}\n\nexport class ScopesVariable extends SceneObjectBase<ScopesVariableState> implements SceneVariable<ScopesVariableState> {\n protected _renderBeforeActivation = true;\n protected _context: ScopesContextValue | undefined;\n\n // Special options that enables variables to be hidden but still render to access react contexts\n public UNSAFE_renderAsHidden = true;\n public static Component = ScopesVariableRenderer;\n\n public constructor(state: Partial<ScopesVariableState>) {\n super({\n skipUrlSync: true,\n loading: true,\n scopes: [],\n ...state,\n type: 'system',\n name: SCOPES_VARIABLE_NAME,\n hide: VariableHide.hideVariable,\n });\n }\n\n /**\n * Temporary simple implementation to stringify the scopes.\n */\n public getValue(): VariableValue {\n const scopes = this.state.scopes ?? [];\n return new ScopesVariableFormatter(scopes.map((scope) => scope.metadata.name));\n }\n\n public getScopes(): Scope[] | undefined {\n return this.state.scopes;\n }\n\n /**\n * This method is used to keep the context up to date with the scopes context received from React\n * 1) Subscribes to ScopesContext state changes and synchronizes it with the variable state\n * 2) Handles enable / disabling of scopes based on variable enable option.\n */\n public setContext(context: ScopesContextValue | undefined) {\n if (!context) {\n return;\n }\n\n this._context = context;\n\n const oldState = context.state;\n\n // Update scopes enable state if state.enable is defined\n if (this.state.enable != null) {\n context.setEnabled(this.state.enable);\n }\n\n // Subscribe to context state changes\n const sub = context.stateObservable.subscribe((state) => {\n this.updateStateFromContext(state);\n });\n\n return () => {\n sub.unsubscribe();\n\n if (this.state.enable != null) {\n context.setEnabled(oldState.enabled);\n }\n };\n }\n\n public updateStateFromContext(state: { loading: boolean; value: Scope[] }) {\n // There was logic in SceneQueryRunner that said if there are no scopes then loading state should not block query execution\n const loading = state.value.length === 0 ? false : state.loading;\n const oldScopes = this.state.scopes.map((scope) => scope.metadata.name);\n const newScopes = state.value.map((scope) => scope.metadata.name);\n const scopesHaveChanged = !isEqual(oldScopes, newScopes);\n\n // Only update scopes value state when loading is false and the scopes have changed\n if (!loading && (scopesHaveChanged || newScopes.length === 0)) {\n const queryController = getQueryController(this);\n queryController?.startProfile(SCOPES_CHANGED_INTERACTION);\n this.setState({ scopes: state.value, loading });\n this.publishEvent(new SceneVariableValueChangedEvent(this), true);\n } else {\n this.setState({ loading });\n }\n }\n}\n\nfunction ScopesVariableRenderer({ model }: SceneComponentProps<ScopesVariable>) {\n const context = useContext(ScopesContext);\n\n useEffect(() => {\n return model.setContext(context);\n }, [context, model]);\n\n return null;\n}\n\nexport class ScopesVariableFormatter implements CustomVariableValue {\n public constructor(private _value: string[]) {}\n\n public formatter(formatNameOrFn?: string): string {\n if (formatNameOrFn === VariableFormatID.QueryParam) {\n return this._value.map((scope) => `scope=${encodeURIComponent(scope)}`).join('&');\n }\n\n return this._value.join(', ');\n }\n}\n"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1293,7 +1293,7 @@ interface SceneQueryControllerEntry {
|
|
|
1293
1293
|
origin: SceneObject;
|
|
1294
1294
|
cancel?: () => void;
|
|
1295
1295
|
}
|
|
1296
|
-
type SceneQueryControllerEntryType = 'data' | 'annotations' | 'variable' | 'alerts' | 'plugin';
|
|
1296
|
+
type SceneQueryControllerEntryType = 'data' | 'annotations' | 'variable' | 'alerts' | 'plugin' | string;
|
|
1297
1297
|
interface SceneInteractionProfileEvent {
|
|
1298
1298
|
origin: string;
|
|
1299
1299
|
duration: number;
|