You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

160 lines
5.1 KiB

  1. // material-ui
  2. import {useState, useEffect} from 'react';
  3. import {
  4. DataGrid, GridOverlay,
  5. } from "@mui/x-data-grid";
  6. import * as HttpUtils from "utils/HttpUtils";
  7. import {FormattedMessage, useIntl} from "react-intl";
  8. import {TablePagination, Typography} from '@mui/material';
  9. // ==============================|| EVENT TABLE ||============================== //
  10. export function FiDataGrid({ rows, columns, sx, autoHeight,
  11. hideFooterSelectedRowCount, rowModesModel, editMode,
  12. pageSizeOptions, filterItems, customPageSize, doLoad, ...props }) {
  13. const intl = useIntl();
  14. const [_rows, set_rows] = useState([]);
  15. const [_doLoad, set_doLoad] = useState({});
  16. const [_columns, set_columns] = useState([]);
  17. const [_rowModesModel, set_rowModesModel] = useState({});
  18. const [_editMode, set_editMode] = useState("row");
  19. const [_pageSizeOptions, set_pageSizeOptions] = useState([10]);
  20. const [_filterItems, set_filterItems] = useState([]);
  21. const [page, setPage] = useState(0);
  22. const [pageSize, setPageSize] = useState(10);
  23. const [_autoHeight, set_autoHeight] = useState(true);
  24. const [myHideFooterSelectedRowCount, setMyHideFooterSelectedRowCount] = useState(true);
  25. const [_sx, set_sx] = useState({
  26. padding: "4 2 4 2",
  27. '& .MuiDataGrid-cell': {
  28. borderTop: 1,
  29. borderBottom: 1,
  30. borderColor: "#EEE",
  31. },
  32. '& .MuiDataGrid-footerContainer': {
  33. border: 1,
  34. borderColor: "#EEE"
  35. },
  36. });
  37. const [rowCount, setRowCount] = useState(0);
  38. useEffect(() => {
  39. setPage(0);
  40. set_doLoad(doLoad);
  41. }, [doLoad]);
  42. useEffect(()=>{
  43. getDataList();
  44. },[_doLoad, page]);
  45. useEffect(() => {
  46. if (sx) {
  47. set_sx(sx);
  48. }
  49. if (hideFooterSelectedRowCount) {
  50. setMyHideFooterSelectedRowCount(hideFooterSelectedRowCount);
  51. }
  52. if (rowModesModel) {
  53. set_rowModesModel(rowModesModel)
  54. }
  55. if (rows) {
  56. set_rows(rows)
  57. setRowCount(rows.length)
  58. }
  59. if (columns) {
  60. set_columns(columns)
  61. }
  62. if (pageSizeOptions) {
  63. set_pageSizeOptions(pageSizeOptions)
  64. }
  65. if(autoHeight !== undefined){
  66. set_autoHeight(autoHeight)
  67. }
  68. if(editMode){
  69. set_editMode(editMode);
  70. }
  71. if(filterItems){
  72. set_filterItems(filterItems);
  73. }
  74. if(customPageSize){
  75. setPageSize(customPageSize);
  76. }
  77. }, [sx, hideFooterSelectedRowCount, rowModesModel, rows, columns, pageSizeOptions, autoHeight, editMode, filterItems, customPageSize]);
  78. const handleChangePage = (event, newPage) => {
  79. setPage(newPage);
  80. };
  81. const handleChangePageSize = (event) => {
  82. setPageSize(parseInt(event.target.value, 10));
  83. setPage(0);
  84. };
  85. function CustomNoRowsOverlay() {
  86. return (
  87. <GridOverlay>
  88. <Typography variant="body1">
  89. <FormattedMessage id="noRecordFound" />
  90. </Typography>
  91. </GridOverlay>
  92. );
  93. }
  94. function getDataList() {
  95. if(_doLoad?.url == null) return;
  96. if(_doLoad.params == null) _doLoad.params = {};
  97. _doLoad.params.start = page*pageSize;
  98. _doLoad.params.limit = pageSize;
  99. HttpUtils.get({
  100. url: _doLoad.url,
  101. params: _doLoad.params,
  102. onSuccess: function (responseData) {
  103. set_rows(responseData?.records);
  104. setRowCount(responseData?.count);
  105. if(_doLoad.callback != null){
  106. _doLoad.callback(responseData);
  107. }
  108. }
  109. });
  110. }
  111. return (
  112. <DataGrid
  113. {...props}
  114. rows={_rows}
  115. columns={_columns}
  116. paginationMode="server"
  117. disableColumnMenu
  118. rowModesModel={_rowModesModel}
  119. pageSizeOptions={_pageSizeOptions}
  120. editMode={_editMode}
  121. autoHeight={_autoHeight}
  122. hideFooterSelectedRowCount={myHideFooterSelectedRowCount}
  123. filterModel={{ items: _filterItems }}
  124. sx={_sx}
  125. components={{
  126. noRowsOverlay: CustomNoRowsOverlay,
  127. Pagination: () => (
  128. <TablePagination
  129. count={rowCount?rowCount:0}
  130. page={page}
  131. rowsPerPage={pageSize}
  132. rowsPerPageOptions={_pageSizeOptions}
  133. labelDisplayedRows={() =>
  134. `${(_rows?.length?page*pageSize+1:0)}-${page*pageSize+(_rows?.length??0)} ${intl.formatMessage({ id: "of" })} ${rowCount}`
  135. }
  136. labelRowsPerPage={intl.formatMessage({ id: "rowsPerPage" }) + ":"}
  137. onPageChange={handleChangePage}
  138. onRowsPerPageChange={handleChangePageSize}
  139. />
  140. ),
  141. }}
  142. />
  143. );
  144. }