@xyo-network/react-payload-table 2.64.0 → 2.64.1

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 (34) hide show
  1. package/dist/browser/components/DynamicTable/DynamicTableRow.js +41 -5
  2. package/dist/browser/components/DynamicTable/DynamicTableRow.js.map +1 -1
  3. package/dist/browser/components/DynamicTable/PayloadDynamicTableColumnConfig.js +2 -1
  4. package/dist/browser/components/DynamicTable/PayloadDynamicTableColumnConfig.js.map +1 -1
  5. package/dist/browser/components/DynamicTable/Table.js +129 -20
  6. package/dist/browser/components/DynamicTable/Table.js.map +1 -1
  7. package/dist/browser/components/DynamicTable/index.js +236 -3
  8. package/dist/browser/components/DynamicTable/index.js.map +1 -1
  9. package/dist/browser/components/Table/PayloadTableColumnConfig.js +3 -2
  10. package/dist/browser/components/Table/PayloadTableColumnConfig.js.map +1 -1
  11. package/dist/browser/components/Table/Table.js +259 -11
  12. package/dist/browser/components/Table/Table.js.map +1 -1
  13. package/dist/browser/components/Table/TableBody.js +93 -11
  14. package/dist/browser/components/Table/TableBody.js.map +1 -1
  15. package/dist/browser/components/Table/TableFooter.js +52 -6
  16. package/dist/browser/components/Table/TableFooter.js.map +1 -1
  17. package/dist/browser/components/Table/TableHead.js +20 -3
  18. package/dist/browser/components/Table/TableHead.js.map +1 -1
  19. package/dist/browser/components/Table/TablePagination.js +2 -1
  20. package/dist/browser/components/Table/TablePagination.js.map +1 -1
  21. package/dist/browser/components/Table/TableRow.js +15 -3
  22. package/dist/browser/components/Table/TableRow.js.map +1 -1
  23. package/dist/browser/components/Table/TableRowNoData.js +4 -3
  24. package/dist/browser/components/Table/TableRowNoData.js.map +1 -1
  25. package/dist/browser/components/Table/index.js +351 -6
  26. package/dist/browser/components/Table/index.js.map +1 -1
  27. package/dist/browser/components/Table/types/index.js +0 -4
  28. package/dist/browser/components/Table/types/index.js.map +1 -1
  29. package/dist/browser/components/index.js +586 -2
  30. package/dist/browser/components/index.js.map +1 -1
  31. package/dist/browser/index.js +586 -1
  32. package/dist/browser/index.js.map +1 -1
  33. package/dist/docs.json +116 -116
  34. package/package.json +18 -18
