@justeattakeaway/pie-data-table 0.1.6 → 0.2.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/custom-elements.json +238 -3
- package/dist/PieElement-B3g_8vKy.js +11 -0
- package/dist/defs-react.d.ts +9 -0
- package/dist/defs-react.d.ts.map +1 -0
- package/dist/defs.d.ts +35 -0
- package/dist/defs.d.ts.map +1 -0
- package/dist/index.d.ts +45 -20
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +100 -20
- package/dist/pie-data-table-header/defs-react.d.ts +9 -0
- package/dist/pie-data-table-header/defs-react.d.ts.map +1 -0
- package/dist/pie-data-table-header/defs.d.ts +18 -0
- package/dist/pie-data-table-header/defs.d.ts.map +1 -0
- package/dist/pie-data-table-header/index.d.ts +42 -0
- package/dist/pie-data-table-header/index.d.ts.map +1 -0
- package/dist/pie-data-table-header/index.js +84 -0
- package/dist/pie-data-table-header/react.d.ts +7 -0
- package/dist/pie-data-table-header/react.d.ts.map +1 -0
- package/dist/pie-data-table-header/react.js +16 -0
- package/dist/react.d.ts +7 -25
- package/dist/react.d.ts.map +1 -0
- package/dist/react.js +4 -2
- package/package.json +1 -1
- package/src/data-table.scss +67 -2
- package/src/defs.ts +42 -3
- package/src/index.ts +101 -3
- package/src/pie-data-table-header/data-table-header.scss +46 -0
- package/src/pie-data-table-header/defs-react.ts +8 -0
- package/src/pie-data-table-header/defs.ts +22 -0
- package/src/pie-data-table-header/index.ts +104 -0
- package/src/pie-data-table-header/react.ts +19 -0
package/custom-elements.json
CHANGED
|
@@ -11,8 +11,26 @@
|
|
|
11
11
|
{
|
|
12
12
|
"kind": "javascript-module",
|
|
13
13
|
"path": "src/defs.js",
|
|
14
|
-
"declarations": [
|
|
15
|
-
|
|
14
|
+
"declarations": [
|
|
15
|
+
{
|
|
16
|
+
"kind": "variable",
|
|
17
|
+
"name": "defaultProps",
|
|
18
|
+
"type": {
|
|
19
|
+
"text": "ComponentDefaultProps<DataTableProps, keyof Omit<DataTableProps, 'columns' | 'data'>>"
|
|
20
|
+
},
|
|
21
|
+
"default": "{\n hasBorder: true,\n isStriped: false,\n}"
|
|
22
|
+
}
|
|
23
|
+
],
|
|
24
|
+
"exports": [
|
|
25
|
+
{
|
|
26
|
+
"kind": "js",
|
|
27
|
+
"name": "defaultProps",
|
|
28
|
+
"declaration": {
|
|
29
|
+
"name": "defaultProps",
|
|
30
|
+
"module": "src/defs.js"
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
]
|
|
16
34
|
},
|
|
17
35
|
{
|
|
18
36
|
"kind": "javascript-module",
|
|
@@ -22,7 +40,77 @@
|
|
|
22
40
|
"kind": "class",
|
|
23
41
|
"description": "",
|
|
24
42
|
"name": "PieDataTable",
|
|
25
|
-
"members": [
|
|
43
|
+
"members": [
|
|
44
|
+
{
|
|
45
|
+
"kind": "field",
|
|
46
|
+
"name": "columns",
|
|
47
|
+
"type": {
|
|
48
|
+
"text": "Column[]"
|
|
49
|
+
},
|
|
50
|
+
"privacy": "public",
|
|
51
|
+
"default": "[]",
|
|
52
|
+
"description": "Array of column definitions"
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"kind": "field",
|
|
56
|
+
"name": "data",
|
|
57
|
+
"type": {
|
|
58
|
+
"text": "Record<string, unknown>[]"
|
|
59
|
+
},
|
|
60
|
+
"privacy": "public",
|
|
61
|
+
"default": "[]",
|
|
62
|
+
"description": "Array of data objects to display"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"kind": "method",
|
|
66
|
+
"name": "renderHeaderCell",
|
|
67
|
+
"privacy": "private",
|
|
68
|
+
"parameters": [
|
|
69
|
+
{
|
|
70
|
+
"name": "column",
|
|
71
|
+
"type": {
|
|
72
|
+
"text": "Column"
|
|
73
|
+
},
|
|
74
|
+
"description": "The column definition to render"
|
|
75
|
+
}
|
|
76
|
+
],
|
|
77
|
+
"description": "Renders a header cell for the table"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"kind": "method",
|
|
81
|
+
"name": "renderTableHeader",
|
|
82
|
+
"privacy": "private",
|
|
83
|
+
"description": "Renders the table header"
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"kind": "method",
|
|
87
|
+
"name": "renderTableCell",
|
|
88
|
+
"privacy": "private",
|
|
89
|
+
"parameters": [
|
|
90
|
+
{
|
|
91
|
+
"name": "column",
|
|
92
|
+
"type": {
|
|
93
|
+
"text": "Column"
|
|
94
|
+
},
|
|
95
|
+
"description": "The column definition to render"
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"name": "row",
|
|
99
|
+
"type": {
|
|
100
|
+
"text": "Record<string, unknown>"
|
|
101
|
+
},
|
|
102
|
+
"description": "The data object for the current row"
|
|
103
|
+
}
|
|
104
|
+
],
|
|
105
|
+
"description": "Renders a table cell for the given column and row"
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
"kind": "method",
|
|
109
|
+
"name": "renderTableRows",
|
|
110
|
+
"privacy": "private",
|
|
111
|
+
"description": "Renders the table rows"
|
|
112
|
+
}
|
|
113
|
+
],
|
|
26
114
|
"mixins": [
|
|
27
115
|
{
|
|
28
116
|
"name": "RtlMixin",
|
|
@@ -55,6 +143,153 @@
|
|
|
55
143
|
}
|
|
56
144
|
}
|
|
57
145
|
]
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
"kind": "javascript-module",
|
|
149
|
+
"path": "src/pie-data-table-header/defs-react.js",
|
|
150
|
+
"declarations": [],
|
|
151
|
+
"exports": []
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
"kind": "javascript-module",
|
|
155
|
+
"path": "src/pie-data-table-header/defs.js",
|
|
156
|
+
"declarations": [
|
|
157
|
+
{
|
|
158
|
+
"kind": "variable",
|
|
159
|
+
"name": "dataTableHeaderVariant",
|
|
160
|
+
"type": {
|
|
161
|
+
"text": "array"
|
|
162
|
+
},
|
|
163
|
+
"default": "['subtle', 'strong']"
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
"kind": "variable",
|
|
167
|
+
"name": "defaultProps",
|
|
168
|
+
"type": {
|
|
169
|
+
"text": "ComponentDefaultProps<DataTableHeaderProps, keyof Omit<DataTableHeaderProps, 'heading' | 'subHeading'>>"
|
|
170
|
+
},
|
|
171
|
+
"default": "{\n variant: 'subtle',\n}"
|
|
172
|
+
}
|
|
173
|
+
],
|
|
174
|
+
"exports": [
|
|
175
|
+
{
|
|
176
|
+
"kind": "js",
|
|
177
|
+
"name": "dataTableHeaderVariant",
|
|
178
|
+
"declaration": {
|
|
179
|
+
"name": "dataTableHeaderVariant",
|
|
180
|
+
"module": "src/pie-data-table-header/defs.js"
|
|
181
|
+
}
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
"kind": "js",
|
|
185
|
+
"name": "defaultProps",
|
|
186
|
+
"declaration": {
|
|
187
|
+
"name": "defaultProps",
|
|
188
|
+
"module": "src/pie-data-table-header/defs.js"
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
]
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
"kind": "javascript-module",
|
|
195
|
+
"path": "src/pie-data-table-header/index.js",
|
|
196
|
+
"declarations": [
|
|
197
|
+
{
|
|
198
|
+
"kind": "class",
|
|
199
|
+
"description": "",
|
|
200
|
+
"name": "PieDataTableHeader",
|
|
201
|
+
"members": [
|
|
202
|
+
{
|
|
203
|
+
"kind": "field",
|
|
204
|
+
"name": "heading",
|
|
205
|
+
"type": {
|
|
206
|
+
"text": "DataTableHeaderProps['heading']"
|
|
207
|
+
},
|
|
208
|
+
"privacy": "public",
|
|
209
|
+
"description": "heading text for the data table header"
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
"kind": "field",
|
|
213
|
+
"name": "subHeading",
|
|
214
|
+
"type": {
|
|
215
|
+
"text": "DataTableHeaderProps['subHeading']"
|
|
216
|
+
},
|
|
217
|
+
"privacy": "public",
|
|
218
|
+
"description": "Sub heading text for the data table header"
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
"kind": "field",
|
|
222
|
+
"name": "variant",
|
|
223
|
+
"type": {
|
|
224
|
+
"text": "typeof defaultProps.variant | undefined"
|
|
225
|
+
},
|
|
226
|
+
"privacy": "public",
|
|
227
|
+
"description": "Emphasis level for the header"
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
"kind": "field",
|
|
231
|
+
"name": "_actionButtonSlot",
|
|
232
|
+
"type": {
|
|
233
|
+
"text": "Array<HTMLElement>"
|
|
234
|
+
},
|
|
235
|
+
"privacy": "private"
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
"kind": "field",
|
|
239
|
+
"name": "hasActionButtons",
|
|
240
|
+
"type": {
|
|
241
|
+
"text": "boolean"
|
|
242
|
+
},
|
|
243
|
+
"privacy": "private",
|
|
244
|
+
"default": "false"
|
|
245
|
+
},
|
|
246
|
+
{
|
|
247
|
+
"kind": "method",
|
|
248
|
+
"name": "handleActionButtonSlotChange",
|
|
249
|
+
"privacy": "private"
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
"kind": "method",
|
|
253
|
+
"name": "handleSlotChange",
|
|
254
|
+
"privacy": "private",
|
|
255
|
+
"parameters": [
|
|
256
|
+
{
|
|
257
|
+
"name": "event",
|
|
258
|
+
"type": {
|
|
259
|
+
"text": "Event"
|
|
260
|
+
},
|
|
261
|
+
"description": "The slot change event"
|
|
262
|
+
}
|
|
263
|
+
],
|
|
264
|
+
"description": "Handles the slot change event to determine if there are action buttons."
|
|
265
|
+
}
|
|
266
|
+
],
|
|
267
|
+
"superclass": {
|
|
268
|
+
"name": "PieElement",
|
|
269
|
+
"package": "@justeattakeaway/pie-webc-core/src/internals/PieElement"
|
|
270
|
+
},
|
|
271
|
+
"tagName": "pie-data-table-header",
|
|
272
|
+
"customElement": true
|
|
273
|
+
}
|
|
274
|
+
],
|
|
275
|
+
"exports": [
|
|
276
|
+
{
|
|
277
|
+
"kind": "js",
|
|
278
|
+
"name": "*",
|
|
279
|
+
"declaration": {
|
|
280
|
+
"name": "*",
|
|
281
|
+
"package": "./defs"
|
|
282
|
+
}
|
|
283
|
+
},
|
|
284
|
+
{
|
|
285
|
+
"kind": "js",
|
|
286
|
+
"name": "PieDataTableHeader",
|
|
287
|
+
"declaration": {
|
|
288
|
+
"name": "PieDataTableHeader",
|
|
289
|
+
"module": "src/pie-data-table-header/index.js"
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
]
|
|
58
293
|
}
|
|
59
294
|
]
|
|
60
295
|
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* TODO: Verify if ReactBaseType can be set as a more specific React interface
|
|
4
|
+
* Use the React IntrinsicElements interface to find how to map standard HTML elements to existing React Interfaces
|
|
5
|
+
* Example: an HTML button maps to `React.ButtonHTMLAttributes<HTMLButtonElement>`
|
|
6
|
+
* https://github.com/DefinitelyTyped/DefinitelyTyped/blob/0bb210867d16170c4a08d9ce5d132817651a0f80/types/react/index.d.ts#L2829
|
|
7
|
+
*/
|
|
8
|
+
export type ReactBaseType = React.HTMLAttributes<HTMLElement>;
|
|
9
|
+
//# sourceMappingURL=defs-react.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defs-react.d.ts","sourceRoot":"","sources":["../src/defs-react.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,CAAA"}
|
package/dist/defs.d.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { ComponentDefaultProps } from '@justeattakeaway/pie-webc-core';
|
|
2
|
+
export interface Column {
|
|
3
|
+
/**
|
|
4
|
+
* Unique identifier for the column
|
|
5
|
+
* */
|
|
6
|
+
id: string;
|
|
7
|
+
/**
|
|
8
|
+
* Optional property to specify the display name for the column heading
|
|
9
|
+
* */
|
|
10
|
+
heading: string;
|
|
11
|
+
/**
|
|
12
|
+
* Optional property to specify the text alignment of the column
|
|
13
|
+
* */
|
|
14
|
+
textAlign?: 'left' | 'right' | 'center';
|
|
15
|
+
/**
|
|
16
|
+
* Optional property to specify the width of the column
|
|
17
|
+
* */
|
|
18
|
+
width?: string;
|
|
19
|
+
/**
|
|
20
|
+
* Optional property to specify the key in the data object to display in this column
|
|
21
|
+
* */
|
|
22
|
+
accessor?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface DataTableProps {
|
|
25
|
+
/**
|
|
26
|
+
* Array of column definitions
|
|
27
|
+
*/
|
|
28
|
+
columns: Column[];
|
|
29
|
+
/**
|
|
30
|
+
* Array of data objects to display
|
|
31
|
+
*/
|
|
32
|
+
data: Record<string, unknown>[];
|
|
33
|
+
}
|
|
34
|
+
export declare const defaultProps: ComponentDefaultProps<DataTableProps, keyof Omit<DataTableProps, 'columns' | 'data'>>;
|
|
35
|
+
//# sourceMappingURL=defs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defs.d.ts","sourceRoot":"","sources":["../src/defs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAE5E,MAAM,WAAW,MAAM;IACrB;;SAEK;IACL,EAAE,EAAE,MAAM,CAAC;IACX;;SAEK;IACL,OAAO,EAAE,MAAM,CAAC;IAChB;;SAEK;IACL,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;IAExC;;SAEK;IACL,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;SAEK;IACL,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B;;OAEG;IACH,OAAO,EAAE,MAAM,EAAE,CAAC;IAElB;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;CACjC;AAED,eAAO,MAAM,YAAY,EAAE,qBAAqB,CAAC,cAAc,EAAE,MAAM,IAAI,CAAC,cAAc,EAAE,SAAS,GAAG,MAAM,CAAC,CAG9G,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,20 +1,45 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
1
|
+
import { PieElement } from '@justeattakeaway/pie-webc-core/src/internals/PieElement';
|
|
2
|
+
import { DataTableProps, Column } from './defs';
|
|
3
|
+
export * from './defs';
|
|
4
|
+
declare const componentSelector = "pie-data-table";
|
|
5
|
+
declare const PieDataTable_base: import('@justeattakeaway/pie-webc-core').GenericConstructor<import('@justeattakeaway/pie-webc-core').RTLInterface> & typeof PieElement;
|
|
6
|
+
/**
|
|
7
|
+
* @tagname pie-data-table
|
|
8
|
+
*/
|
|
9
|
+
export declare class PieDataTable extends PieDataTable_base implements DataTableProps {
|
|
10
|
+
/**
|
|
11
|
+
* Array of column definitions
|
|
12
|
+
*/
|
|
13
|
+
columns: Column[];
|
|
14
|
+
/**
|
|
15
|
+
* Array of data objects to display
|
|
16
|
+
*/
|
|
17
|
+
data: Record<string, unknown>[];
|
|
18
|
+
/**
|
|
19
|
+
* Renders a header cell for the table
|
|
20
|
+
* @param column - The column definition to render
|
|
21
|
+
*/
|
|
22
|
+
private renderHeaderCell;
|
|
23
|
+
/**
|
|
24
|
+
* Renders the table header
|
|
25
|
+
*/
|
|
26
|
+
private renderTableHeader;
|
|
27
|
+
/**
|
|
28
|
+
* Renders a table cell for the given column and row
|
|
29
|
+
* @param column - The column definition to render
|
|
30
|
+
* @param row - The data object for the current row
|
|
31
|
+
*/
|
|
32
|
+
private renderTableCell;
|
|
33
|
+
/**
|
|
34
|
+
* Renders the table rows
|
|
35
|
+
*/
|
|
36
|
+
private renderTableRows;
|
|
37
|
+
render(): import('lit-html').TemplateResult<1>;
|
|
38
|
+
static styles: import('lit').CSSResult;
|
|
39
|
+
}
|
|
40
|
+
declare global {
|
|
41
|
+
interface HTMLElementTagNameMap {
|
|
42
|
+
[componentSelector]: PieDataTable;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,yDAAyD,CAAC;AAKrF,OAAO,EACH,KAAK,cAAc,EACnB,KAAK,MAAM,EACd,MAAM,QAAQ,CAAC;AAGhB,cAAc,QAAQ,CAAC;AAEvB,QAAA,MAAM,iBAAiB,mBAAmB,CAAC;;AAE3C;;GAEG;AACH,qBACa,YAAa,SAAQ,iBAAqB,YAAW,cAAc;IAC5E;;OAEG;IAEI,OAAO,EAAE,MAAM,EAAE,CAAM;IAE9B;;OAEG;IAEI,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAM;IAE5C;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAiBxB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAUzB;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAevB;;OAEG;IACH,OAAO,CAAC,eAAe;IAYvB,MAAM;IAiBN,MAAM,CAAC,MAAM,0BAAqB;CACrC;AAED,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,qBAAqB;QAC3B,CAAC,iBAAiB,CAAC,EAAE,YAAY,CAAC;KACrC;CACJ"}
|
package/dist/index.js
CHANGED
|
@@ -1,27 +1,107 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import { nothing as n, html as d, unsafeCSS as h } from "lit";
|
|
2
|
+
import { property as g } from "lit/decorators.js";
|
|
3
|
+
import { P as p } from "./PieElement-B3g_8vKy.js";
|
|
4
|
+
import { RtlMixin as u, safeCustomElement as x } from "@justeattakeaway/pie-webc-core";
|
|
5
|
+
import { classMap as i } from "lit/directives/class-map.js";
|
|
6
|
+
const f = "*,*:after,*:before{box-sizing:inherit}:host{display:block}.c-data-table{--data-table-background-color: var(--dt-color-container-default);--data-table-background-hover-or-active: var(--dt-color-container-subtle);--data-table-border-color: var(--dt-color-border-default);--data-table-border-radius: var(--dt-radius-rounded-c);--data-table-text-color: var(--dt-color-content-default);background-color:var(--data-table-background-color);border:1px solid var(--data-table-border-color);border-radius:var(--data-table-border-radius);color:var(--data-table-text-color);width:100%;overflow:hidden}.c-data-table table{border-spacing:0;width:100%}.c-data-table tbody{overflow:auto}.c-data-table tbody tr:hover{background-color:var(--data-table-background-hover-or-active)}.c-data-table-header{background-color:transparent;font-weight:var(--dt-font-weight-bold);color:var(--data-table-text-color);text-align:left;padding:var(--dt-spacing-d);border-bottom:1px solid var(--data-table-border-color)}.c-data-table-header-text-align--left{text-align:left}.c-data-table-header-text-align--right{text-align:right}.c-data-table-header-text-align--center{text-align:center}.c-data-table-cell{padding:var(--dt-spacing-d);border-bottom:1px solid var(--data-table-border-color)}.c-data-table-cell-text-align--left{text-align:left}.c-data-table-cell-text-align--right{text-align:right}.c-data-table-cell-text-align--center{text-align:center}", T = {
|
|
7
|
+
hasBorder: !0,
|
|
8
|
+
isStriped: !1
|
|
7
9
|
};
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
for (var t = o > 1 ? void 0 : o ? u(l, p) : l, s = i.length - 1, n; s >= 0; s--)
|
|
13
|
-
(n = i[s]) && (t = n(t) || t);
|
|
14
|
-
return t;
|
|
10
|
+
var v = Object.defineProperty, m = Object.getOwnPropertyDescriptor, b = (t, e, l, r) => {
|
|
11
|
+
for (var a = r > 1 ? void 0 : r ? m(e, l) : e, c = t.length - 1, s; c >= 0; c--)
|
|
12
|
+
(s = t[c]) && (a = (r ? s(e, l, a) : s(a)) || a);
|
|
13
|
+
return r && a && v(e, l, a), a;
|
|
15
14
|
};
|
|
16
|
-
let
|
|
15
|
+
let o = class extends u(p) {
|
|
16
|
+
constructor() {
|
|
17
|
+
super(...arguments), this.columns = [], this.data = [];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Renders a header cell for the table
|
|
21
|
+
* @param column - The column definition to render
|
|
22
|
+
*/
|
|
23
|
+
renderHeaderCell(t) {
|
|
24
|
+
const { width: e, heading: l, textAlign: r } = t, a = e ? `width: ${e}` : n;
|
|
25
|
+
return d`
|
|
26
|
+
<th style="${a}" class="${i({
|
|
27
|
+
"c-data-table-header": !0,
|
|
28
|
+
"c-data-table-header-text-align--left": r === "left",
|
|
29
|
+
"c-data-table-header-text-align--right": r === "right",
|
|
30
|
+
"c-data-table-header-text-align--center": r === "center"
|
|
31
|
+
})}">
|
|
32
|
+
${l}
|
|
33
|
+
</th>
|
|
34
|
+
`;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Renders the table header
|
|
38
|
+
*/
|
|
39
|
+
renderTableHeader() {
|
|
40
|
+
return d`
|
|
41
|
+
<thead>
|
|
42
|
+
<tr>
|
|
43
|
+
${this.columns.map((t) => this.renderHeaderCell(t))}
|
|
44
|
+
</tr>
|
|
45
|
+
</thead>
|
|
46
|
+
`;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Renders a table cell for the given column and row
|
|
50
|
+
* @param column - The column definition to render
|
|
51
|
+
* @param row - The data object for the current row
|
|
52
|
+
*/
|
|
53
|
+
renderTableCell(t, e) {
|
|
54
|
+
const l = {
|
|
55
|
+
"c-data-table-cell": !0,
|
|
56
|
+
"c-data-table-cell-text-align--left": t.textAlign === "left",
|
|
57
|
+
"c-data-table-cell-text-align--right": t.textAlign === "right",
|
|
58
|
+
"c-data-table-cell-text-align--center": t.textAlign === "center"
|
|
59
|
+
};
|
|
60
|
+
return d`
|
|
61
|
+
<td class="${i(l)}">
|
|
62
|
+
${t.accessor ? e[t.accessor] : ""}
|
|
63
|
+
</td>
|
|
64
|
+
`;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Renders the table rows
|
|
68
|
+
*/
|
|
69
|
+
renderTableRows() {
|
|
70
|
+
return d`
|
|
71
|
+
<tbody>
|
|
72
|
+
${this.data.map((t) => d`
|
|
73
|
+
<tr class="c-data-table-row">
|
|
74
|
+
${this.columns.map((e) => this.renderTableCell(e, t))}
|
|
75
|
+
</tr>
|
|
76
|
+
`)}
|
|
77
|
+
</tbody>
|
|
78
|
+
`;
|
|
79
|
+
}
|
|
17
80
|
render() {
|
|
18
|
-
return d
|
|
81
|
+
return d`
|
|
82
|
+
<div class="${i({
|
|
83
|
+
"c-data-table": !0
|
|
84
|
+
})}">
|
|
85
|
+
<slot name="table-header"></slot>
|
|
86
|
+
<table>
|
|
87
|
+
${this.columns.length > 0 ? this.renderTableHeader() : n}
|
|
88
|
+
${this.data.length > 0 ? this.renderTableRows() : n}
|
|
89
|
+
</table>
|
|
90
|
+
</div>
|
|
91
|
+
`;
|
|
19
92
|
}
|
|
20
93
|
};
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
],
|
|
94
|
+
o.styles = h(f);
|
|
95
|
+
b([
|
|
96
|
+
g({ type: Array })
|
|
97
|
+
], o.prototype, "columns", 2);
|
|
98
|
+
b([
|
|
99
|
+
g({ type: Array })
|
|
100
|
+
], o.prototype, "data", 2);
|
|
101
|
+
o = b([
|
|
102
|
+
x("pie-data-table")
|
|
103
|
+
], o);
|
|
25
104
|
export {
|
|
26
|
-
|
|
105
|
+
o as PieDataTable,
|
|
106
|
+
T as defaultProps
|
|
27
107
|
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* TODO: Verify if ReactBaseType can be set as a more specific React interface
|
|
4
|
+
* Use the React IntrinsicElements interface to find how to map standard HTML elements to existing React Interfaces
|
|
5
|
+
* Example: an HTML button maps to `React.ButtonHTMLAttributes<HTMLButtonElement>`
|
|
6
|
+
* https://github.com/DefinitelyTyped/DefinitelyTyped/blob/0bb210867d16170c4a08d9ce5d132817651a0f80/types/react/index.d.ts#L2829
|
|
7
|
+
*/
|
|
8
|
+
export type ReactBaseType = React.HTMLAttributes<HTMLElement>;
|
|
9
|
+
//# sourceMappingURL=defs-react.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defs-react.d.ts","sourceRoot":"","sources":["../../src/pie-data-table-header/defs-react.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,CAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ComponentDefaultProps } from '@justeattakeaway/pie-webc-core';
|
|
2
|
+
export declare const dataTableHeaderVariant: string[];
|
|
3
|
+
export interface DataTableHeaderProps {
|
|
4
|
+
/**
|
|
5
|
+
* Heading text for the data table header
|
|
6
|
+
*/
|
|
7
|
+
heading: string;
|
|
8
|
+
/**
|
|
9
|
+
* Sub heading text for the data table header
|
|
10
|
+
*/
|
|
11
|
+
subHeading?: string;
|
|
12
|
+
/**
|
|
13
|
+
* Emphasis level for the header
|
|
14
|
+
*/
|
|
15
|
+
variant?: typeof dataTableHeaderVariant[number];
|
|
16
|
+
}
|
|
17
|
+
export declare const defaultProps: ComponentDefaultProps<DataTableHeaderProps, keyof Omit<DataTableHeaderProps, 'heading' | 'subHeading'>>;
|
|
18
|
+
//# sourceMappingURL=defs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defs.d.ts","sourceRoot":"","sources":["../../src/pie-data-table-header/defs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAE5E,eAAO,MAAM,sBAAsB,UAAuB,CAAC;AAE3D,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,sBAAsB,CAAC,MAAM,CAAC,CAAC;CACjD;AAED,eAAO,MAAM,YAAY,EAAE,qBAAqB,CAAC,oBAAoB,EAAE,MAAM,IAAI,CAAC,oBAAoB,EAAE,SAAS,GAAG,YAAY,CAAC,CAEhI,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { PieElement } from '@justeattakeaway/pie-webc-core/src/internals/PieElement';
|
|
2
|
+
import { DataTableHeaderProps, defaultProps } from './defs';
|
|
3
|
+
export * from './defs';
|
|
4
|
+
declare const componentSelector = "pie-data-table-header";
|
|
5
|
+
/**
|
|
6
|
+
* @tagname pie-data-table-header
|
|
7
|
+
*/
|
|
8
|
+
export declare class PieDataTableHeader extends PieElement implements DataTableHeaderProps {
|
|
9
|
+
/**
|
|
10
|
+
* heading text for the data table header
|
|
11
|
+
*/
|
|
12
|
+
heading: DataTableHeaderProps['heading'];
|
|
13
|
+
/**
|
|
14
|
+
* Sub heading text for the data table header
|
|
15
|
+
*/
|
|
16
|
+
subHeading: DataTableHeaderProps['subHeading'];
|
|
17
|
+
/**
|
|
18
|
+
* Emphasis level for the header
|
|
19
|
+
*/
|
|
20
|
+
variant?: typeof defaultProps.variant;
|
|
21
|
+
private _actionButtonSlot;
|
|
22
|
+
private hasActionButtons;
|
|
23
|
+
private handleActionButtonSlotChange;
|
|
24
|
+
/**
|
|
25
|
+
* Handles the slot change event to determine if there are action buttons.
|
|
26
|
+
*
|
|
27
|
+
* @param event - The slot change event
|
|
28
|
+
*/
|
|
29
|
+
private handleSlotChange;
|
|
30
|
+
/**
|
|
31
|
+
* Lit lifecycle: called after the component's DOM has been rendered the first time.
|
|
32
|
+
*/
|
|
33
|
+
firstUpdated(): void;
|
|
34
|
+
render(): import('lit-html').TemplateResult<1>;
|
|
35
|
+
static styles: import('lit').CSSResult;
|
|
36
|
+
}
|
|
37
|
+
declare global {
|
|
38
|
+
interface HTMLElementTagNameMap {
|
|
39
|
+
[componentSelector]: PieDataTableHeader;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/pie-data-table-header/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,yDAAyD,CAAC;AAKrF,OAAO,EACH,KAAK,oBAAoB,EAEzB,YAAY,EACf,MAAM,QAAQ,CAAC;AAGhB,cAAc,QAAQ,CAAC;AAEvB,QAAA,MAAM,iBAAiB,0BAA0B,CAAC;AAElD;;GAEG;AACH,qBACa,kBAAmB,SAAQ,UAAW,YAAW,oBAAoB;IAC9E;;OAEG;IAEI,OAAO,EAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAEjD;;OAEG;IAEI,UAAU,EAAE,oBAAoB,CAAC,YAAY,CAAC,CAAC;IAEtD;;OAEG;IAGI,OAAO,CAAC,EAAE,OAAO,YAAY,CAAC,OAAO,CAAC;IAG7C,OAAO,CAAC,iBAAiB,CAAsB;IAG/C,OAAO,CAAC,gBAAgB,CAAS;IAEjC,OAAO,CAAC,4BAA4B;IAIpC;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IAKxB;;OAEG;IACH,YAAY;IAIZ,MAAM;IA2BN,MAAM,CAAC,MAAM,0BAAqB;CACrC;AAED,OAAO,CAAC,MAAM,CAAC;IACX,UAAU,qBAAqB;QAC3B,CAAC,iBAAiB,CAAC,EAAE,kBAAkB,CAAC;KAC3C;CACJ"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { unsafeCSS as p, nothing as h, html as l } from "lit";
|
|
2
|
+
import { property as c, queryAssignedElements as g, state as b } from "lit/decorators.js";
|
|
3
|
+
import { P as u } from "../PieElement-B3g_8vKy.js";
|
|
4
|
+
import { validPropertyValues as f, safeCustomElement as v } from "@justeattakeaway/pie-webc-core";
|
|
5
|
+
import { classMap as m } from "lit/directives/class-map.js";
|
|
6
|
+
const y = "*,*:after,*:before{box-sizing:inherit}:host{display:block}.c-data-table-header{--data-table-header-background: transparent;--data-table-border-color: var(--dt-color-border-default);padding:var(--dt-spacing-d);background-color:var(--data-table-header-background);border-bottom:1px solid var(--data-table-border-color);display:flex;justify-content:space-between;align-items:flex-end}.c-data-table-header-heading-wrapper{display:flex;flex-direction:column;gap:var(--dt-spacing-b)}.c-data-table-header-heading{font-weight:var(--dt-font-weight-extrabold);font-size:calc(var(--dt-font-size-24) * 1px);line-height:calc(var(--dt-font-size-24-line-height) * 1px)}.c-data-table-header-sub-heading{font-weight:var(--dt-font-weight-regular);font-size:calc(var(--dt-font-size-16) * 1px);line-height:calc(var(--dt-font-size-16-line-height) * 1px)}.c-data-table-header--strong{--data-table-header-background: var(--dt-color-support-brand-02)}.c-data-table-action-buttons-wrapper{display:flex;gap:var(--dt-spacing-d)}", x = ["subtle", "strong"], S = {
|
|
7
|
+
variant: "subtle"
|
|
8
|
+
};
|
|
9
|
+
var w = Object.defineProperty, B = Object.getOwnPropertyDescriptor, o = (e, t, r, s) => {
|
|
10
|
+
for (var n = s > 1 ? void 0 : s ? B(t, r) : t, d = e.length - 1, i; d >= 0; d--)
|
|
11
|
+
(i = e[d]) && (n = (s ? i(t, r, n) : i(n)) || n);
|
|
12
|
+
return s && n && w(t, r, n), n;
|
|
13
|
+
};
|
|
14
|
+
const P = "pie-data-table-header";
|
|
15
|
+
let a = class extends u {
|
|
16
|
+
constructor() {
|
|
17
|
+
super(...arguments), this.hasActionButtons = !1;
|
|
18
|
+
}
|
|
19
|
+
handleActionButtonSlotChange() {
|
|
20
|
+
this.hasActionButtons = !!this._actionButtonSlot.length;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Handles the slot change event to determine if there are action buttons.
|
|
24
|
+
*
|
|
25
|
+
* @param event - The slot change event
|
|
26
|
+
*/
|
|
27
|
+
handleSlotChange(e) {
|
|
28
|
+
const t = e.target;
|
|
29
|
+
this.hasActionButtons = t.assignedElements().length > 0;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Lit lifecycle: called after the component's DOM has been rendered the first time.
|
|
33
|
+
*/
|
|
34
|
+
firstUpdated() {
|
|
35
|
+
this.handleActionButtonSlotChange();
|
|
36
|
+
}
|
|
37
|
+
render() {
|
|
38
|
+
const { heading: e, subHeading: t, variant: r } = this;
|
|
39
|
+
return l`
|
|
40
|
+
<header class="${m({
|
|
41
|
+
"c-data-table-header": !0,
|
|
42
|
+
"c-data-table-header--strong": r === "strong"
|
|
43
|
+
})}">
|
|
44
|
+
<div class="c-data-table-header-heading-wrapper">
|
|
45
|
+
${e ? l`<span class="c-data-table-header-heading">${e}</span>` : h}
|
|
46
|
+
|
|
47
|
+
${t ? l`<span class="c-data-table-header-sub-heading">${t}</span>` : h}
|
|
48
|
+
</div>
|
|
49
|
+
${this.hasActionButtons ? l`
|
|
50
|
+
<div class="c-data-table-action-buttons-wrapper">
|
|
51
|
+
<slot name="action-button" @slotchange=${this.handleSlotChange}></slot>
|
|
52
|
+
</div>
|
|
53
|
+
` : l`
|
|
54
|
+
<slot name="action-button" @slotchange=${this.handleSlotChange} style="display: none;"></slot>
|
|
55
|
+
`}
|
|
56
|
+
</header>
|
|
57
|
+
`;
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
a.styles = p(y);
|
|
61
|
+
o([
|
|
62
|
+
c({ type: String })
|
|
63
|
+
], a.prototype, "heading", 2);
|
|
64
|
+
o([
|
|
65
|
+
c({ type: String })
|
|
66
|
+
], a.prototype, "subHeading", 2);
|
|
67
|
+
o([
|
|
68
|
+
c({ type: String }),
|
|
69
|
+
f(P, x, S.variant)
|
|
70
|
+
], a.prototype, "variant", 2);
|
|
71
|
+
o([
|
|
72
|
+
g({ slot: "action-button", flatten: !0 })
|
|
73
|
+
], a.prototype, "_actionButtonSlot", 2);
|
|
74
|
+
o([
|
|
75
|
+
b()
|
|
76
|
+
], a.prototype, "hasActionButtons", 2);
|
|
77
|
+
a = o([
|
|
78
|
+
v("pie-data-table-header")
|
|
79
|
+
], a);
|
|
80
|
+
export {
|
|
81
|
+
a as PieDataTableHeader,
|
|
82
|
+
x as dataTableHeaderVariant,
|
|
83
|
+
S as defaultProps
|
|
84
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { PieDataTableHeader as PieDataTableHeaderLit } from './index';
|
|
2
|
+
import { DataTableHeaderProps } from './defs';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
export * from './defs';
|
|
5
|
+
type ReactBaseType = React.HTMLAttributes<HTMLElement>;
|
|
6
|
+
export declare const PieDataTableHeader: React.ForwardRefExoticComponent<React.PropsWithoutRef<DataTableHeaderProps> & React.RefAttributes<PieDataTableHeaderLit> & ReactBaseType>;
|
|
7
|
+
//# sourceMappingURL=react.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../src/pie-data-table-header/react.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,kBAAkB,IAAI,qBAAqB,EAAE,MAAM,SAAS,CAAC;AACtE,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAEnD,cAAc,QAAQ,CAAC;AAUvB,KAAK,aAAa,GAAG,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,CAAA;AAEtD,eAAO,MAAM,kBAAkB,EAA8B,KAAK,CAAC,yBAAyB,CAAC,KAAK,CAAC,eAAe,CAAC,oBAAoB,CAAC,GAClI,KAAK,CAAC,aAAa,CAAC,qBAAqB,CAAC,GAAG,aAAa,CAAC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as e from "react";
|
|
2
|
+
import { createComponent as a } from "@lit/react";
|
|
3
|
+
import { PieDataTableHeader as t } from "./index.js";
|
|
4
|
+
import { dataTableHeaderVariant as p, defaultProps as s } from "./index.js";
|
|
5
|
+
const r = a({
|
|
6
|
+
displayName: "PieDataTableHeader",
|
|
7
|
+
elementClass: t,
|
|
8
|
+
react: e,
|
|
9
|
+
tagName: "pie-data-table-header",
|
|
10
|
+
events: {}
|
|
11
|
+
}), i = r;
|
|
12
|
+
export {
|
|
13
|
+
i as PieDataTableHeader,
|
|
14
|
+
p as dataTableHeaderVariant,
|
|
15
|
+
s as defaultProps
|
|
16
|
+
};
|
package/dist/react.d.ts
CHANGED
|
@@ -1,25 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
export declare interface DataTableProps {
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export declare const PieDataTable: React_2.ForwardRefExoticComponent<React_2.PropsWithoutRef<DataTableProps> & React_2.RefAttributes<PieDataTable_2> & ReactBaseType>;
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* @tagname pie-data-table
|
|
15
|
-
*/
|
|
16
|
-
declare class PieDataTable_2 extends PieDataTable_base implements DataTableProps {
|
|
17
|
-
render(): TemplateResult<1>;
|
|
18
|
-
static styles: CSSResult;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
declare const PieDataTable_base: GenericConstructor<RTLInterface> & typeof PieElement;
|
|
22
|
-
|
|
23
|
-
declare type ReactBaseType = React_2.HTMLAttributes<HTMLElement>;
|
|
24
|
-
|
|
25
|
-
export { }
|
|
1
|
+
import { PieDataTable as PieDataTableLit } from './index';
|
|
2
|
+
import { DataTableProps } from './defs';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
export * from './defs';
|
|
5
|
+
type ReactBaseType = React.HTMLAttributes<HTMLElement>;
|
|
6
|
+
export declare const PieDataTable: React.ForwardRefExoticComponent<React.PropsWithoutRef<DataTableProps> & React.RefAttributes<PieDataTableLit> & ReactBaseType>;
|
|
7
|
+
//# sourceMappingURL=react.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../src/react.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,YAAY,IAAI,eAAe,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,QAAQ,CAAC;AAE7C,cAAc,QAAQ,CAAC;AAUvB,KAAK,aAAa,GAAG,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,CAAA;AAEtD,eAAO,MAAM,YAAY,EAAwB,KAAK,CAAC,yBAAyB,CAAC,KAAK,CAAC,eAAe,CAAC,cAAc,CAAC,GAChH,KAAK,CAAC,aAAa,CAAC,eAAe,CAAC,GAAG,aAAa,CAAC,CAAC"}
|
package/dist/react.js
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import * as a from "react";
|
|
2
2
|
import { createComponent as e } from "@lit/react";
|
|
3
3
|
import { PieDataTable as t } from "./index.js";
|
|
4
|
+
import { defaultProps as s } from "./index.js";
|
|
4
5
|
const o = e({
|
|
5
6
|
displayName: "PieDataTable",
|
|
6
7
|
elementClass: t,
|
|
7
8
|
react: a,
|
|
8
9
|
tagName: "pie-data-table",
|
|
9
10
|
events: {}
|
|
10
|
-
}),
|
|
11
|
+
}), i = o;
|
|
11
12
|
export {
|
|
12
|
-
|
|
13
|
+
i as PieDataTable,
|
|
14
|
+
s as defaultProps
|
|
13
15
|
};
|
package/package.json
CHANGED
package/src/data-table.scss
CHANGED
|
@@ -1,7 +1,72 @@
|
|
|
1
1
|
@use '@justeattakeaway/pie-css/scss' as p;
|
|
2
2
|
|
|
3
3
|
:host {
|
|
4
|
-
// Note: For consistency sake, the recommended display should be either
|
|
5
|
-
// "block" or "inline-block", otherwise it can be ommited for floating elements
|
|
6
4
|
display: block;
|
|
7
5
|
}
|
|
6
|
+
|
|
7
|
+
.c-data-table {
|
|
8
|
+
--data-table-background-color: var(--dt-color-container-default);
|
|
9
|
+
--data-table-background-hover-or-active: var(--dt-color-container-subtle);
|
|
10
|
+
--data-table-border-color: var(--dt-color-border-default);
|
|
11
|
+
--data-table-border-radius: var(--dt-radius-rounded-c);
|
|
12
|
+
--data-table-text-color: var(--dt-color-content-default);
|
|
13
|
+
|
|
14
|
+
background-color: var(--data-table-background-color);
|
|
15
|
+
border: 1px solid var(--data-table-border-color);
|
|
16
|
+
border-radius: var(--data-table-border-radius);
|
|
17
|
+
color: var(--data-table-text-color);
|
|
18
|
+
|
|
19
|
+
width: 100%;
|
|
20
|
+
overflow: hidden;
|
|
21
|
+
|
|
22
|
+
table {
|
|
23
|
+
border-spacing: 0;
|
|
24
|
+
width: 100%;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
tbody {
|
|
28
|
+
overflow: auto;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
tbody tr:hover {
|
|
32
|
+
background-color: var(--data-table-background-hover-or-active);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.c-data-table-header {
|
|
37
|
+
background-color: transparent;
|
|
38
|
+
font-weight: var(--dt-font-weight-bold);
|
|
39
|
+
color: var(--data-table-text-color);
|
|
40
|
+
text-align: left;
|
|
41
|
+
padding: var(--dt-spacing-d);
|
|
42
|
+
border-bottom: 1px solid var(--data-table-border-color);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.c-data-table-header-text-align--left {
|
|
46
|
+
text-align: left;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.c-data-table-header-text-align--right {
|
|
50
|
+
text-align: right;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.c-data-table-header-text-align--center {
|
|
54
|
+
text-align: center;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.c-data-table-cell {
|
|
58
|
+
padding: var(--dt-spacing-d);
|
|
59
|
+
border-bottom: 1px solid var(--data-table-border-color);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.c-data-table-cell-text-align--left {
|
|
63
|
+
text-align: left;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.c-data-table-cell-text-align--right {
|
|
67
|
+
text-align: right;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.c-data-table-cell-text-align--center {
|
|
71
|
+
text-align: center;
|
|
72
|
+
}
|
package/src/defs.ts
CHANGED
|
@@ -1,3 +1,42 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
export interface
|
|
1
|
+
import { type ComponentDefaultProps } from '@justeattakeaway/pie-webc-core';
|
|
2
|
+
|
|
3
|
+
export interface Column {
|
|
4
|
+
/**
|
|
5
|
+
* Unique identifier for the column
|
|
6
|
+
* */
|
|
7
|
+
id: string;
|
|
8
|
+
/**
|
|
9
|
+
* Optional property to specify the display name for the column heading
|
|
10
|
+
* */
|
|
11
|
+
heading: string;
|
|
12
|
+
/**
|
|
13
|
+
* Optional property to specify the text alignment of the column
|
|
14
|
+
* */
|
|
15
|
+
textAlign?: 'left' | 'right' | 'center';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Optional property to specify the width of the column
|
|
19
|
+
* */
|
|
20
|
+
width?: string;
|
|
21
|
+
/**
|
|
22
|
+
* Optional property to specify the key in the data object to display in this column
|
|
23
|
+
* */
|
|
24
|
+
accessor?: string;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface DataTableProps {
|
|
28
|
+
/**
|
|
29
|
+
* Array of column definitions
|
|
30
|
+
*/
|
|
31
|
+
columns: Column[];
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Array of data objects to display
|
|
35
|
+
*/
|
|
36
|
+
data: Record<string, unknown>[];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export const defaultProps: ComponentDefaultProps<DataTableProps, keyof Omit<DataTableProps, 'columns' | 'data'>> = {
|
|
40
|
+
hasBorder: true,
|
|
41
|
+
isStriped: false,
|
|
42
|
+
};
|
package/src/index.ts
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
|
-
import { html, unsafeCSS } from 'lit';
|
|
1
|
+
import { html, nothing, unsafeCSS } from 'lit';
|
|
2
|
+
import { property } from 'lit/decorators.js';
|
|
2
3
|
import { PieElement } from '@justeattakeaway/pie-webc-core/src/internals/PieElement';
|
|
3
4
|
import { RtlMixin, safeCustomElement } from '@justeattakeaway/pie-webc-core';
|
|
5
|
+
import { classMap } from 'lit/directives/class-map.js';
|
|
4
6
|
|
|
5
7
|
import styles from './data-table.scss?inline';
|
|
6
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
type DataTableProps,
|
|
10
|
+
type Column,
|
|
11
|
+
} from './defs';
|
|
7
12
|
|
|
8
13
|
// Valid values available to consumers
|
|
9
14
|
export * from './defs';
|
|
@@ -15,8 +20,101 @@ const componentSelector = 'pie-data-table';
|
|
|
15
20
|
*/
|
|
16
21
|
@safeCustomElement('pie-data-table')
|
|
17
22
|
export class PieDataTable extends RtlMixin(PieElement) implements DataTableProps {
|
|
23
|
+
/**
|
|
24
|
+
* Array of column definitions
|
|
25
|
+
*/
|
|
26
|
+
@property({ type: Array })
|
|
27
|
+
public columns: Column[] = [];
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Array of data objects to display
|
|
31
|
+
*/
|
|
32
|
+
@property({ type: Array })
|
|
33
|
+
public data: Record<string, unknown>[] = [];
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Renders a header cell for the table
|
|
37
|
+
* @param column - The column definition to render
|
|
38
|
+
*/
|
|
39
|
+
private renderHeaderCell (column: Column) {
|
|
40
|
+
const { width, heading, textAlign } = column;
|
|
41
|
+
const style = width ? `width: ${width}` : nothing;
|
|
42
|
+
const classes = {
|
|
43
|
+
'c-data-table-header': true,
|
|
44
|
+
'c-data-table-header-text-align--left': textAlign === 'left',
|
|
45
|
+
'c-data-table-header-text-align--right': textAlign === 'right',
|
|
46
|
+
'c-data-table-header-text-align--center': textAlign === 'center',
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
return html`
|
|
50
|
+
<th style="${style}" class="${classMap(classes)}">
|
|
51
|
+
${heading}
|
|
52
|
+
</th>
|
|
53
|
+
`;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Renders the table header
|
|
58
|
+
*/
|
|
59
|
+
private renderTableHeader () {
|
|
60
|
+
return html`
|
|
61
|
+
<thead>
|
|
62
|
+
<tr>
|
|
63
|
+
${this.columns.map((column) => this.renderHeaderCell(column))}
|
|
64
|
+
</tr>
|
|
65
|
+
</thead>
|
|
66
|
+
`;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Renders a table cell for the given column and row
|
|
71
|
+
* @param column - The column definition to render
|
|
72
|
+
* @param row - The data object for the current row
|
|
73
|
+
*/
|
|
74
|
+
private renderTableCell (column: Column, row: Record<string, unknown>) {
|
|
75
|
+
const classes = {
|
|
76
|
+
'c-data-table-cell': true,
|
|
77
|
+
'c-data-table-cell-text-align--left': column.textAlign === 'left',
|
|
78
|
+
'c-data-table-cell-text-align--right': column.textAlign === 'right',
|
|
79
|
+
'c-data-table-cell-text-align--center': column.textAlign === 'center',
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
return html`
|
|
83
|
+
<td class="${classMap(classes)}">
|
|
84
|
+
${column.accessor ? row[column.accessor] : ''}
|
|
85
|
+
</td>
|
|
86
|
+
`;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Renders the table rows
|
|
91
|
+
*/
|
|
92
|
+
private renderTableRows () {
|
|
93
|
+
return html`
|
|
94
|
+
<tbody>
|
|
95
|
+
${this.data.map((row) => html`
|
|
96
|
+
<tr class="c-data-table-row">
|
|
97
|
+
${this.columns.map((column) => this.renderTableCell(column, row))}
|
|
98
|
+
</tr>
|
|
99
|
+
`)}
|
|
100
|
+
</tbody>
|
|
101
|
+
`;
|
|
102
|
+
}
|
|
103
|
+
|
|
18
104
|
render () {
|
|
19
|
-
|
|
105
|
+
const classes = {
|
|
106
|
+
'c-data-table': true,
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
return html`
|
|
110
|
+
<div class="${classMap(classes)}">
|
|
111
|
+
<slot name="table-header"></slot>
|
|
112
|
+
<table>
|
|
113
|
+
${this.columns.length > 0 ? this.renderTableHeader() : nothing}
|
|
114
|
+
${this.data.length > 0 ? this.renderTableRows() : nothing}
|
|
115
|
+
</table>
|
|
116
|
+
</div>
|
|
117
|
+
`;
|
|
20
118
|
}
|
|
21
119
|
|
|
22
120
|
// Renders a `CSSResult` generated from SCSS by Vite
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
@use '@justeattakeaway/pie-css/scss' as p;
|
|
2
|
+
|
|
3
|
+
:host {
|
|
4
|
+
display: block;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
.c-data-table-header {
|
|
8
|
+
--data-table-header-background: transparent;
|
|
9
|
+
--data-table-border-color: var(--dt-color-border-default);
|
|
10
|
+
|
|
11
|
+
padding: var(--dt-spacing-d);
|
|
12
|
+
|
|
13
|
+
background-color: var(--data-table-header-background);
|
|
14
|
+
border-bottom: 1px solid var(--data-table-border-color);
|
|
15
|
+
|
|
16
|
+
display: flex;
|
|
17
|
+
justify-content: space-between;
|
|
18
|
+
align-items:flex-end;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.c-data-table-header-heading-wrapper {
|
|
22
|
+
display: flex;
|
|
23
|
+
flex-direction: column;
|
|
24
|
+
gap: var(--dt-spacing-b);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.c-data-table-header-heading {
|
|
28
|
+
font-weight: var(--dt-font-weight-extrabold);
|
|
29
|
+
font-size: #{p.font-size(--dt-font-size-24)};
|
|
30
|
+
line-height: calc(var(--dt-font-size-24-line-height) * 1px);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.c-data-table-header-sub-heading {
|
|
34
|
+
font-weight: var(--dt-font-weight-regular);
|
|
35
|
+
font-size: #{p.font-size(--dt-font-size-16)};
|
|
36
|
+
line-height: calc(var(--dt-font-size-16-line-height) * 1px);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.c-data-table-header--strong {
|
|
40
|
+
--data-table-header-background: var(--dt-color-support-brand-02);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.c-data-table-action-buttons-wrapper {
|
|
44
|
+
display: flex;
|
|
45
|
+
gap: var(--dt-spacing-d);
|
|
46
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* TODO: Verify if ReactBaseType can be set as a more specific React interface
|
|
4
|
+
* Use the React IntrinsicElements interface to find how to map standard HTML elements to existing React Interfaces
|
|
5
|
+
* Example: an HTML button maps to `React.ButtonHTMLAttributes<HTMLButtonElement>`
|
|
6
|
+
* https://github.com/DefinitelyTyped/DefinitelyTyped/blob/0bb210867d16170c4a08d9ce5d132817651a0f80/types/react/index.d.ts#L2829
|
|
7
|
+
*/
|
|
8
|
+
export type ReactBaseType = React.HTMLAttributes<HTMLElement>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type ComponentDefaultProps } from '@justeattakeaway/pie-webc-core';
|
|
2
|
+
|
|
3
|
+
export const dataTableHeaderVariant = ['subtle', 'strong'];
|
|
4
|
+
|
|
5
|
+
export interface DataTableHeaderProps {
|
|
6
|
+
/**
|
|
7
|
+
* Heading text for the data table header
|
|
8
|
+
*/
|
|
9
|
+
heading: string;
|
|
10
|
+
/**
|
|
11
|
+
* Sub heading text for the data table header
|
|
12
|
+
*/
|
|
13
|
+
subHeading?: string;
|
|
14
|
+
/**
|
|
15
|
+
* Emphasis level for the header
|
|
16
|
+
*/
|
|
17
|
+
variant?: typeof dataTableHeaderVariant[number];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export const defaultProps: ComponentDefaultProps<DataTableHeaderProps, keyof Omit<DataTableHeaderProps, 'heading' | 'subHeading'>> = {
|
|
21
|
+
variant: 'subtle',
|
|
22
|
+
};
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { html, nothing, unsafeCSS } from 'lit';
|
|
2
|
+
import { property, state, queryAssignedElements } from 'lit/decorators.js';
|
|
3
|
+
import { PieElement } from '@justeattakeaway/pie-webc-core/src/internals/PieElement';
|
|
4
|
+
import { safeCustomElement, validPropertyValues } from '@justeattakeaway/pie-webc-core';
|
|
5
|
+
import { classMap } from 'lit/directives/class-map.js';
|
|
6
|
+
|
|
7
|
+
import styles from './data-table-header.scss?inline';
|
|
8
|
+
import {
|
|
9
|
+
type DataTableHeaderProps,
|
|
10
|
+
dataTableHeaderVariant,
|
|
11
|
+
defaultProps,
|
|
12
|
+
} from './defs';
|
|
13
|
+
|
|
14
|
+
// Valid values available to consumers
|
|
15
|
+
export * from './defs';
|
|
16
|
+
|
|
17
|
+
const componentSelector = 'pie-data-table-header';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @tagname pie-data-table-header
|
|
21
|
+
*/
|
|
22
|
+
@safeCustomElement('pie-data-table-header')
|
|
23
|
+
export class PieDataTableHeader extends PieElement implements DataTableHeaderProps {
|
|
24
|
+
/**
|
|
25
|
+
* heading text for the data table header
|
|
26
|
+
*/
|
|
27
|
+
@property({ type: String })
|
|
28
|
+
public heading!: DataTableHeaderProps['heading'];
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Sub heading text for the data table header
|
|
32
|
+
*/
|
|
33
|
+
@property({ type: String })
|
|
34
|
+
public subHeading: DataTableHeaderProps['subHeading'];
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Emphasis level for the header
|
|
38
|
+
*/
|
|
39
|
+
@property({ type: String })
|
|
40
|
+
@validPropertyValues(componentSelector, dataTableHeaderVariant, defaultProps.variant)
|
|
41
|
+
public variant?: typeof defaultProps.variant;
|
|
42
|
+
|
|
43
|
+
@queryAssignedElements({ slot: 'action-button', flatten: true })
|
|
44
|
+
private _actionButtonSlot!: Array<HTMLElement>;
|
|
45
|
+
|
|
46
|
+
@state()
|
|
47
|
+
private hasActionButtons = false;
|
|
48
|
+
|
|
49
|
+
private handleActionButtonSlotChange () {
|
|
50
|
+
this.hasActionButtons = Boolean(this._actionButtonSlot.length);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Handles the slot change event to determine if there are action buttons.
|
|
55
|
+
*
|
|
56
|
+
* @param event - The slot change event
|
|
57
|
+
*/
|
|
58
|
+
private handleSlotChange (event: Event) {
|
|
59
|
+
const slot = event.target as HTMLSlotElement;
|
|
60
|
+
this.hasActionButtons = slot.assignedElements().length > 0;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Lit lifecycle: called after the component's DOM has been rendered the first time.
|
|
65
|
+
*/
|
|
66
|
+
firstUpdated () {
|
|
67
|
+
this.handleActionButtonSlotChange();
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
render () {
|
|
71
|
+
const { heading, subHeading, variant } = this;
|
|
72
|
+
|
|
73
|
+
const classes = {
|
|
74
|
+
'c-data-table-header': true,
|
|
75
|
+
'c-data-table-header--strong': variant === 'strong',
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
return html`
|
|
79
|
+
<header class="${classMap(classes)}">
|
|
80
|
+
<div class="c-data-table-header-heading-wrapper">
|
|
81
|
+
${heading ? html`<span class="c-data-table-header-heading">${heading}</span>` : nothing}
|
|
82
|
+
|
|
83
|
+
${subHeading ? html`<span class="c-data-table-header-sub-heading">${subHeading}</span>` : nothing}
|
|
84
|
+
</div>
|
|
85
|
+
${this.hasActionButtons ? html`
|
|
86
|
+
<div class="c-data-table-action-buttons-wrapper">
|
|
87
|
+
<slot name="action-button" @slotchange=${this.handleSlotChange}></slot>
|
|
88
|
+
</div>
|
|
89
|
+
` : html`
|
|
90
|
+
<slot name="action-button" @slotchange=${this.handleSlotChange} style="display: none;"></slot>
|
|
91
|
+
`}
|
|
92
|
+
</header>
|
|
93
|
+
`;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Renders a `CSSResult` generated from SCSS by Vite
|
|
97
|
+
static styles = unsafeCSS(styles);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
declare global {
|
|
101
|
+
interface HTMLElementTagNameMap {
|
|
102
|
+
[componentSelector]: PieDataTableHeader;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { createComponent } from '@lit/react';
|
|
3
|
+
import { PieDataTableHeader as PieDataTableHeaderLit } from './index';
|
|
4
|
+
import { type DataTableHeaderProps } from './defs';
|
|
5
|
+
|
|
6
|
+
export * from './defs';
|
|
7
|
+
|
|
8
|
+
const PieDataTableHeaderReact = createComponent({
|
|
9
|
+
displayName: 'PieDataTableHeader',
|
|
10
|
+
elementClass: PieDataTableHeaderLit,
|
|
11
|
+
react: React,
|
|
12
|
+
tagName: 'pie-data-table-header',
|
|
13
|
+
events: {},
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
type ReactBaseType = React.HTMLAttributes<HTMLElement>
|
|
17
|
+
|
|
18
|
+
export const PieDataTableHeader = PieDataTableHeaderReact as React.ForwardRefExoticComponent<React.PropsWithoutRef<DataTableHeaderProps>
|
|
19
|
+
& React.RefAttributes<PieDataTableHeaderLit> & ReactBaseType>;
|