@cloudscape-design/components-themeable 3.0.1308 → 3.0.1310
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/lib/internal/manifest.json +1 -1
- package/lib/internal/scss/badge/styles.scss +19 -6
- package/lib/internal/scss/collection-preferences/content-display/content-display-list.scss +10 -0
- package/lib/internal/scss/collection-preferences/content-display/content-display-option.scss +12 -0
- package/lib/internal/scss/expandable-section/styles.scss +2 -2
- package/lib/internal/scss/icon/mixins.scss +7 -0
- package/lib/internal/scss/internal/generated/custom-css-properties/index.scss +1 -1
- package/lib/internal/scss/table/header-cell/styles.scss +42 -5
- package/lib/internal/scss/table/resizer/styles.scss +26 -13
- package/lib/internal/scss/table/styles.scss +9 -0
- package/lib/internal/template/app-layout/visual-refresh-toolbar/drawer/global-ai-drawer.d.ts.map +1 -1
- package/lib/internal/template/app-layout/visual-refresh-toolbar/drawer/global-ai-drawer.js +4 -2
- package/lib/internal/template/app-layout/visual-refresh-toolbar/drawer/global-ai-drawer.js.map +1 -1
- package/lib/internal/template/app-layout/visual-refresh-toolbar/drawer/global-bottom-drawer.d.ts.map +1 -1
- package/lib/internal/template/app-layout/visual-refresh-toolbar/drawer/global-bottom-drawer.js +4 -2
- package/lib/internal/template/app-layout/visual-refresh-toolbar/drawer/global-bottom-drawer.js.map +1 -1
- package/lib/internal/template/app-layout/visual-refresh-toolbar/drawer/global-drawer.d.ts.map +1 -1
- package/lib/internal/template/app-layout/visual-refresh-toolbar/drawer/global-drawer.js +3 -2
- package/lib/internal/template/app-layout/visual-refresh-toolbar/drawer/global-drawer.js.map +1 -1
- package/lib/internal/template/app-layout/visual-refresh-toolbar/drawer/local-drawer.d.ts.map +1 -1
- package/lib/internal/template/app-layout/visual-refresh-toolbar/drawer/local-drawer.js +2 -2
- package/lib/internal/template/app-layout/visual-refresh-toolbar/drawer/local-drawer.js.map +1 -1
- package/lib/internal/template/app-layout/visual-refresh-toolbar/interfaces.d.ts +1 -0
- package/lib/internal/template/app-layout/visual-refresh-toolbar/interfaces.d.ts.map +1 -1
- package/lib/internal/template/app-layout/visual-refresh-toolbar/interfaces.js.map +1 -1
- package/lib/internal/template/app-layout/visual-refresh-toolbar/state/use-app-layout.d.ts.map +1 -1
- package/lib/internal/template/app-layout/visual-refresh-toolbar/state/use-app-layout.js +12 -1
- package/lib/internal/template/app-layout/visual-refresh-toolbar/state/use-app-layout.js.map +1 -1
- package/lib/internal/template/badge/styles.css.js +10 -10
- package/lib/internal/template/badge/styles.scoped.css +29 -16
- package/lib/internal/template/badge/styles.selectors.js +10 -10
- package/lib/internal/template/collection-preferences/content-display/content-display-option.js +1 -1
- package/lib/internal/template/collection-preferences/content-display/content-display-option.js.map +1 -1
- package/lib/internal/template/collection-preferences/content-display/index.d.ts +1 -1
- package/lib/internal/template/collection-preferences/content-display/index.d.ts.map +1 -1
- package/lib/internal/template/collection-preferences/content-display/index.js +63 -27
- package/lib/internal/template/collection-preferences/content-display/index.js.map +1 -1
- package/lib/internal/template/collection-preferences/content-display/utils.d.ts +40 -1
- package/lib/internal/template/collection-preferences/content-display/utils.d.ts.map +1 -1
- package/lib/internal/template/collection-preferences/content-display/utils.js +107 -13
- package/lib/internal/template/collection-preferences/content-display/utils.js.map +1 -1
- package/lib/internal/template/collection-preferences/index.d.ts.map +1 -1
- package/lib/internal/template/collection-preferences/index.js +2 -2
- package/lib/internal/template/collection-preferences/index.js.map +1 -1
- package/lib/internal/template/collection-preferences/interfaces.d.ts +30 -2
- package/lib/internal/template/collection-preferences/interfaces.d.ts.map +1 -1
- package/lib/internal/template/collection-preferences/interfaces.js.map +1 -1
- package/lib/internal/template/collection-preferences/styles.css.js +38 -36
- package/lib/internal/template/collection-preferences/styles.scoped.css +81 -37
- package/lib/internal/template/collection-preferences/styles.selectors.js +38 -36
- package/lib/internal/template/collection-preferences/utils.d.ts +1 -0
- package/lib/internal/template/collection-preferences/utils.d.ts.map +1 -1
- package/lib/internal/template/collection-preferences/utils.js +14 -0
- package/lib/internal/template/collection-preferences/utils.js.map +1 -1
- package/lib/internal/template/expandable-section/styles.css.js +35 -35
- package/lib/internal/template/expandable-section/styles.scoped.css +68 -68
- package/lib/internal/template/expandable-section/styles.selectors.js +35 -35
- package/lib/internal/template/i18n/messages/all.all.js +1 -1
- package/lib/internal/template/i18n/messages/all.all.json +1 -1
- package/lib/internal/template/i18n/messages/all.en.js +1 -1
- package/lib/internal/template/i18n/messages/all.en.json +1 -1
- package/lib/internal/template/i18n/messages-types.d.ts +4 -0
- package/lib/internal/template/i18n/messages-types.d.ts.map +1 -1
- package/lib/internal/template/i18n/messages-types.js.map +1 -1
- package/lib/internal/template/icon/interfaces.d.ts +1 -1
- package/lib/internal/template/icon/interfaces.d.ts.map +1 -1
- package/lib/internal/template/icon/interfaces.js.map +1 -1
- package/lib/internal/template/icon/internal.js +2 -2
- package/lib/internal/template/icon/internal.js.map +1 -1
- package/lib/internal/template/icon/styles.css.js +41 -39
- package/lib/internal/template/icon/styles.scoped.css +104 -85
- package/lib/internal/template/icon/styles.selectors.js +41 -39
- package/lib/internal/template/internal/base-component/styles.scoped.css +57 -5
- package/lib/internal/template/internal/environment.js +2 -2
- package/lib/internal/template/internal/environment.json +2 -2
- package/lib/internal/template/internal/generated/styles/tokens.d.ts +23 -1
- package/lib/internal/template/internal/generated/styles/tokens.js +23 -1
- package/lib/internal/template/internal/generated/theming/index.cjs +476 -4
- package/lib/internal/template/internal/generated/theming/index.cjs.d.ts +216 -0
- package/lib/internal/template/internal/generated/theming/index.d.ts +216 -0
- package/lib/internal/template/internal/generated/theming/index.js +476 -4
- package/lib/internal/template/internal/hooks/use-width-change/index.d.ts +13 -0
- package/lib/internal/template/internal/hooks/use-width-change/index.d.ts.map +1 -0
- package/lib/internal/template/internal/hooks/use-width-change/index.js +33 -0
- package/lib/internal/template/internal/hooks/use-width-change/index.js.map +1 -0
- package/lib/internal/template/pagination/internal.d.ts.map +1 -1
- package/lib/internal/template/pagination/internal.js +4 -1
- package/lib/internal/template/pagination/internal.js.map +1 -1
- package/lib/internal/template/prompt-input/internal.d.ts.map +1 -1
- package/lib/internal/template/prompt-input/internal.js +9 -2
- package/lib/internal/template/prompt-input/internal.js.map +1 -1
- package/lib/internal/template/prompt-input/tokens/use-token-mode.d.ts.map +1 -1
- package/lib/internal/template/prompt-input/tokens/use-token-mode.js +0 -9
- package/lib/internal/template/prompt-input/tokens/use-token-mode.js.map +1 -1
- package/lib/internal/template/table/column-groups/col-group.d.ts +8 -0
- package/lib/internal/template/table/column-groups/col-group.d.ts.map +1 -0
- package/lib/internal/template/table/column-groups/col-group.js +24 -0
- package/lib/internal/template/table/column-groups/col-group.js.map +1 -0
- package/lib/internal/template/table/column-groups/split-utils.d.ts +27 -0
- package/lib/internal/template/table/column-groups/split-utils.d.ts.map +1 -0
- package/lib/internal/template/table/column-groups/split-utils.js +43 -0
- package/lib/internal/template/table/column-groups/split-utils.js.map +1 -0
- package/lib/internal/template/table/column-groups/use-column-groups.d.ts +8 -0
- package/lib/internal/template/table/column-groups/use-column-groups.d.ts.map +1 -0
- package/lib/internal/template/table/column-groups/use-column-groups.js +23 -0
- package/lib/internal/template/table/column-groups/use-column-groups.js.map +1 -0
- package/lib/internal/template/table/column-groups/utils.d.ts +55 -0
- package/lib/internal/template/table/column-groups/utils.d.ts.map +1 -0
- package/lib/internal/template/table/column-groups/utils.js +204 -0
- package/lib/internal/template/table/column-groups/utils.js.map +1 -0
- package/lib/internal/template/table/header-cell/common-props.d.ts +24 -0
- package/lib/internal/template/table/header-cell/common-props.d.ts.map +1 -0
- package/lib/internal/template/table/header-cell/common-props.js +4 -0
- package/lib/internal/template/table/header-cell/common-props.js.map +1 -0
- package/lib/internal/template/table/header-cell/group-header-cell.d.ts +18 -0
- package/lib/internal/template/table/header-cell/group-header-cell.d.ts.map +1 -0
- package/lib/internal/template/table/header-cell/group-header-cell.js +44 -0
- package/lib/internal/template/table/header-cell/group-header-cell.js.map +1 -0
- package/lib/internal/template/table/header-cell/index.d.ts +8 -23
- package/lib/internal/template/table/header-cell/index.d.ts.map +1 -1
- package/lib/internal/template/table/header-cell/index.js +3 -3
- package/lib/internal/template/table/header-cell/index.js.map +1 -1
- package/lib/internal/template/table/header-cell/styles.css.js +33 -30
- package/lib/internal/template/table/header-cell/styles.scoped.css +92 -68
- package/lib/internal/template/table/header-cell/styles.selectors.js +33 -30
- package/lib/internal/template/table/header-cell/th-element.d.ts +10 -1
- package/lib/internal/template/table/header-cell/th-element.d.ts.map +1 -1
- package/lib/internal/template/table/header-cell/th-element.js +6 -4
- package/lib/internal/template/table/header-cell/th-element.js.map +1 -1
- package/lib/internal/template/table/index.d.ts.map +1 -1
- package/lib/internal/template/table/index.js +5 -2
- package/lib/internal/template/table/index.js.map +1 -1
- package/lib/internal/template/table/interfaces.d.ts +37 -1
- package/lib/internal/template/table/interfaces.d.ts.map +1 -1
- package/lib/internal/template/table/interfaces.js.map +1 -1
- package/lib/internal/template/table/internal.d.ts.map +1 -1
- package/lib/internal/template/table/internal.js +17 -5
- package/lib/internal/template/table/internal.js.map +1 -1
- package/lib/internal/template/table/resizer/index.d.ts +6 -2
- package/lib/internal/template/table/resizer/index.d.ts.map +1 -1
- package/lib/internal/template/table/resizer/index.js +5 -5
- package/lib/internal/template/table/resizer/index.js.map +1 -1
- package/lib/internal/template/table/resizer/styles.css.js +16 -13
- package/lib/internal/template/table/resizer/styles.scoped.css +36 -26
- package/lib/internal/template/table/resizer/styles.selectors.js +16 -13
- package/lib/internal/template/table/sticky-header.d.ts +3 -0
- package/lib/internal/template/table/sticky-header.d.ts.map +1 -1
- package/lib/internal/template/table/sticky-header.js +7 -2
- package/lib/internal/template/table/sticky-header.js.map +1 -1
- package/lib/internal/template/table/sticky-scrolling.d.ts.map +1 -1
- package/lib/internal/template/table/sticky-scrolling.js +6 -1
- package/lib/internal/template/table/sticky-scrolling.js.map +1 -1
- package/lib/internal/template/table/styles.css.js +35 -34
- package/lib/internal/template/table/styles.scoped.css +47 -41
- package/lib/internal/template/table/styles.selectors.js +35 -34
- package/lib/internal/template/table/table-role/grid-navigation.d.ts.map +1 -1
- package/lib/internal/template/table/table-role/grid-navigation.js +5 -7
- package/lib/internal/template/table/table-role/grid-navigation.js.map +1 -1
- package/lib/internal/template/table/table-role/table-role-helper.d.ts +3 -0
- package/lib/internal/template/table/table-role/table-role-helper.d.ts.map +1 -1
- package/lib/internal/template/table/table-role/table-role-helper.js +9 -4
- package/lib/internal/template/table/table-role/table-role-helper.js.map +1 -1
- package/lib/internal/template/table/table-role/utils.d.ts +19 -0
- package/lib/internal/template/table/table-role/utils.d.ts.map +1 -1
- package/lib/internal/template/table/table-role/utils.js +86 -7
- package/lib/internal/template/table/table-role/utils.js.map +1 -1
- package/lib/internal/template/table/thead.d.ts +5 -0
- package/lib/internal/template/table/thead.d.ts.map +1 -1
- package/lib/internal/template/table/thead.js +145 -18
- package/lib/internal/template/table/thead.js.map +1 -1
- package/lib/internal/template/table/use-column-widths.d.ts +4 -1
- package/lib/internal/template/table/use-column-widths.d.ts.map +1 -1
- package/lib/internal/template/table/use-column-widths.js +68 -18
- package/lib/internal/template/table/use-column-widths.js.map +1 -1
- package/lib/internal/template/table/use-sticky-header.d.ts.map +1 -1
- package/lib/internal/template/table/use-sticky-header.js +4 -1
- package/lib/internal/template/table/use-sticky-header.js.map +1 -1
- package/lib/internal/template/table/utils.d.ts.map +1 -1
- package/lib/internal/template/table/utils.js +14 -4
- package/lib/internal/template/table/utils.js.map +1 -1
- package/lib/internal/template/test-utils/dom/collection-preferences/content-display-preference.d.ts +28 -2
- package/lib/internal/template/test-utils/dom/collection-preferences/content-display-preference.js +60 -2
- package/lib/internal/template/test-utils/dom/collection-preferences/content-display-preference.js.map +1 -1
- package/lib/internal/template/test-utils/dom/table/index.d.ts +18 -1
- package/lib/internal/template/test-utils/dom/table/index.js +22 -3
- package/lib/internal/template/test-utils/dom/table/index.js.map +1 -1
- package/lib/internal/template/test-utils/selectors/collection-preferences/content-display-preference.d.ts +28 -2
- package/lib/internal/template/test-utils/selectors/collection-preferences/content-display-preference.js +52 -2
- package/lib/internal/template/test-utils/selectors/collection-preferences/content-display-preference.js.map +1 -1
- package/lib/internal/template/test-utils/selectors/table/index.d.ts +18 -1
- package/lib/internal/template/test-utils/selectors/table/index.js +22 -3
- package/lib/internal/template/test-utils/selectors/table/index.js.map +1 -1
- package/lib/internal/template/wizard/wizard-step-list.js +4 -4
- package/lib/internal/template/wizard/wizard-step-list.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import { warnOnce } from '@cloudscape-design/component-toolkit/internal';
|
|
4
|
+
import { getVisibleColumnDefinitions } from '../utils';
|
|
5
|
+
/**
|
|
6
|
+
* A node in the table header tree.
|
|
7
|
+
* - Column nodes map to column definitions.
|
|
8
|
+
* - Internal nodes map to group definitions.
|
|
9
|
+
* - The root is a virtual container (never rendered).
|
|
10
|
+
*/
|
|
11
|
+
export class TableHeaderNode {
|
|
12
|
+
constructor(id, props = {}) {
|
|
13
|
+
var _a, _b, _c, _d, _e;
|
|
14
|
+
this.subTreeHeight = 1;
|
|
15
|
+
this.children = [];
|
|
16
|
+
this.id = id;
|
|
17
|
+
this.isRoot = (_a = props.isRoot) !== null && _a !== void 0 ? _a : false;
|
|
18
|
+
this.columnDefinition = props.columnDefinition;
|
|
19
|
+
this.groupDefinition = props.groupDefinition;
|
|
20
|
+
this.colSpan = (_b = props.colSpan) !== null && _b !== void 0 ? _b : 1;
|
|
21
|
+
this.rowSpan = (_c = props.rowSpan) !== null && _c !== void 0 ? _c : 1;
|
|
22
|
+
this.rowIndex = (_d = props.rowIndex) !== null && _d !== void 0 ? _d : -1;
|
|
23
|
+
this.colIndex = (_e = props.colIndex) !== null && _e !== void 0 ? _e : -1;
|
|
24
|
+
}
|
|
25
|
+
get isGroup() {
|
|
26
|
+
return !!this.groupDefinition;
|
|
27
|
+
}
|
|
28
|
+
get isColumn() {
|
|
29
|
+
return !this.isRoot && this.children.length === 0;
|
|
30
|
+
}
|
|
31
|
+
addChild(child) {
|
|
32
|
+
this.children.push(child);
|
|
33
|
+
child.parent = this;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Builds the tree from the nested columnDisplay structure.
|
|
38
|
+
* Groups are only attached if they contain at least one visible descendant.
|
|
39
|
+
*/
|
|
40
|
+
function buildTreeFromColumnDisplay(displayItems, nodeMap, parent) {
|
|
41
|
+
for (const item of displayItems) {
|
|
42
|
+
if (item.type === 'group') {
|
|
43
|
+
const groupNode = nodeMap.get(item.id);
|
|
44
|
+
if (!groupNode) {
|
|
45
|
+
warnOnce('[Table]', `Group "${item.id}" referenced in columnDisplay not found in groupDefinitions. Skipping.`);
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
buildTreeFromColumnDisplay(item.children, nodeMap, groupNode);
|
|
49
|
+
// Only attach group if it has visible descendants. The recursive call above
|
|
50
|
+
// only adds children that are either visible columns or nested groups with
|
|
51
|
+
// their own visible descendants, so this check handles all nesting levels.
|
|
52
|
+
if (groupNode.children.length > 0) {
|
|
53
|
+
parent.addChild(groupNode);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
if (!item.visible) {
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
const colNode = nodeMap.get(item.id);
|
|
61
|
+
if (colNode) {
|
|
62
|
+
parent.addChild(colNode);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Fallback when no columnDisplay is provided: all visible columns attach directly to root.
|
|
69
|
+
*/
|
|
70
|
+
function buildTreeFromVisibleColumns(visibleColumns, nodeMap, root) {
|
|
71
|
+
for (const col of visibleColumns) {
|
|
72
|
+
// Columns without IDs cannot participate in grouping, they have no key
|
|
73
|
+
// to match against columnDisplay entries or groupDefinitions.
|
|
74
|
+
if (!col.id) {
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
const node = nodeMap.get(col.id);
|
|
78
|
+
if (node) {
|
|
79
|
+
root.addChild(node);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function computeSubTreeHeights(node) {
|
|
84
|
+
if (node.isColumn || node.children.length === 0) {
|
|
85
|
+
node.subTreeHeight = 1;
|
|
86
|
+
return 1;
|
|
87
|
+
}
|
|
88
|
+
const maxChildHeight = Math.max(...node.children.map(child => computeSubTreeHeights(child)));
|
|
89
|
+
node.subTreeHeight = maxChildHeight + 1;
|
|
90
|
+
return node.subTreeHeight;
|
|
91
|
+
}
|
|
92
|
+
function computeRowSpansAndIndices(node, treeHeight, ancestorRows = 0) {
|
|
93
|
+
const maxChildHeight = Math.max(...node.children.map(c => c.subTreeHeight), 0);
|
|
94
|
+
node.rowSpan = treeHeight - ancestorRows - maxChildHeight;
|
|
95
|
+
if (node.parent) {
|
|
96
|
+
node.rowIndex = node.parent.rowIndex + node.parent.rowSpan;
|
|
97
|
+
}
|
|
98
|
+
for (const child of node.children) {
|
|
99
|
+
computeRowSpansAndIndices(child, treeHeight, ancestorRows + node.rowSpan);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function computeColSpansAndIndices(node, startCol = 0) {
|
|
103
|
+
node.colIndex = startCol;
|
|
104
|
+
if (node.isColumn) {
|
|
105
|
+
node.colSpan = 1;
|
|
106
|
+
return startCol + 1;
|
|
107
|
+
}
|
|
108
|
+
let nextCol = startCol;
|
|
109
|
+
for (const child of node.children) {
|
|
110
|
+
nextCol = computeColSpansAndIndices(child, nextCol);
|
|
111
|
+
}
|
|
112
|
+
node.colSpan = nextCol - startCol;
|
|
113
|
+
return nextCol;
|
|
114
|
+
}
|
|
115
|
+
export function calculateHierarchyTree(columnDefinitions, visibleColumnIds, groupDefinitions, columnDisplay) {
|
|
116
|
+
const visibleColumns = getVisibleColumnDefinitions({
|
|
117
|
+
columnDisplay,
|
|
118
|
+
visibleColumns: visibleColumnIds,
|
|
119
|
+
columnDefinitions,
|
|
120
|
+
});
|
|
121
|
+
const nodeMap = new Map();
|
|
122
|
+
for (const col of visibleColumns) {
|
|
123
|
+
if (col.id) {
|
|
124
|
+
nodeMap.set(col.id, new TableHeaderNode(col.id, { columnDefinition: col }));
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
for (const group of groupDefinitions) {
|
|
128
|
+
nodeMap.set(group.id, new TableHeaderNode(group.id, { groupDefinition: group }));
|
|
129
|
+
}
|
|
130
|
+
const root = new TableHeaderNode('*', { isRoot: true });
|
|
131
|
+
if (columnDisplay && columnDisplay.length > 0) {
|
|
132
|
+
buildTreeFromColumnDisplay(columnDisplay, nodeMap, root);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
buildTreeFromVisibleColumns(visibleColumns, nodeMap, root);
|
|
136
|
+
}
|
|
137
|
+
computeSubTreeHeights(root);
|
|
138
|
+
const treeHeight = root.subTreeHeight - 1;
|
|
139
|
+
root.rowIndex = -1;
|
|
140
|
+
root.rowSpan = 1;
|
|
141
|
+
root.colSpan = visibleColumns.length;
|
|
142
|
+
for (const child of root.children) {
|
|
143
|
+
computeRowSpansAndIndices(child, treeHeight);
|
|
144
|
+
}
|
|
145
|
+
computeColSpansAndIndices(root);
|
|
146
|
+
return buildOutput(root, treeHeight);
|
|
147
|
+
}
|
|
148
|
+
function getParentChain(node) {
|
|
149
|
+
const chain = [];
|
|
150
|
+
let current = node.parent;
|
|
151
|
+
while (current && !current.isRoot) {
|
|
152
|
+
chain.unshift(current.id);
|
|
153
|
+
current = current.parent;
|
|
154
|
+
}
|
|
155
|
+
return chain;
|
|
156
|
+
}
|
|
157
|
+
function buildOutput(root, maxDepth) {
|
|
158
|
+
var _a, _b, _c;
|
|
159
|
+
const rowsMap = new Map();
|
|
160
|
+
const columnToParentIds = new Map();
|
|
161
|
+
const queue = [...root.children];
|
|
162
|
+
while (queue.length > 0) {
|
|
163
|
+
const node = queue.shift();
|
|
164
|
+
const parentChain = getParentChain(node);
|
|
165
|
+
const entry = {
|
|
166
|
+
id: node.id,
|
|
167
|
+
header: (_b = (_a = node.groupDefinition) === null || _a === void 0 ? void 0 : _a.header) !== null && _b !== void 0 ? _b : (_c = node.columnDefinition) === null || _c === void 0 ? void 0 : _c.header,
|
|
168
|
+
colSpan: node.colSpan,
|
|
169
|
+
rowSpan: node.rowSpan,
|
|
170
|
+
isGroup: node.isGroup,
|
|
171
|
+
columnDefinition: node.columnDefinition,
|
|
172
|
+
groupDefinition: node.groupDefinition,
|
|
173
|
+
parentGroupIds: parentChain,
|
|
174
|
+
colIndex: node.colIndex,
|
|
175
|
+
};
|
|
176
|
+
if (!rowsMap.has(node.rowIndex)) {
|
|
177
|
+
rowsMap.set(node.rowIndex, []);
|
|
178
|
+
}
|
|
179
|
+
rowsMap.get(node.rowIndex).push(entry);
|
|
180
|
+
if (node.isColumn && node.columnDefinition && parentChain.length > 0) {
|
|
181
|
+
columnToParentIds.set(node.id, parentChain);
|
|
182
|
+
}
|
|
183
|
+
queue.push(...node.children);
|
|
184
|
+
}
|
|
185
|
+
// Sort row indices to ensure rows are ordered top-to-bottom,
|
|
186
|
+
// then sort columns within each row by their horizontal position.
|
|
187
|
+
const rows = Array.from(rowsMap.keys())
|
|
188
|
+
.sort((a, b) => a - b)
|
|
189
|
+
.map(key => ({ columns: rowsMap.get(key).sort((a, b) => a.colIndex - b.colIndex) }));
|
|
190
|
+
return { rows, maxDepth, columnToParentIds };
|
|
191
|
+
}
|
|
192
|
+
export function getColumnGroupsDepth(columnDisplay) {
|
|
193
|
+
if (!columnDisplay) {
|
|
194
|
+
return 0;
|
|
195
|
+
}
|
|
196
|
+
let maxDepth = 0;
|
|
197
|
+
for (const item of columnDisplay) {
|
|
198
|
+
if (item.type === 'group') {
|
|
199
|
+
maxDepth = Math.max(maxDepth, 1 + getColumnGroupsDepth(item.children));
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return maxDepth;
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/table/column-groups/utils.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { warnOnce } from '@cloudscape-design/component-toolkit/internal';\n\nimport { TableProps } from '../interfaces';\nimport { getVisibleColumnDefinitions } from '../utils';\n\nexport interface HeaderRowColumn<T> {\n id: string;\n header?: React.ReactNode;\n colSpan: number;\n rowSpan: number;\n isGroup: boolean;\n columnDefinition?: TableProps.ColumnDefinition<T>;\n groupDefinition?: TableProps.GroupDefinition;\n parentGroupIds: string[];\n colIndex: number;\n}\n\nexport interface HeaderRow<T> {\n columns: HeaderRowColumn<T>[];\n}\n\nexport interface ColumnGroupsLayout<T> {\n rows: HeaderRow<T>[];\n maxDepth: number;\n columnToParentIds: Map<string, string[]>;\n}\n\nexport interface TableHeaderNodeProps<T> {\n columnDefinition?: TableProps.ColumnDefinition<T>;\n groupDefinition?: TableProps.GroupDefinition;\n isRoot?: boolean;\n colSpan?: number;\n rowSpan?: number;\n rowIndex?: number;\n colIndex?: number;\n}\n\n/**\n * A node in the table header tree.\n * - Column nodes map to column definitions.\n * - Internal nodes map to group definitions.\n * - The root is a virtual container (never rendered).\n */\nexport class TableHeaderNode<T> {\n public readonly id: string;\n public readonly isRoot: boolean;\n public readonly columnDefinition?: TableProps.ColumnDefinition<T>;\n public readonly groupDefinition?: TableProps.GroupDefinition;\n\n public colSpan: number;\n public rowSpan: number;\n public rowIndex: number;\n public colIndex: number;\n public subTreeHeight: number = 1;\n\n public children: TableHeaderNode<T>[] = [];\n public parent?: TableHeaderNode<T>;\n\n constructor(id: string, props: TableHeaderNodeProps<T> = {}) {\n this.id = id;\n this.isRoot = props.isRoot ?? false;\n this.columnDefinition = props.columnDefinition;\n this.groupDefinition = props.groupDefinition;\n this.colSpan = props.colSpan ?? 1;\n this.rowSpan = props.rowSpan ?? 1;\n this.rowIndex = props.rowIndex ?? -1;\n this.colIndex = props.colIndex ?? -1;\n }\n\n get isGroup(): boolean {\n return !!this.groupDefinition;\n }\n\n get isColumn(): boolean {\n return !this.isRoot && this.children.length === 0;\n }\n\n addChild(child: TableHeaderNode<T>): void {\n this.children.push(child);\n child.parent = this;\n }\n}\n\n/**\n * Builds the tree from the nested columnDisplay structure.\n * Groups are only attached if they contain at least one visible descendant.\n */\nfunction buildTreeFromColumnDisplay<T>(\n displayItems: ReadonlyArray<TableProps.ColumnDisplayProperties>,\n nodeMap: Map<string, TableHeaderNode<T>>,\n parent: TableHeaderNode<T>\n): void {\n for (const item of displayItems) {\n if (item.type === 'group') {\n const groupNode = nodeMap.get(item.id);\n if (!groupNode) {\n warnOnce('[Table]', `Group \"${item.id}\" referenced in columnDisplay not found in groupDefinitions. Skipping.`);\n continue;\n }\n buildTreeFromColumnDisplay(item.children, nodeMap, groupNode);\n // Only attach group if it has visible descendants. The recursive call above\n // only adds children that are either visible columns or nested groups with\n // their own visible descendants, so this check handles all nesting levels.\n if (groupNode.children.length > 0) {\n parent.addChild(groupNode);\n }\n } else {\n if (!item.visible) {\n continue;\n }\n const colNode = nodeMap.get(item.id);\n if (colNode) {\n parent.addChild(colNode);\n }\n }\n }\n}\n\n/**\n * Fallback when no columnDisplay is provided: all visible columns attach directly to root.\n */\nfunction buildTreeFromVisibleColumns<T>(\n visibleColumns: Readonly<TableProps.ColumnDefinition<T>[]>,\n nodeMap: Map<string, TableHeaderNode<T>>,\n root: TableHeaderNode<T>\n): void {\n for (const col of visibleColumns) {\n // Columns without IDs cannot participate in grouping, they have no key\n // to match against columnDisplay entries or groupDefinitions.\n if (!col.id) {\n continue;\n }\n const node = nodeMap.get(col.id);\n if (node) {\n root.addChild(node);\n }\n }\n}\n\nfunction computeSubTreeHeights<T>(node: TableHeaderNode<T>): number {\n if (node.isColumn || node.children.length === 0) {\n node.subTreeHeight = 1;\n return 1;\n }\n const maxChildHeight = Math.max(...node.children.map(child => computeSubTreeHeights(child)));\n node.subTreeHeight = maxChildHeight + 1;\n return node.subTreeHeight;\n}\n\nfunction computeRowSpansAndIndices<T>(node: TableHeaderNode<T>, treeHeight: number, ancestorRows: number = 0): void {\n const maxChildHeight = Math.max(...node.children.map(c => c.subTreeHeight), 0);\n node.rowSpan = treeHeight - ancestorRows - maxChildHeight;\n\n if (node.parent) {\n node.rowIndex = node.parent.rowIndex + node.parent.rowSpan;\n }\n\n for (const child of node.children) {\n computeRowSpansAndIndices(child, treeHeight, ancestorRows + node.rowSpan);\n }\n}\n\nfunction computeColSpansAndIndices<T>(node: TableHeaderNode<T>, startCol: number = 0): number {\n node.colIndex = startCol;\n\n if (node.isColumn) {\n node.colSpan = 1;\n return startCol + 1;\n }\n\n let nextCol = startCol;\n for (const child of node.children) {\n nextCol = computeColSpansAndIndices(child, nextCol);\n }\n\n node.colSpan = nextCol - startCol;\n return nextCol;\n}\n\nexport function calculateHierarchyTree<T>(\n columnDefinitions: ReadonlyArray<TableProps.ColumnDefinition<T>>,\n visibleColumnIds: readonly string[],\n groupDefinitions: ReadonlyArray<TableProps.GroupDefinition>,\n columnDisplay?: ReadonlyArray<TableProps.ColumnDisplayProperties>\n): ColumnGroupsLayout<T> {\n const visibleColumns = getVisibleColumnDefinitions({\n columnDisplay,\n visibleColumns: visibleColumnIds,\n columnDefinitions,\n });\n\n const nodeMap = new Map<string, TableHeaderNode<T>>();\n\n for (const col of visibleColumns) {\n if (col.id) {\n nodeMap.set(col.id, new TableHeaderNode<T>(col.id, { columnDefinition: col }));\n }\n }\n\n for (const group of groupDefinitions) {\n nodeMap.set(group.id, new TableHeaderNode<T>(group.id, { groupDefinition: group }));\n }\n\n const root = new TableHeaderNode<T>('*', { isRoot: true });\n\n if (columnDisplay && columnDisplay.length > 0) {\n buildTreeFromColumnDisplay(columnDisplay, nodeMap, root);\n } else {\n buildTreeFromVisibleColumns(visibleColumns, nodeMap, root);\n }\n\n computeSubTreeHeights(root);\n\n const treeHeight = root.subTreeHeight - 1;\n root.rowIndex = -1;\n root.rowSpan = 1;\n root.colSpan = visibleColumns.length;\n\n for (const child of root.children) {\n computeRowSpansAndIndices(child, treeHeight);\n }\n\n computeColSpansAndIndices(root);\n\n return buildOutput(root, treeHeight);\n}\n\nfunction getParentChain<T>(node: TableHeaderNode<T>): string[] {\n const chain: string[] = [];\n let current = node.parent;\n while (current && !current.isRoot) {\n chain.unshift(current.id);\n current = current.parent;\n }\n return chain;\n}\n\nfunction buildOutput<T>(root: TableHeaderNode<T>, maxDepth: number): ColumnGroupsLayout<T> {\n const rowsMap = new Map<number, HeaderRowColumn<T>[]>();\n const columnToParentIds = new Map<string, string[]>();\n\n const queue: TableHeaderNode<T>[] = [...root.children];\n\n while (queue.length > 0) {\n const node = queue.shift()!;\n const parentChain = getParentChain(node);\n\n const entry: HeaderRowColumn<T> = {\n id: node.id,\n header: node.groupDefinition?.header ?? node.columnDefinition?.header,\n colSpan: node.colSpan,\n rowSpan: node.rowSpan,\n isGroup: node.isGroup,\n columnDefinition: node.columnDefinition,\n groupDefinition: node.groupDefinition,\n parentGroupIds: parentChain,\n colIndex: node.colIndex,\n };\n\n if (!rowsMap.has(node.rowIndex)) {\n rowsMap.set(node.rowIndex, []);\n }\n rowsMap.get(node.rowIndex)!.push(entry);\n\n if (node.isColumn && node.columnDefinition && parentChain.length > 0) {\n columnToParentIds.set(node.id, parentChain);\n }\n\n queue.push(...node.children);\n }\n\n // Sort row indices to ensure rows are ordered top-to-bottom,\n // then sort columns within each row by their horizontal position.\n const rows: HeaderRow<T>[] = Array.from(rowsMap.keys())\n .sort((a, b) => a - b)\n .map(key => ({ columns: rowsMap.get(key)!.sort((a, b) => a.colIndex - b.colIndex) }));\n\n return { rows, maxDepth, columnToParentIds };\n}\n\nexport function getColumnGroupsDepth(columnDisplay?: ReadonlyArray<TableProps.ColumnDisplayProperties>): number {\n if (!columnDisplay) {\n return 0;\n }\n let maxDepth = 0;\n for (const item of columnDisplay) {\n if (item.type === 'group') {\n maxDepth = Math.max(maxDepth, 1 + getColumnGroupsDepth(item.children));\n }\n }\n return maxDepth;\n}\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ColumnWidthStyle } from '../column-widths-utils';
|
|
2
|
+
import { TableProps } from '../interfaces';
|
|
3
|
+
import { StickyColumnsModel } from '../sticky-columns';
|
|
4
|
+
import { TableRole } from '../table-role';
|
|
5
|
+
export interface BaseHeaderCellProps {
|
|
6
|
+
tabIndex: number;
|
|
7
|
+
colIndex: number;
|
|
8
|
+
focusedComponent?: null | string;
|
|
9
|
+
resizableColumns?: boolean;
|
|
10
|
+
resizableStyle?: ColumnWidthStyle;
|
|
11
|
+
onResizeFinish: () => void;
|
|
12
|
+
sticky?: boolean;
|
|
13
|
+
hidden?: boolean;
|
|
14
|
+
stripedRows?: boolean;
|
|
15
|
+
stickyState: StickyColumnsModel;
|
|
16
|
+
cellRef: React.RefCallback<HTMLElement>;
|
|
17
|
+
tableRole: TableRole;
|
|
18
|
+
resizerRoleDescription?: string;
|
|
19
|
+
resizerTooltipText?: string;
|
|
20
|
+
variant: TableProps.Variant;
|
|
21
|
+
tableVariant?: TableProps.Variant;
|
|
22
|
+
wrapLines?: boolean;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=common-props.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common-props.d.ts","sourceRoot":"","sources":["../../../../src/table/header-cell/common-props.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;IACjC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,cAAc,CAAC,EAAE,gBAAgB,CAAC;IAClC,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,kBAAkB,CAAC;IAChC,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;IACxC,SAAS,EAAE,SAAS,CAAC;IACrB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC;IAC5B,YAAY,CAAC,EAAE,UAAU,CAAC,OAAO,CAAC;IAClC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common-props.js","sourceRoot":"","sources":["../../../../src/table/header-cell/common-props.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,sCAAsC","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { ColumnWidthStyle } from '../column-widths-utils';\nimport { TableProps } from '../interfaces';\nimport { StickyColumnsModel } from '../sticky-columns';\nimport { TableRole } from '../table-role';\n\nexport interface BaseHeaderCellProps {\n tabIndex: number;\n colIndex: number;\n focusedComponent?: null | string;\n resizableColumns?: boolean;\n resizableStyle?: ColumnWidthStyle;\n onResizeFinish: () => void;\n sticky?: boolean;\n hidden?: boolean;\n stripedRows?: boolean;\n stickyState: StickyColumnsModel;\n cellRef: React.RefCallback<HTMLElement>;\n tableRole: TableRole;\n resizerRoleDescription?: string;\n resizerTooltipText?: string;\n variant: TableProps.Variant;\n tableVariant?: TableProps.Variant;\n wrapLines?: boolean;\n}\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { TableProps } from '../interfaces';
|
|
2
|
+
import { BaseHeaderCellProps } from './common-props';
|
|
3
|
+
export interface TableGroupHeaderCellProps extends BaseHeaderCellProps {
|
|
4
|
+
group: TableProps.GroupDefinition;
|
|
5
|
+
colspan: number;
|
|
6
|
+
rowspan: number;
|
|
7
|
+
groupId: string;
|
|
8
|
+
updateGroupWidth: (groupId: PropertyKey, newWidth: number) => void;
|
|
9
|
+
childColumnIds: PropertyKey[];
|
|
10
|
+
firstChildColumnId?: PropertyKey;
|
|
11
|
+
lastChildColumnId?: PropertyKey;
|
|
12
|
+
columnGroupId?: string;
|
|
13
|
+
stickyColumnId?: PropertyKey;
|
|
14
|
+
stickyBoundaryColumnId?: PropertyKey;
|
|
15
|
+
isLast?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export declare function TableGroupHeaderCell({ group, colspan, rowspan, colIndex, groupId, resizableColumns, resizableStyle, onResizeFinish, updateGroupWidth, childColumnIds, focusedComponent, tabIndex, sticky, hidden, stripedRows, stickyState, cellRef, tableRole, resizerRoleDescription, resizerTooltipText, variant, tableVariant, columnGroupId, stickyColumnId, stickyBoundaryColumnId, isLast, wrapLines, }: TableGroupHeaderCellProps): JSX.Element;
|
|
18
|
+
//# sourceMappingURL=group-header-cell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"group-header-cell.d.ts","sourceRoot":"","sources":["../../../../src/table/header-cell/group-header-cell.tsx"],"names":[],"mappings":"AAQA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAK3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAKrD,MAAM,WAAW,yBAA0B,SAAQ,mBAAmB;IACpE,KAAK,EAAE,UAAU,CAAC,eAAe,CAAC;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IACnE,cAAc,EAAE,WAAW,EAAE,CAAC;IAC9B,kBAAkB,CAAC,EAAE,WAAW,CAAC;IACjC,iBAAiB,CAAC,EAAE,WAAW,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,WAAW,CAAC;IAC7B,sBAAsB,CAAC,EAAE,WAAW,CAAC;IACrC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,oBAAoB,CAAC,EACnC,KAAK,EACL,OAAO,EACP,OAAO,EACP,QAAQ,EACR,OAAO,EACP,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,QAAQ,EACR,MAAM,EACN,MAAM,EACN,WAAW,EACX,WAAW,EACX,OAAO,EACP,SAAS,EACT,sBAAsB,EACtB,kBAAkB,EAClB,OAAO,EACP,YAAY,EACZ,aAAa,EACb,cAAc,EACd,sBAAsB,EACtB,MAAM,EACN,SAAS,GACV,EAAE,yBAAyB,eAmF3B"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import React, { useRef } from 'react';
|
|
4
|
+
import clsx from 'clsx';
|
|
5
|
+
import { useSingleTabStopNavigation } from '@cloudscape-design/component-toolkit/internal';
|
|
6
|
+
import { useUniqueId } from '@cloudscape-design/component-toolkit/internal';
|
|
7
|
+
import { Divider, Resizer } from '../resizer';
|
|
8
|
+
import { useStickyCellStyles } from '../sticky-columns';
|
|
9
|
+
import { DEFAULT_COLUMN_WIDTH, useColumnWidths } from '../use-column-widths';
|
|
10
|
+
import { getStickyClassNames } from '../utils';
|
|
11
|
+
import { TableThElement } from './th-element';
|
|
12
|
+
import styles from './styles.css.js';
|
|
13
|
+
export function TableGroupHeaderCell({ group, colspan, rowspan, colIndex, groupId, resizableColumns, resizableStyle, onResizeFinish, updateGroupWidth, childColumnIds, focusedComponent, tabIndex, sticky, hidden, stripedRows, stickyState, cellRef, tableRole, resizerRoleDescription, resizerTooltipText, variant, tableVariant, columnGroupId, stickyColumnId, stickyBoundaryColumnId, isLast, wrapLines, }) {
|
|
14
|
+
var _a, _b;
|
|
15
|
+
const headerId = useUniqueId('table-group-header-');
|
|
16
|
+
const { columnWidths } = useColumnWidths();
|
|
17
|
+
// Effective min = sum of non-rightmost children's current widths (fixed) + rightmost child's minWidth
|
|
18
|
+
const lastChild = childColumnIds[childColumnIds.length - 1];
|
|
19
|
+
const groupMinWidth = childColumnIds.reduce((sum, id) => {
|
|
20
|
+
if (id === lastChild) {
|
|
21
|
+
return sum + DEFAULT_COLUMN_WIDTH;
|
|
22
|
+
}
|
|
23
|
+
return sum + (columnWidths.get(id) || DEFAULT_COLUMN_WIDTH);
|
|
24
|
+
}, 0);
|
|
25
|
+
const clickableHeaderRef = useRef(null);
|
|
26
|
+
const { tabIndex: clickableHeaderTabIndex } = useSingleTabStopNavigation(clickableHeaderRef, { tabIndex });
|
|
27
|
+
// Subscribe to the boundary column's sticky state to inherit shadow/clip-path classes.
|
|
28
|
+
// The offset/position comes from stickyColumnId (first child); this only adds boundary classes.
|
|
29
|
+
const boundaryStyles = useStickyCellStyles({
|
|
30
|
+
stickyColumns: stickyState,
|
|
31
|
+
columnId: (_a = stickyBoundaryColumnId !== null && stickyBoundaryColumnId !== void 0 ? stickyBoundaryColumnId : stickyColumnId) !== null && _a !== void 0 ? _a : groupId,
|
|
32
|
+
getClassName: props => getStickyClassNames(styles, props),
|
|
33
|
+
});
|
|
34
|
+
// boundaryStyles.className is populated by scroll/intersection observers in the browser.
|
|
35
|
+
// In JSDOM these observers don't fire, so this branch is only exercised in integration tests.
|
|
36
|
+
const boundaryClassName = stickyBoundaryColumnId && boundaryStyles.className ? boundaryStyles.className : undefined;
|
|
37
|
+
return (React.createElement(TableThElement, { resizableStyle: resizableStyle, cellRef: cellRef, focusedComponent: focusedComponent, sticky: sticky, resizable: resizableColumns, hidden: hidden, stripedRows: stripedRows, colIndex: colIndex, columnId: stickyColumnId !== null && stickyColumnId !== void 0 ? stickyColumnId : groupId, stickyState: stickyState, tableRole: tableRole, variant: variant, tableVariant: tableVariant, colSpan: colspan, rowSpan: rowspan, scope: "colgroup", isLast: isLast, columnGroupId: columnGroupId, className: boundaryClassName, boundaryRef: stickyBoundaryColumnId ? boundaryStyles.ref : undefined },
|
|
38
|
+
React.createElement("div", { ref: clickableHeaderRef, "data-focus-id": `group-header-${groupId}`, className: clsx(styles['header-cell-content'], {
|
|
39
|
+
[styles['header-cell-fake-focus']]: focusedComponent === `group-header-${groupId}`,
|
|
40
|
+
}), "aria-label": (_b = group.ariaLabel) === null || _b === void 0 ? void 0 : _b.call(group, { sorted: false, descending: false, disabled: true }), tabIndex: clickableHeaderTabIndex },
|
|
41
|
+
React.createElement("div", { className: clsx(styles['header-cell-text'], wrapLines && styles['header-cell-text-wrap']), id: headerId }, group.header)),
|
|
42
|
+
resizableColumns ? (React.createElement(Resizer, { tabIndex: tabIndex, focusId: `resize-group-${groupId}`, showFocusRing: focusedComponent === `resize-group-${groupId}`, onWidthUpdate: newWidth => updateGroupWidth(groupId, newWidth), onWidthUpdateCommit: onResizeFinish, ariaLabelledby: headerId, minWidth: groupMinWidth, roleDescription: resizerRoleDescription, tooltipText: resizerTooltipText, isBorderless: variant === 'full-page' || variant === 'embedded' || variant === 'borderless', isLast: isLast, dividerPosition: columnGroupId ? 'full' : 'bottom' })) : (React.createElement(Divider, { position: columnGroupId ? 'full' : 'bottom' }))));
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=group-header-cell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"group-header-cell.js","sourceRoot":"","sources":["../../../../src/table/header-cell/group-header-cell.tsx"],"names":[],"mappings":"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","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport React, { useRef } from 'react';\nimport clsx from 'clsx';\n\nimport { useSingleTabStopNavigation } from '@cloudscape-design/component-toolkit/internal';\nimport { useUniqueId } from '@cloudscape-design/component-toolkit/internal';\n\nimport { TableProps } from '../interfaces';\nimport { Divider, Resizer } from '../resizer';\nimport { useStickyCellStyles } from '../sticky-columns';\nimport { DEFAULT_COLUMN_WIDTH, useColumnWidths } from '../use-column-widths';\nimport { getStickyClassNames } from '../utils';\nimport { BaseHeaderCellProps } from './common-props';\nimport { TableThElement } from './th-element';\n\nimport styles from './styles.css.js';\n\nexport interface TableGroupHeaderCellProps extends BaseHeaderCellProps {\n group: TableProps.GroupDefinition;\n colspan: number;\n rowspan: number;\n groupId: string;\n updateGroupWidth: (groupId: PropertyKey, newWidth: number) => void;\n childColumnIds: PropertyKey[];\n firstChildColumnId?: PropertyKey;\n lastChildColumnId?: PropertyKey;\n columnGroupId?: string;\n stickyColumnId?: PropertyKey;\n stickyBoundaryColumnId?: PropertyKey;\n isLast?: boolean;\n}\n\nexport function TableGroupHeaderCell({\n group,\n colspan,\n rowspan,\n colIndex,\n groupId,\n resizableColumns,\n resizableStyle,\n onResizeFinish,\n updateGroupWidth,\n childColumnIds,\n focusedComponent,\n tabIndex,\n sticky,\n hidden,\n stripedRows,\n stickyState,\n cellRef,\n tableRole,\n resizerRoleDescription,\n resizerTooltipText,\n variant,\n tableVariant,\n columnGroupId,\n stickyColumnId,\n stickyBoundaryColumnId,\n isLast,\n wrapLines,\n}: TableGroupHeaderCellProps) {\n const headerId = useUniqueId('table-group-header-');\n const { columnWidths } = useColumnWidths();\n\n // Effective min = sum of non-rightmost children's current widths (fixed) + rightmost child's minWidth\n const lastChild = childColumnIds[childColumnIds.length - 1];\n const groupMinWidth = childColumnIds.reduce<number>((sum, id) => {\n if (id === lastChild) {\n return sum + DEFAULT_COLUMN_WIDTH;\n }\n return sum + (columnWidths.get(id) || DEFAULT_COLUMN_WIDTH);\n }, 0);\n const clickableHeaderRef = useRef<HTMLDivElement>(null);\n const { tabIndex: clickableHeaderTabIndex } = useSingleTabStopNavigation(clickableHeaderRef, { tabIndex });\n\n // Subscribe to the boundary column's sticky state to inherit shadow/clip-path classes.\n // The offset/position comes from stickyColumnId (first child); this only adds boundary classes.\n const boundaryStyles = useStickyCellStyles({\n stickyColumns: stickyState,\n columnId: stickyBoundaryColumnId ?? stickyColumnId ?? groupId,\n getClassName: props => getStickyClassNames(styles, props),\n });\n\n // boundaryStyles.className is populated by scroll/intersection observers in the browser.\n // In JSDOM these observers don't fire, so this branch is only exercised in integration tests.\n const boundaryClassName = stickyBoundaryColumnId && boundaryStyles.className ? boundaryStyles.className : undefined;\n\n return (\n <TableThElement\n resizableStyle={resizableStyle}\n cellRef={cellRef}\n focusedComponent={focusedComponent}\n sticky={sticky}\n resizable={resizableColumns}\n hidden={hidden}\n stripedRows={stripedRows}\n colIndex={colIndex}\n columnId={stickyColumnId ?? groupId}\n stickyState={stickyState}\n tableRole={tableRole}\n variant={variant}\n tableVariant={tableVariant}\n colSpan={colspan}\n rowSpan={rowspan}\n scope=\"colgroup\"\n isLast={isLast}\n columnGroupId={columnGroupId}\n className={boundaryClassName}\n boundaryRef={stickyBoundaryColumnId ? boundaryStyles.ref : undefined}\n >\n <div\n ref={clickableHeaderRef}\n data-focus-id={`group-header-${groupId}`}\n className={clsx(styles['header-cell-content'], {\n [styles['header-cell-fake-focus']]: focusedComponent === `group-header-${groupId}`,\n })}\n aria-label={group.ariaLabel?.({ sorted: false, descending: false, disabled: true })}\n tabIndex={clickableHeaderTabIndex}\n >\n <div className={clsx(styles['header-cell-text'], wrapLines && styles['header-cell-text-wrap'])} id={headerId}>\n {group.header}\n </div>\n </div>\n {resizableColumns ? (\n <Resizer\n tabIndex={tabIndex}\n focusId={`resize-group-${groupId}`}\n showFocusRing={focusedComponent === `resize-group-${groupId}`}\n onWidthUpdate={newWidth => updateGroupWidth(groupId, newWidth)}\n onWidthUpdateCommit={onResizeFinish}\n ariaLabelledby={headerId}\n minWidth={groupMinWidth}\n roleDescription={resizerRoleDescription}\n tooltipText={resizerTooltipText}\n isBorderless={variant === 'full-page' || variant === 'embedded' || variant === 'borderless'}\n isLast={isLast}\n dividerPosition={columnGroupId ? 'full' : 'bottom'}\n />\n ) : (\n <Divider position={columnGroupId ? 'full' : 'bottom'} />\n )}\n </TableThElement>\n );\n}\n"]}
|
|
@@ -1,37 +1,22 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { ColumnWidthStyle } from '../column-widths-utils';
|
|
3
1
|
import { TableProps } from '../interfaces';
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
export interface TableHeaderCellProps<ItemType> {
|
|
7
|
-
tabIndex: number;
|
|
2
|
+
import { BaseHeaderCellProps } from './common-props';
|
|
3
|
+
export interface TableHeaderCellProps<ItemType> extends BaseHeaderCellProps {
|
|
8
4
|
column: TableProps.ColumnDefinition<ItemType>;
|
|
9
5
|
activeSortingColumn?: TableProps.SortingColumn<ItemType>;
|
|
10
6
|
sortingDescending?: boolean;
|
|
11
7
|
sortingDisabled?: boolean;
|
|
12
|
-
wrapLines?: boolean;
|
|
13
8
|
stuck?: boolean;
|
|
14
|
-
sticky?: boolean;
|
|
15
|
-
hidden?: boolean;
|
|
16
|
-
stripedRows?: boolean;
|
|
17
9
|
onClick(detail: TableProps.SortingState<any>): void;
|
|
18
|
-
onResizeFinish: () => void;
|
|
19
|
-
colIndex: number;
|
|
20
10
|
updateColumn: (columnId: PropertyKey, newWidth: number) => void;
|
|
21
|
-
resizableColumns?: boolean;
|
|
22
|
-
resizableStyle?: ColumnWidthStyle;
|
|
23
11
|
isEditable?: boolean;
|
|
24
12
|
columnId: PropertyKey;
|
|
25
|
-
stickyState: StickyColumnsModel;
|
|
26
|
-
cellRef: React.RefCallback<HTMLElement>;
|
|
27
|
-
focusedComponent?: null | string;
|
|
28
|
-
tableRole: TableRole;
|
|
29
|
-
resizerRoleDescription?: string;
|
|
30
|
-
resizerTooltipText?: string;
|
|
31
13
|
isExpandable?: boolean;
|
|
32
14
|
hasDynamicContent?: boolean;
|
|
33
|
-
|
|
34
|
-
|
|
15
|
+
colSpan?: number;
|
|
16
|
+
rowSpan?: number;
|
|
17
|
+
columnGroupId?: string;
|
|
18
|
+
isLastChildOfGroup?: boolean;
|
|
19
|
+
isLast?: boolean;
|
|
35
20
|
}
|
|
36
|
-
export declare function TableHeaderCell<ItemType>({ tabIndex, column, activeSortingColumn, sortingDescending, sortingDisabled, wrapLines, focusedComponent, stuck, sticky, hidden, stripedRows, onClick, colIndex, updateColumn, resizableColumns, resizableStyle, onResizeFinish, isEditable, columnId, stickyState, cellRef, tableRole, resizerRoleDescription, resizerTooltipText, isExpandable, hasDynamicContent, variant, tableVariant, }: TableHeaderCellProps<ItemType>): JSX.Element;
|
|
21
|
+
export declare function TableHeaderCell<ItemType>({ tabIndex, column, activeSortingColumn, sortingDescending, sortingDisabled, wrapLines, focusedComponent, stuck, sticky, hidden, stripedRows, onClick, colIndex, updateColumn, resizableColumns, resizableStyle, onResizeFinish, isEditable, columnId, stickyState, cellRef, tableRole, resizerRoleDescription, resizerTooltipText, isExpandable, hasDynamicContent, variant, colSpan, rowSpan, columnGroupId, isLastChildOfGroup, isLast, tableVariant, }: TableHeaderCellProps<ItemType>): JSX.Element;
|
|
37
22
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/table/header-cell/index.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/table/header-cell/index.tsx"],"names":[],"mappings":"AAaA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAOrD,MAAM,WAAW,oBAAoB,CAAC,QAAQ,CAAE,SAAQ,mBAAmB;IACzE,MAAM,EAAE,UAAU,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC9C,mBAAmB,CAAC,EAAE,UAAU,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACzD,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IACpD,YAAY,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,WAAW,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,EACxC,QAAQ,EACR,MAAM,EACN,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,SAAS,EACT,gBAAgB,EAChB,KAAK,EACL,MAAM,EACN,MAAM,EACN,WAAW,EACX,OAAO,EACP,QAAQ,EACR,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,cAAc,EACd,UAAU,EACV,QAAQ,EACR,WAAW,EACX,OAAO,EACP,SAAS,EACT,sBAAsB,EACtB,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,EACjB,OAAO,EACP,OAAO,EACP,OAAO,EACP,aAAa,EACb,kBAAkB,EAClB,MAAM,EACN,YAAY,GACb,EAAE,oBAAoB,CAAC,QAAQ,CAAC,eAgJhC"}
|
|
@@ -13,7 +13,7 @@ import { TableThElement } from './th-element';
|
|
|
13
13
|
import { getSortingIconName, getSortingStatus, isSorted } from './utils';
|
|
14
14
|
import analyticsSelectors from '../analytics-metadata/styles.css.js';
|
|
15
15
|
import styles from './styles.css.js';
|
|
16
|
-
export function TableHeaderCell({ tabIndex, column, activeSortingColumn, sortingDescending, sortingDisabled, wrapLines, focusedComponent, stuck, sticky, hidden, stripedRows, onClick, colIndex, updateColumn, resizableColumns, resizableStyle, onResizeFinish, isEditable, columnId, stickyState, cellRef, tableRole, resizerRoleDescription, resizerTooltipText, isExpandable, hasDynamicContent, variant, tableVariant, }) {
|
|
16
|
+
export function TableHeaderCell({ tabIndex, column, activeSortingColumn, sortingDescending, sortingDisabled, wrapLines, focusedComponent, stuck, sticky, hidden, stripedRows, onClick, colIndex, updateColumn, resizableColumns, resizableStyle, onResizeFinish, isEditable, columnId, stickyState, cellRef, tableRole, resizerRoleDescription, resizerTooltipText, isExpandable, hasDynamicContent, variant, colSpan, rowSpan, columnGroupId, isLastChildOfGroup, isLast, tableVariant, }) {
|
|
17
17
|
var _a;
|
|
18
18
|
const i18n = useInternalI18n('table');
|
|
19
19
|
const sortable = !!column.sortingComparator || !!column.sortingField;
|
|
@@ -46,7 +46,7 @@ export function TableHeaderCell({ tabIndex, column, activeSortingColumn, sorting
|
|
|
46
46
|
useResizeObserver(hasDynamicContent ? cellRefObject : () => null, entry => {
|
|
47
47
|
updateColumn(columnId, entry.borderBoxWidth);
|
|
48
48
|
});
|
|
49
|
-
return (React.createElement(TableThElement, { resizableStyle: resizableStyle, cellRef: cellRefCombined, sortingStatus: sortingStatus, sortingDisabled: sortingDisabled, focusedComponent: focusedComponent, stuck: stuck, sticky: sticky, resizable: resizableColumns, hidden: hidden, stripedRows: stripedRows, colIndex: colIndex, columnId: columnId, stickyState: stickyState, tableRole: tableRole, variant: variant, tableVariant: tableVariant, ...(sortingDisabled
|
|
49
|
+
return (React.createElement(TableThElement, { resizableStyle: resizableStyle, cellRef: cellRefCombined, sortingStatus: sortingStatus, sortingDisabled: sortingDisabled, focusedComponent: focusedComponent, stuck: stuck, sticky: sticky, resizable: resizableColumns, hidden: hidden, stripedRows: stripedRows, colIndex: colIndex, columnId: columnId, stickyState: stickyState, tableRole: tableRole, variant: variant, tableVariant: tableVariant, colSpan: colSpan, rowSpan: rowSpan, columnGroupId: columnGroupId, isLast: isLast, ...(sortingDisabled
|
|
50
50
|
? {}
|
|
51
51
|
: getAnalyticsMetadataAttribute({
|
|
52
52
|
action: 'sort',
|
|
@@ -83,6 +83,6 @@ export function TableHeaderCell({ tabIndex, column, activeSortingColumn, sorting
|
|
|
83
83
|
resizableColumns ? (React.createElement(Resizer, { tabIndex: tabIndex, focusId: `resize-control-${String(columnId)}`, showFocusRing: focusedComponent === `resize-control-${String(columnId)}`, onWidthUpdate: newWidth => updateColumn(columnId, newWidth), onWidthUpdateCommit: onResizeFinish, ariaLabelledby: headerId, minWidth: typeof column.minWidth === 'string' ? parseInt(column.minWidth) : column.minWidth, roleDescription: i18n('ariaLabels.resizerRoleDescription', resizerRoleDescription),
|
|
84
84
|
// TODO: Replace with this when strings are available
|
|
85
85
|
// tooltipText={i18n('ariaLabels.resizerTooltipText', resizerTooltipText)}
|
|
86
|
-
tooltipText: resizerTooltipText, isBorderless: variant === 'full-page' || variant === 'embedded' || variant === 'borderless' })) : (React.createElement(Divider, { className: styles['resize-divider'] }))));
|
|
86
|
+
tooltipText: resizerTooltipText, isBorderless: variant === 'full-page' || variant === 'embedded' || variant === 'borderless', isLast: isLast, dividerPosition: isLastChildOfGroup ? 'top' : undefined })) : (React.createElement(Divider, { className: styles['resize-divider'], position: isLastChildOfGroup ? 'top' : undefined }))));
|
|
87
87
|
}
|
|
88
88
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/table/header-cell/index.tsx"],"names":[],"mappings":"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","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport React, { useRef } from 'react';\nimport clsx from 'clsx';\n\nimport { useMergeRefs, useResizeObserver, useUniqueId } from '@cloudscape-design/component-toolkit/internal';\nimport { useSingleTabStopNavigation } from '@cloudscape-design/component-toolkit/internal';\nimport { getAnalyticsMetadataAttribute } from '@cloudscape-design/component-toolkit/internal/analytics-metadata';\n\nimport { useInternalI18n } from '../../i18n/context';\nimport InternalIcon from '../../icon/internal';\nimport { KeyCode } from '../../internal/keycode';\nimport { GeneratedAnalyticsMetadataTableSort } from '../analytics-metadata/interfaces';\nimport { ColumnWidthStyle } from '../column-widths-utils';\nimport { TableProps } from '../interfaces';\nimport { Divider, Resizer } from '../resizer';\nimport { StickyColumnsModel } from '../sticky-columns';\nimport { TableRole } from '../table-role';\nimport { TableThElement } from './th-element';\nimport { getSortingIconName, getSortingStatus, isSorted } from './utils';\n\nimport analyticsSelectors from '../analytics-metadata/styles.css.js';\nimport styles from './styles.css.js';\n\nexport interface TableHeaderCellProps<ItemType> {\n tabIndex: number;\n column: TableProps.ColumnDefinition<ItemType>;\n activeSortingColumn?: TableProps.SortingColumn<ItemType>;\n sortingDescending?: boolean;\n sortingDisabled?: boolean;\n wrapLines?: boolean;\n stuck?: boolean;\n sticky?: boolean;\n hidden?: boolean;\n stripedRows?: boolean;\n onClick(detail: TableProps.SortingState<any>): void;\n onResizeFinish: () => void;\n colIndex: number;\n updateColumn: (columnId: PropertyKey, newWidth: number) => void;\n resizableColumns?: boolean;\n resizableStyle?: ColumnWidthStyle;\n isEditable?: boolean;\n columnId: PropertyKey;\n stickyState: StickyColumnsModel;\n cellRef: React.RefCallback<HTMLElement>;\n focusedComponent?: null | string;\n tableRole: TableRole;\n resizerRoleDescription?: string;\n resizerTooltipText?: string;\n isExpandable?: boolean;\n hasDynamicContent?: boolean;\n variant: TableProps.Variant;\n tableVariant?: TableProps.Variant;\n}\n\nexport function TableHeaderCell<ItemType>({\n tabIndex,\n column,\n activeSortingColumn,\n sortingDescending,\n sortingDisabled,\n wrapLines,\n focusedComponent,\n stuck,\n sticky,\n hidden,\n stripedRows,\n onClick,\n colIndex,\n updateColumn,\n resizableColumns,\n resizableStyle,\n onResizeFinish,\n isEditable,\n columnId,\n stickyState,\n cellRef,\n tableRole,\n resizerRoleDescription,\n resizerTooltipText,\n isExpandable,\n hasDynamicContent,\n variant,\n tableVariant,\n}: TableHeaderCellProps<ItemType>) {\n const i18n = useInternalI18n('table');\n const sortable = !!column.sortingComparator || !!column.sortingField;\n const sorted = !!activeSortingColumn && isSorted(column, activeSortingColumn);\n const sortingStatus = getSortingStatus(sortable, sorted, !!sortingDescending, !!sortingDisabled);\n const handleClick = () =>\n onClick({\n sortingColumn: column,\n isDescending: sorted ? !sortingDescending : false,\n });\n\n // Elements with role=\"button\" do not have the default behavior of <button>, where pressing\n // Enter or Space will trigger a click event. Therefore we need to add this ourselves.\n // The native <button> element cannot be used due to a misaligned implementation in Firefox:\n // https://bugzilla.mozilla.org/show_bug.cgi?id=843003\n const handleKeyPress = ({ nativeEvent: e }: React.KeyboardEvent) => {\n if (e.keyCode === KeyCode.enter || e.keyCode === KeyCode.space) {\n e.preventDefault();\n handleClick();\n }\n };\n\n const headerId = useUniqueId('table-header-');\n\n const clickableHeaderRef = useRef<HTMLDivElement>(null);\n const { tabIndex: clickableHeaderTabIndex } = useSingleTabStopNavigation(clickableHeaderRef, { tabIndex });\n\n const cellRefObject = useRef<HTMLElement>(null);\n const cellRefCombined = useMergeRefs(cellRef, cellRefObject);\n\n // Keep sticky and non-sticky headers in sync for dynamic cell\n // content changes. This is only needed when:\n // - Column has dynamic content\n // - This is the non-sticky version of a sticky header (hidden === true)\n // - Columns are not resizable\n useResizeObserver(hasDynamicContent ? cellRefObject : () => null, entry => {\n updateColumn(columnId, entry.borderBoxWidth);\n });\n\n return (\n <TableThElement\n resizableStyle={resizableStyle}\n cellRef={cellRefCombined}\n sortingStatus={sortingStatus}\n sortingDisabled={sortingDisabled}\n focusedComponent={focusedComponent}\n stuck={stuck}\n sticky={sticky}\n resizable={resizableColumns}\n hidden={hidden}\n stripedRows={stripedRows}\n colIndex={colIndex}\n columnId={columnId}\n stickyState={stickyState}\n tableRole={tableRole}\n variant={variant}\n tableVariant={tableVariant}\n {...(sortingDisabled\n ? {}\n : getAnalyticsMetadataAttribute({\n action: 'sort',\n detail: {\n position: `${colIndex + 1}`,\n columnId: column.id ? `${column.id}` : '',\n label: `.${analyticsSelectors['header-cell-text']}`,\n sortingDescending: `${!sortingDescending}`,\n },\n } as GeneratedAnalyticsMetadataTableSort))}\n >\n <div\n ref={clickableHeaderRef}\n data-focus-id={`sorting-control-${String(columnId)}`}\n className={clsx(styles['header-cell-content'], {\n [styles['header-cell-fake-focus']]: focusedComponent === `sorting-control-${String(columnId)}`,\n [styles['header-cell-content-expandable']]: isExpandable,\n })}\n aria-label={\n column.ariaLabel\n ? column.ariaLabel({\n sorted: sorted,\n descending: sorted && !!sortingDescending,\n disabled: !!sortingDisabled,\n })\n : undefined\n }\n {...(sortingStatus && !sortingDisabled\n ? {\n onKeyPress: handleKeyPress,\n tabIndex: clickableHeaderTabIndex,\n role: 'button',\n onClick: handleClick,\n }\n : {})}\n >\n <div\n className={clsx(\n styles['header-cell-text'],\n analyticsSelectors['header-cell-text'],\n wrapLines && styles['header-cell-text-wrap']\n )}\n id={headerId}\n >\n {column.header}\n {isEditable ? (\n <span className={styles['edit-icon']}>\n <InternalIcon\n name=\"edit\"\n ariaLabel={i18n('columnDefinitions.editConfig.editIconAriaLabel', column.editConfig?.editIconAriaLabel)}\n />\n </span>\n ) : null}\n </div>\n {sortingStatus && (\n <span className={styles['sorting-icon']}>\n <InternalIcon name={getSortingIconName(sortingStatus)} />\n </span>\n )}\n </div>\n {resizableColumns ? (\n <Resizer\n tabIndex={tabIndex}\n focusId={`resize-control-${String(columnId)}`}\n showFocusRing={focusedComponent === `resize-control-${String(columnId)}`}\n onWidthUpdate={newWidth => updateColumn(columnId, newWidth)}\n onWidthUpdateCommit={onResizeFinish}\n ariaLabelledby={headerId}\n minWidth={typeof column.minWidth === 'string' ? parseInt(column.minWidth) : column.minWidth}\n roleDescription={i18n('ariaLabels.resizerRoleDescription', resizerRoleDescription)}\n // TODO: Replace with this when strings are available\n // tooltipText={i18n('ariaLabels.resizerTooltipText', resizerTooltipText)}\n tooltipText={resizerTooltipText}\n isBorderless={variant === 'full-page' || variant === 'embedded' || variant === 'borderless'}\n />\n ) : (\n <Divider className={styles['resize-divider']} />\n )}\n </TableThElement>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/table/header-cell/index.tsx"],"names":[],"mappings":"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","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport React, { useRef } from 'react';\nimport clsx from 'clsx';\n\nimport { useMergeRefs, useResizeObserver, useUniqueId } from '@cloudscape-design/component-toolkit/internal';\nimport { useSingleTabStopNavigation } from '@cloudscape-design/component-toolkit/internal';\nimport { getAnalyticsMetadataAttribute } from '@cloudscape-design/component-toolkit/internal/analytics-metadata';\n\nimport { useInternalI18n } from '../../i18n/context';\nimport InternalIcon from '../../icon/internal';\nimport { KeyCode } from '../../internal/keycode';\nimport { GeneratedAnalyticsMetadataTableSort } from '../analytics-metadata/interfaces';\nimport { TableProps } from '../interfaces';\nimport { Divider, Resizer } from '../resizer';\nimport { BaseHeaderCellProps } from './common-props';\nimport { TableThElement } from './th-element';\nimport { getSortingIconName, getSortingStatus, isSorted } from './utils';\n\nimport analyticsSelectors from '../analytics-metadata/styles.css.js';\nimport styles from './styles.css.js';\n\nexport interface TableHeaderCellProps<ItemType> extends BaseHeaderCellProps {\n column: TableProps.ColumnDefinition<ItemType>;\n activeSortingColumn?: TableProps.SortingColumn<ItemType>;\n sortingDescending?: boolean;\n sortingDisabled?: boolean;\n stuck?: boolean;\n onClick(detail: TableProps.SortingState<any>): void;\n updateColumn: (columnId: PropertyKey, newWidth: number) => void;\n isEditable?: boolean;\n columnId: PropertyKey;\n isExpandable?: boolean;\n hasDynamicContent?: boolean;\n colSpan?: number;\n rowSpan?: number;\n columnGroupId?: string;\n isLastChildOfGroup?: boolean;\n isLast?: boolean;\n}\n\nexport function TableHeaderCell<ItemType>({\n tabIndex,\n column,\n activeSortingColumn,\n sortingDescending,\n sortingDisabled,\n wrapLines,\n focusedComponent,\n stuck,\n sticky,\n hidden,\n stripedRows,\n onClick,\n colIndex,\n updateColumn,\n resizableColumns,\n resizableStyle,\n onResizeFinish,\n isEditable,\n columnId,\n stickyState,\n cellRef,\n tableRole,\n resizerRoleDescription,\n resizerTooltipText,\n isExpandable,\n hasDynamicContent,\n variant,\n colSpan,\n rowSpan,\n columnGroupId,\n isLastChildOfGroup,\n isLast,\n tableVariant,\n}: TableHeaderCellProps<ItemType>) {\n const i18n = useInternalI18n('table');\n const sortable = !!column.sortingComparator || !!column.sortingField;\n const sorted = !!activeSortingColumn && isSorted(column, activeSortingColumn);\n const sortingStatus = getSortingStatus(sortable, sorted, !!sortingDescending, !!sortingDisabled);\n const handleClick = () =>\n onClick({\n sortingColumn: column,\n isDescending: sorted ? !sortingDescending : false,\n });\n\n // Elements with role=\"button\" do not have the default behavior of <button>, where pressing\n // Enter or Space will trigger a click event. Therefore we need to add this ourselves.\n // The native <button> element cannot be used due to a misaligned implementation in Firefox:\n // https://bugzilla.mozilla.org/show_bug.cgi?id=843003\n const handleKeyPress = ({ nativeEvent: e }: React.KeyboardEvent) => {\n if (e.keyCode === KeyCode.enter || e.keyCode === KeyCode.space) {\n e.preventDefault();\n handleClick();\n }\n };\n\n const headerId = useUniqueId('table-header-');\n\n const clickableHeaderRef = useRef<HTMLDivElement>(null);\n const { tabIndex: clickableHeaderTabIndex } = useSingleTabStopNavigation(clickableHeaderRef, { tabIndex });\n\n const cellRefObject = useRef<HTMLElement>(null);\n const cellRefCombined = useMergeRefs(cellRef, cellRefObject);\n\n // Keep sticky and non-sticky headers in sync for dynamic cell\n // content changes. This is only needed when:\n // - Column has dynamic content\n // - This is the non-sticky version of a sticky header (hidden === true)\n // - Columns are not resizable\n useResizeObserver(hasDynamicContent ? cellRefObject : () => null, entry => {\n updateColumn(columnId, entry.borderBoxWidth);\n });\n\n return (\n <TableThElement\n resizableStyle={resizableStyle}\n cellRef={cellRefCombined}\n sortingStatus={sortingStatus}\n sortingDisabled={sortingDisabled}\n focusedComponent={focusedComponent}\n stuck={stuck}\n sticky={sticky}\n resizable={resizableColumns}\n hidden={hidden}\n stripedRows={stripedRows}\n colIndex={colIndex}\n columnId={columnId}\n stickyState={stickyState}\n tableRole={tableRole}\n variant={variant}\n tableVariant={tableVariant}\n colSpan={colSpan}\n rowSpan={rowSpan}\n columnGroupId={columnGroupId}\n isLast={isLast}\n {...(sortingDisabled\n ? {}\n : getAnalyticsMetadataAttribute({\n action: 'sort',\n detail: {\n position: `${colIndex + 1}`,\n columnId: column.id ? `${column.id}` : '',\n label: `.${analyticsSelectors['header-cell-text']}`,\n sortingDescending: `${!sortingDescending}`,\n },\n } as GeneratedAnalyticsMetadataTableSort))}\n >\n <div\n ref={clickableHeaderRef}\n data-focus-id={`sorting-control-${String(columnId)}`}\n className={clsx(styles['header-cell-content'], {\n [styles['header-cell-fake-focus']]: focusedComponent === `sorting-control-${String(columnId)}`,\n [styles['header-cell-content-expandable']]: isExpandable,\n })}\n aria-label={\n column.ariaLabel\n ? column.ariaLabel({\n sorted: sorted,\n descending: sorted && !!sortingDescending,\n disabled: !!sortingDisabled,\n })\n : undefined\n }\n {...(sortingStatus && !sortingDisabled\n ? {\n onKeyPress: handleKeyPress,\n tabIndex: clickableHeaderTabIndex,\n role: 'button',\n onClick: handleClick,\n }\n : {})}\n >\n <div\n className={clsx(\n styles['header-cell-text'],\n analyticsSelectors['header-cell-text'],\n wrapLines && styles['header-cell-text-wrap']\n )}\n id={headerId}\n >\n {column.header}\n {isEditable ? (\n <span className={styles['edit-icon']}>\n <InternalIcon\n name=\"edit\"\n ariaLabel={i18n('columnDefinitions.editConfig.editIconAriaLabel', column.editConfig?.editIconAriaLabel)}\n />\n </span>\n ) : null}\n </div>\n {sortingStatus && (\n <span className={styles['sorting-icon']}>\n <InternalIcon name={getSortingIconName(sortingStatus)} />\n </span>\n )}\n </div>\n {resizableColumns ? (\n <Resizer\n tabIndex={tabIndex}\n focusId={`resize-control-${String(columnId)}`}\n showFocusRing={focusedComponent === `resize-control-${String(columnId)}`}\n onWidthUpdate={newWidth => updateColumn(columnId, newWidth)}\n onWidthUpdateCommit={onResizeFinish}\n ariaLabelledby={headerId}\n minWidth={typeof column.minWidth === 'string' ? parseInt(column.minWidth) : column.minWidth}\n roleDescription={i18n('ariaLabels.resizerRoleDescription', resizerRoleDescription)}\n // TODO: Replace with this when strings are available\n // tooltipText={i18n('ariaLabels.resizerTooltipText', resizerTooltipText)}\n tooltipText={resizerTooltipText}\n isBorderless={variant === 'full-page' || variant === 'embedded' || variant === 'borderless'}\n isLast={isLast}\n dividerPosition={isLastChildOfGroup ? 'top' : undefined}\n />\n ) : (\n <Divider className={styles['resize-divider']} position={isLastChildOfGroup ? 'top' : undefined} />\n )}\n </TableThElement>\n );\n}\n"]}
|
|
@@ -1,35 +1,38 @@
|
|
|
1
1
|
|
|
2
2
|
import './styles.scoped.css';
|
|
3
3
|
export default {
|
|
4
|
-
"header-cell": "awsui_header-
|
|
5
|
-
"header-cell-fake-focus": "awsui_header-cell-fake-
|
|
6
|
-
"header-cell-
|
|
7
|
-
"header-cell-
|
|
8
|
-
"header-cell-
|
|
9
|
-
"header-cell-
|
|
10
|
-
"header-cell-
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
"header-cell-variant-
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
-
"
|
|
17
|
-
"
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"header-cell-
|
|
27
|
-
"header-cell-
|
|
28
|
-
"header-cell-
|
|
29
|
-
"header-cell-
|
|
30
|
-
"header-cell-
|
|
31
|
-
"
|
|
32
|
-
"
|
|
33
|
-
"header-cell-
|
|
4
|
+
"header-cell": "awsui_header-cell_1spae_1map5_149",
|
|
5
|
+
"header-cell-fake-focus": "awsui_header-cell-fake-focus_1spae_1map5_183",
|
|
6
|
+
"header-cell-group": "awsui_header-cell-group_1spae_1map5_204",
|
|
7
|
+
"header-cell-grouped": "awsui_header-cell-grouped_1spae_1map5_204",
|
|
8
|
+
"header-cell-spans-rows": "awsui_header-cell-spans-rows_1spae_1map5_204",
|
|
9
|
+
"header-cell-sticky": "awsui_header-cell-sticky_1spae_1map5_208",
|
|
10
|
+
"header-cell-stuck": "awsui_header-cell-stuck_1spae_1map5_211",
|
|
11
|
+
"header-cell-variant-full-page": "awsui_header-cell-variant-full-page_1spae_1map5_211",
|
|
12
|
+
"header-cell-hidden": "awsui_header-cell-hidden_1spae_1map5_217",
|
|
13
|
+
"header-cell-variant-embedded": "awsui_header-cell-variant-embedded_1spae_1map5_220",
|
|
14
|
+
"is-visual-refresh": "awsui_is-visual-refresh_1spae_1map5_220",
|
|
15
|
+
"sticky-cell": "awsui_sticky-cell_1spae_1map5_220",
|
|
16
|
+
"header-cell-variant-borderless": "awsui_header-cell-variant-borderless_1spae_1map5_220",
|
|
17
|
+
"header-cell-sortable": "awsui_header-cell-sortable_1spae_1map5_223",
|
|
18
|
+
"table-variant-full-page": "awsui_table-variant-full-page_1spae_1map5_244",
|
|
19
|
+
"sticky-cell-pad-left": "awsui_sticky-cell-pad-left_1spae_1map5_247",
|
|
20
|
+
"has-selection": "awsui_has-selection_1spae_1map5_247",
|
|
21
|
+
"sticky-cell-last-inline-start": "awsui_sticky-cell-last-inline-start_1spae_1map5_250",
|
|
22
|
+
"resize-divider": "awsui_resize-divider_1spae_1map5_255",
|
|
23
|
+
"sticky-cell-last-inline-end": "awsui_sticky-cell-last-inline-end_1spae_1map5_262",
|
|
24
|
+
"sorting-icon": "awsui_sorting-icon_1spae_1map5_272",
|
|
25
|
+
"edit-icon": "awsui_edit-icon_1spae_1map5_280",
|
|
26
|
+
"header-cell-content": "awsui_header-cell-content_1spae_1map5_286",
|
|
27
|
+
"header-cell-content-expandable": "awsui_header-cell-content-expandable_1spae_1map5_292",
|
|
28
|
+
"header-cell-disabled": "awsui_header-cell-disabled_1spae_1map5_347",
|
|
29
|
+
"header-cell-sorted": "awsui_header-cell-sorted_1spae_1map5_347",
|
|
30
|
+
"header-cell-text": "awsui_header-cell-text_1spae_1map5_378",
|
|
31
|
+
"header-cell-text-wrap": "awsui_header-cell-text-wrap_1spae_1map5_382",
|
|
32
|
+
"header-cell-ascending": "awsui_header-cell-ascending_1spae_1map5_388",
|
|
33
|
+
"header-cell-descending": "awsui_header-cell-descending_1spae_1map5_389",
|
|
34
|
+
"has-striped-rows": "awsui_has-striped-rows_1spae_1map5_503",
|
|
35
|
+
"sticky-cell-pad-inline-start": "awsui_sticky-cell-pad-inline-start_1spae_1map5_503",
|
|
36
|
+
"header-cell-resizable": "awsui_header-cell-resizable_1spae_1map5_515"
|
|
34
37
|
};
|
|
35
38
|
|