Skip to content

Commit e3e4fed

Browse files
authored
Embedded Single Card: single fob removal (#6510)
Add ability for the internal new single card to prevent single step selection fob removal.
1 parent c3a89db commit e3e4fed

7 files changed

+70
-0
lines changed

tensorboard/webapp/metrics/views/card_renderer/scalar_card_fob_controller.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import {MinMaxStep} from './scalar_card_types';
4141
[prospectiveStep]="prospectiveStep"
4242
[cardFobHelper]="cardFobHelper"
4343
[showExtendedLine]="true"
44+
[allowFobRemoval]="allowFobRemoval"
4445
(onProspectiveStepChanged)="onProspectiveStepChanged($event)"
4546
(onTimeSelectionChanged)="onTimeSelectionChanged.emit($event)"
4647
(onTimeSelectionToggled)="onTimeSelectionToggled.emit($event)"
@@ -56,6 +57,7 @@ export class ScalarCardFobController {
5657
@Input() minMaxStep!: MinMaxStep;
5758
@Input() axisSize!: number;
5859
@Input() disableInteraction: boolean = false;
60+
@Input() allowFobRemoval?: boolean = true;
5961

6062
@Output() onTimeSelectionChanged = new EventEmitter<{
6163
timeSelection: TimeSelection;

tensorboard/webapp/metrics/views/card_renderer/scalar_card_line_chart_component.ng.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@
8686
[minMaxHorizontalViewExtend]="viewExtent.x"
8787
[minMaxStep]="minMaxStep"
8888
[axisSize]="domDim.width"
89+
[allowFobRemoval]="allowFobRemoval"
8990
(onTimeSelectionChanged)="onTimeSelectionChanged.emit($event)"
9091
(onTimeSelectionToggled)="onFobRemoved()"
9192
></scalar-card-fob-controller>

tensorboard/webapp/metrics/views/card_renderer/scalar_card_line_chart_component.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ export class ScalarCardLineChartComponent {
7272
@Input() minMaxStep!: MinMaxStep;
7373
@Input() userViewBox!: Extent | null;
7474
@Input() tooltipTemplate!: TooltipTemplate | null;
75+
@Input() allowFobRemoval!: boolean;
7576
@Input() disableTooltip!: boolean;
7677

7778
@Output()

tensorboard/webapp/metrics/views/card_renderer/scalar_card_line_chart_container.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ import {ScalarCardLineChartComponent} from './scalar_card_line_chart_component';
7979
[forceSvg]="forceSvg$ | async"
8080
[userViewBox]="userViewBox$ | async"
8181
[disableTooltip]="disableTooltip"
82+
[allowFobRemoval]="allowFobRemoval"
8283
(onTimeSelectionChanged)="onTimeSelectionChanged($event)"
8384
(onStepSelectorToggled)="onStepSelectorToggled($event)"
8485
(onLineChartZoom)="onLineChartZoom($event)"
@@ -111,6 +112,7 @@ export class ScalarCardLineChartContainer
111112
@Input() disableUpdate?: boolean = false;
112113
@Input() tooltipTemplate?: TooltipTemplate;
113114
@Input() disableTooltip?: boolean = false;
115+
@Input() allowFobRemoval?: boolean = true;
114116

115117
@ViewChild(ScalarCardLineChartComponent)
116118
scalarCardLineChart?: ScalarCardLineChartComponent;

tensorboard/webapp/metrics/views/card_renderer/scalar_card_line_chart_test.ts

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ class TestableLineChart {
172172
[tooltipTemplate]="tooltip"
173173
[minMaxStep]="minMaxStep"
174174
[stepOrLinkedTimeSelection]="stepOrLinkedTimeSelection"
175+
[allowFobRemoval]="allowFobRemoval"
175176
>
176177
</scalar-card-line-chart>
177178
<ng-template
@@ -248,6 +249,7 @@ class TestableScalarCardLineChart {
248249
@Input() dataPointForTesting: {x: number; y: number} = {x: 0, y: 0};
249250
@Input() smoothingEnabled: boolean = false;
250251
@Input() tooltipSort: TooltipSort = TooltipSort.ALPHABETICAL;
252+
@Input() allowFobRemoval: boolean = true;
251253

252254
readonly relativeXFormatter = relativeTimeFormatter;
253255
readonly valueFormatter = numberFormatter;
@@ -1577,6 +1579,66 @@ describe('scalar card line chart', () => {
15771579
expect(fobController.endFobWrapper).toBeUndefined();
15781580
}));
15791581
});
1582+
1583+
it('does not render dismiss icon for single fob removal when allowFobRemoval is false', fakeAsync(() => {
1584+
const fixture = createComponent();
1585+
fixture.componentInstance.cardId = 'card1';
1586+
fixture.componentInstance.minMaxStep = {
1587+
minStep: 0,
1588+
maxStep: 100,
1589+
};
1590+
fixture.componentInstance.stepOrLinkedTimeSelection = {
1591+
start: {step: 20},
1592+
end: null,
1593+
};
1594+
fixture.componentInstance.allowFobRemoval = false;
1595+
fixture.detectChanges();
1596+
1597+
expect(
1598+
fixture.debugElement.queryAll(By.css('[aria-label="Deselect fob"]'))
1599+
.length
1600+
).toEqual(0);
1601+
}));
1602+
1603+
it('renders dismiss icon for single fob removal when allowFobRemoval is true', fakeAsync(() => {
1604+
const fixture = createComponent();
1605+
fixture.componentInstance.cardId = 'card1';
1606+
fixture.componentInstance.minMaxStep = {
1607+
minStep: 0,
1608+
maxStep: 100,
1609+
};
1610+
fixture.componentInstance.stepOrLinkedTimeSelection = {
1611+
start: {step: 20},
1612+
end: null,
1613+
};
1614+
fixture.componentInstance.allowFobRemoval = true;
1615+
fixture.detectChanges();
1616+
1617+
expect(
1618+
fixture.debugElement.queryAll(By.css('[aria-label="Deselect fob"]'))
1619+
.length
1620+
).toEqual(1);
1621+
}));
1622+
1623+
it('renders dismiss icon for range fob removal even when allowFobRemoval is false', fakeAsync(() => {
1624+
const fixture = createComponent();
1625+
fixture.componentInstance.cardId = 'card1';
1626+
fixture.componentInstance.minMaxStep = {
1627+
minStep: 0,
1628+
maxStep: 100,
1629+
};
1630+
fixture.componentInstance.stepOrLinkedTimeSelection = {
1631+
start: {step: 20},
1632+
end: {step: 40},
1633+
};
1634+
fixture.componentInstance.allowFobRemoval = false;
1635+
fixture.detectChanges();
1636+
1637+
expect(
1638+
fixture.debugElement.queryAll(By.css('[aria-label="Deselect fob"]'))
1639+
.length
1640+
).toEqual(2);
1641+
}));
15801642
});
15811643

15821644
describe('data table line chart integration', () => {

tensorboard/webapp/widgets/card_fob/card_fob_controller_component.ng.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
></div>
5353
<card-fob
5454
class="startFob"
55+
[allowRemoval]="allowFobRemoval ? true : timeSelection.end"
5556
[ngClass]="isVertical() ? 'vertical-fob' : 'horizontal-fob'"
5657
[step]="timeSelection.start.step"
5758
(mousedown)="startDrag(Fob.START, TimeSelectionAffordance.FOB, $event)"

tensorboard/webapp/widgets/card_fob/card_fob_controller_component.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ export class CardFobControllerComponent {
6363
@Input() showExtendedLine?: Boolean = false;
6464
@Input() prospectiveStep: number | null = null;
6565
@Input() prospectiveStepAxisPosition?: number | null = null;
66+
@Input() allowFobRemoval?: boolean = true;
6667

6768
@Output() onTimeSelectionChanged =
6869
new EventEmitter<TimeSelectionWithAffordance>();

0 commit comments

Comments
 (0)