react-science 11.0.0 → 11.2.0

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 (33) hide show
  1. package/lib/components/logger/FifoLoggerDialog.d.ts.map +1 -1
  2. package/lib/components/logger/FifoLoggerDialog.js +2 -2
  3. package/lib/components/logger/FifoLoggerDialog.js.map +1 -1
  4. package/lib/components/table/table_body.d.ts +3 -0
  5. package/lib/components/table/table_body.d.ts.map +1 -1
  6. package/lib/components/table/table_body.js +33 -10
  7. package/lib/components/table/table_body.js.map +1 -1
  8. package/lib/components/table/table_header.d.ts +2 -0
  9. package/lib/components/table/table_header.d.ts.map +1 -1
  10. package/lib/components/table/table_header.js +2 -2
  11. package/lib/components/table/table_header.js.map +1 -1
  12. package/lib/components/table/table_header_cell.d.ts +5 -1
  13. package/lib/components/table/table_header_cell.d.ts.map +1 -1
  14. package/lib/components/table/table_header_cell.js +19 -11
  15. package/lib/components/table/table_header_cell.js.map +1 -1
  16. package/lib/components/table/table_root.d.ts +49 -1
  17. package/lib/components/table/table_root.d.ts.map +1 -1
  18. package/lib/components/table/table_root.js +33 -3
  19. package/lib/components/table/table_root.js.map +1 -1
  20. package/lib/components/table/table_row_cell.d.ts +1 -0
  21. package/lib/components/table/table_row_cell.d.ts.map +1 -1
  22. package/lib/components/table/table_row_cell.js +2 -2
  23. package/lib/components/table/table_row_cell.js.map +1 -1
  24. package/lib/components/table/table_utils.d.ts +3 -3
  25. package/lib/components/table/table_utils.d.ts.map +1 -1
  26. package/package.json +2 -1
  27. package/src/components/logger/FifoLoggerDialog.tsx +3 -4
  28. package/src/components/table/table_body.tsx +91 -17
  29. package/src/components/table/table_header.tsx +8 -2
  30. package/src/components/table/table_header_cell.tsx +37 -19
  31. package/src/components/table/table_root.tsx +124 -13
  32. package/src/components/table/table_row_cell.tsx +3 -2
  33. package/src/components/table/table_utils.ts +5 -3
@@ -1 +1 @@
1
- {"version":3,"file":"FifoLoggerDialog.d.ts","sourceRoot":"","sources":["../../../src/components/logger/FifoLoggerDialog.tsx"],"names":[],"mappings":"AAAA,sCAAsC;AAKtC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AA+B5C,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAqCD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,oDA0D5D"}
1
+ {"version":3,"file":"FifoLoggerDialog.d.ts","sourceRoot":"","sources":["../../../src/components/logger/FifoLoggerDialog.tsx"],"names":[],"mappings":"AAAA,sCAAsC;AAKtC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AA+B5C,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,IAAI,EAAE,QAAQ,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAqCD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,oDAyD5D"}
@@ -54,9 +54,9 @@ export function FifoLoggerDialog(props) {
54
54
  min-height: 500px;
55
55
  max-height: 80vh;
56
56
  max-width: 1000px;
57
- `, children: [_jsx(DialogBody, { children: _jsx(Table, { data: props.logs, columns: columns, compact: true, bordered: true, tableProps: { style: { width: '100%' } }, renderRowTr: ({ row, children }) => (_jsx("tr", { style: {
57
+ `, children: [_jsx(DialogBody, { children: _jsx(Table, { data: props.logs, columns: columns, compact: true, bordered: true, tableProps: { style: { width: '100%' } }, renderRowTr: (trProps, row) => (_jsx("tr", { ...trProps, style: {
58
58
  backgroundColor: rowBackgroundColor[row.original.levelLabel],
59
- }, children: children })) }) }), _jsx(DialogFooter, { actions: _jsxs(ActionsFooter, { children: [_jsx(Button, { outlined: true, intent: "danger", icon: "trash", text: "Clear logs", onClick: () => logger.clear() }), _jsx(Button, { outlined: true, intent: "none", text: "Close", onClick: props.onClose })] }) })] }));
59
+ } })) }) }), _jsx(DialogFooter, { actions: _jsxs(ActionsFooter, { children: [_jsx(Button, { outlined: true, intent: "danger", icon: "trash", text: "Clear logs", onClick: () => logger.clear() }), _jsx(Button, { outlined: true, intent: "none", text: "Close", onClick: props.onClose })] }) })] }));
60
60
  }
61
61
  // "fatal" | "error" | "warn" | "info" | "debug" | "trace" | "silent"
