@sproutsocial/seeds-react-table 1.0.3 → 1.0.4
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/.turbo/turbo-build.log +51 -35
- package/CHANGELOG.md +144 -0
- package/dist/Table-BzLSa3jk.d.ts +27 -0
- package/dist/Table-C6yuMYZA.d.mts +27 -0
- package/dist/{TableTypes-Dg7QrcGt.d.ts → TableTypes-DIUHC_FW.d.ts} +1 -1
- package/dist/{TableTypes-jS0O3bwQ.d.mts → TableTypes-i1Uir0xI.d.mts} +1 -1
- package/dist/esm/chunk-F73BV5I2.js +100 -0
- package/dist/esm/chunk-F73BV5I2.js.map +1 -0
- package/dist/esm/{chunk-SMHAMHIP.js → chunk-T7WTUUPA.js} +7 -7
- package/dist/esm/chunk-T7WTUUPA.js.map +1 -0
- package/dist/esm/{chunk-XJMS6762.js → chunk-WGM7UCXV.js} +6 -6
- package/dist/esm/chunk-WGM7UCXV.js.map +1 -0
- package/dist/esm/index.js +7 -97
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/{tableCell.js → v1/TableCell/index.js} +2 -2
- package/dist/esm/{tableHeaderCell.js → v1/TableHeaderCell/index.js} +2 -2
- package/dist/esm/{tableRowAccordion.js → v1/TableRowAccordion/index.js} +7 -7
- package/dist/esm/v1/TableRowAccordion/index.js.map +1 -0
- package/dist/esm/v1/index.js +13 -0
- package/dist/esm/v1/index.js.map +1 -0
- package/dist/esm/v2/index.js +138 -0
- package/dist/esm/v2/index.js.map +1 -0
- package/dist/index.d.mts +7 -26
- package/dist/index.d.ts +7 -26
- package/dist/index.js +20 -20
- package/dist/index.js.map +1 -1
- package/dist/{tableCell.d.ts → v1/TableCell/index.d.mts} +2 -2
- package/dist/{tableCell.d.mts → v1/TableCell/index.d.ts} +2 -2
- package/dist/{tableCell.js → v1/TableCell/index.js} +7 -7
- package/dist/v1/TableCell/index.js.map +1 -0
- package/dist/{tableHeaderCell.d.ts → v1/TableHeaderCell/index.d.mts} +3 -3
- package/dist/{tableHeaderCell.d.mts → v1/TableHeaderCell/index.d.ts} +3 -3
- package/dist/{tableHeaderCell.js → v1/TableHeaderCell/index.js} +8 -8
- package/dist/v1/TableHeaderCell/index.js.map +1 -0
- package/dist/{tableRowAccordion.d.mts → v1/TableRowAccordion/index.d.mts} +3 -3
- package/dist/{tableRowAccordion.d.ts → v1/TableRowAccordion/index.d.ts} +3 -3
- package/dist/{tableRowAccordion.js → v1/TableRowAccordion/index.js} +12 -12
- package/dist/v1/TableRowAccordion/index.js.map +1 -0
- package/dist/v1/index.d.mts +13 -0
- package/dist/v1/index.d.ts +13 -0
- package/dist/v1/index.js +323 -0
- package/dist/v1/index.js.map +1 -0
- package/dist/v2/index.d.mts +42 -0
- package/dist/v2/index.d.ts +42 -0
- package/dist/v2/index.js +189 -0
- package/dist/v2/index.js.map +1 -0
- package/package.json +23 -12
- package/src/index.ts +3 -2
- package/src/v1/index.ts +13 -0
- package/src/v2/TableV2.stories.tsx +242 -0
- package/src/v2/TableV2.tsx +91 -0
- package/src/v2/TableV2Types.ts +12 -0
- package/src/v2/__tests__/TableV2.typetest.tsx +109 -0
- package/src/v2/__tests__/table-v2.test.tsx +374 -0
- package/src/v2/index.ts +20 -0
- package/src/v2/styles.ts +82 -0
- package/tsup.config.ts +8 -6
- package/dist/esm/chunk-SMHAMHIP.js.map +0 -1
- package/dist/esm/chunk-XJMS6762.js.map +0 -1
- package/dist/esm/tableRowAccordion.js.map +0 -1
- package/dist/tableCell.js.map +0 -1
- package/dist/tableHeaderCell.js.map +0 -1
- package/dist/tableRowAccordion.js.map +0 -1
- /package/dist/esm/{tableCell.js.map → v1/TableCell/index.js.map} +0 -0
- /package/dist/esm/{tableHeaderCell.js.map → v1/TableHeaderCell/index.js.map} +0 -0
- /package/src/{Table.stories.tsx → v1/Table.stories.tsx} +0 -0
- /package/src/{Table.tsx → v1/Table.tsx} +0 -0
- /package/src/{TableCell → v1/TableCell}/TableCell.stories.tsx +0 -0
- /package/src/{TableCell → v1/TableCell}/TableCell.tsx +0 -0
- /package/src/{TableCell → v1/TableCell}/TableCellTypes.ts +0 -0
- /package/src/{TableCell → v1/TableCell}/__tests__/TabelCell.test.tsx +0 -0
- /package/src/{TableCell → v1/TableCell}/__tests__/TableCell.typetest.tsx +0 -0
- /package/src/{TableCell → v1/TableCell}/index.ts +0 -0
- /package/src/{TableCell → v1/TableCell}/styles.ts +0 -0
- /package/src/{TableHeaderCell → v1/TableHeaderCell}/TableHeaderCell.stories.tsx +0 -0
- /package/src/{TableHeaderCell → v1/TableHeaderCell}/TableHeaderCell.tsx +0 -0
- /package/src/{TableHeaderCell → v1/TableHeaderCell}/TableHeaderCellTypes.ts +0 -0
- /package/src/{TableHeaderCell → v1/TableHeaderCell}/__tests__/TableHeaderCell.test.tsx +0 -0
- /package/src/{TableHeaderCell → v1/TableHeaderCell}/__tests__/TableHeaderCell.typetest.tsx +0 -0
- /package/src/{TableHeaderCell → v1/TableHeaderCell}/constants.ts +0 -0
- /package/src/{TableHeaderCell → v1/TableHeaderCell}/index.ts +0 -0
- /package/src/{TableHeaderCell → v1/TableHeaderCell}/styles.ts +0 -0
- /package/src/{TableRowAccordion → v1/TableRowAccordion}/TableRowAccordion.stories.tsx +0 -0
- /package/src/{TableRowAccordion → v1/TableRowAccordion}/TableRowAccordion.tsx +0 -0
- /package/src/{TableRowAccordion → v1/TableRowAccordion}/TableRowAccordionTypes.ts +0 -0
- /package/src/{TableRowAccordion → v1/TableRowAccordion}/__tests__/TableRowAccordion.test.tsx +0 -0
- /package/src/{TableRowAccordion → v1/TableRowAccordion}/__tests__/TableRowAccordion.typetest.tsx +0 -0
- /package/src/{TableRowAccordion → v1/TableRowAccordion}/index.ts +0 -0
- /package/src/{TableRowAccordion → v1/TableRowAccordion}/styles.ts +0 -0
- /package/src/{TableTypes.ts → v1/TableTypes.ts} +0 -0
- /package/src/{__tests__ → v1/__tests__}/Table.test.tsx +0 -0
- /package/src/{__tests__ → v1/__tests__}/Table.typetest.tsx +0 -0
- /package/src/{styles.ts → v1/styles.ts} +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sproutsocial/seeds-react-table",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.4",
|
|
4
4
|
"description": "Seeds React Table",
|
|
5
5
|
"author": "Sprout Social, Inc.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -13,20 +13,30 @@
|
|
|
13
13
|
"import": "./dist/esm/index.js",
|
|
14
14
|
"require": "./dist/index.js"
|
|
15
15
|
},
|
|
16
|
+
"./v1": {
|
|
17
|
+
"types": "./dist/v1/index.d.ts",
|
|
18
|
+
"import": "./dist/esm/v1/index.js",
|
|
19
|
+
"require": "./dist/v1/index.js"
|
|
20
|
+
},
|
|
21
|
+
"./v2": {
|
|
22
|
+
"types": "./dist/v2/index.d.ts",
|
|
23
|
+
"import": "./dist/esm/v2/index.js",
|
|
24
|
+
"require": "./dist/v2/index.js"
|
|
25
|
+
},
|
|
16
26
|
"./TableCell": {
|
|
17
|
-
"types": "./dist/
|
|
18
|
-
"import": "./dist/esm/
|
|
19
|
-
"require": "./dist/
|
|
27
|
+
"types": "./dist/v1/TableCell/index.d.ts",
|
|
28
|
+
"import": "./dist/esm/v1/TableCell/index.js",
|
|
29
|
+
"require": "./dist/v1/TableCell/index.js"
|
|
20
30
|
},
|
|
21
31
|
"./TableHeaderCell": {
|
|
22
|
-
"types": "./dist/
|
|
23
|
-
"import": "./dist/esm/
|
|
24
|
-
"require": "./dist/
|
|
32
|
+
"types": "./dist/v1/TableHeaderCell/index.d.ts",
|
|
33
|
+
"import": "./dist/esm/v1/TableHeaderCell/index.js",
|
|
34
|
+
"require": "./dist/v1/TableHeaderCell/index.js"
|
|
25
35
|
},
|
|
26
36
|
"./TableRowAccordion": {
|
|
27
|
-
"types": "./dist/
|
|
28
|
-
"import": "./dist/esm/
|
|
29
|
-
"require": "./dist/
|
|
37
|
+
"types": "./dist/v1/TableRowAccordion/index.d.ts",
|
|
38
|
+
"import": "./dist/esm/v1/TableRowAccordion/index.js",
|
|
39
|
+
"require": "./dist/v1/TableRowAccordion/index.js"
|
|
30
40
|
}
|
|
31
41
|
},
|
|
32
42
|
"scripts": {
|
|
@@ -41,8 +51,9 @@
|
|
|
41
51
|
},
|
|
42
52
|
"dependencies": {
|
|
43
53
|
"@sproutsocial/seeds-react-theme": "^3.1.0",
|
|
44
|
-
"@sproutsocial/seeds-react-system-props": "^3.0.
|
|
45
|
-
"@sproutsocial/seeds-react-icon": "^1.1.4"
|
|
54
|
+
"@sproutsocial/seeds-react-system-props": "^3.0.2",
|
|
55
|
+
"@sproutsocial/seeds-react-icon": "^1.1.4",
|
|
56
|
+
"@sproutsocial/seeds-react-text": "^1.3.2"
|
|
46
57
|
},
|
|
47
58
|
"devDependencies": {
|
|
48
59
|
"@types/react": "^18.0.0",
|
package/src/index.ts
CHANGED
package/src/v1/index.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// V1 Table - Explicit exports for optimal tree shaking
|
|
2
|
+
import Table from "./Table";
|
|
3
|
+
|
|
4
|
+
export default Table;
|
|
5
|
+
export { Table };
|
|
6
|
+
|
|
7
|
+
// Explicit type exports
|
|
8
|
+
export type {
|
|
9
|
+
TypeTableProps,
|
|
10
|
+
TypeTableRow,
|
|
11
|
+
TypeTableHeadProp,
|
|
12
|
+
TypePassthroughProps,
|
|
13
|
+
} from "./TableTypes";
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
3
|
+
import TableV2, {
|
|
4
|
+
TableWrapper,
|
|
5
|
+
TableRoot,
|
|
6
|
+
TableCaption,
|
|
7
|
+
TableHeader,
|
|
8
|
+
TableBody,
|
|
9
|
+
TableRow,
|
|
10
|
+
TableHeaderCell,
|
|
11
|
+
TableCell,
|
|
12
|
+
} from "./TableV2";
|
|
13
|
+
import { Text } from "@sproutsocial/seeds-react-text";
|
|
14
|
+
import { Icon } from "@sproutsocial/seeds-react-icon";
|
|
15
|
+
import { Badge } from "@sproutsocial/seeds-react-badge";
|
|
16
|
+
|
|
17
|
+
export default {
|
|
18
|
+
title: "Components/TableV2",
|
|
19
|
+
component: TableV2,
|
|
20
|
+
} as Meta;
|
|
21
|
+
|
|
22
|
+
type Story = StoryObj<typeof TableV2>;
|
|
23
|
+
|
|
24
|
+
export const Default: Story = {
|
|
25
|
+
args: {
|
|
26
|
+
caption: "Table Caption",
|
|
27
|
+
displayCaption: true,
|
|
28
|
+
columns: ["Header 1", "Header 2", "Header 3"],
|
|
29
|
+
data: [
|
|
30
|
+
["Data 1", "Data 2", "Data 3"],
|
|
31
|
+
["Data 4", "Data 5", "Data 6"],
|
|
32
|
+
],
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export const HiddenCaption: Story = {
|
|
37
|
+
args: {
|
|
38
|
+
caption: "Table Caption",
|
|
39
|
+
displayCaption: false,
|
|
40
|
+
columns: ["Header 1", "Header 2", "Header 3"],
|
|
41
|
+
data: [
|
|
42
|
+
["Data 1", "Data 2", "Data 3"],
|
|
43
|
+
["Data 4", "Data 5", "Data 6"],
|
|
44
|
+
],
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
export const WithJSXElements: Story = {
|
|
49
|
+
args: {
|
|
50
|
+
caption: "Project Status Table",
|
|
51
|
+
displayCaption: true,
|
|
52
|
+
columns: ["Project", "Status", "Priority", "Owner"],
|
|
53
|
+
data: [
|
|
54
|
+
[
|
|
55
|
+
<Text
|
|
56
|
+
key="project-1"
|
|
57
|
+
fontSize={400}
|
|
58
|
+
fontWeight="semibold"
|
|
59
|
+
color="green.700"
|
|
60
|
+
qa={{ "data-testid": "project-1" }}
|
|
61
|
+
>
|
|
62
|
+
Website Redesign
|
|
63
|
+
</Text>,
|
|
64
|
+
<Badge key="status-1">Complete</Badge>,
|
|
65
|
+
<div
|
|
66
|
+
key="priority-1"
|
|
67
|
+
style={{ display: "flex", alignItems: "center", gap: "4px" }}
|
|
68
|
+
>
|
|
69
|
+
<Icon name="flag-solid" size="mini" color="red.600" />
|
|
70
|
+
<Text
|
|
71
|
+
fontSize={300}
|
|
72
|
+
qa={{ "data-testid": "project-1" }}
|
|
73
|
+
color="red.600"
|
|
74
|
+
>
|
|
75
|
+
High
|
|
76
|
+
</Text>
|
|
77
|
+
</div>,
|
|
78
|
+
<Text
|
|
79
|
+
key="owner-1"
|
|
80
|
+
fontSize={400}
|
|
81
|
+
qa={{ "data-testid": "project-1" }}
|
|
82
|
+
color="red.600"
|
|
83
|
+
>
|
|
84
|
+
Jane Doe
|
|
85
|
+
</Text>,
|
|
86
|
+
],
|
|
87
|
+
[
|
|
88
|
+
<Text
|
|
89
|
+
key="project-2"
|
|
90
|
+
fontSize={400}
|
|
91
|
+
qa={{ "data-testid": "project-2" }}
|
|
92
|
+
fontWeight="semibold"
|
|
93
|
+
color="purple.700"
|
|
94
|
+
>
|
|
95
|
+
API Integration
|
|
96
|
+
</Text>,
|
|
97
|
+
<Badge key="status-2">In Progress</Badge>,
|
|
98
|
+
<div
|
|
99
|
+
key="priority-2"
|
|
100
|
+
style={{ display: "flex", alignItems: "center", gap: "4px" }}
|
|
101
|
+
>
|
|
102
|
+
<Icon name="flag-solid" size="mini" color="orange.600" />
|
|
103
|
+
<Text
|
|
104
|
+
fontSize={300}
|
|
105
|
+
qa={{ "data-testid": "project-2" }}
|
|
106
|
+
color="orange.600"
|
|
107
|
+
>
|
|
108
|
+
Medium
|
|
109
|
+
</Text>
|
|
110
|
+
</div>,
|
|
111
|
+
<Text
|
|
112
|
+
key="owner-2"
|
|
113
|
+
qa={{ "data-testid": "project-2" }}
|
|
114
|
+
color="orange.600"
|
|
115
|
+
fontSize={400}
|
|
116
|
+
>
|
|
117
|
+
John Smith
|
|
118
|
+
</Text>,
|
|
119
|
+
],
|
|
120
|
+
[
|
|
121
|
+
<Text
|
|
122
|
+
key="project-3"
|
|
123
|
+
fontSize={400}
|
|
124
|
+
fontWeight="semibold"
|
|
125
|
+
qa={{ "data-testid": "project-2" }}
|
|
126
|
+
color="orange.600"
|
|
127
|
+
>
|
|
128
|
+
Documentation Update
|
|
129
|
+
</Text>,
|
|
130
|
+
<Badge key="status-3">Not Started</Badge>,
|
|
131
|
+
<div
|
|
132
|
+
key="priority-3"
|
|
133
|
+
style={{ display: "flex", alignItems: "center", gap: "4px" }}
|
|
134
|
+
>
|
|
135
|
+
<Icon name="flag-solid" size="mini" color="green.600" />
|
|
136
|
+
<Text
|
|
137
|
+
fontSize={300}
|
|
138
|
+
qa={{ "data-testid": "project-2" }}
|
|
139
|
+
color="green.600"
|
|
140
|
+
>
|
|
141
|
+
Low
|
|
142
|
+
</Text>
|
|
143
|
+
</div>,
|
|
144
|
+
<Text
|
|
145
|
+
key="owner-3"
|
|
146
|
+
fontSize={400}
|
|
147
|
+
qa={{ "data-testid": "project-2" }}
|
|
148
|
+
color="green.600"
|
|
149
|
+
>
|
|
150
|
+
Sarah Johnson
|
|
151
|
+
</Text>,
|
|
152
|
+
],
|
|
153
|
+
],
|
|
154
|
+
},
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
export const GranularComponents: Story = {
|
|
158
|
+
render: () => (
|
|
159
|
+
<TableWrapper>
|
|
160
|
+
<TableRoot>
|
|
161
|
+
<TableCaption isVisible={true}>Employee Directory</TableCaption>
|
|
162
|
+
<TableHeader>
|
|
163
|
+
<TableRow>
|
|
164
|
+
<TableHeaderCell scope="col">Name</TableHeaderCell>
|
|
165
|
+
<TableHeaderCell scope="col">Department</TableHeaderCell>
|
|
166
|
+
<TableHeaderCell scope="col">Role</TableHeaderCell>
|
|
167
|
+
<TableHeaderCell scope="col">Status</TableHeaderCell>
|
|
168
|
+
</TableRow>
|
|
169
|
+
</TableHeader>
|
|
170
|
+
<TableBody>
|
|
171
|
+
<TableRow>
|
|
172
|
+
<TableCell>
|
|
173
|
+
<Text fontSize={400} fontWeight="semibold" color="blue.700">
|
|
174
|
+
Alice Johnson
|
|
175
|
+
</Text>
|
|
176
|
+
</TableCell>
|
|
177
|
+
<TableCell>
|
|
178
|
+
<Text fontSize={300} color="gray.700">
|
|
179
|
+
Engineering
|
|
180
|
+
</Text>
|
|
181
|
+
</TableCell>
|
|
182
|
+
<TableCell>
|
|
183
|
+
<Text fontSize={300} color="gray.700">
|
|
184
|
+
Senior Developer
|
|
185
|
+
</Text>
|
|
186
|
+
</TableCell>
|
|
187
|
+
<TableCell>
|
|
188
|
+
<Badge>Active</Badge>
|
|
189
|
+
</TableCell>
|
|
190
|
+
</TableRow>
|
|
191
|
+
<TableRow>
|
|
192
|
+
<TableCell>
|
|
193
|
+
<Text fontSize={400} fontWeight="semibold" color="purple.700">
|
|
194
|
+
Bob Smith
|
|
195
|
+
</Text>
|
|
196
|
+
</TableCell>
|
|
197
|
+
<TableCell>
|
|
198
|
+
<Text fontSize={300} color="gray.700">
|
|
199
|
+
Design
|
|
200
|
+
</Text>
|
|
201
|
+
</TableCell>
|
|
202
|
+
<TableCell>
|
|
203
|
+
<Text fontSize={300} color="gray.700">
|
|
204
|
+
UX Designer
|
|
205
|
+
</Text>
|
|
206
|
+
</TableCell>
|
|
207
|
+
<TableCell>
|
|
208
|
+
<Badge>Active</Badge>
|
|
209
|
+
</TableCell>
|
|
210
|
+
</TableRow>
|
|
211
|
+
<TableRow>
|
|
212
|
+
<TableCell>
|
|
213
|
+
<Text fontSize={400} fontWeight="semibold" color="green.700">
|
|
214
|
+
Carol Davis
|
|
215
|
+
</Text>
|
|
216
|
+
</TableCell>
|
|
217
|
+
<TableCell>
|
|
218
|
+
<Text fontSize={300} color="gray.700">
|
|
219
|
+
Marketing
|
|
220
|
+
</Text>
|
|
221
|
+
</TableCell>
|
|
222
|
+
<TableCell>
|
|
223
|
+
<Text fontSize={300} color="gray.700">
|
|
224
|
+
Marketing Manager
|
|
225
|
+
</Text>
|
|
226
|
+
</TableCell>
|
|
227
|
+
<TableCell>
|
|
228
|
+
<div
|
|
229
|
+
style={{ display: "flex", alignItems: "center", gap: "4px" }}
|
|
230
|
+
>
|
|
231
|
+
<Icon name="clock-solid" size="mini" color="orange.600" />
|
|
232
|
+
<Text fontSize={300} color="orange.600">
|
|
233
|
+
On Leave
|
|
234
|
+
</Text>
|
|
235
|
+
</div>
|
|
236
|
+
</TableCell>
|
|
237
|
+
</TableRow>
|
|
238
|
+
</TableBody>
|
|
239
|
+
</TableRoot>
|
|
240
|
+
</TableWrapper>
|
|
241
|
+
),
|
|
242
|
+
};
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import React, { useId } from "react";
|
|
2
|
+
import { type TableV2Props } from "./TableV2Types";
|
|
3
|
+
import {
|
|
4
|
+
StyledTableV2Container,
|
|
5
|
+
StyledTableV2,
|
|
6
|
+
StyledCaption,
|
|
7
|
+
StyledTableHeader,
|
|
8
|
+
StyledTableBody,
|
|
9
|
+
StyledTableRow,
|
|
10
|
+
StyledTableHeaderCell,
|
|
11
|
+
StyledTableCell,
|
|
12
|
+
} from "./styles";
|
|
13
|
+
|
|
14
|
+
const TableContainerContext = React.createContext<string | null>(null);
|
|
15
|
+
|
|
16
|
+
export const useTableContainerId = () =>
|
|
17
|
+
React.useContext(TableContainerContext);
|
|
18
|
+
|
|
19
|
+
export const TableWrapper = ({
|
|
20
|
+
children,
|
|
21
|
+
...rest
|
|
22
|
+
}: {
|
|
23
|
+
children: React.ReactElement;
|
|
24
|
+
}) => {
|
|
25
|
+
const containerId = useId();
|
|
26
|
+
return (
|
|
27
|
+
<TableContainerContext.Provider value={containerId}>
|
|
28
|
+
<StyledTableV2Container
|
|
29
|
+
role="region"
|
|
30
|
+
tabIndex={0}
|
|
31
|
+
id={containerId}
|
|
32
|
+
aria-labelledby={containerId}
|
|
33
|
+
{...rest}
|
|
34
|
+
>
|
|
35
|
+
{children}
|
|
36
|
+
</StyledTableV2Container>
|
|
37
|
+
</TableContainerContext.Provider>
|
|
38
|
+
);
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const TableV2 = ({
|
|
42
|
+
caption,
|
|
43
|
+
displayCaption = true,
|
|
44
|
+
columns,
|
|
45
|
+
data,
|
|
46
|
+
}: TableV2Props) => {
|
|
47
|
+
const containerId = useTableContainerId();
|
|
48
|
+
|
|
49
|
+
return (
|
|
50
|
+
<TableWrapper>
|
|
51
|
+
<StyledTableV2>
|
|
52
|
+
<StyledCaption id={containerId ?? undefined} isVisible={displayCaption}>
|
|
53
|
+
{caption}
|
|
54
|
+
</StyledCaption>
|
|
55
|
+
<StyledTableHeader>
|
|
56
|
+
<StyledTableRow>
|
|
57
|
+
{columns.map((column, index) => (
|
|
58
|
+
<StyledTableHeaderCell key={index} scope="col">
|
|
59
|
+
{column}
|
|
60
|
+
</StyledTableHeaderCell>
|
|
61
|
+
))}
|
|
62
|
+
</StyledTableRow>
|
|
63
|
+
</StyledTableHeader>
|
|
64
|
+
<StyledTableBody>
|
|
65
|
+
{data.map((row, rowIndex) => (
|
|
66
|
+
<StyledTableRow key={rowIndex}>
|
|
67
|
+
{row.map((cell, cellIndex) => (
|
|
68
|
+
<StyledTableCell key={cellIndex}>{cell}</StyledTableCell>
|
|
69
|
+
))}
|
|
70
|
+
</StyledTableRow>
|
|
71
|
+
))}
|
|
72
|
+
</StyledTableBody>
|
|
73
|
+
</StyledTableV2>
|
|
74
|
+
</TableWrapper>
|
|
75
|
+
);
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
// Export the full Table component as Table (main export)
|
|
79
|
+
export const Table = TableV2;
|
|
80
|
+
|
|
81
|
+
// Export styled components for compound component usage
|
|
82
|
+
export const TableRoot = StyledTableV2;
|
|
83
|
+
export const TableCaption = StyledCaption;
|
|
84
|
+
export const TableHeader = StyledTableHeader;
|
|
85
|
+
export const TableBody = StyledTableBody;
|
|
86
|
+
export const TableRow = StyledTableRow;
|
|
87
|
+
export const TableHeaderCell = StyledTableHeaderCell;
|
|
88
|
+
export const TableCell = StyledTableCell;
|
|
89
|
+
|
|
90
|
+
// Default export
|
|
91
|
+
export default TableV2;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
|
|
3
|
+
export type ColumnHeader = string | React.ReactNode;
|
|
4
|
+
|
|
5
|
+
export type RowData = Array<string | React.ReactNode>;
|
|
6
|
+
|
|
7
|
+
export interface TableV2Props {
|
|
8
|
+
caption: string;
|
|
9
|
+
displayCaption?: boolean;
|
|
10
|
+
columns: ColumnHeader[];
|
|
11
|
+
data: RowData[];
|
|
12
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import TableV2, {
|
|
3
|
+
TableWrapper,
|
|
4
|
+
TableRoot,
|
|
5
|
+
TableCaption,
|
|
6
|
+
TableHeader,
|
|
7
|
+
TableBody,
|
|
8
|
+
TableRow,
|
|
9
|
+
TableHeaderCell,
|
|
10
|
+
TableCell,
|
|
11
|
+
} from "../TableV2";
|
|
12
|
+
|
|
13
|
+
// This file tests TypeScript type checking for TableV2
|
|
14
|
+
// It doesn't need to run, just needs to compile without errors
|
|
15
|
+
|
|
16
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
17
|
+
function TableV2Types() {
|
|
18
|
+
const columns = ["Name", "Age", "Occupation"];
|
|
19
|
+
const data = [
|
|
20
|
+
["John Doe", "30", "Engineer"],
|
|
21
|
+
["Jane Smith", "25", "Designer"],
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
return (
|
|
25
|
+
<>
|
|
26
|
+
{/* Valid: All required props */}
|
|
27
|
+
<TableV2 caption="User Data" columns={columns} data={data} />
|
|
28
|
+
|
|
29
|
+
{/* Valid: With displayCaption */}
|
|
30
|
+
<TableV2
|
|
31
|
+
caption="User Data"
|
|
32
|
+
columns={columns}
|
|
33
|
+
data={data}
|
|
34
|
+
displayCaption={true}
|
|
35
|
+
/>
|
|
36
|
+
|
|
37
|
+
{/* Valid: With displayCaption false */}
|
|
38
|
+
<TableV2
|
|
39
|
+
caption="User Data"
|
|
40
|
+
columns={columns}
|
|
41
|
+
data={data}
|
|
42
|
+
displayCaption={false}
|
|
43
|
+
/>
|
|
44
|
+
|
|
45
|
+
{/* Valid: With JSX in columns */}
|
|
46
|
+
<TableV2
|
|
47
|
+
caption="JSX Columns"
|
|
48
|
+
columns={[<strong key="1">Name</strong>, "Age"]}
|
|
49
|
+
data={data}
|
|
50
|
+
/>
|
|
51
|
+
|
|
52
|
+
{/* Valid: With JSX in data */}
|
|
53
|
+
<TableV2
|
|
54
|
+
caption="JSX Data"
|
|
55
|
+
columns={columns}
|
|
56
|
+
data={[[<strong key="1">John</strong>, "30", "Engineer"]]}
|
|
57
|
+
/>
|
|
58
|
+
|
|
59
|
+
{/* Valid: Empty data */}
|
|
60
|
+
<TableV2 caption="Empty Table" columns={columns} data={[]} />
|
|
61
|
+
|
|
62
|
+
{/* @ts-expect-error - missing required prop: caption */}
|
|
63
|
+
<TableV2 columns={columns} data={data} />
|
|
64
|
+
|
|
65
|
+
{/* @ts-expect-error - missing required prop: columns */}
|
|
66
|
+
<TableV2 caption="Missing Columns" data={data} />
|
|
67
|
+
|
|
68
|
+
{/* @ts-expect-error - missing required prop: data */}
|
|
69
|
+
<TableV2 caption="Missing Data" columns={columns} />
|
|
70
|
+
|
|
71
|
+
{/* prettier-ignore */}
|
|
72
|
+
<TableV2
|
|
73
|
+
caption="Invalid Caption"
|
|
74
|
+
columns={columns}
|
|
75
|
+
data={data}
|
|
76
|
+
// @ts-expect-error - displayCaption should be boolean, not string
|
|
77
|
+
displayCaption="true"
|
|
78
|
+
/>
|
|
79
|
+
|
|
80
|
+
{/* @ts-expect-error - columns should be an array */}
|
|
81
|
+
<TableV2 caption="Invalid Columns" columns="invalid" data={data} />
|
|
82
|
+
|
|
83
|
+
{/* @ts-expect-error - data should be a 2D array */}
|
|
84
|
+
<TableV2 caption="Invalid Data" columns={columns} data="invalid" />
|
|
85
|
+
</>
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Test compound component types
|
|
90
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
91
|
+
function CompoundComponentTypes() {
|
|
92
|
+
return (
|
|
93
|
+
<TableWrapper>
|
|
94
|
+
<TableRoot>
|
|
95
|
+
<TableCaption isVisible={true}>Custom Table</TableCaption>
|
|
96
|
+
<TableHeader>
|
|
97
|
+
<TableRow>
|
|
98
|
+
<TableHeaderCell scope="col">Header</TableHeaderCell>
|
|
99
|
+
</TableRow>
|
|
100
|
+
</TableHeader>
|
|
101
|
+
<TableBody>
|
|
102
|
+
<TableRow>
|
|
103
|
+
<TableCell>Data</TableCell>
|
|
104
|
+
</TableRow>
|
|
105
|
+
</TableBody>
|
|
106
|
+
</TableRoot>
|
|
107
|
+
</TableWrapper>
|
|
108
|
+
);
|
|
109
|
+
}
|