Skip to content

Commit

Permalink
Add the option of a default filter operator and fix filters (#849)
Browse files Browse the repository at this point in the history
* fix: broken filters by wrong rename in refactor

* feat: add default filter operator
  • Loading branch information
cococov committed May 21, 2024
1 parent 3e0e213 commit 6efc818
Show file tree
Hide file tree
Showing 7 changed files with 35 additions and 6 deletions.
32 changes: 28 additions & 4 deletions __tests__/demo/demo-components/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -1476,8 +1476,10 @@ export function LocalizationWithCustomComponents() {
}

function CustomFilterWithOperatorSelection({ columnDef, onFilterChanged }) {
const [operator, setOperator] = React.useState('=');
const [value, setValue] = React.useState(undefined);
const [operator, setOperator] = React.useState(
columnDef.tableData.filterOperator
);
const [value, setValue] = React.useState(columnDef.defaultFilter);
const operatorRef = React.useRef(operator);
const valueRef = React.useRef(value);

Expand All @@ -1504,6 +1506,7 @@ function CustomFilterWithOperatorSelection({ columnDef, onFilterChanged }) {
</Select>
<TextField
variant="standard"
value={value}
onChange={(e) => setValue(e.target.value)}
/>
</span>
Expand All @@ -1525,6 +1528,23 @@ const columns_with_custom_filter = [
}
];

const columns_with_custom_filter_and_default_filter = [
{ title: 'Name', field: 'name', filtering: true },
{
title: 'Some Number',
field: 'some_number',
filtering: true,
defaultFilter: '4',
defaultFilterOperator: '>',
filterComponent: ({ columnDef, onFilterChanged }) => (
<CustomFilterWithOperatorSelection
columnDef={columnDef}
onFilterChanged={onFilterChanged}
/>
)
}
];

const data_with_custom_filter = [
{ name: 'Juan', some_number: 1 },
{ name: 'John', some_number: 4 },
Expand All @@ -1534,7 +1554,7 @@ const data_with_custom_filter = [
{ name: 'Ignacio', some_number: 4 }
];

export function FilterWithOperatorSelection() {
export function FilterWithOperatorSelection({ withDefaultFilter = false }) {
return (
<MaterialTable
data={(query) =>
Expand Down Expand Up @@ -1585,7 +1605,11 @@ export function FilterWithOperatorSelection() {
});
})
}
columns={columns_with_custom_filter}
columns={
withDefaultFilter
? columns_with_custom_filter_and_default_filter
: columns_with_custom_filter
}
options={{
search: false,
filtering: true
Expand Down
2 changes: 2 additions & 0 deletions __tests__/demo/demo.js
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,8 @@ function Demo() {
<LocalizationWithCustomComponents />
<h1>Filter with operator selection</h1>
<FilterWithOperatorSelection />
<h1>Filter with operator selection and default operator</h1>
<FilterWithOperatorSelection withDefaultFilter />
<h1>Remote Data Related</h1>
<ol>
<li>
Expand Down
2 changes: 1 addition & 1 deletion src/components/MTableFilterRow/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ export function MTableFilterRow({
);
}

columns
propColumns
.filter((columnDef) => columnDef.tableData.groupOrder > -1)
.forEach((columnDef) => {
columns.splice(
Expand Down
2 changes: 1 addition & 1 deletion src/material-table.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ export default class MaterialTable extends React.Component {
.filter((a) => a.tableData.filterValue)
.map((a) => ({
column: a,
operator: '=',
operator: a.tableData.filterOperator,
value: a.tableData.filterValue
})),
orderBy: renderState.columns.find(
Expand Down
1 change: 1 addition & 0 deletions src/prop-types.js
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ export const propTypes = {
customSort: PropTypes.func,
customExport: PropTypes.func,
defaultFilter: PropTypes.any,
defaultFilterOperator: PropTypes.string,
defaultSort: PropTypes.oneOf(['asc', 'desc']),
editComponent: PropTypes.oneOfType([PropTypes.element, PropTypes.func]),
emptyValue: PropTypes.oneOfType([
Expand Down
1 change: 1 addition & 0 deletions src/utils/data-manager.js
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@ export default class DataManager {
const tableData = {
columnOrder: index,
filterValue: columnDef.defaultFilter,
filterOperator: columnDef.defaultFilterOperator || '=',
groupOrder: columnDef.defaultGroupOrder,
groupSort: columnDef.defaultGroupSort || 'asc',
width,
Expand Down
1 change: 1 addition & 0 deletions types/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -226,6 +226,7 @@ export interface Column<RowData extends object> {
//customExport prop handle flattening of data at column level before passing data to exporter. Note exportMenu.exportFunc is an alternative to handle data change at exporter level
customExport?: (rowData: RowData) => unknown;
defaultFilter?: any;
defaultFilterOperator?: string;
filterOnItemSelect?: boolean;
defaultGroupOrder?: number;
id?: unknown;
Expand Down

0 comments on commit 6efc818

Please sign in to comment.