1
+ import React , { useMemo } from "react" ;
2
+ import styled from "styled-components" ;
3
+ import Skeleton from "antd/es/skeleton" ;
4
+ import { SkeletonButtonProps } from "antd/es/skeleton/Button" ;
5
+ import { defaultTheme } from "@lowcoder-ee/constants/themeConstants" ;
6
+ import { OB_ROW_ORI_INDEX } from "../tableUtils" ;
7
+ import { TableColumnLinkStyleType , TableColumnStyleType , ThemeDetail } from "comps/controls/styleControlConstants" ;
8
+ import { RowColorViewType , RowHeightViewType } from "../tableTypes" ;
9
+ import { CellColorViewType } from "../column/tableColumnComp" ;
10
+
11
+ interface TableTdProps {
12
+ $background : string ;
13
+ $style : TableColumnStyleType & { rowHeight ?: string } ;
14
+ $defaultThemeDetail : ThemeDetail ;
15
+ $linkStyle ?: TableColumnLinkStyleType ;
16
+ $tableSize ?: string ;
17
+ $autoHeight ?: boolean ;
18
+ $customAlign ?: 'left' | 'center' | 'right' ;
19
+ }
20
+
21
+ const TableTd = styled . td < TableTdProps > `
22
+ .ant-table-row-expand-icon,
23
+ .ant-table-row-indent {
24
+ display: initial;
25
+ }
26
+ &.ant-table-row-expand-icon-cell {
27
+ background: ${ ( props ) => props . $background } ;
28
+ border-color: ${ ( props ) => props . $style . border } ;
29
+ }
30
+ background: ${ ( props ) => props . $background } !important;
31
+ border-color: ${ ( props ) => props . $style . border } !important;
32
+ border-radius: ${ ( props ) => props . $style . radius } ;
33
+ padding: 0 !important;
34
+ text-align: ${ ( props ) => props . $customAlign || 'left' } !important;
35
+
36
+ > div {
37
+ margin: ${ ( props ) => props . $style . margin } ;
38
+ color: ${ ( props ) => props . $style . text } ;
39
+ font-weight: ${ ( props ) => props . $style . textWeight } ;
40
+ font-family: ${ ( props ) => props . $style . fontFamily } ;
41
+ overflow: hidden;
42
+ display: flex;
43
+ justify-content: ${ ( props ) => props . $customAlign === 'center' ? 'center' : props . $customAlign === 'right' ? 'flex-end' : 'flex-start' } ;
44
+ align-items: center;
45
+ text-align: ${ ( props ) => props . $customAlign || 'left' } ;
46
+ box-sizing: border-box;
47
+ ${ ( props ) => props . $tableSize === 'small' && `
48
+ padding: 1px 8px;
49
+ font-size: ${ props . $defaultThemeDetail . textSize == props . $style . textSize ? '14px !important' : props . $style . textSize + ' !important' } ;
50
+ font-style:${ props . $style . fontStyle } !important;
51
+ min-height: ${ props . $style . rowHeight || '14px' } ;
52
+ line-height: 20px;
53
+ ${ ! props . $autoHeight && `
54
+ overflow-y: auto;
55
+ max-height: ${ props . $style . rowHeight || '28px' } ;
56
+ ` } ;
57
+ ` } ;
58
+ ${ ( props ) => props . $tableSize === 'middle' && `
59
+ padding: 8px 8px;
60
+ font-size: ${ props . $defaultThemeDetail . textSize == props . $style . textSize ? '16px !important' : props . $style . textSize + ' !important' } ;
61
+ font-style:${ props . $style . fontStyle } !important;
62
+ min-height: ${ props . $style . rowHeight || '24px' } ;
63
+ line-height: 24px;
64
+ ${ ! props . $autoHeight && `
65
+ overflow-y: auto;
66
+ max-height: ${ props . $style . rowHeight || '48px' } ;
67
+ ` } ;
68
+ ` } ;
69
+ ${ ( props ) => props . $tableSize === 'large' && `
70
+ padding: 16px 16px;
71
+ font-size: ${ props . $defaultThemeDetail . textSize == props . $style . textSize ? '18px !important' : props . $style . textSize + ' !important' } ;
72
+ font-style:${ props . $style . fontStyle } !important;
73
+ min-height: ${ props . $style . rowHeight || '48px' } ;
74
+ ${ ! props . $autoHeight && `
75
+ overflow-y: auto;
76
+ max-height: ${ props . $style . rowHeight || '96px' } ;
77
+ ` } ;
78
+ ` } ;
79
+
80
+ > .ant-badge > .ant-badge-status-text,
81
+ > div > .markdown-body {
82
+ color: ${ ( props ) => props . $style . text } ;
83
+ }
84
+
85
+ > div > svg g {
86
+ stroke: ${ ( props ) => props . $style . text } ;
87
+ }
88
+
89
+ > a,
90
+ > div a {
91
+ color: ${ ( props ) => props . $linkStyle ?. text } ;
92
+
93
+ &:hover {
94
+ color: ${ ( props ) => props . $linkStyle ?. hoverText } ;
95
+ }
96
+
97
+ &:active {
98
+ color: ${ ( props ) => props . $linkStyle ?. activeText } ;
99
+ }
100
+ }
101
+ }
102
+ ` ;
103
+
104
+ const TableTdLoading = styled ( Skeleton . Button ) < SkeletonButtonProps & { $tableSize ?: string } > `
105
+ width: 90% !important;
106
+ display: table !important;
107
+
108
+ .ant-skeleton-button {
109
+ min-width: auto !important;
110
+ display: block !important;
111
+ ${ ( props ) => props . $tableSize === 'small' && `
112
+ height: 20px !important;
113
+ ` }
114
+ ${ ( props ) => props . $tableSize === 'middle' && `
115
+ height: 24px !important;
116
+ ` }
117
+ ${ ( props ) => props . $tableSize === 'large' && `
118
+ height: 28px !important;
119
+ ` }
120
+ }
121
+ ` ;
122
+
123
+ const TableCellView = React . memo ( ( props : {
124
+ record : any ;
125
+ title : string ;
126
+ rowColorFn : RowColorViewType ;
127
+ rowHeightFn : RowHeightViewType ;
128
+ cellColorFn : CellColorViewType ;
129
+ rowIndex : number ;
130
+ children : any ;
131
+ columnsStyle : TableColumnStyleType ;
132
+ columnStyle : TableColumnStyleType ;
133
+ linkStyle : TableColumnLinkStyleType ;
134
+ tableSize ?: string ;
135
+ autoHeight ?: boolean ;
136
+ loading ?: boolean ;
137
+ customAlign ?: 'left' | 'center' | 'right' ;
138
+ } ) => {
139
+ const {
140
+ record,
141
+ title,
142
+ rowIndex,
143
+ rowColorFn,
144
+ rowHeightFn,
145
+ cellColorFn,
146
+ children,
147
+ columnsStyle,
148
+ columnStyle,
149
+ linkStyle,
150
+ tableSize,
151
+ autoHeight,
152
+ loading,
153
+ customAlign,
154
+ ...restProps
155
+ } = props ;
156
+
157
+ const style = useMemo ( ( ) => {
158
+ if ( ! record ) return null ;
159
+ const rowColor = rowColorFn ( {
160
+ currentRow : record ,
161
+ currentIndex : rowIndex ,
162
+ currentOriginalIndex : record [ OB_ROW_ORI_INDEX ] ,
163
+ columnTitle : title ,
164
+ } ) ;
165
+ const rowHeight = rowHeightFn ( {
166
+ currentRow : record ,
167
+ currentIndex : rowIndex ,
168
+ currentOriginalIndex : record [ OB_ROW_ORI_INDEX ] ,
169
+ columnTitle : title ,
170
+ } ) ;
171
+ const cellColor = cellColorFn ( {
172
+ currentCell : record [ title ] ,
173
+ currentRow : record ,
174
+ } ) ;
175
+
176
+ return {
177
+ background : cellColor || rowColor || columnStyle . background || columnsStyle . background ,
178
+ margin : columnStyle . margin || columnsStyle . margin ,
179
+ text : columnStyle . text || columnsStyle . text ,
180
+ border : columnStyle . border || columnsStyle . border ,
181
+ radius : columnStyle . radius || columnsStyle . radius ,
182
+ textSize : columnStyle . textSize || columnsStyle . textSize ,
183
+ textWeight : columnsStyle . textWeight || columnStyle . textWeight ,
184
+ fontFamily : columnsStyle . fontFamily || columnStyle . fontFamily ,
185
+ fontStyle : columnsStyle . fontStyle || columnStyle . fontStyle ,
186
+ rowHeight : rowHeight ,
187
+ } as TableColumnStyleType & { rowHeight ?: string } ;
188
+ } , [ record , rowIndex , title , rowColorFn , rowHeightFn , cellColorFn , columnStyle , columnsStyle ] ) ;
189
+
190
+ if ( ! record ) {
191
+ return < td { ...restProps } > { children } </ td > as any ;
192
+ }
193
+
194
+ const { background } = style ! ;
195
+
196
+ return (
197
+ < TableTd
198
+ { ...restProps }
199
+ $background = { background }
200
+ $style = { style ! }
201
+ $defaultThemeDetail = { defaultTheme }
202
+ $linkStyle = { linkStyle }
203
+ $tableSize = { tableSize }
204
+ $autoHeight = { autoHeight }
205
+ $customAlign = { customAlign }
206
+ >
207
+ { loading ? < TableTdLoading block active $tableSize = { tableSize } /> : children }
208
+ </ TableTd >
209
+ ) ;
210
+ } ) ;
211
+
212
+ export default TableCellView ;
0 commit comments