@grafana/scenes 1.18.0 → 1.19.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,15 @@
|
|
|
1
|
+
# v1.19.0 (Mon Oct 16 2023)
|
|
2
|
+
|
|
3
|
+
#### 🚀 Enhancement
|
|
4
|
+
|
|
5
|
+
- AdHocVariable: Fixes trailing comma [#411](https://github.com/grafana/scenes/pull/411) ([@torkelo](https://github.com/torkelo))
|
|
6
|
+
|
|
7
|
+
#### Authors: 1
|
|
8
|
+
|
|
9
|
+
- Torkel Ödegaard ([@torkelo](https://github.com/torkelo))
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
1
13
|
# v1.18.0 (Thu Oct 12 2023)
|
|
2
14
|
|
|
3
15
|
#### 🚀 Enhancement
|
|
@@ -56,6 +56,9 @@ const _AdHocFiltersVariable = class extends SceneObjectBase {
|
|
|
56
56
|
for (const filter of filters) {
|
|
57
57
|
expr += `${this._renderFilter(filter)},`;
|
|
58
58
|
}
|
|
59
|
+
if (expr.length > 0) {
|
|
60
|
+
expr = expr.slice(0, -1);
|
|
61
|
+
}
|
|
59
62
|
this.setState({ filterExpression: expr });
|
|
60
63
|
this.publishEvent(new SceneVariableValueChangedEvent(this), true);
|
|
61
64
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AdHocFiltersVariable.js","sources":["../../../../src/variables/adhoc/AdHocFiltersVariable.tsx"],"sourcesContent":["import React from 'react';\nimport { AdHocVariableFilter } from '@grafana/data';\nimport { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { SceneVariable, SceneVariableState, SceneVariableValueChangedEvent } from '../types';\nimport { AdHocFilterSet, AdHocFilterSetState } from './AdHocFiltersSet';\nimport { SceneComponentProps } from '../../core/types';\nimport { VariableHide } from '@grafana/schema';\n\nexport interface AdHocFiltersVariableState extends SceneVariableState {\n /**\n * Important that you set applyFiltersTo: 'manual' when you create the set.\n */\n set: AdHocFilterSet;\n /**\n * This is the expression that the filters resulted in. Defaults to\n * Prometheus / Loki compatible label fitler expression\n */\n filterExpression?: string;\n}\n\nexport type AdHocFiltersVariableCreateHelperArgs = Pick<\n AdHocFilterSetState,\n 'name' | 'filters' | 'baseFilters' | 'datasource' | 'getTagKeysProvider' | 'getTagValuesProvider'\n>;\n\nexport class AdHocFiltersVariable\n extends SceneObjectBase<AdHocFiltersVariableState>\n implements SceneVariable<AdHocFiltersVariableState>\n{\n /** Helper factory function that makes sure AdHocFilterSet is created correctly */\n public static create(state: AdHocFiltersVariableCreateHelperArgs): AdHocFiltersVariable {\n return new AdHocFiltersVariable({\n type: 'adhoc',\n hide: VariableHide.hideLabel,\n name: state.name ?? 'Filters',\n set: new AdHocFilterSet({\n ...state,\n // Main reason for this helper factory functyion\n applyMode: 'manual',\n }),\n });\n }\n\n public constructor(state: AdHocFiltersVariableState) {\n super(state);\n\n // Subscribe to filter changes and up the variable value (filterExpression)\n this.addActivationHandler(() => {\n this._subs.add(\n this.state.set.subscribeToState((newState, prevState) => {\n if (newState.filters !== prevState.filters) {\n this._filtersChanged(newState.filters);\n }\n })\n );\n this._filtersChanged(this.state.set.state.filters);\n });\n }\n\n public getValue() {\n return this.state.filterExpression;\n }\n\n private _filtersChanged(filters: AdHocVariableFilter[]) {\n let expr = '';\n\n for (const filter of filters) {\n expr += `${this._renderFilter(filter)},`;\n }\n\n this.setState({ filterExpression: expr });\n this.publishEvent(new SceneVariableValueChangedEvent(this), true);\n }\n\n private _renderFilter(filter: AdHocVariableFilter) {\n let value = '';\n\n if (filter.operator === '=~' || filter.operator === '!~¨') {\n value = escapeLabelValueInRegexSelector(filter.value);\n } else {\n value = escapeLabelValueInExactSelector(filter.value);\n }\n\n return `${filter.key}${filter.operator}\"${value}\"`;\n }\n\n // Same UI as the standalone AdHocFilterSet\n public static Component = ({ model }: SceneComponentProps<AdHocFiltersVariable>) => {\n return <AdHocFilterSet.Component model={model.state.set} />;\n };\n}\n\n// based on the openmetrics-documentation, the 3 symbols we have to handle are:\n// - \\n ... the newline character\n// - \\ ... the backslash character\n// - \" ... the double-quote character\nexport function escapeLabelValueInExactSelector(labelValue: string): string {\n return labelValue.replace(/\\\\/g, '\\\\\\\\').replace(/\\n/g, '\\\\n').replace(/\"/g, '\\\\\"');\n}\n\nexport function escapeLabelValueInRegexSelector(labelValue: string): string {\n return escapeLabelValueInExactSelector(escapeLokiRegexp(labelValue));\n}\n\nexport function isRegexSelector(selector?: string) {\n if (selector && (selector.includes('=~') || selector.includes('!~'))) {\n return true;\n }\n return false;\n}\n\n// Loki regular-expressions use the RE2 syntax (https://github.com/google/re2/wiki/Syntax),\n// so every character that matches something in that list has to be escaped.\n// the list of meta characters is: *+?()|\\.[]{}^$\n// we make a javascript regular expression that matches those characters:\nconst RE2_METACHARACTERS = /[*+?()|\\\\.\\[\\]{}^$]/g;\nfunction escapeLokiRegexp(value: string): string {\n return value.replace(RE2_METACHARACTERS, '\\\\$&');\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAyBO,MAAM,qBAAA,GAAN,cACG,eAEV,CAAA;AAAA,EAEE,OAAc,OAAO,KAAmE,EAAA;AA9B1F,IAAA,IAAA,EAAA,CAAA;AA+BI,IAAA,OAAO,IAAI,qBAAqB,CAAA;AAAA,MAC9B,IAAM,EAAA,OAAA;AAAA,MACN,MAAM,YAAa,CAAA,SAAA;AAAA,MACnB,IAAA,EAAA,CAAM,EAAM,GAAA,KAAA,CAAA,IAAA,KAAN,IAAc,GAAA,EAAA,GAAA,SAAA;AAAA,MACpB,GAAK,EAAA,IAAI,cAAe,CAAA,aAAA,CAAA,cAAA,CAAA,EAAA,EACnB,KADmB,CAAA,EAAA;AAAA,QAGtB,SAAW,EAAA,QAAA;AAAA,OACZ,CAAA,CAAA;AAAA,KACF,CAAA,CAAA;AAAA,GACH;AAAA,EAEO,YAAY,KAAkC,EAAA;AACnD,IAAA,KAAA,CAAM,KAAK,CAAA,CAAA;AAGX,IAAA,IAAA,CAAK,qBAAqB,MAAM;AAC9B,MAAA,IAAA,CAAK,KAAM,CAAA,GAAA;AAAA,QACT,KAAK,KAAM,CAAA,GAAA,CAAI,gBAAiB,CAAA,CAAC,UAAU,SAAc,KAAA;AACvD,UAAI,IAAA,QAAA,CAAS,OAAY,KAAA,SAAA,CAAU,OAAS,EAAA;AAC1C,YAAK,IAAA,CAAA,eAAA,CAAgB,SAAS,OAAO,CAAA,CAAA;AAAA,WACvC;AAAA,SACD,CAAA;AAAA,OACH,CAAA;AACA,MAAA,IAAA,CAAK,eAAgB,CAAA,IAAA,CAAK,KAAM,CAAA,GAAA,CAAI,MAAM,OAAO,CAAA,CAAA;AAAA,KAClD,CAAA,CAAA;AAAA,GACH;AAAA,EAEO,QAAW,GAAA;AAChB,IAAA,OAAO,KAAK,KAAM,CAAA,gBAAA,CAAA;AAAA,GACpB;AAAA,EAEQ,gBAAgB,OAAgC,EAAA;AACtD,IAAA,IAAI,IAAO,GAAA,EAAA,CAAA;AAEX,IAAA,KAAA,MAAW,UAAU,OAAS,EAAA;AAC5B,MAAQ,IAAA,IAAA,CAAA,EAAG,IAAK,CAAA,aAAA,CAAc,MAAM,CAAA,CAAA,CAAA,CAAA,CAAA;AAAA,KACtC;AAEA,IAAA,IAAA,CAAK,QAAS,CAAA,EAAE,gBAAkB,EAAA,IAAA,EAAM,CAAA,CAAA;AACxC,IAAA,IAAA,CAAK,YAAa,CAAA,IAAI,8BAA+B,CAAA,IAAI,GAAG,IAAI,CAAA,CAAA;AAAA,GAClE;AAAA,EAEQ,cAAc,MAA6B,EAAA;AACjD,IAAA,IAAI,KAAQ,GAAA,EAAA,CAAA;AAEZ,IAAA,IAAI,MAAO,CAAA,QAAA,KAAa,IAAQ,IAAA,MAAA,CAAO,aAAa,QAAO,EAAA;AACzD,MAAQ,KAAA,GAAA,+BAAA,CAAgC,OAAO,KAAK,CAAA,CAAA;AAAA,KAC/C,MAAA;AACL,MAAQ,KAAA,GAAA,+BAAA,CAAgC,OAAO,KAAK,CAAA,CAAA;AAAA,KACtD;AAEA,IAAA,OAAO,CAAG,EAAA,MAAA,CAAO,GAAM,CAAA,EAAA,MAAA,CAAO,QAAY,CAAA,CAAA,EAAA,KAAA,CAAA,CAAA,CAAA,CAAA;AAAA,GAC5C;AAMF,CAAA,CAAA;
|
|
1
|
+
{"version":3,"file":"AdHocFiltersVariable.js","sources":["../../../../src/variables/adhoc/AdHocFiltersVariable.tsx"],"sourcesContent":["import React from 'react';\nimport { AdHocVariableFilter } from '@grafana/data';\nimport { SceneObjectBase } from '../../core/SceneObjectBase';\nimport { SceneVariable, SceneVariableState, SceneVariableValueChangedEvent } from '../types';\nimport { AdHocFilterSet, AdHocFilterSetState } from './AdHocFiltersSet';\nimport { SceneComponentProps } from '../../core/types';\nimport { VariableHide } from '@grafana/schema';\n\nexport interface AdHocFiltersVariableState extends SceneVariableState {\n /**\n * Important that you set applyFiltersTo: 'manual' when you create the set.\n */\n set: AdHocFilterSet;\n /**\n * This is the expression that the filters resulted in. Defaults to\n * Prometheus / Loki compatible label fitler expression\n */\n filterExpression?: string;\n}\n\nexport type AdHocFiltersVariableCreateHelperArgs = Pick<\n AdHocFilterSetState,\n 'name' | 'filters' | 'baseFilters' | 'datasource' | 'getTagKeysProvider' | 'getTagValuesProvider'\n>;\n\nexport class AdHocFiltersVariable\n extends SceneObjectBase<AdHocFiltersVariableState>\n implements SceneVariable<AdHocFiltersVariableState>\n{\n /** Helper factory function that makes sure AdHocFilterSet is created correctly */\n public static create(state: AdHocFiltersVariableCreateHelperArgs): AdHocFiltersVariable {\n return new AdHocFiltersVariable({\n type: 'adhoc',\n hide: VariableHide.hideLabel,\n name: state.name ?? 'Filters',\n set: new AdHocFilterSet({\n ...state,\n // Main reason for this helper factory functyion\n applyMode: 'manual',\n }),\n });\n }\n\n public constructor(state: AdHocFiltersVariableState) {\n super(state);\n\n // Subscribe to filter changes and up the variable value (filterExpression)\n this.addActivationHandler(() => {\n this._subs.add(\n this.state.set.subscribeToState((newState, prevState) => {\n if (newState.filters !== prevState.filters) {\n this._filtersChanged(newState.filters);\n }\n })\n );\n this._filtersChanged(this.state.set.state.filters);\n });\n }\n\n public getValue() {\n return this.state.filterExpression;\n }\n\n private _filtersChanged(filters: AdHocVariableFilter[]) {\n let expr = '';\n\n for (const filter of filters) {\n expr += `${this._renderFilter(filter)},`;\n }\n\n if (expr.length > 0) {\n expr = expr.slice(0, -1);\n }\n\n this.setState({ filterExpression: expr });\n this.publishEvent(new SceneVariableValueChangedEvent(this), true);\n }\n\n private _renderFilter(filter: AdHocVariableFilter) {\n let value = '';\n\n if (filter.operator === '=~' || filter.operator === '!~¨') {\n value = escapeLabelValueInRegexSelector(filter.value);\n } else {\n value = escapeLabelValueInExactSelector(filter.value);\n }\n\n return `${filter.key}${filter.operator}\"${value}\"`;\n }\n\n // Same UI as the standalone AdHocFilterSet\n public static Component = ({ model }: SceneComponentProps<AdHocFiltersVariable>) => {\n return <AdHocFilterSet.Component model={model.state.set} />;\n };\n}\n\n// based on the openmetrics-documentation, the 3 symbols we have to handle are:\n// - \\n ... the newline character\n// - \\ ... the backslash character\n// - \" ... the double-quote character\nexport function escapeLabelValueInExactSelector(labelValue: string): string {\n return labelValue.replace(/\\\\/g, '\\\\\\\\').replace(/\\n/g, '\\\\n').replace(/\"/g, '\\\\\"');\n}\n\nexport function escapeLabelValueInRegexSelector(labelValue: string): string {\n return escapeLabelValueInExactSelector(escapeLokiRegexp(labelValue));\n}\n\nexport function isRegexSelector(selector?: string) {\n if (selector && (selector.includes('=~') || selector.includes('!~'))) {\n return true;\n }\n return false;\n}\n\n// Loki regular-expressions use the RE2 syntax (https://github.com/google/re2/wiki/Syntax),\n// so every character that matches something in that list has to be escaped.\n// the list of meta characters is: *+?()|\\.[]{}^$\n// we make a javascript regular expression that matches those characters:\nconst RE2_METACHARACTERS = /[*+?()|\\\\.\\[\\]{}^$]/g;\nfunction escapeLokiRegexp(value: string): string {\n return value.replace(RE2_METACHARACTERS, '\\\\$&');\n}\n"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -5530,6 +5530,9 @@ const _AdHocFiltersVariable = class extends SceneObjectBase {
|
|
|
5530
5530
|
for (const filter of filters) {
|
|
5531
5531
|
expr += `${this._renderFilter(filter)},`;
|
|
5532
5532
|
}
|
|
5533
|
+
if (expr.length > 0) {
|
|
5534
|
+
expr = expr.slice(0, -1);
|
|
5535
|
+
}
|
|
5533
5536
|
this.setState({ filterExpression: expr });
|
|
5534
5537
|
this.publishEvent(new SceneVariableValueChangedEvent(this), true);
|
|
5535
5538
|
}
|