Skip to content

Commit afad04d

Browse files
authored
feat: support html strings in title tooltip (#587)
* feat: support html strings in title tooltip
1 parent bff04b1 commit afad04d

File tree

2 files changed

+53
-2
lines changed

2 files changed

+53
-2
lines changed

projects/components/src/table/header/table-header-cell-renderer.component.test.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { TemplateRef } from '@angular/core';
12
import { fakeAsync } from '@angular/core/testing';
23
import { createHostFactory, mockProvider } from '@ngneat/spectator/jest';
34
import { FilterParserLookupService } from '../../filtering/filter/parser/filter-parser-lookup.service';
@@ -116,4 +117,25 @@ describe('Table Header Cell Renderer', () => {
116117
expect(spectator.query('.sort-ascending', { root: true })).not.toExist();
117118
expect(spectator.query('.sort-descending', { root: true })).not.toExist();
118119
});
120+
121+
test('should create tooltip correctly', () => {
122+
const columnConfig: TableColumnConfigExtended = {
123+
id: 'test-column',
124+
renderer: TextTableCellRendererComponent,
125+
parser: new TableCellStringParser(undefined!),
126+
filterValues: [],
127+
titleTooltip: 'html:<div></div>',
128+
sortable: false
129+
};
130+
131+
const spectator = createHost(undefined, {
132+
hostProps: {
133+
columnConfig: columnConfig
134+
}
135+
});
136+
137+
expect(spectator.component.getTooltip('<div></div>', 'title') instanceof TemplateRef).toBe(true);
138+
expect(spectator.component.getTooltip('titleTooltip', 'title') instanceof TemplateRef).toBe(true);
139+
expect(spectator.component.getTooltip(undefined, 'title')).toBe('title');
140+
});
119141
});

projects/components/src/table/header/table-header-cell-renderer.component.ts

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,14 @@
1-
import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnChanges, OnInit, Output } from '@angular/core';
1+
import {
2+
ChangeDetectionStrategy,
3+
Component,
4+
EventEmitter,
5+
Input,
6+
OnChanges,
7+
OnInit,
8+
Output,
9+
TemplateRef,
10+
ViewChild
11+
} from '@angular/core';
212
import { IconType } from '@hypertrace/assets-library';
313
import { TypedSimpleChanges } from '@hypertrace/common';
414
import { InFilterModalComponent, InFilterModalData } from '../../filtering/filter-modal/in-filter-modal.component';
@@ -22,7 +32,7 @@ import { TableColumnConfigExtended } from '../table.service';
2232
<div
2333
*ngIf="this.columnConfig"
2434
[ngClass]="this.classes"
25-
[htTooltip]="this.columnConfig.titleTooltip || this.columnConfig.title"
35+
[htTooltip]="this.getTooltip(this.columnConfig.titleTooltip, this.columnConfig.title)"
2636
class="table-header-cell-renderer"
2737
>
2838
<ng-container *ngIf="this.leftAlignFilterButton">
@@ -64,6 +74,10 @@ import { TableColumnConfigExtended } from '../table.service';
6474
</div>
6575
</ht-popover-content>
6676
</ht-popover>
77+
78+
<ng-template #htmlTooltip>
79+
<div [innerHTML]="this.columnConfig?.titleTooltip"></div>
80+
</ng-template>
6781
</ng-template>
6882
</div>
6983
`
@@ -102,6 +116,10 @@ export class TableHeaderCellRendererComponent implements OnInit, OnChanges {
102116

103117
public isFilterable: boolean = false;
104118

119+
@ViewChild('htmlTooltip')
120+
public htmlTooltipTemplate?: TemplateRef<unknown>;
121+
public sanitizedHtmlForTooltip?: string;
122+
105123
public constructor(
106124
private readonly modalService: ModalService,
107125
private readonly filterParserLookupService: FilterParserLookupService
@@ -144,6 +162,17 @@ export class TableHeaderCellRendererComponent implements OnInit, OnChanges {
144162
this.sortChange.emit(direction ?? this.getNextSortDirection(this.sort));
145163
}
146164

165+
public getTooltip(
166+
titleTooltip: string | undefined,
167+
title: string | undefined
168+
): string | TemplateRef<unknown> | undefined {
169+
if (titleTooltip === undefined) {
170+
return title;
171+
}
172+
173+
return this.htmlTooltipTemplate;
174+
}
175+
147176
private isAttributeFilterable(): boolean {
148177
return (
149178
this.metadata !== undefined &&

0 commit comments

Comments
 (0)