@semcore/data-table 1.5.3 → 2.1.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.
- package/CHANGELOG.md +18 -0
- package/lib/cjs/Body.js +104 -63
- package/lib/cjs/Body.js.map +1 -1
- package/lib/cjs/DataTable.js +183 -144
- package/lib/cjs/DataTable.js.map +1 -1
- package/lib/cjs/Head.js +16 -9
- package/lib/cjs/Head.js.map +1 -1
- package/lib/cjs/index.js.map +1 -1
- package/lib/cjs/style/data-table.shadow.css +1 -1
- package/lib/cjs/types.js +4 -0
- package/lib/cjs/types.js.map +1 -0
- package/lib/cjs/utils.js +26 -26
- package/lib/cjs/utils.js.map +1 -1
- package/lib/es6/Body.js +107 -64
- package/lib/es6/Body.js.map +1 -1
- package/lib/es6/DataTable.js +185 -142
- package/lib/es6/DataTable.js.map +1 -1
- package/lib/es6/Head.js +17 -9
- package/lib/es6/Head.js.map +1 -1
- package/lib/es6/index.js.map +1 -1
- package/lib/es6/style/data-table.shadow.css +1 -1
- package/lib/es6/types.js +2 -0
- package/lib/es6/types.js.map +1 -0
- package/lib/es6/utils.js +20 -24
- package/lib/es6/utils.js.map +1 -1
- package/package.json +19 -3
- package/src/Body.tsx +136 -0
- package/src/DataTable.tsx +428 -0
- package/src/{Head.jsx → Head.tsx} +29 -11
- package/src/{index.js → index.ts} +0 -0
- package/src/style/data-table.shadow.css +1 -1
- package/src/types.ts +54 -0
- package/src/utils.ts +55 -0
- package/lib/types/index.d.ts +0 -99
- package/src/Body.jsx +0 -118
- package/src/DataTable.jsx +0 -283
- package/src/index.d.ts +0 -99
- package/src/utils.js +0 -54
package/lib/es6/Head.js
CHANGED
|
@@ -65,15 +65,15 @@ var Head = /*#__PURE__*/function (_Component) {
|
|
|
65
65
|
_defineProperty(_assertThisInitialized(_this), "columns", []);
|
|
66
66
|
|
|
67
67
|
_defineProperty(_assertThisInitialized(_this), "bindHandlerSortClick", function (name) {
|
|
68
|
-
return function (
|
|
69
|
-
_this.asProps.$onSortClick(name,
|
|
68
|
+
return function (event) {
|
|
69
|
+
_this.asProps.$onSortClick(name, event);
|
|
70
70
|
};
|
|
71
71
|
});
|
|
72
72
|
|
|
73
73
|
_defineProperty(_assertThisInitialized(_this), "bindHandlerKeyDown", function (name) {
|
|
74
|
-
return function (
|
|
75
|
-
if (
|
|
76
|
-
_this.asProps.$onSortClick(name,
|
|
74
|
+
return function (event) {
|
|
75
|
+
if (event.code === 'Enter') {
|
|
76
|
+
_this.asProps.$onSortClick(name, event);
|
|
77
77
|
}
|
|
78
78
|
};
|
|
79
79
|
});
|
|
@@ -93,7 +93,7 @@ var Head = /*#__PURE__*/function (_Component) {
|
|
|
93
93
|
}, {
|
|
94
94
|
key: "renderColumn",
|
|
95
95
|
value: function renderColumn(column, width) {
|
|
96
|
-
var _ref2,
|
|
96
|
+
var _ref2, _column$columns;
|
|
97
97
|
|
|
98
98
|
var _this$asProps = this.asProps,
|
|
99
99
|
styles = _this$asProps.styles,
|
|
@@ -102,7 +102,7 @@ var Head = /*#__PURE__*/function (_Component) {
|
|
|
102
102
|
var SColumn = Flex;
|
|
103
103
|
var SHead = Box;
|
|
104
104
|
var SSortIcon = SORTING_ICON[column.sortDirection];
|
|
105
|
-
var isGroup =
|
|
105
|
+
var isGroup = ((_column$columns = column.columns) === null || _column$columns === void 0 ? void 0 : _column$columns.length) > 0;
|
|
106
106
|
var cSize = isGroup ? flattenColumns(column.columns).length : 1;
|
|
107
107
|
|
|
108
108
|
var _getFixedStyle = getFixedStyle(column, this.columns),
|
|
@@ -110,7 +110,13 @@ var Head = /*#__PURE__*/function (_Component) {
|
|
|
110
110
|
name = _getFixedStyle2[0],
|
|
111
111
|
value = _getFixedStyle2[1];
|
|
112
112
|
|
|
113
|
-
var style = _objectSpread(
|
|
113
|
+
var style = _objectSpread({
|
|
114
|
+
flexBasis: column.props.flex === undefined && "".concat(width * cSize, "%")
|
|
115
|
+
}, column.props.style);
|
|
116
|
+
|
|
117
|
+
if (name !== undefined && value !== undefined) {
|
|
118
|
+
style[name] = value;
|
|
119
|
+
}
|
|
114
120
|
|
|
115
121
|
return _ref2 = sstyled(styles), /*#__PURE__*/React.createElement(SColumn, _ref2.cn("SColumn", _objectSpread(_objectSpread({
|
|
116
122
|
"key": column.name,
|
|
@@ -136,7 +142,7 @@ var Head = /*#__PURE__*/function (_Component) {
|
|
|
136
142
|
}, {
|
|
137
143
|
key: "render",
|
|
138
144
|
value: function render() {
|
|
139
|
-
var _ref = this
|
|
145
|
+
var _ref = this.asProps,
|
|
140
146
|
_ref3;
|
|
141
147
|
|
|
142
148
|
var SHead = Box;
|
|
@@ -173,5 +179,7 @@ var Head = /*#__PURE__*/function (_Component) {
|
|
|
173
179
|
return Head;
|
|
174
180
|
}(Component);
|
|
175
181
|
|
|
182
|
+
_defineProperty(Head, "displayName", void 0);
|
|
183
|
+
|
|
176
184
|
export default Head;
|
|
177
185
|
//# sourceMappingURL=Head.js.map
|
package/lib/es6/Head.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/Head.
|
|
1
|
+
{"version":3,"sources":["../../src/Head.tsx"],"names":["React","Component","sstyled","Root","Box","Flex","ScrollArea","SortDesc","SortAsc","callAllEventHandlers","flattenColumns","getFixedStyle","getScrollOffsetValue","logger","SORTING_ICON","desc","asc","Head","name","event","asProps","$onSortClick","code","columns","width","map","column","renderColumn","styles","use","hidden","SColumn","SHead","SSortIcon","sortDirection","isGroup","length","cSize","value","style","flexBasis","props","flex","undefined","fixed","resizable","sortable","active","onClick","bindHandlerSortClick","onKeyDown","bindHandlerKeyDown","children","renderColumns","Children","columnsChildren","onResize","$scrollRef","sticky","SHeadWrapper","offsetLeftSum","offsetRightSum","warn","displayName","scrollStyles","origin"],"mappings":"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","sourcesContent":["import React from 'react';\nimport { Component, sstyled, Root } from '@semcore/core';\nimport { Box, Flex } from '@semcore/flex-box';\nimport ScrollArea from '@semcore/scroll-area';\nimport SortDesc from '@semcore/icon/SortDesc/m';\nimport SortAsc from '@semcore/icon/SortAsc/m';\nimport { callAllEventHandlers } from '@semcore/utils/lib/assignProps';\nimport { flattenColumns, getFixedStyle, getScrollOffsetValue } from './utils';\nimport type { Column } from './types';\nimport logger from '@semcore/utils/lib/logger';\nimport type ResizeObserverCallback from 'resize-observer-polyfill';\n\nimport scrollStyles from './style/scroll-area.shadow.css';\n\nconst SORTING_ICON = {\n desc: SortDesc,\n asc: SortAsc,\n} as const;\n\ntype AsProps = {\n $onSortClick: (name: string, event: React.MouseEvent | React.KeyboardEvent) => void;\n $scrollRef: (instance: unknown) => void;\n use: 'primary' | 'secondary';\n columnsChildren: Column[];\n onResize: ResizeObserverCallback;\n sticky: boolean;\n ['data-ui-name']: string;\n};\n\nclass Head extends Component<AsProps> {\n columns: Column[] = [];\n\n static displayName: string;\n\n bindHandlerSortClick = (name: string) => (event: React.MouseEvent) => {\n this.asProps.$onSortClick(name, event);\n };\n\n bindHandlerKeyDown = (name: string) => (event: React.KeyboardEvent) => {\n if (event.code === 'Enter') {\n this.asProps.$onSortClick(name, event);\n }\n };\n\n renderColumns(columns: Column[], width: number) {\n return columns.map((column) => this.renderColumn(column, width));\n }\n\n renderColumn(column: Column, width: number) {\n const { styles, use, hidden } = this.asProps;\n const SColumn = Flex;\n const SHead = Box;\n const SSortIcon = SORTING_ICON[column.sortDirection];\n const isGroup = column.columns?.length > 0;\n const cSize = isGroup ? flattenColumns(column.columns).length : 1;\n const [name, value] = getFixedStyle(column, this.columns);\n\n const style = {\n flexBasis: column.props.flex === undefined && `${width * cSize}%`,\n ...column.props.style,\n };\n\n if (name !== undefined && value !== undefined) {\n style[name] = value;\n }\n\n return sstyled(styles)(\n <SColumn\n key={column.name}\n use={use}\n fixed={column.fixed}\n resizable={column.resizable}\n sortable={column.sortable}\n active={column.active}\n group={isGroup}\n tabIndex={column.sortable && 0}\n {...column.props}\n onClick={callAllEventHandlers(\n column.props.onClick,\n column.sortable ? this.bindHandlerSortClick(column.name) : undefined,\n )}\n onKeyDown={callAllEventHandlers(\n column.props.onKeyDown,\n column.sortable ? this.bindHandlerKeyDown(column.name) : undefined,\n )}\n style={style}\n hidden={hidden}\n >\n {isGroup ? (\n <>\n <SColumn groupHead use={use}>\n <div>{column.props.children}</div>\n </SColumn>\n <SHead>{this.renderColumns(column.columns, 100 / cSize)}</SHead>\n </>\n ) : (\n <>\n <div>{column.props.children}</div>\n {column.sortable ? <SSortIcon active={column.active} /> : null}\n </>\n )}\n </SColumn>,\n );\n }\n\n render() {\n const SHead = Root;\n const { Children, styles, columnsChildren, onResize, $scrollRef, sticky } = this.asProps;\n const SHeadWrapper = Box;\n\n this.columns = flattenColumns(columnsChildren);\n\n const [offsetLeftSum, offsetRightSum] = getScrollOffsetValue(this.columns);\n\n logger.warn(\n sticky,\n \"'sticky' property is deprecated, use '<Sticky/>' wrapper\",\n this.asProps['data-ui-name'] || Head.displayName,\n );\n\n return sstyled(styles)(\n <SHeadWrapper sticky={sticky}>\n <ScrollArea\n styles={scrollStyles}\n use:left={`${offsetLeftSum}px`}\n use:right={`${offsetRightSum}px`}\n shadow\n onResize={onResize}\n >\n <ScrollArea.Container ref={$scrollRef}>\n <SHead render={Box}>\n {this.renderColumns(columnsChildren, 100 / this.columns.length)}\n </SHead>\n </ScrollArea.Container>\n </ScrollArea>\n {Children.origin}\n </SHeadWrapper>,\n );\n }\n}\n\nexport default Head;\n"],"file":"Head.js"}
|
package/lib/es6/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts"],"names":["default"],"mappings":"AAAA,SAASA,OAAT,QAAwB,aAAxB;AACA,cAAc,aAAd","sourcesContent":["export { default } from './DataTable';\nexport * from './DataTable';\n"],"file":"index.js"}
|
package/lib/es6/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/types.ts"],"names":["ROW_GROUP"],"mappings":"AACA,SAASA,SAAT,QAA0B,aAA1B","sourcesContent":["import React from 'react';\nimport { ROW_GROUP } from './DataTable';\n\nexport type PseudoChildPropsGetter = (\n props: { [propName: string]: unknown },\n rowData: { [columnName: string]: unknown },\n index: number,\n) => { [propName: string]: unknown };\nexport type PropsLayer = {\n childrenPropsGetter?: PseudoChildPropsGetter;\n [propName: string]: unknown;\n};\n\nexport type SortDirection = 'asc' | 'desc';\nexport type Column<\n Props extends { [propName: string]: unknown } = { [propName: string]: unknown },\n> = {\n name: string;\n active: boolean;\n width: number;\n fixed?: 'left' | 'right';\n resizable?: boolean;\n sortable?: boolean | SortDirection;\n sortDirection: SortDirection;\n cssVar: string | string[];\n data?: unknown;\n props: {\n name: string;\n } & Partial<{\n onClick: (event: React.MouseEvent) => void;\n onKeyDown: (event: React.KeyboardEvent) => void;\n ref: React.RefObject<HTMLElement>;\n style: React.CSSProperties;\n fixed: 'left' | 'right';\n children: React.ReactNode[];\n\n resizable: boolean;\n sortable: boolean | SortDirection;\n sortDirection: SortDirection;\n }> &\n Props;\n columns: Column[];\n};\nexport type Cell = Pick<Column, 'name' | 'cssVar' | 'fixed' | 'data'> & {\n cellPropsLayers: PropsLayer[];\n};\nexport type RowData<\n Data extends { [columnName: string]: unknown } = { [columnName: string]: unknown },\n> = Data &\n Partial<{\n name: string;\n [ROW_GROUP]: RowData[];\n }>;\nexport type NestedCells = (Cell | NestedCells)[] & { flatRowData?: RowData };\n"],"file":"types.js"}
|
package/lib/es6/utils.js
CHANGED
|
@@ -1,39 +1,35 @@
|
|
|
1
|
-
export function getScrollOffsetValue(columns) {
|
|
2
|
-
return columns.reduce(function (acc,
|
|
3
|
-
if (
|
|
4
|
-
acc[0] +=
|
|
1
|
+
export var getScrollOffsetValue = function getScrollOffsetValue(columns) {
|
|
2
|
+
return columns.reduce(function (acc, column) {
|
|
3
|
+
if (column.fixed === 'left') {
|
|
4
|
+
acc[0] += column.width;
|
|
5
5
|
}
|
|
6
6
|
|
|
7
|
-
if (
|
|
8
|
-
acc[1] +=
|
|
7
|
+
if (column.fixed === 'right') {
|
|
8
|
+
acc[1] += column.width;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
11
|
return acc;
|
|
12
12
|
}, [0, 0]);
|
|
13
|
-
}
|
|
14
|
-
export function flattenColumns(columns) {
|
|
15
|
-
return columns.reduce(function (acc,
|
|
16
|
-
var
|
|
17
|
-
|
|
18
|
-
if (c.columns) {
|
|
19
|
-
columns = flattenColumns(c.columns);
|
|
20
|
-
}
|
|
21
|
-
|
|
13
|
+
};
|
|
14
|
+
export var flattenColumns = function flattenColumns(columns) {
|
|
15
|
+
return columns.reduce(function (acc, column) {
|
|
16
|
+
var hasNestedColumns = 'columns' in column && column.columns.length > 0;
|
|
17
|
+
var columns = hasNestedColumns ? flattenColumns(column.columns) : [column];
|
|
22
18
|
acc = acc.concat(columns);
|
|
23
19
|
return acc;
|
|
24
20
|
}, []);
|
|
25
|
-
}
|
|
26
|
-
export function getFixedStyle(
|
|
27
|
-
var side =
|
|
21
|
+
};
|
|
22
|
+
export var getFixedStyle = function getFixedStyle(cell, columns) {
|
|
23
|
+
var side = cell.fixed;
|
|
28
24
|
if (!side) return [undefined, undefined];
|
|
29
|
-
var names =
|
|
25
|
+
var names = cell.name.split('/');
|
|
30
26
|
var nameSideMap = {
|
|
31
27
|
left: names[0],
|
|
32
28
|
right: names[names.length - 1]
|
|
33
29
|
};
|
|
34
30
|
var name = nameSideMap[side];
|
|
35
|
-
var index = columns.findIndex(function (
|
|
36
|
-
return
|
|
31
|
+
var index = columns.findIndex(function (column) {
|
|
32
|
+
return column.name === name;
|
|
37
33
|
});
|
|
38
34
|
if (index === -1) return [undefined, undefined];
|
|
39
35
|
var startIndexSideMap = {
|
|
@@ -46,9 +42,9 @@ export function getFixedStyle(column, columns) {
|
|
|
46
42
|
};
|
|
47
43
|
var columnsFixed = columns.slice(startIndexSideMap[side], endIndexSideMap[side]);
|
|
48
44
|
if (columnsFixed.length < 1) return [side, 0];
|
|
49
|
-
var vars = columnsFixed.map(function (
|
|
50
|
-
return "var(--".concat(
|
|
45
|
+
var vars = columnsFixed.map(function (column) {
|
|
46
|
+
return "var(--".concat(column.name, "_width)");
|
|
51
47
|
});
|
|
52
48
|
return [side, vars.length === 1 ? vars[0] : "calc(".concat(vars.join(' + '), ")")];
|
|
53
|
-
}
|
|
49
|
+
};
|
|
54
50
|
//# sourceMappingURL=utils.js.map
|
package/lib/es6/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils.
|
|
1
|
+
{"version":3,"sources":["../../src/utils.ts"],"names":["getScrollOffsetValue","columns","reduce","acc","column","fixed","width","flattenColumns","hasNestedColumns","length","concat","getFixedStyle","cell","side","undefined","names","name","split","nameSideMap","left","right","index","findIndex","startIndexSideMap","endIndexSideMap","columnsFixed","slice","vars","map","join"],"mappings":"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","sourcesContent":["import type { Column } from './types';\n\nexport const getScrollOffsetValue = (columns: Column[]) =>\n columns.reduce(\n (acc, column) => {\n if (column.fixed === 'left') {\n acc[0] += column.width;\n }\n if (column.fixed === 'right') {\n acc[1] += column.width;\n }\n return acc;\n },\n [0, 0] as [leftOffset: number, rightOffset: number],\n );\n\nexport const flattenColumns = (columns: Column[]) =>\n columns.reduce((acc, column) => {\n const hasNestedColumns = 'columns' in column && column.columns.length > 0;\n const columns: Column[] = hasNestedColumns ? flattenColumns(column.columns) : [column];\n acc = acc.concat(columns);\n return acc;\n }, [] as Column[]);\n\nexport const getFixedStyle = (\n cell: Pick<Column, 'name' | 'fixed'>,\n columns: Column[],\n): [side: 'left' | 'right', style: string | number] | [side: undefined, style: undefined] => {\n const side = cell.fixed;\n if (!side) return [undefined, undefined];\n const names = cell.name.split('/');\n const nameSideMap = {\n left: names[0],\n right: names[names.length - 1],\n };\n const name = nameSideMap[side];\n const index = columns.findIndex((column) => column.name === name);\n\n if (index === -1) return [undefined, undefined];\n\n const startIndexSideMap = {\n left: 0,\n right: index,\n };\n const endIndexSideMap = {\n left: index,\n right: columns.length - 1,\n };\n const columnsFixed = columns.slice(startIndexSideMap[side], endIndexSideMap[side]);\n\n if (columnsFixed.length < 1) return [side, 0];\n\n const vars = columnsFixed.map((column) => `var(--${column.name}_width)`);\n return [side, vars.length === 1 ? vars[0] : `calc(${vars.join(' + ')})`];\n};\n"],"file":"utils.js"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@semcore/data-table",
|
|
3
3
|
"description": "SEMRush DataTable Component",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "2.1.0",
|
|
5
5
|
"main": "lib/cjs/index.js",
|
|
6
6
|
"module": "lib/es6/index.js",
|
|
7
7
|
"typings": "lib/types/index.d.ts",
|
|
@@ -13,10 +13,26 @@
|
|
|
13
13
|
"test": "jest"
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@semcore/utils": "^3.22",
|
|
17
16
|
"@semcore/flex-box": "^4",
|
|
18
17
|
"@semcore/icon": "^2.16",
|
|
19
|
-
"@semcore/scroll-area": "^3.2"
|
|
18
|
+
"@semcore/scroll-area": "^3.2",
|
|
19
|
+
"@semcore/utils": "^3.22"
|
|
20
|
+
},
|
|
21
|
+
"devDependencies": {
|
|
22
|
+
"@semcore/jest-preset-ui": "1.0.0",
|
|
23
|
+
"@semcore/base-trigger": "*",
|
|
24
|
+
"@semcore/dropdown-menu": "*",
|
|
25
|
+
"@semcore/typography": "*",
|
|
26
|
+
"@semcore/accordion": "*",
|
|
27
|
+
"@semcore/divider": "*",
|
|
28
|
+
"@semcore/link": "*",
|
|
29
|
+
"@semcore/portal": "*",
|
|
30
|
+
"@semcore/progress-bar": "*",
|
|
31
|
+
"@semcore/skeleton": "*",
|
|
32
|
+
"@semcore/spin": "*",
|
|
33
|
+
"@semcore/spin-container": "*",
|
|
34
|
+
"@semcore/sticky": "*",
|
|
35
|
+
"@semcore/tooltip": "*"
|
|
20
36
|
},
|
|
21
37
|
"peerDependencies": {
|
|
22
38
|
"@semcore/core": "^1.11",
|
package/src/Body.tsx
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Component, sstyled, Root } from '@semcore/core';
|
|
3
|
+
import { Box, Flex, IBoxProps } from '@semcore/flex-box';
|
|
4
|
+
import ScrollArea from '@semcore/scroll-area';
|
|
5
|
+
import { getFixedStyle, getScrollOffsetValue } from './utils';
|
|
6
|
+
import { RowData, Column, NestedCells, PropsLayer, Cell } from './types';
|
|
7
|
+
import assignProps from '@semcore/utils/lib/assignProps';
|
|
8
|
+
import type ResizeObserverCallback from 'resize-observer-polyfill';
|
|
9
|
+
|
|
10
|
+
import scrollStyles from './style/scroll-area.shadow.css';
|
|
11
|
+
import syncScroll from '@semcore/utils/lib/syncScroll';
|
|
12
|
+
|
|
13
|
+
const testEnv = process.env.NODE_ENV === 'test';
|
|
14
|
+
|
|
15
|
+
const getCellsByColumn = (cells: NestedCells): RowData => {
|
|
16
|
+
const flattenCells = cells.flat(20) as Cell[];
|
|
17
|
+
return Object.fromEntries(flattenCells.map((cell) => [cell.name, cell.data]));
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
type AsProps = {
|
|
21
|
+
rows: NestedCells[];
|
|
22
|
+
columns: Column[];
|
|
23
|
+
$scrollRef: ReturnType<ReturnType<typeof syncScroll>>;
|
|
24
|
+
onResize: ResizeObserverCallback;
|
|
25
|
+
rowPropsLayers: PropsLayer[];
|
|
26
|
+
use: 'primary' | 'secondary';
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
class Body extends Component<AsProps> {
|
|
30
|
+
renderRow(cells: NestedCells, index: number) {
|
|
31
|
+
const SRow = Box;
|
|
32
|
+
const { styles, rowPropsLayers } = this.asProps;
|
|
33
|
+
|
|
34
|
+
const cellsByColumn = cells.flatRowData || getCellsByColumn(cells);
|
|
35
|
+
|
|
36
|
+
let props = {
|
|
37
|
+
children: this.renderCells(cells, cellsByColumn, index),
|
|
38
|
+
theme: undefined,
|
|
39
|
+
active: undefined,
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
for (const rowPropsLayer of rowPropsLayers) {
|
|
43
|
+
const { childrenPropsGetter = (p) => p, ...other } = rowPropsLayer;
|
|
44
|
+
const propsRow = assignProps(other, props);
|
|
45
|
+
props = assignProps(childrenPropsGetter(propsRow, cellsByColumn, index), propsRow);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return sstyled(styles)(<SRow key={index} {...props} />);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
renderRows(rows: NestedCells[]) {
|
|
52
|
+
return rows.map((cells, index) => this.renderRow(cells, index));
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
renderCells(cells: NestedCells, cellsByColumn: RowData, index: number) {
|
|
56
|
+
const SCell = Flex;
|
|
57
|
+
const { styles, columns, use } = this.asProps;
|
|
58
|
+
return cells.map((cell) => {
|
|
59
|
+
if (Array.isArray(cell)) {
|
|
60
|
+
return <div>{this.renderRows(cell as NestedCells[])}</div>;
|
|
61
|
+
} else {
|
|
62
|
+
const column = columns.find((c) => c.name === cell.name);
|
|
63
|
+
const [name, value] = getFixedStyle(cell, columns);
|
|
64
|
+
const vars = (Array.isArray(cell.cssVar) ? cell.cssVar : [cell.cssVar]).map(
|
|
65
|
+
(name) => `var(${name})`,
|
|
66
|
+
);
|
|
67
|
+
type CellProps = IBoxProps & {
|
|
68
|
+
name: string;
|
|
69
|
+
children: React.ReactNode;
|
|
70
|
+
style: React.CSSProperties;
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
let props: CellProps = {
|
|
74
|
+
name: cell.name,
|
|
75
|
+
children: <>{cell.data}</>,
|
|
76
|
+
['data-data']: JSON.stringify(cell.data),
|
|
77
|
+
justifyContent: column?.props?.justifyContent,
|
|
78
|
+
style: {
|
|
79
|
+
width: vars.length === 1 ? vars[0] : `calc(${vars.join(' + ')})`,
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
if (name !== undefined && value !== undefined) {
|
|
83
|
+
props.style[name] = value;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
for (const cellPropLayer of cell.cellPropsLayers || []) {
|
|
87
|
+
const { childrenPropsGetter = (p) => p, ...other } = cellPropLayer;
|
|
88
|
+
const propsCell = assignProps(other, props);
|
|
89
|
+
props = assignProps(childrenPropsGetter(propsCell, cellsByColumn, index), propsCell);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return sstyled(styles)(
|
|
93
|
+
<SCell key={cell.name} {...props} fixed={cell.fixed} theme={props.theme} use={use} />,
|
|
94
|
+
) as React.ReactElement;
|
|
95
|
+
}
|
|
96
|
+
}, [] as React.ReactElement[]);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
render() {
|
|
100
|
+
const SBody = Root;
|
|
101
|
+
const SBodyWrapper = Box;
|
|
102
|
+
const SScrollAreaBar = ScrollArea.Bar;
|
|
103
|
+
const { Children, styles, rows, columns, onResize, $scrollRef } = this.asProps;
|
|
104
|
+
|
|
105
|
+
const columnsInitialized = columns.reduce((sum, { width }) => sum + width, 0) > 0 || testEnv;
|
|
106
|
+
|
|
107
|
+
const [offsetLeftSum, offsetRightSum] = getScrollOffsetValue(columns);
|
|
108
|
+
const offsetSum = offsetLeftSum + offsetRightSum;
|
|
109
|
+
|
|
110
|
+
return sstyled(styles)(
|
|
111
|
+
<SBodyWrapper>
|
|
112
|
+
<ScrollArea
|
|
113
|
+
shadow
|
|
114
|
+
styles={scrollStyles}
|
|
115
|
+
use:left={`${offsetLeftSum}px`}
|
|
116
|
+
use:right={`${offsetRightSum}px`}
|
|
117
|
+
onResize={onResize}
|
|
118
|
+
>
|
|
119
|
+
<ScrollArea.Container ref={$scrollRef}>
|
|
120
|
+
<SBody render={Box}>{columnsInitialized ? this.renderRows(rows) : null}</SBody>
|
|
121
|
+
</ScrollArea.Container>
|
|
122
|
+
<SScrollAreaBar
|
|
123
|
+
orientation="horizontal"
|
|
124
|
+
left={`${offsetLeftSum}px`}
|
|
125
|
+
right={`${offsetRightSum}px`}
|
|
126
|
+
offsetSum={`${offsetSum}px`}
|
|
127
|
+
/>
|
|
128
|
+
<SScrollAreaBar orientation="vertical" />
|
|
129
|
+
</ScrollArea>
|
|
130
|
+
{Children.origin}
|
|
131
|
+
</SBodyWrapper>,
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export default Body;
|