mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
* Adding FilterByValue transformer skeleton * Connecting options with Editor * Improving UI and making deep copy of options on change. * Improving Transformation Editor UI * Implementing Regex filtering * Adding valueFilters.ts and creating filter registry * Connecting the test function * Correcting TypeScript errors * Using FilterInstance instead of simple Filter test function * Adding field.type as filter options * Improving UI. Adding custom placeholder depending on filter. * Implementing a few more filter types * Implementing more filters * Return original data if no filter were processed * Improving UI * Correcting TS errors * Making sure inequality transform are invalid until the filterExpression is not empty * Cleanup in the UI file * Improving UI (highlight invalid fields) * Only show filterType that are supported for the selected field * Adding tests + correction of a filter * Adding transformer test * Adding doc * Cleanup * Typing props for FilterSelectorRow component Co-authored-by: Marcus Andersson <systemvetaren@gmail.com> * Moving rendering in the JSX Co-authored-by: Marcus Andersson <systemvetaren@gmail.com> * Memoizing filterTypeOptions computation Co-authored-by: Marcus Andersson <systemvetaren@gmail.com> * Improve code compactness Co-authored-by: Marcus Andersson <systemvetaren@gmail.com> * Cleanup + solving TS errors * Updating some labels * Wrapping stuff around useMemo and useCallback * Using cloneDeep from lodash * Don't highlight field name input if null * Removing time type fields in selectable options * We want loose equality in this scenario. * Adding `onChange` to useCallback dependencies Co-authored-by: Marcus Andersson <systemvetaren@gmail.com> * Include or exclude matching any or all conditions * Correcting field name matching * Cleanup * Don't highlight the filterExpression input when its empty * Adding Range filter * Updating doc * Correcting TS error * Only showing the Match All/Match Any option if more than one condition * Two inputs for the Range filter instead of one * Improving invalid highlight for Range filter type * Cleanup * Improving labels in UI * Using ButtonSelect to improve UI * editor UI updates. * Updating tests * Adding component for Regex * Improve TS typing * Adding components for the other filter types. * Cleanup * Correct error * Updating valueFilter.test.ts * Updating filterByValue.test.ts * Reverting and removing Range filter * Update docs/sources/panels/transformations.md * starting to implement poc. * added a small poc. * wip * added tests. * added structure for dynamic value matcher editors. * added more support. * added some more value matchers. * removed unused value filters. * added some more matchers. * adding more matchers. * added a range matcher. * fixing some tests. * fixing tests. * remove unused dep. * making the matching a bit more performant. * UX improvements and alignment fixes * fixed delete button. * fixed some spacing in the UI. * added docs for matchers. * adding docs and exposing value matcher types. * will store dateTime as string. * updated docs according to feedback. * moved filter by value in transformation list. * Improved description. * added regex value filter. * added support for regex. * fixing failing tests. Co-authored-by: Marcus Andersson <systemvetaren@gmail.com> Co-authored-by: Marcus Andersson <marcus.andersson@grafana.com> Co-authored-by: Torkel Ödegaard <torkel@grafana.com>
86 lines
2.0 KiB
TypeScript
86 lines
2.0 KiB
TypeScript
import { toDataFrame } from '../../../dataframe';
|
|
import { DataFrame } from '../../../types/dataFrame';
|
|
import { getValueMatcher } from '../../matchers';
|
|
import { ValueMatcherID } from '../ids';
|
|
|
|
describe('regex value matcher', () => {
|
|
const data: DataFrame[] = [
|
|
toDataFrame({
|
|
fields: [
|
|
{
|
|
name: 'temp',
|
|
values: ['.', 'asdf', 100, '25.5'],
|
|
},
|
|
],
|
|
}),
|
|
];
|
|
|
|
describe('option with value .*', () => {
|
|
const matcher = getValueMatcher({
|
|
id: ValueMatcherID.regex,
|
|
options: {
|
|
value: '.*',
|
|
},
|
|
});
|
|
|
|
it('should match all values', () => {
|
|
const frame = data[0];
|
|
const field = frame.fields[0];
|
|
|
|
for (let i = 0; i < field.values.length; i++) {
|
|
expect(matcher(i, field, frame, data)).toBeTruthy();
|
|
}
|
|
});
|
|
});
|
|
|
|
describe('option with value \\w+', () => {
|
|
const matcher = getValueMatcher({
|
|
id: ValueMatcherID.regex,
|
|
options: {
|
|
value: '\\w+',
|
|
},
|
|
});
|
|
|
|
it('should match wordy values', () => {
|
|
const frame = data[0];
|
|
const field = frame.fields[0];
|
|
const valueIndex = 1;
|
|
|
|
expect(matcher(valueIndex, field, frame, data)).toBeTruthy();
|
|
});
|
|
|
|
it('should not match non-wordy values', () => {
|
|
const frame = data[0];
|
|
const field = frame.fields[0];
|
|
const valueIndex = 0;
|
|
|
|
expect(matcher(valueIndex, field, frame, data)).toBeFalsy();
|
|
});
|
|
});
|
|
|
|
describe('option with value \\d+', () => {
|
|
const matcher = getValueMatcher({
|
|
id: ValueMatcherID.regex,
|
|
options: {
|
|
value: '\\d+',
|
|
},
|
|
});
|
|
|
|
it('should match numeric values', () => {
|
|
const frame = data[0];
|
|
const field = frame.fields[0];
|
|
const valueIndex = 2;
|
|
|
|
expect(matcher(valueIndex, field, frame, data)).toBeTruthy();
|
|
});
|
|
|
|
it('should not match non-numeric values', () => {
|
|
const frame = data[0];
|
|
const field = frame.fields[0];
|
|
const valueIndex = 1;
|
|
|
|
expect(matcher(valueIndex, field, frame, data)).toBeFalsy();
|
|
});
|
|
});
|
|
});
|