@@ -1,4 +1,237 @@
1
- export * from "./DynamicTableRow";
2
- export * from "./PayloadDynamicTableColumnConfig";
3
- export * from "./Table";
1
+ // src/components/DynamicTable/DynamicTableRow.tsx
2
+ import {
3
+ CheckCircleOutlineRounded as CheckCircleOutlineRoundedIcon,
4
+ ErrorOutlineRounded as ErrorOutlineRoundedIcon,
5
+ WarningAmberRounded as WarningAmberRoundedIcon
6
+ } from "@mui/icons-material";
7
+ import { TableCell, TableRow, Typography } from "@mui/material";
8
+ import { usePromise } from "@xylabs/react-promise";
9
+ import { useBreakpoint } from "@xylabs/react-shared";
10
+ import { PayloadHasher } from "@xyo-network/hash";
11
+ import { PayloadValidator } from "@xyo-network/payload-validator";
12
+ import { useNetwork } from "@xyo-network/react-network";
13
+ import { usePayloadRenderPluginResolver } from "@xyo-network/react-payload-plugin-resolver";
14
+ import { HashTableCell, usePayloadHash } from "@xyo-network/react-shared";
15
+
16
+ // src/components/DynamicTable/PayloadDynamicTableColumnConfig.ts
17
+ var payloadDynamicTableColumnConfigDefaults = () => {
18
+ const xs = [
19
+ { alignment: "left", name: "Hash", slug: "hash", width: "100%" },
20
+ { alignment: "left", name: "Schema", slug: "schema", width: "50px" },
21
+ { alignment: "left", name: "Valid", slug: "valid", width: "50px" }
22
+ ];
23
+ const sm = [
24
+ { alignment: "left", name: "Icon", slug: "icon", width: "50px" },
25
+ { alignment: "left", name: "Hash", slug: "hash", width: "100%" },
26
+ { alignment: "left", name: "Schema", slug: "schema", width: "50px" },
27
+ { alignment: "left", name: "Valid", slug: "valid", width: "50px" }
28
+ ];
29
+ const md = [
30
+ { alignment: "left", name: "Icon", slug: "icon", width: "50px" },
31
+ { alignment: "left", name: "Hash", slug: "hash", width: "100%" },
32
+ { alignment: "left", name: "Schema", slug: "schema", width: "50px" },
33
+ { alignment: "left", name: "Valid", slug: "valid", width: "50px" }
34
+ ];
35
+ const lg = [
36
+ { alignment: "left", name: "Icon", slug: "icon", width: "50px" },
37
+ { alignment: "left", name: "Hash", slug: "hash", width: "100%" },
38
+ { alignment: "left", name: "Schema", slug: "schema", width: "50px" },
39
+ { alignment: "left", name: "Render", slug: "render", width: "50px" },
40
+ { alignment: "left", name: "Valid", slug: "valid", width: "50px" }
41
+ ];
42
+ const xl = [
43
+ { alignment: "left", name: "Icon", slug: "icon", width: "50px" },
44
+ { alignment: "left", name: "Hash", slug: "hash", width: "100%" },
45
+ { alignment: "left", name: "Schema", slug: "schema", width: "50px" },
46
+ { alignment: "left", name: "Render", slug: "render", width: "50px" },
47
+ { alignment: "left", name: "Valid", slug: "valid", width: "50px" }
48
+ ];
49
+ return { lg, md, sm, xl, xs };
50
+ };
51
+
52
+ // src/components/DynamicTable/DynamicTableRow.tsx
53
+ import { jsx } from "react/jsx-runtime";
54
+ var PayloadDynamicTableRow = ({
55
+ archive,
56
+ columns = payloadDynamicTableColumnConfigDefaults(),
57
+ exploreDomain,
58
+ network: networkProp,
59
+ payload,
60
+ ...props
61
+ }) => {
62
+ const breakPoint = useBreakpoint();
63
+ const payloadHash = usePayloadHash(payload);
64
+ const { network } = useNetwork();
65
+ const { resolver } = usePayloadRenderPluginResolver();
66
+ const [validationErrors = []] = usePromise(async () => payload ? await new PayloadValidator(payload).validate() : void 0, [payload]);
67
+ const isValid = validationErrors.length === 0;
68
+ const payloadFieldCount = payload ? Object.keys(PayloadHasher.hashFields(payload)).length : 0;
69
+ const hash = (props2) => /* @__PURE__ */ jsx(
70
+ HashTableCell,
71
+ {
72
+ align: "left",
73
+ archive,
74
+ value: payloadHash,
75
+ dataType: "payload",
76
+ exploreDomain,
77
+ network: networkProp ?? network?.slug,
78
+ ...props2
79
+ },
80
+ "hash"
81
+ );
82
+ const schema = (props2) => /* @__PURE__ */ jsx(TableCell, { align: "left", ...props2, children: /* @__PURE__ */ jsx(Typography, { fontFamily: "monospace", variant: "body2", noWrap: true, children: payload?.schema }) }, "payloads");
83
+ const details = (props2) => /* @__PURE__ */ jsx(TableCell, { align: "left", ...props2, children: /* @__PURE__ */ jsx(Typography, { fontFamily: "monospace", variant: "body2", noWrap: true, children: payloadFieldCount }) }, "payloads");
84
+ const render = (props2) => {
85
+ const Render = payload ? resolver?.resolve(payload)?.components.table.cell : void 0;
86
+ return Render ? /* @__PURE__ */ jsx(Render, { payload, ...props2 }) : /* @__PURE__ */ jsx(TableCell, { align: "left", ...props2 }, "payloads");
87
+ };
88
+ const icon = (props2) => {
89
+ const Avatar = payload ? resolver?.resolve(payload)?.components.avatar.image : void 0;
90
+ return /* @__PURE__ */ jsx(TableCell, { align: "left", ...props2, children: Avatar ? /* @__PURE__ */ jsx(Avatar, { payload }) : null }, "payloads");
91
+ };
92
+ const valid = (props2) => /* @__PURE__ */ jsx(TableCell, { align: "center", ...props2, children: isValid === void 0 && payload != void 0 ? /* @__PURE__ */ jsx(WarningAmberRoundedIcon, { fontSize: "small", color: "warning" }) : isValid === true ? /* @__PURE__ */ jsx(CheckCircleOutlineRoundedIcon, { fontSize: "small", color: "success" }) : isValid === false ? /* @__PURE__ */ jsx(ErrorOutlineRoundedIcon, { color: "error", fontSize: "small" }) : (
93
+ //nbsp to keep row height consistent even when no data is provided for the row
94
+ /* @__PURE__ */ jsx(Typography, { children: " \xA0" })
95
+ ) }, "valid");
96
+ const tableCells = {
97
+ details,
98
+ hash,
99
+ icon,
100
+ render,
101
+ schema,
102
+ valid
103
+ };
104
+ return breakPoint ? /* @__PURE__ */ jsx(TableRow, { style: { maxWidth: "100vw" }, ...props, children: columns[breakPoint]?.map((column) => {
105
+ return column.slug ? tableCells[column.slug]({}) : null;
106
+ }) }) : null;
107
+ };
108
+
109
+ // src/components/DynamicTable/Table.tsx
110
+ import { FirstPage as FirstPageIcon, KeyboardArrowLeft, KeyboardArrowRight, LastPage as LastPageIcon } from "@mui/icons-material";
111
+ import {
112
+ Alert,
113
+ Box,
114
+ IconButton,
115
+ Table,
116
+ TableBody,
117
+ TableCell as TableCell2,
118
+ TableFooter,
119
+ TableHead,
120
+ TablePagination,
121
+ TableRow as TableRow2,
122
+ Typography as Typography2,
123
+ useTheme
124
+ } from "@mui/material";
125
+ import { useBreakpoint as useBreakpoint2 } from "@xylabs/react-shared";
126
+ import { ThrownErrorBoundary } from "@xyo-network/react-error";
127
+ import { usePayloadHashes } from "@xyo-network/react-shared";
128
+ import { useEffect, useMemo, useState } from "react";
129
+ import { jsx as jsx2, jsxs } from "react/jsx-runtime";
130
+ function TablePaginationActions(props) {
131
+ const theme = useTheme();
132
+ const { count, page, rowsPerPage, onPageChange } = props;
133
+ const handleFirstPageButtonClick = (event) => {
134
+ onPageChange(event, 0);
135
+ };
136
+ const handleBackButtonClick = (event) => {
137
+ onPageChange(event, page - 1);
138
+ };
139
+ const handleNextButtonClick = (event) => {
140
+ onPageChange(event, page + 1);
141
+ };
142
+ const handleLastPageButtonClick = (event) => {
143
+ onPageChange(event, Math.max(0, Math.ceil(count / rowsPerPage) - 1));
144
+ };
145
+ return /* @__PURE__ */ jsxs(Box, { sx: { flexShrink: 0, ml: 2.5 }, children: [
146
+ /* @__PURE__ */ jsx2(IconButton, { onClick: handleFirstPageButtonClick, disabled: page === 0, "aria-label": "first page", children: theme.direction === "rtl" ? /* @__PURE__ */ jsx2(LastPageIcon, {}) : /* @__PURE__ */ jsx2(FirstPageIcon, {}) }),
147
+ /* @__PURE__ */ jsx2(IconButton, { onClick: handleBackButtonClick, disabled: page === 0, "aria-label": "previous page", children: theme.direction === "rtl" ? /* @__PURE__ */ jsx2(KeyboardArrowRight, {}) : /* @__PURE__ */ jsx2(KeyboardArrowLeft, {}) }),
148
+ /* @__PURE__ */ jsx2(IconButton, { onClick: handleNextButtonClick, disabled: page >= Math.ceil(count / rowsPerPage) - 1, "aria-label": "next page", children: theme.direction === "rtl" ? /* @__PURE__ */ jsx2(KeyboardArrowLeft, {}) : /* @__PURE__ */ jsx2(KeyboardArrowRight, {}) }),
149
+ /* @__PURE__ */ jsx2(IconButton, { onClick: handleLastPageButtonClick, disabled: page >= Math.ceil(count / rowsPerPage) - 1, "aria-label": "last page", children: theme.direction === "rtl" ? /* @__PURE__ */ jsx2(FirstPageIcon, {}) : /* @__PURE__ */ jsx2(LastPageIcon, {}) })
150
+ ] });
151
+ }
152
+ var PayloadDynamicTable = ({
153
+ archive,
154
+ children,
155
+ columns = payloadDynamicTableColumnConfigDefaults(),
156
+ exploreDomain,
157
+ onRowClick,
158
+ rowsPerPage: rowsPerPageProp = 10,
159
+ payloads,
160
+ ...props
161
+ }) => {
162
+ const breakPoint = useBreakpoint2();
163
+ const [page, setPage] = useState(0);
164
+ const [rowsPerPage, setRowsPerPage] = useState(rowsPerPageProp);
165
+ const payloadCount = payloads ? payloads.length : 0;
166
+ const emptyRows = page > 0 ? Math.max(0, (1 + page) * rowsPerPage - payloadCount) : 0;
167
+ const pagedPayloads = useMemo(() => payloads?.slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage), [payloads, page, rowsPerPage]);
168
+ const payloadPairs = usePayloadHashes(pagedPayloads);
169
+ useEffect(() => {
170
+ setRowsPerPage(rowsPerPageProp);
171
+ }, [rowsPerPageProp]);
172
+ const handleChangePage = (event, newPage) => {
173
+ setPage(newPage);
174
+ };
175
+ const handleChangeRowsPerPage = (event) => {
176
+ setRowsPerPage(parseInt(event.target.value, 10));
177
+ setPage(0);
178
+ };
179
+ return breakPoint ? /* @__PURE__ */ jsxs(Table, { stickyHeader: true, ...props, children: [
180
+ /* @__PURE__ */ jsx2(TableHead, { children: /* @__PURE__ */ jsx2(TableRow2, { children: columns[breakPoint]?.map((column, index) => {
181
+ return /* @__PURE__ */ jsx2(TableCell2, { align: column.alignment ?? "left", width: column.width, children: /* @__PURE__ */ jsx2(Typography2, { variant: "body2", noWrap: true, children: column.name }) }, index);
182
+ }) }) }),
183
+ /* @__PURE__ */ jsxs(TableBody, { sx: { overflowY: "scroll " }, children: [
184
+ payloadPairs?.map(([payload, hash], index) => {
185
+ return /* @__PURE__ */ jsx2(
186
+ ThrownErrorBoundary,
187
+ {
188
+ boundaryName: "PayloadTableBody",
189
+ errorComponent: (e) => /* @__PURE__ */ jsxs(Alert, { severity: "error", children: [
190
+ "Error Loading Payload: ",
191
+ /* @__PURE__ */ jsx2(Typography2, { fontWeight: "bold", children: e.message })
192
+ ] }),
193
+ children: /* @__PURE__ */ jsx2(
194
+ PayloadDynamicTableRow,
195
+ {
196
+ archive,
197
+ onClick: onRowClick ? () => {
198
+ onRowClick(payload);
199
+ } : void 0,
200
+ exploreDomain,
201
+ payload
202
+ }
203
+ )
204
+ },
205
+ `${hash}-${index}`
206
+ );
207
+ }),
208
+ children,
209
+ emptyRows > 0 && Array(emptyRows).fill(/* @__PURE__ */ jsx2(PayloadDynamicTableRow, {}))
210
+ ] }),
211
+ /* @__PURE__ */ jsx2(TableFooter, { children: /* @__PURE__ */ jsx2(TableRow2, { children: /* @__PURE__ */ jsx2(
212
+ TablePagination,
213
+ {
214
+ rowsPerPageOptions: [5, 10, 25, { label: "All", value: -1 }],
215
+ colSpan: 5,
216
+ count: payloadCount,
217
+ rowsPerPage,
218
+ page,
219
+ SelectProps: {
220
+ inputProps: {
221
+ "aria-label": "rows per page"
222
+ },
223
+ native: true
224
+ },
225
+ onPageChange: handleChangePage,
226
+ onRowsPerPageChange: handleChangeRowsPerPage,
227
+ ActionsComponent: TablePaginationActions
228
+ }
229
+ ) }) })
230
+ ] }) : null;
231
+ };
232
+ export {
233
+ PayloadDynamicTable,
234
+ PayloadDynamicTableRow,
235
+ payloadDynamicTableColumnConfigDefaults
236
+ };
4
237
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/DynamicTable/index.ts"],"sourcesContent":["export * from './DynamicTableRow'\nexport * from './PayloadDynamicTableColumnConfig'\nexport * from './Table'\n"],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
1
+ {"version":3,"sources":["../../../../src/components/DynamicTable/DynamicTableRow.tsx","../../../../src/components/DynamicTable/PayloadDynamicTableColumnConfig.ts","../../../../src/components/DynamicTable/Table.tsx"],"sourcesContent":["import {\n CheckCircleOutlineRounded as CheckCircleOutlineRoundedIcon,\n ErrorOutlineRounded as ErrorOutlineRoundedIcon,\n WarningAmberRounded as WarningAmberRoundedIcon,\n} from '@mui/icons-material'\nimport { AvatarProps, TableCell, TableCellProps, TableRow, TableRowProps, Typography } from '@mui/material'\nimport { usePromise } from '@xylabs/react-promise'\nimport { useBreakpoint } from '@xylabs/react-shared'\nimport { PayloadHasher } from '@xyo-network/hash'\nimport { Payload } from '@xyo-network/payload-model'\nimport { PayloadValidator } from '@xyo-network/payload-validator'\nimport { useNetwork } from '@xyo-network/react-network'\nimport { PayloadRenderProps } from '@xyo-network/react-payload-plugin'\nimport { usePayloadRenderPluginResolver } from '@xyo-network/react-payload-plugin-resolver'\nimport { HashTableCell, HashTableCellProps, usePayloadHash } from '@xyo-network/react-shared'\nimport { ComponentType } from 'react'\n\nimport {\n PayloadDynamicTableColumnConfig,\n payloadDynamicTableColumnConfigDefaults,\n PayloadDynamicTableColumnSlug,\n} from './PayloadDynamicTableColumnConfig'\n\nexport interface PayloadDynamicTableRowProps extends TableRowProps {\n archive?: string\n columns?: PayloadDynamicTableColumnConfig\n exploreDomain?: string\n network?: string\n payload?: Payload & { sources?: string[] }\n}\n\nexport const PayloadDynamicTableRow: React.FC<PayloadDynamicTableRowProps> = ({\n archive,\n columns = payloadDynamicTableColumnConfigDefaults(),\n exploreDomain,\n network: networkProp,\n payload,\n ...props\n}) => {\n const breakPoint = useBreakpoint()\n const payloadHash = usePayloadHash(payload)\n const { network } = useNetwork()\n const { resolver } = usePayloadRenderPluginResolver()\n const [validationErrors = []] = usePromise(async () => (payload ? await new PayloadValidator(payload).validate() : undefined), [payload])\n const isValid = validationErrors.length === 0\n const payloadFieldCount = payload ? Object.keys(PayloadHasher.hashFields(payload)).length : 0\n const hash: React.FC<HashTableCellProps> = (props) => (\n <HashTableCell\n key=\"hash\"\n align=\"left\"\n archive={archive}\n value={payloadHash}\n dataType=\"payload\"\n exploreDomain={exploreDomain}\n network={networkProp ?? network?.slug}\n {...props}\n />\n )\n\n const schema: React.FC<TableCellProps> = (props) => (\n <TableCell key=\"payloads\" align=\"left\" {...props}>\n <Typography fontFamily=\"monospace\" variant=\"body2\" noWrap>\n {payload?.schema}\n </Typography>\n </TableCell>\n )\n\n const details: React.FC<TableCellProps> = (props) => (\n <TableCell key=\"payloads\" align=\"left\" {...props}>\n <Typography fontFamily=\"monospace\" variant=\"body2\" noWrap>\n {payloadFieldCount}\n </Typography>\n </TableCell>\n )\n\n const render: React.FC<TableCellProps> = (props) => {\n const Render: ComponentType<PayloadRenderProps & TableCellProps> | undefined = payload\n ? resolver?.resolve(payload)?.components.table.cell\n : undefined\n return Render ? <Render payload={payload} {...props} /> : <TableCell key=\"payloads\" align=\"left\" {...props}></TableCell>\n }\n\n const icon: React.FC<TableCellProps> = (props) => {\n const Avatar: ComponentType<PayloadRenderProps & AvatarProps> | undefined = payload\n ? resolver?.resolve(payload)?.components.avatar.image\n : undefined\n\n return (\n <TableCell key=\"payloads\" align=\"left\" {...props}>\n {Avatar ? <Avatar payload={payload} /> : null}\n </TableCell>\n )\n }\n\n const valid: React.FC<TableCellProps> = (props) => (\n <TableCell key=\"valid\" align=\"center\" {...props}>\n {isValid === undefined && payload != undefined ? (\n <WarningAmberRoundedIcon fontSize=\"small\" color=\"warning\" />\n ) : isValid === true ? (\n <CheckCircleOutlineRoundedIcon fontSize=\"small\" color=\"success\" />\n ) : isValid === false ? (\n <ErrorOutlineRoundedIcon color=\"error\" fontSize=\"small\" />\n ) : (\n //nbsp to keep row height consistent even when no data is provided for the row\n <Typography> &nbsp;</Typography>\n )}\n </TableCell>\n )\n\n const tableCells: Record<PayloadDynamicTableColumnSlug, React.FC<TableCellProps>> = {\n details,\n hash,\n icon,\n render,\n schema,\n valid,\n }\n\n return breakPoint ? (\n <TableRow style={{ maxWidth: '100vw' }} {...props}>\n {columns[breakPoint]?.map((column) => {\n return column.slug ? tableCells[column.slug]({}) : null\n })}\n </TableRow>\n ) : null\n}\n","export type PayloadDynamicTableColumnSlug = 'hash' | 'schema' | 'valid' | 'details' | 'render' | 'icon'\n\nexport interface PayloadDynamicTableColumnHeadData {\n alignment?: 'left' | 'center' | 'right'\n name?: string\n slug?: 'hash' | 'schema' | 'valid' | 'details' | 'render' | 'icon'\n width?: string | number\n}\n\nexport interface PayloadDynamicTableColumnConfig {\n xs?: PayloadDynamicTableColumnHeadData[]\n // eslint-disable-next-line @typescript-eslint/member-ordering\n sm?: PayloadDynamicTableColumnHeadData[]\n // eslint-disable-next-line @typescript-eslint/member-ordering\n md?: PayloadDynamicTableColumnHeadData[]\n // eslint-disable-next-line @typescript-eslint/member-ordering\n lg?: PayloadDynamicTableColumnHeadData[]\n xl?: PayloadDynamicTableColumnHeadData[]\n}\n\nexport const payloadDynamicTableColumnConfigDefaults = (): PayloadDynamicTableColumnConfig => {\n const xs: PayloadDynamicTableColumnHeadData[] = [\n { alignment: 'left', name: 'Hash', slug: 'hash', width: '100%' },\n { alignment: 'left', name: 'Schema', slug: 'schema', width: '50px' },\n { alignment: 'left', name: 'Valid', slug: 'valid', width: '50px' },\n ]\n const sm: PayloadDynamicTableColumnHeadData[] = [\n { alignment: 'left', name: 'Icon', slug: 'icon', width: '50px' },\n { alignment: 'left', name: 'Hash', slug: 'hash', width: '100%' },\n { alignment: 'left', name: 'Schema', slug: 'schema', width: '50px' },\n { alignment: 'left', name: 'Valid', slug: 'valid', width: '50px' },\n ]\n const md: PayloadDynamicTableColumnHeadData[] = [\n { alignment: 'left', name: 'Icon', slug: 'icon', width: '50px' },\n { alignment: 'left', name: 'Hash', slug: 'hash', width: '100%' },\n { alignment: 'left', name: 'Schema', slug: 'schema', width: '50px' },\n { alignment: 'left', name: 'Valid', slug: 'valid', width: '50px' },\n ]\n const lg: PayloadDynamicTableColumnHeadData[] = [\n { alignment: 'left', name: 'Icon', slug: 'icon', width: '50px' },\n { alignment: 'left', name: 'Hash', slug: 'hash', width: '100%' },\n { alignment: 'left', name: 'Schema', slug: 'schema', width: '50px' },\n { alignment: 'left', name: 'Render', slug: 'render', width: '50px' },\n { alignment: 'left', name: 'Valid', slug: 'valid', width: '50px' },\n ]\n const xl: PayloadDynamicTableColumnHeadData[] = [\n { alignment: 'left', name: 'Icon', slug: 'icon', width: '50px' },\n { alignment: 'left', name: 'Hash', slug: 'hash', width: '100%' },\n { alignment: 'left', name: 'Schema', slug: 'schema', width: '50px' },\n { alignment: 'left', name: 'Render', slug: 'render', width: '50px' },\n { alignment: 'left', name: 'Valid', slug: 'valid', width: '50px' },\n ]\n return { lg, md, sm, xl, xs }\n}\n","import { FirstPage as FirstPageIcon, KeyboardArrowLeft, KeyboardArrowRight, LastPage as LastPageIcon } from '@mui/icons-material'\nimport {\n Alert,\n Box,\n IconButton,\n Table,\n TableBody,\n TableCell,\n TableFooter,\n TableHead,\n TablePagination,\n TableProps,\n TableRow,\n Typography,\n useTheme,\n} from '@mui/material'\nimport { useBreakpoint } from '@xylabs/react-shared'\nimport { Payload } from '@xyo-network/payload-model'\nimport { ThrownErrorBoundary } from '@xyo-network/react-error'\nimport { usePayloadHashes } from '@xyo-network/react-shared'\nimport { useEffect, useMemo, useState } from 'react'\n\nimport { PayloadDynamicTableRow } from './DynamicTableRow'\nimport { PayloadDynamicTableColumnConfig, payloadDynamicTableColumnConfigDefaults } from './PayloadDynamicTableColumnConfig'\n\nexport interface PayloadDynamicTableProps extends TableProps {\n archive?: string\n columns?: PayloadDynamicTableColumnConfig\n exploreDomain?: string\n onRowClick?: (value: Payload) => void\n payloads?: Payload[] | null\n rowsPerPage?: number\n}\n\ninterface TablePaginationActionsProps {\n count: number\n onPageChange: (event: React.MouseEvent<HTMLButtonElement>, newPage: number) => void\n page: number\n rowsPerPage: number\n}\n\nfunction TablePaginationActions(props: TablePaginationActionsProps) {\n const theme = useTheme()\n const { count, page, rowsPerPage, onPageChange } = props\n\n const handleFirstPageButtonClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n onPageChange(event, 0)\n }\n\n const handleBackButtonClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n onPageChange(event, page - 1)\n }\n\n const handleNextButtonClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n onPageChange(event, page + 1)\n }\n\n const handleLastPageButtonClick = (event: React.MouseEvent<HTMLButtonElement>) => {\n onPageChange(event, Math.max(0, Math.ceil(count / rowsPerPage) - 1))\n }\n\n return (\n <Box sx={{ flexShrink: 0, ml: 2.5 }}>\n <IconButton onClick={handleFirstPageButtonClick} disabled={page === 0} aria-label=\"first page\">\n {theme.direction === 'rtl' ? <LastPageIcon /> : <FirstPageIcon />}\n </IconButton>\n <IconButton onClick={handleBackButtonClick} disabled={page === 0} aria-label=\"previous page\">\n {theme.direction === 'rtl' ? <KeyboardArrowRight /> : <KeyboardArrowLeft />}\n </IconButton>\n <IconButton onClick={handleNextButtonClick} disabled={page >= Math.ceil(count / rowsPerPage) - 1} aria-label=\"next page\">\n {theme.direction === 'rtl' ? <KeyboardArrowLeft /> : <KeyboardArrowRight />}\n </IconButton>\n <IconButton onClick={handleLastPageButtonClick} disabled={page >= Math.ceil(count / rowsPerPage) - 1} aria-label=\"last page\">\n {theme.direction === 'rtl' ? <FirstPageIcon /> : <LastPageIcon />}\n </IconButton>\n </Box>\n )\n}\n\nexport const PayloadDynamicTable: React.FC<PayloadDynamicTableProps> = ({\n archive,\n children,\n columns = payloadDynamicTableColumnConfigDefaults(),\n exploreDomain,\n onRowClick,\n rowsPerPage: rowsPerPageProp = 10,\n payloads,\n ...props\n}) => {\n const breakPoint = useBreakpoint()\n const [page, setPage] = useState(0)\n const [rowsPerPage, setRowsPerPage] = useState(rowsPerPageProp)\n const payloadCount = payloads ? payloads.length : 0\n // Avoid a layout jump when reaching the last page with empty rows.\n const emptyRows = page > 0 ? Math.max(0, (1 + page) * rowsPerPage - payloadCount) : 0\n\n const pagedPayloads = useMemo(() => payloads?.slice(page * rowsPerPage, page * rowsPerPage + rowsPerPage), [payloads, page, rowsPerPage])\n\n const payloadPairs = usePayloadHashes(pagedPayloads)\n\n useEffect(() => {\n setRowsPerPage(rowsPerPageProp)\n }, [rowsPerPageProp])\n\n const handleChangePage = (event: React.MouseEvent<HTMLButtonElement> | null, newPage: number) => {\n setPage(newPage)\n }\n\n const handleChangeRowsPerPage = (event: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n setRowsPerPage(parseInt(event.target.value, 10))\n setPage(0)\n }\n\n return breakPoint ? (\n <Table stickyHeader {...props}>\n <TableHead>\n <TableRow>\n {columns[breakPoint]?.map((column, index) => {\n return (\n <TableCell key={index} align={column.alignment ?? 'left'} width={column.width}>\n <Typography variant=\"body2\" noWrap>\n {column.name}\n </Typography>\n </TableCell>\n )\n })}\n </TableRow>\n </TableHead>\n <TableBody sx={{ overflowY: 'scroll ' }}>\n {payloadPairs?.map(([payload, hash], index) => {\n return (\n <ThrownErrorBoundary\n boundaryName=\"PayloadTableBody\"\n key={`${hash}-${index}`}\n errorComponent={(e) => (\n <Alert severity=\"error\">\n Error Loading Payload: <Typography fontWeight=\"bold\">{e.message}</Typography>\n </Alert>\n )}\n >\n <PayloadDynamicTableRow\n archive={archive}\n onClick={\n onRowClick\n ? () => {\n onRowClick(payload)\n }\n : undefined\n }\n exploreDomain={exploreDomain}\n payload={payload}\n />\n </ThrownErrorBoundary>\n )\n })}\n {children}\n {emptyRows > 0 && Array(emptyRows).fill(<PayloadDynamicTableRow />)}\n </TableBody>\n <TableFooter>\n <TableRow>\n <TablePagination\n rowsPerPageOptions={[5, 10, 25, { label: 'All', value: -1 }]}\n colSpan={5}\n count={payloadCount}\n rowsPerPage={rowsPerPage}\n page={page}\n SelectProps={{\n inputProps: {\n 'aria-label': 'rows per page',\n },\n native: true,\n }}\n onPageChange={handleChangePage}\n onRowsPerPageChange={handleChangeRowsPerPage}\n ActionsComponent={TablePaginationActions}\n />\n </TableRow>\n </TableFooter>\n </Table>\n ) : null\n}\n"],"mappings":";AAAA;AAAA,EACE,6BAA6B;AAAA,EAC7B,uBAAuB;AAAA,EACvB,uBAAuB;AAAA,OAClB;AACP,SAAsB,WAA2B,UAAyB,kBAAkB;AAC5F,SAAS,kBAAkB;AAC3B,SAAS,qBAAqB;AAC9B,SAAS,qBAAqB;AAE9B,SAAS,wBAAwB;AACjC,SAAS,kBAAkB;AAE3B,SAAS,sCAAsC;AAC/C,SAAS,eAAmC,sBAAsB;;;ACM3D,IAAM,0CAA0C,MAAuC;AAC5F,QAAM,KAA0C;AAAA,IAC9C,EAAE,WAAW,QAAQ,MAAM,QAAQ,MAAM,QAAQ,OAAO,OAAO;AAAA,IAC/D,EAAE,WAAW,QAAQ,MAAM,UAAU,MAAM,UAAU,OAAO,OAAO;AAAA,IACnE,EAAE,WAAW,QAAQ,MAAM,SAAS,MAAM,SAAS,OAAO,OAAO;AAAA,EACnE;AACA,QAAM,KAA0C;AAAA,IAC9C,EAAE,WAAW,QAAQ,MAAM,QAAQ,MAAM,QAAQ,OAAO,OAAO;AAAA,IAC/D,EAAE,WAAW,QAAQ,MAAM,QAAQ,MAAM,QAAQ,OAAO,OAAO;AAAA,IAC/D,EAAE,WAAW,QAAQ,MAAM,UAAU,MAAM,UAAU,OAAO,OAAO;AAAA,IACnE,EAAE,WAAW,QAAQ,MAAM,SAAS,MAAM,SAAS,OAAO,OAAO;AAAA,EACnE;AACA,QAAM,KAA0C;AAAA,IAC9C,EAAE,WAAW,QAAQ,MAAM,QAAQ,MAAM,QAAQ,OAAO,OAAO;AAAA,IAC/D,EAAE,WAAW,QAAQ,MAAM,QAAQ,MAAM,QAAQ,OAAO,OAAO;AAAA,IAC/D,EAAE,WAAW,QAAQ,MAAM,UAAU,MAAM,UAAU,OAAO,OAAO;AAAA,IACnE,EAAE,WAAW,QAAQ,MAAM,SAAS,MAAM,SAAS,OAAO,OAAO;AAAA,EACnE;AACA,QAAM,KAA0C;AAAA,IAC9C,EAAE,WAAW,QAAQ,MAAM,QAAQ,MAAM,QAAQ,OAAO,OAAO;AAAA,IAC/D,EAAE,WAAW,QAAQ,MAAM,QAAQ,MAAM,QAAQ,OAAO,OAAO;AAAA,IAC/D,EAAE,WAAW,QAAQ,MAAM,UAAU,MAAM,UAAU,OAAO,OAAO;AAAA,IACnE,EAAE,WAAW,QAAQ,MAAM,UAAU,MAAM,UAAU,OAAO,OAAO;AAAA,IACnE,EAAE,WAAW,QAAQ,MAAM,SAAS,MAAM,SAAS,OAAO,OAAO;AAAA,EACnE;AACA,QAAM,KAA0C;AAAA,IAC9C,EAAE,WAAW,QAAQ,MAAM,QAAQ,MAAM,QAAQ,OAAO,OAAO;AAAA,IAC/D,EAAE,WAAW,QAAQ,MAAM,QAAQ,MAAM,QAAQ,OAAO,OAAO;AAAA,IAC/D,EAAE,WAAW,QAAQ,MAAM,UAAU,MAAM,UAAU,OAAO,OAAO;AAAA,IACnE,EAAE,WAAW,QAAQ,MAAM,UAAU,MAAM,UAAU,OAAO,OAAO;AAAA,IACnE,EAAE,WAAW,QAAQ,MAAM,SAAS,MAAM,SAAS,OAAO,OAAO;AAAA,EACnE;AACA,SAAO,EAAE,IAAI,IAAI,IAAI,IAAI,GAAG;AAC9B;;;ADNI;AAhBG,IAAM,yBAAgE,CAAC;AAAA,EAC5E;AAAA,EACA,UAAU,wCAAwC;AAAA,EAClD;AAAA,EACA,SAAS;AAAA,EACT;AAAA,EACA,GAAG;AACL,MAAM;AACJ,QAAM,aAAa,cAAc;AACjC,QAAM,cAAc,eAAe,OAAO;AAC1C,QAAM,EAAE,QAAQ,IAAI,WAAW;AAC/B,QAAM,EAAE,SAAS,IAAI,+BAA+B;AACpD,QAAM,CAAC,mBAAmB,CAAC,CAAC,IAAI,WAAW,YAAa,UAAU,MAAM,IAAI,iBAAiB,OAAO,EAAE,SAAS,IAAI,QAAY,CAAC,OAAO,CAAC;AACxI,QAAM,UAAU,iBAAiB,WAAW;AAC5C,QAAM,oBAAoB,UAAU,OAAO,KAAK,cAAc,WAAW,OAAO,CAAC,EAAE,SAAS;AAC5F,QAAM,OAAqC,CAACA,WAC1C;AAAA,IAAC;AAAA;AAAA,MAEC,OAAM;AAAA,MACN;AAAA,MACA,OAAO;AAAA,MACP,UAAS;AAAA,MACT;AAAA,MACA,SAAS,eAAe,SAAS;AAAA,MAChC,GAAGA;AAAA;AAAA,IAPA;AAAA,EAQN;AAGF,QAAM,SAAmC,CAACA,WACxC,oBAAC,aAAyB,OAAM,QAAQ,GAAGA,QACzC,8BAAC,cAAW,YAAW,aAAY,SAAQ,SAAQ,QAAM,MACtD,mBAAS,QACZ,KAHa,UAIf;AAGF,QAAM,UAAoC,CAACA,WACzC,oBAAC,aAAyB,OAAM,QAAQ,GAAGA,QACzC,8BAAC,cAAW,YAAW,aAAY,SAAQ,SAAQ,QAAM,MACtD,6BACH,KAHa,UAIf;AAGF,QAAM,SAAmC,CAACA,WAAU;AAClD,UAAM,SAAyE,UAC3E,UAAU,QAAQ,OAAO,GAAG,WAAW,MAAM,OAC7C;AACJ,WAAO,SAAS,oBAAC,UAAO,SAAmB,GAAGA,QAAO,IAAK,oBAAC,aAAyB,OAAM,QAAQ,GAAGA,UAA5B,UAAmC;AAAA,EAC9G;AAEA,QAAM,OAAiC,CAACA,WAAU;AAChD,UAAM,SAAsE,UACxE,UAAU,QAAQ,OAAO,GAAG,WAAW,OAAO,QAC9C;AAEJ,WACE,oBAAC,aAAyB,OAAM,QAAQ,GAAGA,QACxC,mBAAS,oBAAC,UAAO,SAAkB,IAAK,QAD5B,UAEf;AAAA,EAEJ;AAEA,QAAM,QAAkC,CAACA,WACvC,oBAAC,aAAsB,OAAM,UAAU,GAAGA,QACvC,sBAAY,UAAa,WAAW,SACnC,oBAAC,2BAAwB,UAAS,SAAQ,OAAM,WAAU,IACxD,YAAY,OACd,oBAAC,iCAA8B,UAAS,SAAQ,OAAM,WAAU,IAC9D,YAAY,QACd,oBAAC,2BAAwB,OAAM,SAAQ,UAAS,SAAQ;AAAA;AAAA,IAGxD,oBAAC,cAAW,mBAAO;AAAA,OATR,OAWf;AAGF,QAAM,aAA8E;AAAA,IAClF;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,SAAO,aACL,oBAAC,YAAS,OAAO,EAAE,UAAU,QAAQ,GAAI,GAAG,OACzC,kBAAQ,UAAU,GAAG,IAAI,CAAC,WAAW;AACpC,WAAO,OAAO,OAAO,WAAW,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI;AAAA,EACrD,CAAC,GACH,IACE;AACN;;;AE7HA,SAAS,aAAa,eAAe,mBAAmB,oBAAoB,YAAY,oBAAoB;AAC5G;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAAC;AAAA,EACA,cAAAC;AAAA,EACA;AAAA,OACK;AACP,SAAS,iBAAAC,sBAAqB;AAE9B,SAAS,2BAA2B;AACpC,SAAS,wBAAwB;AACjC,SAAS,WAAW,SAAS,gBAAgB;AA0CzC,SAEiC,OAAAC,MAFjC;AArBJ,SAAS,uBAAuB,OAAoC;AAClE,QAAM,QAAQ,SAAS;AACvB,QAAM,EAAE,OAAO,MAAM,aAAa,aAAa,IAAI;AAEnD,QAAM,6BAA6B,CAAC,UAA+C;AACjF,iBAAa,OAAO,CAAC;AAAA,EACvB;AAEA,QAAM,wBAAwB,CAAC,UAA+C;AAC5E,iBAAa,OAAO,OAAO,CAAC;AAAA,EAC9B;AAEA,QAAM,wBAAwB,CAAC,UAA+C;AAC5E,iBAAa,OAAO,OAAO,CAAC;AAAA,EAC9B;AAEA,QAAM,4BAA4B,CAAC,UAA+C;AAChF,iBAAa,OAAO,KAAK,IAAI,GAAG,KAAK,KAAK,QAAQ,WAAW,IAAI,CAAC,CAAC;AAAA,EACrE;AAEA,SACE,qBAAC,OAAI,IAAI,EAAE,YAAY,GAAG,IAAI,IAAI,GAChC;AAAA,oBAAAA,KAAC,cAAW,SAAS,4BAA4B,UAAU,SAAS,GAAG,cAAW,cAC/E,gBAAM,cAAc,QAAQ,gBAAAA,KAAC,gBAAa,IAAK,gBAAAA,KAAC,iBAAc,GACjE;AAAA,IACA,gBAAAA,KAAC,cAAW,SAAS,uBAAuB,UAAU,SAAS,GAAG,cAAW,iBAC1E,gBAAM,cAAc,QAAQ,gBAAAA,KAAC,sBAAmB,IAAK,gBAAAA,KAAC,qBAAkB,GAC3E;AAAA,IACA,gBAAAA,KAAC,cAAW,SAAS,uBAAuB,UAAU,QAAQ,KAAK,KAAK,QAAQ,WAAW,IAAI,GAAG,cAAW,aAC1G,gBAAM,cAAc,QAAQ,gBAAAA,KAAC,qBAAkB,IAAK,gBAAAA,KAAC,sBAAmB,GAC3E;AAAA,IACA,gBAAAA,KAAC,cAAW,SAAS,2BAA2B,UAAU,QAAQ,KAAK,KAAK,QAAQ,WAAW,IAAI,GAAG,cAAW,aAC9G,gBAAM,cAAc,QAAQ,gBAAAA,KAAC,iBAAc,IAAK,gBAAAA,KAAC,gBAAa,GACjE;AAAA,KACF;AAEJ;AAEO,IAAM,sBAA0D,CAAC;AAAA,EACtE;AAAA,EACA;AAAA,EACA,UAAU,wCAAwC;AAAA,EAClD;AAAA,EACA;AAAA,EACA,aAAa,kBAAkB;AAAA,EAC/B;AAAA,EACA,GAAG;AACL,MAAM;AACJ,QAAM,aAAaC,eAAc;AACjC,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,CAAC;AAClC,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,eAAe;AAC9D,QAAM,eAAe,WAAW,SAAS,SAAS;AAElD,QAAM,YAAY,OAAO,IAAI,KAAK,IAAI,IAAI,IAAI,QAAQ,cAAc,YAAY,IAAI;AAEpF,QAAM,gBAAgB,QAAQ,MAAM,UAAU,MAAM,OAAO,aAAa,OAAO,cAAc,WAAW,GAAG,CAAC,UAAU,MAAM,WAAW,CAAC;AAExI,QAAM,eAAe,iBAAiB,aAAa;AAEnD,YAAU,MAAM;AACd,mBAAe,eAAe;AAAA,EAChC,GAAG,CAAC,eAAe,CAAC;AAEpB,QAAM,mBAAmB,CAAC,OAAmD,YAAoB;AAC/F,YAAQ,OAAO;AAAA,EACjB;AAEA,QAAM,0BAA0B,CAAC,UAAqE;AACpG,mBAAe,SAAS,MAAM,OAAO,OAAO,EAAE,CAAC;AAC/C,YAAQ,CAAC;AAAA,EACX;AAEA,SAAO,aACL,qBAAC,SAAM,cAAY,MAAE,GAAG,OACtB;AAAA,oBAAAD,KAAC,aACC,0BAAAA,KAACE,WAAA,EACE,kBAAQ,UAAU,GAAG,IAAI,CAAC,QAAQ,UAAU;AAC3C,aACE,gBAAAF,KAACG,YAAA,EAAsB,OAAO,OAAO,aAAa,QAAQ,OAAO,OAAO,OACtE,0BAAAH,KAACI,aAAA,EAAW,SAAQ,SAAQ,QAAM,MAC/B,iBAAO,MACV,KAHc,KAIhB;AAAA,IAEJ,CAAC,GACH,GACF;AAAA,IACA,qBAAC,aAAU,IAAI,EAAE,WAAW,UAAU,GACnC;AAAA,oBAAc,IAAI,CAAC,CAAC,SAAS,IAAI,GAAG,UAAU;AAC7C,eACE,gBAAAJ;AAAA,UAAC;AAAA;AAAA,YACC,cAAa;AAAA,YAEb,gBAAgB,CAAC,MACf,qBAAC,SAAM,UAAS,SAAQ;AAAA;AAAA,cACC,gBAAAA,KAACI,aAAA,EAAW,YAAW,QAAQ,YAAE,SAAQ;AAAA,eAClE;AAAA,YAGF,0BAAAJ;AAAA,cAAC;AAAA;AAAA,gBACC;AAAA,gBACA,SACE,aACI,MAAM;AACJ,6BAAW,OAAO;AAAA,gBACpB,IACA;AAAA,gBAEN;AAAA,gBACA;AAAA;AAAA,YACF;AAAA;AAAA,UAlBK,GAAG,IAAI,IAAI,KAAK;AAAA,QAmBvB;AAAA,MAEJ,CAAC;AAAA,MACA;AAAA,MACA,YAAY,KAAK,MAAM,SAAS,EAAE,KAAK,gBAAAA,KAAC,0BAAuB,CAAE;AAAA,OACpE;AAAA,IACA,gBAAAA,KAAC,eACC,0BAAAA,KAACE,WAAA,EACC,0BAAAF;AAAA,MAAC;AAAA;AAAA,QACC,oBAAoB,CAAC,GAAG,IAAI,IAAI,EAAE,OAAO,OAAO,OAAO,GAAG,CAAC;AAAA,QAC3D,SAAS;AAAA,QACT,OAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA,aAAa;AAAA,UACX,YAAY;AAAA,YACV,cAAc;AAAA,UAChB;AAAA,UACA,QAAQ;AAAA,QACV;AAAA,QACA,cAAc;AAAA,QACd,qBAAqB;AAAA,QACrB,kBAAkB;AAAA;AAAA,IACpB,GACF,GACF;AAAA,KACF,IACE;AACN;","names":["props","TableCell","TableRow","Typography","useBreakpoint","jsx","useBreakpoint","TableRow","TableCell","Typography"]}
@@ -1,9 +1,10 @@
1
- const payloadColumnNames = {
1
+ // src/components/Table/PayloadTableColumnConfig.ts
2
+ var payloadColumnNames = {
2
3
  hash: "Hash",
3
4
  schema: "Schema",
4
5
  valid: "Valid"
5
6
  };
6
- const payloadTableColumnConfigDefaults = () => {
7
+ var payloadTableColumnConfigDefaults = () => {
7
8
  const xs = ["hash", "schema", "valid"];
8
9
  const sm = ["hash", "schema", "valid"];
9
10
  const md = ["hash", "schema", "valid"];
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/Table/PayloadTableColumnConfig.ts"],"sourcesContent":["export type PayloadTableColumnSlug = 'hash' | 'schema' | 'valid'\n\nexport interface PayloadTableColumnConfig<T = PayloadTableColumnSlug> {\n xs?: T[]\n // eslint-disable-next-line @typescript-eslint/member-ordering\n sm?: T[]\n // eslint-disable-next-line @typescript-eslint/member-ordering\n md?: T[]\n // eslint-disable-next-line @typescript-eslint/member-ordering\n lg?: T[]\n xl?: T[]\n}\n\nexport const payloadColumnNames: Record<PayloadTableColumnSlug, string> = {\n hash: 'Hash',\n schema: 'Schema',\n valid: 'Valid',\n}\n\nexport const payloadTableColumnConfigDefaults = (): PayloadTableColumnConfig => {\n const xs: PayloadTableColumnSlug[] = ['hash', 'schema', 'valid']\n const sm: PayloadTableColumnSlug[] = ['hash', 'schema', 'valid']\n const md: PayloadTableColumnSlug[] = ['hash', 'schema', 'valid']\n const lg: PayloadTableColumnSlug[] = ['hash', 'schema', 'valid']\n const xl: PayloadTableColumnSlug[] = ['hash', 'schema', 'valid']\n return { lg, md, sm, xl, xs }\n}\n"],"mappings":"AAaO,MAAM,qBAA6D;AAAA,EACxE,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AACT;AAEO,MAAM,mCAAmC,MAAgC;AAC9E,QAAM,KAA+B,CAAC,QAAQ,UAAU,OAAO;AAC/D,QAAM,KAA+B,CAAC,QAAQ,UAAU,OAAO;AAC/D,QAAM,KAA+B,CAAC,QAAQ,UAAU,OAAO;AAC/D,QAAM,KAA+B,CAAC,QAAQ,UAAU,OAAO;AAC/D,QAAM,KAA+B,CAAC,QAAQ,UAAU,OAAO;AAC/D,SAAO,EAAE,IAAI,IAAI,IAAI,IAAI,GAAG;AAC9B;","names":[]}
1
+ {"version":3,"sources":["../../../../src/components/Table/PayloadTableColumnConfig.ts"],"sourcesContent":["export type PayloadTableColumnSlug = 'hash' | 'schema' | 'valid'\n\nexport interface PayloadTableColumnConfig<T = PayloadTableColumnSlug> {\n xs?: T[]\n // eslint-disable-next-line @typescript-eslint/member-ordering\n sm?: T[]\n // eslint-disable-next-line @typescript-eslint/member-ordering\n md?: T[]\n // eslint-disable-next-line @typescript-eslint/member-ordering\n lg?: T[]\n xl?: T[]\n}\n\nexport const payloadColumnNames: Record<PayloadTableColumnSlug, string> = {\n hash: 'Hash',\n schema: 'Schema',\n valid: 'Valid',\n}\n\nexport const payloadTableColumnConfigDefaults = (): PayloadTableColumnConfig => {\n const xs: PayloadTableColumnSlug[] = ['hash', 'schema', 'valid']\n const sm: PayloadTableColumnSlug[] = ['hash', 'schema', 'valid']\n const md: PayloadTableColumnSlug[] = ['hash', 'schema', 'valid']\n const lg: PayloadTableColumnSlug[] = ['hash', 'schema', 'valid']\n const xl: PayloadTableColumnSlug[] = ['hash', 'schema', 'valid']\n return { lg, md, sm, xl, xs }\n}\n"],"mappings":";AAaO,IAAM,qBAA6D;AAAA,EACxE,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,OAAO;AACT;AAEO,IAAM,mCAAmC,MAAgC;AAC9E,QAAM,KAA+B,CAAC,QAAQ,UAAU,OAAO;AAC/D,QAAM,KAA+B,CAAC,QAAQ,UAAU,OAAO;AAC/D,QAAM,KAA+B,CAAC,QAAQ,UAAU,OAAO;AAC/D,QAAM,KAA+B,CAAC,QAAQ,UAAU,OAAO;AAC/D,QAAM,KAA+B,CAAC,QAAQ,UAAU,OAAO;AAC/D,SAAO,EAAE,IAAI,IAAI,IAAI,IAAI,GAAG;AAC9B;","names":[]}
@@ -1,11 +1,259 @@
1
- import { jsx, jsxs } from "react/jsx-runtime";
1
+ // src/components/Table/Table.tsx
2
2
  import { TableEx } from "@xyo-network/react-table";
3
3
  import { forwardRef, useEffect, useMemo, useState } from "react";
4
- import { PayloadTableBody } from "./TableBody";
5
- import { PayloadTableFooter } from "./TableFooter";
6
- import { PayloadTableHead } from "./TableHead";
7
- import { TableRowNoData } from "./TableRowNoData";
8
- const PayloadTableWithRef = forwardRef(
4
+
5
+ // src/components/Table/TableBody.tsx
6
+ import { Alert, TableBody, Typography as Typography2 } from "@mui/material";
7
+ import { ThrownErrorBoundary } from "@xyo-network/react-error";
8
+ import { usePayloadHashes } from "@xyo-network/react-shared";
9
+
10
+ // src/components/Table/TableRow.tsx
11
+ import {
12
+ CheckCircleOutlineRounded as CheckCircleOutlineRoundedIcon,
13
+ ErrorOutlineRounded as ErrorOutlineRoundedIcon,
14
+ WarningAmberRounded as WarningAmberRoundedIcon
15
+ } from "@mui/icons-material";
16
+ import { alpha, TableCell, TableRow, Typography } from "@mui/material";
17
+ import { usePromise } from "@xylabs/react-promise";
18
+ import { useBreakpoint } from "@xylabs/react-shared";
19
+ import { PayloadValidator } from "@xyo-network/payload-validator";
20
+ import { useNetwork } from "@xyo-network/react-network";
21
+ import { HashTableCell, usePayloadHash } from "@xyo-network/react-shared";
22
+
23
+ // src/components/Table/PayloadTableColumnConfig.ts
24
+ var payloadColumnNames = {
25
+ hash: "Hash",
26
+ schema: "Schema",
27
+ valid: "Valid"
28
+ };
29
+ var payloadTableColumnConfigDefaults = () => {
30
+ const xs = ["hash", "schema", "valid"];
31
+ const sm = ["hash", "schema", "valid"];
32
+ const md = ["hash", "schema", "valid"];
33
+ const lg = ["hash", "schema", "valid"];
34
+ const xl = ["hash", "schema", "valid"];
35
+ return { lg, md, sm, xl, xs };
36
+ };
37
+
38
+ // src/components/Table/TableRow.tsx
39
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
40
+ var PayloadTableRow = ({
41
+ archive,
42
+ columns = payloadTableColumnConfigDefaults(),
43
+ exploreDomain,
44
+ maxSchemaDepth,
45
+ network: networkProp,
46
+ payload,
47
+ ...props
48
+ }) => {
49
+ const breakPoint = useBreakpoint();
50
+ const payloadHash = usePayloadHash(payload);
51
+ const { network } = useNetwork();
52
+ const [errors = []] = usePromise(async () => payload ? await new PayloadValidator(payload).validate() : void 0, [payload]);
53
+ const isValid = errors.length === 0;
54
+ const hash = (props2) => /* @__PURE__ */ jsx(
55
+ HashTableCell,
56
+ {
57
+ archive,
58
+ width: "100%",
59
+ value: payloadHash,
60
+ dataType: "payload",
61
+ exploreDomain,
62
+ network: networkProp ?? network?.slug,
63
+ ...props2
64
+ },
65
+ "hash"
66
+ );
67
+ const reduceSchemaDepth = (schema2, maxSchemaDepth2) => {
68
+ if (maxSchemaDepth2) {
69
+ const parts = schema2?.split(".") ?? [];
70
+ const partsToRemove = parts.length - maxSchemaDepth2 > 0 ? parts.length - maxSchemaDepth2 : 0;
71
+ if (partsToRemove > 0) {
72
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
73
+ /* @__PURE__ */ jsx(Fragment, { children: "\u2026" }),
74
+ `${parts.slice(partsToRemove).reduce((previousValue, part) => `${previousValue}.${part}`)}`
75
+ ] });
76
+ }
77
+ }
78
+ return schema2;
79
+ };
80
+ const schema = (props2) => /* @__PURE__ */ jsx(TableCell, { title: payload?.schema, align: "center", ...props2, children: /* @__PURE__ */ jsx(Typography, { fontFamily: "monospace", variant: "body2", noWrap: true, children: reduceSchemaDepth(payload?.schema, maxSchemaDepth) }) }, "payloads");
81
+ const valid = (props2) => /* @__PURE__ */ jsx(TableCell, { align: "center", ...props2, children: isValid === void 0 && payload != void 0 ? /* @__PURE__ */ jsx(WarningAmberRoundedIcon, { fontSize: "small", color: "warning" }) : isValid === true ? /* @__PURE__ */ jsx(CheckCircleOutlineRoundedIcon, { fontSize: "small", color: "success" }) : isValid === false ? /* @__PURE__ */ jsx(ErrorOutlineRoundedIcon, { color: "error", fontSize: "small" }) : (
82
+ //to keep row height consistent when no data provided, may need fix later
83
+ /* @__PURE__ */ jsx(ErrorOutlineRoundedIcon, { sx: { color: alpha("#fff", 0) }, fontSize: "small" })
84
+ ) }, "valid");
85
+ const tableCells = {
86
+ hash,
87
+ schema,
88
+ valid
89
+ };
90
+ return breakPoint ? /* @__PURE__ */ jsx(TableRow, { style: { maxWidth: "100vw" }, ...props, children: columns[breakPoint]?.map((column) => {
91
+ return tableCells[column]({});
92
+ }) }) : null;
93
+ };
94
+
95
+ // src/components/Table/TableBody.tsx
96
+ import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
97
+ var PayloadTableBody = ({
98
+ children,
99
+ exploreDomain,
100
+ payloads,
101
+ archive,
102
+ maxSchemaDepth,
103
+ onRowClick,
104
+ emptyRows,
105
+ noResults,
106
+ NoResultRowComponent,
107
+ ...props
108
+ }) => {
109
+ const payloadPairs = usePayloadHashes(payloads);
110
+ return /* @__PURE__ */ jsxs2(TableBody, { ...props, children: [
111
+ noResults && NoResultRowComponent ? /* @__PURE__ */ jsx2(NoResultRowComponent, {}) : null,
112
+ payloadPairs?.map(([payload, hash], index) => {
113
+ return /* @__PURE__ */ jsx2(
114
+ ThrownErrorBoundary,
115
+ {
116
+ boundaryName: "PayloadTableBody",
117
+ errorComponent: (e) => /* @__PURE__ */ jsxs2(Alert, { severity: "error", children: [
118
+ "Error Loading Payload: ",
119
+ /* @__PURE__ */ jsx2(Typography2, { fontWeight: "bold", children: e.message })
120
+ ] }),
121
+ children: /* @__PURE__ */ jsx2(
122
+ PayloadTableRow,
123
+ {
124
+ maxSchemaDepth,
125
+ archive,
126
+ onClick: onRowClick ? () => {
127
+ onRowClick(payload);
128
+ } : void 0,
129
+ exploreDomain,
130
+ payload
131
+ }
132
+ )
133
+ },
134
+ `${hash}-${index}`
135
+ );
136
+ }),
137
+ children,
138
+ (emptyRows ?? 0) > 0 && Array(emptyRows).fill(/* @__PURE__ */ jsx2(PayloadTableRow, {}))
139
+ ] });
140
+ };
141
+
142
+ // src/components/Table/TableFooter.tsx
143
+ import { styled, TablePagination, TableRow as TableRow2 } from "@mui/material";
144
+ import { TableFooterEx } from "@xyo-network/react-table";
145
+
146
+ // src/components/Table/TablePagination.tsx
147
+ import { FirstPage as FirstPageIcon, KeyboardArrowLeft, KeyboardArrowRight, LastPage as LastPageIcon } from "@mui/icons-material";
148
+ import { Box, CircularProgress, IconButton, useTheme } from "@mui/material";
149
+ import { useEvent } from "@xyo-network/react-event";
150
+ import { Fragment as Fragment2, jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
151
+ function TablePaginationActions({ count, enableNextPage, loading, onPageChange, page, rowsPerPage }) {
152
+ const theme = useTheme();
153
+ const [paginationRef, paginationDispatch] = useEvent();
154
+ const handleFirstPageButtonClick = (event) => {
155
+ paginationDispatch("firstPage", "click", "true");
156
+ onPageChange(event, 0);
157
+ };
158
+ const handleBackButtonClick = (event) => {
159
+ paginationDispatch("previousPage", "click", (page - 1)?.toString());
160
+ onPageChange(event, page - 1);
161
+ };
162
+ const handleNextButtonClick = (event) => {
163
+ paginationDispatch("nextPage", "click", (page + 1)?.toString());
164
+ onPageChange(event, page + 1);
165
+ };
166
+ const handleLastPageButtonClick = (event) => {
167
+ paginationDispatch("lastPage", "click", "true");
168
+ onPageChange(event, Math.max(0, Math.ceil(count / rowsPerPage) - 1));
169
+ };
170
+ return /* @__PURE__ */ jsxs3(Fragment2, { children: [
171
+ loading ? /* @__PURE__ */ jsx3(CircularProgress, { size: "small", sx: { height: theme.spacing(2), position: "absolute", width: theme.spacing(2) } }) : null,
172
+ /* @__PURE__ */ jsxs3(Box, { sx: { flexShrink: 0, ml: 2.5 }, children: [
173
+ /* @__PURE__ */ jsx3(IconButton, { onClick: handleFirstPageButtonClick, disabled: page === 0, "aria-label": "first page", children: theme.direction === "rtl" ? /* @__PURE__ */ jsx3(LastPageIcon, {}) : /* @__PURE__ */ jsx3(FirstPageIcon, {}) }),
174
+ /* @__PURE__ */ jsx3(IconButton, { ref: paginationRef, onClick: handleBackButtonClick, disabled: page === 0, "aria-label": "previous page", children: theme.direction === "rtl" ? /* @__PURE__ */ jsx3(KeyboardArrowRight, {}) : /* @__PURE__ */ jsx3(KeyboardArrowLeft, {}) }),
175
+ /* @__PURE__ */ jsx3(
176
+ IconButton,
177
+ {
178
+ ref: paginationRef,
179
+ onClick: handleNextButtonClick,
180
+ disabled: !enableNextPage && page >= Math.ceil(count / rowsPerPage) - 1,
181
+ "aria-label": "next page",
182
+ children: theme.direction === "rtl" ? /* @__PURE__ */ jsx3(KeyboardArrowLeft, {}) : /* @__PURE__ */ jsx3(KeyboardArrowRight, {})
183
+ }
184
+ ),
185
+ /* @__PURE__ */ jsx3(IconButton, { onClick: handleLastPageButtonClick, disabled: page >= Math.ceil(count / rowsPerPage) - 1, "aria-label": "last page", children: theme.direction === "rtl" ? /* @__PURE__ */ jsx3(FirstPageIcon, {}) : /* @__PURE__ */ jsx3(LastPageIcon, {}) })
186
+ ] })
187
+ ] });
188
+ }
189
+
190
+ // src/components/Table/TableFooter.tsx
191
+ import { jsx as jsx4 } from "react/jsx-runtime";
192
+ var PayloadTableFooter = ({
193
+ count,
194
+ variant,
195
+ page,
196
+ rowsPerPage,
197
+ handleChangePage = () => void 0,
198
+ handleChangeRowsPerPage = () => void 0,
199
+ fetchMorePayloads,
200
+ loading
201
+ }) => /* @__PURE__ */ jsx4(TableFooterEx, { variant, children: /* @__PURE__ */ jsx4(TableRow2, { children: /* @__PURE__ */ jsx4(
202
+ StyledTablePagination,
203
+ {
204
+ rowsPerPageOptions: [5, 10, 25, { label: "All", value: -1 }],
205
+ count: count ?? 0,
206
+ rowsPerPage: rowsPerPage ?? 10,
207
+ page: page ?? 0,
208
+ SelectProps: {
209
+ inputProps: {
210
+ "aria-label": "rows per page"
211
+ },
212
+ native: true
213
+ },
214
+ onPageChange: handleChangePage,
215
+ onRowsPerPageChange: handleChangeRowsPerPage,
216
+ ActionsComponent: (props) => /* @__PURE__ */ jsx4(TablePaginationActions, { enableNextPage: !!fetchMorePayloads, loading, ...props })
217
+ }
218
+ ) }) });
219
+ var StyledTablePagination = styled(TablePagination)(({ theme }) => ({
220
+ "& > .MuiToolbar-root": {
221
+ paddingLeft: theme.spacing(1)
222
+ },
223
+ borderTop: "1px solid",
224
+ borderTopColor: theme.palette.divider
225
+ }));
226
+
227
+ // src/components/Table/TableHead.tsx
228
+ import { TableCell as TableCell2, TableHead, TableRow as TableRow3, Typography as Typography3 } from "@mui/material";
229
+ import { useBreakpoint as useBreakpoint2 } from "@xylabs/react-shared";
230
+ import { jsx as jsx5 } from "react/jsx-runtime";
231
+ var PayloadTableHead = ({ columns = payloadTableColumnConfigDefaults(), ...props }) => {
232
+ const breakPoint = useBreakpoint2();
233
+ return /* @__PURE__ */ jsx5(TableHead, { ...props, children: /* @__PURE__ */ jsx5(TableRow3, { children: breakPoint && columns ? columns[breakPoint]?.map((column, index) => {
234
+ return /* @__PURE__ */ jsx5(TableCell2, { width: index === 0 ? "100%" : void 0, align: index === 0 ? "left" : "center", children: /* @__PURE__ */ jsx5(Typography3, { variant: "body2", noWrap: true, children: payloadColumnNames[column] }) }, index);
235
+ }) : null }) });
236
+ };
237
+
238
+ // src/components/Table/TableRowNoData.tsx
239
+ import { styled as styled2, TableCell as TableCell3, TableRow as TableRow4, Typography as Typography4 } from "@mui/material";
240
+ import { jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
241
+ var TableRowNoData = ({ additionalCells, hideBorder = false, typographyProps, ...props }) => {
242
+ return /* @__PURE__ */ jsxs4(TableRow4, { ...props, children: [
243
+ /* @__PURE__ */ jsx6(StyledTableCell, { hideBorder, children: /* @__PURE__ */ jsx6(Typography4, { variant: "body2", ...typographyProps, children: "No Data To Display..." }) }),
244
+ additionalCells ? Array(additionalCells).fill(void 0).map((_fill, index) => /* @__PURE__ */ jsx6(StyledTableCell, { hideBorder }, index)) : null
245
+ ] });
246
+ };
247
+ var StyledTableCell = styled2(TableCell3, {
248
+ name: "StyledTableCell",
249
+ shouldForwardProp: (prop) => prop !== "hideBorder"
250
+ })(({ hideBorder }) => ({
251
+ ...hideBorder && { border: "none" }
252
+ }));
253
+
254
+ // src/components/Table/Table.tsx
255
+ import { jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
256
+ var PayloadTableWithRef = forwardRef(
9
257
  ({
10
258
  exploreDomain,
11
259
  archive,
@@ -61,9 +309,9 @@ const PayloadTableWithRef = forwardRef(
61
309
  const noResults = useMemo(() => {
62
310
  return !loading && (!visiblePayloads || visiblePayloads.length === 0);
63
311
  }, [loading, visiblePayloads]);
64
- return /* @__PURE__ */ jsxs(TableEx, { variant, ref, ...props, children: [
65
- /* @__PURE__ */ jsx(PayloadTableHeadComponent, { columns }),
66
- /* @__PURE__ */ jsx(
312
+ return /* @__PURE__ */ jsxs5(TableEx, { variant, ref, ...props, children: [
313
+ /* @__PURE__ */ jsx7(PayloadTableHeadComponent, { columns }),
314
+ /* @__PURE__ */ jsx7(
67
315
  PayloadTableBodyComponent,
68
316
  {
69
317
  payloads: visiblePayloads,
@@ -76,7 +324,7 @@ const PayloadTableWithRef = forwardRef(
76
324
  NoResultRowComponent: TableRowNoData
77
325
  }
78
326
  ),
79
- /* @__PURE__ */ jsx(
327
+ /* @__PURE__ */ jsx7(
80
328
  PayloadTableFooterComponent,
81
329
  {
82
330
  count,
@@ -93,7 +341,7 @@ const PayloadTableWithRef = forwardRef(
93
341
  }
94
342
  );
95
343
  PayloadTableWithRef.displayName = "PayloadTable";
96
- const PayloadTable = PayloadTableWithRef;
344
+ var PayloadTable = PayloadTableWithRef;
97
345
  export {
98
346
  PayloadTable,
99
347
  PayloadTableWithRef