Skip to content

Commit fa80f9a

Browse files
authored
feat: string enum table cell renderer (#787)
1 parent 6a68582 commit fa80f9a

File tree

6 files changed

+124
-0
lines changed

6 files changed

+124
-0
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
@import 'font';
2+
@import 'color-palette';
3+
4+
:host {
5+
overflow: hidden;
6+
}
7+
8+
.string-enum-cell {
9+
@include ellipsis-overflow();
10+
@include body-1-regular($gray-7);
11+
12+
&.first-column {
13+
@include body-1-medium($gray-9);
14+
}
15+
}
16+
17+
.clickable {
18+
@include link-hover();
19+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import { FormattingModule } from '@hypertrace/common';
2+
import { byText, createComponentFactory } from '@ngneat/spectator/jest';
3+
import { TableCellStringParser } from '../../data-parsers/table-cell-string-parser';
4+
import { tableCellColumnProvider, tableCellDataProvider, tableCellProviders } from '../../test/cell-providers';
5+
import { StringEnumTableCellRendererComponent } from './string-enum-table-cell-renderer.component';
6+
7+
describe('String Enum table cell renderer component', () => {
8+
const buildComponent = createComponentFactory({
9+
component: StringEnumTableCellRendererComponent,
10+
imports: [FormattingModule],
11+
providers: [
12+
tableCellProviders(
13+
{
14+
id: 'test'
15+
},
16+
new TableCellStringParser(undefined!)
17+
)
18+
],
19+
shallow: true
20+
});
21+
22+
test('should render a plain string', () => {
23+
const spectator = buildComponent({
24+
providers: [tableCellDataProvider('test-text')]
25+
});
26+
27+
expect(spectator.element).toHaveText('Test text');
28+
});
29+
30+
test('should render a missing string', () => {
31+
const spectator = buildComponent();
32+
33+
expect(spectator.element).toHaveText('');
34+
});
35+
36+
test('should add clickable class for clickable columns', () => {
37+
const spectator = buildComponent({
38+
providers: [
39+
tableCellDataProvider('test-text'),
40+
tableCellColumnProvider({
41+
id: 'test',
42+
onClick: () => {
43+
/* NOOP */
44+
}
45+
})
46+
]
47+
});
48+
49+
expect(spectator.query(byText('Test text'))).toHaveClass('clickable');
50+
});
51+
52+
test('should not add clickable class for columns without a click handler', () => {
53+
const spectator = buildComponent({
54+
providers: [tableCellDataProvider('TEST_TEXT')]
55+
});
56+
57+
expect(spectator.query(byText('Test text'))).not.toHaveClass('clickable');
58+
});
59+
});
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { ChangeDetectionStrategy, Component } from '@angular/core';
2+
import { TableCellRenderer } from '../../table-cell-renderer';
3+
import { TableCellRendererBase } from '../../table-cell-renderer-base';
4+
import { CoreTableCellParserType } from '../../types/core-table-cell-parser-type';
5+
import { CoreTableCellRendererType } from '../../types/core-table-cell-renderer-type';
6+
import { TableCellAlignmentType } from '../../types/table-cell-alignment-type';
7+
8+
@Component({
9+
selector: 'ht-string-enum-table-cell-renderer',
10+
styleUrls: ['./string-enum-table-cell-renderer.component.scss'],
11+
changeDetection: ChangeDetectionStrategy.OnPush,
12+
template: `
13+
<div
14+
[ngClass]="{ clickable: this.clickable, 'first-column': this.isFirstColumn }"
15+
class="string-enum-cell"
16+
[htTooltip]="this.value"
17+
>
18+
{{ this.value | htDisplayStringEnum }}
19+
</div>
20+
`
21+
})
22+
@TableCellRenderer({
23+
type: CoreTableCellRendererType.StringEnum,
24+
alignment: TableCellAlignmentType.Left,
25+
parser: CoreTableCellParserType.String
26+
})
27+
export class StringEnumTableCellRendererComponent extends TableCellRendererBase<string> {}

projects/components/src/table/cells/table-cells.module.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { TableCellNumberParser } from './data-parsers/table-cell-number-parser';
1818
import { TableCellStringParser } from './data-parsers/table-cell-string-parser';
1919
import { TableCellTimestampParser } from './data-parsers/table-cell-timestamp-parser';
2020
import { CodeTableCellRendererComponent } from './data-renderers/code/code-table-cell-renderer.component';
21+
import { StringEnumTableCellRendererComponent } from './data-renderers/enum/string-enum-table-cell-renderer.component';
2122
import { IconTableCellRendererComponent } from './data-renderers/icon/icon-table-cell-renderer.component';
2223
import { NumericTableCellRendererComponent } from './data-renderers/numeric/numeric-table-cell-renderer.component';
2324
import { StringArrayTableCellRendererComponent } from './data-renderers/string-array/string-array-table-cell-renderer.component';
@@ -70,6 +71,7 @@ export const TABLE_CELL_PARSERS = new InjectionToken<unknown[][]>('TABLE_CELL_PA
7071
TimeAgoTableCellRendererComponent,
7172
CodeTableCellRendererComponent,
7273
StringArrayTableCellRendererComponent,
74+
StringEnumTableCellRendererComponent,
7375
TextWithCopyActionTableCellRendererComponent
7476
],
7577
providers: [
@@ -85,6 +87,7 @@ export const TABLE_CELL_PARSERS = new InjectionToken<unknown[][]>('TABLE_CELL_PA
8587
TimeAgoTableCellRendererComponent,
8688
CodeTableCellRendererComponent,
8789
StringArrayTableCellRendererComponent,
90+
StringEnumTableCellRendererComponent,
8891
TextWithCopyActionTableCellRendererComponent
8992
],
9093
multi: true

projects/components/src/table/cells/types/core-table-cell-renderer-type.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ export const enum CoreTableCellRendererType {
55
Number = 'number',
66
RowExpander = 'row-expander',
77
StringArray = 'string-array',
8+
StringEnum = 'string-enum',
89
Text = 'text',
910
TextWithCopyAction = 'text-with-copy-action',
1011
Timestamp = 'timestamp',

src/styles/main.scss

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,21 @@ h1 {
5252
box-sizing: border-box;
5353
}
5454

55+
strong {
56+
font-weight: 500;
57+
}
58+
59+
em {
60+
font-style: normal;
61+
background: $gray-2;
62+
border-radius: 4px;
63+
padding: 2px 4px;
64+
}
65+
66+
q {
67+
color: $gray-5;
68+
}
69+
5570
mark {
5671
background-color: $color-text-highlight;
5772
color: $gray-9;

0 commit comments

Comments
 (0)