@equinor/eds-data-grid-react 0.0.1 → 0.1.0-beta.2

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.
@@ -0,0 +1,632 @@
1
+ 'use strict';
2
+
3
+ var _objectSpread = require('@babel/runtime/helpers/objectSpread2');
4
+ var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
5
+ var reactTable = require('@tanstack/react-table');
6
+ var edsCoreReact = require('@equinor/eds-core-react');
7
+ var react = require('react');
8
+ var edsIcons = require('@equinor/eds-icons');
9
+ var _objectWithoutProperties = require('@babel/runtime/helpers/objectWithoutProperties');
10
+ var jsxRuntime = require('react/jsx-runtime');
11
+ var styled = require('styled-components');
12
+ var edsTokens = require('@equinor/eds-tokens');
13
+ var reactVirtual = require('@tanstack/react-virtual');
14
+
15
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
16
+
17
+ var _objectSpread__default = /*#__PURE__*/_interopDefault(_objectSpread);
18
+ var _slicedToArray__default = /*#__PURE__*/_interopDefault(_slicedToArray);
19
+ var _objectWithoutProperties__default = /*#__PURE__*/_interopDefault(_objectWithoutProperties);
20
+ var styled__default = /*#__PURE__*/_interopDefault(styled);
21
+
22
+ var _excluded$1 = ["children"];
23
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
24
+ var EdsDataGridContext = /*#__PURE__*/react.createContext({
25
+ enableSorting: false,
26
+ stickyHeader: false,
27
+ enableColumnFiltering: false,
28
+ table: null
29
+ });
30
+ function TableProvider(_ref) {
31
+ var children = _ref.children,
32
+ props = _objectWithoutProperties__default.default(_ref, _excluded$1);
33
+ return /*#__PURE__*/jsxRuntime.jsx(EdsDataGridContext.Provider, {
34
+ value: props,
35
+ children: children
36
+ });
37
+ }
38
+ var useTableContext = function useTableContext() {
39
+ return react.useContext(EdsDataGridContext);
40
+ };
41
+
42
+ var _excluded = ["value", "values", "onChange", "debounce"];
43
+ // File ignored, as relevant actions are covered via Filter.test.tsx
44
+ function DebouncedInput(_ref) {
45
+ var _props$placeholder, _props$placeholder2;
46
+ var initialValue = _ref.value,
47
+ values = _ref.values,
48
+ onChange = _ref.onChange,
49
+ _ref$debounce = _ref.debounce,
50
+ debounce = _ref$debounce === void 0 ? 500 : _ref$debounce,
51
+ props = _objectWithoutProperties__default.default(_ref, _excluded);
52
+ var _useState = react.useState(initialValue),
53
+ _useState2 = _slicedToArray__default.default(_useState, 2),
54
+ value = _useState2[0],
55
+ setValue = _useState2[1];
56
+ react.useEffect(function () {
57
+ setValue(initialValue);
58
+ }, [initialValue]);
59
+ react.useEffect(function () {
60
+ var timeout = setTimeout(function () {
61
+ onChange(value);
62
+ }, debounce);
63
+ return function () {
64
+ return clearTimeout(timeout);
65
+ };
66
+ // eslint-disable-next-line react-hooks/exhaustive-deps
67
+ }, [value]);
68
+ return /*#__PURE__*/jsxRuntime.jsx(edsCoreReact.EdsProvider, {
69
+ density: "compact",
70
+ children: props.type === 'number' ? /*#__PURE__*/jsxRuntime.jsx(edsCoreReact.Input, {
71
+ type: 'number',
72
+ placeholder: (_props$placeholder = props.placeholder) !== null && _props$placeholder !== void 0 ? _props$placeholder : 'Search',
73
+ value: value,
74
+ onChange: function onChange(e) {
75
+ return setValue(e.target.valueAsNumber);
76
+ }
77
+ }) : /*#__PURE__*/jsxRuntime.jsx(edsCoreReact.Autocomplete, {
78
+ options: values,
79
+ multiple: true,
80
+ optionComponent: function optionComponent(opt) {
81
+ return opt === 'NULL_OR_UNDEFINED' ? '<Blank>' : opt;
82
+ },
83
+ "data-testid": 'autocomplete'
84
+ /* eslint-disable-next-line @typescript-eslint/ban-ts-comment */
85
+ // @ts-ignore
86
+ ,
87
+ label: null,
88
+ placeholder: (_props$placeholder2 = props.placeholder) !== null && _props$placeholder2 !== void 0 ? _props$placeholder2 : 'Search',
89
+ onOptionsChange: function onOptionsChange(c) {
90
+ return setValue(c.selectedItems);
91
+ }
92
+ })
93
+ });
94
+ }
95
+
96
+ /* istanbul ignore file */
97
+
98
+ function Filter(_ref) {
99
+ var _table$getPreFiltered, _column$getFacetedMin, _column$getFacetedMin2, _column$getFacetedMin3, _column$getFacetedMin4, _, _column$getFacetedMin5, _column$getFacetedMin6, _column$getFacetedMin7, _column$getFacetedMin8, _column$getFacetedMin9, _column$getFacetedMin10, _2, _column$getFacetedMin11, _column$getFacetedMin12;
100
+ var column = _ref.column,
101
+ table = _ref.table;
102
+ var firstValue = (_table$getPreFiltered = table.getPreFilteredRowModel().flatRows[0]) === null || _table$getPreFiltered === void 0 ? void 0 : _table$getPreFiltered.getValue(column.id);
103
+ var columnFilterValue = column.getFilterValue();
104
+ var sortedUniqueValues = react.useMemo(function () {
105
+ return typeof firstValue === 'number' ? [] : Array.from(column.getFacetedUniqueValues().keys()).sort().map(function (v) {
106
+ return v !== null && v !== void 0 ? v : 'NULL_OR_UNDEFINED';
107
+ });
108
+ },
109
+ // eslint-disable-next-line react-hooks/exhaustive-deps
110
+ [column.getFacetedUniqueValues()]);
111
+ return typeof firstValue === 'number' ? /*#__PURE__*/jsxRuntime.jsxs("div", {
112
+ children: [/*#__PURE__*/jsxRuntime.jsx(DebouncedInput, {
113
+ type: "number",
114
+ values: sortedUniqueValues,
115
+ min: Number((_column$getFacetedMin = (_column$getFacetedMin2 = column.getFacetedMinMaxValues()) === null || _column$getFacetedMin2 === void 0 ? void 0 : _column$getFacetedMin2[0]) !== null && _column$getFacetedMin !== void 0 ? _column$getFacetedMin : ''),
116
+ max: Number((_column$getFacetedMin3 = (_column$getFacetedMin4 = column.getFacetedMinMaxValues()) === null || _column$getFacetedMin4 === void 0 ? void 0 : _column$getFacetedMin4[1]) !== null && _column$getFacetedMin3 !== void 0 ? _column$getFacetedMin3 : ''),
117
+ value: (_ = columnFilterValue === null || columnFilterValue === void 0 ? void 0 : columnFilterValue[0]) !== null && _ !== void 0 ? _ : '',
118
+ onChange: function onChange(value) {
119
+ return column.setFilterValue(function (old) {
120
+ return [value, old === null || old === void 0 ? void 0 : old[1]];
121
+ });
122
+ },
123
+ placeholder: "Min ".concat((_column$getFacetedMin5 = column.getFacetedMinMaxValues()) !== null && _column$getFacetedMin5 !== void 0 && _column$getFacetedMin5[0] ? "(".concat((_column$getFacetedMin6 = column.getFacetedMinMaxValues()) === null || _column$getFacetedMin6 === void 0 ? void 0 : _column$getFacetedMin6[0], ")") : '')
124
+ }), /*#__PURE__*/jsxRuntime.jsx(DebouncedInput, {
125
+ type: "number",
126
+ values: sortedUniqueValues,
127
+ min: Number((_column$getFacetedMin7 = (_column$getFacetedMin8 = column.getFacetedMinMaxValues()) === null || _column$getFacetedMin8 === void 0 ? void 0 : _column$getFacetedMin8[0]) !== null && _column$getFacetedMin7 !== void 0 ? _column$getFacetedMin7 : ''),
128
+ max: Number((_column$getFacetedMin9 = (_column$getFacetedMin10 = column.getFacetedMinMaxValues()) === null || _column$getFacetedMin10 === void 0 ? void 0 : _column$getFacetedMin10[1]) !== null && _column$getFacetedMin9 !== void 0 ? _column$getFacetedMin9 : ''),
129
+ value: (_2 = columnFilterValue === null || columnFilterValue === void 0 ? void 0 : columnFilterValue[1]) !== null && _2 !== void 0 ? _2 : '',
130
+ onChange: function onChange(value) {
131
+ return column.setFilterValue(function (old) {
132
+ return [old === null || old === void 0 ? void 0 : old[0], value];
133
+ });
134
+ },
135
+ placeholder: "Max ".concat((_column$getFacetedMin11 = column.getFacetedMinMaxValues()) !== null && _column$getFacetedMin11 !== void 0 && _column$getFacetedMin11[1] ? "(".concat((_column$getFacetedMin12 = column.getFacetedMinMaxValues()) === null || _column$getFacetedMin12 === void 0 ? void 0 : _column$getFacetedMin12[1], ")") : '')
136
+ })]
137
+ }) : /*#__PURE__*/jsxRuntime.jsx(DebouncedInput, {
138
+ type: "text",
139
+ values: sortedUniqueValues,
140
+ value: columnFilterValue !== null && columnFilterValue !== void 0 ? columnFilterValue : '',
141
+ onChange: function onChange(value) {
142
+ return column.setFilterValue(value);
143
+ },
144
+ placeholder: "Search (".concat(column.getFacetedUniqueValues().size, ")"),
145
+ list: column.id + 'list'
146
+ });
147
+ }
148
+
149
+ var getSortLabel = function getSortLabel(sorted) {
150
+ if (sorted) {
151
+ return "".concat(sorted, "ending");
152
+ }
153
+ return 'none';
154
+ };
155
+ var Resizer = styled__default.default.div.withConfig({
156
+ displayName: "TableHeaderCell__Resizer",
157
+ componentId: "sc-1n0j3v0-0"
158
+ })(["transform:", ";opacity:", ";position:absolute;right:0;top:0;height:100%;width:5px;cursor:col-resize;user-select:none;touch-action:none;"], function (props) {
159
+ return props.columnResizeMode === 'onEnd' ? 'translateX(0px)' : 'none';
160
+ }, function (props) {
161
+ return props.isResizing ? 1 : 0;
162
+ });
163
+ var Cell = styled__default.default(edsCoreReact.Table.Cell).withConfig({
164
+ displayName: "TableHeaderCell__Cell",
165
+ componentId: "sc-1n0j3v0-1"
166
+ })(["font-weight:bold;height:30px;position:", ";&:hover ", "{background:", ";opacity:1;}"], function (p) {
167
+ return p.sticky ? 'sticky' : 'relative';
168
+ }, Resizer, edsTokens.tokens.colors.interactive.primary__hover.rgba);
169
+ function TableHeaderCell(_ref) {
170
+ var _asc$desc;
171
+ var header = _ref.header,
172
+ columnResizeMode = _ref.columnResizeMode;
173
+ var ctx = useTableContext();
174
+ var table = ctx.table;
175
+ return header.isPlaceholder ? /*#__PURE__*/jsxRuntime.jsx(Cell, {
176
+ sticky: ctx.stickyHeader,
177
+ className: ctx.headerClass ? ctx.headerClass(header.column) : '',
178
+ style: ctx.headerStyle ? ctx.headerStyle(header.column) : {},
179
+ "aria-hidden": true
180
+ }) : /*#__PURE__*/jsxRuntime.jsxs(Cell, {
181
+ sticky: ctx.stickyHeader,
182
+ className: ctx.headerClass ? ctx.headerClass(header.column) : '',
183
+ "aria-sort": getSortLabel(header.column.getIsSorted()),
184
+ onClick: header.column.getToggleSortingHandler(),
185
+ key: header.id,
186
+ colSpan: header.colSpan,
187
+ style: _objectSpread__default.default({
188
+ width: header.getSize(),
189
+ verticalAlign: ctx.enableColumnFiltering ? 'baseline' : 'middle'
190
+ }, ctx.headerStyle ? ctx.headerStyle(header.column) : {}),
191
+ children: [/*#__PURE__*/jsxRuntime.jsxs(jsxRuntime.Fragment, {
192
+ children: [/*#__PURE__*/jsxRuntime.jsxs("div", {
193
+ style: {
194
+ display: 'flex',
195
+ flexDirection: 'column'
196
+ },
197
+ children: [/*#__PURE__*/jsxRuntime.jsx("span", {
198
+ className: "table-header-cell-label",
199
+ children: reactTable.flexRender(header.column.columnDef.header, header.getContext())
200
+ }), header.column.getCanFilter() ?
201
+ /*#__PURE__*/
202
+ // Supressing this warning - div is not interactive, but prevents propagation of events to avoid unintended sorting
203
+ // eslint-disable-next-line jsx-a11y/click-events-have-key-events,jsx-a11y/no-static-element-interactions
204
+ jsxRuntime.jsx("div", {
205
+ onClick: function onClick(e) {
206
+ return e.stopPropagation();
207
+ },
208
+ children: /*#__PURE__*/jsxRuntime.jsx(Filter, {
209
+ column: header.column,
210
+ table: table
211
+ })
212
+ }) : null]
213
+ }), (_asc$desc = {
214
+ asc: /*#__PURE__*/jsxRuntime.jsx(edsCoreReact.Icon, {
215
+ data: edsIcons.arrow_up
216
+ }),
217
+ desc: /*#__PURE__*/jsxRuntime.jsx(edsCoreReact.Icon, {
218
+ data: edsIcons.arrow_down
219
+ })
220
+ }[header.column.getIsSorted()]) !== null && _asc$desc !== void 0 ? _asc$desc : null]
221
+ }), columnResizeMode && /*#__PURE__*/jsxRuntime.jsx(Resizer, {
222
+ onClick: function onClick(e) {
223
+ return e.stopPropagation();
224
+ },
225
+ onMouseDown: header.getResizeHandler(),
226
+ onTouchStart: header.getResizeHandler(),
227
+ isResizing: header.column.getIsResizing(),
228
+ columnResizeMode: columnResizeMode,
229
+ className: 'resize-handle',
230
+ "data-testid": 'resize-handle'
231
+ })]
232
+ });
233
+ }
234
+
235
+ function TableHeaderRow(_ref) {
236
+ var headerGroup = _ref.headerGroup,
237
+ columnResizeMode = _ref.columnResizeMode,
238
+ deltaOffset = _ref.deltaOffset,
239
+ table = _ref.table;
240
+ return /*#__PURE__*/jsxRuntime.jsx(edsCoreReact.Table.Row, {
241
+ children: headerGroup.headers.map(function (header) {
242
+ return /*#__PURE__*/jsxRuntime.jsx(TableHeaderCell, {
243
+ header: header,
244
+ table: table,
245
+ columnResizeMode: columnResizeMode,
246
+ deltaOffset: deltaOffset
247
+ }, header.id);
248
+ })
249
+ });
250
+ }
251
+
252
+ function TableBodyCell(_ref) {
253
+ var _cellStyle;
254
+ var cell = _ref.cell;
255
+ var _useTableContext = useTableContext(),
256
+ cellClass = _useTableContext.cellClass,
257
+ cellStyle = _useTableContext.cellStyle;
258
+ return /*#__PURE__*/jsxRuntime.jsx(edsCoreReact.Table.Cell, {
259
+ className: cellClass ? cellClass(cell.row, cell.column.id) : '',
260
+ key: cell.id,
261
+ style: _objectSpread__default.default({
262
+ width: cell.column.getSize(),
263
+ maxWidth: cell.column.getSize(),
264
+ overflow: 'hidden',
265
+ whiteSpace: 'nowrap',
266
+ textOverflow: 'ellipsis'
267
+ }, (_cellStyle = cellStyle === null || cellStyle === void 0 ? void 0 : cellStyle(cell.row, cell.column.id)) !== null && _cellStyle !== void 0 ? _cellStyle : {}),
268
+ children: /*#__PURE__*/jsxRuntime.jsx(edsCoreReact.Typography, {
269
+ as: "span",
270
+ group: "table",
271
+ variant: "cell_text",
272
+ children: reactTable.flexRender(cell.column.columnDef.cell, cell.getContext())
273
+ })
274
+ });
275
+ }
276
+
277
+ function TableRow(_ref) {
278
+ var _rowStyle;
279
+ var row = _ref.row;
280
+ var _useTableContext = useTableContext(),
281
+ rowClass = _useTableContext.rowClass,
282
+ rowStyle = _useTableContext.rowStyle;
283
+ return /*#__PURE__*/jsxRuntime.jsx(edsCoreReact.Table.Row, {
284
+ style: _objectSpread__default.default({
285
+ cursor: row.getCanSelect() ? 'pointer' : 'inherit'
286
+ }, (_rowStyle = rowStyle === null || rowStyle === void 0 ? void 0 : rowStyle(row)) !== null && _rowStyle !== void 0 ? _rowStyle : {}),
287
+ className: "".concat(row.getIsSelected() ? 'selected' : '', " ").concat(rowClass === null || rowClass === void 0 ? void 0 : rowClass(row)),
288
+ onClick: function onClick() {
289
+ return row.getCanSelect() ? row.toggleSelected() : null;
290
+ },
291
+ children: row.getVisibleCells().map(function (cell) {
292
+ return /*#__PURE__*/jsxRuntime.jsx(TableBodyCell, {
293
+ cell: cell
294
+ }, cell.id);
295
+ })
296
+ });
297
+ }
298
+
299
+ function EdsDataGrid(_ref) {
300
+ var rows = _ref.rows,
301
+ columns = _ref.columns,
302
+ columnResizeMode = _ref.columnResizeMode,
303
+ pageSize = _ref.pageSize,
304
+ rowSelection = _ref.rowSelection,
305
+ selectedRows = _ref.selectedRows,
306
+ enableColumnFiltering = _ref.enableColumnFiltering,
307
+ debug = _ref.debug,
308
+ enablePagination = _ref.enablePagination,
309
+ enableSorting = _ref.enableSorting,
310
+ stickyHeader = _ref.stickyHeader,
311
+ onSelectRow = _ref.onSelectRow,
312
+ caption = _ref.caption,
313
+ enableVirtual = _ref.enableVirtual,
314
+ virtualHeight = _ref.virtualHeight,
315
+ columnVisibility = _ref.columnVisibility,
316
+ columnVisibilityChange = _ref.columnVisibilityChange,
317
+ emptyMessage = _ref.emptyMessage,
318
+ columnOrder = _ref.columnOrder,
319
+ cellClass = _ref.cellClass,
320
+ cellStyle = _ref.cellStyle,
321
+ rowClass = _ref.rowClass,
322
+ rowStyle = _ref.rowStyle,
323
+ headerClass = _ref.headerClass,
324
+ headerStyle = _ref.headerStyle;
325
+ var _useState = react.useState([]),
326
+ _useState2 = _slicedToArray__default.default(_useState, 2),
327
+ sorting = _useState2[0],
328
+ setSorting = _useState2[1];
329
+ var _useState3 = react.useState(selectedRows !== null && selectedRows !== void 0 ? selectedRows : {}),
330
+ _useState4 = _slicedToArray__default.default(_useState3, 2),
331
+ selection = _useState4[0],
332
+ setSelection = _useState4[1];
333
+ var _useState5 = react.useState([]),
334
+ _useState6 = _slicedToArray__default.default(_useState5, 2),
335
+ columnFilters = _useState6[0],
336
+ setColumnFilters = _useState6[1];
337
+ var _useState7 = react.useState(columnVisibility !== null && columnVisibility !== void 0 ? columnVisibility : {}),
338
+ _useState8 = _slicedToArray__default.default(_useState7, 2),
339
+ visible = _useState8[0],
340
+ setVisible = _useState8[1];
341
+ var _useState9 = react.useState(''),
342
+ _useState10 = _slicedToArray__default.default(_useState9, 2),
343
+ globalFilter = _useState10[0],
344
+ setGlobalFilter = _useState10[1];
345
+ var _useState11 = react.useState([]),
346
+ _useState12 = _slicedToArray__default.default(_useState11, 2),
347
+ columnOrderState = _useState12[0],
348
+ setColumnOrderState = _useState12[1];
349
+ var _useState13 = react.useState({
350
+ pageIndex: 0,
351
+ pageSize: pageSize !== null && pageSize !== void 0 ? pageSize : 25
352
+ }),
353
+ _useState14 = _slicedToArray__default.default(_useState13, 2),
354
+ page = _useState14[0],
355
+ setPage = _useState14[1];
356
+ react.useEffect(function () {
357
+ setVisible(columnVisibility !== null && columnVisibility !== void 0 ? columnVisibility : {});
358
+ }, [columnVisibility, setVisible]);
359
+ react.useEffect(function () {
360
+ setSelection(selectedRows !== null && selectedRows !== void 0 ? selectedRows : {});
361
+ }, [selectedRows]);
362
+
363
+ /**
364
+ * By default, the filter-function accepts single-value filters. This adds multi-filter functionality out of the box.
365
+ */
366
+ var _columns = react.useMemo(function () {
367
+ return columns.map(function (column) {
368
+ if (column.filterFn || column.enableColumnFilter === false) {
369
+ return column;
370
+ }
371
+ /* istanbul ignore next */
372
+ return _objectSpread__default.default(_objectSpread__default.default({}, column), {}, {
373
+ filterFn: function filterFn(row, columnId, filterValue) {
374
+ var _row$getValue;
375
+ if (debug) {
376
+ console.log('filterFn', row, columnId, filterValue);
377
+ }
378
+ if (!filterValue || (Array.isArray(filterValue) || typeof filterValue === 'string') && filterValue.length === 0) {
379
+ return true;
380
+ }
381
+ var value = (_row$getValue = row.getValue(columnId)) !== null && _row$getValue !== void 0 ? _row$getValue : 'NULL_OR_UNDEFINED';
382
+ if (Array.isArray(filterValue)) {
383
+ var numeric = filterValue.some(function (v) {
384
+ return typeof v === 'number';
385
+ });
386
+ if (numeric) {
387
+ var _ref2 = filterValue,
388
+ _ref3 = _slicedToArray__default.default(_ref2, 2),
389
+ start = _ref3[0],
390
+ end = _ref3[1];
391
+ return value >= (isNaN(start) ? 0 : start) && value <= (!end || isNaN(end) ? Infinity : end);
392
+ } else {
393
+ var validFilterValue = filterValue.filter(function (v) {
394
+ return !!v;
395
+ });
396
+ if (validFilterValue.length === 0) return true;
397
+ return filterValue.includes(value);
398
+ }
399
+ }
400
+ return value === filterValue;
401
+ }
402
+ });
403
+ });
404
+ }, [debug, columns]);
405
+
406
+ /**
407
+ * Set up default table options
408
+ */
409
+ var options = {
410
+ data: rows,
411
+ columns: _columns,
412
+ columnResizeMode: columnResizeMode,
413
+ state: {
414
+ sorting: sorting,
415
+ rowSelection: selection,
416
+ columnOrder: columnOrderState
417
+ },
418
+ onSortingChange: setSorting,
419
+ enableColumnFilters: !!enableColumnFiltering,
420
+ enableFilters: !!enableColumnFiltering,
421
+ enableSorting: enableSorting !== null && enableSorting !== void 0 ? enableSorting : false,
422
+ enableColumnResizing: !!columnResizeMode,
423
+ getCoreRowModel: reactTable.getCoreRowModel(),
424
+ getSortedRowModel: reactTable.getSortedRowModel(),
425
+ debugTable: debug,
426
+ debugHeaders: debug,
427
+ debugColumns: debug,
428
+ enableRowSelection: rowSelection !== null && rowSelection !== void 0 ? rowSelection : false
429
+ };
430
+ react.useEffect(function () {
431
+ if (columnOrder && columnOrder.length > 0) {
432
+ setColumnOrderState(columnOrder !== null && columnOrder !== void 0 ? columnOrder : []);
433
+ }
434
+ }, [columnOrder]);
435
+
436
+ /**
437
+ * Set up handlers for rowSelection
438
+ */
439
+ if (rowSelection !== null && rowSelection !== void 0 ? rowSelection : false) {
440
+ options.onRowSelectionChange = function (updaterOrValue) {
441
+ if (onSelectRow) {
442
+ onSelectRow(updaterOrValue);
443
+ }
444
+ setSelection(updaterOrValue);
445
+ };
446
+ }
447
+
448
+ /**
449
+ * Set up config for column filtering
450
+ */
451
+ if (enableColumnFiltering) {
452
+ options.state.columnFilters = columnFilters;
453
+ options.state.globalFilter = globalFilter;
454
+ options.onColumnFiltersChange = setColumnFilters;
455
+ options.onGlobalFilterChange = setGlobalFilter;
456
+ options.getFacetedRowModel = reactTable.getFacetedRowModel();
457
+ options.getFacetedUniqueValues = reactTable.getFacetedUniqueValues();
458
+ options.getFacetedMinMaxValues = reactTable.getFacetedMinMaxValues();
459
+ options.getFilteredRowModel = reactTable.getFilteredRowModel();
460
+ }
461
+
462
+ /**
463
+ * Set up config for pagination
464
+ */
465
+ if (enablePagination !== null && enablePagination !== void 0 ? enablePagination : false) {
466
+ options.state.pagination = page;
467
+ options.getPaginationRowModel = reactTable.getPaginationRowModel();
468
+ }
469
+
470
+ /**
471
+ * Set up config to handle column visibility controls
472
+ */
473
+ if (columnVisibility) {
474
+ options.state.columnVisibility = visible;
475
+ options.onColumnVisibilityChange = function (vis) {
476
+ var updated;
477
+ if (typeof vis === 'function') {
478
+ updated = vis(visible);
479
+ } else {
480
+ updated = vis;
481
+ }
482
+ if (columnVisibilityChange) columnVisibilityChange(updated);
483
+ setVisible(updated);
484
+ };
485
+ }
486
+ react.useEffect(function () {
487
+ setPage(function (prev) {
488
+ return _objectSpread__default.default(_objectSpread__default.default({}, prev), {}, {
489
+ pageSize: pageSize !== null && pageSize !== void 0 ? pageSize : 25
490
+ });
491
+ });
492
+ }, [pageSize]);
493
+ var table = reactTable.useReactTable(options);
494
+ var parentRefStyle = {};
495
+
496
+ /**
497
+ * Style the parent container to enable virtualization.
498
+ * By not setting this, the virtual-scroll will always render every row, reducing computational overhead if turned off.
499
+ */
500
+ if (enableVirtual) {
501
+ parentRefStyle = {
502
+ height: virtualHeight !== null && virtualHeight !== void 0 ? virtualHeight : 500,
503
+ overflow: 'auto',
504
+ position: 'relative'
505
+ };
506
+ }
507
+ var parentRef = react.useRef(null);
508
+
509
+ /**
510
+ * Virtualization setup
511
+ */
512
+ var _useEds = edsCoreReact.useEds(),
513
+ density = _useEds.density;
514
+ var estimateSize = react.useCallback(function () {
515
+ return density === 'compact' ? 32 : 48;
516
+ }, [density]);
517
+ var virtualizer = reactVirtual.useVirtualizer({
518
+ count: table.getRowModel().rows.length,
519
+ getScrollElement: function getScrollElement() {
520
+ return parentRef.current;
521
+ },
522
+ estimateSize: estimateSize
523
+ });
524
+ var virtualRows = virtualizer.getVirtualItems();
525
+ var paddingTop = virtualRows.length ? virtualRows[0].start : 0;
526
+ var paddingBottom = virtualRows.length ? virtualizer.getTotalSize() - virtualRows[virtualRows.length - 1].end : 0;
527
+
528
+ // These classes are primarily used to allow for feature-detection in the test-suite
529
+ var classList = {
530
+ 'sticky-header': !!stickyHeader,
531
+ virtual: !!enableVirtual,
532
+ paging: !!enablePagination
533
+ };
534
+ return /*#__PURE__*/jsxRuntime.jsxs(TableProvider, {
535
+ cellClass: cellClass,
536
+ cellStyle: cellStyle,
537
+ rowClass: rowClass,
538
+ rowStyle: rowStyle,
539
+ headerClass: headerClass,
540
+ headerStyle: headerStyle,
541
+ table: table,
542
+ enableSorting: !!enableSorting,
543
+ enableColumnFiltering: !!enableColumnFiltering,
544
+ stickyHeader: !!stickyHeader,
545
+ children: [/*#__PURE__*/jsxRuntime.jsxs("div", {
546
+ className: "table-wrapper",
547
+ style: parentRefStyle,
548
+ ref: parentRef,
549
+ children: [/*#__PURE__*/jsxRuntime.jsxs(edsCoreReact.Table, {
550
+ className: Object.entries(classList).filter(function (_ref4) {
551
+ var _ref5 = _slicedToArray__default.default(_ref4, 2),
552
+ k = _ref5[1];
553
+ return k;
554
+ }).map(function (_ref6) {
555
+ var _ref7 = _slicedToArray__default.default(_ref6, 1),
556
+ k = _ref7[0];
557
+ return k;
558
+ }).join(' '),
559
+ style: {
560
+ width: table.getTotalSize()
561
+ },
562
+ children: [caption && /*#__PURE__*/jsxRuntime.jsx(edsCoreReact.Table.Caption, {
563
+ children: caption
564
+ }), /*#__PURE__*/jsxRuntime.jsx(edsCoreReact.Table.Head, {
565
+ sticky: stickyHeader,
566
+ children: table.getHeaderGroups().map(function (headerGroup) {
567
+ return /*#__PURE__*/jsxRuntime.jsx(TableHeaderRow, {
568
+ table: table,
569
+ headerGroup: headerGroup,
570
+ columnResizeMode: columnResizeMode,
571
+ deltaOffset: table.getState().columnSizingInfo.deltaOffset
572
+ }, headerGroup.id);
573
+ })
574
+ }), /*#__PURE__*/jsxRuntime.jsxs(edsCoreReact.Table.Body, {
575
+ children: [table.getRowModel().rows.length === 0 && emptyMessage && /*#__PURE__*/jsxRuntime.jsx(edsCoreReact.Table.Row, {
576
+ children: /*#__PURE__*/jsxRuntime.jsx(edsCoreReact.Table.Cell, {
577
+ colSpan: table.getHeaderGroups().length,
578
+ children: emptyMessage
579
+ })
580
+ }), enableVirtual && /*#__PURE__*/jsxRuntime.jsxs(jsxRuntime.Fragment, {
581
+ children: [/*#__PURE__*/jsxRuntime.jsx(edsCoreReact.Table.Row, {
582
+ "data-testid": "virtual-padding-top",
583
+ className: 'virtual-padding-top',
584
+ children: /*#__PURE__*/jsxRuntime.jsx(edsCoreReact.Table.Cell, {
585
+ style: {
586
+ height: "".concat(paddingTop, "px")
587
+ }
588
+ })
589
+ }), virtualRows.map(function (row) {
590
+ return /*#__PURE__*/jsxRuntime.jsx(TableRow, {
591
+ row: table.getRowModel().rows[row.index]
592
+ }, row.index);
593
+ }), /*#__PURE__*/jsxRuntime.jsx(edsCoreReact.Table.Row, {
594
+ "data-testid": "virtual-padding-bottom",
595
+ className: 'virtual-padding-bottom',
596
+ children: /*#__PURE__*/jsxRuntime.jsx(edsCoreReact.Table.Cell, {
597
+ style: {
598
+ height: "".concat(paddingBottom, "px")
599
+ }
600
+ })
601
+ })]
602
+ }), !enableVirtual && table.getRowModel().rows.map(function (row) {
603
+ return /*#__PURE__*/jsxRuntime.jsx(TableRow, {
604
+ row: row
605
+ }, row.id);
606
+ })]
607
+ })]
608
+ }), enablePagination && /*#__PURE__*/jsxRuntime.jsx("div", {
609
+ style: {
610
+ maxWidth: "".concat(table.getTotalSize(), "px")
611
+ },
612
+ children: /*#__PURE__*/jsxRuntime.jsx(edsCoreReact.Pagination, {
613
+ totalItems: table.getFilteredRowModel().rows.length,
614
+ withItemIndicator: true,
615
+ itemsPerPage: page.pageSize,
616
+ onChange: function onChange(e, p) {
617
+ return setPage(function (s) {
618
+ return _objectSpread__default.default(_objectSpread__default.default({}, s), {}, {
619
+ pageIndex: p - 1
620
+ });
621
+ });
622
+ },
623
+ defaultPage: 1
624
+ })
625
+ })]
626
+ }), debug && enableVirtual && /*#__PURE__*/jsxRuntime.jsxs("span", {
627
+ children: ["Visible items: ", virtualizer.range.startIndex, " -", ' ', virtualizer.range.endIndex, " / ", rows.length]
628
+ })]
629
+ });
630
+ }
631
+
632
+ exports.EdsDataGrid = EdsDataGrid;
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@equinor/eds-data-grid-react",
3
- "version": "0.0.1",
3
+ "version": "0.1.0-beta.2",
4
4
  "description": "A feature-rich data-grid written in React, implementing the Equinor Design System",
