@purpurds/table 6.12.5 → 7.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/LICENSE.txt +16 -16
- package/dist/cell-types/body-text-cell.d.ts.map +1 -1
- package/dist/cell-types/link-cell.d.ts.map +1 -1
- package/dist/story-utils/column-def.d.ts.map +1 -1
- package/dist/story-utils/table-data.d.ts +2 -4
- package/dist/story-utils/table-data.d.ts.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/table-action-bar.d.ts.map +1 -1
- package/dist/table-export-drawer.d.ts +3 -2
- package/dist/table-export-drawer.d.ts.map +1 -1
- package/dist/table-row-cell.d.ts.map +1 -1
- package/dist/table-settings-drawer.d.ts +2 -1
- package/dist/table-settings-drawer.d.ts.map +1 -1
- package/dist/table-toolbar.d.ts +6 -4
- package/dist/table-toolbar.d.ts.map +1 -1
- package/dist/table.cjs.js +63 -63
- package/dist/table.cjs.js.map +1 -1
- package/dist/table.d.ts +2 -1
- package/dist/table.d.ts.map +1 -1
- package/dist/table.es.js +4019 -4021
- package/dist/table.es.js.map +1 -1
- package/dist/test-utils/helpers.d.ts +2 -1
- package/dist/test-utils/helpers.d.ts.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/use-truncated-hook.d.ts +3 -5
- package/dist/use-truncated-hook.d.ts.map +1 -1
- package/package.json +23 -23
- package/src/cell-types/body-text-cell.test.tsx +65 -0
- package/src/cell-types/body-text-cell.tsx +8 -9
- package/src/cell-types/lead-text-cell.test.tsx +65 -0
- package/src/cell-types/lead-text-cell.tsx +1 -1
- package/src/cell-types/link-cell.tsx +13 -6
- package/src/story-utils/column-def.ts +2 -0
- package/src/story-utils/table-data.tsx +10 -8
- package/src/table-action-bar.tsx +3 -2
- package/src/table-column-header-cell.tsx +16 -6
- package/src/table-export-drawer.test.tsx +2 -1
- package/src/table-export-drawer.tsx +5 -3
- package/src/table-kitchen-sink.test.tsx +5 -18
- package/src/table-row-cell.tsx +1 -30
- package/src/table-settings-drawer.test.tsx +4 -4
- package/src/table-settings-drawer.tsx +46 -41
- package/src/table-toolbar.test.tsx +3 -0
- package/src/table-toolbar.tsx +12 -7
- package/src/table.module.scss +51 -32
- package/src/table.stories.tsx +10 -9
- package/src/table.tsx +32 -26
- package/src/test-utils/helpers.ts +2 -1
- package/src/types.ts +1 -1
- package/src/use-truncated-hook.tsx +16 -60
package/src/table-row-cell.tsx
CHANGED
|
@@ -18,7 +18,6 @@ import { RowToggleCell } from "./cell-types/row-toggle-cell";
|
|
|
18
18
|
import { ToggleCell } from "./cell-types/toggle-cell";
|
|
19
19
|
import { WarningAlertMessageCell } from "./cell-types/warning-message-cell";
|
|
20
20
|
import styles from "./table.module.scss";
|
|
21
|
-
import { pxToRemString } from "./utils/unit-conversions";
|
|
22
21
|
|
|
23
22
|
const cx = c.bind(styles);
|
|
24
23
|
|
|
@@ -60,7 +59,7 @@ const TableRowCell = <TData extends RowData>({
|
|
|
60
59
|
isLastCell,
|
|
61
60
|
}: TableRowCellProps<TData>) => {
|
|
62
61
|
const [isVisible, setIsVisible] = useState(false);
|
|
63
|
-
const elementRef = useRef<HTMLTableCellElement>(null);
|
|
62
|
+
const elementRef = useRef<HTMLTableCellElement | null>(null);
|
|
64
63
|
|
|
65
64
|
useEffect(() => {
|
|
66
65
|
const currentElement = elementRef.current;
|
|
@@ -99,12 +98,6 @@ const TableRowCell = <TData extends RowData>({
|
|
|
99
98
|
},
|
|
100
99
|
]);
|
|
101
100
|
|
|
102
|
-
const styles = cell
|
|
103
|
-
? {
|
|
104
|
-
width: pxToRemString(cell.column.getSize()),
|
|
105
|
-
}
|
|
106
|
-
: {};
|
|
107
|
-
|
|
108
101
|
const cellContent = cell ? getCellContent(cell) : children;
|
|
109
102
|
|
|
110
103
|
return (
|
|
@@ -113,7 +106,6 @@ const TableRowCell = <TData extends RowData>({
|
|
|
113
106
|
data-testid={dataTestId}
|
|
114
107
|
className={classes}
|
|
115
108
|
key={cell?.column.columnDef?.id}
|
|
116
|
-
style={styles}
|
|
117
109
|
colSpan={colSpan}
|
|
118
110
|
>
|
|
119
111
|
{cellContent}
|
|
@@ -126,9 +118,6 @@ export default TableRowCell;
|
|
|
126
118
|
const getCellContent = <TData extends RowData>(cell: Cell<TData, unknown>) => {
|
|
127
119
|
const { cellType } = cell.column.columnDef.meta ?? {};
|
|
128
120
|
|
|
129
|
-
// Define which cell types should have guaranteed truncation
|
|
130
|
-
const needsTruncation = ["bodyText", "iconText", "leadText", "link"].includes(cellType || "");
|
|
131
|
-
|
|
132
121
|
const content = (() => {
|
|
133
122
|
switch (cellType) {
|
|
134
123
|
case "badge":
|
|
@@ -166,23 +155,5 @@ const getCellContent = <TData extends RowData>(cell: Cell<TData, unknown>) => {
|
|
|
166
155
|
}
|
|
167
156
|
})();
|
|
168
157
|
|
|
169
|
-
// If the cell type needs guaranteed truncation, wrap it with a truncation container
|
|
170
|
-
if (needsTruncation && cell) {
|
|
171
|
-
const widthInRemString = pxToRemString(cell.column.getSize());
|
|
172
|
-
|
|
173
|
-
return (
|
|
174
|
-
<div
|
|
175
|
-
className={cx(`${rootClassName}__truncate`)}
|
|
176
|
-
style={{
|
|
177
|
-
width: "100%",
|
|
178
|
-
maxWidth: widthInRemString,
|
|
179
|
-
minWidth: widthInRemString,
|
|
180
|
-
}}
|
|
181
|
-
>
|
|
182
|
-
{content}
|
|
183
|
-
</div>
|
|
184
|
-
);
|
|
185
|
-
}
|
|
186
|
-
|
|
187
158
|
return content;
|
|
188
159
|
};
|
|
@@ -45,6 +45,7 @@ describe("Data Table - Settings drawer", () => {
|
|
|
45
45
|
beforeEach(() => {
|
|
46
46
|
container = render(
|
|
47
47
|
<TableSettingsDrawer
|
|
48
|
+
id="purpur-table-settings-drawer"
|
|
48
49
|
isDrawerOpen={true}
|
|
49
50
|
columnFiltersEnabled={true}
|
|
50
51
|
showColumnFilters={true}
|
|
@@ -86,10 +87,6 @@ describe("Data Table - Settings drawer", () => {
|
|
|
86
87
|
).toHaveTextContent("Reset settings");
|
|
87
88
|
});
|
|
88
89
|
|
|
89
|
-
it("should have a close drawer button", () => {
|
|
90
|
-
expect(closeButton).toHaveAttribute("aria-label", "Close drawer");
|
|
91
|
-
});
|
|
92
|
-
|
|
93
90
|
it("should be possible to close the drawer", async () => {
|
|
94
91
|
await userEvent.click(closeButton);
|
|
95
92
|
expect(screen.queryByTestId(Selectors.SETTINGS_DRAWER.CONTENT)).toBeNull();
|
|
@@ -204,6 +201,7 @@ describe("Data Table - Settings drawer", () => {
|
|
|
204
201
|
beforeEach(() => {
|
|
205
202
|
render(
|
|
206
203
|
<TableSettingsDrawer
|
|
204
|
+
id="purpur-table-settings-drawer"
|
|
207
205
|
isDrawerOpen={true}
|
|
208
206
|
showColumnFilters={false}
|
|
209
207
|
columnFiltersEnabled={false}
|
|
@@ -262,6 +260,7 @@ describe("Data Table - Settings drawer", () => {
|
|
|
262
260
|
beforeEach(() => {
|
|
263
261
|
render(
|
|
264
262
|
<TableSettingsDrawer
|
|
263
|
+
id="purpur-table-settings-drawer"
|
|
265
264
|
isDrawerOpen={true}
|
|
266
265
|
columnFiltersEnabled={true}
|
|
267
266
|
showColumnFilters={true}
|
|
@@ -315,6 +314,7 @@ describe("Data Table - Settings drawer", () => {
|
|
|
315
314
|
beforeEach(() => {
|
|
316
315
|
render(
|
|
317
316
|
<TableSettingsDrawer
|
|
317
|
+
id="purpur-table-settings-drawer"
|
|
318
318
|
isDrawerOpen={true}
|
|
319
319
|
columnFiltersEnabled={true}
|
|
320
320
|
showColumnFilters={true}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React from "react";
|
|
1
|
+
import React, { useId } from "react";
|
|
2
2
|
import { Button } from "@purpurds/button";
|
|
3
3
|
import { Drawer } from "@purpurds/drawer";
|
|
4
4
|
import { Heading } from "@purpurds/heading";
|
|
@@ -30,6 +30,7 @@ export type TableSettingsDrawerCopyProps = {
|
|
|
30
30
|
};
|
|
31
31
|
|
|
32
32
|
export type TableSettingsDrawerProps<TData> = {
|
|
33
|
+
id: string;
|
|
33
34
|
getAllColumns: () => Column<TData, unknown>[];
|
|
34
35
|
onResetSettings: () => void;
|
|
35
36
|
setDrawerIsOpen: React.Dispatch<React.SetStateAction<boolean>>;
|
|
@@ -52,6 +53,7 @@ const cx = c.bind(styles);
|
|
|
52
53
|
const rootTestId = "purpur-table-settings-drawer";
|
|
53
54
|
|
|
54
55
|
export const TableSettingsDrawer = <TData extends RowData>({
|
|
56
|
+
id,
|
|
55
57
|
columnFiltersEnabled,
|
|
56
58
|
copy,
|
|
57
59
|
isDrawerOpen,
|
|
@@ -69,12 +71,12 @@ export const TableSettingsDrawer = <TData extends RowData>({
|
|
|
69
71
|
setRowSelectionEnabled,
|
|
70
72
|
}: TableSettingsDrawerProps<TData>) => {
|
|
71
73
|
return (
|
|
72
|
-
<div id=
|
|
74
|
+
<div id={id}>
|
|
73
75
|
<Drawer data-testid={rootTestId} open={isDrawerOpen} onOpenChange={setDrawerIsOpen}>
|
|
74
76
|
<Drawer.Content
|
|
75
77
|
data-testid={`${rootTestId}-content`}
|
|
76
78
|
zIndex={6}
|
|
77
|
-
|
|
79
|
+
closeButtonAriaLabel={copy.buttons.closeDrawer}
|
|
78
80
|
title={copy.title}
|
|
79
81
|
footerContent={
|
|
80
82
|
<FooterContent text={copy.buttons.resetSettings} onClick={onResetSettings} />
|
|
@@ -147,45 +149,48 @@ const GeneralSettings = ({
|
|
|
147
149
|
enableRowSelection,
|
|
148
150
|
rowSelectionEnabled,
|
|
149
151
|
setRowSelectionEnabled,
|
|
150
|
-
}: GeneralSettingsProps) =>
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
152
|
+
}: GeneralSettingsProps) => {
|
|
153
|
+
const uid = useId();
|
|
154
|
+
return (
|
|
155
|
+
<div
|
|
156
|
+
data-testid={`${rootTestId}-general-settings`}
|
|
157
|
+
className={cx(`${rootClassName}__general-settings`)}
|
|
158
|
+
aria-labelledby={`${uid}-general-settings`}
|
|
159
|
+
>
|
|
160
|
+
<Heading id={`${uid}-general-settings`} variant="title-100" tag="h3">
|
|
161
|
+
{copy.header}
|
|
162
|
+
</Heading>
|
|
163
|
+
{columnFiltersEnabled && (
|
|
164
|
+
<ToggleWrapper
|
|
165
|
+
id={`${uid}-show-filters`}
|
|
166
|
+
checked={showColumnFilters}
|
|
167
|
+
label={copy.toggles.showFilters}
|
|
168
|
+
onChange={setShowColumnFiltersEnabled}
|
|
169
|
+
/>
|
|
170
|
+
)}
|
|
160
171
|
<ToggleWrapper
|
|
161
|
-
id=
|
|
162
|
-
checked={
|
|
163
|
-
label={copy.toggles.
|
|
164
|
-
onChange={
|
|
172
|
+
id={`${uid}-lock-first-column`}
|
|
173
|
+
checked={stickyFirstColumn}
|
|
174
|
+
label={copy.toggles.lockFirstcolumn}
|
|
175
|
+
onChange={setStickyFirstColumn}
|
|
165
176
|
/>
|
|
166
|
-
)}
|
|
167
|
-
<ToggleWrapper
|
|
168
|
-
id="lock-first-column"
|
|
169
|
-
checked={stickyFirstColumn}
|
|
170
|
-
label={copy.toggles.lockFirstcolumn}
|
|
171
|
-
onChange={setStickyFirstColumn}
|
|
172
|
-
/>
|
|
173
|
-
<ToggleWrapper
|
|
174
|
-
id="sticky-header"
|
|
175
|
-
checked={stickyHeaders}
|
|
176
|
-
label={copy.toggles.stickyHeader}
|
|
177
|
-
onChange={setStickyHeaders}
|
|
178
|
-
/>
|
|
179
|
-
{enableRowSelection && copy.toggles.rowSelection && setRowSelectionEnabled && (
|
|
180
177
|
<ToggleWrapper
|
|
181
|
-
id=
|
|
182
|
-
checked={
|
|
183
|
-
label={copy.toggles.
|
|
184
|
-
onChange={
|
|
178
|
+
id={`${uid}-sticky-header`}
|
|
179
|
+
checked={stickyHeaders}
|
|
180
|
+
label={copy.toggles.stickyHeader}
|
|
181
|
+
onChange={setStickyHeaders}
|
|
185
182
|
/>
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
183
|
+
{enableRowSelection && copy.toggles.rowSelection && setRowSelectionEnabled && (
|
|
184
|
+
<ToggleWrapper
|
|
185
|
+
id={`${uid}-row-selection`}
|
|
186
|
+
checked={rowSelectionEnabled || false}
|
|
187
|
+
label={copy.toggles.rowSelection}
|
|
188
|
+
onChange={setRowSelectionEnabled}
|
|
189
|
+
/>
|
|
190
|
+
)}
|
|
191
|
+
</div>
|
|
192
|
+
);
|
|
193
|
+
};
|
|
189
194
|
|
|
190
195
|
const VisibleColumns = <TData extends RowData>({
|
|
191
196
|
header,
|
|
@@ -204,14 +209,14 @@ const VisibleColumns = <TData extends RowData>({
|
|
|
204
209
|
const isDisabled = (column: Column<TData, unknown>) => {
|
|
205
210
|
return !column.getCanHide() || (visible.length === 1 && visible.includes(column));
|
|
206
211
|
};
|
|
207
|
-
|
|
212
|
+
const uid = useId();
|
|
208
213
|
return (
|
|
209
214
|
<section
|
|
210
215
|
data-testid={`${rootTestId}-visible-columns`}
|
|
211
216
|
className={cx(`${rootClassName}__visible-columns`)}
|
|
212
|
-
aria-labelledby=
|
|
217
|
+
aria-labelledby={`${uid}-visible-columns`}
|
|
213
218
|
>
|
|
214
|
-
<Heading id=
|
|
219
|
+
<Heading id={`${uid}-visible-columns`} variant="title-100" tag="h3">
|
|
215
220
|
{header}
|
|
216
221
|
</Heading>
|
|
217
222
|
{filteredColumns.map((column) => (
|
|
@@ -20,6 +20,9 @@ describe("Data table - Tool bar", () => {
|
|
|
20
20
|
// Needs an element with id purpur-table for the ally tests to not fail with "ARIA attributes must conform to valid values (aria-valid-attr-value)" rule
|
|
21
21
|
<div id="purpur-table">
|
|
22
22
|
<TableToolbar
|
|
23
|
+
aria-controls="purpur-table"
|
|
24
|
+
settingsDrawerAriaControls="purpur-table-settings-drawer"
|
|
25
|
+
exportDrawerAriaControls="purpur-table-export-drawer"
|
|
23
26
|
onResetColumnFilters={resetColumnFiltersMock}
|
|
24
27
|
onSetDrawerIsOpen={setDrawerIsOpenMock}
|
|
25
28
|
onToggleExpand={toggleExpandMock}
|
package/src/table-toolbar.tsx
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React from "react";
|
|
1
|
+
import React, { type Dispatch, type HTMLAttributes, type SetStateAction } from "react";
|
|
2
2
|
import { Button } from "@purpurds/button";
|
|
3
3
|
import { IconDownload } from "@purpurds/icon/download";
|
|
4
4
|
import { IconMaximize } from "@purpurds/icon/maximize";
|
|
@@ -28,8 +28,8 @@ export type TableToolbarCopyProps = {
|
|
|
28
28
|
};
|
|
29
29
|
};
|
|
30
30
|
|
|
31
|
-
export type TableToolbarProps = {
|
|
32
|
-
onSetDrawerIsOpen:
|
|
31
|
+
export type TableToolbarProps = HTMLAttributes<HTMLDivElement> & {
|
|
32
|
+
onSetDrawerIsOpen: Dispatch<SetStateAction<boolean>>;
|
|
33
33
|
onResetColumnFilters: () => void;
|
|
34
34
|
onToggleExpand?: () => void;
|
|
35
35
|
onExportData?: () => void;
|
|
@@ -41,6 +41,8 @@ export type TableToolbarProps = {
|
|
|
41
41
|
hasExportsDrawer: boolean;
|
|
42
42
|
showFilters: boolean;
|
|
43
43
|
disableClearFilters: boolean;
|
|
44
|
+
settingsDrawerAriaControls: string;
|
|
45
|
+
exportDrawerAriaControls: string;
|
|
44
46
|
};
|
|
45
47
|
|
|
46
48
|
const rootClassName = "purpur-table-toolbar";
|
|
@@ -48,6 +50,9 @@ const cx = c.bind(styles);
|
|
|
48
50
|
const rootTestId = "purpur-table-toolbar";
|
|
49
51
|
|
|
50
52
|
export const TableToolbar = ({
|
|
53
|
+
["aria-controls"]: ariaControls,
|
|
54
|
+
settingsDrawerAriaControls,
|
|
55
|
+
exportDrawerAriaControls,
|
|
51
56
|
onExportData,
|
|
52
57
|
onResetColumnFilters,
|
|
53
58
|
onSetDrawerIsOpen,
|
|
@@ -76,7 +81,7 @@ export const TableToolbar = ({
|
|
|
76
81
|
onClick={onResetColumnFilters}
|
|
77
82
|
type="button"
|
|
78
83
|
aria-label={copy?.ariaLabels?.clearFilters}
|
|
79
|
-
aria-controls=
|
|
84
|
+
aria-controls={ariaControls}
|
|
80
85
|
disabled={disableClearFilters}
|
|
81
86
|
>
|
|
82
87
|
{copy.buttons.clearFilters}
|
|
@@ -94,7 +99,7 @@ export const TableToolbar = ({
|
|
|
94
99
|
aria-label={copy?.ariaLabels?.export}
|
|
95
100
|
{...(hasExportsDrawer && {
|
|
96
101
|
"aria-expanded": isExportDrawerOpen,
|
|
97
|
-
"aria-controls":
|
|
102
|
+
"aria-controls": exportDrawerAriaControls,
|
|
98
103
|
"aria-haspopup": "dialog",
|
|
99
104
|
})}
|
|
100
105
|
>
|
|
@@ -110,7 +115,7 @@ export const TableToolbar = ({
|
|
|
110
115
|
type="button"
|
|
111
116
|
aria-label={copy?.ariaLabels?.settings}
|
|
112
117
|
aria-expanded={isSettingsDrawerOpen}
|
|
113
|
-
aria-controls=
|
|
118
|
+
aria-controls={settingsDrawerAriaControls}
|
|
114
119
|
aria-haspopup="dialog"
|
|
115
120
|
>
|
|
116
121
|
<IconSettings size="xs" />
|
|
@@ -124,7 +129,7 @@ export const TableToolbar = ({
|
|
|
124
129
|
onClick={() => onToggleExpand()}
|
|
125
130
|
type="button"
|
|
126
131
|
aria-label={copy?.ariaLabels?.expand}
|
|
127
|
-
aria-controls=
|
|
132
|
+
aria-controls={ariaControls}
|
|
128
133
|
>
|
|
129
134
|
<IconMaximize size="xs" />
|
|
130
135
|
{copy.buttons.expand}
|
package/src/table.module.scss
CHANGED
|
@@ -7,8 +7,6 @@
|
|
|
7
7
|
overflow: hidden;
|
|
8
8
|
flex-direction: column;
|
|
9
9
|
gap: var(--purpur-spacing-200);
|
|
10
|
-
z-index: 1;
|
|
11
|
-
max-width: fit-content;
|
|
12
10
|
background-color: inherit;
|
|
13
11
|
}
|
|
14
12
|
|
|
@@ -38,6 +36,10 @@
|
|
|
38
36
|
border-collapse: separate;
|
|
39
37
|
border-spacing: 0;
|
|
40
38
|
position: relative;
|
|
39
|
+
|
|
40
|
+
&--full-width {
|
|
41
|
+
width: 100%;
|
|
42
|
+
}
|
|
41
43
|
}
|
|
42
44
|
|
|
43
45
|
.purpur-table-header {
|
|
@@ -72,11 +74,16 @@
|
|
|
72
74
|
}
|
|
73
75
|
|
|
74
76
|
.purpur-table-column-header-cell {
|
|
75
|
-
padding: var(--purpur-spacing-
|
|
77
|
+
padding: var(--purpur-spacing-100) var(--purpur-spacing-150) var(--purpur-spacing-100)
|
|
76
78
|
var(--purpur-spacing-300);
|
|
77
79
|
border-bottom: var(--table-border);
|
|
78
80
|
text-align: left;
|
|
79
81
|
|
|
82
|
+
&:has([role="checkbox"]) {
|
|
83
|
+
padding: calc(var(--purpur-spacing-25) + var(--purpur-spacing-50)) var(--purpur-spacing-150)
|
|
84
|
+
calc(var(--purpur-spacing-25) + var(--purpur-spacing-50)) var(--purpur-spacing-300);
|
|
85
|
+
}
|
|
86
|
+
|
|
80
87
|
&__checkbox {
|
|
81
88
|
vertical-align: middle;
|
|
82
89
|
}
|
|
@@ -93,7 +100,7 @@
|
|
|
93
100
|
display: flex;
|
|
94
101
|
flex-direction: column;
|
|
95
102
|
align-items: flex-start;
|
|
96
|
-
gap: var(--purpur-spacing-
|
|
103
|
+
gap: var(--purpur-spacing-50);
|
|
97
104
|
}
|
|
98
105
|
|
|
99
106
|
&__title {
|
|
@@ -101,6 +108,10 @@
|
|
|
101
108
|
align-items: center;
|
|
102
109
|
gap: var(--purpur-spacing-50);
|
|
103
110
|
align-self: stretch;
|
|
111
|
+
|
|
112
|
+
&--default {
|
|
113
|
+
padding: var(--purpur-spacing-100) var(--purpur-spacing-0);
|
|
114
|
+
}
|
|
104
115
|
}
|
|
105
116
|
|
|
106
117
|
&__sortable-title {
|
|
@@ -110,9 +121,9 @@
|
|
|
110
121
|
&__filter-wrapper {
|
|
111
122
|
display: flex;
|
|
112
123
|
padding-right: var(--purpur-spacing-150);
|
|
124
|
+
padding-bottom: var(--purpur-spacing-150);
|
|
113
125
|
flex-direction: column;
|
|
114
126
|
align-items: flex-start;
|
|
115
|
-
gap: var(--purpur-spacing-100);
|
|
116
127
|
align-self: stretch;
|
|
117
128
|
}
|
|
118
129
|
}
|
|
@@ -144,23 +155,32 @@
|
|
|
144
155
|
|
|
145
156
|
&:has(.purpur-table-row-cell__row-selection),
|
|
146
157
|
&:has(.purpur-table-row-cell__row-toggle) {
|
|
147
|
-
.purpur-table-row-cell:
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
+
.purpur-table-row-cell:first-of-type {
|
|
159
|
+
transform: translateZ(0);
|
|
160
|
+
|
|
161
|
+
&::after {
|
|
162
|
+
content: "";
|
|
163
|
+
position: absolute;
|
|
164
|
+
left: calc(-1 * var(--purpur-border-width-xs));
|
|
165
|
+
top: 0;
|
|
166
|
+
bottom: 0;
|
|
167
|
+
width: var(--purpur-border-width-md);
|
|
168
|
+
opacity: 0;
|
|
169
|
+
transition: opacity var(--purpur-motion-duration-150) ease;
|
|
170
|
+
background-color: var(--purpur-color-border-weak);
|
|
171
|
+
pointer-events: none;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
&:hover::after {
|
|
175
|
+
opacity: 1;
|
|
158
176
|
}
|
|
159
177
|
}
|
|
160
178
|
}
|
|
161
179
|
|
|
162
|
-
|
|
163
|
-
|
|
180
|
+
&.purpur-table-row--selected .purpur-table-row-cell:first-of-type {
|
|
181
|
+
transform: translateZ(0);
|
|
182
|
+
|
|
183
|
+
&::after {
|
|
164
184
|
content: "";
|
|
165
185
|
position: absolute;
|
|
166
186
|
left: calc(-1 * var(--purpur-border-width-xs));
|
|
@@ -168,6 +188,8 @@
|
|
|
168
188
|
bottom: 0;
|
|
169
189
|
width: var(--purpur-border-width-md);
|
|
170
190
|
background-color: var(--purpur-color-border-interactive-primary);
|
|
191
|
+
opacity: 1;
|
|
192
|
+
pointer-events: none;
|
|
171
193
|
}
|
|
172
194
|
}
|
|
173
195
|
}
|
|
@@ -194,7 +216,7 @@
|
|
|
194
216
|
}
|
|
195
217
|
|
|
196
218
|
.purpur-table-row-cell {
|
|
197
|
-
height: var(--purpur-spacing-
|
|
219
|
+
height: calc(var(--purpur-spacing-600) + var(--purpur-spacing-150));
|
|
198
220
|
padding: var(--purpur-spacing-0) var(--purpur-spacing-300);
|
|
199
221
|
align-items: center;
|
|
200
222
|
align-self: stretch;
|
|
@@ -263,30 +285,27 @@
|
|
|
263
285
|
text-align: right;
|
|
264
286
|
}
|
|
265
287
|
|
|
288
|
+
&__truncate-wrapper {
|
|
289
|
+
width: 100%;
|
|
290
|
+
display: grid;
|
|
291
|
+
grid-template-columns: 1fr;
|
|
292
|
+
}
|
|
293
|
+
|
|
266
294
|
&__truncate {
|
|
267
295
|
position: relative;
|
|
268
296
|
max-width: 100%;
|
|
269
297
|
width: 100%;
|
|
270
298
|
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
}
|
|
299
|
+
display: block;
|
|
300
|
+
overflow: hidden;
|
|
301
|
+
white-space: nowrap;
|
|
302
|
+
text-overflow: ellipsis;
|
|
276
303
|
|
|
277
304
|
a {
|
|
278
305
|
display: inline;
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
a,
|
|
282
|
-
p,
|
|
283
|
-
span,
|
|
284
|
-
div {
|
|
285
306
|
overflow: hidden;
|
|
286
307
|
white-space: nowrap;
|
|
287
308
|
text-overflow: ellipsis;
|
|
288
|
-
max-width: 100%;
|
|
289
|
-
width: inherit;
|
|
290
309
|
}
|
|
291
310
|
}
|
|
292
311
|
|
package/src/table.stories.tsx
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
/* eslint-disable react-hooks/rules-of-hooks */
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
3
|
import React, { useEffect, useState } from "react";
|
|
6
4
|
import { Grid } from "@purpurds/grid";
|
|
7
5
|
import { IllustrativeIconSearchQuestionDuocolor } from "@purpurds/illustrative-icon/search-question-duocolor";
|
|
@@ -154,6 +152,10 @@ const meta = {
|
|
|
154
152
|
options: ["primary", "secondary"],
|
|
155
153
|
description: "Style variant for the table",
|
|
156
154
|
},
|
|
155
|
+
fullWidth: {
|
|
156
|
+
control: "boolean",
|
|
157
|
+
description: "Full width of the table",
|
|
158
|
+
},
|
|
157
159
|
},
|
|
158
160
|
} satisfies Meta<typeof Table<TableData>>;
|
|
159
161
|
|
|
@@ -245,7 +247,7 @@ const commonSettingsDrawerCopy = {
|
|
|
245
247
|
const commonExportDrawerCopy = {
|
|
246
248
|
title: "Export table",
|
|
247
249
|
bodyText: "Choose the format you want to export the table in.",
|
|
248
|
-
|
|
250
|
+
closeButtonAriaLabel: "Close drawer",
|
|
249
251
|
link: "Export as",
|
|
250
252
|
};
|
|
251
253
|
|
|
@@ -277,6 +279,7 @@ export const Showcase: StoryTableData = {
|
|
|
277
279
|
data: generatedTableData,
|
|
278
280
|
columns: columnDef,
|
|
279
281
|
loading: true,
|
|
282
|
+
fullWidth: true,
|
|
280
283
|
},
|
|
281
284
|
parameters: {
|
|
282
285
|
docs: {
|
|
@@ -345,8 +348,7 @@ manages filtering, sorting and pagination internally.
|
|
|
345
348
|
nextButtonAriaLabel: "Go to next page",
|
|
346
349
|
nextButtonText: "Next",
|
|
347
350
|
outOfLabel: "of",
|
|
348
|
-
|
|
349
|
-
pageSelectorNoOptionsText: "Page does not exist",
|
|
351
|
+
pageSelectorLabel: "Select a page",
|
|
350
352
|
previousButtonAriaLabel: "Go to previous page",
|
|
351
353
|
previousButtonText: "Previous",
|
|
352
354
|
stepNumberPrefix: "Go to page",
|
|
@@ -389,6 +391,7 @@ manages filtering, sorting and pagination internally.
|
|
|
389
391
|
onPrimaryButtonClick={handlePrimaryButtonClick}
|
|
390
392
|
onSecondaryButtonClick={() => console.log("Secondary button clicked")}
|
|
391
393
|
rowSelectionAriaLabels={args.rowSelectionAriaLabels}
|
|
394
|
+
fullWidth={args.fullWidth}
|
|
392
395
|
/>
|
|
393
396
|
);
|
|
394
397
|
},
|
|
@@ -730,8 +733,7 @@ This example demonstrates pagination functionality in the Table.
|
|
|
730
733
|
nextButtonAriaLabel: "Go to next page",
|
|
731
734
|
nextButtonText: "Next",
|
|
732
735
|
outOfLabel: "of",
|
|
733
|
-
|
|
734
|
-
pageSelectorNoOptionsText: "Page does not exist",
|
|
736
|
+
pageSelectorLabel: "Select a page",
|
|
735
737
|
previousButtonAriaLabel: "Go to previous page",
|
|
736
738
|
previousButtonText: "Previous",
|
|
737
739
|
stepNumberPrefix: "Go to page",
|
|
@@ -1150,8 +1152,7 @@ sorting, and filtering are managed by a server API instead of in the browser.
|
|
|
1150
1152
|
nextButtonAriaLabel: "Go to next page",
|
|
1151
1153
|
nextButtonText: "Next",
|
|
1152
1154
|
outOfLabel: "of",
|
|
1153
|
-
|
|
1154
|
-
pageSelectorNoOptionsText: "Page does not exist",
|
|
1155
|
+
pageSelectorLabel: "Select a page",
|
|
1155
1156
|
previousButtonAriaLabel: "Go to previous page",
|
|
1156
1157
|
previousButtonText: "Previous",
|
|
1157
1158
|
stepNumberPrefix: "Go to page",
|