@xyo-network/react-payload-table 2.31.3 → 2.31.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/cjs/components/DynamicTable/DynamicTableRow.d.ts.map +1 -1
  2. package/dist/cjs/components/DynamicTable/DynamicTableRow.js +4 -2
  3. package/dist/cjs/components/DynamicTable/DynamicTableRow.js.map +1 -1
  4. package/dist/cjs/components/DynamicTable/Table.d.ts.map +1 -1
  5. package/dist/cjs/components/DynamicTable/Table.js +42 -3
  6. package/dist/cjs/components/DynamicTable/Table.js.map +1 -1
  7. package/dist/cjs/components/Table/Table.d.ts +1 -1
  8. package/dist/cjs/components/Table/Table.d.ts.map +1 -1
  9. package/dist/cjs/components/Table/Table.js +46 -3
  10. package/dist/cjs/components/Table/Table.js.map +1 -1
  11. package/dist/cjs/components/Table/TableRow.d.ts.map +1 -1
  12. package/dist/cjs/components/Table/TableRow.js +6 -2
  13. package/dist/cjs/components/Table/TableRow.js.map +1 -1
  14. package/dist/cjs/components/index.d.ts +1 -0
  15. package/dist/cjs/components/index.d.ts.map +1 -1
  16. package/dist/cjs/components/index.js +1 -0
  17. package/dist/cjs/components/index.js.map +1 -1
  18. package/dist/docs.json +1033 -110
  19. package/dist/esm/components/DynamicTable/DynamicTableRow.d.ts.map +1 -1
  20. package/dist/esm/components/DynamicTable/DynamicTableRow.js +4 -2
  21. package/dist/esm/components/DynamicTable/DynamicTableRow.js.map +1 -1
  22. package/dist/esm/components/DynamicTable/Table.d.ts.map +1 -1
  23. package/dist/esm/components/DynamicTable/Table.js +43 -4
  24. package/dist/esm/components/DynamicTable/Table.js.map +1 -1
  25. package/dist/esm/components/Table/Table.d.ts +1 -1
  26. package/dist/esm/components/Table/Table.d.ts.map +1 -1
  27. package/dist/esm/components/Table/Table.js +47 -4
  28. package/dist/esm/components/Table/Table.js.map +1 -1
  29. package/dist/esm/components/Table/TableRow.d.ts.map +1 -1
  30. package/dist/esm/components/Table/TableRow.js +7 -3
  31. package/dist/esm/components/Table/TableRow.js.map +1 -1
  32. package/dist/esm/components/index.d.ts +1 -0
  33. package/dist/esm/components/index.d.ts.map +1 -1
  34. package/dist/esm/components/index.js +1 -0
  35. package/dist/esm/components/index.js.map +1 -1
  36. package/package.json +12 -12
  37. package/src/components/DynamicTable/DynamicTable.stories.tsx +21 -1
  38. package/src/components/DynamicTable/DynamicTableRow.tsx +7 -4
  39. package/src/components/DynamicTable/Table.tsx +104 -4
  40. package/src/components/Table/Table.stories.tsx +35 -1
  41. package/src/components/Table/Table.tsx +95 -4
  42. package/src/components/Table/TableRow.tsx +14 -11
  43. package/src/components/index.ts +1 -0
@@ -1,7 +1,16 @@
1
- import { Alert, Table, TableBody, TableCell, TableHead, TableProps, TableRow, Typography } from '@mui/material'
1
+ import FirstPageIcon from '@mui/icons-material/FirstPage'
2
+ import KeyboardArrowLeft from '@mui/icons-material/KeyboardArrowLeft'
3
+ import KeyboardArrowRight from '@mui/icons-material/KeyboardArrowRight'
4
+ import LastPageIcon from '@mui/icons-material/LastPage'
5
+ import { Alert, Table, TableBody, TableCell, TableFooter, TableHead, TablePagination, TableProps, TableRow, Typography } from '@mui/material'
6
+ import Box from '@mui/material/Box'
7
+ import IconButton from '@mui/material/IconButton'
8
+ import { useTheme } from '@mui/material/styles'
2
9
  import { useBreakpoint } from '@xylabs/react-shared'
3
10
  import { XyoPayload, XyoPayloadWrapper } from '@xyo-network/payload'
4
11
  import { XyoApiThrownErrorBoundary } from '@xyo-network/react-auth-service'