5
5
  "license": "MIT",
6
- "exports": "./dist/esm/index.js",
7
- "type": "module",
8
6
  "types": "dist/types/index.d.ts",
7
+ "main": "dist/eds-data-grid-react.cjs",
8
+ "module": "./dist/esm/index.js",
9
9
  "files": [
10
10
  "dist/*"
11
11
  ],
@@ -16,15 +16,15 @@
16
16
  "peerDependencies": {
17
17
  "react": ">=16.8",
18
18
  "react-dom": ">=16.8",
19
- "styled-components": ">=4.2"
19
+ "styled-components": ">=4.2 < 6"
20
20
  },
21
21
  "dependencies": {
22
22
  "@tanstack/react-table": "^8.8.5",
23
23
  "@tanstack/react-virtual": "^3.0.0-beta.54",
24
- "@equinor/eds-core-react": "0.32.0",
24
+ "@equinor/eds-core-react": "^0.32.2",
25
25
  "@equinor/eds-tokens": "0.9.2",
26
- "@equinor/eds-icons": "0.19.2",
27
- "@equinor/eds-utils": "0.8.0"
26
+ "@equinor/eds-icons": "^0.19.2",
27
+ "@equinor/eds-utils": "^0.8.0"
28
28
  },
29
29
  "devDependencies": {
30
30
  "typescript": "~4.9.5",