diff --git a/tensorboard/webapp/widgets/data_table/data_table_component.ng.html b/tensorboard/webapp/widgets/data_table/data_table_component.ng.html index b50a93b7b8..9f3eaa6f93 100644 --- a/tensorboard/webapp/widgets/data_table/data_table_component.ng.html +++ b/tensorboard/webapp/widgets/data_table/data_table_component.ng.html @@ -12,74 +12,67 @@ limitations under the License. --> -
- - - - - - - - - - - - - - - - - +
+ + +
+ + + + + +
+
+ +
+ +
+
+ + {{ getFormattedDataForColumn(header.type, runData[header.name]) }} +
+
+ + {{ getFormattedDataForColumn(header.type, runData[header.name]) }} +
+
+ {{ getFormattedDataForColumn(header.type, runData[header.name]) }} +
+
-
-
- - -
- +
+
+
+ +
+
+ -
- - -
-
-
- - -
- - {{ getFormattedDataForColumn(header.type, runData[header.name]) - }} -
-
- - {{ getFormattedDataForColumn(header.type, runData[header.name]) - }} -
-
- {{ getFormattedDataForColumn(header.type, runData[header.name]) - }} -
-
+
+ diff --git a/tensorboard/webapp/widgets/data_table/data_table_component.scss b/tensorboard/webapp/widgets/data_table/data_table_component.scss index b848f4bf9a..79b97a2b30 100644 --- a/tensorboard/webapp/widgets/data_table/data_table_component.scss +++ b/tensorboard/webapp/widgets/data_table/data_table_component.scss @@ -20,13 +20,24 @@ $_accent: map-get(mat.get-color-config($tb-theme), accent); .data-table { border-spacing: 4px; font-size: 13px; + display: table; width: 100%; - th { + .header, + .row { + display: table-row; + } + + .col { + display: table-cell; + } + + .header { background-color: mat.get-color-from-palette($tb-background, background); position: sticky; text-align: left; top: 0; + font-weight: bold; vertical-align: bottom; &:hover { @@ -36,11 +47,17 @@ $_accent: map-get(mat.get-color-config($tb-theme), accent); @include tb-dark-theme { background-color: map-get($tb-dark-background, background); } + .col:hover .show-on-hover { + opacity: 0.3; + } + + .col { + vertical-align: bottom; + } } - .cell { - align-items: center; - display: flex; + .col { + padding: 1px; } .extra-right-padding { @@ -48,19 +65,8 @@ $_accent: map-get(mat.get-color-config($tb-theme), accent); padding-right: 1px; } - .row { - white-space: nowrap; - } - $_circle-size: 12px; - .row-circle { - align-items: center; - display: inline-flex; - height: $_circle-size; - width: $_circle-size; - } - .row-circle > span { border-radius: 50%; border: 1px solid rgba(255, 255, 255, 0.4); @@ -68,6 +74,12 @@ $_accent: map-get(mat.get-color-config($tb-theme), accent); // Subtract by border width (1px on both sides) height: $_circle-size - 2px; width: $_circle-size - 2px; + vertical-align: middle; + } + + .cell { + align-items: center; + display: flex; } .cell mat-icon { @@ -89,10 +101,6 @@ $_accent: map-get(mat.get-color-config($tb-theme), accent); opacity: 0; } - th:hover .show-on-hover { - opacity: 0.3; - } - .highlight { background-color: mat.get-color-from-palette(mat.$gray-palette, 200); } diff --git a/tensorboard/webapp/widgets/data_table/data_table_test.ts b/tensorboard/webapp/widgets/data_table/data_table_test.ts index 7ae8a9b3f2..2d7ea22e1b 100644 --- a/tensorboard/webapp/widgets/data_table/data_table_test.ts +++ b/tensorboard/webapp/widgets/data_table/data_table_test.ts @@ -135,7 +135,9 @@ describe('data table', () => { ], }); fixture.detectChanges(); - const headerElements = fixture.debugElement.queryAll(By.css('th')); + const headerElements = fixture.debugElement.queryAll( + By.css('.header > .col') + ); // The first header should always be blank as it is the run color column. expect(headerElements[0].nativeElement.innerText).toBe(''); @@ -258,7 +260,7 @@ describe('data table', () => { ], }); fixture.detectChanges(); - const dataElements = fixture.debugElement.queryAll(By.css('td')); + const dataElements = fixture.debugElement.queryAll(By.css('.row > .col')); // The first header should always be blank as it is the run color column. expect(dataElements[0].nativeElement.innerText).toBe(''); @@ -321,8 +323,10 @@ describe('data table', () => { ], }); fixture.detectChanges(); - const headerElements = fixture.debugElement.queryAll(By.css('th')); - const dataElements = fixture.debugElement.queryAll(By.css('td')); + const headerElements = fixture.debugElement.queryAll( + By.css('.header > .col') + ); + const dataElements = fixture.debugElement.queryAll(By.css('.row > .col')); // The first header should always be blank as it is the run color column. expect(headerElements[0].nativeElement.innerText).toBe(''); @@ -366,7 +370,7 @@ describe('data table', () => { data: [{id: 'someid'}], }); fixture.detectChanges(); - const dataElements = fixture.debugElement.queryAll(By.css('td')); + const dataElements = fixture.debugElement.queryAll(By.css('.row > .col')); // The first header should always be blank as it is the run color column. expect(dataElements[0].nativeElement.innerText).toBe(''); @@ -406,7 +410,9 @@ describe('data table', () => { ], }); fixture.detectChanges(); - const headerElements = fixture.debugElement.queryAll(By.css('th')); + const headerElements = fixture.debugElement.queryAll( + By.css('.header > .col') + ); headerElements[3].triggerEventHandler('click', {}); expect(sortDataBySpy).toHaveBeenCalledOnceWith({ @@ -451,7 +457,9 @@ describe('data table', () => { }, }); fixture.detectChanges(); - const headerElements = fixture.debugElement.queryAll(By.css('th')); + const headerElements = fixture.debugElement.queryAll( + By.css('.header > .col') + ); headerElements[3].triggerEventHandler('click', {}); expect(sortDataBySpy).toHaveBeenCalledOnceWith({ @@ -490,7 +498,9 @@ describe('data table', () => { }, }); fixture.detectChanges(); - const headerElements = fixture.debugElement.queryAll(By.css('th')); + const headerElements = fixture.debugElement.queryAll( + By.css('.header > .col') + ); expect( headerElements[1] @@ -553,7 +563,9 @@ describe('data table', () => { }, }); fixture.detectChanges(); - const headerElements = fixture.debugElement.queryAll(By.css('th')); + const headerElements = fixture.debugElement.queryAll( + By.css('.header > .col') + ); expect( headerElements[1] @@ -616,7 +628,9 @@ describe('data table', () => { }, }); fixture.detectChanges(); - const headerElements = fixture.debugElement.queryAll(By.css('th')); + const headerElements = fixture.debugElement.queryAll( + By.css('.header > .col') + ); headerElements[2].query(By.css('.cell')).triggerEventHandler('dragstart'); headerElements[1].query(By.css('.cell')).triggerEventHandler('dragenter'); @@ -684,7 +698,9 @@ describe('data table', () => { }, }); fixture.detectChanges(); - const headerElements = fixture.debugElement.queryAll(By.css('th')); + const headerElements = fixture.debugElement.queryAll( + By.css('.header > .col') + ); headerElements[2].query(By.css('.cell')).triggerEventHandler('dragstart'); headerElements[3].query(By.css('.cell')).triggerEventHandler('dragenter'); @@ -763,8 +779,10 @@ describe('data table', () => { smoothingEnabled: false, }); fixture.detectChanges(); - const headerElements = fixture.debugElement.queryAll(By.css('th')); - const dataElements = fixture.debugElement.queryAll(By.css('td')); + const headerElements = fixture.debugElement.queryAll( + By.css('.header > .col') + ); + const dataElements = fixture.debugElement.queryAll(By.css('.row > .col')); // The first header should always be blank as it is the run color column. expect(headerElements[0].nativeElement.innerText).toBe('');