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.
 
 

206 line
6.2 KiB

  1. // material-ui
  2. import * as React from 'react';
  3. import {
  4. DataGrid,
  5. GridActionsCellItem,
  6. GridRowModes
  7. } from "@mui/x-data-grid";
  8. import RemoveCircleOutlineIcon from '@mui/icons-material/RemoveCircleOutline';
  9. import { useEffect } from "react";
  10. import { useIntl } from 'react-intl';
  11. // import {useNavigate} from "react-router-dom";
  12. // import { useTheme } from '@mui/material/styles';
  13. import {
  14. Box,
  15. Stack,
  16. Button
  17. } from '@mui/material';
  18. // ==============================|| EVENT TABLE ||============================== //
  19. export default function UploadFileTable({ recordList, setRecordList, showPageColumn, _checkCode, _expectedCode }) {
  20. const intl = useIntl();
  21. const deleteFileLabel = intl.formatMessage({ id: 'ariaDeleteFile' });
  22. const [rows, setRows] = React.useState(recordList);
  23. const [rowModesModel, setRowModesModel] = React.useState({});
  24. const [showPage, setShowPage] = React.useState(false);
  25. const [checkCode, setCheckCode] = React.useState("");
  26. const [expectedCode, setExpectedCode] = React.useState("");
  27. // const theme = useTheme();
  28. // const navigate = useNavigate()
  29. useEffect(() => {
  30. setCheckCode(_checkCode)
  31. }, [_checkCode]);
  32. useEffect(() => {
  33. setExpectedCode(_expectedCode)
  34. }, [_expectedCode]);
  35. useEffect(() => {
  36. setRows(recordList);
  37. // console.log(disableDelete);
  38. }, [recordList]);
  39. useEffect(() => {
  40. setShowPage(showPageColumn);
  41. // console.log(disableDelete);
  42. }, [showPageColumn]);
  43. function NoRowsOverlay() {
  44. return (
  45. <Stack height="100%" alignItems="center" justifyContent="center">
  46. No File Record
  47. {/* <pre>(rows=&#123;[]&#125;)</pre> */}
  48. </Stack>
  49. );
  50. }
  51. const handleCancelClick = (id) => () => {
  52. setRowModesModel({
  53. ...rowModesModel,
  54. [id]: { mode: GridRowModes.View, ignoreModifications: true },
  55. });
  56. // console.log("Starting Delete")
  57. // const editedRow = rows.find((row) => row.id === id);
  58. // console.log(editedRow)
  59. // console.log(editedRow.isNew)
  60. setRecordList(rows.filter((row) => row.id !== id));
  61. setRows(rows.filter((row) => row.id !== id));
  62. }
  63. const renderDeleteAction = (id) => (
  64. <GridActionsCellItem
  65. key="delete"
  66. icon={<RemoveCircleOutlineIcon />}
  67. label={deleteFileLabel}
  68. title={deleteFileLabel}
  69. className="textPrimary"
  70. onClick={handleCancelClick(id)}
  71. onKeyDown={(event) => {
  72. if (event.key === 'Enter' || event.key === ' ') {
  73. event.preventDefault();
  74. event.stopPropagation();
  75. handleCancelClick(id)(event);
  76. }
  77. }}
  78. color="error"
  79. />
  80. );
  81. const handlePreviewClick = (param) => () => {
  82. var reader = new FileReader();
  83. reader.onload = function () {
  84. let path = reader.result;
  85. var pdf_newTab = window.open("");
  86. pdf_newTab.document.write(
  87. "<html>"
  88. + "<head><title>" + param.row.name + "</title></head>"
  89. + "<body>"
  90. + "<iframe title='" + param.row.name + "' width='100%' height='100%' src='" + path + "" + "'></iframe>"
  91. + "</body>"
  92. + "</html>"
  93. );
  94. };
  95. reader.readAsDataURL(param.row);
  96. }
  97. const columns = showPage?[
  98. {
  99. field: 'actions',
  100. type: 'actions',
  101. headerName: '',
  102. width: 30,
  103. cellClassName: 'actions',
  104. // hide:true,
  105. getActions: ({ id }) => [renderDeleteAction(id)],
  106. },
  107. {
  108. field: 'name',
  109. headerName: 'File Name',
  110. flex: 1,
  111. renderCell: (params) => {
  112. return <Button onClick={handlePreviewClick(params)}><u>{params.row.name}</u></Button>;
  113. },
  114. },
  115. {
  116. id: 'size',
  117. field: 'size',
  118. headerName: 'File Size',
  119. valueGetter: (params) => {
  120. // console.log(params)
  121. return Math.ceil(params.value / 1024) + " KB";
  122. },
  123. flex: 1,
  124. },
  125. {
  126. id: 'no_of_page',
  127. field: 'no_of_page',
  128. headerName: 'Page',
  129. flex: 1,
  130. hide: true
  131. },
  132. ]:[
  133. {
  134. field: 'actions',
  135. type: 'actions',
  136. headerName: '',
  137. width: 30,
  138. cellClassName: 'actions',
  139. // hide:true,
  140. getActions: ({ id }) => [renderDeleteAction(id)],
  141. },
  142. {
  143. field: 'name',
  144. headerName: 'File Name',
  145. flex: 1,
  146. renderCell: (params) => {
  147. return <Button onClick={handlePreviewClick(params)}><u>{params.row.name}</u></Button>;
  148. },
  149. },
  150. {
  151. id: 'check_code',
  152. field: 'check_code',
  153. headerName: 'File Code',
  154. flex: 1,
  155. hide: true,
  156. renderCell: () => {
  157. return (expectedCode == checkCode)?checkCode:<div style={{ margin: 4, color:"red" }}>Warning, File Code not match.<br/>File Code: {checkCode}<br/>Expected Code: {expectedCode}</div>;
  158. },
  159. },
  160. {
  161. id: 'size',
  162. field: 'size',
  163. headerName: 'File Size',
  164. valueGetter: (params) => {
  165. // console.log(params)
  166. return Math.ceil(params.value / 1024) + " KB";
  167. },
  168. flex: 1,
  169. },
  170. ];
  171. return (
  172. <Box style={{ height: '200px', width: '100%' }}>
  173. <DataGrid
  174. rows={rows}
  175. columns={columns}
  176. editMode="row"
  177. sx={{ border: 1 }}
  178. rowModesModel={rowModesModel}
  179. disablePagination
  180. components={{ NoRowsOverlay, }}
  181. // hideFooterPagination={true}
  182. disableSelectionOnClick
  183. disableColumnMenu
  184. disableColumnSelector
  185. hideFooter
  186. getRowHeight={() => 'auto'}
  187. />
  188. </Box>
  189. );
  190. }