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.
 
 

185 lines
5.8 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, onGridReady, ...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 [loading, setLoading] = useState(false);
  22. const [page, setPage] = useState(0);
  23. const [pageSize, setPageSize] = useState(10);
  24. const [_autoHeight, set_autoHeight] = useState(true);
  25. const [myHideFooterSelectedRowCount, setMyHideFooterSelectedRowCount] = useState(true);
  26. const [_sx, set_sx] = useState({
  27. padding: "4 2 4 2",
  28. lineHeight: "normal",
  29. '& .MuiDataGrid-cell': {
  30. borderTop: 1,
  31. borderBottom: 1,
  32. borderColor: "#EEE",
  33. },
  34. '& .MuiDataGrid-footerContainer': {
  35. border: 1,
  36. borderColor: "#EEE"
  37. },
  38. "& .MuiDataGrid-columnHeaderTitle": {
  39. whiteSpace: "normal",
  40. lineHeight: "normal"
  41. },
  42. "& .MuiDataGrid-columnHeader": {
  43. // Forced to use important since overriding inline styles
  44. height: "unset !important"
  45. },
  46. });
  47. const [rowCount, setRowCount] = useState(0);
  48. useEffect(() => {
  49. setPage(0);
  50. set_doLoad(doLoad);
  51. setLoading(true)
  52. }, [doLoad]);
  53. useEffect(() => {
  54. setPage(0);
  55. set_doLoad(doLoad);
  56. setLoading(true)
  57. }, [onGridReady]);
  58. useEffect(() => {
  59. getDataList();
  60. }, [_doLoad, page]);
  61. useEffect(() => {
  62. if (sx) {
  63. set_sx(sx);
  64. }
  65. if (hideFooterSelectedRowCount) {
  66. setMyHideFooterSelectedRowCount(hideFooterSelectedRowCount);
  67. }
  68. if (rowModesModel) {
  69. set_rowModesModel(rowModesModel)
  70. }
  71. if (rows) {
  72. set_rows(rows)
  73. setRowCount(rows.length)
  74. }
  75. if (columns) {
  76. set_columns(columns)
  77. }
  78. if (pageSizeOptions) {
  79. set_pageSizeOptions(pageSizeOptions)
  80. }
  81. if (autoHeight !== undefined) {
  82. set_autoHeight(autoHeight)
  83. }
  84. if (editMode) {
  85. set_editMode(editMode);
  86. }
  87. if (filterItems) {
  88. set_filterItems(filterItems);
  89. }
  90. if (customPageSize) {
  91. setPageSize(customPageSize);
  92. }
  93. }, [sx, hideFooterSelectedRowCount, rowModesModel, rows, columns, pageSizeOptions, autoHeight, editMode, filterItems, customPageSize]);
  94. const handleChangePage = (event, newPage) => {
  95. setPage(newPage);
  96. };
  97. const handleChangePageSize = (event) => {
  98. setPageSize(parseInt(event.target.value, 10));
  99. setPage(0);
  100. };
  101. function CustomNoRowsOverlay() {
  102. return (
  103. <GridOverlay>
  104. <Typography variant="body1">
  105. <FormattedMessage id="noRecordFound" />
  106. </Typography>
  107. </GridOverlay>
  108. );
  109. }
  110. function getDataList() {
  111. if (_doLoad?.url == null) return;
  112. if (_doLoad.params == null) _doLoad.params = {};
  113. _doLoad.params.start = page * pageSize;
  114. _doLoad.params.limit = pageSize;
  115. HttpUtils.get({
  116. url: _doLoad.url,
  117. params: _doLoad.params,
  118. onSuccess: function (responseData) {
  119. set_rows(responseData?.records);
  120. setRowCount(responseData?.count);
  121. if (_doLoad.callback != null) {
  122. _doLoad.callback(responseData);
  123. }
  124. setLoading(false)
  125. },
  126. onError: function (error){
  127. console.log(error)
  128. setLoading(false)
  129. }
  130. });
  131. }
  132. return (
  133. <DataGrid
  134. {...props}
  135. rows={_rows}
  136. rowCount={rowCount ? rowCount : 0}
  137. columns={_columns}
  138. paginationMode="server"
  139. disableColumnMenu
  140. shrinkWrap={true}
  141. rowModesModel={_rowModesModel}
  142. pageSizeOptions={_pageSizeOptions}
  143. editMode={_editMode}
  144. autoHeight={_autoHeight}
  145. hideFooterSelectedRowCount={myHideFooterSelectedRowCount}
  146. filterModel={{ items: _filterItems }}
  147. sx={_sx}
  148. loading={loading}
  149. components={{
  150. noRowsOverlay: CustomNoRowsOverlay,
  151. Pagination: () => (
  152. <TablePagination
  153. count={rowCount ? rowCount : 0}
  154. page={page}
  155. rowsPerPage={pageSize}
  156. rowsPerPageOptions={_pageSizeOptions}
  157. labelDisplayedRows={() =>
  158. `${(_rows?.length ? page * pageSize + 1 : 0)}-${page * pageSize + (_rows?.length ?? 0)} ${intl.formatMessage({ id: "of" })} ${rowCount}`
  159. }
  160. labelRowsPerPage={intl.formatMessage({ id: "rowsPerPage" }) + ":"}
  161. onPageChange={handleChangePage}
  162. onRowsPerPageChange={handleChangePageSize}
  163. />
  164. ),
  165. }}
  166. />
  167. );
  168. }