@equinor/eds-data-grid-react 0.8.1 → 0.9.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.
@@ -513,13 +513,18 @@ function TableRow({
513
513
  onCellClick,
514
514
  onClick,
515
515
  onDoubleClick,
516
- onContextMenu
516
+ onContextMenu,
517
+ rowVirtualizer,
518
+ virtualItem
517
519
  }) {
518
520
  const {
519
521
  rowClass,
520
522
  rowStyle
521
523
  } = useTableContext();
522
524
  return /*#__PURE__*/jsxRuntime.jsx(StyledTableRow, {
525
+ "data-index": virtualItem?.index,
526
+ ref: node => node && rowVirtualizer?.measureElement(node) //measure dynamic row height
527
+ ,
523
528
  style: {
524
529
  ...(rowStyle?.(row) ?? {})
525
530
  },
@@ -578,6 +583,12 @@ function logDevelopmentWarningOfPropUse(deprecatedProps) {
578
583
  }
579
584
  }
580
585
  }
586
+ const isFirefox = () => {
587
+ return typeof window !== 'undefined' && navigator.userAgent.indexOf('Firefox') !== -1;
588
+ };
589
+ const getMeasureElementHandler = () => {
590
+ return isFirefox() ? undefined : element => element?.getBoundingClientRect().height;
591
+ };
581
592
 
582
593
  /* eslint-disable @typescript-eslint/no-non-null-assertion */
583
594
  function EdsDataGridInner({
@@ -890,7 +901,9 @@ function EdsDataGridInner({
890
901
  const virtualizer = reactVirtual.useVirtualizer({
891
902
  count: table.getRowModel().rows.length,
892
903
  getScrollElement: () => parentRef.current,
893
- estimateSize
904
+ estimateSize,
905
+ //measure dynamic row height, except in firefox because it measures table border height incorrectly
906
+ measureElement: getMeasureElementHandler()
894
907
  });
895
908
  if (rowVirtualizerInstanceRef) rowVirtualizerInstanceRef.current = virtualizer;
896
909
 
@@ -977,6 +990,8 @@ function EdsDataGridInner({
977
990
  }), virtualRows.map(virtualItem => {
978
991
  const row = table.getRowModel().rows[virtualItem.index];
979
992
  return /*#__PURE__*/jsxRuntime.jsx(TableRow, {
993
+ virtualItem: virtualItem,
994
+ rowVirtualizer: virtualizer,
980
995
  row: row,
981
996
  onContextMenu: onRowContextMenu ? event => onRowContextMenu(row, event) : undefined,
982
997
  onClick: onRowClick ? event => onRowClick(row, event) : undefined,
@@ -7,7 +7,7 @@ import { TableProvider } from './EdsDataGridContext.js';
7
7
  import { TableHeaderRow } from './components/TableHeaderRow.js';
8
8
  import { TableFooterRow } from './components/TableFooterRow.js';
9
9
  import { TableRow } from './components/TableRow.js';
10
- import { addPxSuffixIfInputHasNoPrefix, logDevelopmentWarningOfPropUse } from './utils.js';
10
+ import { addPxSuffixIfInputHasNoPrefix, logDevelopmentWarningOfPropUse, getMeasureElementHandler } from './utils.js';
11
11
  import { mergeRefs } from '@equinor/eds-utils';
12
12
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
13
13
 
@@ -322,7 +322,9 @@ function EdsDataGridInner({
322
322
  const virtualizer = useVirtualizer({
323
323
  count: table.getRowModel().rows.length,
324
324
  getScrollElement: () => parentRef.current,
325
- estimateSize
325
+ estimateSize,
326
+ //measure dynamic row height, except in firefox because it measures table border height incorrectly
327
+ measureElement: getMeasureElementHandler()
326
328
  });
327
329
  if (rowVirtualizerInstanceRef) rowVirtualizerInstanceRef.current = virtualizer;
328
330
 
@@ -409,6 +411,8 @@ function EdsDataGridInner({
409
411
  }), virtualRows.map(virtualItem => {
410
412
  const row = table.getRowModel().rows[virtualItem.index];
411
413
  return /*#__PURE__*/jsx(TableRow, {
414
+ virtualItem: virtualItem,
415
+ rowVirtualizer: virtualizer,
412
416
  row: row,
413
417
  onContextMenu: onRowContextMenu ? event => onRowContextMenu(row, event) : undefined,
414
418
  onClick: onRowClick ? event => onRowClick(row, event) : undefined,
@@ -9,13 +9,18 @@ function TableRow({
9
9
  onCellClick,
10
10
  onClick,
11
11
  onDoubleClick,
12
- onContextMenu
12
+ onContextMenu,
13
+ rowVirtualizer,
14
+ virtualItem
13
15
  }) {
14
16
  const {
15
17
  rowClass,
16
18
  rowStyle
17
19
  } = useTableContext();
18
20
  return /*#__PURE__*/jsx(StyledTableRow, {
21
+ "data-index": virtualItem?.index,
22
+ ref: node => node && rowVirtualizer?.measureElement(node) //measure dynamic row height
23
+ ,
19
24
  style: {
20
25
  ...(rowStyle?.(row) ?? {})
21
26
  },
package/dist/esm/utils.js CHANGED
@@ -36,5 +36,11 @@ function logDevelopmentWarningOfPropUse(deprecatedProps) {
36
36
  }
37
37
  }
38
38
  }
39
+ const isFirefox = () => {
40
+ return typeof window !== 'undefined' && navigator.userAgent.indexOf('Firefox') !== -1;
41
+ };
42
+ const getMeasureElementHandler = () => {
43
+ return isFirefox() ? undefined : element => element?.getBoundingClientRect().height;
44
+ };
39
45
 
40
- export { addPxSuffixIfInputHasNoPrefix, isNumberOnlyString, logDevelopmentWarningOfPropUse };
46
+ export { addPxSuffixIfInputHasNoPrefix, getMeasureElementHandler, isFirefox, isNumberOnlyString, logDevelopmentWarningOfPropUse };
@@ -0,0 +1,12 @@
1
+ import React, { ButtonHTMLAttributes } from 'react';
2
+ export type ClickableCellProps = {
3
+ /** Cell content */
4
+ children: React.ReactNode;
5
+ /** Click handler */
6
+ onClick: () => void;
7
+ /** Accessible label for screen readers */
8
+ ariaLabel: string;
9
+ /** Indicates if the cell is selected */
10
+ isSelected?: boolean;
11
+ } & Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'onClick' | 'children'>;
12
+ export declare function ClickableCell({ children, onClick, ariaLabel, isSelected, ...rest }: ClickableCellProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import type { ComponentToken } from '@equinor/eds-tokens';
2
+ export type ClickableCellToken = ComponentToken;
3
+ export declare const clickableCell: ClickableCellToken;
@@ -0,0 +1 @@
1
+ export { ClickableCell, type ClickableCellProps } from './ClickableCell';
@@ -1,9 +1,12 @@
1
1
  import { Row } from '@tanstack/react-table';
2
2
  import { HTMLAttributes } from 'react';
3
3
  import { EdsDataGridProps } from '../EdsDataGridProps';
4
+ import { VirtualItem, Virtualizer } from '@tanstack/react-virtual';
4
5
  type Props<T> = {
5
6
  row: Row<T>;
6
7
  onCellClick?: EdsDataGridProps<T>['onCellClick'];
8
+ rowVirtualizer?: Virtualizer<HTMLDivElement, HTMLTableRowElement>;
9
+ virtualItem?: VirtualItem;
7
10
  } & HTMLAttributes<HTMLTableRowElement>;
8
- export declare function TableRow<T>({ row, onCellClick, onClick, onDoubleClick, onContextMenu, }: Props<T>): import("react/jsx-runtime").JSX.Element;
11
+ export declare function TableRow<T>({ row, onCellClick, onClick, onDoubleClick, onContextMenu, rowVirtualizer, virtualItem, }: Props<T>): import("react/jsx-runtime").JSX.Element;
9
12
  export {};
@@ -20,3 +20,5 @@ export declare function logDevelopmentWarningOfPropUse(deprecatedProps: Record<s
20
20
  value: unknown;
21
21
  mitigationInfo?: string;
22
22
  }>): void;
23
+ export declare const isFirefox: () => boolean;
24
+ export declare const getMeasureElementHandler: () => (element: HTMLTableRowElement) => number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@equinor/eds-data-grid-react",
3
- "version": "0.8.1",
3
+ "version": "0.9.0",
4
4
  "description": "A feature-rich data-grid written in React, implementing the Equinor Design System",
5
5
  "license": "MIT",
6
6
  "types": "dist/types/index.d.ts",
@@ -21,10 +21,10 @@
21
21
  },
22
22
  "dependencies": {
23
23
  "@tanstack/react-table": "^8.21.3",
24
- "@tanstack/react-virtual": "^3.13.8",
24
+ "@tanstack/react-virtual": "^3.13.12",
25
25
  "@equinor/eds-icons": "^0.22.0",
26
26
  "@equinor/eds-tokens": "0.9.2",
27
- "@equinor/eds-utils": "^0.8.7"
27
+ "@equinor/eds-utils": "^0.8.8"
28
28
  },
29
29
  "devDependencies": {
30
30
  "@rollup/plugin-babel": "^6.0.4",
@@ -54,7 +54,7 @@
54
54
  "jest-styled-components": "^7.2.0",
55
55
  "js-file-download": "^0.4.12",
56
56
  "postcss": "^8.5.3",
57
- "ramda": "^0.30.1",
57
+ "ramda": "^0.31.3",
58
58
  "react": "^18.3.1",
59
59
  "react-dom": "^18.3.1",
60
60
  "react-hook-form": "^7.56.1",
@@ -62,8 +62,8 @@
62
62
  "rollup-plugin-delete": "^2.2.0",
63
63
  "rollup-plugin-postcss": "^4.0.2",
64
64
  "storybook": "^8.6.14",
65
- "styled-components": "6.1.18",
66
- "ts-jest": "29.3.3",
65
+ "styled-components": "6.1.19",
66
+ "ts-jest": "29.4.0",
67
67
  "ts-node": "10.9.2",
68
68
  "tsc-watch": "^6.2.1",
69
69
  "typescript": "~5.8.3"