Skip to content

Commit 20d168e

Browse files
authored
Merge branch 'main' into fix-notification-operator
2 parents 6601d7f + 0234ae5 commit 20d168e

25 files changed

+358
-148
lines changed

package-lock.json

Lines changed: 98 additions & 114 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,12 @@
3535
"@angular/platform-browser": "^11.2.0",
3636
"@angular/platform-browser-dynamic": "^11.2.0",
3737
"@angular/router": "^11.2.0",
38-
"@apollo/client": "^3.3.10",
38+
"@apollo/client": "^3.3.11",
3939
"@hypertrace/hyperdash": "^1.2.1",
4040
"@hypertrace/hyperdash-angular": "^2.5.0",
4141
"@types/d3-hierarchy": "^2.0.0",
4242
"@types/d3-transition": "1.1.5",
43-
"apollo-angular": "^2.3.0",
43+
"apollo-angular": "^2.4.0",
4444
"core-js": "^3.8.3",
4545
"d3-array": "^2.11.0",
4646
"d3-axis": "^1.0.12",
@@ -64,14 +64,14 @@
6464
"rxjs": "~6.6.6",
6565
"tslib": "^2.1.0",
6666
"uuid": "^8.3.2",
67-
"zone.js": "^0.10.3"
67+
"zone.js": "^0.11.4"
6868
},
6969
"devDependencies": {
7070
"@angular-builders/jest": "^11.0.0",
7171
"@angular-devkit/build-angular": "~0.1102.0",
72-
"@angular/cli": "11.2.0",
72+
"@angular/cli": "11.2.3",
7373
"@angular/compiler-cli": "~11.2.0",
74-
"@angular/language-service": "~11.2.0",
74+
"@angular/language-service": "~11.2.4",
7575
"@commitlint/cli": "^12.0.1",
7676
"@commitlint/config-conventional": "^12.0.1",
7777
"@compodoc/compodoc": "^1.1.11",
@@ -101,7 +101,7 @@
101101
"jest-html-reporter": "^3.2.0",
102102
"jest-junit": "^12.0.0",
103103
"lodash": "^4.17.21",
104-
"ng-mocks": "^11.7.0",
104+
"ng-mocks": "^11.9.0",
105105
"ng-packagr": "^11.2.2",
106106
"prettier": "^2.2.1",
107107
"pretty-quick": "^3.0.0",

projects/components/src/public-api.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,7 @@ export * from './toggle-group/toggle-item';
278278
// Toggle Switch
279279
export * from './toggle-switch/toggle-switch.component';
280280
export * from './toggle-switch/toggle-switch.module';
281+
export { ToggleSwitchSize } from './toggle-switch/toggle-switch-size';
281282

282283
// Tooltip
283284
export { TooltipModule } from './tooltip/tooltip.module';
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
@import 'font';
2+
@import 'color-palette';
3+
4+
:host {
5+
.text {
6+
overflow: hidden;
7+
@include ellipsis-overflow();
8+
@include body-1-regular($gray-7);
9+
padding-right: 8px;
10+
}
11+
12+
.copy-button {
13+
visibility: hidden;
14+
}
15+
}
16+
17+
.text-with-copy-action-cell {
18+
display: flex;
19+
flex-direction: row;
20+
align-items: center;
21+
justify-content: space-between;
22+
23+
&.first-column {
24+
@include body-1-medium($gray-9);
25+
}
26+
27+
&:hover {
28+
.copy-button {
29+
visibility: visible;
30+
}
31+
}
32+
}
33+
34+
.clickable {
35+
@include link-hover();
36+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import { FormattingModule } from '@hypertrace/common';
2+
import { ButtonSize, CopyToClipboardComponent } from '@hypertrace/components';
3+
import { byText, createComponentFactory } from '@ngneat/spectator/jest';
4+
import { MockComponent } from 'ng-mocks';
5+
import { TableCellStringParser } from '../../data-parsers/table-cell-string-parser';
6+
import { tableCellColumnProvider, tableCellDataProvider, tableCellProviders } from '../../test/cell-providers';
7+
import { TextWithCopyActionTableCellRendererComponent } from './text-with-copy-table-cell-renderer.component';
8+
9+
describe('Text with copy action table cell renderer component', () => {
10+
const buildComponent = createComponentFactory({
11+
component: TextWithCopyActionTableCellRendererComponent,
12+
imports: [FormattingModule],
13+
declarations: [MockComponent(CopyToClipboardComponent)],
14+
providers: [
15+
tableCellProviders(
16+
{
17+
id: 'test'
18+
},
19+
new TableCellStringParser(undefined!)
20+
)
21+
],
22+
shallow: true
23+
});
24+
25+
test('should render a plain string', () => {
26+
const spectator = buildComponent({
27+
providers: [tableCellDataProvider('test-text')]
28+
});
29+
30+
expect(spectator.query('.text')).toHaveText('test-text');
31+
});
32+
33+
test('should render a missing string', () => {
34+
const spectator = buildComponent();
35+
36+
expect(spectator.query('.text')).toHaveText('');
37+
});
38+
39+
test('should render the copy action button as expected', () => {
40+
const spectator = buildComponent({ providers: [tableCellDataProvider('test-text')] });
41+
expect(spectator.query('.copy-button')).toExist();
42+
expect(spectator.query(CopyToClipboardComponent)?.label).toBe('');
43+
expect(spectator.query(CopyToClipboardComponent)?.size).toBe(ButtonSize.ExtraSmall);
44+
expect(spectator.query(CopyToClipboardComponent)?.text).toBe('test-text');
45+
});
46+
47+
test('should not render the copy action button if string is empty', () => {
48+
const spectator = buildComponent({ providers: [tableCellDataProvider('')] });
49+
expect(spectator.query('.copy-button')).not.toExist();
50+
});
51+
52+
test('should add clickable class for clickable columns', () => {
53+
const spectator = buildComponent({
54+
providers: [
55+
tableCellDataProvider('test-text'),
56+
tableCellColumnProvider({
57+
id: 'test',
58+
onClick: () => {
59+
/* NOOP */
60+
}
61+
})
62+
]
63+
});
64+
65+
expect(spectator.query('.text-with-copy-action-cell')).toHaveClass('clickable');
66+
});
67+
68+
test('should not add clickable class for columns without a click handler', () => {
69+
const spectator = buildComponent({
70+
providers: [tableCellDataProvider('test-text')]
71+
});
72+
73+
expect(spectator.query(byText('test-text'))).not.toHaveClass('clickable');
74+
});
75+
});
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { ChangeDetectionStrategy, Component } from '@angular/core';
2+
import { ButtonSize } from '../../../../button/button';
3+
import { TableCellRenderer } from '../../table-cell-renderer';
4+
import { TableCellRendererBase } from '../../table-cell-renderer-base';
5+
import { CoreTableCellParserType } from '../../types/core-table-cell-parser-type';
6+
import { CoreTableCellRendererType } from '../../types/core-table-cell-renderer-type';
7+
import { TableCellAlignmentType } from '../../types/table-cell-alignment-type';
8+
9+
@Component({
10+
selector: 'ht-text-table-with-copy-cell-renderer',
11+
styleUrls: ['./text-with-copy-table-cell-renderer.component.scss'],
12+
changeDetection: ChangeDetectionStrategy.OnPush,
13+
template: `
14+
<div
15+
[ngClass]="{ clickable: this.clickable, 'first-column': this.isFirstColumn }"
16+
class="text-with-copy-action-cell"
17+
>
18+
<span class="text" [htTooltip]="this.value">{{ this.value | htDisplayString }}</span>
19+
20+
<div class="copy-button" *ngIf="this.value !== ''">
21+
<ht-copy-to-clipboard size="${ButtonSize.ExtraSmall}" label="" [text]="this.value"></ht-copy-to-clipboard>
22+
</div>
23+
</div>
24+
`
25+
})
26+
@TableCellRenderer({
27+
type: CoreTableCellRendererType.TextWithCopyAction,
28+
alignment: TableCellAlignmentType.Left,
29+
parser: CoreTableCellParserType.String
30+
})
31+
export class TextWithCopyActionTableCellRendererComponent extends TableCellRendererBase<string> {}

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { CommonModule } from '@angular/common';
33
import { Inject, InjectionToken, NgModule } from '@angular/core';
44
import { FormattingModule } from '@hypertrace/common';
55
import { TraceCheckboxModule } from '../../checkbox/checkbox.module';
6+
import { CopyToClipboardModule } from '../../copy-to-clipboard/copy-to-clipboard.module';
67
import { ExpanderToggleModule } from '../../expander/expander-toggle.module';
78
import { FilterButtonModule } from '../../filtering/filter-button/filter-button.module';
89
import { FilterModalModule } from '../../filtering/filter-modal/filter-modal.module';
@@ -21,6 +22,7 @@ import { IconTableCellRendererComponent } from './data-renderers/icon/icon-table
2122
import { NumericTableCellRendererComponent } from './data-renderers/numeric/numeric-table-cell-renderer.component';
2223
import { StringArrayTableCellRendererComponent } from './data-renderers/string-array/string-array-table-cell-renderer.component';
2324
import { TableDataCellRendererComponent } from './data-renderers/table-data-cell-renderer.component';
25+
import { TextWithCopyActionTableCellRendererComponent } from './data-renderers/text-with-copy/text-with-copy-table-cell-renderer.component';
2426
import { TextTableCellRendererComponent } from './data-renderers/text/text-table-cell-renderer.component';
2527
import { TimeAgoTableCellRendererComponent } from './data-renderers/time-ago/time-ago-table-cell-renderer.component';
2628
import { TimestampTableCellRendererComponent } from './data-renderers/timestamp/timestamp-table-cell-renderer.component';
@@ -47,7 +49,8 @@ export const TABLE_CELL_PARSERS = new InjectionToken<unknown[][]>('TABLE_CELL_PA
4749
TraceCheckboxModule,
4850
FilterButtonModule,
4951
FilterModalModule,
50-
PopoverModule
52+
PopoverModule,
53+
CopyToClipboardModule
5154
],
5255
exports: [
5356
TableHeaderCellRendererComponent,
@@ -66,7 +69,8 @@ export const TABLE_CELL_PARSERS = new InjectionToken<unknown[][]>('TABLE_CELL_PA
6669
TimestampTableCellRendererComponent,
6770
TimeAgoTableCellRendererComponent,
6871
CodeTableCellRendererComponent,
69-
StringArrayTableCellRendererComponent
72+
StringArrayTableCellRendererComponent,
73+
TextWithCopyActionTableCellRendererComponent
7074
],
7175
providers: [
7276
{
@@ -80,7 +84,8 @@ export const TABLE_CELL_PARSERS = new InjectionToken<unknown[][]>('TABLE_CELL_PA
8084
TimestampTableCellRendererComponent,
8185
TimeAgoTableCellRendererComponent,
8286
CodeTableCellRendererComponent,
83-
StringArrayTableCellRendererComponent
87+
StringArrayTableCellRendererComponent,
88+
TextWithCopyActionTableCellRendererComponent
8489
],
8590
multi: true
8691
},

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
@@ -6,6 +6,7 @@ export const enum CoreTableCellRendererType {
66
RowExpander = 'row-expander',
77
StringArray = 'string-array',
88
Text = 'text',
9+
TextWithCopyAction = 'text-with-copy-action',
910
Timestamp = 'timestamp',
1011
TimeAgo = 'time-ago'
1112
}

projects/components/src/toggle-group/toggle-group.component.test.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { fakeAsync } from '@angular/core/testing';
2+
import { IconType } from '@hypertrace/assets-library';
23
import { createHostFactory, Spectator } from '@ngneat/spectator/jest';
34
import { MockComponent } from 'ng-mocks';
45
import { LabelComponent } from '../label/label.component';
@@ -23,6 +24,7 @@ describe('Toggle Group Component', () => {
2324
},
2425
{
2526
label: 'Second',
27+
icon: IconType.Add,
2628
value: 'second-value'
2729
}
2830
];

projects/components/src/toggle-group/toggle-group.component.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,12 @@ import { ToggleItemComponent } from './toggle-item.component';
2828
></div>
2929
<div class="container" *ngFor="let item of this.items; let index = index">
3030
<div class="divider" *ngIf="index !== 0" [class.hide-divider]="this.shouldHideDivider(index)"></div>
31-
<ht-toggle-item class="tab" [label]="item.label" (click)="this.setActiveItem(item)"></ht-toggle-item>
31+
<ht-toggle-item
32+
class="tab"
33+
[label]="item.label"
34+
[icon]="item.icon"
35+
(click)="this.setActiveItem(item)"
36+
></ht-toggle-item>
3237
</div>
3338
</div>
3439
</div>

0 commit comments

Comments
 (0)