Skip to content

Commit 922db93

Browse files
authored
Merge pull request #1218 from layer5io/copilot/switch-mui-datatables-provider
Switch mui-datatables to actively maintained leecalcote fork
2 parents 0f0a88e + 5ccdefc commit 922db93

File tree

4 files changed

+140
-11
lines changed

4 files changed

+140
-11
lines changed

examples/next-12/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
"@mui/icons-material": "^5.14.16",
1818
"@mui/material": "^5.14.17",
1919
"@reduxjs/toolkit": "^1.9.7",
20-
"mui-datatables": "^4.3.0",
20+
"@sistent/mui-datatables": "^5.1.2",
2121
"next": "^15.5.9",
2222
"react": "^18.3.1",
2323
"react-dom": "^18.3.1",

package-lock.json

Lines changed: 13 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@
6868
"jest": "^29.7.0",
6969
"jest-environment-jsdom": "^29.7.0",
7070
"lint-staged": "^15.5.0",
71-
"@sistent/mui-datatables": "^5.0.0",
71+
"@sistent/mui-datatables": "^5.1.2",
7272
"notistack": "^3.0.2",
7373
"prettier": "^3.5.3",
7474
"prettier-plugin-organize-imports": "^4.1.0",
@@ -115,7 +115,7 @@
115115
"js-yaml": "^4.1.0",
116116
"lodash": "^4.17.21",
117117
"moment": "^2.30.1",
118-
"mui-datatables": "*",
118+
"mui-datatables": "github:leecalcote/mui-datatables#decbb0493fdd95d674d2dd748d3d35cefb801195",
119119
"re-resizable": "^6.11.2",
120120
"react-draggable": "^4.4.6",
121121
"react-share": "^5.1.0",
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
import React, { act } from 'react';
2+
import { render, waitFor } from '@testing-library/react';
3+
import type { MUIDataTableColumn, MUIDataTableOptions, MUIDataTableProps } from 'mui-datatables';
4+
import ResponsiveDataTable from '../custom/ResponsiveDataTable';
5+
6+
const muiDataTableMock = jest.fn();
7+
8+
jest.mock('react-markdown', () => {
9+
const React = require('react');
10+
return {
11+
__esModule: true,
12+
default: (props: unknown) => React.createElement('div', props)
13+
};
14+
});
15+
16+
jest.mock('rehype-raw', () => () => null);
17+
jest.mock('remark-gfm', () => () => null);
18+
19+
jest.mock('../custom', () => {
20+
const React = require('react');
21+
return {
22+
__esModule: true,
23+
CustomTooltip: ({ children }: { children: React.ReactNode }) =>
24+
React.createElement('div', null, children)
25+
};
26+
});
27+
28+
jest.mock('mui-datatables', () => {
29+
const React = require('react');
30+
return {
31+
__esModule: true,
32+
default: (props: MUIDataTableProps) => {
33+
muiDataTableMock(props);
34+
return React.createElement('div', { 'data-testid': 'mui-datatables' });
35+
},
36+
MUIDataTableColumn: {}
37+
};
38+
});
39+
40+
describe('ResponsiveDataTable', () => {
41+
beforeEach(() => {
42+
muiDataTableMock.mockClear();
43+
});
44+
45+
it('applies default table options', () => {
46+
const columns: MUIDataTableColumn[] = [{ name: 'id', label: 'ID' }];
47+
48+
render(
49+
<ResponsiveDataTable
50+
columns={columns}
51+
data={[]}
52+
tableCols={columns}
53+
columnVisibility={{}}
54+
/>
55+
);
56+
57+
expect(muiDataTableMock).toHaveBeenCalled();
58+
const props = muiDataTableMock.mock.calls[0][0] as MUIDataTableProps;
59+
const options = props.options as MUIDataTableOptions;
60+
61+
expect(options).toEqual(
62+
expect.objectContaining({
63+
print: false,
64+
download: false,
65+
search: false,
66+
filter: false,
67+
viewColumns: false,
68+
rowsPerPageOptions: [10, 25, 50, 100],
69+
elevation: 0,
70+
enableNestedDataAccess: '.'
71+
})
72+
);
73+
});
74+
75+
it('updates column visibility via onViewColumnsChange', async () => {
76+
const columns: MUIDataTableColumn[] = [{ name: 'name', label: 'Name', options: { display: true } }];
77+
const updateCols = jest.fn();
78+
79+
render(
80+
<ResponsiveDataTable
81+
columns={columns}
82+
data={[]}
83+
tableCols={columns}
84+
columnVisibility={{ name: true }}
85+
updateCols={updateCols}
86+
/>
87+
);
88+
89+
await waitFor(() => expect(updateCols).toHaveBeenCalled());
90+
91+
const props = muiDataTableMock.mock.calls[0][0] as MUIDataTableProps;
92+
const options = props.options as MUIDataTableOptions;
93+
94+
act(() => {
95+
options.onViewColumnsChange?.('name', 'remove');
96+
});
97+
98+
expect(columns[0].options?.display).toBe(false);
99+
expect(updateCols).toHaveBeenCalledTimes(2);
100+
});
101+
102+
it('attaches date renderer for known date columns', async () => {
103+
const columns: MUIDataTableColumn[] = [{ name: 'updated_at', label: 'Updated At', options: {} }];
104+
const updateCols = jest.fn();
105+
106+
render(
107+
<ResponsiveDataTable
108+
columns={columns}
109+
data={[]}
110+
tableCols={columns}
111+
columnVisibility={{ updated_at: true }}
112+
updateCols={updateCols}
113+
/>
114+
);
115+
116+
await waitFor(() => expect(updateCols).toHaveBeenCalled());
117+
118+
const renderer = columns[0].options?.customBodyRender;
119+
expect(typeof renderer).toBe('function');
120+
121+
const element = renderer && renderer('2024-01-01T00:00:00Z');
122+
expect(element).toBeTruthy();
123+
});
124+
});

0 commit comments

Comments
 (0)