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.
 
 

203 lines
6.6 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, applyGridOnReady, ...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. if (doLoad !== undefined && Object.keys(doLoad).length>0 ){
  50. setPage(0);
  51. set_doLoad(doLoad);
  52. setLoading(true)
  53. }
  54. }, [doLoad]);
  55. useEffect(() => {
  56. getDataList();
  57. }, [_doLoad, page]);
  58. useEffect(() => {
  59. if (sx) {
  60. set_sx(sx);
  61. }
  62. if (hideFooterSelectedRowCount) {
  63. setMyHideFooterSelectedRowCount(hideFooterSelectedRowCount);
  64. }
  65. if (rowModesModel) {
  66. set_rowModesModel(rowModesModel)
  67. }
  68. if (rows) {
  69. set_rows(rows)
  70. setRowCount(rows.length)
  71. }
  72. if (columns) {
  73. set_columns(columns)
  74. }
  75. if (pageSizeOptions) {
  76. set_pageSizeOptions(pageSizeOptions)
  77. }
  78. if (autoHeight !== undefined) {
  79. set_autoHeight(autoHeight)
  80. }
  81. if (editMode) {
  82. set_editMode(editMode);
  83. }
  84. if (filterItems) {
  85. set_filterItems(filterItems);
  86. }
  87. if (customPageSize) {
  88. setPageSize(customPageSize);
  89. }
  90. // console.log(_doLoad)
  91. if (_doLoad !== undefined && Object.keys(_doLoad).length==0 ){
  92. setLoading(false)
  93. if (applyGridOnReady !== undefined){
  94. applyGridOnReady(false)
  95. }
  96. }
  97. }, [sx, hideFooterSelectedRowCount, rowModesModel, rows, columns, pageSizeOptions, autoHeight, editMode, filterItems, customPageSize]);
  98. const handleChangePage = (event, newPage) => {
  99. setPage(newPage);
  100. };
  101. const handleChangePageSize = (event) => {
  102. setPageSize(parseInt(event.target.value, 10));
  103. setPage(0);
  104. };
  105. function CustomNoRowsOverlay() {
  106. return (
  107. <GridOverlay>
  108. <Typography variant="body1">
  109. <FormattedMessage id="noRecordFound" />
  110. </Typography>
  111. </GridOverlay>
  112. );
  113. }
  114. function getDataList() {
  115. // console.log(Object.keys(_doLoad.params).length > 0)
  116. // console.log(Object.keys(_doLoad.params).length > 0)
  117. if (_doLoad?.url == null){
  118. setLoading(false)
  119. return;
  120. }
  121. if (_doLoad.params == undefined) return;
  122. if (_doLoad.params.searchCriteria !== undefined) return;
  123. if (_doLoad.params == null) _doLoad.params = {};
  124. _doLoad.params.start = page * pageSize;
  125. _doLoad.params.limit = pageSize;
  126. HttpUtils.get({
  127. url: _doLoad.url,
  128. params: _doLoad.params,
  129. onSuccess: function (responseData) {
  130. set_rows(responseData?.records);
  131. setRowCount(responseData?.count);
  132. if (_doLoad.callback != null) {
  133. _doLoad.callback(responseData);
  134. }
  135. setLoading(false)
  136. // console.log(applyGridOnReady)
  137. if (applyGridOnReady !== undefined){
  138. applyGridOnReady(false)
  139. }
  140. },
  141. onError: function (error){
  142. console.log(error)
  143. setLoading(false)
  144. if (applyGridOnReady !== undefined){
  145. applyGridOnReady(false)
  146. }
  147. }
  148. });
  149. }
  150. return (
  151. <DataGrid
  152. {...props}
  153. rows={_rows}
  154. rowCount={rowCount ? rowCount : 0}
  155. columns={_columns}
  156. paginationMode="server"
  157. disableColumnMenu
  158. shrinkWrap={true}
  159. rowModesModel={_rowModesModel}
  160. pageSizeOptions={_pageSizeOptions}
  161. editMode={_editMode}
  162. autoHeight={_autoHeight}
  163. hideFooterSelectedRowCount={myHideFooterSelectedRowCount}
  164. filterModel={{ items: _filterItems }}
  165. sx={_sx}
  166. loading={loading}
  167. components={{
  168. noRowsOverlay: CustomNoRowsOverlay,
  169. Pagination: () => (
  170. <TablePagination
  171. count={rowCount ? rowCount : 0}
  172. page={page}
  173. rowsPerPage={pageSize}
  174. rowsPerPageOptions={_pageSizeOptions}
  175. labelDisplayedRows={() =>
  176. `${(_rows?.length ? page * pageSize + 1 : 0)}-${page * pageSize + (_rows?.length ?? 0)} ${intl.formatMessage({ id: "of" })} ${rowCount}`
  177. }
  178. labelRowsPerPage={intl.formatMessage({ id: "rowsPerPage" }) + ":"}
  179. onPageChange={handleChangePage}
  180. onRowsPerPageChange={handleChangePageSize}
  181. />
  182. ),
  183. }}
  184. />
  185. );
  186. }