Introduce column filters
Summary: Beyond a search across all columns, it is now possible to specific columns for specific values: * for a row to be visible, all active column filters need to be matched (e.g. both a filter on time and app has to be satisfied) * if multiple values within a column are filtered for, these are -or-ed. * if no value at all within a column is checked, even when they are defined, the column won't take part in filtering * if there is a general search and column filters, a row has to satisfy both Filters can be preconfigured, pre-configured filters cannot be removed. Reseting will reset the filters back to their original Move `useMemoize` to flipper-plugin Merged the `ui/utils` and `utils` folder inside `flipper-plugin` Reviewed By: nikoant Differential Revision: D26450260 fbshipit-source-id: 11693d5d140cea03cad91c1e0f3438d7b129cf29
This commit is contained in:
committed by
Facebook GitHub Bot
parent
8aabce477b
commit
11eb19da4c
@@ -11,7 +11,7 @@ import React, {createRef} from 'react';
|
||||
import {DataTable, DataTableColumn} from '../DataTable';
|
||||
import {render, act} from '@testing-library/react';
|
||||
import {createDataSource} from '../../../state/datasource/DataSource';
|
||||
import {TableManager} from '../useDataTableManager';
|
||||
import {computeDataTableFilter, TableManager} from '../useDataTableManager';
|
||||
import {Button} from 'antd';
|
||||
|
||||
type Todo = {
|
||||
@@ -277,3 +277,226 @@ test('search', async () => {
|
||||
expect(elem.length).toBe(3);
|
||||
}
|
||||
});
|
||||
|
||||
test('compute filters', () => {
|
||||
const coffee = {
|
||||
level: 'info',
|
||||
title: 'Drink coffee',
|
||||
done: true,
|
||||
};
|
||||
const espresso = {
|
||||
level: 'info',
|
||||
title: 'Make espresso',
|
||||
done: false,
|
||||
};
|
||||
const meet = {
|
||||
level: 'error',
|
||||
title: 'Meet me',
|
||||
done: false,
|
||||
};
|
||||
const data = [coffee, espresso, meet];
|
||||
|
||||
// results in empty filter
|
||||
expect(computeDataTableFilter('', [])).toBeUndefined();
|
||||
expect(
|
||||
computeDataTableFilter('', [
|
||||
{
|
||||
key: 'title',
|
||||
filters: [
|
||||
{
|
||||
enabled: false,
|
||||
value: 'coffee',
|
||||
label: 'coffee',
|
||||
},
|
||||
],
|
||||
},
|
||||
]),
|
||||
).toBeUndefined();
|
||||
|
||||
{
|
||||
const filter = computeDataTableFilter('tEsT', [])!;
|
||||
expect(data.filter(filter)).toEqual([]);
|
||||
}
|
||||
|
||||
{
|
||||
const filter = computeDataTableFilter('EE', [])!;
|
||||
expect(data.filter(filter)).toEqual([coffee, meet]);
|
||||
}
|
||||
|
||||
{
|
||||
const filter = computeDataTableFilter('D', [])!;
|
||||
expect(data.filter(filter)).toEqual([coffee]);
|
||||
}
|
||||
|
||||
{
|
||||
const filter = computeDataTableFilter('true', [])!;
|
||||
expect(data.filter(filter)).toEqual([coffee]);
|
||||
}
|
||||
|
||||
{
|
||||
const filter = computeDataTableFilter('false', [])!;
|
||||
expect(data.filter(filter)).toEqual([espresso, meet]);
|
||||
}
|
||||
|
||||
{
|
||||
const filter = computeDataTableFilter('EE', [
|
||||
{
|
||||
key: 'level',
|
||||
filters: [
|
||||
{
|
||||
enabled: true,
|
||||
value: 'error',
|
||||
label: 'error',
|
||||
},
|
||||
],
|
||||
},
|
||||
])!;
|
||||
expect(data.filter(filter)).toEqual([meet]);
|
||||
}
|
||||
{
|
||||
const filter = computeDataTableFilter('EE', [
|
||||
{
|
||||
key: 'level',
|
||||
filters: [
|
||||
{
|
||||
enabled: true,
|
||||
value: 'info',
|
||||
label: 'info',
|
||||
},
|
||||
{
|
||||
enabled: true,
|
||||
value: 'error',
|
||||
label: 'error',
|
||||
},
|
||||
],
|
||||
},
|
||||
])!;
|
||||
expect(data.filter(filter)).toEqual([coffee, meet]);
|
||||
}
|
||||
{
|
||||
const filter = computeDataTableFilter('', [
|
||||
{
|
||||
key: 'level',
|
||||
filters: [
|
||||
{
|
||||
enabled: true,
|
||||
value: 'info',
|
||||
label: 'info',
|
||||
},
|
||||
{
|
||||
enabled: false,
|
||||
value: 'error',
|
||||
label: 'error',
|
||||
},
|
||||
],
|
||||
},
|
||||
])!;
|
||||
expect(data.filter(filter)).toEqual([coffee, espresso]);
|
||||
}
|
||||
{
|
||||
const filter = computeDataTableFilter('', [
|
||||
{
|
||||
key: 'done',
|
||||
filters: [
|
||||
{
|
||||
enabled: true,
|
||||
value: 'false',
|
||||
label: 'Not done',
|
||||
},
|
||||
],
|
||||
},
|
||||
])!;
|
||||
expect(data.filter(filter)).toEqual([espresso, meet]);
|
||||
}
|
||||
{
|
||||
// nothing selected anything will not filter anything out for that column
|
||||
const filter = computeDataTableFilter('', [
|
||||
{
|
||||
key: 'level',
|
||||
filters: [
|
||||
{
|
||||
enabled: false,
|
||||
value: 'info',
|
||||
label: 'info',
|
||||
},
|
||||
{
|
||||
enabled: false,
|
||||
value: 'error',
|
||||
label: 'error',
|
||||
},
|
||||
],
|
||||
},
|
||||
])!;
|
||||
expect(filter).toBeUndefined();
|
||||
}
|
||||
{
|
||||
const filter = computeDataTableFilter('', [
|
||||
{
|
||||
key: 'level',
|
||||
filters: [
|
||||
{
|
||||
enabled: true,
|
||||
value: 'info',
|
||||
label: 'info',
|
||||
},
|
||||
{
|
||||
enabled: true,
|
||||
value: 'error',
|
||||
label: 'error',
|
||||
},
|
||||
],
|
||||
},
|
||||
])!;
|
||||
expect(data.filter(filter)).toEqual([coffee, espresso, meet]);
|
||||
}
|
||||
{
|
||||
const filter = computeDataTableFilter('', [
|
||||
{
|
||||
key: 'level',
|
||||
filters: [
|
||||
{
|
||||
enabled: true,
|
||||
value: 'info',
|
||||
label: 'info',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
key: 'done',
|
||||
filters: [
|
||||
{
|
||||
enabled: true,
|
||||
value: 'false',
|
||||
label: 'false,',
|
||||
},
|
||||
],
|
||||
},
|
||||
])!;
|
||||
expect(data.filter(filter)).toEqual([espresso]);
|
||||
}
|
||||
{
|
||||
const filter = computeDataTableFilter('nonsense', [
|
||||
{
|
||||
key: 'level',
|
||||
filters: [
|
||||
{
|
||||
enabled: true,
|
||||
value: 'info',
|
||||
label: 'info',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
key: 'done',
|
||||
filters: [
|
||||
{
|
||||
enabled: true,
|
||||
value: 'false',
|
||||
label: 'false,',
|
||||
},
|
||||
],
|
||||
},
|
||||
])!;
|
||||
expect(data.filter(filter)).toEqual([]);
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user