KEMBAR78
timeseries: fix visibility bug on filtered scalar cards by psybuzz · Pull Request #5235 · tensorflow/tensorboard · GitHub
Skip to content

Conversation

@psybuzz
Copy link
Contributor

@psybuzz psybuzz commented Aug 12, 2021

ScalarCardContainer provides boolean observables isCardVisible and
isEverVisible to inform whether the line chart should be shown:
<ng-container *ngIf="isEverVisible"><line-chart>...

The isCardVisible uses the misleading ngrx selector getVisibleCardIds,
giving the impression that a "visible cardId" is equivalent to "this card's
DOM element is visible". That assumption is false when there are 2
different DOM elements (filtered and unfiltered) for the same cardId and
the filtered DOM element happens to be shown first before the unfiltered
one is ever visible (in the sense that it is in the DOM without 'display: none'.

When a user enters a tag filter that shows a card that was previously not in
the visible viewport, it actually causes the 'display: none'd unfiltered card's
ngIf to insert its line chart into the DOM. Since it is 'display: none'd, the
line chart thinks its width: 0, height: 0, so after clearing the tag filter, we see
a blank card.

This change provides a more accurate computation of isCardVisible,
using the same intersectionObserver directive used by the Histogram
component for this same purpose.

Manually tested a consistent repro and saw that charts were no longer blank.

Googlers, see b/186682025, which includes a concrete repro.

@google-cla google-cla bot added the cla: yes label Aug 12, 2021
@psybuzz psybuzz requested a review from bmd3k August 12, 2021 16:36
@psybuzz psybuzz marked this pull request as ready for review August 12, 2021 16:44
@psybuzz psybuzz merged commit 74e7b70 into tensorflow:master Aug 12, 2021
yatbear pushed a commit to yatbear/tensorboard that referenced this pull request Mar 27, 2023
…#5235)

ScalarCardContainer provides boolean observables `isCardVisible` and
`isEverVisible` to inform whether the line chart should be shown:
`<ng-container *ngIf="isEverVisible"><line-chart>...`

The `isCardVisible` uses the misleading ngrx selector `getVisibleCardIds`,
giving the impression that a "visible cardId" is equivalent to "this card's
DOM element is visible".  That assumption is false when there are 2
different DOM elements (filtered and unfiltered) for the same cardId and
the filtered DOM element happens to be shown first before the unfiltered
one is ever visible (in the sense that it is in the DOM without 'display: none'.

When a user enters a tag filter that shows a card that was previously not in
the visible viewport, it actually causes the 'display: none'd unfiltered card's
ngIf to insert its line chart into the DOM. Since it is 'display: none'd, the
line chart thinks its width: 0, height: 0, so after clearing the tag filter, we see
a blank card.

This change provides a more accurate computation of `isCardVisible`,
using the same `intersectionObserver` directive used by the Histogram
component for this same purpose.

Manually tested a consistent repro and saw that charts were no longer blank.

Googlers, see b/186682025, which includes a concrete repro.
dna2github pushed a commit to dna2fork/tensorboard that referenced this pull request May 1, 2023
…#5235)

ScalarCardContainer provides boolean observables `isCardVisible` and
`isEverVisible` to inform whether the line chart should be shown:
`<ng-container *ngIf="isEverVisible"><line-chart>...`

The `isCardVisible` uses the misleading ngrx selector `getVisibleCardIds`,
giving the impression that a "visible cardId" is equivalent to "this card's
DOM element is visible".  That assumption is false when there are 2
different DOM elements (filtered and unfiltered) for the same cardId and
the filtered DOM element happens to be shown first before the unfiltered
one is ever visible (in the sense that it is in the DOM without 'display: none'.

When a user enters a tag filter that shows a card that was previously not in
the visible viewport, it actually causes the 'display: none'd unfiltered card's
ngIf to insert its line chart into the DOM. Since it is 'display: none'd, the
line chart thinks its width: 0, height: 0, so after clearing the tag filter, we see
a blank card.

This change provides a more accurate computation of `isCardVisible`,
using the same `intersectionObserver` directive used by the Histogram
component for this same purpose.

Manually tested a consistent repro and saw that charts were no longer blank.

Googlers, see b/186682025, which includes a concrete repro.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants