@grafana/scenes 6.48.0--canary.1236.19576705002.0 → 6.48.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/CHANGELOG.md CHANGED
@@ -1,3 +1,16 @@
1
+ # v6.48.0 (Mon Nov 24 2025)
2
+
3
+ #### 🚀 Enhancement
4
+
5
+ - Variables: support object values with multiple properties [#1236](https://github.com/grafana/scenes/pull/1236) ([@torkelo](https://github.com/torkelo) [@grafakus](https://github.com/grafakus))
6
+
7
+ #### Authors: 2
8
+
9
+ - Marc M. ([@grafakus](https://github.com/grafakus))
10
+ - Torkel Ödegaard ([@torkelo](https://github.com/torkelo))
11
+
12
+ ---
13
+
1
14
  # v6.47.1 (Wed Nov 19 2025)
2
15
 
3
16
  #### 🐛 Bug Fix
@@ -1 +1 @@
1
- {"version":3,"file":"toMetricFindValues.js","sources":["../../../../../src/variables/variants/query/toMetricFindValues.ts"],"sourcesContent":["import {\n DataFrame,\n FieldType,\n getFieldDisplayName,\n getProcessedDataFrames,\n isDataFrame,\n MetricFindValue,\n PanelData,\n} from '@grafana/data';\nimport { map, OperatorFunction } from 'rxjs';\n\ninterface MetricFindValueWithOptionalProperties extends MetricFindValue {\n properties?: Record<string, any>;\n}\n\nexport function toMetricFindValues(\n valueProp?: string,\n textProp?: string\n): OperatorFunction<PanelData, MetricFindValueWithOptionalProperties[]> {\n return (source) =>\n source.pipe(\n map((panelData) => {\n const frames = panelData.series;\n if (!frames || !frames.length) {\n return [];\n }\n\n if (areMetricFindValues(frames)) {\n return frames;\n }\n\n if (frames[0].fields.length === 0) {\n return [];\n }\n\n const indices = validateIndices(findFieldsIndices(frames), valueProp, textProp);\n\n const metrics: MetricFindValueWithOptionalProperties[] = [];\n\n for (const frame of frames) {\n for (let index = 0; index < frame.length; index++) {\n const fieldValue = (fieldIndex: number) =>\n fieldIndex !== -1 ? frame.fields[fieldIndex].values.get(index) : undefined;\n\n const value = fieldValue(indices.value);\n const text = fieldValue(indices.text);\n const expandable = fieldValue(indices.expandable);\n\n if (!indices.properties.length) {\n metrics.push({\n value: value || text,\n text: text || value,\n expandable,\n });\n continue;\n }\n\n const properties: Record<string, string> = {};\n for (const p of indices.properties) {\n properties[p.name] = fieldValue(p.index);\n }\n\n metrics.push({\n value:\n value ||\n (valueProp && properties[valueProp as string]) ||\n text ||\n (textProp && properties[textProp as string]),\n text:\n text ||\n (textProp && properties[textProp as string]) ||\n value ||\n (valueProp && properties[valueProp as string]),\n properties,\n expandable,\n });\n }\n }\n\n return metrics;\n })\n );\n}\n\ntype Indices = {\n value: number;\n text: number;\n properties: Array<{ name: string; index: number }>;\n expandable: number;\n};\n\nfunction findFieldsIndices(frames: DataFrame[]): Indices {\n const indices: Indices = {\n value: -1,\n text: -1,\n expandable: -1,\n properties: [],\n };\n\n for (const frame of getProcessedDataFrames(frames)) {\n for (let index = 0; index < frame.fields.length; index++) {\n const field = frame.fields[index];\n const fieldName = getFieldDisplayName(field, frame, frames).toLowerCase();\n\n if (field.type === FieldType.string) {\n if (fieldName === 'value') {\n if (indices.value === -1) {\n indices.value = index;\n }\n continue;\n }\n\n if (fieldName === 'text') {\n if (indices.text === -1) {\n indices.text = index;\n }\n continue;\n }\n\n indices.properties.push({ name: fieldName, index });\n continue;\n }\n\n if (\n fieldName === 'expandable' &&\n (field.type === FieldType.boolean || field.type === FieldType.number) &&\n indices.expandable === -1\n ) {\n indices.expandable = index;\n }\n }\n }\n\n return indices;\n}\n\nfunction validateIndices(indices: Indices, valueProp?: string, textProp?: string): Indices {\n const hasNoValueOrText = indices.value === -1 && indices.text === -1;\n\n if (hasNoValueOrText && !indices.properties.length) {\n throw new Error(\"Couldn't find any field of type string in the results\");\n }\n\n // A single field of type string that is neither named \"value\" nor \"text\" is considered as \"value\"\n if (hasNoValueOrText && indices.properties.length === 1) {\n indices.value = indices.properties[0].index;\n indices.properties = [];\n }\n\n if (hasNoValueOrText && indices.properties.length && !valueProp && !textProp) {\n throw new Error('Properties found in series but missing valueProp and textProp');\n }\n\n return indices;\n}\n\nfunction areMetricFindValues(data: any[]): data is MetricFindValue[] {\n if (!data) {\n return false;\n }\n\n if (!data.length) {\n return true;\n }\n\n const firstValue: any = data[0];\n\n if (isDataFrame(firstValue)) {\n return false;\n }\n\n for (const firstValueKey in firstValue) {\n if (!firstValue.hasOwnProperty(firstValueKey)) {\n continue;\n }\n\n const value = firstValue[firstValueKey];\n if (value !== null && typeof value !== 'string' && typeof value !== 'number') {\n continue;\n }\n\n const key = firstValueKey.toLowerCase();\n\n if (key === 'text' || key === 'value') {\n return true;\n }\n }\n\n return false;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"toMetricFindValues.js","sources":["../../../../../src/variables/variants/query/toMetricFindValues.ts"],"sourcesContent":["import {\n DataFrame,\n FieldType,\n getFieldDisplayName,\n getProcessedDataFrames,\n isDataFrame,\n MetricFindValue,\n PanelData,\n} from '@grafana/data';\nimport { map, OperatorFunction } from 'rxjs';\n\ninterface MetricFindValueWithOptionalProperties extends MetricFindValue {\n properties?: Record<string, string>;\n}\n\nexport function toMetricFindValues(\n valueProp?: string,\n textProp?: string\n): OperatorFunction<PanelData, MetricFindValueWithOptionalProperties[]> {\n return (source) =>\n source.pipe(\n map((panelData) => {\n const frames = panelData.series;\n if (!frames || !frames.length) {\n return [];\n }\n\n if (areMetricFindValues(frames)) {\n return frames;\n }\n\n if (frames[0].fields.length === 0) {\n return [];\n }\n\n const indices = validateIndices(findFieldsIndices(frames), valueProp, textProp);\n\n const metrics: MetricFindValueWithOptionalProperties[] = [];\n\n for (const frame of frames) {\n for (let index = 0; index < frame.length; index++) {\n const fieldValue = (fieldIndex: number) =>\n fieldIndex !== -1 ? frame.fields[fieldIndex].values.get(index) : undefined;\n\n const value = fieldValue(indices.value);\n const text = fieldValue(indices.text);\n const expandable = fieldValue(indices.expandable);\n\n if (!indices.properties.length) {\n metrics.push({\n value: value || text,\n text: text || value,\n expandable,\n });\n continue;\n }\n\n const properties: MetricFindValueWithOptionalProperties['properties'] = {};\n for (const p of indices.properties) {\n properties[p.name] = fieldValue(p.index);\n }\n\n metrics.push({\n value: value || (valueProp && properties[valueProp]) || text || (textProp && properties[textProp]),\n text: text || (textProp && properties[textProp]) || value || (valueProp && properties[valueProp]),\n properties,\n expandable,\n });\n }\n }\n\n return metrics;\n })\n );\n}\n\ntype Indices = {\n value: number;\n text: number;\n properties: Array<{ name: string; index: number }>;\n expandable: number;\n};\n\nfunction findFieldsIndices(frames: DataFrame[]): Indices {\n const indices: Indices = {\n value: -1,\n text: -1,\n expandable: -1,\n properties: [],\n };\n\n for (const frame of getProcessedDataFrames(frames)) {\n for (let index = 0; index < frame.fields.length; index++) {\n const field = frame.fields[index];\n const fieldName = getFieldDisplayName(field, frame, frames).toLowerCase();\n\n if (field.type === FieldType.string) {\n if (fieldName === 'value') {\n if (indices.value === -1) {\n indices.value = index;\n }\n continue;\n }\n\n if (fieldName === 'text') {\n if (indices.text === -1) {\n indices.text = index;\n }\n continue;\n }\n\n indices.properties.push({ name: fieldName, index });\n continue;\n }\n\n if (\n fieldName === 'expandable' &&\n (field.type === FieldType.boolean || field.type === FieldType.number) &&\n indices.expandable === -1\n ) {\n indices.expandable = index;\n }\n }\n }\n\n return indices;\n}\n\nfunction validateIndices(indices: Indices, valueProp?: string, textProp?: string): Indices {\n const hasNoValueOrText = indices.value === -1 && indices.text === -1;\n\n if (hasNoValueOrText && !indices.properties.length) {\n throw new Error(\"Couldn't find any field of type string in the results\");\n }\n\n // A single field of type string that is neither named \"value\" nor \"text\" is considered as \"value\"\n if (hasNoValueOrText && indices.properties.length === 1) {\n indices.value = indices.properties[0].index;\n indices.properties = [];\n }\n\n if (hasNoValueOrText && indices.properties.length && !valueProp && !textProp) {\n throw new Error('Properties found in series but missing valueProp and textProp');\n }\n\n return indices;\n}\n\nfunction areMetricFindValues(data: any[]): data is MetricFindValue[] {\n if (!data) {\n return false;\n }\n\n if (!data.length) {\n return true;\n }\n\n const firstValue: any = data[0];\n\n if (isDataFrame(firstValue)) {\n return false;\n }\n\n for (const firstValueKey in firstValue) {\n if (!firstValue.hasOwnProperty(firstValueKey)) {\n continue;\n }\n\n const value = firstValue[firstValueKey];\n if (value !== null && typeof value !== 'string' && typeof value !== 'number') {\n continue;\n }\n\n const key = firstValueKey.toLowerCase();\n\n if (key === 'text' || key === 'value') {\n return true;\n }\n }\n\n return false;\n}\n"],"names":[],"mappings":"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"}