12
+ import * as React from 'react'
13
+ import { useState } from 'react'
5
14
 
6
15
  import { payloadColumnNames, PayloadTableColumnConfig, payloadTableColumnConfigDefaults } from './PayloadTableColumnConfig'
7
16
  import { PayloadTableRow } from './TableRow'
@@ -14,6 +23,51 @@ export interface PayloadTableProps extends TableProps {
14
23
  columns?: PayloadTableColumnConfig
15
24
  }
16
25
 
26
+ interface TablePaginationActionsProps {
27
+ count: number
28
+ page: number
29
+ rowsPerPage: number
30
+ onPageChange: (event: React.MouseEvent<HTMLButtonElement>, newPage: number) => void
31
+ }
32
+
33
+ function TablePaginationActions(props: TablePaginationActionsProps) {
34
+ const theme = useTheme()
35
+ const { count, page, rowsPerPage, onPageChange } = props
36
+
37
+ const handleFirstPageButtonClick = (event: React.MouseEvent<HTMLButtonElement>) => {
38
+ onPageChange(event, 0)
39
+ }
40
+
41
+ const handleBackButtonClick = (event: React.MouseEvent<HTMLButtonElement>) => {
42
+ onPageChange(event, page - 1)
43
+ }
44
+
45
+ const handleNextButtonClick = (event: React.MouseEvent<HTMLButtonElement>) => {
46
+ onPageChange(event, page + 1)
47
+ }
48
+
49
+ const handleLastPageButtonClick = (event: React.MouseEvent<HTMLButtonElement>) => {
50
+ onPageChange(event, Math.max(0, Math.ceil(count / rowsPerPage) - 1))
51
+ }
52
+
53
+ return (
54
+ <Box sx={{ flexShrink: 0, ml: 2.5 }}>
55
+ <IconButton onClick={handleFirstPageButtonClick} disabled={page === 0} aria-label="first page">
56
+ {theme.direction === 'rtl' ? <LastPageIcon /> : <FirstPageIcon />}
57
+ </IconButton>
58
+ <IconButton onClick={handleBackButtonClick} disabled={page === 0} aria-label="previous page">
59
+ {theme.direction === 'rtl' ? <KeyboardArrowRight /> : <KeyboardArrowLeft />}
60
+ </IconButton>
61
+ <IconButton onClick={handleNextButtonClick} disabled={page >= Math.ceil(count / rowsPerPage) - 1} aria-label="next page">
62
+ {theme.direction === 'rtl' ? <KeyboardArrowLeft /> : <KeyboardArrowRight />}
63
+ </IconButton>
64
+ <IconButton onClick={handleLastPageButtonClick} disabled={page >= Math.ceil(count / rowsPerPage) - 1} aria-label="last page">
65
+ {theme.direction === 'rtl' ? <FirstPageIcon /> : <LastPageIcon />}
66
+ </IconButton>
67
+ </Box>
68
+ )
69
+ }
70
+
17
71
  export const PayloadTable: React.FC<PayloadTableProps> = ({
18
72
  exploreDomain,
19
73
  archive,
@@ -24,8 +78,23 @@ export const PayloadTable: React.FC<PayloadTableProps> = ({
24
78
  ...props
25
79
  }) => {
26
80
  const breakPoint = useBreakpoint()
81
+ const [page, setPage] = useState(0)
82
+ const [rowsPerPage, setRowsPerPage] = useState(5)
83
+ const payloadCount = payloads ? payloads.length : 0
84
+ // Avoid a layout jump when reaching the last page with empty rows.
85
+ const emptyRows = page > 0 ? Math.max(0, (1 + page) * rowsPerPage - payloadCount) : 0
86
+
87
+ const handleChangePage = (event: React.MouseEvent<HTMLButtonElement> | null, newPage: number) => {
88
+ setPage(newPage)
89
+ }
90
+
91
+ const handleChangeRowsPerPage = (event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {
92
+ setRowsPerPage(parseInt(event.target.value, 10))
93
+ setPage(0)
94
+ }
95
+
27
96
  return breakPoint ? (
28
- <Table {...props}>
97
+ <Table stickyHeader {...props}>
29
98
  <TableHead>
30
99
  <TableRow>
31
100
  {columns[breakPoint]?.map((column, index) => {
@@ -39,8 +108,9 @@ export const PayloadTable: React.FC<PayloadTableProps> = ({
39
108
  })}
40
109
  </TableRow>
41
110
  </TableHead>
42
- <TableBody>
43
- {payloads?.map((payload, index) => {
111
+ <TableBody sx={{ overflowY: 'scroll ' }}>
112
+ {payloads?.slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage).map((payload, index) => {
113
+ // {payloads?.map((payload, index) => {
44
114
  const wrapper = new XyoPayloadWrapper(payload)
45
115
  return (
46
116
  <XyoApiThrownErrorBoundary
@@ -67,7 +137,28 @@ export const PayloadTable: React.FC<PayloadTableProps> = ({
67
137
  )
68
138
  })}
69
139
  {children}
140
+ {emptyRows > 0 && Array(emptyRows).fill(<PayloadTableRow />)}
70
141
  </TableBody>
142
+ <TableFooter>
143
+ <TableRow>
144
+ <TablePagination
145
+ rowsPerPageOptions={[5, 10, 25, { label: 'All', value: -1 }]}
146
+ colSpan={3}
147
+ count={payloadCount}
148
+ rowsPerPage={rowsPerPage}
149
+ page={page}
150
+ SelectProps={{
151
+ inputProps: {
152
+ 'aria-label': 'rows per page',
153
+ },
154
+ native: true,
155
+ }}
156
+ onPageChange={handleChangePage}
157
+ onRowsPerPageChange={handleChangeRowsPerPage}
158
+ ActionsComponent={TablePaginationActions}
159
+ />
160
+ </TableRow>
161
+ </TableFooter>
71
162
  </Table>
72
163
  ) : null
73
164
  }
@@ -1,9 +1,11 @@
1
- import { TableCell, TableCellProps, TableRow, TableRowProps, Typography } from '@mui/material'
1
+ import CheckCircleOutlineRoundedIcon from '@mui/icons-material/CheckCircleOutlineRounded'
2
+ import ErrorOutlineRoundedIcon from '@mui/icons-material/ErrorOutlineRounded'
3
+ import WarningAmberRoundedIcon from '@mui/icons-material/WarningAmberRounded'
4
+ import { alpha, TableCell, TableCellProps, TableRow, TableRowProps, Typography } from '@mui/material'
2
5
  import { useBreakpoint } from '@xylabs/react-shared'
3
6
  import { XyoPayload, XyoPayloadValidator, XyoPayloadWrapper } from '@xyo-network/payload'
4
7
  import { useNetwork } from '@xyo-network/react-network'
5
8
  import { HashTableCell } from '@xyo-network/react-shared'
6
- import { MdClear, MdDone } from 'react-icons/md'
7
9
 
8
10
  import { PayloadTableColumnConfig, payloadTableColumnConfigDefaults, PayloadTableColumnSlug } from './PayloadTableColumnConfig'
9
11
 
@@ -52,15 +54,16 @@ export const PayloadTableRow: React.FC<PayloadTableRowProps> = ({
52
54
 
53
55
  const valid: React.FC<TableCellProps> = (props) => (
54
56
  <TableCell key="valid" align="center" {...props}>
55
- <Typography fontFamily="monospace" variant="body2" noWrap>
56
- {isValid === undefined ? (
57
- <MdDone fontSize={18} color="yellow" />
58
- ) : isValid ? (
59
- <MdDone fontSize={18} color="green" />
60
- ) : (
61
- <MdClear color="red" fontSize={18} />
62
- )}
63
- </Typography>
57
+ {isValid === undefined && payload != undefined ? (
58
+ <WarningAmberRoundedIcon fontSize="small" color="warning" />
59
+ ) : isValid === true ? (
60
+ <CheckCircleOutlineRoundedIcon fontSize="small" color="success" />
61
+ ) : isValid === false ? (
62
+ <ErrorOutlineRoundedIcon color="error" fontSize="small" />
63
+ ) : (
64
+ //to keep row height consistent when no data provided, may need fix later
65
+ <ErrorOutlineRoundedIcon sx={{ color: alpha('#fff', 0) }} fontSize="small" />
66
+ )}
64
67
  </TableCell>
65
68
  )
66
69
 
@@ -1 +1,2 @@
1
+ export * from './DynamicTable'
1
2
  export * from './Table'