Skip to content

Commit b43ce2e

Browse files
authored
feat: string array cell renderer (#655)
* feat: string array cell renderer
1 parent 797268e commit b43ce2e

File tree

5 files changed

+129
-2
lines changed

5 files changed

+129
-2
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+
.string-array-cell {
5+
display: flex;
6+
flex-direction: row;
7+
align-items: center;
8+
9+
.first-item {
10+
@include ellipsis-overflow();
11+
padding-right: 8px;
12+
}
13+
14+
.summary-text {
15+
padding: 0 6px;
16+
background-color: $gray-2;
17+
border-radius: 4px;
18+
}
19+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import { TableCellNoOpParser } from '@hypertrace/components';
2+
import { createComponentFactory } from '@ngneat/spectator/jest';
3+
import { tableCellDataProvider, tableCellProviders } from '../../test/cell-providers';
4+
import { StringArrayTableCellRendererComponent } from './string-array-table-cell-renderer.component';
5+
6+
describe('String array table cell renderer component', () => {
7+
const buildComponent = createComponentFactory({
8+
component: StringArrayTableCellRendererComponent,
9+
providers: [
10+
tableCellProviders(
11+
{
12+
id: 'test'
13+
},
14+
new TableCellNoOpParser(undefined!)
15+
)
16+
],
17+
18+
shallow: true
19+
});
20+
21+
test('should render an array with one item as expected', () => {
22+
const spectator = buildComponent({
23+
providers: [tableCellDataProvider(['first-item'])]
24+
});
25+
26+
expect(spectator.query('.first-item')).toHaveText('first-item');
27+
expect(spectator.query('.summary-text')).toHaveText('');
28+
});
29+
30+
test('should render an empty array as expected', () => {
31+
const spectator = buildComponent({
32+
providers: [tableCellDataProvider([])]
33+
});
34+
35+
expect(spectator.query('.first-item')).toHaveText('-');
36+
expect(spectator.query('.summary-text')).toHaveText('');
37+
});
38+
39+
test('should render array with multiple items as expected', () => {
40+
const spectator = buildComponent({
41+
providers: [tableCellDataProvider(['first-item', 'second-item', 'third-item'])]
42+
});
43+
44+
expect(spectator.query('.first-item')).toHaveText('first-item');
45+
expect(spectator.query('.summary-text')).toHaveText('+2');
46+
});
47+
});
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import { ChangeDetectionStrategy, Component, Inject, OnInit } from '@angular/core';
2+
import { TableColumnConfig, TableRow } from '../../../table-api';
3+
import {
4+
TABLE_CELL_DATA,
5+
TABLE_COLUMN_CONFIG,
6+
TABLE_COLUMN_INDEX,
7+
TABLE_DATA_PARSER,
8+
TABLE_ROW_DATA
9+
} from '../../table-cell-injection';
10+
import { TableCellParserBase } from '../../table-cell-parser-base';
11+
import { TableCellRenderer } from '../../table-cell-renderer';
12+
import { TableCellRendererBase } from '../../table-cell-renderer-base';
13+
import { CoreTableCellParserType } from '../../types/core-table-cell-parser-type';
14+
import { CoreTableCellRendererType } from '../../types/core-table-cell-renderer-type';
15+
import { TableCellAlignmentType } from '../../types/table-cell-alignment-type';
16+
17+
@Component({
18+
selector: 'ht-string-array-table-cell-renderer',
19+
styleUrls: ['./string-array-table-cell-renderer.component.scss'],
20+
changeDetection: ChangeDetectionStrategy.OnPush,
21+
template: `
22+
<div class="string-array-cell" [htTooltip]="summaryTooltip">
23+
<span class="first-item">{{ this.firstItem }}</span>
24+
<span class="summary-text">{{ this.summaryText }}</span>
25+
26+
<ng-template #summaryTooltip>
27+
<div *ngFor="let value of this.value">{{ value }}</div>
28+
</ng-template>
29+
</div>
30+
`
31+
})
32+
@TableCellRenderer({
33+
type: CoreTableCellRendererType.StringArray,
34+
alignment: TableCellAlignmentType.Left,
35+
parser: CoreTableCellParserType.NoOp
36+
})
37+
export class StringArrayTableCellRendererComponent extends TableCellRendererBase<string[]> implements OnInit {
38+
public firstItem!: string;
39+
public summaryText!: string;
40+
41+
public constructor(
42+
@Inject(TABLE_COLUMN_CONFIG) columnConfig: TableColumnConfig,
43+
@Inject(TABLE_COLUMN_INDEX) index: number,
44+
@Inject(TABLE_DATA_PARSER) parser: TableCellParserBase<string[], string[], unknown>,
45+
@Inject(TABLE_CELL_DATA) cellData: string[],
46+
@Inject(TABLE_ROW_DATA) rowData: TableRow
47+
) {
48+
super(columnConfig, index, parser, cellData, rowData);
49+
}
50+
51+
public ngOnInit(): void {
52+
super.ngOnInit();
53+
54+
this.firstItem = this.value[0] ?? '-';
55+
this.summaryText = this.value.length > 1 ? `+${this.value.length - 1}` : '';
56+
}
57+
}

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import { TableCellTimestampParser } from './data-parsers/table-cell-timestamp-pa
1919
import { CodeTableCellRendererComponent } from './data-renderers/code/code-table-cell-renderer.component';
2020
import { IconTableCellRendererComponent } from './data-renderers/icon/icon-table-cell-renderer.component';
2121
import { NumericTableCellRendererComponent } from './data-renderers/numeric/numeric-table-cell-renderer.component';
22+
import { StringArrayTableCellRendererComponent } from './data-renderers/string-array/string-array-table-cell-renderer.component';
2223
import { TableDataCellRendererComponent } from './data-renderers/table-data-cell-renderer.component';
2324
import { TextTableCellRendererComponent } from './data-renderers/text/text-table-cell-renderer.component';
2425
import { TimeAgoTableCellRendererComponent } from './data-renderers/time-ago/time-ago-table-cell-renderer.component';
@@ -64,7 +65,8 @@ export const TABLE_CELL_PARSERS = new InjectionToken<unknown[][]>('TABLE_CELL_PA
6465
TextTableCellRendererComponent,
6566
TimestampTableCellRendererComponent,
6667
TimeAgoTableCellRendererComponent,
67-
CodeTableCellRendererComponent
68+
CodeTableCellRendererComponent,
69+
StringArrayTableCellRendererComponent
6870
],
6971
providers: [
7072
{
@@ -77,7 +79,8 @@ export const TABLE_CELL_PARSERS = new InjectionToken<unknown[][]>('TABLE_CELL_PA
7779
TextTableCellRendererComponent,
7880
TimestampTableCellRendererComponent,
7981
TimeAgoTableCellRendererComponent,
80-
CodeTableCellRendererComponent
82+
CodeTableCellRendererComponent,
83+
StringArrayTableCellRendererComponent
8184
],
8285
multi: true
8386
},

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
@@ -4,6 +4,7 @@ export const enum CoreTableCellRendererType {
44
Icon = 'icon',
55
Number = 'number',
66
RowExpander = 'row-expander',
7+
StringArray = 'string-array',
78
Text = 'text',
89
Timestamp = 'timestamp',
910
TimeAgo = 'time-ago'

0 commit comments

Comments
 (0)