-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathApp.js
103 lines (91 loc) · 2.24 KB
/
App.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import 'devextreme/dist/css/dx.common.css';
import 'devextreme/dist/css/dx.light.css';
import React, { useCallback, useState, useReducer } from "react";
import DataGrid, { Column } from "devextreme-react/data-grid";
import { customers } from "./data.js";
import CustomColumnChooser from "./CustomColumnChooser";
const initialState = [
{
dataField: "CompanyName",
visible: true
},
{
dataField: "City",
visible: true
},
{
dataField: "State",
visible: true
},
{
dataField: "Phone",
visible: true
},
{
dataField: "Fax",
visible: true
}
];
function reducer(state, changes) {
if (Object.keys(changes).length === 0) return state;
var newState = [...state];
changes.forEach((change) => {
var column = newState.find((c) => c.dataField === change.dataField);
Object.keys(change).forEach((key) => {
column[key] = change[key];
});
});
return newState;
}
export default function App() {
const [columns, setColumnsState] = useReducer(reducer, initialState);
const [visible, setVisible] = useState(false);
const onToolbarPreparing = useCallback((e) => {
e.toolbarOptions.items.push({
widget: "dxButton",
location: "after",
options: {
icon: "columnchooser",
elementAttr: {
id: "myColumnChooser"
},
onClick: () => setVisible(true)
}
});
}, [setVisible]);
const onHiding = useCallback(() => {
setVisible(false);
}, [setVisible]);
const onApply = useCallback((changes) => {
setColumnsState(changes);
setVisible(false);
}, [setColumnsState, setVisible]);
return (
<React.Fragment>
<DataGrid
id="grid"
dataSource={customers}
showBorders={true}
onToolbarPreparing={onToolbarPreparing}
>
{columns.map((column) => {
return (
<Column
key={column.dataField}
dataField={column.dataField}
visible={column.visible}
/>
);
})}
</DataGrid>
<CustomColumnChooser
container="#grid"
button="#myColumnChooser"
visible={visible}
onHiding={onHiding}
columns={columns}
onApply={onApply}
/>
</React.Fragment>
);
}