Skip to content

Commit d1cacc1

Browse files
committed
adding support for filterModel
- info from the grid (read-only) (plotly#109) - added output for `test_filter` - added check for action props to delay until the grid is ready (plotly#99) - set the default `dashGridOptions` to `{}` (plotly#97)
1 parent 09982d2 commit d1cacc1

File tree

3 files changed

+109
-30
lines changed

3 files changed

+109
-30
lines changed

src/lib/components/AgGrid.react.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ DashAgGrid.defaultProps = {
7373
suppressDragLeaveHidesColumns: true,
7474
dangerously_allow_code: false,
7575
rowModelType: 'clientSide',
76+
dashGridOptions: {},
7677
};
7778
DashAgGrid.propTypes = {
7879
/********************************
@@ -346,6 +347,11 @@ DashAgGrid.propTypes = {
346347
failCallback: PropTypes.func,
347348
}),
348349

350+
/**
351+
* If filtering client-side rowModel, what the filter model is (read-only)
352+
*/
353+
filterModel: PropTypes.object,
354+
349355
/**
350356
* Request from Dash AgGrid when suppressCallback is disabled and a user opens a row with a detail grid
351357
*/

src/lib/fragments/AgGrid.react.js

Lines changed: 86 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ export default class DashAgGrid extends Component {
337337

338338
const filterModel = this.state.gridApi.getFilterModel();
339339
this.setState({filterModel});
340-
setProps({virtualRowData});
340+
setProps({virtualRowData, filterModel});
341341
}
342342
}
343343

@@ -517,7 +517,17 @@ export default class DashAgGrid extends Component {
517517
onGridReady(params) {
518518
// Applying Infinite Row Model
519519
// see: https://www.ag-grid.com/javascript-grid/infinite-scrolling/
520-
const {rowModelType, selectedRows} = this.props;
520+
const {
521+
rowModelType,
522+
selectedRows,
523+
resetColumnState,
524+
csvExportParams,
525+
exportDataAsCsv,
526+
selectAll,
527+
deselectAll,
528+
autoSizeAllColumns,
529+
deleteSelectedRows,
530+
} = this.props;
521531
if (rowModelType === 'infinite') {
522532
params.api.setDatasource(this.getDatasource());
523533
}
@@ -528,6 +538,31 @@ export default class DashAgGrid extends Component {
528538
});
529539

530540
this.updateColumnWidths();
541+
542+
if (resetColumnState) {
543+
this.resetColumnState();
544+
}
545+
546+
if (exportDataAsCsv) {
547+
this.exportDataAsCsv(csvExportParams);
548+
}
549+
550+
if (selectAll) {
551+
this.selectAll(selectAll);
552+
}
553+
554+
if (deselectAll) {
555+
this.deselectAll();
556+
}
557+
558+
if (autoSizeAllColumns) {
559+
this.autoSizeAllColumns(autoSizeAllColumns);
560+
}
561+
562+
if (deleteSelectedRows) {
563+
this.deleteSelectedRows();
564+
}
565+
531566
this.updateColumnState();
532567

533568
if (this.state.rowTransaction) {
@@ -666,21 +701,31 @@ export default class DashAgGrid extends Component {
666701
);
667702
}
668703

669-
resetColumnState() {
670-
this.state.gridColumnApi.resetColumnState();
704+
// Event actions that reset
705+
exportDataAsCsv(csvExportParams) {
706+
if (!this.state.gridApi) {
707+
return;
708+
}
709+
this.state.gridApi.exportDataAsCsv(csvExportParams);
671710
this.props.setProps({
672-
resetColumnState: false,
711+
exportDataAsCsv: false,
673712
});
674713
}
675714

676-
exportDataAsCsv(csvExportParams) {
677-
this.state.gridApi.exportDataAsCsv(csvExportParams);
715+
resetColumnState() {
716+
if (!this.state.gridApi) {
717+
return;
718+
}
719+
this.state.gridColumnApi.resetColumnState();
678720
this.props.setProps({
679-
exportDataAsCsv: false,
721+
resetColumnState: false,
680722
});
681723
}
682724

683725
selectAll(opts) {
726+
if (!this.state.gridApi) {
727+
return;
728+
}
684729
if (opts?.filtered) {
685730
this.state.gridApi.selectAllFiltered();
686731
} else {
@@ -692,13 +737,19 @@ export default class DashAgGrid extends Component {
692737
}
693738

694739
deselectAll() {
740+
if (!this.state.gridApi) {
741+
return;
742+
}
695743
this.state.gridApi.deselectAll();
696744
this.props.setProps({
697745
deselectAll: false,
698746
});
699747
}
700748

701749
deleteSelectedRows() {
750+
if (!this.state.gridApi) {
751+
return;
752+
}
702753
const sel = this.state.gridApi.getSelectedRows();
703754
this.state.gridApi.applyTransaction({remove: sel});
704755
this.props.setProps({
@@ -707,6 +758,33 @@ export default class DashAgGrid extends Component {
707758
});
708759
}
709760

761+
autoSizeAllColumns(opts) {
762+
if (!this.state.gridApi) {
763+
return;
764+
}
765+
const allColumnIds = this.state.gridColumnApi
766+
.getColumnState()
767+
.map((column) => column.colId);
768+
const skipHeaders = Boolean(opts?.skipHeaders);
769+
this.state.gridColumnApi.autoSizeColumns(allColumnIds, skipHeaders);
770+
this.props.setProps({
771+
autoSizeAllColumns: false,
772+
});
773+
}
774+
// end event actions
775+
776+
updateColumnState() {
777+
if (!this.state.gridApi) {
778+
return;
779+
}
780+
this.props.setProps({
781+
columnState: JSON.parse(
782+
JSON.stringify(this.state.gridColumnApi.getColumnState())
783+
),
784+
updateColumnState: false,
785+
});
786+
}
787+
710788
buildArray(arr1, arr2) {
711789
if (arr1) {
712790
if (!arr1.includes(arr2)) {
@@ -743,26 +821,6 @@ export default class DashAgGrid extends Component {
743821
this.syncRowData();
744822
}
745823

746-
autoSizeAllColumns(opts) {
747-
const allColumnIds = this.state.gridColumnApi
748-
.getColumnState()
749-
.map((column) => column.colId);
750-
const skipHeaders = Boolean(opts?.skipHeaders);
751-
this.state.gridColumnApi.autoSizeColumns(allColumnIds, skipHeaders);
752-
this.props.setProps({
753-
autoSizeAllColumns: false,
754-
});
755-
}
756-
757-
updateColumnState() {
758-
this.props.setProps({
759-
columnState: JSON.parse(
760-
JSON.stringify(this.state.gridColumnApi.getColumnState())
761-
),
762-
updateColumnState: false,
763-
});
764-
}
765-
766824
render() {
767825
const {
768826
id,

tests/test_filter.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
from dash import Dash, html
1+
from dash import Dash, html, Input, Output
22
from dash_ag_grid import AgGrid
33
import plotly.express as px
4+
import json
45

56
from . import utils
67

@@ -20,16 +21,30 @@ def test_fi001_floating_filter(dash_duo):
2021
for col in default_display_cols
2122
],
2223
defaultColDef={"filter": True, "floatingFilter": True}
23-
)
24+
),
25+
html.Div(id='filterModel')
2426
])
2527

28+
@app.callback(
29+
Output("filterModel", "children"),
30+
Input("grid", "filterModel"),
31+
)
32+
def updateFilterModel(fM):
33+
return json.dumps(fM)
34+
2635
dash_duo.start_server(app)
2736

2837
grid = utils.Grid(dash_duo, "grid")
2938

3039
grid.wait_for_cell_text(0, 1, "101-Bois-de-Liesse")
40+
dash_duo.wait_for_text_to_equal("#filterModel", "{}")
3141

3242
grid.set_filter(0, "12")
43+
dash_duo.wait_for_text_to_equal("#filterModel", '{"district_id": {"filterType": "text",'
44+
' "type": "contains", "filter": "12"}}')
3345

3446
grid.wait_for_cell_text(0, 1, "112-DeLorimier")
3547
grid.wait_for_rendered_rows(5)
48+
49+
grid.set_filter(0, "")
50+
dash_duo.wait_for_text_to_equal("#filterModel", "{}")

0 commit comments

Comments
 (0)