62
62
  const rowBackgroundColor = {
@@ -1 +1 @@
1
- {"version":3,"file":"FifoLoggerDialog.js","sourceRoot":"","sources":["../../../src/components/logger/FifoLoggerDialog.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FifoLoggerDialog.js","sourceRoot":"","sources":["../../../src/components/logger/FifoLoggerDialog.tsx"],"names":[],"mappings":"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"}
@@ -1,8 +1,11 @@
1
1
  import type { Row, RowData } from '@tanstack/react-table';
2
+ import type { Virtualizer } from '@tanstack/react-virtual';
2
3
  import type { TableRowTrRenderer } from './table_utils.js';
3
4
  interface TableBodyProps<TData extends RowData> {
4
5
  rows: Array<Row<TData>>;
5
6
  renderRowTr: TableRowTrRenderer<TData> | undefined;
7
+ virtualizeRows?: boolean;
8
+ virtualizer: Virtualizer<HTMLDivElement, Element>;
6
9
  }
7
10
  export declare function TableBody<TData extends RowData>(props: TableBodyProps<TData>): import("react/jsx-runtime").JSX.Element;
8
11
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"table_body.d.ts","sourceRoot":"","sources":["../../../src/components/table/table_body.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAI1D,OAAO,KAAK,EACV,kBAAkB,EAEnB,MAAM,kBAAkB,CAAC;AAE1B,UAAU,cAAc,CAAC,KAAK,SAAS,OAAO;IAC5C,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IACxB,WAAW,EAAE,kBAAkB,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;CACpD;AAED,wBAAgB,SAAS,CAAC,KAAK,SAAS,OAAO,EAAE,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,2CAgB5E"}
1
+ {"version":3,"file":"table_body.d.ts","sourceRoot":"","sources":["../../../src/components/table/table_body.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAe,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAMxE,OAAO,KAAK,EAAmB,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE5E,UAAU,cAAc,CAAC,KAAK,SAAS,OAAO;IAC5C,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IACxB,WAAW,EAAE,kBAAkB,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;IACnD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,EAAE,WAAW,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;CACnD;AAED,wBAAgB,SAAS,CAAC,KAAK,SAAS,OAAO,EAAE,KAAK,EAAE,cAAc,CAAC,KAAK,CAAC,2CAwD5E"}
@@ -1,16 +1,39 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { notUndefined } from '@tanstack/react-virtual';
2
3
  import { Fragment } from 'react';
3
4
  import { TableRowCell } from './table_row_cell.js';
4
5
  export function TableBody(props) {
5
- const { rows, renderRowTr = defaultRenderRowTr } = props;
6
- return (_jsx("tbody", { children: rows.map((row) => (_jsx(Fragment, { children: renderRowTr({
7
- row,
8
- children: row
9
- .getVisibleCells()
10
- .map((cell) => _jsx(TableRowCell, { cell: cell }, cell.id)),
11
- }) }, row.id))) }));
6
+ const { rows, renderRowTr = defaultRenderRowTr, virtualizer, virtualizeRows, } = props;
7
+ if (virtualizeRows) {
8
+ const virtualItems = virtualizer.getVirtualItems();
9
+ const [before, after] = virtualItems.length > 0
10
+ ? [
11
+ virtualItems[0].start - virtualizer.options.scrollMargin,
12
+ virtualizer.getTotalSize() - notUndefined(virtualItems.at(-1)).end,
13
+ ]
14
+ : [0, 0];
15
+ return (_jsxs("tbody", { children: [before > 0 && (_jsx("tr", { children: _jsx("td", { style: { height: before } }) })), virtualItems.map((virtualItem, index) => (_jsx(TableRow, { row: rows[virtualItem.index], renderRowTr: (row) => {
16
+ const trProps = getTrRenderProps(row, {
17
+ ...virtualItem,
18
+ virtualIndex: index,
19
+ });
20
+ return renderRowTr(trProps, row);
21
+ } }, virtualItem.index))), after > 0 && (_jsx("tr", { children: _jsx("td", { style: { height: after } }) }))] }));
22
+ }
23
+ return (_jsx("tbody", { children: rows.map((row) => (_jsx(TableRow, { row: row, renderRowTr: (row) => renderRowTr(getTrRenderProps(row), row) }, row.id))) }));
12
24
  }
13
- function defaultRenderRowTr(props) {
14
- return _jsx("tr", { children: props.children });
25
+ function TableRow({ row, renderRowTr, }) {
26
+ return _jsx(Fragment, { children: renderRowTr(row) });
27
+ }
28
+ const defaultRenderRowTr = (trProps) => (_jsx("tr", { ...trProps }));
29
+ function getTrRenderProps(row, virtualItem) {
30
+ const index = virtualItem ? virtualItem.index : row.index;
31
+ return {
32
+ // index is 0-indexed, so odd rows are even indices
33
+ className: index % 2 === 0 ? 'odd' : '',
34
+ children: row
35
+ .getVisibleCells()
36
+ .map((cell) => _jsx(TableRowCell, { cell: cell }, cell.id)),
37
+ };
15
38
  }
16
39
  //# sourceMappingURL=table_body.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"table_body.js","sourceRoot":"","sources":["../../../src/components/table/table_body.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAWnD,MAAM,UAAU,SAAS,CAAwB,KAA4B;IAC3E,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,kBAAkB,EAAE,GAAG,KAAK,CAAC;IACzD,OAAO,CACL,0BACG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CACjB,KAAC,QAAQ,cACN,WAAW,CAAC;gBACX,GAAG;gBACH,QAAQ,EAAE,GAAG;qBACV,eAAe,EAAE;qBACjB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAC,YAAY,IAAe,IAAI,EAAE,IAAI,IAAnB,IAAI,CAAC,EAAE,CAAgB,CAAC;aAC7D,CAAC,IANW,GAAG,CAAC,EAAE,CAOV,CACZ,CAAC,GACI,CACT,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CACzB,KAAqC;IAErC,OAAO,uBAAK,KAAK,CAAC,QAAQ,GAAM,CAAC;AACnC,CAAC"}
1
+ {"version":3,"file":"table_body.js","sourceRoot":"","sources":["../../../src/components/table/table_body.tsx"],"names":[],"mappings":"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"}
@@ -1,7 +1,9 @@
1
1
  import type { Header, RowData } from '@tanstack/react-table';
2
+ import type { HeaderCellRenderer } from './table_header_cell.js';
2
3
  interface TableHeaderProps<TData extends RowData> {
3
4
  headers: Array<Header<TData, unknown>>;
4
5
  sticky: boolean;
6
+ renderHeaderCell?: HeaderCellRenderer<TData>;
5
7
  }
6
8
  export declare function TableHeader<TData extends RowData>(props: TableHeaderProps<TData>): import("react/jsx-runtime").JSX.Element;
7
9
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"table_header.d.ts","sourceRoot":"","sources":["../../../src/components/table/table_header.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAY7D,UAAU,gBAAgB,CAAC,KAAK,SAAS,OAAO;IAC9C,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IACvC,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,WAAW,CAAC,KAAK,SAAS,OAAO,EAC/C,KAAK,EAAE,gBAAgB,CAAC,KAAK,CAAC,2CAY/B"}
1
+ {"version":3,"file":"table_header.d.ts","sourceRoot":"","sources":["../../../src/components/table/table_header.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAG7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAUjE,UAAU,gBAAgB,CAAC,KAAK,SAAS,OAAO;IAC9C,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IACvC,MAAM,EAAE,OAAO,CAAC;IAChB,gBAAgB,CAAC,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;CAC9C;AAED,wBAAgB,WAAW,CAAC,KAAK,SAAS,OAAO,EAC/C,KAAK,EAAE,gBAAgB,CAAC,KAAK,CAAC,2CAgB/B"}
@@ -7,7 +7,7 @@ const headerStyle = {
7
7
  backgroundColor: 'white',
8
8
  };
9
9
  export function TableHeader(props) {
10
- const { headers, sticky } = props;
11
- return (_jsx("thead", { style: sticky ? headerStyle : undefined, children: _jsx("tr", { children: headers.map((header) => (_jsx(TableHeaderCell, { header: header }, header.id))) }) }));
10
+ const { headers, sticky, renderHeaderCell } = props;
11
+ return (_jsx("thead", { style: sticky ? headerStyle : undefined, children: _jsx("tr", { children: headers.map((header) => (_jsx(TableHeaderCell, { header: header, renderHeaderCell: renderHeaderCell }, header.id))) }) }));
12
12
  }
13
13
  //# sourceMappingURL=table_header.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"table_header.js","sourceRoot":"","sources":["../../../src/components/table/table_header.tsx"],"names":[],"mappings":";AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,WAAW,GAAkB;IACjC,QAAQ,EAAE,QAAQ;IAClB,GAAG,EAAE,CAAC;IACN,MAAM,EAAE,EAAE;IACV,eAAe,EAAE,OAAO;CACzB,CAAC;AAOF,MAAM,UAAU,WAAW,CACzB,KAA8B;IAE9B,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAClC,OAAO,CACL,gBAAO,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,YAC5C,uBACG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CACvB,KAAC,eAAe,IAAiB,MAAM,EAAE,MAAM,IAAzB,MAAM,CAAC,EAAE,CAAoB,CACpD,CAAC,GACC,GACC,CACT,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"table_header.js","sourceRoot":"","sources":["../../../src/components/table/table_header.tsx"],"names":[],"mappings":";AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,WAAW,GAAkB;IACjC,QAAQ,EAAE,QAAQ;IAClB,GAAG,EAAE,CAAC;IACN,MAAM,EAAE,EAAE;IACV,eAAe,EAAE,OAAO;CACzB,CAAC;AAQF,MAAM,UAAU,WAAW,CACzB,KAA8B;IAE9B,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,KAAK,CAAC;IACpD,OAAO,CACL,gBAAO,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,YAC5C,uBACG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CACvB,KAAC,eAAe,IAEd,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,gBAAgB,IAF7B,MAAM,CAAC,EAAE,CAGd,CACH,CAAC,GACC,GACC,CACT,CAAC;AACJ,CAAC"}
@@ -1,7 +1,11 @@
1
1
  import type { Header, RowData } from '@tanstack/react-table';
2
+ import type { HTMLAttributes, ReactNode } from 'react';
3
+ type ThProps = Pick<HTMLAttributes<HTMLTableCellElement>, 'style' | 'onClick' | 'children'>;
4
+ export type HeaderCellRenderer<TData extends RowData> = (thProps: ThProps, header: Header<TData, unknown>) => ReactNode;
2
5
  interface TableHeaderCellProps<TData extends RowData> {
3
6
  header: Header<TData, unknown>;
7
+ renderHeaderCell?: HeaderCellRenderer<TData>;
4
8
  }
5
- export declare function TableHeaderCell<TData extends RowData>(props: TableHeaderCellProps<TData>): import("react/jsx-runtime").JSX.Element;
9
+ export declare function TableHeaderCell<TData extends RowData>(props: TableHeaderCellProps<TData>): string | number | boolean | Iterable<ReactNode> | import("react/jsx-runtime").JSX.Element | null | undefined;
6
10
  export {};
7
11
  //# sourceMappingURL=table_header_cell.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"table_header_cell.d.ts","sourceRoot":"","sources":["../../../src/components/table/table_header_cell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAI7D,UAAU,oBAAoB,CAAC,KAAK,SAAS,OAAO;IAClD,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,wBAAgB,eAAe,CAAC,KAAK,SAAS,OAAO,EACnD,KAAK,EAAE,oBAAoB,CAAC,KAAK,CAAC,2CA6BnC"}
1
+ {"version":3,"file":"table_header_cell.d.ts","sourceRoot":"","sources":["../../../src/components/table/table_header_cell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,KAAK,EAAiB,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEtE,KAAK,OAAO,GAAG,IAAI,CACjB,cAAc,CAAC,oBAAoB,CAAC,EACpC,OAAO,GAAG,SAAS,GAAG,UAAU,CACjC,CAAC;AAEF,MAAM,MAAM,kBAAkB,CAAC,KAAK,SAAS,OAAO,IAAI,CACtD,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,KAC3B,SAAS,CAAC;AAEf,UAAU,oBAAoB,CAAC,KAAK,SAAS,OAAO;IAClD,MAAM,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC/B,gBAAgB,CAAC,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;CAC9C;AAED,wBAAgB,eAAe,CAAC,KAAK,SAAS,OAAO,EACnD,KAAK,EAAE,oBAAoB,CAAC,KAAK,CAAC,gHASnC"}
@@ -1,19 +1,27 @@
1
- import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { flexRender } from '@tanstack/react-table';
3
3
  export function TableHeaderCell(props) {
4
- const { header } = props;
5
- const column = header.column;
6
- const canSort = column.getCanSort();
7
- const sorted = column.getIsSorted();
4
+ const { header, renderHeaderCell } = props;
5
+ const thProps = getThProps(header);
6
+ if (renderHeaderCell) {
7
+ return renderHeaderCell(thProps, header);
8
+ }
9
+ return _jsx("th", { ...thProps });
10
+ }
11
+ function getThProps(header) {
12
+ const sorted = header.column.getIsSorted();
13
+ const canSort = header.column.getCanSort();
8
14
  const style = {
9
15
  position: 'relative',
10
16
  cursor: canSort ? 'pointer' : undefined,
11
17
  };
12
- return (_jsx("th", { style: style, onClick: canSort ? column.getToggleSortingHandler() : undefined, children: _jsxs("div", { style: { display: 'flex', flexDirection: 'row', gap: '5px' }, children: [flexRender(header.column.columnDef.header, header.getContext()), sorted
13
- ? {
14
- asc: '🔼',
15
- desc: '🔽',
16
- }[sorted]
17
- : null] }) }));
18
+ const onClick = canSort ? header.column.getToggleSortingHandler() : undefined;
19
+ const children = (_jsxs("div", { style: { display: 'flex', flexDirection: 'row', gap: '5px' }, children: [_jsx("div", { children: flexRender(header.column.columnDef.header, header.getContext()) }), sorted
20
+ ? {
21
+ asc: '🔼',
22
+ desc: '🔽',
23
+ }[sorted]
24
+ : null] }));
25
+ return { style, children, onClick };
18
26
  }
19
27
  //# sourceMappingURL=table_header_cell.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"table_header_cell.js","sourceRoot":"","sources":["../../../src/components/table/table_header_cell.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAOnD,MAAM,UAAU,eAAe,CAC7B,KAAkC;IAElC,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IACzB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAE7B,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IAEpC,MAAM,KAAK,GAAkB;QAC3B,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;KACxC,CAAC;IAEF,OAAO,CACL,aACE,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,uBAAuB,EAAE,CAAC,CAAC,CAAC,SAAS,YAE/D,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,aAC9D,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,EAC/D,MAAM;oBACL,CAAC,CAAC;wBACE,GAAG,EAAE,IAAI;wBACT,IAAI,EAAE,IAAI;qBACX,CAAC,MAAM,CAAC;oBACX,CAAC,CAAC,IAAI,IACJ,GACH,CACN,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"table_header_cell.js","sourceRoot":"","sources":["../../../src/components/table/table_header_cell.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAkBnD,MAAM,UAAU,eAAe,CAC7B,KAAkC;IAElC,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,KAAK,CAAC;IAC3C,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IAEnC,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,gBAAQ,OAAO,GAAI,CAAC;AAC7B,CAAC;AAED,SAAS,UAAU,CACjB,MAA8B;IAE9B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAkB;QAC3B,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;KACxC,CAAC;IACF,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,uBAAuB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9E,MAAM,QAAQ,GAAG,CACf,eAAK,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,aAC/D,wBACG,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,GAC5D,EACL,MAAM;gBACL,CAAC,CAAC;oBACE,GAAG,EAAE,IAAI;oBACT,IAAI,EAAE,IAAI;iBACX,CAAC,MAAM,CAAC;gBACX,CAAC,CAAC,IAAI,IACJ,CACP,CAAC;IAEF,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AACtC,CAAC"}
@@ -1,18 +1,66 @@
1
1
  /** @jsxImportSource @emotion/react */
2
2
  import type { RowData, TableOptions } from '@tanstack/react-table';
3
3
  import type { TableHTMLAttributes } from 'react';
4
+ import type { HeaderCellRenderer } from './table_header_cell.js';
4
5
  import type { TableColumnDef, TableRowTrRenderer } from './table_utils.js';
5
- export interface TableProps<TData extends RowData> {
6
+ interface TableBaseProps<TData extends RowData> {
6
7
  data: TData[];
8
+ /**
9
+ * Tanstack table definition of columns in the table.
10
+ */
7
11
  columns: Array<TableColumnDef<TData, any>>;
12
+ /**
13
+ * Show borders between each cell and row of the table.
14
+ */
8
15
  bordered?: boolean;
16
+ /**
17
+ * Reduce the padding around table cells.
18
+ */
9
19
  compact?: boolean;
20
+ /**
21
+ * When hovering over a row, change its background color and set the pointer
22
+ * to be a cursor.
23
+ */
10
24
  interactive?: boolean;
25
+ /**
26
+ * Alternate between gray and white background for each row.
27
+ */
11
28
  striped?: boolean;
29
+ /**
30
+ * Enable header rows which stick to the top of the table.
31
+ */
12
32
  stickyHeader?: boolean;
33
+ /**
34
+ * Use virtualized rows to optimize rendering.
35
+ * When virtualizing rows, and in order to prevent layout shifts,
36
+ * it is recommended that all columns have a fixed width.
37
+ */
38
+ virtualizeRows?: boolean;
13
39
  reactTable?: Omit<TableOptions<TData>, 'data' | 'columns' | 'getCoreRowModel' | 'getSortedRowModel'>;
14
40
  tableProps?: Omit<TableHTMLAttributes<HTMLTableElement>, 'children'>;
41
+ /**
42
+ * Override the default row rendering.
43
+ * Make sure to spread the passed `trProps` onto the rendered `<tr>` element.
44
+ */
15
45
  renderRowTr?: TableRowTrRenderer<TData>;
46
+ /**
47
+ * Override the columns' header cell rendering.
48
+ */
49
+ renderHeaderCell?: HeaderCellRenderer<TData>;
16
50
  }
51
+ interface RegularTableProps<TData extends RowData> extends TableBaseProps<TData> {
52
+ virtualizeRows?: false | undefined;
53
+ }
54
+ interface VirtualizedTableProps<TData extends RowData> extends TableBaseProps<TData> {
55
+ virtualizeRows: true;
56
+ /**
57
+ * For virtualization of the table rows, provide an estimate of the height of each row.
58
+ * @param index The index of the row in the data array.
59
+ * @return The estimated height of the row at the given index.
60
+ */
61
+ estimatedRowHeight: (index: number) => number;
62
+ }
63
+ export type TableProps<TData extends RowData> = RegularTableProps<TData> | VirtualizedTableProps<TData>;
17
64
  export declare function Table<TData extends RowData>(props: TableProps<TData>): import("@emotion/react/jsx-runtime").JSX.Element;
65
+ export {};
18
66
  //# sourceMappingURL=table_root.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"table_root.d.ts","sourceRoot":"","sources":["../../../src/components/table/table_root.tsx"],"names":[],"mappings":"AAAA,sCAAsC;AAGtC,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAMnE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAIjD,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAG3E,MAAM,WAAW,UAAU,CAAC,KAAK,SAAS,OAAO;IAC/C,IAAI,EAAE,KAAK,EAAE,CAAC;IAEd,OAAO,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IAE3C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB,UAAU,CAAC,EAAE,IAAI,CACf,YAAY,CAAC,KAAK,CAAC,EACnB,MAAM,GAAG,SAAS,GAAG,iBAAiB,GAAG,mBAAmB,CAC7D,CAAC;IACF,UAAU,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,UAAU,CAAC,CAAC;IACrE,WAAW,CAAC,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;CACzC;AAED,wBAAgB,KAAK,CAAC,KAAK,SAAS,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,oDAqCpE"}
1
+ {"version":3,"file":"table_root.d.ts","sourceRoot":"","sources":["../../../src/components/table/table_root.tsx"],"names":[],"mappings":"AAAA,sCAAsC;AAItC,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAOnE,OAAO,KAAK,EAAwB,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAKvE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAc3E,UAAU,cAAc,CAAC,KAAK,SAAS,OAAO;IAC5C,IAAI,EAAE,KAAK,EAAE,CAAC;IACd;;OAEG;IAEH,OAAO,EAAE,KAAK,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IAC3C;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB,UAAU,CAAC,EAAE,IAAI,CACf,YAAY,CAAC,KAAK,CAAC,EACnB,MAAM,GAAG,SAAS,GAAG,iBAAiB,GAAG,mBAAmB,CAC7D,CAAC;IACF,UAAU,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,UAAU,CAAC,CAAC;IACrE;;;OAGG;IACH,WAAW,CAAC,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACxC;;OAEG;IACH,gBAAgB,CAAC,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;CAC9C;AAED,UAAU,iBAAiB,CAAC,KAAK,SAAS,OAAO,CAC/C,SAAQ,cAAc,CAAC,KAAK,CAAC;IAC7B,cAAc,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC;CACpC;AAED,UAAU,qBAAqB,CAAC,KAAK,SAAS,OAAO,CACnD,SAAQ,cAAc,CAAC,KAAK,CAAC;IAC7B,cAAc,EAAE,IAAI,CAAC;IACrB;;;;OAIG;IACH,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CAC/C;AAED,MAAM,MAAM,UAAU,CAAC,KAAK,SAAS,OAAO,IACxC,iBAAiB,CAAC,KAAK,CAAC,GACxB,qBAAqB,CAAC,KAAK,CAAC,CAAC;AAEjC,wBAAgB,KAAK,CAAC,KAAK,SAAS,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,oDA6DpE"}
@@ -1,12 +1,25 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "@emotion/react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "@emotion/react/jsx-runtime";
2
2
  /** @jsxImportSource @emotion/react */
3
3
  import { HTMLTable } from '@blueprintjs/core';
4
+ import styled from '@emotion/styled';
4
5
  import { getCoreRowModel, getSortedRowModel, useReactTable, } from '@tanstack/react-table';
6
+ import { useVirtualizer } from '@tanstack/react-virtual';
7
+ import { useRef } from 'react';
5
8
  import { TableBody } from './table_body.js';
6
9
  import { TableHeader } from './table_header.js';
7
10
  import { useTableColumns } from './use_table_columns.js';
11
+ // Blueprint's HTMLTable `striped` prop's implementation is based on nth-child odd / even
12
+ // We cannot use that with virtualization, so we override its implementation here.
13
+ const CustomHTMLTable = styled(HTMLTable, {
14
+ shouldForwardProp: (prop) => prop !== 'striped',
15
+ }) `
16
+ tbody tr.odd td {
17
+ background: ${(props) => props.striped ? 'rgba(143, 153, 168, 0.15)' : 'inherit'};
18
+ }
19
+ `;
8
20
  export function Table(props) {
9
- const { data, columns, bordered = false, compact = false, interactive = false, striped = false, stickyHeader = false, reactTable, tableProps, renderRowTr, } = props;
21
+ const { data, columns, bordered = false, compact = false, interactive = false, striped = false, stickyHeader = false, reactTable, tableProps, renderRowTr, renderHeaderCell, virtualizeRows, } = props;
22
+ const scrollElementRef = useRef(null);
10
23
  const columnDefs = useTableColumns(columns);
11
24
  const table = useReactTable({
12
25
  ...reactTable,
@@ -15,6 +28,23 @@ export function Table(props) {
15
28
  getCoreRowModel: getCoreRowModel(),
16
29
  getSortedRowModel: getSortedRowModel(),
17
30
  });
18
- return (_jsxs(HTMLTable, { bordered: bordered, compact: compact, interactive: interactive, striped: striped, ...tableProps, children: [_jsx(TableHeader, { sticky: stickyHeader, headers: table.getFlatHeaders() }), _jsx(TableBody, { rows: table.getRowModel().rows, renderRowTr: renderRowTr })] }));
31
+ const tanstackVirtualizer = useVirtualizer({
32
+ enabled: virtualizeRows,
33
+ count: data.length,
34
+ getScrollElement: () => scrollElementRef.current,
35
+ estimateSize: (props.virtualizeRows && props.estimatedRowHeight) || (() => 0),
36
+ overscan: 5,
37
+ });
38
+ return (_jsx(Container, { virtualizeRows: virtualizeRows, scrollRef: scrollElementRef, children: _jsxs(CustomHTMLTable, { bordered: bordered, compact: compact, interactive: interactive, striped: striped, ...tableProps, children: [_jsx(TableHeader, { sticky: stickyHeader, headers: table.getFlatHeaders(), renderHeaderCell: renderHeaderCell }), _jsx(TableBody, { rows: table.getRowModel().rows, renderRowTr: renderRowTr, virtualizer: tanstackVirtualizer, virtualizeRows: virtualizeRows })] }) }));
39
+ }
40
+ const ScrollRefDiv = styled.div `
41
+ height: 100%;
42
+ overflow: auto;
43
+ `;
44
+ function Container({ virtualizeRows, scrollRef, children, }) {
45
+ if (virtualizeRows) {
46
+ return _jsx(ScrollRefDiv, { ref: scrollRef, children: children });
47
+ }
48
+ return _jsx(_Fragment, { children: children });
19
49
  }
20
50
  //# sourceMappingURL=table_root.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"table_root.js","sourceRoot":"","sources":["../../../src/components/table/table_root.tsx"],"names":[],"mappings":";AAAA,sCAAsC;AAEtC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,aAAa,GACd,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAqBzD,MAAM,UAAU,KAAK,CAAwB,KAAwB;IACnE,MAAM,EACJ,IAAI,EACJ,OAAO,EAEP,QAAQ,GAAG,KAAK,EAChB,OAAO,GAAG,KAAK,EACf,WAAW,GAAG,KAAK,EACnB,OAAO,GAAG,KAAK,EACf,YAAY,GAAG,KAAK,EAEpB,UAAU,EACV,UAAU,EACV,WAAW,GACZ,GAAG,KAAK,CAAC;IAEV,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,aAAa,CAAQ;QACjC,GAAG,UAAU;QACb,IAAI;QACJ,OAAO,EAAE,UAAU;QACnB,eAAe,EAAE,eAAe,EAAE;QAClC,iBAAiB,EAAE,iBAAiB,EAAE;KACvC,CAAC,CAAC;IAEH,OAAO,CACL,MAAC,SAAS,IACR,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,WAAW,EACxB,OAAO,EAAE,OAAO,KACZ,UAAU,aAEd,KAAC,WAAW,IAAC,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,CAAC,cAAc,EAAE,GAAI,EACtE,KAAC,SAAS,IAAC,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,GAAI,IAC7D,CACb,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"table_root.js","sourceRoot":"","sources":["../../../src/components/table/table_root.tsx"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import type { Cell, RowData } from '@tanstack/react-table';
2
2
  interface TableRowCellProps<TData extends RowData> {
3
3
  cell: Cell<TData, unknown>;
4
+ className?: string;
4
5
  }
5
6
  export declare function TableRowCell<TData extends RowData>(props: TableRowCellProps<TData>): import("react/jsx-runtime").JSX.Element;
6
7
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"table_row_cell.d.ts","sourceRoot":"","sources":["../../../src/components/table/table_row_cell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAG3D,UAAU,iBAAiB,CAAC,KAAK,SAAS,OAAO;IAC/C,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;CAC5B;AAED,wBAAgB,YAAY,CAAC,KAAK,SAAS,OAAO,EAChD,KAAK,EAAE,iBAAiB,CAAC,KAAK,CAAC,2CAShC"}
1
+ {"version":3,"file":"table_row_cell.d.ts","sourceRoot":"","sources":["../../../src/components/table/table_row_cell.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAG3D,UAAU,iBAAiB,CAAC,KAAK,SAAS,OAAO;IAC/C,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,YAAY,CAAC,KAAK,SAAS,OAAO,EAChD,KAAK,EAAE,iBAAiB,CAAC,KAAK,CAAC,2CAShC"}
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
2
  import { flexRender } from '@tanstack/react-table';
3
3
  export function TableRowCell(props) {
4
- const { cell } = props;
5
- return (_jsx("td", { style: { position: 'relative' }, children: flexRender(cell.column.columnDef.cell, cell.getContext()) }));
4
+ const { cell, className } = props;
5
+ return (_jsx("td", { style: { position: 'relative' }, className: className, children: flexRender(cell.column.columnDef.cell, cell.getContext()) }));
6
6
  }
7
7
  //# sourceMappingURL=table_row_cell.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"table_row_cell.js","sourceRoot":"","sources":["../../../src/components/table/table_row_cell.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAMnD,MAAM,UAAU,YAAY,CAC1B,KAA+B;IAE/B,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;IAEvB,OAAO,CACL,aAAI,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,YAChC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,GACvD,CACN,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"table_row_cell.js","sourceRoot":"","sources":["../../../src/components/table/table_row_cell.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAOnD,MAAM,UAAU,YAAY,CAC1B,KAA+B;IAE/B,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAElC,OAAO,CACL,aAAI,KAAK,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,SAAS,EAAE,SAAS,YACtD,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,GACvD,CACN,CAAC;AACJ,CAAC"}
@@ -2,9 +2,9 @@ import type { ColumnDef, Row, RowData } from '@tanstack/react-table';
2
2
  import type { ReactNode } from 'react';
3
3
  export type TableColumnDef<TData extends RowData, TValue = unknown> = ColumnDef<TData, TValue>;
4
4
  export declare function createTableColumnHelper<TData extends RowData>(): import("@tanstack/react-table").ColumnHelper<TData>;
5
- export interface TableRowTrRendererProps<TData extends RowData> {
6
- row: Row<TData>;
5
+ export interface TableRowTrProps {
6
+ className: string;
7
7
  children: ReactNode;
8
8
  }
9
- export type TableRowTrRenderer<TData extends RowData> = (props: TableRowTrRendererProps<TData>) => ReactNode;
9
+ export type TableRowTrRenderer<TData extends RowData> = (trProps: TableRowTrProps, row: Row<TData>) => ReactNode;
10
10
  //# sourceMappingURL=table_utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"table_utils.d.ts","sourceRoot":"","sources":["../../../src/components/table/table_utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAErE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,MAAM,cAAc,CAAC,KAAK,SAAS,OAAO,EAAE,MAAM,GAAG,OAAO,IAAI,SAAS,CAC7E,KAAK,EACL,MAAM,CACP,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,KAAK,SAAS,OAAO,yDAE5D;AAED,MAAM,WAAW,uBAAuB,CAAC,KAAK,SAAS,OAAO;IAC5D,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;IAChB,QAAQ,EAAE,SAAS,CAAC;CACrB;AACD,MAAM,MAAM,kBAAkB,CAAC,KAAK,SAAS,OAAO,IAAI,CACtD,KAAK,EAAE,uBAAuB,CAAC,KAAK,CAAC,KAClC,SAAS,CAAC"}
1
+ {"version":3,"file":"table_utils.d.ts","sourceRoot":"","sources":["../../../src/components/table/table_utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAErE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,MAAM,cAAc,CAAC,KAAK,SAAS,OAAO,EAAE,MAAM,GAAG,OAAO,IAAI,SAAS,CAC7E,KAAK,EACL,MAAM,CACP,CAAC;AAEF,wBAAgB,uBAAuB,CAAC,KAAK,SAAS,OAAO,yDAE5D;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,MAAM,MAAM,kBAAkB,CAAC,KAAK,SAAS,OAAO,IAAI,CACtD,OAAO,EAAE,eAAe,EACxB,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,KACZ,SAAS,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-science",
3
- "version": "11.0.0",
3
+ "version": "11.2.0",
4
4
  "description": "React components to build scientific applications UI",
5
5
  "type": "module",
6
6
  "exports": {
@@ -61,6 +61,7 @@
61
61
  "@radix-ui/react-radio-group": "^1.2.1",
62
62
  "@tanstack/react-query": "^5.61.5",
63
63
  "@tanstack/react-table": "^8.20.5",
64
+ "@tanstack/react-virtual": "^3.10.9",
64
65
  "d3-scale-chromatic": "^3.1.0",
65
66
  "immer": "^10.1.1",
66
67
  "lodash": "^4.17.21",
@@ -102,14 +102,13 @@ export function FifoLoggerDialog(props: FifoLoggerDialogProps) {
102
102
  compact
103
103
  bordered
104
104
  tableProps={{ style: { width: '100%' } }}
105
- renderRowTr={({ row, children }) => (
105
+ renderRowTr={(trProps, row) => (
106
106
  <tr
107
+ {...trProps}
107
108
  style={{
108
109
  backgroundColor: rowBackgroundColor[row.original.levelLabel],
109
110
  }}
110
- >
111
- {children}
112
- </tr>
111
+ />
113
112
  )}
114
113
  />
115
114
  </DialogBody>
@@ -1,37 +1,111 @@
1
1
  import type { Row, RowData } from '@tanstack/react-table';
2
+ import type { VirtualItem, Virtualizer } from '@tanstack/react-virtual';
3
+ import { notUndefined } from '@tanstack/react-virtual';
4
+ import type { ReactNode } from 'react';
2
5
  import { Fragment } from 'react';
3
6
 
4
7
  import { TableRowCell } from './table_row_cell.js';
5
- import type {
6
- TableRowTrRenderer,
7
- TableRowTrRendererProps,
8
- } from './table_utils.js';
8
+ import type { TableRowTrProps, TableRowTrRenderer } from './table_utils.js';
9
9
 
10
10
  interface TableBodyProps<TData extends RowData> {
11
11
  rows: Array<Row<TData>>;
12
12
  renderRowTr: TableRowTrRenderer<TData> | undefined;
13
+ virtualizeRows?: boolean;
14
+ virtualizer: Virtualizer<HTMLDivElement, Element>;
13
15
  }
14
16
 
15
17
  export function TableBody<TData extends RowData>(props: TableBodyProps<TData>) {
16
- const { rows, renderRowTr = defaultRenderRowTr } = props;
18
+ const {
19
+ rows,
20
+ renderRowTr = defaultRenderRowTr as TableRowTrRenderer<TData>,
21
+ virtualizer,
22
+ virtualizeRows,
23
+ } = props;
24
+
25
+ if (virtualizeRows) {
26
+ const virtualItems = virtualizer.getVirtualItems();
27
+ const [before, after] =
28
+ virtualItems.length > 0
29
+ ? [
30
+ virtualItems[0].start - virtualizer.options.scrollMargin,
31
+ virtualizer.getTotalSize() - notUndefined(virtualItems.at(-1)).end,
32
+ ]
33
+ : [0, 0];
34
+ return (
35
+ <tbody>
36
+ {before > 0 && (
37
+ <tr>
38
+ <td style={{ height: before }} />
39
+ </tr>
40
+ )}
41
+ {virtualItems.map((virtualItem, index) => (
42
+ <TableRow
43
+ key={virtualItem.index}
44
+ row={rows[virtualItem.index]}
45
+ renderRowTr={(row) => {
46
+ const trProps = getTrRenderProps<TData>(row, {
47
+ ...virtualItem,
48
+ virtualIndex: index,
49
+ });
50
+ return renderRowTr(trProps, row);
51
+ }}
52
+ />
53
+ ))}
54
+ {after > 0 && (
55
+ <tr>
56
+ <td style={{ height: after }} />
57
+ </tr>
58
+ )}
59
+ </tbody>
60
+ );
61
+ }
17
62
  return (
18
63
  <tbody>
19
64
  {rows.map((row) => (
20
- <Fragment key={row.id}>
21
- {renderRowTr({
22
- row,
23
- children: row
24
- .getVisibleCells()
25
- .map((cell) => <TableRowCell key={cell.id} cell={cell} />),
26
- })}
27
- </Fragment>
65
+ <TableRow
66
+ key={row.id}
67
+ row={row}
68
+ renderRowTr={(row) => renderRowTr(getTrRenderProps(row), row)}
69
+ />
28
70
  ))}
29
71
  </tbody>
30
72
  );
31
73
  }
32
74
 
33
- function defaultRenderRowTr<TData extends RowData>(
34
- props: TableRowTrRendererProps<TData>,
35
- ) {
36
- return <tr>{props.children}</tr>;
75
+ type TableRowRenderer<TData extends RowData> = (row: Row<TData>) => ReactNode;
76
+
77
+ function TableRow<TData>({
78
+ row,
79
+ renderRowTr,
80
+ }: {
81
+ row: Row<TData>;
82
+ renderRowTr: TableRowRenderer<TData>;
83
+ }) {
84
+ return <Fragment>{renderRowTr(row)}</Fragment>;
85
+ }
86
+
87
+ const defaultRenderRowTr: TableRowTrRenderer<unknown> = (trProps) => (
88
+ <tr {...trProps} />
89
+ );
90
+
91
+ type RenderRowVirtualItem = VirtualItem & {
92
+ /**
93
+ * The index of the element within the virtual list being currently rendered.
94
+ */
95
+ virtualIndex: number;
96
+ };
97
+
98
+ function getTrRenderProps<TData extends RowData>(
99
+ row: Row<TData>,
100
+ virtualItem?: RenderRowVirtualItem,
101
+ ): TableRowTrProps {
102
+ const index = virtualItem ? virtualItem.index : row.index;
103
+
104
+ return {
105
+ // index is 0-indexed, so odd rows are even indices
106
+ className: index % 2 === 0 ? 'odd' : '',
107
+ children: row
108
+ .getVisibleCells()
109
+ .map((cell) => <TableRowCell key={cell.id} cell={cell} />),
110
+ };
37
111
  }
@@ -1,6 +1,7 @@
1
1
  import type { Header, RowData } from '@tanstack/react-table';
2
2
  import type { CSSProperties } from 'react';
3
3
 
4
+ import type { HeaderCellRenderer } from './table_header_cell.js';
4
5
  import { TableHeaderCell } from './table_header_cell.js';
5
6
 
6
7
  const headerStyle: CSSProperties = {
@@ -13,17 +14,22 @@ const headerStyle: CSSProperties = {
13
14
  interface TableHeaderProps<TData extends RowData> {
14
15
  headers: Array<Header<TData, unknown>>;
15
16
  sticky: boolean;
17
+ renderHeaderCell?: HeaderCellRenderer<TData>;
16
18
  }
17
19
 
18
20
  export function TableHeader<TData extends RowData>(
19
21
  props: TableHeaderProps<TData>,
20
22
  ) {
21
- const { headers, sticky } = props;
23
+ const { headers, sticky, renderHeaderCell } = props;
22
24
  return (
23
25
  <thead style={sticky ? headerStyle : undefined}>
24
26
  <tr>
25
27
  {headers.map((header) => (
26
- <TableHeaderCell key={header.id} header={header} />
28
+ <TableHeaderCell
29
+ key={header.id}
30
+ header={header}
31
+ renderHeaderCell={renderHeaderCell}
32
+ />
27
33
  ))}
28
34
  </tr>
29
35
  </thead>
@@ -1,39 +1,57 @@
1
1
  import type { Header, RowData } from '@tanstack/react-table';
2
2
  import { flexRender } from '@tanstack/react-table';
3
- import type { CSSProperties } from 'react';
3
+ import type { CSSProperties, HTMLAttributes, ReactNode } from 'react';
4
+
5
+ type ThProps = Pick<
6
+ HTMLAttributes<HTMLTableCellElement>,
7
+ 'style' | 'onClick' | 'children'
8
+ >;
9
+
10
+ export type HeaderCellRenderer<TData extends RowData> = (
11
+ thProps: ThProps,
12
+ header: Header<TData, unknown>,
13
+ ) => ReactNode;
4
14
 
5
15
  interface TableHeaderCellProps<TData extends RowData> {
6
16
  header: Header<TData, unknown>;
17
+ renderHeaderCell?: HeaderCellRenderer<TData>;
7
18
  }
8
19
 
9
20
  export function TableHeaderCell<TData extends RowData>(
10
21
  props: TableHeaderCellProps<TData>,
11
22
  ) {
12
- const { header } = props;
13
- const column = header.column;
23
+ const { header, renderHeaderCell } = props;
24
+ const thProps = getThProps(header);
14
25
 
15
- const canSort = column.getCanSort();
16
- const sorted = column.getIsSorted();
26
+ if (renderHeaderCell) {
27
+ return renderHeaderCell(thProps, header);
28
+ }
29
+ return <th {...thProps} />;
30
+ }
17
31
 
32
+ function getThProps<TData extends RowData>(
33
+ header: Header<TData, unknown>,
34
+ ): ThProps {
35
+ const sorted = header.column.getIsSorted();
36
+ const canSort = header.column.getCanSort();
18
37
  const style: CSSProperties = {
19
38
  position: 'relative',
20
39
  cursor: canSort ? 'pointer' : undefined,
21
40
  };
22
-
23
- return (
24
- <th
25
- style={style}
26
- onClick={canSort ? column.getToggleSortingHandler() : undefined}
27
- >
28
- <div style={{ display: 'flex', flexDirection: 'row', gap: '5px' }}>
41
+ const onClick = canSort ? header.column.getToggleSortingHandler() : undefined;
42
+ const children = (
43
+ <div style={{ display: 'flex', flexDirection: 'row', gap: '5px' }}>
44
+ <div>
29
45
  {flexRender(header.column.columnDef.header, header.getContext())}
30
- {sorted
31
- ? {
32
- asc: '🔼',
33
- desc: '🔽',
34
- }[sorted]
35
- : null}
36
46
  </div>
37
- </th>
47
+ {sorted
48
+ ? {
49
+ asc: '🔼',
50
+ desc: '🔽',
51
+ }[sorted]
52
+ : null}
53
+ </div>
38
54
  );
55
+
56
+ return { style, children, onClick };
39
57
  }
@@ -1,38 +1,105 @@
1
1
  /** @jsxImportSource @emotion/react */
2
2
 
3
3
  import { HTMLTable } from '@blueprintjs/core';
4
+ import styled from '@emotion/styled';
4
5
  import type { RowData, TableOptions } from '@tanstack/react-table';
5
6
  import {
6
7
  getCoreRowModel,
7
8
  getSortedRowModel,
8
9
  useReactTable,
9
10
  } from '@tanstack/react-table';
10
- import type { TableHTMLAttributes } from 'react';
11
+ import { useVirtualizer } from '@tanstack/react-virtual';
12
+ import type { ReactNode, RefObject, TableHTMLAttributes } from 'react';
13
+ import { useRef } from 'react';
11
14
 
12
15
  import { TableBody } from './table_body.js';
13
16
  import { TableHeader } from './table_header.js';
17
+ import type { HeaderCellRenderer } from './table_header_cell.js';
14
18
  import type { TableColumnDef, TableRowTrRenderer } from './table_utils.js';
15
19
  import { useTableColumns } from './use_table_columns.js';
16
20
 
17
- export interface TableProps<TData extends RowData> {
21
+ // Blueprint's HTMLTable `striped` prop's implementation is based on nth-child odd / even
22
+ // We cannot use that with virtualization, so we override its implementation here.
23
+ const CustomHTMLTable = styled(HTMLTable, {
24
+ shouldForwardProp: (prop) => prop !== 'striped',
25
+ })`
26
+ tbody tr.odd td {
27
+ background: ${(props) =>
28
+ props.striped ? 'rgba(143, 153, 168, 0.15)' : 'inherit'};
29
+ }
30
+ `;
31
+
32
+ interface TableBaseProps<TData extends RowData> {
18
33
  data: TData[];
34
+ /**
35
+ * Tanstack table definition of columns in the table.
36
+ */
19
37
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
20
38
  columns: Array<TableColumnDef<TData, any>>;
21
-
39
+ /**
40
+ * Show borders between each cell and row of the table.
41
+ */
22
42
  bordered?: boolean;
43
+ /**
44
+ * Reduce the padding around table cells.
45
+ */
23
46
  compact?: boolean;
47
+ /**
48
+ * When hovering over a row, change its background color and set the pointer
49
+ * to be a cursor.
50
+ */
24
51
  interactive?: boolean;
52
+ /**
53
+ * Alternate between gray and white background for each row.
54
+ */
25
55
  striped?: boolean;
56
+ /**
57
+ * Enable header rows which stick to the top of the table.
58
+ */
26
59
  stickyHeader?: boolean;
60
+ /**
61
+ * Use virtualized rows to optimize rendering.
62
+ * When virtualizing rows, and in order to prevent layout shifts,
63
+ * it is recommended that all columns have a fixed width.
64
+ */
65
+ virtualizeRows?: boolean;
27
66
 
28
67
  reactTable?: Omit<
29
68
  TableOptions<TData>,
30
69
  'data' | 'columns' | 'getCoreRowModel' | 'getSortedRowModel'
31
70
  >;
32
71
  tableProps?: Omit<TableHTMLAttributes<HTMLTableElement>, 'children'>;
72
+ /**
73
+ * Override the default row rendering.
74
+ * Make sure to spread the passed `trProps` onto the rendered `<tr>` element.
75
+ */
33
76
  renderRowTr?: TableRowTrRenderer<TData>;
77
+ /**
78
+ * Override the columns' header cell rendering.
79
+ */
80
+ renderHeaderCell?: HeaderCellRenderer<TData>;
81
+ }
82
+
83
+ interface RegularTableProps<TData extends RowData>
84
+ extends TableBaseProps<TData> {
85
+ virtualizeRows?: false | undefined;
34
86
  }
35
87
 
88
+ interface VirtualizedTableProps<TData extends RowData>
89
+ extends TableBaseProps<TData> {
90
+ virtualizeRows: true;
91
+ /**
92
+ * For virtualization of the table rows, provide an estimate of the height of each row.
93
+ * @param index The index of the row in the data array.
94
+ * @return The estimated height of the row at the given index.
95
+ */
96
+ estimatedRowHeight: (index: number) => number;
97
+ }
98
+
99
+ export type TableProps<TData extends RowData> =
100
+ | RegularTableProps<TData>
101
+ | VirtualizedTableProps<TData>;
102
+
36
103
  export function Table<TData extends RowData>(props: TableProps<TData>) {
37
104
  const {
38
105
  data,
@@ -47,8 +114,12 @@ export function Table<TData extends RowData>(props: TableProps<TData>) {
47
114
  reactTable,
48
115
  tableProps,
49
116
  renderRowTr,
117
+ renderHeaderCell,
118
+
119
+ virtualizeRows,
50
120
  } = props;
51
121
 
122
+ const scrollElementRef = useRef<HTMLDivElement>(null);
52
123
  const columnDefs = useTableColumns(columns);
53
124
  const table = useReactTable<TData>({
54
125
  ...reactTable,
@@ -58,16 +129,56 @@ export function Table<TData extends RowData>(props: TableProps<TData>) {
58
129
  getSortedRowModel: getSortedRowModel(),
59
130
  });
60
131
 
132
+ const tanstackVirtualizer = useVirtualizer({
133
+ enabled: virtualizeRows,
134
+ count: data.length,
135
+ getScrollElement: () => scrollElementRef.current,
136
+ estimateSize:
137
+ (props.virtualizeRows && props.estimatedRowHeight) || (() => 0),
138
+ overscan: 5,
139
+ });
140
+
61
141
  return (
62
- <HTMLTable
63
- bordered={bordered}
64
- compact={compact}
65
- interactive={interactive}
66
- striped={striped}
67
- {...tableProps}
68
- >
69
- <TableHeader sticky={stickyHeader} headers={table.getFlatHeaders()} />
70
- <TableBody rows={table.getRowModel().rows} renderRowTr={renderRowTr} />
71
- </HTMLTable>
142
+ <Container virtualizeRows={virtualizeRows} scrollRef={scrollElementRef}>
143
+ <CustomHTMLTable
144
+ bordered={bordered}
145
+ compact={compact}
146
+ interactive={interactive}
147
+ striped={striped}
148
+ {...tableProps}
149
+ >
150
+ <TableHeader
151
+ sticky={stickyHeader}
152
+ headers={table.getFlatHeaders()}
153
+ renderHeaderCell={renderHeaderCell}
154
+ />
155
+ <TableBody
156
+ rows={table.getRowModel().rows}
157
+ renderRowTr={renderRowTr}
158
+ virtualizer={tanstackVirtualizer}
159
+ virtualizeRows={virtualizeRows}
160
+ />
161
+ </CustomHTMLTable>
162
+ </Container>
72
163
  );
73
164
  }
165
+
166
+ const ScrollRefDiv = styled.div`
167
+ height: 100%;
168
+ overflow: auto;
169
+ `;
170
+
171
+ function Container({
172
+ virtualizeRows,
173
+ scrollRef,
174
+ children,
175
+ }: {
176
+ virtualizeRows?: boolean;
177
+ children: ReactNode;
178
+ scrollRef: RefObject<HTMLDivElement>;
179
+ }) {
180
+ if (virtualizeRows) {
181
+ return <ScrollRefDiv ref={scrollRef}>{children}</ScrollRefDiv>;
182
+ }
183
+ return <>{children}</>;
184
+ }
@@ -3,15 +3,16 @@ import { flexRender } from '@tanstack/react-table';
3
3
 
4
4
  interface TableRowCellProps<TData extends RowData> {
5
5
  cell: Cell<TData, unknown>;
6
+ className?: string;
6
7
  }
7
8
 
8
9
  export function TableRowCell<TData extends RowData>(
9
10
  props: TableRowCellProps<TData>,
10
11
  ) {
11
- const { cell } = props;
12
+ const { cell, className } = props;
12
13
 
13
14
  return (
14
- <td style={{ position: 'relative' }}>
15
+ <td style={{ position: 'relative' }} className={className}>
15
16
  {flexRender(cell.column.columnDef.cell, cell.getContext())}
16
17
  </td>
17
18
  );
@@ -11,10 +11,12 @@ export function createTableColumnHelper<TData extends RowData>() {
11
11
  return createColumnHelper<TData>();
12
12
  }
13
13
 
14
- export interface TableRowTrRendererProps<TData extends RowData> {
15
- row: Row<TData>;
14
+ export interface TableRowTrProps {
15
+ className: string;
16
16
  children: ReactNode;
17
17
  }
18
+
18
19
  export type TableRowTrRenderer<TData extends RowData> = (
19
- props: TableRowTrRendererProps<TData>,
20
+ trProps: TableRowTrProps,
21
+ row: Row<TData>,
20
22
  ) => ReactNode;