@grafana/scenes 6.52.1--canary.1323.20573204293.0 → 6.52.1--canary.1323.20597071326.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.
|
@@ -125,61 +125,46 @@ const _MultiValueVariable = class _MultiValueVariable extends SceneObjectBase {
|
|
|
125
125
|
value = this.state.options.map((o) => o.value);
|
|
126
126
|
}
|
|
127
127
|
if (fieldPath != null) {
|
|
128
|
-
|
|
129
|
-
const index = parseInt(fieldPath, 10);
|
|
130
|
-
if (!isNaN(index) && index >= 0 && index < value.length) {
|
|
131
|
-
return value[index];
|
|
132
|
-
}
|
|
133
|
-
const accesor2 = this.getFieldAccessor(fieldPath);
|
|
134
|
-
return value.map((v) => {
|
|
135
|
-
const o2 = this.state.options.find((o3) => o3.value === v);
|
|
136
|
-
return o2 ? accesor2(o2.properties) : v;
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
const accesor = this.getFieldAccessor(fieldPath);
|
|
140
|
-
const o = this.state.options.find((o2) => o2.value === value);
|
|
141
|
-
if (o) {
|
|
142
|
-
return accesor(o.properties);
|
|
143
|
-
}
|
|
128
|
+
return this.getFieldAtPath(value, fieldPath);
|
|
144
129
|
}
|
|
145
130
|
return value;
|
|
146
131
|
}
|
|
147
|
-
getFieldAccessor(fieldPath) {
|
|
148
|
-
const accessor = _MultiValueVariable.fieldAccessorCache[fieldPath];
|
|
149
|
-
if (accessor) {
|
|
150
|
-
return accessor;
|
|
151
|
-
}
|
|
152
|
-
return _MultiValueVariable.fieldAccessorCache[fieldPath] = property(fieldPath);
|
|
153
|
-
}
|
|
154
132
|
getValueText(fieldPath) {
|
|
155
133
|
if (this.hasAllValue()) {
|
|
156
134
|
return ALL_VARIABLE_TEXT;
|
|
157
135
|
}
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
const option = this.state.options.find((o) => o.value === v);
|
|
170
|
-
return option ? accessor(option.properties) : v;
|
|
171
|
-
}).join(" + ");
|
|
172
|
-
} else {
|
|
173
|
-
const option = this.state.options.find((o) => o.value === this.state.value);
|
|
174
|
-
if (option) {
|
|
175
|
-
return String(accessor(option.properties));
|
|
136
|
+
const text = fieldPath != null ? this.getFieldAtPath(this.state.value, fieldPath, true) : this.state.text;
|
|
137
|
+
return Array.isArray(text) ? text.join(" + ") : String(text);
|
|
138
|
+
}
|
|
139
|
+
getFieldAtPath(value, fieldPath, returnText = false) {
|
|
140
|
+
const accesor = this.getFieldAccessor(fieldPath);
|
|
141
|
+
if (Array.isArray(value)) {
|
|
142
|
+
const index = parseInt(fieldPath, 10);
|
|
143
|
+
if (!isNaN(index) && index >= 0 && index < value.length) {
|
|
144
|
+
const v = value[index];
|
|
145
|
+
if (!returnText) {
|
|
146
|
+
return v;
|
|
176
147
|
}
|
|
148
|
+
const o2 = this.state.options.find((o3) => o3.value === v);
|
|
149
|
+
return o2 ? o2.label : String(v);
|
|
177
150
|
}
|
|
151
|
+
return value.map((v) => {
|
|
152
|
+
const o2 = this.state.options.find((o3) => o3.value === v);
|
|
153
|
+
return o2 ? accesor(o2.properties) : v;
|
|
154
|
+
});
|
|
178
155
|
}
|
|
179
|
-
|
|
180
|
-
|
|
156
|
+
const o = this.state.options.find((o2) => o2.value === value);
|
|
157
|
+
if (o) {
|
|
158
|
+
return accesor(o.properties);
|
|
181
159
|
}
|
|
182
|
-
return
|
|
160
|
+
return returnText ? this.state.text : value;
|
|
161
|
+
}
|
|
162
|
+
getFieldAccessor(fieldPath) {
|
|
163
|
+
const accessor = _MultiValueVariable.fieldAccessorCache[fieldPath];
|
|
164
|
+
if (accessor) {
|
|
165
|
+
return accessor;
|
|
166
|
+
}
|
|
167
|
+
return _MultiValueVariable.fieldAccessorCache[fieldPath] = property(fieldPath);
|
|
183
168
|
}
|
|
184
169
|
hasAllValue() {
|
|
185
170
|
const value = this.state.value;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultiValueVariable.js","sources":["../../../../../../../src/variables/variants/MultiValueVariable.ts"],"sourcesContent":["import { isArray, isEqual, property } from 'lodash';\nimport { map, Observable } from 'rxjs';\n\nimport { ALL_VARIABLE_TEXT, ALL_VARIABLE_VALUE } from '../constants';\n\nimport { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { SceneObjectUrlSyncHandler, SceneObjectUrlValues } from '../../core/types';\nimport {\n SceneVariable,\n SceneVariableValueChangedEvent,\n SceneVariableState,\n ValidateAndUpdateResult,\n VariableValue,\n VariableValueOption,\n VariableValueSingle,\n CustomVariableValue,\n VariableCustomFormatterFn,\n} from '../types';\nimport { formatRegistry } from '../interpolation/formatRegistry';\nimport { VariableFormatID } from '@grafana/schema';\nimport { SceneVariableSet } from '../sets/SceneVariableSet';\nimport { setBaseClassState } from '../../utils/utils';\nimport { VARIABLE_VALUE_CHANGED_INTERACTION } from '../../performance/interactionConstants';\nimport { getQueryController } from '../../core/sceneGraph/getQueryController';\n\nexport interface MultiValueVariableState extends SceneVariableState {\n value: VariableValue; // old current.text\n text: VariableValue; // old current.value\n options: VariableValueOption[];\n allowCustomValue?: boolean;\n isMulti?: boolean;\n includeAll?: boolean;\n defaultToAll?: boolean;\n allValue?: string;\n placeholder?: string;\n /**\n * For multi value variables, this option controls how many values to show before they are collapsed into +N.\n * Defaults to 5\n */\n maxVisibleValues?: number;\n noValueOnClear?: boolean;\n isReadOnly?: boolean;\n}\n\nexport interface VariableGetOptionsArgs {\n searchFilter?: string;\n}\n\nexport abstract class MultiValueVariable<TState extends MultiValueVariableState = MultiValueVariableState>\n extends SceneObjectBase<TState>\n implements SceneVariable<TState>\n{\n private static fieldAccessorCache: FieldAccessorCache = {};\n\n protected _urlSync: SceneObjectUrlSyncHandler = new MultiValueUrlSyncHandler(this);\n\n /**\n * Set to true to skip next value validation to maintain the current value even it it's not among the options (ie valid values)\n */\n public skipNextValidation?: boolean;\n\n /**\n * The source of value options.\n */\n public abstract getValueOptions(args: VariableGetOptionsArgs): Observable<VariableValueOption[]>;\n\n /**\n * This function is called on when SceneVariableSet is activated or when a dependency changes.\n */\n public validateAndUpdate(): Observable<ValidateAndUpdateResult> {\n return this.getValueOptions({}).pipe(\n map((options) => {\n this.updateValueGivenNewOptions(options);\n return {};\n })\n );\n }\n\n public onCancel(): void {\n this.setStateHelper({ loading: false });\n const sceneVarSet = this.parent as SceneVariableSet;\n sceneVarSet?.cancel(this);\n }\n\n /**\n * Check if current value is valid given new options. If not update the value.\n */\n private updateValueGivenNewOptions(options: VariableValueOption[]) {\n // Remember current value and text\n const { value: currentValue, text: currentText, options: oldOptions } = this.state;\n\n const stateUpdate = this.getStateUpdateGivenNewOptions(options, currentValue, currentText);\n\n this.interceptStateUpdateAfterValidation(stateUpdate);\n\n // Perform state change\n this.setStateHelper(stateUpdate);\n\n // Publish value changed event only if value changed\n if (\n stateUpdate.value !== currentValue ||\n stateUpdate.text !== currentText ||\n (this.hasAllValue() && !isEqual(options, oldOptions))\n ) {\n this.publishEvent(new SceneVariableValueChangedEvent(this), true);\n }\n }\n\n private getStateUpdateGivenNewOptions(\n options: VariableValueOption[],\n currentValue: VariableValue,\n currentText: VariableValue\n ): Partial<MultiValueVariableState> {\n const stateUpdate: Partial<MultiValueVariableState> = {\n options,\n loading: false,\n value: currentValue,\n text: currentText,\n };\n\n if (options.length === 0) {\n if (this.state.defaultToAll || this.state.includeAll) {\n stateUpdate.value = ALL_VARIABLE_VALUE;\n stateUpdate.text = ALL_VARIABLE_TEXT;\n } else if (this.state.isMulti) {\n stateUpdate.value = [];\n stateUpdate.text = [];\n } else {\n stateUpdate.value = '';\n stateUpdate.text = '';\n }\n\n return stateUpdate;\n }\n\n if (this.hasAllValue()) {\n if (this.state.includeAll) {\n // Sometimes the text representation is also set the ALL_VARIABLE_VALUE, this fixes that\n stateUpdate.text = ALL_VARIABLE_TEXT;\n } else {\n stateUpdate.value = options[0].value;\n stateUpdate.text = options[0].label;\n // If multi switch to arrays\n if (this.state.isMulti) {\n stateUpdate.value = [stateUpdate.value];\n stateUpdate.text = [stateUpdate.text];\n }\n }\n return stateUpdate;\n }\n\n if (this.state.isMulti) {\n // If we are a multi valued variable validate the current values are among the options\n const currentValues = Array.isArray(currentValue) ? currentValue : [currentValue];\n const validValues = currentValues.filter((v) => options.find((o) => o.value === v));\n const validTexts = validValues.map((v) => options.find((o) => o.value === v)!.label);\n\n // If no valid values pick the first option\n if (validValues.length === 0) {\n const defaultState = this.getDefaultMultiState(options);\n stateUpdate.value = defaultState.value;\n stateUpdate.text = defaultState.text;\n } else {\n // We have valid values, if it's different from current valid values update current values\n if (!isEqual(validValues, currentValue)) {\n stateUpdate.value = validValues;\n }\n if (!isEqual(validTexts, currentText)) {\n stateUpdate.text = validTexts;\n }\n }\n\n return stateUpdate;\n }\n\n // Single value variable validation\n\n // Try find by value then text\n let matchingOption = findOptionMatchingCurrent(currentValue, currentText, options);\n if (matchingOption) {\n // When updating the initial state from URL the text property is set the same as value\n // Here we can correct the text value state\n stateUpdate.text = matchingOption.label;\n stateUpdate.value = matchingOption.value;\n } else {\n // Current value is found in options\n const defaultState = this.getDefaultSingleState(options);\n stateUpdate.value = defaultState.value;\n stateUpdate.text = defaultState.label;\n }\n\n return stateUpdate;\n }\n\n /**\n * Values set by initial URL sync needs to survive the next validation and update.\n * This function can intercept and make sure those values are preserved.\n */\n protected interceptStateUpdateAfterValidation(stateUpdate: Partial<MultiValueVariableState>): void {\n // If the validation wants to fix the all value (All ==> $__all) then we should let that pass\n const isAllValueFix = stateUpdate.value === ALL_VARIABLE_VALUE && this.state.text === ALL_VARIABLE_TEXT;\n\n if (\n this.skipNextValidation &&\n stateUpdate.value !== this.state.value &&\n stateUpdate.text !== this.state.text &&\n !isAllValueFix\n ) {\n stateUpdate.value = this.state.value;\n stateUpdate.text = this.state.text;\n }\n\n this.skipNextValidation = false;\n }\n\n public getValue(fieldPath?: string): VariableValue {\n let value = this.state.value;\n\n if (this.hasAllValue()) {\n if (this.state.allValue) {\n return new CustomAllValue(this.state.allValue, this);\n }\n value = this.state.options.map((o) => o.value);\n }\n\n if (fieldPath != null) {\n if (Array.isArray(value)) {\n const index = parseInt(fieldPath, 10);\n if (!isNaN(index) && index >= 0 && index < value.length) {\n return value[index];\n }\n\n const accesor = this.getFieldAccessor(fieldPath);\n return value.map((v) => {\n const o = this.state.options.find((o) => o.value === v);\n return o ? accesor(o.properties) : v;\n });\n }\n\n const accesor = this.getFieldAccessor(fieldPath);\n const o = this.state.options.find((o) => o.value === value);\n if (o) {\n return accesor(o.properties);\n }\n }\n\n return value;\n }\n\n private getFieldAccessor(fieldPath: string) {\n const accessor = MultiValueVariable.fieldAccessorCache[fieldPath];\n if (accessor) {\n return accessor;\n }\n\n return (MultiValueVariable.fieldAccessorCache[fieldPath] = property(fieldPath));\n }\n\n public getValueText(fieldPath?: string): string {\n if (this.hasAllValue()) {\n return ALL_VARIABLE_TEXT;\n }\n\n if (fieldPath != null) {\n const accessor = this.getFieldAccessor(fieldPath);\n\n if (Array.isArray(this.state.value)) {\n const index = parseInt(fieldPath, 10);\n if (!isNaN(index) && index >= 0 && index < this.state.value.length) {\n const option = this.state.options[index];\n if (option) {\n return String(option.label);\n }\n }\n\n return this.state.value\n .map((v) => {\n const option = this.state.options.find((o) => o.value === v);\n return option ? accessor(option.properties) : v;\n })\n .join(' + ');\n } else {\n const option = this.state.options.find((o) => o.value === this.state.value);\n if (option) {\n return String(accessor(option.properties));\n }\n }\n }\n\n if (Array.isArray(this.state.text)) {\n return this.state.text.join(' + ');\n }\n\n return String(this.state.text);\n }\n\n public hasAllValue() {\n const value = this.state.value;\n return value === ALL_VARIABLE_VALUE || (Array.isArray(value) && value[0] === ALL_VARIABLE_VALUE);\n }\n\n public getDefaultMultiState(options: VariableValueOption[]) {\n if (this.state.defaultToAll) {\n return { value: [ALL_VARIABLE_VALUE], text: [ALL_VARIABLE_TEXT] };\n } else if (options.length > 0) {\n return { value: [options[0].value], text: [options[0].label], properties: [options[0].properties] };\n } else {\n return { value: [], text: [] };\n }\n }\n\n protected getDefaultSingleState(options: VariableValueOption[]): VariableValueOption {\n if (this.state.defaultToAll) {\n return { value: ALL_VARIABLE_VALUE, label: ALL_VARIABLE_TEXT };\n } else if (options.length > 0) {\n return { value: options[0].value, label: options[0].label, properties: options[0].properties };\n } else {\n return { value: '', label: '' };\n }\n }\n\n /**\n * Change the value and publish SceneVariableValueChangedEvent event.\n */\n public changeValueTo(value: VariableValue, text?: VariableValue, isUserAction = false) {\n // Ignore if there is no change\n if (value === this.state.value && text === this.state.text) {\n return;\n }\n\n if (!text) {\n if (Array.isArray(value)) {\n text = value.map((v) => this.findLabelTextForValue(v));\n } else {\n text = this.findLabelTextForValue(value);\n }\n }\n\n if (Array.isArray(value)) {\n // If we are a multi valued variable is cleared (empty array) we need to set the default empty state\n if (value.length === 0) {\n const state = this.getDefaultMultiState(this.state.options);\n value = state.value;\n text = state.text;\n }\n\n // If last value is the All value then replace all with it\n if (value[value.length - 1] === ALL_VARIABLE_VALUE) {\n value = [ALL_VARIABLE_VALUE];\n text = [ALL_VARIABLE_TEXT];\n }\n // If the first value is the ALL value and we have other values, then remove the All value\n else if (value[0] === ALL_VARIABLE_VALUE && value.length > 1) {\n value.shift();\n if (Array.isArray(text)) {\n text.shift();\n }\n }\n }\n\n // Do nothing if value and text are the same\n if (isEqual(value, this.state.value) && isEqual(text, this.state.text)) {\n return;\n }\n\n const stateChangeAction = () => this.setStateHelper({ value, text, loading: false });\n /**\n * Because variable state changes can cause a whole chain of downstream state changes in other variables (that also cause URL update)\n * Only some variable changes should add new history items to make sure the browser history contains valid URL states to go back to.\n */\n if (isUserAction) {\n const queryController = getQueryController(this);\n queryController?.startProfile(VARIABLE_VALUE_CHANGED_INTERACTION);\n this._urlSync.performBrowserHistoryAction?.(stateChangeAction);\n } else {\n stateChangeAction();\n }\n\n this.publishEvent(new SceneVariableValueChangedEvent(this), true);\n }\n\n private findLabelTextForValue(value: VariableValueSingle): VariableValueSingle {\n if (value === ALL_VARIABLE_VALUE) {\n return ALL_VARIABLE_TEXT;\n }\n\n const option = this.state.options.find((x) => x.value === value);\n if (option) {\n return option.label;\n }\n\n const optionByLabel = this.state.options.find((x) => x.label === value);\n if (optionByLabel) {\n return optionByLabel.label;\n }\n\n return value;\n }\n\n /**\n * This helper function is to counter the contravariance of setState\n */\n private setStateHelper(state: Partial<MultiValueVariableState>) {\n setBaseClassState<MultiValueVariableState>(this, state);\n }\n\n public getOptionsForSelect(includeCurrentValue = true): VariableValueOption[] {\n let options = this.state.options;\n\n if (this.state.includeAll) {\n options = [{ value: ALL_VARIABLE_VALUE, label: ALL_VARIABLE_TEXT }, ...options];\n }\n\n if (includeCurrentValue && !Array.isArray(this.state.value)) {\n const current = options.find((x) => x.value === this.state.value);\n if (!current) {\n options = [{ value: this.state.value, label: String(this.state.text) }, ...options];\n }\n }\n\n return options;\n }\n\n public refreshOptions() {\n this.getValueOptions({}).subscribe((options) => {\n this.updateValueGivenNewOptions(options);\n });\n }\n\n /**\n * Can be used by subclasses to do custom handling of option search based on search input\n */\n public onSearchChange?(searchFilter: string): void;\n}\n\n/**\n * Looks for matching option, first by value but as a fallback by text (label).\n */\nfunction findOptionMatchingCurrent(\n currentValue: VariableValue,\n currentText: VariableValue,\n options: VariableValueOption[]\n) {\n let textMatch: VariableValueOption | undefined;\n\n for (const o of options) {\n if (o.value === currentValue) {\n return o;\n }\n\n // No early return here as want to continue to look a value match\n if (o.label === currentText) {\n textMatch = o;\n }\n }\n\n return textMatch;\n}\n\nexport class MultiValueUrlSyncHandler<TState extends MultiValueVariableState = MultiValueVariableState>\n implements SceneObjectUrlSyncHandler\n{\n protected _nextChangeShouldAddHistoryStep = false;\n\n public constructor(protected _sceneObject: MultiValueVariable<TState>) {}\n\n protected getKey(): string {\n return `var-${this._sceneObject.state.name}`;\n }\n\n public getKeys(): string[] {\n if (this._sceneObject.state.skipUrlSync) {\n return [];\n }\n\n return [this.getKey()];\n }\n\n public getUrlState(): SceneObjectUrlValues {\n if (this._sceneObject.state.skipUrlSync) {\n return {};\n }\n\n let urlValue: string | string[] | null = null;\n let value = this._sceneObject.state.value;\n\n if (Array.isArray(value) && value.length > 1) {\n urlValue = value.map(String);\n } else if ((this, this._sceneObject.state.isMulti)) {\n // If we are inMulti mode we must return an array here as otherwise UrlSyncManager will not pass all values (in an array) in updateFromUrl\n urlValue = [String(value)];\n } else {\n urlValue = String(value);\n }\n\n return { [this.getKey()]: urlValue };\n }\n\n public updateFromUrl(values: SceneObjectUrlValues): void {\n let urlValue = values[this.getKey()];\n\n if (urlValue != null) {\n // This is to be backwards compatible with old url all value\n if (this._sceneObject.state.includeAll) {\n urlValue = handleLegacyUrlAllValue(urlValue);\n }\n\n // For edge cases where data links include variables with custom all value.\n // We want the variable to maintain the \"All\" meta value not the actual custom vall value. (Fixes https://github.com/grafana/grafana/issues/28635)\n if (this._sceneObject.state.allValue && this._sceneObject.state.allValue === urlValue) {\n urlValue = ALL_VARIABLE_VALUE;\n }\n\n /**\n * Initial URL Sync happens before scene objects are activated.\n * We need to skip validation in this case to make sure values set via URL are maintained.\n */\n if (!this._sceneObject.isActive) {\n this._sceneObject.skipNextValidation = true;\n }\n\n this._sceneObject.changeValueTo(urlValue);\n }\n }\n\n public performBrowserHistoryAction(callback: () => void) {\n this._nextChangeShouldAddHistoryStep = true;\n callback();\n this._nextChangeShouldAddHistoryStep = false;\n }\n\n public shouldCreateHistoryStep(values: SceneObjectUrlValues): boolean {\n return this._nextChangeShouldAddHistoryStep;\n }\n}\n\nfunction handleLegacyUrlAllValue(value: string | string[]) {\n if (isArray(value) && value[0] === ALL_VARIABLE_TEXT) {\n return [ALL_VARIABLE_VALUE];\n } else if (value === ALL_VARIABLE_TEXT) {\n return ALL_VARIABLE_VALUE;\n }\n\n return value;\n}\n\n/**\n * Variable getValue can return this to skip any subsequent formatting.\n * This is useful for custom all values that should not be escaped/formatted.\n */\nexport class CustomAllValue implements CustomVariableValue {\n public constructor(private _value: string, private _variable: SceneVariable) {}\n\n public formatter(formatNameOrFn?: string | VariableCustomFormatterFn): string {\n if (formatNameOrFn === VariableFormatID.Text) {\n return ALL_VARIABLE_TEXT;\n }\n\n if (formatNameOrFn === VariableFormatID.PercentEncode) {\n return formatRegistry.get(VariableFormatID.PercentEncode).formatter(this._value, [], this._variable);\n }\n\n if (formatNameOrFn === VariableFormatID.QueryParam) {\n return formatRegistry.get(VariableFormatID.QueryParam).formatter(ALL_VARIABLE_TEXT, [], this._variable);\n }\n\n return this._value;\n }\n}\n\nexport interface FieldAccessorCache {\n [key: string]: (obj: any) => any;\n}\n"],"names":["accesor","o"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MultiValueVariable.js","sources":["../../../../../../../src/variables/variants/MultiValueVariable.ts"],"sourcesContent":["import { isArray, isEqual, property } from 'lodash';\nimport { map, Observable } from 'rxjs';\n\nimport { ALL_VARIABLE_TEXT, ALL_VARIABLE_VALUE } from '../constants';\n\nimport { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { SceneObjectUrlSyncHandler, SceneObjectUrlValues } from '../../core/types';\nimport {\n SceneVariable,\n SceneVariableValueChangedEvent,\n SceneVariableState,\n ValidateAndUpdateResult,\n VariableValue,\n VariableValueOption,\n VariableValueSingle,\n CustomVariableValue,\n VariableCustomFormatterFn,\n} from '../types';\nimport { formatRegistry } from '../interpolation/formatRegistry';\nimport { VariableFormatID } from '@grafana/schema';\nimport { SceneVariableSet } from '../sets/SceneVariableSet';\nimport { setBaseClassState } from '../../utils/utils';\nimport { VARIABLE_VALUE_CHANGED_INTERACTION } from '../../performance/interactionConstants';\nimport { getQueryController } from '../../core/sceneGraph/getQueryController';\n\nexport interface MultiValueVariableState extends SceneVariableState {\n value: VariableValue; // old current.text\n text: VariableValue; // old current.value\n options: VariableValueOption[];\n allowCustomValue?: boolean;\n isMulti?: boolean;\n includeAll?: boolean;\n defaultToAll?: boolean;\n allValue?: string;\n placeholder?: string;\n /**\n * For multi value variables, this option controls how many values to show before they are collapsed into +N.\n * Defaults to 5\n */\n maxVisibleValues?: number;\n noValueOnClear?: boolean;\n isReadOnly?: boolean;\n}\n\nexport interface VariableGetOptionsArgs {\n searchFilter?: string;\n}\n\nexport abstract class MultiValueVariable<TState extends MultiValueVariableState = MultiValueVariableState>\n extends SceneObjectBase<TState>\n implements SceneVariable<TState>\n{\n private static fieldAccessorCache: FieldAccessorCache = {};\n\n protected _urlSync: SceneObjectUrlSyncHandler = new MultiValueUrlSyncHandler(this);\n\n /**\n * Set to true to skip next value validation to maintain the current value even it it's not among the options (ie valid values)\n */\n public skipNextValidation?: boolean;\n\n /**\n * The source of value options.\n */\n public abstract getValueOptions(args: VariableGetOptionsArgs): Observable<VariableValueOption[]>;\n\n /**\n * This function is called on when SceneVariableSet is activated or when a dependency changes.\n */\n public validateAndUpdate(): Observable<ValidateAndUpdateResult> {\n return this.getValueOptions({}).pipe(\n map((options) => {\n this.updateValueGivenNewOptions(options);\n return {};\n })\n );\n }\n\n public onCancel(): void {\n this.setStateHelper({ loading: false });\n const sceneVarSet = this.parent as SceneVariableSet;\n sceneVarSet?.cancel(this);\n }\n\n /**\n * Check if current value is valid given new options. If not update the value.\n */\n private updateValueGivenNewOptions(options: VariableValueOption[]) {\n // Remember current value and text\n const { value: currentValue, text: currentText, options: oldOptions } = this.state;\n\n const stateUpdate = this.getStateUpdateGivenNewOptions(options, currentValue, currentText);\n\n this.interceptStateUpdateAfterValidation(stateUpdate);\n\n // Perform state change\n this.setStateHelper(stateUpdate);\n\n // Publish value changed event only if value changed\n if (\n stateUpdate.value !== currentValue ||\n stateUpdate.text !== currentText ||\n (this.hasAllValue() && !isEqual(options, oldOptions))\n ) {\n this.publishEvent(new SceneVariableValueChangedEvent(this), true);\n }\n }\n\n private getStateUpdateGivenNewOptions(\n options: VariableValueOption[],\n currentValue: VariableValue,\n currentText: VariableValue\n ): Partial<MultiValueVariableState> {\n const stateUpdate: Partial<MultiValueVariableState> = {\n options,\n loading: false,\n value: currentValue,\n text: currentText,\n };\n\n if (options.length === 0) {\n if (this.state.defaultToAll || this.state.includeAll) {\n stateUpdate.value = ALL_VARIABLE_VALUE;\n stateUpdate.text = ALL_VARIABLE_TEXT;\n } else if (this.state.isMulti) {\n stateUpdate.value = [];\n stateUpdate.text = [];\n } else {\n stateUpdate.value = '';\n stateUpdate.text = '';\n }\n\n return stateUpdate;\n }\n\n if (this.hasAllValue()) {\n if (this.state.includeAll) {\n // Sometimes the text representation is also set the ALL_VARIABLE_VALUE, this fixes that\n stateUpdate.text = ALL_VARIABLE_TEXT;\n } else {\n stateUpdate.value = options[0].value;\n stateUpdate.text = options[0].label;\n // If multi switch to arrays\n if (this.state.isMulti) {\n stateUpdate.value = [stateUpdate.value];\n stateUpdate.text = [stateUpdate.text];\n }\n }\n return stateUpdate;\n }\n\n if (this.state.isMulti) {\n // If we are a multi valued variable validate the current values are among the options\n const currentValues = Array.isArray(currentValue) ? currentValue : [currentValue];\n const validValues = currentValues.filter((v) => options.find((o) => o.value === v));\n const validTexts = validValues.map((v) => options.find((o) => o.value === v)!.label);\n\n // If no valid values pick the first option\n if (validValues.length === 0) {\n const defaultState = this.getDefaultMultiState(options);\n stateUpdate.value = defaultState.value;\n stateUpdate.text = defaultState.text;\n } else {\n // We have valid values, if it's different from current valid values update current values\n if (!isEqual(validValues, currentValue)) {\n stateUpdate.value = validValues;\n }\n if (!isEqual(validTexts, currentText)) {\n stateUpdate.text = validTexts;\n }\n }\n\n return stateUpdate;\n }\n\n // Single value variable validation\n\n // Try find by value then text\n let matchingOption = findOptionMatchingCurrent(currentValue, currentText, options);\n if (matchingOption) {\n // When updating the initial state from URL the text property is set the same as value\n // Here we can correct the text value state\n stateUpdate.text = matchingOption.label;\n stateUpdate.value = matchingOption.value;\n } else {\n // Current value is found in options\n const defaultState = this.getDefaultSingleState(options);\n stateUpdate.value = defaultState.value;\n stateUpdate.text = defaultState.label;\n }\n\n return stateUpdate;\n }\n\n /**\n * Values set by initial URL sync needs to survive the next validation and update.\n * This function can intercept and make sure those values are preserved.\n */\n protected interceptStateUpdateAfterValidation(stateUpdate: Partial<MultiValueVariableState>): void {\n // If the validation wants to fix the all value (All ==> $__all) then we should let that pass\n const isAllValueFix = stateUpdate.value === ALL_VARIABLE_VALUE && this.state.text === ALL_VARIABLE_TEXT;\n\n if (\n this.skipNextValidation &&\n stateUpdate.value !== this.state.value &&\n stateUpdate.text !== this.state.text &&\n !isAllValueFix\n ) {\n stateUpdate.value = this.state.value;\n stateUpdate.text = this.state.text;\n }\n\n this.skipNextValidation = false;\n }\n\n public getValue(fieldPath?: string): VariableValue {\n let value = this.state.value;\n\n if (this.hasAllValue()) {\n if (this.state.allValue) {\n return new CustomAllValue(this.state.allValue, this);\n }\n value = this.state.options.map((o) => o.value);\n }\n\n if (fieldPath != null) {\n return this.getFieldAtPath(value, fieldPath);\n }\n\n return value;\n }\n\n public getValueText(fieldPath?: string): string {\n if (this.hasAllValue()) {\n return ALL_VARIABLE_TEXT;\n }\n\n const text = fieldPath != null ? this.getFieldAtPath(this.state.value, fieldPath, true) : this.state.text;\n\n return Array.isArray(text) ? text.join(' + ') : String(text);\n }\n\n private getFieldAtPath(value: VariableValue, fieldPath: string, returnText = false) {\n const accesor = this.getFieldAccessor(fieldPath);\n\n if (Array.isArray(value)) {\n const index = parseInt(fieldPath, 10);\n\n if (!isNaN(index) && index >= 0 && index < value.length) {\n const v = value[index];\n if (!returnText) {\n return v;\n }\n\n const o = this.state.options.find((o) => o.value === v);\n return o ? o.label : String(v);\n }\n\n return value.map((v) => {\n const o = this.state.options.find((o) => o.value === v);\n return o ? accesor(o.properties) : v;\n });\n }\n\n const o = this.state.options.find((o) => o.value === value);\n if (o) {\n return accesor(o.properties);\n }\n\n return returnText ? this.state.text : value;\n }\n\n private getFieldAccessor(fieldPath: string) {\n const accessor = MultiValueVariable.fieldAccessorCache[fieldPath];\n if (accessor) {\n return accessor;\n }\n\n return (MultiValueVariable.fieldAccessorCache[fieldPath] = property(fieldPath));\n }\n\n public hasAllValue() {\n const value = this.state.value;\n return value === ALL_VARIABLE_VALUE || (Array.isArray(value) && value[0] === ALL_VARIABLE_VALUE);\n }\n\n public getDefaultMultiState(options: VariableValueOption[]) {\n if (this.state.defaultToAll) {\n return { value: [ALL_VARIABLE_VALUE], text: [ALL_VARIABLE_TEXT] };\n } else if (options.length > 0) {\n return { value: [options[0].value], text: [options[0].label], properties: [options[0].properties] };\n } else {\n return { value: [], text: [] };\n }\n }\n\n protected getDefaultSingleState(options: VariableValueOption[]): VariableValueOption {\n if (this.state.defaultToAll) {\n return { value: ALL_VARIABLE_VALUE, label: ALL_VARIABLE_TEXT };\n } else if (options.length > 0) {\n return { value: options[0].value, label: options[0].label, properties: options[0].properties };\n } else {\n return { value: '', label: '' };\n }\n }\n\n /**\n * Change the value and publish SceneVariableValueChangedEvent event.\n */\n public changeValueTo(value: VariableValue, text?: VariableValue, isUserAction = false) {\n // Ignore if there is no change\n if (value === this.state.value && text === this.state.text) {\n return;\n }\n\n if (!text) {\n if (Array.isArray(value)) {\n text = value.map((v) => this.findLabelTextForValue(v));\n } else {\n text = this.findLabelTextForValue(value);\n }\n }\n\n if (Array.isArray(value)) {\n // If we are a multi valued variable is cleared (empty array) we need to set the default empty state\n if (value.length === 0) {\n const state = this.getDefaultMultiState(this.state.options);\n value = state.value;\n text = state.text;\n }\n\n // If last value is the All value then replace all with it\n if (value[value.length - 1] === ALL_VARIABLE_VALUE) {\n value = [ALL_VARIABLE_VALUE];\n text = [ALL_VARIABLE_TEXT];\n }\n // If the first value is the ALL value and we have other values, then remove the All value\n else if (value[0] === ALL_VARIABLE_VALUE && value.length > 1) {\n value.shift();\n if (Array.isArray(text)) {\n text.shift();\n }\n }\n }\n\n // Do nothing if value and text are the same\n if (isEqual(value, this.state.value) && isEqual(text, this.state.text)) {\n return;\n }\n\n const stateChangeAction = () => this.setStateHelper({ value, text, loading: false });\n /**\n * Because variable state changes can cause a whole chain of downstream state changes in other variables (that also cause URL update)\n * Only some variable changes should add new history items to make sure the browser history contains valid URL states to go back to.\n */\n if (isUserAction) {\n const queryController = getQueryController(this);\n queryController?.startProfile(VARIABLE_VALUE_CHANGED_INTERACTION);\n this._urlSync.performBrowserHistoryAction?.(stateChangeAction);\n } else {\n stateChangeAction();\n }\n\n this.publishEvent(new SceneVariableValueChangedEvent(this), true);\n }\n\n private findLabelTextForValue(value: VariableValueSingle): VariableValueSingle {\n if (value === ALL_VARIABLE_VALUE) {\n return ALL_VARIABLE_TEXT;\n }\n\n const option = this.state.options.find((x) => x.value === value);\n if (option) {\n return option.label;\n }\n\n const optionByLabel = this.state.options.find((x) => x.label === value);\n if (optionByLabel) {\n return optionByLabel.label;\n }\n\n return value;\n }\n\n /**\n * This helper function is to counter the contravariance of setState\n */\n private setStateHelper(state: Partial<MultiValueVariableState>) {\n setBaseClassState<MultiValueVariableState>(this, state);\n }\n\n public getOptionsForSelect(includeCurrentValue = true): VariableValueOption[] {\n let options = this.state.options;\n\n if (this.state.includeAll) {\n options = [{ value: ALL_VARIABLE_VALUE, label: ALL_VARIABLE_TEXT }, ...options];\n }\n\n if (includeCurrentValue && !Array.isArray(this.state.value)) {\n const current = options.find((x) => x.value === this.state.value);\n if (!current) {\n options = [{ value: this.state.value, label: String(this.state.text) }, ...options];\n }\n }\n\n return options;\n }\n\n public refreshOptions() {\n this.getValueOptions({}).subscribe((options) => {\n this.updateValueGivenNewOptions(options);\n });\n }\n\n /**\n * Can be used by subclasses to do custom handling of option search based on search input\n */\n public onSearchChange?(searchFilter: string): void;\n}\n\n/**\n * Looks for matching option, first by value but as a fallback by text (label).\n */\nfunction findOptionMatchingCurrent(\n currentValue: VariableValue,\n currentText: VariableValue,\n options: VariableValueOption[]\n) {\n let textMatch: VariableValueOption | undefined;\n\n for (const o of options) {\n if (o.value === currentValue) {\n return o;\n }\n\n // No early return here as want to continue to look a value match\n if (o.label === currentText) {\n textMatch = o;\n }\n }\n\n return textMatch;\n}\n\nexport class MultiValueUrlSyncHandler<TState extends MultiValueVariableState = MultiValueVariableState>\n implements SceneObjectUrlSyncHandler\n{\n protected _nextChangeShouldAddHistoryStep = false;\n\n public constructor(protected _sceneObject: MultiValueVariable<TState>) {}\n\n protected getKey(): string {\n return `var-${this._sceneObject.state.name}`;\n }\n\n public getKeys(): string[] {\n if (this._sceneObject.state.skipUrlSync) {\n return [];\n }\n\n return [this.getKey()];\n }\n\n public getUrlState(): SceneObjectUrlValues {\n if (this._sceneObject.state.skipUrlSync) {\n return {};\n }\n\n let urlValue: string | string[] | null = null;\n let value = this._sceneObject.state.value;\n\n if (Array.isArray(value) && value.length > 1) {\n urlValue = value.map(String);\n } else if ((this, this._sceneObject.state.isMulti)) {\n // If we are inMulti mode we must return an array here as otherwise UrlSyncManager will not pass all values (in an array) in updateFromUrl\n urlValue = [String(value)];\n } else {\n urlValue = String(value);\n }\n\n return { [this.getKey()]: urlValue };\n }\n\n public updateFromUrl(values: SceneObjectUrlValues): void {\n let urlValue = values[this.getKey()];\n\n if (urlValue != null) {\n // This is to be backwards compatible with old url all value\n if (this._sceneObject.state.includeAll) {\n urlValue = handleLegacyUrlAllValue(urlValue);\n }\n\n // For edge cases where data links include variables with custom all value.\n // We want the variable to maintain the \"All\" meta value not the actual custom vall value. (Fixes https://github.com/grafana/grafana/issues/28635)\n if (this._sceneObject.state.allValue && this._sceneObject.state.allValue === urlValue) {\n urlValue = ALL_VARIABLE_VALUE;\n }\n\n /**\n * Initial URL Sync happens before scene objects are activated.\n * We need to skip validation in this case to make sure values set via URL are maintained.\n */\n if (!this._sceneObject.isActive) {\n this._sceneObject.skipNextValidation = true;\n }\n\n this._sceneObject.changeValueTo(urlValue);\n }\n }\n\n public performBrowserHistoryAction(callback: () => void) {\n this._nextChangeShouldAddHistoryStep = true;\n callback();\n this._nextChangeShouldAddHistoryStep = false;\n }\n\n public shouldCreateHistoryStep(values: SceneObjectUrlValues): boolean {\n return this._nextChangeShouldAddHistoryStep;\n }\n}\n\nfunction handleLegacyUrlAllValue(value: string | string[]) {\n if (isArray(value) && value[0] === ALL_VARIABLE_TEXT) {\n return [ALL_VARIABLE_VALUE];\n } else if (value === ALL_VARIABLE_TEXT) {\n return ALL_VARIABLE_VALUE;\n }\n\n return value;\n}\n\n/**\n * Variable getValue can return this to skip any subsequent formatting.\n * This is useful for custom all values that should not be escaped/formatted.\n */\nexport class CustomAllValue implements CustomVariableValue {\n public constructor(private _value: string, private _variable: SceneVariable) {}\n\n public formatter(formatNameOrFn?: string | VariableCustomFormatterFn): string {\n if (formatNameOrFn === VariableFormatID.Text) {\n return ALL_VARIABLE_TEXT;\n }\n\n if (formatNameOrFn === VariableFormatID.PercentEncode) {\n return formatRegistry.get(VariableFormatID.PercentEncode).formatter(this._value, [], this._variable);\n }\n\n if (formatNameOrFn === VariableFormatID.QueryParam) {\n return formatRegistry.get(VariableFormatID.QueryParam).formatter(ALL_VARIABLE_TEXT, [], this._variable);\n }\n\n return this._value;\n }\n}\n\nexport interface FieldAccessorCache {\n [key: string]: (obj: any) => any;\n}\n"],"names":["o"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1273,8 +1273,9 @@ declare abstract class MultiValueVariable<TState extends MultiValueVariableState
|
|
|
1273
1273
|
*/
|
|
1274
1274
|
protected interceptStateUpdateAfterValidation(stateUpdate: Partial<MultiValueVariableState>): void;
|
|
1275
1275
|
getValue(fieldPath?: string): VariableValue;
|
|
1276
|
-
private getFieldAccessor;
|
|
1277
1276
|
getValueText(fieldPath?: string): string;
|
|
1277
|
+
private getFieldAtPath;
|
|
1278
|
+
private getFieldAccessor;
|
|
1278
1279
|
hasAllValue(): boolean;
|
|
1279
1280
|
getDefaultMultiState(options: VariableValueOption[]): {
|
|
1280
1281
|
value: string[];
|
package/dist/index.js
CHANGED
|
@@ -1892,61 +1892,46 @@ const _MultiValueVariable = class _MultiValueVariable extends SceneObjectBase {
|
|
|
1892
1892
|
value = this.state.options.map((o) => o.value);
|
|
1893
1893
|
}
|
|
1894
1894
|
if (fieldPath != null) {
|
|
1895
|
-
|
|
1896
|
-
const index = parseInt(fieldPath, 10);
|
|
1897
|
-
if (!isNaN(index) && index >= 0 && index < value.length) {
|
|
1898
|
-
return value[index];
|
|
1899
|
-
}
|
|
1900
|
-
const accesor2 = this.getFieldAccessor(fieldPath);
|
|
1901
|
-
return value.map((v) => {
|
|
1902
|
-
const o2 = this.state.options.find((o3) => o3.value === v);
|
|
1903
|
-
return o2 ? accesor2(o2.properties) : v;
|
|
1904
|
-
});
|
|
1905
|
-
}
|
|
1906
|
-
const accesor = this.getFieldAccessor(fieldPath);
|
|
1907
|
-
const o = this.state.options.find((o2) => o2.value === value);
|
|
1908
|
-
if (o) {
|
|
1909
|
-
return accesor(o.properties);
|
|
1910
|
-
}
|
|
1895
|
+
return this.getFieldAtPath(value, fieldPath);
|
|
1911
1896
|
}
|
|
1912
1897
|
return value;
|
|
1913
1898
|
}
|
|
1914
|
-
getFieldAccessor(fieldPath) {
|
|
1915
|
-
const accessor = _MultiValueVariable.fieldAccessorCache[fieldPath];
|
|
1916
|
-
if (accessor) {
|
|
1917
|
-
return accessor;
|
|
1918
|
-
}
|
|
1919
|
-
return _MultiValueVariable.fieldAccessorCache[fieldPath] = lodash.property(fieldPath);
|
|
1920
|
-
}
|
|
1921
1899
|
getValueText(fieldPath) {
|
|
1922
1900
|
if (this.hasAllValue()) {
|
|
1923
1901
|
return ALL_VARIABLE_TEXT;
|
|
1924
1902
|
}
|
|
1925
|
-
|
|
1926
|
-
|
|
1927
|
-
|
|
1928
|
-
|
|
1929
|
-
|
|
1930
|
-
|
|
1931
|
-
|
|
1932
|
-
|
|
1933
|
-
|
|
1934
|
-
|
|
1935
|
-
|
|
1936
|
-
const option = this.state.options.find((o) => o.value === v);
|
|
1937
|
-
return option ? accessor(option.properties) : v;
|
|
1938
|
-
}).join(" + ");
|
|
1939
|
-
} else {
|
|
1940
|
-
const option = this.state.options.find((o) => o.value === this.state.value);
|
|
1941
|
-
if (option) {
|
|
1942
|
-
return String(accessor(option.properties));
|
|
1903
|
+
const text = fieldPath != null ? this.getFieldAtPath(this.state.value, fieldPath, true) : this.state.text;
|
|
1904
|
+
return Array.isArray(text) ? text.join(" + ") : String(text);
|
|
1905
|
+
}
|
|
1906
|
+
getFieldAtPath(value, fieldPath, returnText = false) {
|
|
1907
|
+
const accesor = this.getFieldAccessor(fieldPath);
|
|
1908
|
+
if (Array.isArray(value)) {
|
|
1909
|
+
const index = parseInt(fieldPath, 10);
|
|
1910
|
+
if (!isNaN(index) && index >= 0 && index < value.length) {
|
|
1911
|
+
const v = value[index];
|
|
1912
|
+
if (!returnText) {
|
|
1913
|
+
return v;
|
|
1943
1914
|
}
|
|
1915
|
+
const o2 = this.state.options.find((o3) => o3.value === v);
|
|
1916
|
+
return o2 ? o2.label : String(v);
|
|
1944
1917
|
}
|
|
1918
|
+
return value.map((v) => {
|
|
1919
|
+
const o2 = this.state.options.find((o3) => o3.value === v);
|
|
1920
|
+
return o2 ? accesor(o2.properties) : v;
|
|
1921
|
+
});
|
|
1945
1922
|
}
|
|
1946
|
-
|
|
1947
|
-
|
|
1923
|
+
const o = this.state.options.find((o2) => o2.value === value);
|
|
1924
|
+
if (o) {
|
|
1925
|
+
return accesor(o.properties);
|
|
1948
1926
|
}
|
|
1949
|
-
return
|
|
1927
|
+
return returnText ? this.state.text : value;
|
|
1928
|
+
}
|
|
1929
|
+
getFieldAccessor(fieldPath) {
|
|
1930
|
+
const accessor = _MultiValueVariable.fieldAccessorCache[fieldPath];
|
|
1931
|
+
if (accessor) {
|
|
1932
|
+
return accessor;
|
|
1933
|
+
}
|
|
1934
|
+
return _MultiValueVariable.fieldAccessorCache[fieldPath] = lodash.property(fieldPath);
|
|
1950
1935
|
}
|
|
1951
1936
|
hasAllValue() {
|
|
1952
1937
|
const value = this.state.value;
|