@justeattakeaway/pie-data-table 0.1.5 → 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.
@@ -11,8 +11,26 @@
11
11
  {
12
12
  "kind": "javascript-module",
13
13
  "path": "src/defs.js",
14
- "declarations": [],
15
- "exports": []
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,11 @@
1
+ import { LitElement as i } from "lit";
2
+ const t = class t extends i {
3
+ willUpdate() {
4
+ this.getAttribute("v") || this.setAttribute("v", t.v);
5
+ }
6
+ };
7
+ t.v = "0.2.0";
8
+ let s = t;
9
+ export {
10
+ s as P
11
+ };
@@ -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 { CSSResult } from 'lit';
2
- import { GenericConstructor } from '@justeattakeaway/pie-webc-core';
3
- import { PieElement } from '@justeattakeaway/pie-webc-core/src/internals/PieElement';
4
- import { RTLInterface } from '@justeattakeaway/pie-webc-core';
5
- import { TemplateResult } from 'lit-html';
6
-
7
- export declare interface DataTableProps {
8
- }
9
-
10
- /**
11
- * @tagname pie-data-table
12
- */
13
- export declare class PieDataTable extends PieDataTable_base implements DataTableProps {
14
- render(): TemplateResult<1>;
15
- static styles: CSSResult;
16
- }
17
-
18
- declare const PieDataTable_base: GenericConstructor<RTLInterface> & typeof PieElement;
19
-
20
- export { }
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 { LitElement as b, html as d, unsafeCSS as f } from "lit";
2
- import { RtlMixin as h, safeCustomElement as v } from "@justeattakeaway/pie-webc-core";
3
- const e = class e extends b {
4
- willUpdate() {
5
- this.getAttribute("v") || this.setAttribute("v", e.v);
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
- e.v = "0.1.5";
9
- let r = e;
10
- const c = "*,*:after,*:before{box-sizing:inherit}:host{display:block}";
11
- var u = Object.getOwnPropertyDescriptor, m = (i, l, p, o) => {
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 a = class extends h(r) {
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`<h1 data-test-id="pie-data-table">Hello world!</h1>`;
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
- a.styles = f(c);
22
- a = m([
23
- v("pie-data-table")
24
- ], a);
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
- a as PieDataTable
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 { CSSResult } from 'lit';
2
- import { GenericConstructor } from '@justeattakeaway/pie-webc-core';
3
- import { PieElement } from '@justeattakeaway/pie-webc-core/src/internals/PieElement';
4
- import * as React_2 from 'react';
5
- import { RTLInterface } from '@justeattakeaway/pie-webc-core';
6
- import { TemplateResult } from 'lit-html';
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
- }), l = o;
11
+ }), i = o;
11
12
  export {
12
- l as PieDataTable
13
+ i as PieDataTable,
14
+ s as defaultProps
13
15
  };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@justeattakeaway/pie-data-table",
3
3
  "description": "PIE Design System Data Table built using Web Components",
4
- "version": "0.1.5",
4
+ "version": "0.2.0",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "module": "dist/index.js",
@@ -37,12 +37,12 @@
37
37
  "devDependencies": {
38
38
  "@custom-elements-manifest/analyzer": "0.9.0",
39
39
  "@justeattakeaway/pie-components-config": "0.21.0",
40
- "@justeattakeaway/pie-css": "0.23.2",
40
+ "@justeattakeaway/pie-css": "0.24.0",
41
41
  "@justeattakeaway/pie-monorepo-utils": "0.7.0",
42
42
  "cem-plugin-module-file-extensions": "0.0.5"
43
43
  },
44
44
  "dependencies": {
45
- "@justeattakeaway/pie-webc-core": "3.0.2"
45
+ "@justeattakeaway/pie-webc-core": "4.0.0"
46
46
  },
47
47
  "volta": {
48
48
  "extends": "../../../package.json"
@@ -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
- // TODO - please remove the eslint disable comment below when you add props to this interface
2
- // eslint-disable-next-line @typescript-eslint/no-empty-interface
3
- export interface DataTableProps {}
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 { type DataTableProps } from './defs';
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
- return html`<h1 data-test-id="pie-data-table">Hello world!</h1>`;
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>;