@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.
Files changed (27) hide show
  1. package/declarations/components/hds/advanced-table/index.d.ts +2 -0
  2. package/declarations/components/hds/app-header/index.d.ts +0 -1
  3. package/declarations/components/hds/app-side-nav/index.d.ts +4 -2
  4. package/declarations/components/hds/code-block/index.d.ts +6 -39
  5. package/declarations/utils/hds-breakpoints.d.ts +27 -0
  6. package/dist/components/hds/advanced-table/index.js +13 -6
  7. package/dist/components/hds/advanced-table/index.js.map +1 -1
  8. package/dist/components/hds/app-header/index.js +4 -2
  9. package/dist/components/hds/app-header/index.js.map +1 -1
  10. package/dist/components/hds/app-side-nav/index.js +31 -23
  11. package/dist/components/hds/app-side-nav/index.js.map +1 -1
  12. package/dist/components/hds/app-side-nav/portal/target.js +1 -1
  13. package/dist/components/hds/code-block/index.js +56 -41
  14. package/dist/components/hds/code-block/index.js.map +1 -1
  15. package/dist/components/hds/form/label/index.js +1 -1
  16. package/dist/styles/@hashicorp/design-system-components.css +108 -22
  17. package/dist/styles/components/advanced-table.scss +2 -0
  18. package/dist/styles/components/app-side-nav/main.scss +1 -6
  19. package/dist/styles/components/app-side-nav/vars.scss +0 -2
  20. package/dist/styles/components/code-block/index.scss +96 -11
  21. package/dist/styles/components/pagination.scss +5 -9
  22. package/dist/styles/components/side-nav/vars.scss +3 -1
  23. package/dist/styles/components/stepper/nav.scss +2 -1
  24. package/dist/styles/mixins/_breakpoints.scss +97 -0
  25. package/dist/utils/hds-breakpoints.js +33 -0
  26. package/dist/utils/hds-breakpoints.js.map +1 -0
  27. 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 _containersToHide;
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
- * Generates a unique ID for the code content
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
- * @param language
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.args.hasStickyHeader) {
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.args.hasStickyHeader) {
339
+ if (this.hasStickyHeader) {
332
340
  this.isStickyHeaderPinned = true;
333
341
  }
334
342
  this.showScrollIndicatorTop = true;
335
343
  } else {
336
- if (this.args.hasStickyHeader) {
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":"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"}
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
- _breakpoint = parseInt(getComputedStyle(document.documentElement).getPropertyValue('--hds-app-desktop-breakpoint'));
43
- _desktopMQVal = this.args.breakpoint ?? getComputedStyle(document.documentElement).getPropertyValue('--hds-app-desktop-breakpoint');
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 private _breakpoint = parseInt(\n getComputedStyle(document.documentElement).getPropertyValue(\n '--hds-app-desktop-breakpoint'\n )\n );\n\n private _desktopMQVal =\n this.args.breakpoint ??\n getComputedStyle(document.documentElement).getPropertyValue(\n '--hds-app-desktop-breakpoint'\n );\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","_breakpoint","parseInt","getComputedStyle","document","documentElement","getPropertyValue","_desktopMQVal","breakpoint","constructor","owner","window","matchMedia","addEventListeners","registerDestructor","removeEventListeners","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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"}
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 {{did-insert this.didInsert}}\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\">\n {{~yield~}}\n </div>\n </div>\n</div>");
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
- _containersToHide;
37
- _desktopMQVal = getComputedStyle(document.documentElement).getPropertyValue('--hds-app-desktop-breakpoint');
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._containersToHide?.forEach(element => {
110
- if (this._isMinimized) {
111
- element.setAttribute('inert', '');
112
- } else {
113
- element.removeAttribute('inert');
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._isMinimized) {
155
- this.unlockBodyScroll();
156
- } else {
157
- this.lockBodyScroll();
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;