@hashicorp/design-system-components 4.19.0 → 4.20.0-rc-20250515135959
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/declarations/components/hds/advanced-table/index.d.ts +2 -0
- package/declarations/components/hds/app-header/index.d.ts +0 -1
- package/declarations/components/hds/app-side-nav/index.d.ts +4 -2
- package/declarations/components/hds/code-block/index.d.ts +6 -39
- package/declarations/utils/hds-breakpoints.d.ts +27 -0
- package/dist/components/hds/advanced-table/index.js +13 -6
- package/dist/components/hds/advanced-table/index.js.map +1 -1
- package/dist/components/hds/app-header/index.js +4 -2
- package/dist/components/hds/app-header/index.js.map +1 -1
- package/dist/components/hds/app-side-nav/index.js +31 -23
- package/dist/components/hds/app-side-nav/index.js.map +1 -1
- package/dist/components/hds/app-side-nav/portal/target.js +1 -1
- package/dist/components/hds/code-block/index.js +56 -41
- package/dist/components/hds/code-block/index.js.map +1 -1
- package/dist/components/hds/form/label/index.js +1 -1
- package/dist/styles/@hashicorp/design-system-components.css +108 -22
- package/dist/styles/components/advanced-table.scss +2 -0
- package/dist/styles/components/app-side-nav/main.scss +1 -6
- package/dist/styles/components/app-side-nav/vars.scss +0 -2
- package/dist/styles/components/code-block/index.scss +96 -11
- package/dist/styles/components/pagination.scss +5 -9
- package/dist/styles/components/side-nav/vars.scss +3 -1
- package/dist/styles/components/stepper/nav.scss +2 -1
- package/dist/styles/mixins/_breakpoints.scss +97 -0
- package/dist/utils/hds-breakpoints.js +33 -0
- package/dist/utils/hds-breakpoints.js.map +1 -0
- package/package.json +1 -1
|
@@ -36,6 +36,7 @@ export interface HdsAdvancedTableSignature {
|
|
|
36
36
|
hasStickyHeader?: boolean;
|
|
37
37
|
hasStickyFirstColumn?: boolean;
|
|
38
38
|
childrenKey?: string;
|
|
39
|
+
maxHeight?: string;
|
|
39
40
|
};
|
|
40
41
|
Blocks: {
|
|
41
42
|
body?: [
|
|
@@ -87,6 +88,7 @@ export default class HdsAdvancedTable extends Component<HdsAdvancedTableSignatur
|
|
|
87
88
|
get isSelectable(): boolean;
|
|
88
89
|
get isStriped(): boolean;
|
|
89
90
|
get density(): HdsAdvancedTableDensities;
|
|
91
|
+
get hasStickyHeader(): boolean;
|
|
90
92
|
get valign(): HdsAdvancedTableVerticalAlignment;
|
|
91
93
|
get gridTemplateColumns(): string;
|
|
92
94
|
get classNames(): string;
|
|
@@ -29,7 +29,6 @@ export default class HdsAppHeader extends Component<HdsAppHeaderSignature> {
|
|
|
29
29
|
hasA11yRefocus: boolean;
|
|
30
30
|
a11yRefocusSkipTo: string;
|
|
31
31
|
private _menuContentId;
|
|
32
|
-
private _breakpoint;
|
|
33
32
|
private _desktopMQVal;
|
|
34
33
|
constructor(owner: Owner, args: Record<string, never>);
|
|
35
34
|
addEventListeners(): void;
|
|
@@ -9,6 +9,7 @@ export interface HdsAppSideNavSignature {
|
|
|
9
9
|
isResponsive?: boolean;
|
|
10
10
|
isCollapsible?: boolean;
|
|
11
11
|
isMinimized?: boolean;
|
|
12
|
+
breakpoint?: string;
|
|
12
13
|
onToggleMinimizedStatus?: (arg: boolean) => void;
|
|
13
14
|
onDesktopViewportChange?: (arg: boolean) => void;
|
|
14
15
|
};
|
|
@@ -24,9 +25,11 @@ export default class HdsAppSideNav extends Component<HdsAppSideNavSignature> {
|
|
|
24
25
|
private _body;
|
|
25
26
|
private _bodyInitialOverflowValue;
|
|
26
27
|
private _desktopMQ;
|
|
27
|
-
private
|
|
28
|
+
private _navWrapperBody;
|
|
28
29
|
private _desktopMQVal;
|
|
29
30
|
constructor(owner: Owner, args: HdsAppSideNavSignature['Args']);
|
|
31
|
+
private _setUpBodyElement;
|
|
32
|
+
private _setUpNavWrapperBody;
|
|
30
33
|
addEventListeners(): void;
|
|
31
34
|
removeEventListeners(): void;
|
|
32
35
|
get isResponsive(): boolean;
|
|
@@ -39,7 +42,6 @@ export default class HdsAppSideNav extends Component<HdsAppSideNavSignature> {
|
|
|
39
42
|
unlockBodyScroll(): void;
|
|
40
43
|
escapePress(event: KeyboardEvent): void;
|
|
41
44
|
toggleMinimizedStatus(): void;
|
|
42
|
-
didInsert(element: HTMLElement): void;
|
|
43
45
|
setTransition(phase: string, event: TransitionEvent): void;
|
|
44
46
|
updateDesktopVariable(event: MediaQueryListEvent): void;
|
|
45
47
|
}
|
|
@@ -47,52 +47,19 @@ export interface HdsCodeBlockSignature {
|
|
|
47
47
|
}
|
|
48
48
|
export default class HdsCodeBlock extends Component<HdsCodeBlockSignature> {
|
|
49
49
|
private _prismCode;
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
* @param _preCodeId
|
|
54
|
-
*/
|
|
50
|
+
private _isExpanded;
|
|
51
|
+
private _codeContentHeight;
|
|
52
|
+
private _codeContainerHeight;
|
|
55
53
|
private _preCodeId;
|
|
56
|
-
/**
|
|
57
|
-
* @param code
|
|
58
|
-
* @type {string}
|
|
59
|
-
* @description code text content for the CodeBlock
|
|
60
|
-
*/
|
|
61
54
|
get code(): string;
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
* @type {string}
|
|
65
|
-
* @default undefined
|
|
66
|
-
* @description name of coding language used within CodeBlock for syntax highlighting
|
|
67
|
-
*/
|
|
55
|
+
get maxHeight(): string | undefined;
|
|
56
|
+
get showFooter(): boolean;
|
|
68
57
|
get language(): HdsCodeBlockLanguages | undefined;
|
|
69
|
-
/**
|
|
70
|
-
* @param hasLineNumbers
|
|
71
|
-
* @type {boolean}
|
|
72
|
-
* @default true
|
|
73
|
-
* @description Displays line numbers if true
|
|
74
|
-
*/
|
|
75
58
|
get hasLineNumbers(): boolean;
|
|
76
|
-
/**
|
|
77
|
-
* @param isStandalone
|
|
78
|
-
* @type {boolean}
|
|
79
|
-
* @default true
|
|
80
|
-
* @description Make CodeBlock container corners appear rounded
|
|
81
|
-
*/
|
|
82
59
|
get isStandalone(): boolean;
|
|
83
|
-
/**
|
|
84
|
-
* @param hasLineWrapping
|
|
85
|
-
* @type {boolean}
|
|
86
|
-
* @default false
|
|
87
|
-
* @description Make text content wrap on multiple lines
|
|
88
|
-
*/
|
|
89
60
|
get hasLineWrapping(): boolean;
|
|
90
61
|
get copyButtonText(): HdsCopyButtonSignature['Args']['text'];
|
|
91
62
|
setPrismCode(element: HTMLElement): void;
|
|
92
|
-
|
|
93
|
-
* Get the class names to apply to the component.
|
|
94
|
-
* @method classNames
|
|
95
|
-
* @return {string} The "class" attribute to apply to the component.
|
|
96
|
-
*/
|
|
63
|
+
toggleExpanded(): void;
|
|
97
64
|
get classNames(): string;
|
|
98
65
|
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export declare const hdsBreakpoints: {
|
|
2
|
+
sm: {
|
|
3
|
+
value: number;
|
|
4
|
+
px: string;
|
|
5
|
+
rem: string;
|
|
6
|
+
};
|
|
7
|
+
md: {
|
|
8
|
+
value: number;
|
|
9
|
+
px: string;
|
|
10
|
+
rem: string;
|
|
11
|
+
};
|
|
12
|
+
lg: {
|
|
13
|
+
value: number;
|
|
14
|
+
px: string;
|
|
15
|
+
rem: string;
|
|
16
|
+
};
|
|
17
|
+
xl: {
|
|
18
|
+
value: number;
|
|
19
|
+
px: string;
|
|
20
|
+
rem: string;
|
|
21
|
+
};
|
|
22
|
+
xxl: {
|
|
23
|
+
value: number;
|
|
24
|
+
px: string;
|
|
25
|
+
rem: string;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
@@ -10,7 +10,7 @@ import { precompileTemplate } from '@ember/template-compilation';
|
|
|
10
10
|
import { g, i, n } from 'decorator-transforms/runtime';
|
|
11
11
|
import { setComponentTemplate } from '@ember/component';
|
|
12
12
|
|
|
13
|
-
var TEMPLATE = precompileTemplate("{{!\n Copyright (c) HashiCorp, Inc.\n SPDX-License-Identifier: MPL-2.0\n}}\n<div\n class=\"hds-advanced-table__container\n {{(if this.isStickyHeaderPinned \'hds-advanced-table__container--header-is-pinned\')}}\"\n ...attributes\n>\n {{! Caption }}\n <div id={{this._captionId}} class=\"sr-only hds-advanced-table__caption\" aria-live=\"polite\">\n {{@caption}}\n {{this.sortedMessageText}}\n </div>\n\n {{! Grid }}\n <div\n class={{this.classNames}}\n role=\"grid\"\n aria-describedby={{this._captionId}}\n {{style\n grid-template-columns=this.gridTemplateColumns\n --hds-advanced-table-sticky-column-offset=this.stickyColumnOffset\n }}\n {{this._setUpScrollWrapper}}\n >\n {{! Header }}\n <div class={{this.theadClassNames}} role=\"rowgroup\" {{this._setUpThead}}>\n <Hds::AdvancedTable::Tr\n @selectionScope=\"col\"\n @onClickSortBySelected={{if @selectableColumnKey (fn this.setSortBy @selectableColumnKey)}}\n @sortBySelectedOrder={{if (eq this._sortBy @selectableColumnKey) this._sortOrder}}\n @isSelectable={{this.isSelectable}}\n @onSelectionChange={{this.onSelectionAllChange}}\n @didInsert={{this.didInsertSelectAllCheckbox}}\n @willDestroy={{this.willDestroySelectAllCheckbox}}\n @selectionAriaLabelSuffix=\"all rows\"\n @hasStickyColumn={{@hasStickyFirstColumn}}\n @isStickyColumnPinned={{this.isStickyColumnPinned}}\n >\n {{#each @columns as |column index|}}\n {{#if column.isSortable}}\n <Hds::AdvancedTable::ThSort\n @sortOrder={{if (eq column.key this._sortBy) this._sortOrder}}\n @onClickSort={{fn this.setSortBy column.key}}\n @align={{column.align}}\n @tooltip={{column.tooltip}}\n @isStickyColumn={{if (and (eq index 0) @hasStickyFirstColumn) true}}\n @isStickyColumnPinned={{this.isStickyColumnPinned}}\n >\n {{column.label}}\n </Hds::AdvancedTable::ThSort>\n {{else}}\n <Hds::AdvancedTable::Th\n @align={{column.align}}\n @tooltip={{column.tooltip}}\n @isVisuallyHidden={{column.isVisuallyHidden}}\n @isExpandable={{column.isExpandable}}\n @onClickToggle={{this._tableModel.toggleAll}}\n @isExpanded={{this._tableModel.expandState}}\n @hasExpandAllButton={{this._tableModel.hasRowsWithChildren}}\n @isStickyColumn={{if (and (eq index 0) @hasStickyFirstColumn) true}}\n @isStickyColumnPinned={{this.isStickyColumnPinned}}\n >\n {{column.label}}\n </Hds::AdvancedTable::Th>\n {{/if}}\n {{/each}}\n </Hds::AdvancedTable::Tr>\n </div>\n\n {{! Body }}\n <div class=\"hds-advanced-table__tbody\" role=\"rowgroup\">\n {{! ----------------------------------------------------------------------------------------\n IMPORTANT: we loop on the `model` array and for each record\n we yield the Tr/Td/Th elements _and_ the record itself as `data`\n this means the consumer will *have to* use the `data` key to access it in their template\n -------------------------------------------------------------------------------------------- }}\n {{#each (sort-by this.getSortCriteria this._tableModel.rows) key=this.identityKey as |record index|}}\n {{#if this._tableModel.hasRowsWithChildren}}\n <Hds::AdvancedTable::ExpandableTrGroup\n @record={{record}}\n @rowIndex={{index}}\n @onClickToggle={{record.onClickToggle}}\n as |T|\n >\n {{yield\n (hash\n Tr=(component\n \"hds/advanced-table/tr\"\n isLastRow=(eq this._tableModel.lastVisibleRow.id T.data.id)\n isParentRow=T.isExpandable\n depth=T.depth\n displayRow=T.shouldDisplayChildRows\n )\n Th=(component\n \"hds/advanced-table/th\"\n depth=T.depth\n isExpandable=T.isExpandable\n isExpanded=T.isExpanded\n newLabel=T.id\n parentId=T.parentId\n scope=\"row\"\n onClickToggle=T.onClickToggle\n )\n Td=(component \"hds/advanced-table/td\" align=@align)\n data=T.data\n isOpen=T.isExpanded\n rowIndex=T.rowIndex\n )\n to=\"body\"\n }}\n </Hds::AdvancedTable::ExpandableTrGroup>\n {{else}}\n {{yield\n (hash\n Tr=(component\n \"hds/advanced-table/tr\"\n selectionScope=\"row\"\n isLastRow=(eq this._tableModel.lastVisibleRow.id record.id)\n isSelectable=this.isSelectable\n onSelectionChange=this.onSelectionRowChange\n didInsert=this.didInsertRowCheckbox\n willDestroy=this.willDestroyRowCheckbox\n selectionAriaLabelSuffix=@selectionAriaLabelSuffix\n hasStickyColumn=@hasStickyFirstColumn\n isStickyColumnPinned=this.isStickyColumnPinned\n )\n Th=(component\n \"hds/advanced-table/th\"\n scope=\"row\"\n isStickyColumn=@hasStickyFirstColumn\n isStickyColumnPinned=this.isStickyColumnPinned\n )\n Td=(component \"hds/advanced-table/td\" align=@align)\n data=record\n rowIndex=index\n )\n to=\"body\"\n }}\n {{/if}}\n {{/each}}\n </div>\n </div>\n {{#if this.showScrollIndicatorLeft}}\n <div\n class=\"hds-advanced-table__scroll-indicator hds-advanced-table__scroll-indicator-left\"\n {{style height=this.scrollIndicatorDimensions.height left=this.scrollIndicatorDimensions.left}}\n />\n {{/if}}\n\n {{#if this.showScrollIndicatorRight}}\n <div\n class=\"hds-advanced-table__scroll-indicator hds-advanced-table__scroll-indicator-right\"\n {{style height=this.scrollIndicatorDimensions.height right=this.scrollIndicatorDimensions.right}}\n />\n {{/if}}\n\n {{#if this.showScrollIndicatorTop}}\n <div\n class=\"hds-advanced-table__scroll-indicator hds-advanced-table__scroll-indicator-top\"\n {{style top=this.scrollIndicatorDimensions.top width=this.scrollIndicatorDimensions.width}}\n />\n {{/if}}\n\n {{#if this.showScrollIndicatorBottom}}\n <div\n class=\"hds-advanced-table__scroll-indicator hds-advanced-table__scroll-indicator-bottom\"\n {{style bottom=this.scrollIndicatorDimensions.bottom width=this.scrollIndicatorDimensions.width}}\n />\n {{/if}}\n</div>");
|
|
13
|
+
var TEMPLATE = precompileTemplate("{{!\n Copyright (c) HashiCorp, Inc.\n SPDX-License-Identifier: MPL-2.0\n}}\n<div\n class=\"hds-advanced-table__container\n {{(if this.isStickyHeaderPinned \'hds-advanced-table__container--header-is-pinned\')}}\"\n ...attributes\n>\n {{! Caption }}\n <div id={{this._captionId}} class=\"sr-only hds-advanced-table__caption\" aria-live=\"polite\">\n {{@caption}}\n {{this.sortedMessageText}}\n </div>\n\n {{! Grid }}\n <div\n class={{this.classNames}}\n role=\"grid\"\n aria-describedby={{this._captionId}}\n {{style\n grid-template-columns=this.gridTemplateColumns\n --hds-advanced-table-sticky-column-offset=this.stickyColumnOffset\n max-height=@maxHeight\n }}\n {{this._setUpScrollWrapper}}\n >\n {{! Header }}\n <div class={{this.theadClassNames}} role=\"rowgroup\" {{this._setUpThead}}>\n <Hds::AdvancedTable::Tr\n @selectionScope=\"col\"\n @onClickSortBySelected={{if @selectableColumnKey (fn this.setSortBy @selectableColumnKey)}}\n @sortBySelectedOrder={{if (eq this._sortBy @selectableColumnKey) this._sortOrder}}\n @isSelectable={{this.isSelectable}}\n @onSelectionChange={{this.onSelectionAllChange}}\n @didInsert={{this.didInsertSelectAllCheckbox}}\n @willDestroy={{this.willDestroySelectAllCheckbox}}\n @selectionAriaLabelSuffix=\"all rows\"\n @hasStickyColumn={{@hasStickyFirstColumn}}\n @isStickyColumnPinned={{this.isStickyColumnPinned}}\n >\n {{#each @columns as |column index|}}\n {{#if column.isSortable}}\n <Hds::AdvancedTable::ThSort\n @sortOrder={{if (eq column.key this._sortBy) this._sortOrder}}\n @onClickSort={{fn this.setSortBy column.key}}\n @align={{column.align}}\n @tooltip={{column.tooltip}}\n @isStickyColumn={{if (and (eq index 0) @hasStickyFirstColumn) true}}\n @isStickyColumnPinned={{this.isStickyColumnPinned}}\n >\n {{column.label}}\n </Hds::AdvancedTable::ThSort>\n {{else}}\n <Hds::AdvancedTable::Th\n @align={{column.align}}\n @tooltip={{column.tooltip}}\n @isVisuallyHidden={{column.isVisuallyHidden}}\n @isExpandable={{column.isExpandable}}\n @onClickToggle={{this._tableModel.toggleAll}}\n @isExpanded={{this._tableModel.expandState}}\n @hasExpandAllButton={{this._tableModel.hasRowsWithChildren}}\n @isStickyColumn={{if (and (eq index 0) @hasStickyFirstColumn) true}}\n @isStickyColumnPinned={{this.isStickyColumnPinned}}\n >\n {{column.label}}\n </Hds::AdvancedTable::Th>\n {{/if}}\n {{/each}}\n </Hds::AdvancedTable::Tr>\n </div>\n\n {{! Body }}\n <div class=\"hds-advanced-table__tbody\" role=\"rowgroup\">\n {{! ----------------------------------------------------------------------------------------\n IMPORTANT: we loop on the `model` array and for each record\n we yield the Tr/Td/Th elements _and_ the record itself as `data`\n this means the consumer will *have to* use the `data` key to access it in their template\n -------------------------------------------------------------------------------------------- }}\n {{#each (sort-by this.getSortCriteria this._tableModel.rows) key=this.identityKey as |record index|}}\n {{#if this._tableModel.hasRowsWithChildren}}\n <Hds::AdvancedTable::ExpandableTrGroup\n @record={{record}}\n @rowIndex={{index}}\n @onClickToggle={{record.onClickToggle}}\n as |T|\n >\n {{yield\n (hash\n Tr=(component\n \"hds/advanced-table/tr\"\n isLastRow=(eq this._tableModel.lastVisibleRow.id T.data.id)\n isParentRow=T.isExpandable\n depth=T.depth\n displayRow=T.shouldDisplayChildRows\n )\n Th=(component\n \"hds/advanced-table/th\"\n depth=T.depth\n isExpandable=T.isExpandable\n isExpanded=T.isExpanded\n newLabel=T.id\n parentId=T.parentId\n scope=\"row\"\n onClickToggle=T.onClickToggle\n )\n Td=(component \"hds/advanced-table/td\" align=@align)\n data=T.data\n isOpen=T.isExpanded\n rowIndex=T.rowIndex\n )\n to=\"body\"\n }}\n </Hds::AdvancedTable::ExpandableTrGroup>\n {{else}}\n {{yield\n (hash\n Tr=(component\n \"hds/advanced-table/tr\"\n selectionScope=\"row\"\n isLastRow=(eq this._tableModel.lastVisibleRow.id record.id)\n isSelectable=this.isSelectable\n onSelectionChange=this.onSelectionRowChange\n didInsert=this.didInsertRowCheckbox\n willDestroy=this.willDestroyRowCheckbox\n selectionAriaLabelSuffix=@selectionAriaLabelSuffix\n hasStickyColumn=@hasStickyFirstColumn\n isStickyColumnPinned=this.isStickyColumnPinned\n )\n Th=(component\n \"hds/advanced-table/th\"\n scope=\"row\"\n isStickyColumn=@hasStickyFirstColumn\n isStickyColumnPinned=this.isStickyColumnPinned\n )\n Td=(component \"hds/advanced-table/td\" align=@align)\n data=record\n rowIndex=index\n )\n to=\"body\"\n }}\n {{/if}}\n {{/each}}\n </div>\n </div>\n {{#if this.showScrollIndicatorLeft}}\n <div\n class=\"hds-advanced-table__scroll-indicator hds-advanced-table__scroll-indicator-left\"\n {{style height=this.scrollIndicatorDimensions.height left=this.scrollIndicatorDimensions.left}}\n />\n {{/if}}\n\n {{#if this.showScrollIndicatorRight}}\n <div\n class=\"hds-advanced-table__scroll-indicator hds-advanced-table__scroll-indicator-right\"\n {{style height=this.scrollIndicatorDimensions.height right=this.scrollIndicatorDimensions.right}}\n />\n {{/if}}\n\n {{#if this.showScrollIndicatorTop}}\n <div\n class=\"hds-advanced-table__scroll-indicator hds-advanced-table__scroll-indicator-top\"\n {{style top=this.scrollIndicatorDimensions.top width=this.scrollIndicatorDimensions.width}}\n />\n {{/if}}\n\n {{#if this.showScrollIndicatorBottom}}\n <div\n class=\"hds-advanced-table__scroll-indicator hds-advanced-table__scroll-indicator-bottom\"\n {{style bottom=this.scrollIndicatorDimensions.bottom width=this.scrollIndicatorDimensions.width}}\n />\n {{/if}}\n</div>");
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
16
|
* Copyright (c) HashiCorp, Inc.
|
|
@@ -245,6 +245,14 @@ class HdsAdvancedTable extends Component {
|
|
|
245
245
|
assert(`@density for "Hds::Table" must be one of the following: ${DENSITIES.join(', ')}; received: ${density}`, DENSITIES.includes(density));
|
|
246
246
|
return density;
|
|
247
247
|
}
|
|
248
|
+
get hasStickyHeader() {
|
|
249
|
+
if (this.args.maxHeight && this.args.hasStickyHeader !== false) {
|
|
250
|
+
return true;
|
|
251
|
+
} else if (this.args.hasStickyHeader && !this.args.maxHeight) {
|
|
252
|
+
assert('Must set @maxHeight to use @hasStickyHeader.', false);
|
|
253
|
+
}
|
|
254
|
+
return false;
|
|
255
|
+
}
|
|
248
256
|
get valign() {
|
|
249
257
|
const {
|
|
250
258
|
valign = DEFAULT_VALIGN
|
|
@@ -292,7 +300,7 @@ class HdsAdvancedTable extends Component {
|
|
|
292
300
|
}
|
|
293
301
|
get theadClassNames() {
|
|
294
302
|
const classes = ['hds-advanced-table__thead'];
|
|
295
|
-
if (this.
|
|
303
|
+
if (this.hasStickyHeader) {
|
|
296
304
|
classes.push('hds-advanced-table__thead--sticky');
|
|
297
305
|
}
|
|
298
306
|
if (this.isStickyHeaderPinned) {
|
|
@@ -328,12 +336,12 @@ class HdsAdvancedTable extends Component {
|
|
|
328
336
|
|
|
329
337
|
// sticky header
|
|
330
338
|
if (element.scrollTop > 0) {
|
|
331
|
-
if (this.
|
|
339
|
+
if (this.hasStickyHeader) {
|
|
332
340
|
this.isStickyHeaderPinned = true;
|
|
333
341
|
}
|
|
334
342
|
this.showScrollIndicatorTop = true;
|
|
335
343
|
} else {
|
|
336
|
-
if (this.
|
|
344
|
+
if (this.hasStickyHeader) {
|
|
337
345
|
this.isStickyHeaderPinned = false;
|
|
338
346
|
}
|
|
339
347
|
this.showScrollIndicatorTop = false;
|
|
@@ -351,13 +359,12 @@ class HdsAdvancedTable extends Component {
|
|
|
351
359
|
};
|
|
352
360
|
element.addEventListener('scroll', this._scrollHandler);
|
|
353
361
|
const updateMeasurements = () => {
|
|
354
|
-
this.scrollIndicatorDimensions = getScrollIndicatorDimensions(element, this._theadElement, hasStickyHeader, hasStickyFirstColumn);
|
|
362
|
+
this.scrollIndicatorDimensions = getScrollIndicatorDimensions(element, this._theadElement, this.hasStickyHeader, hasStickyFirstColumn);
|
|
355
363
|
if (hasStickyFirstColumn) {
|
|
356
364
|
this.stickyColumnOffset = getStickyColumnLeftOffset(this._theadElement, isSelectable);
|
|
357
365
|
}
|
|
358
366
|
};
|
|
359
367
|
const {
|
|
360
|
-
hasStickyHeader = false,
|
|
361
368
|
hasStickyFirstColumn = false,
|
|
362
369
|
isSelectable = false
|
|
363
370
|
} = this.args;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/hds/advanced-table/index.ts"],"sourcesContent":["/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { action } from '@ember/object';\nimport { assert } from '@ember/debug';\nimport { tracked } from '@glimmer/tracking';\nimport type { ComponentLike } from '@glint/template';\nimport { guidFor } from '@ember/object/internals';\nimport { modifier } from 'ember-modifier';\nimport type Owner from '@ember/owner';\n\nimport HdsAdvancedTableTableModel from './models/table.ts';\nimport {\n HdsAdvancedTableDensityValues,\n HdsAdvancedTableThSortOrderValues,\n HdsAdvancedTableVerticalAlignmentValues,\n} from './types.ts';\nimport type {\n HdsAdvancedTableColumn,\n HdsAdvancedTableDensities,\n HdsAdvancedTableHorizontalAlignment,\n HdsAdvancedTableOnSelectionChangeSignature,\n HdsAdvancedTableSelectableRow,\n HdsAdvancedTableSortingFunction,\n HdsAdvancedTableThSortOrder,\n HdsAdvancedTableVerticalAlignment,\n HdsAdvancedTableModel,\n HdsAdvancedTableExpandState,\n} from './types.ts';\nimport type { HdsFormCheckboxBaseSignature } from '../form/checkbox/base.ts';\nimport type { HdsAdvancedTableTdSignature } from './td.ts';\nimport type { HdsAdvancedTableThSignature } from './th.ts';\nimport type { HdsAdvancedTableTrSignature } from './tr.ts';\n\nexport const DENSITIES: HdsAdvancedTableDensities[] = Object.values(\n HdsAdvancedTableDensityValues\n);\nexport const DEFAULT_DENSITY = HdsAdvancedTableDensityValues.Medium;\n\nexport const VALIGNMENTS: HdsAdvancedTableVerticalAlignment[] = Object.values(\n HdsAdvancedTableVerticalAlignmentValues\n);\nexport const DEFAULT_VALIGN = HdsAdvancedTableVerticalAlignmentValues.Top;\n\nconst DEFAULT_SCROLL_DIMENSIONS = {\n bottom: '0px',\n height: '0px',\n left: '0px',\n right: '0px',\n top: '0px',\n width: '0px',\n};\n\nconst getScrollIndicatorDimensions = (\n scrollWrapper: HTMLDivElement,\n theadElement: HTMLDivElement,\n hasStickyHeader: boolean,\n hasStickyFirstColumn: boolean\n) => {\n const horizontalScrollBarHeight =\n scrollWrapper.offsetHeight - scrollWrapper.clientHeight;\n const verticalScrollBarWidth =\n scrollWrapper.offsetWidth - scrollWrapper.clientWidth;\n\n let leftOffset = 0;\n\n if (hasStickyFirstColumn) {\n const stickyColumnHeaders = theadElement.querySelectorAll(\n '.hds-advanced-table__th--is-sticky-column'\n );\n\n stickyColumnHeaders?.forEach((el) => {\n // querySelectorAll returns Elements, which don't have offsetWidth\n // need to use offsetWidth to account for the cell borders\n const elAsHTMLElement = el as HTMLElement;\n leftOffset += elAsHTMLElement.offsetWidth;\n });\n\n // offsets the left: -1px position if there are multiple sticky columns\n if (stickyColumnHeaders.length > 1) {\n leftOffset -= 1;\n }\n }\n\n return {\n bottom: `${horizontalScrollBarHeight}px`,\n height: `${scrollWrapper.offsetHeight - horizontalScrollBarHeight}px`,\n left: `${leftOffset}px`,\n right: `${verticalScrollBarWidth}px`,\n top: hasStickyHeader ? `${theadElement.offsetHeight}px` : '0px',\n width: `${scrollWrapper.offsetWidth - verticalScrollBarWidth}px`,\n };\n};\n\nconst getStickyColumnLeftOffset = (\n theadElement: HTMLDivElement,\n hasRowSelection: boolean\n) => {\n // if there is no select checkbox column, the sticky column is all the way to the left\n if (!hasRowSelection) return '0px';\n\n const selectableCell = theadElement.querySelector(\n '.hds-advanced-table__th--is-selectable'\n ) as HTMLElement;\n\n return `${selectableCell?.offsetWidth}px`;\n};\n\nexport interface HdsAdvancedTableSignature {\n Args: {\n align?: HdsAdvancedTableHorizontalAlignment;\n caption?: string;\n columns: HdsAdvancedTableColumn[];\n density?: HdsAdvancedTableDensities;\n identityKey?: string;\n isSelectable?: boolean;\n isStriped?: boolean;\n model: HdsAdvancedTableModel;\n onSelectionChange?: (\n selection: HdsAdvancedTableOnSelectionChangeSignature\n ) => void;\n onSort?: (sortBy: string, sortOrder: HdsAdvancedTableThSortOrder) => void;\n selectionAriaLabelSuffix?: string;\n sortBy?: string;\n selectableColumnKey?: string;\n sortedMessageText?: string;\n sortOrder?: HdsAdvancedTableThSortOrder;\n valign?: HdsAdvancedTableVerticalAlignment;\n hasStickyHeader?: boolean;\n hasStickyFirstColumn?: boolean;\n childrenKey?: string;\n };\n Blocks: {\n body?: [\n {\n Td?: ComponentLike<HdsAdvancedTableTdSignature>;\n Tr?: ComponentLike<HdsAdvancedTableTrSignature>;\n Th?: ComponentLike<HdsAdvancedTableThSignature>;\n data?: Record<string, unknown>;\n rowIndex?: number | string;\n isOpen?: HdsAdvancedTableExpandState;\n },\n ];\n };\n Element: HTMLDivElement;\n}\n\nexport default class HdsAdvancedTable extends Component<HdsAdvancedTableSignature> {\n @tracked private _sortBy = this.args.sortBy ?? undefined;\n @tracked private _sortOrder =\n this.args.sortOrder || HdsAdvancedTableThSortOrderValues.Asc;\n @tracked\n private _selectAllCheckbox?: HdsFormCheckboxBaseSignature['Element'] =\n undefined;\n @tracked private _isSelectAllCheckboxSelected?: boolean = undefined;\n private _selectableRows: HdsAdvancedTableSelectableRow[] = [];\n private _captionId = 'caption-' + guidFor(this);\n private _tableModel!: HdsAdvancedTableTableModel;\n private _scrollHandler!: (event: Event) => void;\n private _resizeObserver!: ResizeObserver;\n private _theadElement!: HTMLDivElement;\n\n @tracked scrollIndicatorDimensions = DEFAULT_SCROLL_DIMENSIONS;\n @tracked isStickyColumnPinned = false;\n @tracked isStickyHeaderPinned = false;\n @tracked showScrollIndicatorLeft = false;\n @tracked showScrollIndicatorRight = false;\n @tracked showScrollIndicatorTop = false;\n @tracked showScrollIndicatorBottom = false;\n @tracked stickyColumnOffset = '0px';\n\n constructor(owner: Owner, args: HdsAdvancedTableSignature['Args']) {\n super(owner, args);\n\n const { model, childrenKey, columns, hasStickyFirstColumn } = args;\n\n this._tableModel = new HdsAdvancedTableTableModel({\n model,\n childrenKey,\n });\n\n if (this._tableModel.hasRowsWithChildren) {\n const sortableColumns = columns.filter((column) => column.isSortable);\n const sortableColumnLabels = sortableColumns.map(\n (column) => column.label\n );\n\n assert(\n `Cannot have sortable columns if there are nested rows. Sortable columns are ${sortableColumnLabels.toString()}`,\n sortableColumns.length === 0\n );\n\n assert(\n 'Cannot have a sticky first column if there are nested rows.',\n !hasStickyFirstColumn\n );\n }\n }\n\n get getSortCriteria(): string | HdsAdvancedTableSortingFunction<unknown> {\n // get the current column\n const currentColumn = this.args?.columns?.find(\n (column) => column.key === this._sortBy\n );\n\n if (\n // check if there is a custom sorting function associated with the current `sortBy` column (we assume the column has `isSortable`)\n currentColumn?.sortingFunction &&\n typeof currentColumn.sortingFunction === 'function'\n ) {\n return currentColumn.sortingFunction;\n } else {\n // otherwise fallback to the default format \"sortBy:sortOrder\"\n return `${this._sortBy}:${this._sortOrder}`;\n }\n }\n\n get columnWidths(): string[] | undefined {\n const { columns } = this.args;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const widths: string[] = new Array(columns.length);\n let hasCustomColumnWidth = false;\n\n for (let i = 0; i < columns.length; i++) {\n const column = columns[i];\n\n if (column?.['width']) {\n widths[i] = column.width;\n if (!hasCustomColumnWidth) hasCustomColumnWidth = true;\n }\n }\n\n return hasCustomColumnWidth ? widths : undefined;\n }\n\n get identityKey(): string | undefined {\n // we have to provide a way for the consumer to pass undefined because Ember tries to interpret undefined as missing an arg and therefore falls back to the default\n if (this.args.identityKey === 'none') {\n return undefined;\n } else {\n return this.args.identityKey ?? '@identity';\n }\n }\n\n get childrenKey(): string {\n const { childrenKey = 'children' } = this.args;\n\n return childrenKey;\n }\n\n get hasScrollIndicator(): boolean {\n if (this.args.hasStickyFirstColumn) {\n return true;\n }\n\n return false;\n }\n\n get sortedMessageText(): string {\n if (this.args.sortedMessageText) {\n return this.args.sortedMessageText;\n } else if (this._sortBy && this._sortOrder) {\n // we should allow the user to define a custom value here (e.g., for i18n) - tracked with HDS-965\n return `Sorted by ${this._sortBy} ${this._sortOrder}ending`;\n } else {\n return '';\n }\n }\n\n get isSelectable(): boolean {\n const { isSelectable = false } = this.args;\n\n if (this._tableModel.hasRowsWithChildren) {\n assert(\n '@isSelectable must not be true if there are nested rows.',\n !isSelectable\n );\n return isSelectable;\n }\n\n return isSelectable;\n }\n\n get isStriped(): boolean {\n const { isStriped = false } = this.args;\n\n if (this._tableModel.hasRowsWithChildren) {\n assert(\n '@isStriped must not be true if there are nested rows.',\n !isStriped\n );\n return isStriped;\n }\n\n return isStriped;\n }\n\n get density(): HdsAdvancedTableDensities {\n const { density = DEFAULT_DENSITY } = this.args;\n\n assert(\n `@density for \"Hds::Table\" must be one of the following: ${DENSITIES.join(\n ', '\n )}; received: ${density}`,\n DENSITIES.includes(density)\n );\n\n return density;\n }\n\n get valign(): HdsAdvancedTableVerticalAlignment {\n const { valign = DEFAULT_VALIGN } = this.args;\n\n assert(\n `@valign for \"Hds::Table\" must be one of the following: ${VALIGNMENTS.join(\n ', '\n )}; received: ${valign}`,\n VALIGNMENTS.includes(valign)\n );\n\n return valign;\n }\n\n // returns the grid-template-columns CSS attribute for the grid\n get gridTemplateColumns(): string {\n const { isSelectable, columns } = this.args;\n\n const DEFAULT_COLUMN_WIDTH = '1fr';\n\n // if there is a select checkbox, the first column has a 'min-content' width to hug the checkbox content\n let style = isSelectable ? 'min-content ' : '';\n\n if (!this.columnWidths) {\n // if there are no custom column widths, each column is the same width and they take up the available space\n style += `repeat(${columns.length}, ${DEFAULT_COLUMN_WIDTH})`;\n } else {\n // check the custom column widths, if the current column has a custom width use the custom width. otherwise take the available space.\n for (let i = 0; i < this.columnWidths.length; i++) {\n style += ` ${this.columnWidths[i] ? this.columnWidths[i] : DEFAULT_COLUMN_WIDTH}`;\n }\n }\n\n return style;\n }\n\n get classNames(): string {\n const classes = ['hds-advanced-table'];\n\n if (this.isStriped) {\n classes.push('hds-advanced-table--striped');\n }\n\n if (this.density) {\n classes.push(`hds-advanced-table--density-${this.density}`);\n }\n\n if (this.valign) {\n classes.push(`hds-advanced-table--valign-${this.valign}`);\n }\n\n if (this._tableModel.hasRowsWithChildren) {\n classes.push(`hds-advanced-table--nested`);\n }\n\n return classes.join(' ');\n }\n\n get theadClassNames(): string {\n const classes = ['hds-advanced-table__thead'];\n\n if (this.args.hasStickyHeader) {\n classes.push('hds-advanced-table__thead--sticky');\n }\n\n if (this.isStickyHeaderPinned) {\n classes.push('hds-advanced-table__thead--is-pinned');\n }\n\n return classes.join(' ');\n }\n\n private _setUpScrollWrapper = modifier((element: HTMLDivElement) => {\n this._scrollHandler = () => {\n // 6px as a buffer so the shadow doesn't appear over the border radius on the edge of the table\n const SCROLL_BUFFER = 6;\n\n // left scroll indicator and sticky column styles\n if (element.scrollLeft > SCROLL_BUFFER && !this.showScrollIndicatorLeft) {\n if (this.args.hasStickyFirstColumn) {\n this.isStickyColumnPinned = true;\n }\n this.showScrollIndicatorLeft = true;\n } else if (element.scrollLeft === 0 && this.showScrollIndicatorLeft) {\n this.isStickyColumnPinned = false;\n this.showScrollIndicatorLeft = false;\n }\n\n // the right edge is how far the user can scroll, which is the full width of the table - the visible section of the table (also subtract the buffer)\n const rightEdge =\n element.scrollWidth - element.clientWidth - SCROLL_BUFFER;\n\n // right scroll indicator\n if (element.scrollLeft < rightEdge) {\n this.showScrollIndicatorRight = true;\n } else {\n this.showScrollIndicatorRight = false;\n }\n\n // sticky header\n if (element.scrollTop > 0) {\n if (this.args.hasStickyHeader) {\n this.isStickyHeaderPinned = true;\n }\n this.showScrollIndicatorTop = true;\n } else {\n if (this.args.hasStickyHeader) {\n this.isStickyHeaderPinned = false;\n }\n this.showScrollIndicatorTop = false;\n }\n\n // the bottom edge is how far the user can scroll, which is the full height of the table - the visible section of the table (also subtract the buffer)\n const bottomEdge =\n element.scrollHeight - element.clientHeight - SCROLL_BUFFER;\n\n // bottom scroll indicator\n if (element.scrollTop < bottomEdge) {\n this.showScrollIndicatorBottom = true;\n } else {\n this.showScrollIndicatorBottom = false;\n }\n };\n\n element.addEventListener('scroll', this._scrollHandler);\n\n const updateMeasurements = () => {\n this.scrollIndicatorDimensions = getScrollIndicatorDimensions(\n element,\n this._theadElement,\n hasStickyHeader,\n hasStickyFirstColumn\n );\n\n if (hasStickyFirstColumn) {\n this.stickyColumnOffset = getStickyColumnLeftOffset(\n this._theadElement,\n isSelectable\n );\n }\n };\n\n const {\n hasStickyHeader = false,\n hasStickyFirstColumn = false,\n isSelectable = false,\n } = this.args;\n\n this._resizeObserver = new ResizeObserver((entries) => {\n entries.forEach(() => {\n updateMeasurements();\n });\n });\n\n this._resizeObserver.observe(element);\n\n updateMeasurements();\n\n // on render check if should show right scroll indicator\n if (element.clientWidth < element.scrollWidth) {\n this.showScrollIndicatorRight = true;\n }\n\n // on render check if should show bottom scroll indicator\n if (element.clientHeight < element.scrollHeight) {\n this.showScrollIndicatorBottom = true;\n }\n\n return () => {\n element.removeEventListener('scroll', this._scrollHandler);\n this._resizeObserver.disconnect();\n };\n });\n\n private _setUpThead = modifier((element: HTMLDivElement) => {\n this._theadElement = element;\n });\n\n @action\n setSortBy(column: string): void {\n if (this._sortBy === column) {\n // check to see if the column is already sorted and invert the sort order if so\n this._sortOrder =\n this._sortOrder === HdsAdvancedTableThSortOrderValues.Asc\n ? HdsAdvancedTableThSortOrderValues.Desc\n : HdsAdvancedTableThSortOrderValues.Asc;\n } else {\n // otherwise, set the sort order to ascending\n this._sortBy = column;\n this._sortOrder = HdsAdvancedTableThSortOrderValues.Asc;\n }\n\n const { onSort } = this.args;\n\n if (typeof onSort === 'function') {\n onSort(this._sortBy, this._sortOrder);\n }\n }\n\n onSelectionChangeCallback(\n checkbox?: HdsFormCheckboxBaseSignature['Element'],\n selectionKey?: string\n ): void {\n const { onSelectionChange } = this.args;\n\n if (typeof onSelectionChange !== 'function') return;\n\n onSelectionChange({\n selectionKey: selectionKey,\n selectionCheckboxElement: checkbox,\n selectedRowsKeys: this._selectableRows.reduce<string[]>((acc, row) => {\n if (row.checkbox.checked) {\n acc.push(row.selectionKey);\n }\n return acc;\n }, []),\n selectableRowsStates: this._selectableRows.reduce(\n (\n acc: { selectionKey: string; isSelected: boolean | undefined }[],\n row\n ) => {\n acc.push({\n selectionKey: row.selectionKey,\n isSelected: row.checkbox.checked,\n });\n return acc;\n },\n []\n ),\n });\n }\n\n @action\n onSelectionAllChange(): void {\n this._selectableRows.forEach((row) => {\n row.checkbox.checked = this._selectAllCheckbox?.checked ?? false;\n });\n this._isSelectAllCheckboxSelected =\n this._selectAllCheckbox?.checked ?? false;\n this.onSelectionChangeCallback(this._selectAllCheckbox, 'all');\n }\n\n @action\n onSelectionRowChange(\n checkbox?: HdsFormCheckboxBaseSignature['Element'],\n selectionKey?: string\n ): void {\n this.setSelectAllState();\n this.onSelectionChangeCallback(checkbox, selectionKey);\n }\n\n @action\n didInsertSelectAllCheckbox(\n checkbox: HdsFormCheckboxBaseSignature['Element']\n ): void {\n this._selectAllCheckbox = checkbox;\n }\n\n @action\n willDestroySelectAllCheckbox(): void {\n this._selectAllCheckbox = undefined;\n }\n\n @action\n didInsertRowCheckbox(\n checkbox: HdsFormCheckboxBaseSignature['Element'],\n selectionKey?: string\n ): void {\n if (selectionKey) {\n this._selectableRows.push({ selectionKey, checkbox });\n }\n this.setSelectAllState();\n }\n\n @action\n willDestroyRowCheckbox(selectionKey?: string): void {\n this._selectableRows = this._selectableRows.filter(\n (row) => row.selectionKey !== selectionKey\n );\n this.setSelectAllState();\n }\n\n @action\n setSelectAllState(): void {\n if (this._selectAllCheckbox) {\n const selectableRowsCount = this._selectableRows.length;\n const selectedRowsCount = this._selectableRows.filter(\n (row) => row.checkbox.checked\n ).length;\n\n this._selectAllCheckbox.checked =\n selectedRowsCount === selectableRowsCount;\n this._selectAllCheckbox.indeterminate =\n selectedRowsCount > 0 && selectedRowsCount < selectableRowsCount;\n this._isSelectAllCheckboxSelected = this._selectAllCheckbox.checked;\n }\n }\n}\n"],"names":["DENSITIES","Object","values","HdsAdvancedTableDensityValues","DEFAULT_DENSITY","Medium","VALIGNMENTS","HdsAdvancedTableVerticalAlignmentValues","DEFAULT_VALIGN","Top","DEFAULT_SCROLL_DIMENSIONS","bottom","height","left","right","top","width","getScrollIndicatorDimensions","scrollWrapper","theadElement","hasStickyHeader","hasStickyFirstColumn","horizontalScrollBarHeight","offsetHeight","clientHeight","verticalScrollBarWidth","offsetWidth","clientWidth","leftOffset","stickyColumnHeaders","querySelectorAll","forEach","el","elAsHTMLElement","length","getStickyColumnLeftOffset","hasRowSelection","selectableCell","querySelector","HdsAdvancedTable","Component","g","prototype","tracked","args","sortBy","undefined","i","void 0","sortOrder","HdsAdvancedTableThSortOrderValues","Asc","_selectableRows","_captionId","guidFor","_tableModel","_scrollHandler","_resizeObserver","_theadElement","constructor","owner","model","childrenKey","columns","HdsAdvancedTableTableModel","hasRowsWithChildren","sortableColumns","filter","column","isSortable","sortableColumnLabels","map","label","assert","toString","getSortCriteria","currentColumn","find","key","_sortBy","sortingFunction","_sortOrder","columnWidths","widths","Array","hasCustomColumnWidth","identityKey","hasScrollIndicator","sortedMessageText","isSelectable","isStriped","density","join","includes","valign","gridTemplateColumns","DEFAULT_COLUMN_WIDTH","style","classNames","classes","push","theadClassNames","isStickyHeaderPinned","_setUpScrollWrapper","modifier","element","SCROLL_BUFFER","scrollLeft","showScrollIndicatorLeft","isStickyColumnPinned","rightEdge","scrollWidth","showScrollIndicatorRight","scrollTop","showScrollIndicatorTop","bottomEdge","scrollHeight","showScrollIndicatorBottom","addEventListener","updateMeasurements","scrollIndicatorDimensions","stickyColumnOffset","ResizeObserver","entries","observe","removeEventListener","disconnect","_setUpThead","setSortBy","Desc","onSort","n","action","onSelectionChangeCallback","checkbox","selectionKey","onSelectionChange","selectionCheckboxElement","selectedRowsKeys","reduce","acc","row","checked","selectableRowsStates","isSelected","onSelectionAllChange","_selectAllCheckbox","_isSelectAllCheckboxSelected","onSelectionRowChange","setSelectAllState","didInsertSelectAllCheckbox","willDestroySelectAllCheckbox","didInsertRowCheckbox","willDestroyRowCheckbox","selectableRowsCount","selectedRowsCount","indeterminate","setComponentTemplate","TEMPLATE"],"mappings":";;;;;;;;;;;;;;AAAA;AACA;AACA;AACA;;AAkCO,MAAMA,SAAsC,GAAGC,MAAM,CAACC,MAAM,CACjEC,6BACF;AACaC,MAAAA,eAAe,GAAGD,6BAA6B,CAACE;AAEtD,MAAMC,WAAgD,GAAGL,MAAM,CAACC,MAAM,CAC3EK,uCACF;AACaC,MAAAA,cAAc,GAAGD,uCAAuC,CAACE;AAEtE,MAAMC,yBAAyB,GAAG;AAChCC,EAAAA,MAAM,EAAE,KAAK;AACbC,EAAAA,MAAM,EAAE,KAAK;AACbC,EAAAA,IAAI,EAAE,KAAK;AACXC,EAAAA,KAAK,EAAE,KAAK;AACZC,EAAAA,GAAG,EAAE,KAAK;AACVC,EAAAA,KAAK,EAAE;AACT,CAAC;AAED,MAAMC,4BAA4B,GAAGA,CACnCC,aAA6B,EAC7BC,YAA4B,EAC5BC,eAAwB,EACxBC,oBAA6B,KAC1B;EACH,MAAMC,yBAAyB,GAC7BJ,aAAa,CAACK,YAAY,GAAGL,aAAa,CAACM,YAAY;EACzD,MAAMC,sBAAsB,GAC1BP,aAAa,CAACQ,WAAW,GAAGR,aAAa,CAACS,WAAW;EAEvD,IAAIC,UAAU,GAAG,CAAC;AAElB,EAAA,IAAIP,oBAAoB,EAAE;AACxB,IAAA,MAAMQ,mBAAmB,GAAGV,YAAY,CAACW,gBAAgB,CACvD,2CACF,CAAC;AAEDD,IAAAA,mBAAmB,EAAEE,OAAO,CAAEC,EAAE,IAAK;AACnC;AACA;MACA,MAAMC,eAAe,GAAGD,EAAiB;MACzCJ,UAAU,IAAIK,eAAe,CAACP,WAAW;AAC3C,KAAC,CAAC;;AAEF;AACA,IAAA,IAAIG,mBAAmB,CAACK,MAAM,GAAG,CAAC,EAAE;AAClCN,MAAAA,UAAU,IAAI,CAAC;AACjB;AACF;EAEA,OAAO;IACLjB,MAAM,EAAE,CAAGW,EAAAA,yBAAyB,CAAI,EAAA,CAAA;AACxCV,IAAAA,MAAM,EAAE,CAAGM,EAAAA,aAAa,CAACK,YAAY,GAAGD,yBAAyB,CAAI,EAAA,CAAA;IACrET,IAAI,EAAE,CAAGe,EAAAA,UAAU,CAAI,EAAA,CAAA;IACvBd,KAAK,EAAE,CAAGW,EAAAA,sBAAsB,CAAI,EAAA,CAAA;IACpCV,GAAG,EAAEK,eAAe,GAAG,CAAA,EAAGD,YAAY,CAACI,YAAY,CAAI,EAAA,CAAA,GAAG,KAAK;AAC/DP,IAAAA,KAAK,EAAE,CAAGE,EAAAA,aAAa,CAACQ,WAAW,GAAGD,sBAAsB,CAAA,EAAA;GAC7D;AACH,CAAC;AAED,MAAMU,yBAAyB,GAAGA,CAChChB,YAA4B,EAC5BiB,eAAwB,KACrB;AACH;AACA,EAAA,IAAI,CAACA,eAAe,EAAE,OAAO,KAAK;AAElC,EAAA,MAAMC,cAAc,GAAGlB,YAAY,CAACmB,aAAa,CAC/C,wCACF,CAAgB;AAEhB,EAAA,OAAO,CAAGD,EAAAA,cAAc,EAAEX,WAAW,CAAI,EAAA,CAAA;AAC3C,CAAC;AAyCc,MAAMa,gBAAgB,SAASC,SAAS,CAA4B;AAAA,EAAA;IAAAC,CAAA,CAAA,IAAA,CAAAC,SAAA,EAAA,SAAA,EAAA,CAChFC,OAAO,CAAA,EAAA,YAAA;AAAA,MAAA,OAAmB,IAAI,CAACC,IAAI,CAACC,MAAM,IAAIC,SAAS;AAAA,KAAA,CAAA;AAAA;AAAA,EAAA,QAAA,IAAAC,CAAA,CAAA,IAAA,EAAA,SAAA,CAAA,EAAAC,MAAA;AAAA,EAAA;IAAAP,CAAA,CAAA,IAAA,CAAAC,SAAA,EAAA,YAAA,EAAA,CACvDC,OAAO,CAAA,EAAA,YAAA;MAAA,OACN,IAAI,CAACC,IAAI,CAACK,SAAS,IAAIC,iCAAiC,CAACC,GAAG;AAAA,KAAA,CAAA;AAAA;AAAA,EAAA,WAAA,IAAAJ,CAAA,CAAA,IAAA,EAAA,YAAA,CAAA,EAAAC,MAAA;AAAA,EAAA;IAAAP,CAAA,CAAA,IAAA,CAAAC,SAAA,EAAA,oBAAA,EAAA,CAC7DC,OAAO,CAAA,EAAA,YAAA;AAAA,MAAA,OAENG,SAAS;AAAA,KAAA,CAAA;AAAA;AAAA,EAAA,mBAAA,IAAAC,CAAA,CAAA,IAAA,EAAA,oBAAA,CAAA,EAAAC,MAAA;AAAA,EAAA;IAAAP,CAAA,CAAA,IAAA,CAAAC,SAAA,EAAA,8BAAA,EAAA,CACVC,OAAO,CAAA,EAAA,YAAA;AAAA,MAAA,OAAkDG,SAAS;AAAA,KAAA,CAAA;AAAA;AAAA,EAAA,6BAAA,IAAAC,CAAA,CAAA,IAAA,EAAA,8BAAA,CAAA,EAAAC,MAAA;AAC3DI,EAAAA,eAAe,GAAoC,EAAE;AACrDC,EAAAA,UAAU,GAAG,UAAU,GAAGC,OAAO,CAAC,IAAI,CAAC;EACvCC,WAAW;EACXC,cAAc;EACdC,eAAe;EACfC,aAAa;AAAkB,EAAA;IAAAjB,CAAA,CAAA,IAAA,CAAAC,SAAA,EAAA,2BAAA,EAAA,CAEtCC,OAAO,CAAA,EAAA,YAAA;AAAA,MAAA,OAA6BjC,yBAAyB;AAAA,KAAA,CAAA;AAAA;AAAA,EAAA,0BAAA,IAAAqC,CAAA,CAAA,IAAA,EAAA,2BAAA,CAAA,EAAAC,MAAA;AAAA,EAAA;IAAAP,CAAA,CAAA,IAAA,CAAAC,SAAA,EAAA,sBAAA,EAAA,CAC7DC,OAAO,CAAA,EAAA,YAAA;AAAA,MAAA,OAAwB,KAAK;AAAA,KAAA,CAAA;AAAA;AAAA,EAAA,qBAAA,IAAAI,CAAA,CAAA,IAAA,EAAA,sBAAA,CAAA,EAAAC,MAAA;AAAA,EAAA;IAAAP,CAAA,CAAA,IAAA,CAAAC,SAAA,EAAA,sBAAA,EAAA,CACpCC,OAAO,CAAA,EAAA,YAAA;AAAA,MAAA,OAAwB,KAAK;AAAA,KAAA,CAAA;AAAA;AAAA,EAAA,qBAAA,IAAAI,CAAA,CAAA,IAAA,EAAA,sBAAA,CAAA,EAAAC,MAAA;AAAA,EAAA;IAAAP,CAAA,CAAA,IAAA,CAAAC,SAAA,EAAA,yBAAA,EAAA,CACpCC,OAAO,CAAA,EAAA,YAAA;AAAA,MAAA,OAA2B,KAAK;AAAA,KAAA,CAAA;AAAA;AAAA,EAAA,wBAAA,IAAAI,CAAA,CAAA,IAAA,EAAA,yBAAA,CAAA,EAAAC,MAAA;AAAA,EAAA;IAAAP,CAAA,CAAA,IAAA,CAAAC,SAAA,EAAA,0BAAA,EAAA,CACvCC,OAAO,CAAA,EAAA,YAAA;AAAA,MAAA,OAA4B,KAAK;AAAA,KAAA,CAAA;AAAA;AAAA,EAAA,yBAAA,IAAAI,CAAA,CAAA,IAAA,EAAA,0BAAA,CAAA,EAAAC,MAAA;AAAA,EAAA;IAAAP,CAAA,CAAA,IAAA,CAAAC,SAAA,EAAA,wBAAA,EAAA,CACxCC,OAAO,CAAA,EAAA,YAAA;AAAA,MAAA,OAA0B,KAAK;AAAA,KAAA,CAAA;AAAA;AAAA,EAAA,uBAAA,IAAAI,CAAA,CAAA,IAAA,EAAA,wBAAA,CAAA,EAAAC,MAAA;AAAA,EAAA;IAAAP,CAAA,CAAA,IAAA,CAAAC,SAAA,EAAA,2BAAA,EAAA,CACtCC,OAAO,CAAA,EAAA,YAAA;AAAA,MAAA,OAA6B,KAAK;AAAA,KAAA,CAAA;AAAA;AAAA,EAAA,0BAAA,IAAAI,CAAA,CAAA,IAAA,EAAA,2BAAA,CAAA,EAAAC,MAAA;AAAA,EAAA;IAAAP,CAAA,CAAA,IAAA,CAAAC,SAAA,EAAA,oBAAA,EAAA,CACzCC,OAAO,CAAA,EAAA,YAAA;AAAA,MAAA,OAAsB,KAAK;AAAA,KAAA,CAAA;AAAA;AAAA,EAAA,mBAAA,IAAAI,CAAA,CAAA,IAAA,EAAA,oBAAA,CAAA,EAAAC,MAAA;AAEnCW,EAAAA,WAAWA,CAACC,KAAY,EAAEhB,IAAuC,EAAE;AACjE,IAAA,KAAK,CAACgB,KAAK,EAAEhB,IAAI,CAAC;IAElB,MAAM;MAAEiB,KAAK;MAAEC,WAAW;MAAEC,OAAO;AAAE1C,MAAAA;AAAqB,KAAC,GAAGuB,IAAI;AAElE,IAAA,IAAI,CAACW,WAAW,GAAG,IAAIS,0BAA0B,CAAC;MAChDH,KAAK;AACLC,MAAAA;AACF,KAAC,CAAC;AAEF,IAAA,IAAI,IAAI,CAACP,WAAW,CAACU,mBAAmB,EAAE;MACxC,MAAMC,eAAe,GAAGH,OAAO,CAACI,MAAM,CAAEC,MAAM,IAAKA,MAAM,CAACC,UAAU,CAAC;MACrE,MAAMC,oBAAoB,GAAGJ,eAAe,CAACK,GAAG,CAC7CH,MAAM,IAAKA,MAAM,CAACI,KACrB,CAAC;AAEDC,MAAAA,MAAM,CACJ,CAAA,4EAAA,EAA+EH,oBAAoB,CAACI,QAAQ,EAAE,CAAE,CAAA,EAChHR,eAAe,CAAChC,MAAM,KAAK,CAC7B,CAAC;AAEDuC,MAAAA,MAAM,CACJ,6DAA6D,EAC7D,CAACpD,oBACH,CAAC;AACH;AACF;EAEA,IAAIsD,eAAeA,GAAsD;AACvE;AACA,IAAA,MAAMC,aAAa,GAAG,IAAI,CAAChC,IAAI,EAAEmB,OAAO,EAAEc,IAAI,CAC3CT,MAAM,IAAKA,MAAM,CAACU,GAAG,KAAK,IAAI,CAACC,OAClC,CAAC;AAED,IAAA;AACE;IACAH,aAAa,EAAEI,eAAe,IAC9B,OAAOJ,aAAa,CAACI,eAAe,KAAK,UAAU,EACnD;MACA,OAAOJ,aAAa,CAACI,eAAe;AACtC,KAAC,MAAM;AACL;MACA,OAAO,CAAA,EAAG,IAAI,CAACD,OAAO,IAAI,IAAI,CAACE,UAAU,CAAE,CAAA;AAC7C;AACF;EAEA,IAAIC,YAAYA,GAAyB;IACvC,MAAM;AAAEnB,MAAAA;KAAS,GAAG,IAAI,CAACnB,IAAI;AAC7B;IACA,MAAMuC,MAAgB,GAAG,IAAIC,KAAK,CAACrB,OAAO,CAAC7B,MAAM,CAAC;IAClD,IAAImD,oBAAoB,GAAG,KAAK;AAEhC,IAAA,KAAK,IAAItC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGgB,OAAO,CAAC7B,MAAM,EAAEa,CAAC,EAAE,EAAE;AACvC,MAAA,MAAMqB,MAAM,GAAGL,OAAO,CAAChB,CAAC,CAAC;AAEzB,MAAA,IAAIqB,MAAM,GAAG,OAAO,CAAC,EAAE;AACrBe,QAAAA,MAAM,CAACpC,CAAC,CAAC,GAAGqB,MAAM,CAACpD,KAAK;AACxB,QAAA,IAAI,CAACqE,oBAAoB,EAAEA,oBAAoB,GAAG,IAAI;AACxD;AACF;AAEA,IAAA,OAAOA,oBAAoB,GAAGF,MAAM,GAAGrC,SAAS;AAClD;EAEA,IAAIwC,WAAWA,GAAuB;AACpC;AACA,IAAA,IAAI,IAAI,CAAC1C,IAAI,CAAC0C,WAAW,KAAK,MAAM,EAAE;AACpC,MAAA,OAAOxC,SAAS;AAClB,KAAC,MAAM;AACL,MAAA,OAAO,IAAI,CAACF,IAAI,CAAC0C,WAAW,IAAI,WAAW;AAC7C;AACF;EAEA,IAAIxB,WAAWA,GAAW;IACxB,MAAM;AAAEA,MAAAA,WAAW,GAAG;KAAY,GAAG,IAAI,CAAClB,IAAI;AAE9C,IAAA,OAAOkB,WAAW;AACpB;EAEA,IAAIyB,kBAAkBA,GAAY;AAChC,IAAA,IAAI,IAAI,CAAC3C,IAAI,CAACvB,oBAAoB,EAAE;AAClC,MAAA,OAAO,IAAI;AACb;AAEA,IAAA,OAAO,KAAK;AACd;EAEA,IAAImE,iBAAiBA,GAAW;AAC9B,IAAA,IAAI,IAAI,CAAC5C,IAAI,CAAC4C,iBAAiB,EAAE;AAC/B,MAAA,OAAO,IAAI,CAAC5C,IAAI,CAAC4C,iBAAiB;KACnC,MAAM,IAAI,IAAI,CAACT,OAAO,IAAI,IAAI,CAACE,UAAU,EAAE;AAC1C;MACA,OAAO,CAAA,UAAA,EAAa,IAAI,CAACF,OAAO,IAAI,IAAI,CAACE,UAAU,CAAQ,MAAA,CAAA;AAC7D,KAAC,MAAM;AACL,MAAA,OAAO,EAAE;AACX;AACF;EAEA,IAAIQ,YAAYA,GAAY;IAC1B,MAAM;AAAEA,MAAAA,YAAY,GAAG;KAAO,GAAG,IAAI,CAAC7C,IAAI;AAE1C,IAAA,IAAI,IAAI,CAACW,WAAW,CAACU,mBAAmB,EAAE;AACxCQ,MAAAA,MAAM,CACJ,0DAA0D,EAC1D,CAACgB,YACH,CAAC;AACD,MAAA,OAAOA,YAAY;AACrB;AAEA,IAAA,OAAOA,YAAY;AACrB;EAEA,IAAIC,SAASA,GAAY;IACvB,MAAM;AAAEA,MAAAA,SAAS,GAAG;KAAO,GAAG,IAAI,CAAC9C,IAAI;AAEvC,IAAA,IAAI,IAAI,CAACW,WAAW,CAACU,mBAAmB,EAAE;AACxCQ,MAAAA,MAAM,CACJ,uDAAuD,EACvD,CAACiB,SACH,CAAC;AACD,MAAA,OAAOA,SAAS;AAClB;AAEA,IAAA,OAAOA,SAAS;AAClB;EAEA,IAAIC,OAAOA,GAA8B;IACvC,MAAM;AAAEA,MAAAA,OAAO,GAAGvF;KAAiB,GAAG,IAAI,CAACwC,IAAI;AAE/C6B,IAAAA,MAAM,CACJ,CAA2DzE,wDAAAA,EAAAA,SAAS,CAAC4F,IAAI,CACvE,IACF,CAAC,CAAA,YAAA,EAAeD,OAAO,CAAA,CAAE,EACzB3F,SAAS,CAAC6F,QAAQ,CAACF,OAAO,CAC5B,CAAC;AAED,IAAA,OAAOA,OAAO;AAChB;EAEA,IAAIG,MAAMA,GAAsC;IAC9C,MAAM;AAAEA,MAAAA,MAAM,GAAGtF;KAAgB,GAAG,IAAI,CAACoC,IAAI;AAE7C6B,IAAAA,MAAM,CACJ,CAA0DnE,uDAAAA,EAAAA,WAAW,CAACsF,IAAI,CACxE,IACF,CAAC,CAAA,YAAA,EAAeE,MAAM,CAAA,CAAE,EACxBxF,WAAW,CAACuF,QAAQ,CAACC,MAAM,CAC7B,CAAC;AAED,IAAA,OAAOA,MAAM;AACf;;AAEA;EACA,IAAIC,mBAAmBA,GAAW;IAChC,MAAM;MAAEN,YAAY;AAAE1B,MAAAA;KAAS,GAAG,IAAI,CAACnB,IAAI;IAE3C,MAAMoD,oBAAoB,GAAG,KAAK;;AAElC;AACA,IAAA,IAAIC,KAAK,GAAGR,YAAY,GAAG,cAAc,GAAG,EAAE;AAE9C,IAAA,IAAI,CAAC,IAAI,CAACP,YAAY,EAAE;AACtB;AACAe,MAAAA,KAAK,IAAI,CAAUlC,OAAAA,EAAAA,OAAO,CAAC7B,MAAM,CAAA,EAAA,EAAK8D,oBAAoB,CAAG,CAAA,CAAA;AAC/D,KAAC,MAAM;AACL;AACA,MAAA,KAAK,IAAIjD,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAG,IAAI,CAACmC,YAAY,CAAChD,MAAM,EAAEa,CAAC,EAAE,EAAE;AACjDkD,QAAAA,KAAK,IAAI,CAAI,CAAA,EAAA,IAAI,CAACf,YAAY,CAACnC,CAAC,CAAC,GAAG,IAAI,CAACmC,YAAY,CAACnC,CAAC,CAAC,GAAGiD,oBAAoB,CAAE,CAAA;AACnF;AACF;AAEA,IAAA,OAAOC,KAAK;AACd;EAEA,IAAIC,UAAUA,GAAW;AACvB,IAAA,MAAMC,OAAO,GAAG,CAAC,oBAAoB,CAAC;IAEtC,IAAI,IAAI,CAACT,SAAS,EAAE;AAClBS,MAAAA,OAAO,CAACC,IAAI,CAAC,6BAA6B,CAAC;AAC7C;IAEA,IAAI,IAAI,CAACT,OAAO,EAAE;MAChBQ,OAAO,CAACC,IAAI,CAAC,CAAA,4BAAA,EAA+B,IAAI,CAACT,OAAO,EAAE,CAAC;AAC7D;IAEA,IAAI,IAAI,CAACG,MAAM,EAAE;MACfK,OAAO,CAACC,IAAI,CAAC,CAAA,2BAAA,EAA8B,IAAI,CAACN,MAAM,EAAE,CAAC;AAC3D;AAEA,IAAA,IAAI,IAAI,CAACvC,WAAW,CAACU,mBAAmB,EAAE;AACxCkC,MAAAA,OAAO,CAACC,IAAI,CAAC,CAAA,0BAAA,CAA4B,CAAC;AAC5C;AAEA,IAAA,OAAOD,OAAO,CAACP,IAAI,CAAC,GAAG,CAAC;AAC1B;EAEA,IAAIS,eAAeA,GAAW;AAC5B,IAAA,MAAMF,OAAO,GAAG,CAAC,2BAA2B,CAAC;AAE7C,IAAA,IAAI,IAAI,CAACvD,IAAI,CAACxB,eAAe,EAAE;AAC7B+E,MAAAA,OAAO,CAACC,IAAI,CAAC,mCAAmC,CAAC;AACnD;IAEA,IAAI,IAAI,CAACE,oBAAoB,EAAE;AAC7BH,MAAAA,OAAO,CAACC,IAAI,CAAC,sCAAsC,CAAC;AACtD;AAEA,IAAA,OAAOD,OAAO,CAACP,IAAI,CAAC,GAAG,CAAC;AAC1B;AAEQW,EAAAA,mBAAmB,GAAGC,QAAQ,CAAEC,OAAuB,IAAK;IAClE,IAAI,CAACjD,cAAc,GAAG,MAAM;AAC1B;MACA,MAAMkD,aAAa,GAAG,CAAC;;AAEvB;MACA,IAAID,OAAO,CAACE,UAAU,GAAGD,aAAa,IAAI,CAAC,IAAI,CAACE,uBAAuB,EAAE;AACvE,QAAA,IAAI,IAAI,CAAChE,IAAI,CAACvB,oBAAoB,EAAE;UAClC,IAAI,CAACwF,oBAAoB,GAAG,IAAI;AAClC;QACA,IAAI,CAACD,uBAAuB,GAAG,IAAI;OACpC,MAAM,IAAIH,OAAO,CAACE,UAAU,KAAK,CAAC,IAAI,IAAI,CAACC,uBAAuB,EAAE;QACnE,IAAI,CAACC,oBAAoB,GAAG,KAAK;QACjC,IAAI,CAACD,uBAAuB,GAAG,KAAK;AACtC;;AAEA;MACA,MAAME,SAAS,GACbL,OAAO,CAACM,WAAW,GAAGN,OAAO,CAAC9E,WAAW,GAAG+E,aAAa;;AAE3D;AACA,MAAA,IAAID,OAAO,CAACE,UAAU,GAAGG,SAAS,EAAE;QAClC,IAAI,CAACE,wBAAwB,GAAG,IAAI;AACtC,OAAC,MAAM;QACL,IAAI,CAACA,wBAAwB,GAAG,KAAK;AACvC;;AAEA;AACA,MAAA,IAAIP,OAAO,CAACQ,SAAS,GAAG,CAAC,EAAE;AACzB,QAAA,IAAI,IAAI,CAACrE,IAAI,CAACxB,eAAe,EAAE;UAC7B,IAAI,CAACkF,oBAAoB,GAAG,IAAI;AAClC;QACA,IAAI,CAACY,sBAAsB,GAAG,IAAI;AACpC,OAAC,MAAM;AACL,QAAA,IAAI,IAAI,CAACtE,IAAI,CAACxB,eAAe,EAAE;UAC7B,IAAI,CAACkF,oBAAoB,GAAG,KAAK;AACnC;QACA,IAAI,CAACY,sBAAsB,GAAG,KAAK;AACrC;;AAEA;MACA,MAAMC,UAAU,GACdV,OAAO,CAACW,YAAY,GAAGX,OAAO,CAACjF,YAAY,GAAGkF,aAAa;;AAE7D;AACA,MAAA,IAAID,OAAO,CAACQ,SAAS,GAAGE,UAAU,EAAE;QAClC,IAAI,CAACE,yBAAyB,GAAG,IAAI;AACvC,OAAC,MAAM;QACL,IAAI,CAACA,yBAAyB,GAAG,KAAK;AACxC;KACD;IAEDZ,OAAO,CAACa,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC9D,cAAc,CAAC;IAEvD,MAAM+D,kBAAkB,GAAGA,MAAM;AAC/B,MAAA,IAAI,CAACC,yBAAyB,GAAGvG,4BAA4B,CAC3DwF,OAAO,EACP,IAAI,CAAC/C,aAAa,EAClBtC,eAAe,EACfC,oBACF,CAAC;AAED,MAAA,IAAIA,oBAAoB,EAAE;QACxB,IAAI,CAACoG,kBAAkB,GAAGtF,yBAAyB,CACjD,IAAI,CAACuB,aAAa,EAClB+B,YACF,CAAC;AACH;KACD;IAED,MAAM;AACJrE,MAAAA,eAAe,GAAG,KAAK;AACvBC,MAAAA,oBAAoB,GAAG,KAAK;AAC5BoE,MAAAA,YAAY,GAAG;KAChB,GAAG,IAAI,CAAC7C,IAAI;AAEb,IAAA,IAAI,CAACa,eAAe,GAAG,IAAIiE,cAAc,CAAEC,OAAO,IAAK;MACrDA,OAAO,CAAC5F,OAAO,CAAC,MAAM;AACpBwF,QAAAA,kBAAkB,EAAE;AACtB,OAAC,CAAC;AACJ,KAAC,CAAC;AAEF,IAAA,IAAI,CAAC9D,eAAe,CAACmE,OAAO,CAACnB,OAAO,CAAC;AAErCc,IAAAA,kBAAkB,EAAE;;AAEpB;AACA,IAAA,IAAId,OAAO,CAAC9E,WAAW,GAAG8E,OAAO,CAACM,WAAW,EAAE;MAC7C,IAAI,CAACC,wBAAwB,GAAG,IAAI;AACtC;;AAEA;AACA,IAAA,IAAIP,OAAO,CAACjF,YAAY,GAAGiF,OAAO,CAACW,YAAY,EAAE;MAC/C,IAAI,CAACC,yBAAyB,GAAG,IAAI;AACvC;AAEA,IAAA,OAAO,MAAM;MACXZ,OAAO,CAACoB,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAACrE,cAAc,CAAC;AAC1D,MAAA,IAAI,CAACC,eAAe,CAACqE,UAAU,EAAE;KAClC;AACH,GAAC,CAAC;AAEMC,EAAAA,WAAW,GAAGvB,QAAQ,CAAEC,OAAuB,IAAK;IAC1D,IAAI,CAAC/C,aAAa,GAAG+C,OAAO;AAC9B,GAAC,CAAC;EAGFuB,SAASA,CAAC5D,MAAc,EAAQ;AAC9B,IAAA,IAAI,IAAI,CAACW,OAAO,KAAKX,MAAM,EAAE;AAC3B;AACA,MAAA,IAAI,CAACa,UAAU,GACb,IAAI,CAACA,UAAU,KAAK/B,iCAAiC,CAACC,GAAG,GACrDD,iCAAiC,CAAC+E,IAAI,GACtC/E,iCAAiC,CAACC,GAAG;AAC7C,KAAC,MAAM;AACL;MACA,IAAI,CAAC4B,OAAO,GAAGX,MAAM;AACrB,MAAA,IAAI,CAACa,UAAU,GAAG/B,iCAAiC,CAACC,GAAG;AACzD;IAEA,MAAM;AAAE+E,MAAAA;KAAQ,GAAG,IAAI,CAACtF,IAAI;AAE5B,IAAA,IAAI,OAAOsF,MAAM,KAAK,UAAU,EAAE;MAChCA,MAAM,CAAC,IAAI,CAACnD,OAAO,EAAE,IAAI,CAACE,UAAU,CAAC;AACvC;AACF;AAAC,EAAA;IAAAkD,CAAA,CAAA,IAAA,CAAAzF,SAAA,EAAA,WAAA,EAAA,CAnBA0F,MAAM,CAAA,CAAA;AAAA;AAqBPC,EAAAA,yBAAyBA,CACvBC,QAAkD,EAClDC,YAAqB,EACf;IACN,MAAM;AAAEC,MAAAA;KAAmB,GAAG,IAAI,CAAC5F,IAAI;AAEvC,IAAA,IAAI,OAAO4F,iBAAiB,KAAK,UAAU,EAAE;AAE7CA,IAAAA,iBAAiB,CAAC;AAChBD,MAAAA,YAAY,EAAEA,YAAY;AAC1BE,MAAAA,wBAAwB,EAAEH,QAAQ;MAClCI,gBAAgB,EAAE,IAAI,CAACtF,eAAe,CAACuF,MAAM,CAAW,CAACC,GAAG,EAAEC,GAAG,KAAK;AACpE,QAAA,IAAIA,GAAG,CAACP,QAAQ,CAACQ,OAAO,EAAE;AACxBF,UAAAA,GAAG,CAACxC,IAAI,CAACyC,GAAG,CAACN,YAAY,CAAC;AAC5B;AACA,QAAA,OAAOK,GAAG;OACX,EAAE,EAAE,CAAC;MACNG,oBAAoB,EAAE,IAAI,CAAC3F,eAAe,CAACuF,MAAM,CAC/C,CACEC,GAAgE,EAChEC,GAAG,KACA;QACHD,GAAG,CAACxC,IAAI,CAAC;UACPmC,YAAY,EAAEM,GAAG,CAACN,YAAY;AAC9BS,UAAAA,UAAU,EAAEH,GAAG,CAACP,QAAQ,CAACQ;AAC3B,SAAC,CAAC;AACF,QAAA,OAAOF,GAAG;AACZ,OAAC,EACD,EACF;AACF,KAAC,CAAC;AACJ;AAGAK,EAAAA,oBAAoBA,GAAS;AAC3B,IAAA,IAAI,CAAC7F,eAAe,CAACrB,OAAO,CAAE8G,GAAG,IAAK;MACpCA,GAAG,CAACP,QAAQ,CAACQ,OAAO,GAAG,IAAI,CAACI,kBAAkB,EAAEJ,OAAO,IAAI,KAAK;AAClE,KAAC,CAAC;IACF,IAAI,CAACK,4BAA4B,GAC/B,IAAI,CAACD,kBAAkB,EAAEJ,OAAO,IAAI,KAAK;IAC3C,IAAI,CAACT,yBAAyB,CAAC,IAAI,CAACa,kBAAkB,EAAE,KAAK,CAAC;AAChE;AAAC,EAAA;IAAAf,CAAA,CAAA,IAAA,CAAAzF,SAAA,EAAA,sBAAA,EAAA,CARA0F,MAAM,CAAA,CAAA;AAAA;AAWPgB,EAAAA,oBAAoBA,CAClBd,QAAkD,EAClDC,YAAqB,EACf;IACN,IAAI,CAACc,iBAAiB,EAAE;AACxB,IAAA,IAAI,CAAChB,yBAAyB,CAACC,QAAQ,EAAEC,YAAY,CAAC;AACxD;AAAC,EAAA;IAAAJ,CAAA,CAAA,IAAA,CAAAzF,SAAA,EAAA,sBAAA,EAAA,CAPA0F,MAAM,CAAA,CAAA;AAAA;EAUPkB,0BAA0BA,CACxBhB,QAAiD,EAC3C;IACN,IAAI,CAACY,kBAAkB,GAAGZ,QAAQ;AACpC;AAAC,EAAA;IAAAH,CAAA,CAAA,IAAA,CAAAzF,SAAA,EAAA,4BAAA,EAAA,CALA0F,MAAM,CAAA,CAAA;AAAA;AAQPmB,EAAAA,4BAA4BA,GAAS;IACnC,IAAI,CAACL,kBAAkB,GAAGpG,SAAS;AACrC;AAAC,EAAA;IAAAqF,CAAA,CAAA,IAAA,CAAAzF,SAAA,EAAA,8BAAA,EAAA,CAHA0F,MAAM,CAAA,CAAA;AAAA;AAMPoB,EAAAA,oBAAoBA,CAClBlB,QAAiD,EACjDC,YAAqB,EACf;AACN,IAAA,IAAIA,YAAY,EAAE;AAChB,MAAA,IAAI,CAACnF,eAAe,CAACgD,IAAI,CAAC;QAAEmC,YAAY;AAAED,QAAAA;AAAS,OAAC,CAAC;AACvD;IACA,IAAI,CAACe,iBAAiB,EAAE;AAC1B;AAAC,EAAA;IAAAlB,CAAA,CAAA,IAAA,CAAAzF,SAAA,EAAA,sBAAA,EAAA,CATA0F,MAAM,CAAA,CAAA;AAAA;EAYPqB,sBAAsBA,CAAClB,YAAqB,EAAQ;AAClD,IAAA,IAAI,CAACnF,eAAe,GAAG,IAAI,CAACA,eAAe,CAACe,MAAM,CAC/C0E,GAAG,IAAKA,GAAG,CAACN,YAAY,KAAKA,YAChC,CAAC;IACD,IAAI,CAACc,iBAAiB,EAAE;AAC1B;AAAC,EAAA;IAAAlB,CAAA,CAAA,IAAA,CAAAzF,SAAA,EAAA,wBAAA,EAAA,CANA0F,MAAM,CAAA,CAAA;AAAA;AASPiB,EAAAA,iBAAiBA,GAAS;IACxB,IAAI,IAAI,CAACH,kBAAkB,EAAE;AAC3B,MAAA,MAAMQ,mBAAmB,GAAG,IAAI,CAACtG,eAAe,CAAClB,MAAM;AACvD,MAAA,MAAMyH,iBAAiB,GAAG,IAAI,CAACvG,eAAe,CAACe,MAAM,CAClD0E,GAAG,IAAKA,GAAG,CAACP,QAAQ,CAACQ,OACxB,CAAC,CAAC5G,MAAM;AAER,MAAA,IAAI,CAACgH,kBAAkB,CAACJ,OAAO,GAC7Ba,iBAAiB,KAAKD,mBAAmB;MAC3C,IAAI,CAACR,kBAAkB,CAACU,aAAa,GACnCD,iBAAiB,GAAG,CAAC,IAAIA,iBAAiB,GAAGD,mBAAmB;AAClE,MAAA,IAAI,CAACP,4BAA4B,GAAG,IAAI,CAACD,kBAAkB,CAACJ,OAAO;AACrE;AACF;AAAC,EAAA;IAAAX,CAAA,CAAA,IAAA,CAAAzF,SAAA,EAAA,mBAAA,EAAA,CAdA0F,MAAM,CAAA,CAAA;AAAA;AAeT;AAACyB,oBAAA,CAAAC,QAAA,EA3coBvH,gBAAgB,CAAA;;;;"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/hds/advanced-table/index.ts"],"sourcesContent":["/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { action } from '@ember/object';\nimport { assert } from '@ember/debug';\nimport { tracked } from '@glimmer/tracking';\nimport type { ComponentLike } from '@glint/template';\nimport { guidFor } from '@ember/object/internals';\nimport { modifier } from 'ember-modifier';\nimport type Owner from '@ember/owner';\n\nimport HdsAdvancedTableTableModel from './models/table.ts';\nimport {\n HdsAdvancedTableDensityValues,\n HdsAdvancedTableThSortOrderValues,\n HdsAdvancedTableVerticalAlignmentValues,\n} from './types.ts';\nimport type {\n HdsAdvancedTableColumn,\n HdsAdvancedTableDensities,\n HdsAdvancedTableHorizontalAlignment,\n HdsAdvancedTableOnSelectionChangeSignature,\n HdsAdvancedTableSelectableRow,\n HdsAdvancedTableSortingFunction,\n HdsAdvancedTableThSortOrder,\n HdsAdvancedTableVerticalAlignment,\n HdsAdvancedTableModel,\n HdsAdvancedTableExpandState,\n} from './types.ts';\nimport type { HdsFormCheckboxBaseSignature } from '../form/checkbox/base.ts';\nimport type { HdsAdvancedTableTdSignature } from './td.ts';\nimport type { HdsAdvancedTableThSignature } from './th.ts';\nimport type { HdsAdvancedTableTrSignature } from './tr.ts';\n\nexport const DENSITIES: HdsAdvancedTableDensities[] = Object.values(\n HdsAdvancedTableDensityValues\n);\nexport const DEFAULT_DENSITY = HdsAdvancedTableDensityValues.Medium;\n\nexport const VALIGNMENTS: HdsAdvancedTableVerticalAlignment[] = Object.values(\n HdsAdvancedTableVerticalAlignmentValues\n);\nexport const DEFAULT_VALIGN = HdsAdvancedTableVerticalAlignmentValues.Top;\n\nconst DEFAULT_SCROLL_DIMENSIONS = {\n bottom: '0px',\n height: '0px',\n left: '0px',\n right: '0px',\n top: '0px',\n width: '0px',\n};\n\nconst getScrollIndicatorDimensions = (\n scrollWrapper: HTMLDivElement,\n theadElement: HTMLDivElement,\n hasStickyHeader: boolean,\n hasStickyFirstColumn: boolean\n) => {\n const horizontalScrollBarHeight =\n scrollWrapper.offsetHeight - scrollWrapper.clientHeight;\n const verticalScrollBarWidth =\n scrollWrapper.offsetWidth - scrollWrapper.clientWidth;\n\n let leftOffset = 0;\n\n if (hasStickyFirstColumn) {\n const stickyColumnHeaders = theadElement.querySelectorAll(\n '.hds-advanced-table__th--is-sticky-column'\n );\n\n stickyColumnHeaders?.forEach((el) => {\n // querySelectorAll returns Elements, which don't have offsetWidth\n // need to use offsetWidth to account for the cell borders\n const elAsHTMLElement = el as HTMLElement;\n leftOffset += elAsHTMLElement.offsetWidth;\n });\n\n // offsets the left: -1px position if there are multiple sticky columns\n if (stickyColumnHeaders.length > 1) {\n leftOffset -= 1;\n }\n }\n\n return {\n bottom: `${horizontalScrollBarHeight}px`,\n height: `${scrollWrapper.offsetHeight - horizontalScrollBarHeight}px`,\n left: `${leftOffset}px`,\n right: `${verticalScrollBarWidth}px`,\n top: hasStickyHeader ? `${theadElement.offsetHeight}px` : '0px',\n width: `${scrollWrapper.offsetWidth - verticalScrollBarWidth}px`,\n };\n};\n\nconst getStickyColumnLeftOffset = (\n theadElement: HTMLDivElement,\n hasRowSelection: boolean\n) => {\n // if there is no select checkbox column, the sticky column is all the way to the left\n if (!hasRowSelection) return '0px';\n\n const selectableCell = theadElement.querySelector(\n '.hds-advanced-table__th--is-selectable'\n ) as HTMLElement;\n\n return `${selectableCell?.offsetWidth}px`;\n};\n\nexport interface HdsAdvancedTableSignature {\n Args: {\n align?: HdsAdvancedTableHorizontalAlignment;\n caption?: string;\n columns: HdsAdvancedTableColumn[];\n density?: HdsAdvancedTableDensities;\n identityKey?: string;\n isSelectable?: boolean;\n isStriped?: boolean;\n model: HdsAdvancedTableModel;\n onSelectionChange?: (\n selection: HdsAdvancedTableOnSelectionChangeSignature\n ) => void;\n onSort?: (sortBy: string, sortOrder: HdsAdvancedTableThSortOrder) => void;\n selectionAriaLabelSuffix?: string;\n sortBy?: string;\n selectableColumnKey?: string;\n sortedMessageText?: string;\n sortOrder?: HdsAdvancedTableThSortOrder;\n valign?: HdsAdvancedTableVerticalAlignment;\n hasStickyHeader?: boolean;\n hasStickyFirstColumn?: boolean;\n childrenKey?: string;\n maxHeight?: string;\n };\n Blocks: {\n body?: [\n {\n Td?: ComponentLike<HdsAdvancedTableTdSignature>;\n Tr?: ComponentLike<HdsAdvancedTableTrSignature>;\n Th?: ComponentLike<HdsAdvancedTableThSignature>;\n data?: Record<string, unknown>;\n rowIndex?: number | string;\n isOpen?: HdsAdvancedTableExpandState;\n },\n ];\n };\n Element: HTMLDivElement;\n}\n\nexport default class HdsAdvancedTable extends Component<HdsAdvancedTableSignature> {\n @tracked private _sortBy = this.args.sortBy ?? undefined;\n @tracked private _sortOrder =\n this.args.sortOrder || HdsAdvancedTableThSortOrderValues.Asc;\n @tracked\n private _selectAllCheckbox?: HdsFormCheckboxBaseSignature['Element'] =\n undefined;\n @tracked private _isSelectAllCheckboxSelected?: boolean = undefined;\n private _selectableRows: HdsAdvancedTableSelectableRow[] = [];\n private _captionId = 'caption-' + guidFor(this);\n private _tableModel!: HdsAdvancedTableTableModel;\n private _scrollHandler!: (event: Event) => void;\n private _resizeObserver!: ResizeObserver;\n private _theadElement!: HTMLDivElement;\n\n @tracked scrollIndicatorDimensions = DEFAULT_SCROLL_DIMENSIONS;\n @tracked isStickyColumnPinned = false;\n @tracked isStickyHeaderPinned = false;\n @tracked showScrollIndicatorLeft = false;\n @tracked showScrollIndicatorRight = false;\n @tracked showScrollIndicatorTop = false;\n @tracked showScrollIndicatorBottom = false;\n @tracked stickyColumnOffset = '0px';\n\n constructor(owner: Owner, args: HdsAdvancedTableSignature['Args']) {\n super(owner, args);\n\n const { model, childrenKey, columns, hasStickyFirstColumn } = args;\n\n this._tableModel = new HdsAdvancedTableTableModel({\n model,\n childrenKey,\n });\n\n if (this._tableModel.hasRowsWithChildren) {\n const sortableColumns = columns.filter((column) => column.isSortable);\n const sortableColumnLabels = sortableColumns.map(\n (column) => column.label\n );\n\n assert(\n `Cannot have sortable columns if there are nested rows. Sortable columns are ${sortableColumnLabels.toString()}`,\n sortableColumns.length === 0\n );\n\n assert(\n 'Cannot have a sticky first column if there are nested rows.',\n !hasStickyFirstColumn\n );\n }\n }\n\n get getSortCriteria(): string | HdsAdvancedTableSortingFunction<unknown> {\n // get the current column\n const currentColumn = this.args?.columns?.find(\n (column) => column.key === this._sortBy\n );\n\n if (\n // check if there is a custom sorting function associated with the current `sortBy` column (we assume the column has `isSortable`)\n currentColumn?.sortingFunction &&\n typeof currentColumn.sortingFunction === 'function'\n ) {\n return currentColumn.sortingFunction;\n } else {\n // otherwise fallback to the default format \"sortBy:sortOrder\"\n return `${this._sortBy}:${this._sortOrder}`;\n }\n }\n\n get columnWidths(): string[] | undefined {\n const { columns } = this.args;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const widths: string[] = new Array(columns.length);\n let hasCustomColumnWidth = false;\n\n for (let i = 0; i < columns.length; i++) {\n const column = columns[i];\n\n if (column?.['width']) {\n widths[i] = column.width;\n if (!hasCustomColumnWidth) hasCustomColumnWidth = true;\n }\n }\n\n return hasCustomColumnWidth ? widths : undefined;\n }\n\n get identityKey(): string | undefined {\n // we have to provide a way for the consumer to pass undefined because Ember tries to interpret undefined as missing an arg and therefore falls back to the default\n if (this.args.identityKey === 'none') {\n return undefined;\n } else {\n return this.args.identityKey ?? '@identity';\n }\n }\n\n get childrenKey(): string {\n const { childrenKey = 'children' } = this.args;\n\n return childrenKey;\n }\n\n get hasScrollIndicator(): boolean {\n if (this.args.hasStickyFirstColumn) {\n return true;\n }\n\n return false;\n }\n\n get sortedMessageText(): string {\n if (this.args.sortedMessageText) {\n return this.args.sortedMessageText;\n } else if (this._sortBy && this._sortOrder) {\n // we should allow the user to define a custom value here (e.g., for i18n) - tracked with HDS-965\n return `Sorted by ${this._sortBy} ${this._sortOrder}ending`;\n } else {\n return '';\n }\n }\n\n get isSelectable(): boolean {\n const { isSelectable = false } = this.args;\n\n if (this._tableModel.hasRowsWithChildren) {\n assert(\n '@isSelectable must not be true if there are nested rows.',\n !isSelectable\n );\n return isSelectable;\n }\n\n return isSelectable;\n }\n\n get isStriped(): boolean {\n const { isStriped = false } = this.args;\n\n if (this._tableModel.hasRowsWithChildren) {\n assert(\n '@isStriped must not be true if there are nested rows.',\n !isStriped\n );\n return isStriped;\n }\n\n return isStriped;\n }\n\n get density(): HdsAdvancedTableDensities {\n const { density = DEFAULT_DENSITY } = this.args;\n\n assert(\n `@density for \"Hds::Table\" must be one of the following: ${DENSITIES.join(\n ', '\n )}; received: ${density}`,\n DENSITIES.includes(density)\n );\n\n return density;\n }\n\n get hasStickyHeader(): boolean {\n if (this.args.maxHeight && this.args.hasStickyHeader !== false) {\n return true;\n } else if (this.args.hasStickyHeader && !this.args.maxHeight) {\n assert('Must set @maxHeight to use @hasStickyHeader.', false);\n }\n\n return false;\n }\n\n get valign(): HdsAdvancedTableVerticalAlignment {\n const { valign = DEFAULT_VALIGN } = this.args;\n\n assert(\n `@valign for \"Hds::Table\" must be one of the following: ${VALIGNMENTS.join(\n ', '\n )}; received: ${valign}`,\n VALIGNMENTS.includes(valign)\n );\n\n return valign;\n }\n\n // returns the grid-template-columns CSS attribute for the grid\n get gridTemplateColumns(): string {\n const { isSelectable, columns } = this.args;\n\n const DEFAULT_COLUMN_WIDTH = '1fr';\n\n // if there is a select checkbox, the first column has a 'min-content' width to hug the checkbox content\n let style = isSelectable ? 'min-content ' : '';\n\n if (!this.columnWidths) {\n // if there are no custom column widths, each column is the same width and they take up the available space\n style += `repeat(${columns.length}, ${DEFAULT_COLUMN_WIDTH})`;\n } else {\n // check the custom column widths, if the current column has a custom width use the custom width. otherwise take the available space.\n for (let i = 0; i < this.columnWidths.length; i++) {\n style += ` ${this.columnWidths[i] ? this.columnWidths[i] : DEFAULT_COLUMN_WIDTH}`;\n }\n }\n\n return style;\n }\n\n get classNames(): string {\n const classes = ['hds-advanced-table'];\n\n if (this.isStriped) {\n classes.push('hds-advanced-table--striped');\n }\n\n if (this.density) {\n classes.push(`hds-advanced-table--density-${this.density}`);\n }\n\n if (this.valign) {\n classes.push(`hds-advanced-table--valign-${this.valign}`);\n }\n\n if (this._tableModel.hasRowsWithChildren) {\n classes.push(`hds-advanced-table--nested`);\n }\n\n return classes.join(' ');\n }\n\n get theadClassNames(): string {\n const classes = ['hds-advanced-table__thead'];\n\n if (this.hasStickyHeader) {\n classes.push('hds-advanced-table__thead--sticky');\n }\n\n if (this.isStickyHeaderPinned) {\n classes.push('hds-advanced-table__thead--is-pinned');\n }\n\n return classes.join(' ');\n }\n\n private _setUpScrollWrapper = modifier((element: HTMLDivElement) => {\n this._scrollHandler = () => {\n // 6px as a buffer so the shadow doesn't appear over the border radius on the edge of the table\n const SCROLL_BUFFER = 6;\n\n // left scroll indicator and sticky column styles\n if (element.scrollLeft > SCROLL_BUFFER && !this.showScrollIndicatorLeft) {\n if (this.args.hasStickyFirstColumn) {\n this.isStickyColumnPinned = true;\n }\n this.showScrollIndicatorLeft = true;\n } else if (element.scrollLeft === 0 && this.showScrollIndicatorLeft) {\n this.isStickyColumnPinned = false;\n this.showScrollIndicatorLeft = false;\n }\n\n // the right edge is how far the user can scroll, which is the full width of the table - the visible section of the table (also subtract the buffer)\n const rightEdge =\n element.scrollWidth - element.clientWidth - SCROLL_BUFFER;\n\n // right scroll indicator\n if (element.scrollLeft < rightEdge) {\n this.showScrollIndicatorRight = true;\n } else {\n this.showScrollIndicatorRight = false;\n }\n\n // sticky header\n if (element.scrollTop > 0) {\n if (this.hasStickyHeader) {\n this.isStickyHeaderPinned = true;\n }\n this.showScrollIndicatorTop = true;\n } else {\n if (this.hasStickyHeader) {\n this.isStickyHeaderPinned = false;\n }\n this.showScrollIndicatorTop = false;\n }\n\n // the bottom edge is how far the user can scroll, which is the full height of the table - the visible section of the table (also subtract the buffer)\n const bottomEdge =\n element.scrollHeight - element.clientHeight - SCROLL_BUFFER;\n\n // bottom scroll indicator\n if (element.scrollTop < bottomEdge) {\n this.showScrollIndicatorBottom = true;\n } else {\n this.showScrollIndicatorBottom = false;\n }\n };\n\n element.addEventListener('scroll', this._scrollHandler);\n\n const updateMeasurements = () => {\n this.scrollIndicatorDimensions = getScrollIndicatorDimensions(\n element,\n this._theadElement,\n this.hasStickyHeader,\n hasStickyFirstColumn\n );\n\n if (hasStickyFirstColumn) {\n this.stickyColumnOffset = getStickyColumnLeftOffset(\n this._theadElement,\n isSelectable\n );\n }\n };\n\n const { hasStickyFirstColumn = false, isSelectable = false } = this.args;\n\n this._resizeObserver = new ResizeObserver((entries) => {\n entries.forEach(() => {\n updateMeasurements();\n });\n });\n\n this._resizeObserver.observe(element);\n\n updateMeasurements();\n\n // on render check if should show right scroll indicator\n if (element.clientWidth < element.scrollWidth) {\n this.showScrollIndicatorRight = true;\n }\n\n // on render check if should show bottom scroll indicator\n if (element.clientHeight < element.scrollHeight) {\n this.showScrollIndicatorBottom = true;\n }\n\n return () => {\n element.removeEventListener('scroll', this._scrollHandler);\n this._resizeObserver.disconnect();\n };\n });\n\n private _setUpThead = modifier((element: HTMLDivElement) => {\n this._theadElement = element;\n });\n\n @action\n setSortBy(column: string): void {\n if (this._sortBy === column) {\n // check to see if the column is already sorted and invert the sort order if so\n this._sortOrder =\n this._sortOrder === HdsAdvancedTableThSortOrderValues.Asc\n ? HdsAdvancedTableThSortOrderValues.Desc\n : HdsAdvancedTableThSortOrderValues.Asc;\n } else {\n // otherwise, set the sort order to ascending\n this._sortBy = column;\n this._sortOrder = HdsAdvancedTableThSortOrderValues.Asc;\n }\n\n const { onSort } = this.args;\n\n if (typeof onSort === 'function') {\n onSort(this._sortBy, this._sortOrder);\n }\n }\n\n onSelectionChangeCallback(\n checkbox?: HdsFormCheckboxBaseSignature['Element'],\n selectionKey?: string\n ): void {\n const { onSelectionChange } = this.args;\n\n if (typeof onSelectionChange !== 'function') return;\n\n onSelectionChange({\n selectionKey: selectionKey,\n selectionCheckboxElement: checkbox,\n selectedRowsKeys: this._selectableRows.reduce<string[]>((acc, row) => {\n if (row.checkbox.checked) {\n acc.push(row.selectionKey);\n }\n return acc;\n }, []),\n selectableRowsStates: this._selectableRows.reduce(\n (\n acc: { selectionKey: string; isSelected: boolean | undefined }[],\n row\n ) => {\n acc.push({\n selectionKey: row.selectionKey,\n isSelected: row.checkbox.checked,\n });\n return acc;\n },\n []\n ),\n });\n }\n\n @action\n onSelectionAllChange(): void {\n this._selectableRows.forEach((row) => {\n row.checkbox.checked = this._selectAllCheckbox?.checked ?? false;\n });\n this._isSelectAllCheckboxSelected =\n this._selectAllCheckbox?.checked ?? false;\n this.onSelectionChangeCallback(this._selectAllCheckbox, 'all');\n }\n\n @action\n onSelectionRowChange(\n checkbox?: HdsFormCheckboxBaseSignature['Element'],\n selectionKey?: string\n ): void {\n this.setSelectAllState();\n this.onSelectionChangeCallback(checkbox, selectionKey);\n }\n\n @action\n didInsertSelectAllCheckbox(\n checkbox: HdsFormCheckboxBaseSignature['Element']\n ): void {\n this._selectAllCheckbox = checkbox;\n }\n\n @action\n willDestroySelectAllCheckbox(): void {\n this._selectAllCheckbox = undefined;\n }\n\n @action\n didInsertRowCheckbox(\n checkbox: HdsFormCheckboxBaseSignature['Element'],\n selectionKey?: string\n ): void {\n if (selectionKey) {\n this._selectableRows.push({ selectionKey, checkbox });\n }\n this.setSelectAllState();\n }\n\n @action\n willDestroyRowCheckbox(selectionKey?: string): void {\n this._selectableRows = this._selectableRows.filter(\n (row) => row.selectionKey !== selectionKey\n );\n this.setSelectAllState();\n }\n\n @action\n setSelectAllState(): void {\n if (this._selectAllCheckbox) {\n const selectableRowsCount = this._selectableRows.length;\n const selectedRowsCount = this._selectableRows.filter(\n (row) => row.checkbox.checked\n ).length;\n\n this._selectAllCheckbox.checked =\n selectedRowsCount === selectableRowsCount;\n this._selectAllCheckbox.indeterminate =\n selectedRowsCount > 0 && selectedRowsCount < selectableRowsCount;\n this._isSelectAllCheckboxSelected = this._selectAllCheckbox.checked;\n }\n }\n}\n"],"names":["DENSITIES","Object","values","HdsAdvancedTableDensityValues","DEFAULT_DENSITY","Medium","VALIGNMENTS","HdsAdvancedTableVerticalAlignmentValues","DEFAULT_VALIGN","Top","DEFAULT_SCROLL_DIMENSIONS","bottom","height","left","right","top","width","getScrollIndicatorDimensions","scrollWrapper","theadElement","hasStickyHeader","hasStickyFirstColumn","horizontalScrollBarHeight","offsetHeight","clientHeight","verticalScrollBarWidth","offsetWidth","clientWidth","leftOffset","stickyColumnHeaders","querySelectorAll","forEach","el","elAsHTMLElement","length","getStickyColumnLeftOffset","hasRowSelection","selectableCell","querySelector","HdsAdvancedTable","Component","g","prototype","tracked","args","sortBy","undefined","i","void 0","sortOrder","HdsAdvancedTableThSortOrderValues","Asc","_selectableRows","_captionId","guidFor","_tableModel","_scrollHandler","_resizeObserver","_theadElement","constructor","owner","model","childrenKey","columns","HdsAdvancedTableTableModel","hasRowsWithChildren","sortableColumns","filter","column","isSortable","sortableColumnLabels","map","label","assert","toString","getSortCriteria","currentColumn","find","key","_sortBy","sortingFunction","_sortOrder","columnWidths","widths","Array","hasCustomColumnWidth","identityKey","hasScrollIndicator","sortedMessageText","isSelectable","isStriped","density","join","includes","maxHeight","valign","gridTemplateColumns","DEFAULT_COLUMN_WIDTH","style","classNames","classes","push","theadClassNames","isStickyHeaderPinned","_setUpScrollWrapper","modifier","element","SCROLL_BUFFER","scrollLeft","showScrollIndicatorLeft","isStickyColumnPinned","rightEdge","scrollWidth","showScrollIndicatorRight","scrollTop","showScrollIndicatorTop","bottomEdge","scrollHeight","showScrollIndicatorBottom","addEventListener","updateMeasurements","scrollIndicatorDimensions","stickyColumnOffset","ResizeObserver","entries","observe","removeEventListener","disconnect","_setUpThead","setSortBy","Desc","onSort","n","action","onSelectionChangeCallback","checkbox","selectionKey","onSelectionChange","selectionCheckboxElement","selectedRowsKeys","reduce","acc","row","checked","selectableRowsStates","isSelected","onSelectionAllChange","_selectAllCheckbox","_isSelectAllCheckboxSelected","onSelectionRowChange","setSelectAllState","didInsertSelectAllCheckbox","willDestroySelectAllCheckbox","didInsertRowCheckbox","willDestroyRowCheckbox","selectableRowsCount","selectedRowsCount","indeterminate","setComponentTemplate","TEMPLATE"],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ import { action } from '@ember/object';
|
|
|
3
3
|
import { guidFor } from '@ember/object/internals';
|
|
4
4
|
import { tracked } from '@glimmer/tracking';
|
|
5
5
|
import { registerDestructor } from '@ember/destroyable';
|
|
6
|
+
import { hdsBreakpoints } from '@hashicorp/design-system-components/utils/hds-breakpoints';
|
|
6
7
|
import { precompileTemplate } from '@ember/template-compilation';
|
|
7
8
|
import { g, i, n } from 'decorator-transforms/runtime';
|
|
8
9
|
import { setComponentTemplate } from '@ember/component';
|
|
@@ -39,8 +40,9 @@ class HdsAppHeader extends Component {
|
|
|
39
40
|
|
|
40
41
|
// Generates a unique ID for the Menu Content
|
|
41
42
|
_menuContentId = 'hds-menu-content-' + guidFor(this);
|
|
42
|
-
|
|
43
|
-
|
|
43
|
+
|
|
44
|
+
// we use the `lg` breakpoint for `desktop` viewports, but consumers can override its value
|
|
45
|
+
_desktopMQVal = this.args.breakpoint ?? hdsBreakpoints['lg'].px;
|
|
44
46
|
constructor(owner, args) {
|
|
45
47
|
super(owner, args);
|
|
46
48
|
this._desktopMQ = window.matchMedia(`(min-width: ${this._desktopMQVal})`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../src/components/hds/app-header/index.ts"],"sourcesContent":["/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { action } from '@ember/object';\nimport { guidFor } from '@ember/object/internals';\nimport { tracked } from '@glimmer/tracking';\nimport { registerDestructor } from '@ember/destroyable';\nimport type Owner from '@ember/owner';\n\nexport interface HdsAppHeaderSignature {\n Args: {\n breakpoint?: string;\n hasA11yRefocus?: boolean;\n a11yRefocusSkipTo?: string;\n a11yRefocusSkipText?: string;\n a11yRefocusNavigationText?: string;\n a11yRefocusRouteChangeValidator?: string;\n a11yRefocusExcludeAllQueryParams?: boolean;\n };\n Blocks: {\n logo?: [];\n globalActions?: [];\n utilityActions?: [];\n };\n Element: HTMLDivElement;\n}\n\nexport default class HdsAppHeader extends Component<HdsAppHeaderSignature> {\n @tracked private _isOpen = false;\n @tracked private _isDesktop = true;\n @tracked private _hasOverflowContent = false;\n private _desktopMQ: MediaQueryList;\n hasA11yRefocus = this.args.hasA11yRefocus ?? true;\n a11yRefocusSkipTo = '#' + (this.args.a11yRefocusSkipTo ?? 'hds-main');\n\n // Generates a unique ID for the Menu Content\n private _menuContentId = 'hds-menu-content-' + guidFor(this);\n\n
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../src/components/hds/app-header/index.ts"],"sourcesContent":["/**\n * Copyright (c) HashiCorp, Inc.\n * SPDX-License-Identifier: MPL-2.0\n */\n\nimport Component from '@glimmer/component';\nimport { action } from '@ember/object';\nimport { guidFor } from '@ember/object/internals';\nimport { tracked } from '@glimmer/tracking';\nimport { registerDestructor } from '@ember/destroyable';\nimport type Owner from '@ember/owner';\n\nimport { hdsBreakpoints } from '@hashicorp/design-system-components/utils/hds-breakpoints';\n\nexport interface HdsAppHeaderSignature {\n Args: {\n breakpoint?: string;\n hasA11yRefocus?: boolean;\n a11yRefocusSkipTo?: string;\n a11yRefocusSkipText?: string;\n a11yRefocusNavigationText?: string;\n a11yRefocusRouteChangeValidator?: string;\n a11yRefocusExcludeAllQueryParams?: boolean;\n };\n Blocks: {\n logo?: [];\n globalActions?: [];\n utilityActions?: [];\n };\n Element: HTMLDivElement;\n}\n\nexport default class HdsAppHeader extends Component<HdsAppHeaderSignature> {\n @tracked private _isOpen = false;\n @tracked private _isDesktop = true;\n @tracked private _hasOverflowContent = false;\n private _desktopMQ: MediaQueryList;\n hasA11yRefocus = this.args.hasA11yRefocus ?? true;\n a11yRefocusSkipTo = '#' + (this.args.a11yRefocusSkipTo ?? 'hds-main');\n\n // Generates a unique ID for the Menu Content\n private _menuContentId = 'hds-menu-content-' + guidFor(this);\n\n // we use the `lg` breakpoint for `desktop` viewports, but consumers can override its value\n private _desktopMQVal = this.args.breakpoint ?? hdsBreakpoints['lg'].px;\n\n constructor(owner: Owner, args: Record<string, never>) {\n super(owner, args);\n this._desktopMQ = window.matchMedia(`(min-width: ${this._desktopMQVal})`);\n this.addEventListeners();\n registerDestructor(this, (): void => {\n this.removeEventListeners();\n });\n }\n\n addEventListeners(): void {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n document.addEventListener('keydown', this.escapePress, true);\n this._desktopMQ.addEventListener(\n 'change',\n // eslint-disable-next-line @typescript-eslint/unbound-method\n this.updateDesktopVariable,\n true\n );\n\n // set initial state based on viewport using a \"synthetic\" event\n const syntheticEvent = new MediaQueryListEvent('change', {\n matches: this._desktopMQ.matches,\n media: this._desktopMQ.media,\n });\n this.updateDesktopVariable(syntheticEvent);\n }\n\n removeEventListeners(): void {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n document.removeEventListener('keydown', this.escapePress, true);\n this._desktopMQ.removeEventListener(\n 'change',\n // eslint-disable-next-line @typescript-eslint/unbound-method\n this.updateDesktopVariable,\n true\n );\n }\n\n // In mobile view when the menu is open, trap focus within the AppHeader\n get shouldTrapFocus(): boolean {\n return !this._isDesktop && this._isOpen;\n }\n\n // Get the class names to apply to the component.\n get classNames(): string {\n const classes = ['hds-app-header'];\n\n if (this._isDesktop) {\n classes.push('hds-app-header--is-desktop');\n } else {\n classes.push('hds-app-header--is-mobile');\n\n // open and closed menu states are only relevant on mobile\n if (this._isOpen) {\n classes.push('hds-app-header--menu-is-open');\n } else {\n classes.push('hds-app-header--menu-is-closed');\n }\n }\n\n return classes.join(' ');\n }\n\n @action\n escapePress(event: KeyboardEvent): void {\n if (event.key === 'Escape' && this._isOpen && !this._isDesktop) {\n this._isOpen = false;\n }\n }\n\n @action\n onClickToggle(): void {\n this._isOpen = !this._isOpen;\n }\n\n @action\n updateDesktopVariable(event: MediaQueryListEvent): void {\n this._isDesktop = event.matches;\n\n // Close the menu when switching to desktop view\n // (prevents menu from being open when resizing which causes Skip button to not render)\n if (this._isDesktop) {\n this._isOpen = false;\n }\n }\n}\n"],"names":["HdsAppHeader","Component","g","prototype","tracked","i","void 0","_desktopMQ","hasA11yRefocus","args","a11yRefocusSkipTo","_menuContentId","guidFor","_desktopMQVal","breakpoint","hdsBreakpoints","px","constructor","owner","window","matchMedia","addEventListeners","registerDestructor","removeEventListeners","document","addEventListener","escapePress","updateDesktopVariable","syntheticEvent","MediaQueryListEvent","matches","media","removeEventListener","shouldTrapFocus","_isDesktop","_isOpen","classNames","classes","push","join","event","key","n","action","onClickToggle","setComponentTemplate","TEMPLATE"],"mappings":"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"}
|
|
@@ -2,11 +2,13 @@ import Component from '@glimmer/component';
|
|
|
2
2
|
import { tracked } from '@glimmer/tracking';
|
|
3
3
|
import { action } from '@ember/object';
|
|
4
4
|
import { registerDestructor } from '@ember/destroyable';
|
|
5
|
+
import { modifier } from 'ember-modifier';
|
|
6
|
+
import { hdsBreakpoints } from '@hashicorp/design-system-components/utils/hds-breakpoints';
|
|
5
7
|
import { precompileTemplate } from '@ember/template-compilation';
|
|
6
8
|
import { g, i, n } from 'decorator-transforms/runtime';
|
|
7
9
|
import { setComponentTemplate } from '@ember/component';
|
|
8
10
|
|
|
9
|
-
var TEMPLATE = precompileTemplate("{{!\n Copyright (c) HashiCorp, Inc.\n SPDX-License-Identifier: MPL-2.0\n}}\n{{! IMPORTANT: we need to add \"squishies\" here (~) because otherwise the whitespace added by Ember causes the empty element to still have visible padding - See https://handlebarsjs.com/guide/expressions.html#whitespace-control }}\n<div\n class={{this.classNames}}\n ...attributes\n {{on \"transitionstart\" (fn this.setTransition \"start\")}}\n {{on \"transitionend\" (fn this.setTransition \"end\")}}\n {{! @glint-expect-error - https://github.com/josemarluedke/ember-focus-trap/issues/86 }}\n {{focus-trap isActive=this.shouldTrapFocus}}\n {{
|
|
11
|
+
var TEMPLATE = precompileTemplate("{{!\n Copyright (c) HashiCorp, Inc.\n SPDX-License-Identifier: MPL-2.0\n}}\n{{! IMPORTANT: we need to add \"squishies\" here (~) because otherwise the whitespace added by Ember causes the empty element to still have visible padding - See https://handlebarsjs.com/guide/expressions.html#whitespace-control }}\n<div\n class={{this.classNames}}\n ...attributes\n {{on \"transitionstart\" (fn this.setTransition \"start\")}}\n {{on \"transitionend\" (fn this.setTransition \"end\")}}\n {{! @glint-expect-error - https://github.com/josemarluedke/ember-focus-trap/issues/86 }}\n {{focus-trap isActive=this.shouldTrapFocus}}\n {{this._setUpBodyElement}}\n>\n <h2 class=\"sr-only\" id=\"hds-app-side-nav-header\">Application local navigation</h2>\n\n <div class=\"hds-app-side-nav__wrapper\">\n {{#if this.showToggleButton}}\n {{! template-lint-disable no-invalid-interactive}}\n <div class=\"hds-app-side-nav__overlay\" {{on \"click\" this.toggleMinimizedStatus}} />\n {{! template-lint-enable no-invalid-interactive}}\n <Hds::AppSideNav::ToggleButton\n aria-labelledby=\"hds-app-side-nav-header\"\n aria-expanded={{if this._isMinimized \"false\" \"true\"}}\n @icon={{if this._isMinimized \"chevrons-right\" \"chevrons-left\"}}\n {{on \"click\" this.toggleMinimizedStatus}}\n />\n {{/if}}\n\n <div class=\"hds-app-side-nav__wrapper-body\" {{this._setUpNavWrapperBody}}>\n {{~yield~}}\n </div>\n </div>\n</div>");
|
|
10
12
|
|
|
11
13
|
/**
|
|
12
14
|
* Copyright (c) HashiCorp, Inc.
|
|
@@ -33,8 +35,10 @@ class HdsAppSideNav extends Component {
|
|
|
33
35
|
_body;
|
|
34
36
|
_bodyInitialOverflowValue = '';
|
|
35
37
|
_desktopMQ;
|
|
36
|
-
|
|
37
|
-
|
|
38
|
+
_navWrapperBody;
|
|
39
|
+
|
|
40
|
+
// we use the `lg` breakpoint for `desktop` viewports, but consumers can override its value
|
|
41
|
+
_desktopMQVal = this.args.breakpoint ?? hdsBreakpoints['lg'].px;
|
|
38
42
|
constructor(owner, args) {
|
|
39
43
|
super(owner, args);
|
|
40
44
|
this._isMinimized = this.args.isMinimized ?? false; // sets the default state on 'desktop' viewports
|
|
@@ -44,6 +48,14 @@ class HdsAppSideNav extends Component {
|
|
|
44
48
|
this.removeEventListeners();
|
|
45
49
|
});
|
|
46
50
|
}
|
|
51
|
+
_setUpBodyElement = modifier(() => {
|
|
52
|
+
this._body = document.body;
|
|
53
|
+
// Store the initial `overflow` value of `<body>` so we can reset to it
|
|
54
|
+
this._bodyInitialOverflowValue = this._body.style.getPropertyValue('overflow');
|
|
55
|
+
});
|
|
56
|
+
_setUpNavWrapperBody = modifier(element => {
|
|
57
|
+
this._navWrapperBody = element;
|
|
58
|
+
});
|
|
47
59
|
addEventListeners() {
|
|
48
60
|
// eslint-disable-next-line @typescript-eslint/unbound-method
|
|
49
61
|
document.addEventListener('keydown', this.escapePress, true);
|
|
@@ -106,13 +118,11 @@ class HdsAppSideNav extends Component {
|
|
|
106
118
|
return classes.join(' ');
|
|
107
119
|
}
|
|
108
120
|
synchronizeInert() {
|
|
109
|
-
this.
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
}
|
|
115
|
-
});
|
|
121
|
+
if (this._isMinimized) {
|
|
122
|
+
this._navWrapperBody?.setAttribute('inert', '');
|
|
123
|
+
} else {
|
|
124
|
+
this._navWrapperBody?.removeAttribute('inert');
|
|
125
|
+
}
|
|
116
126
|
}
|
|
117
127
|
lockBodyScroll() {
|
|
118
128
|
if (this._body) {
|
|
@@ -137,6 +147,7 @@ class HdsAppSideNav extends Component {
|
|
|
137
147
|
if (event.key === 'Escape' && !this._isMinimized && !this._isDesktop) {
|
|
138
148
|
this._isMinimized = true;
|
|
139
149
|
this.synchronizeInert();
|
|
150
|
+
this.unlockBodyScroll();
|
|
140
151
|
}
|
|
141
152
|
}
|
|
142
153
|
static {
|
|
@@ -151,24 +162,17 @@ class HdsAppSideNav extends Component {
|
|
|
151
162
|
if (typeof onToggleMinimizedStatus === 'function') {
|
|
152
163
|
onToggleMinimizedStatus(this._isMinimized);
|
|
153
164
|
}
|
|
154
|
-
if (this.
|
|
155
|
-
this.
|
|
156
|
-
|
|
157
|
-
|
|
165
|
+
if (!this._isDesktop) {
|
|
166
|
+
if (this._isMinimized) {
|
|
167
|
+
this.unlockBodyScroll();
|
|
168
|
+
} else {
|
|
169
|
+
this.lockBodyScroll();
|
|
170
|
+
}
|
|
158
171
|
}
|
|
159
172
|
}
|
|
160
173
|
static {
|
|
161
174
|
n(this.prototype, "toggleMinimizedStatus", [action]);
|
|
162
175
|
}
|
|
163
|
-
didInsert(element) {
|
|
164
|
-
this._containersToHide = element.querySelectorAll('.hds-app-side-nav-hide-when-minimized');
|
|
165
|
-
this._body = document.body;
|
|
166
|
-
// Store the initial `overflow` value of `<body>` so we can reset to it
|
|
167
|
-
this._bodyInitialOverflowValue = this._body.style.getPropertyValue('overflow');
|
|
168
|
-
}
|
|
169
|
-
static {
|
|
170
|
-
n(this.prototype, "didInsert", [action]);
|
|
171
|
-
}
|
|
172
176
|
setTransition(phase, event) {
|
|
173
177
|
// we only want to respond to `width` animation/transitions
|
|
174
178
|
if (event.propertyName !== 'width') {
|
|
@@ -189,6 +193,10 @@ class HdsAppSideNav extends Component {
|
|
|
189
193
|
// automatically minimize on narrow viewports (when not in desktop mode)
|
|
190
194
|
this._isMinimized = !this._isDesktop;
|
|
191
195
|
this.synchronizeInert();
|
|
196
|
+
if (this._isDesktop) {
|
|
197
|
+
// make sure scrolling is enabled if the user resizes the window from mobile to desktop
|
|
198
|
+
this.unlockBodyScroll();
|
|
199
|
+
}
|
|
192
200
|
const {
|
|
193
201
|
onDesktopViewportChange
|
|
194
202
|
} = this.args;
|