Skip to content

Commit 6ba778e

Browse files
committed
add saving-pins-checkbox to the settings view component
1 parent 05e06f5 commit 6ba778e

File tree

5 files changed

+86
-16
lines changed

5 files changed

+86
-16
lines changed

tensorboard/webapp/metrics/views/right_pane/BUILD

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ tf_ng_module(
2525
srcs = [
2626
"right_pane_component.ts",
2727
"right_pane_module.ts",
28+
"saving_pins_checkbox_component.ts",
2829
"settings_view_component.ts",
2930
"settings_view_container.ts",
30-
"saving_pins_checkbox_component.ts",
3131
],
3232
assets = [
3333
":settings_view_styles",
@@ -40,12 +40,14 @@ tf_ng_module(
4040
"//tensorboard/webapp/angular:expect_angular_material_button",
4141
"//tensorboard/webapp/angular:expect_angular_material_button_toggle",
4242
"//tensorboard/webapp/angular:expect_angular_material_checkbox",
43+
"//tensorboard/webapp/angular:expect_angular_material_dialog",
4344
"//tensorboard/webapp/angular:expect_angular_material_icon",
4445
"//tensorboard/webapp/angular:expect_angular_material_select",
4546
"//tensorboard/webapp/angular:expect_angular_material_slider",
4647
"//tensorboard/webapp/feature_flag",
4748
"//tensorboard/webapp/metrics:types",
4849
"//tensorboard/webapp/metrics/actions",
50+
"//tensorboard/webapp/metrics/views/right_pane/saving_pins_dialog",
4951
"//tensorboard/webapp/widgets/card_fob:types",
5052
"//tensorboard/webapp/widgets/dropdown",
5153
"//tensorboard/webapp/widgets/range_input",
@@ -71,14 +73,14 @@ tf_ts_library(
7173
"//tensorboard/webapp/angular:expect_angular_core_testing",
7274
"//tensorboard/webapp/angular:expect_angular_material_button_toggle",
7375
"//tensorboard/webapp/angular:expect_angular_material_checkbox",
74-
"//tensorboard/webapp/metrics/views/right_pane/saving_pins_dialog",
7576
"//tensorboard/webapp/angular:expect_angular_material_select",
7677
"//tensorboard/webapp/angular:expect_angular_material_slider",
7778
"//tensorboard/webapp/angular:expect_angular_platform_browser_animations",
7879
"//tensorboard/webapp/angular:expect_ngrx_store_testing",
7980
"//tensorboard/webapp/metrics:types",
8081
"//tensorboard/webapp/metrics/actions",
8182
"//tensorboard/webapp/metrics/store",
83+
"//tensorboard/webapp/metrics/views/right_pane/saving_pins_dialog",
8284
"//tensorboard/webapp/testing:utils",
8385
"//tensorboard/webapp/widgets/card_fob:types",
8486
"//tensorboard/webapp/widgets/dropdown",

tensorboard/webapp/metrics/views/right_pane/right_pane_module.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import {SavingPinsDialogModule} from './saving_pins_dialog/saving_pins_dialog_mo
4343
MatButtonModule,
4444
MatButtonToggleModule,
4545
MatCheckboxModule,
46+
SavingPinsDialogModule,
4647
MatIconModule,
4748
MatSelectModule,
4849
MatSliderModule,

tensorboard/webapp/metrics/views/right_pane/right_pane_test.ts

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import {
1919
TestBed,
2020
tick,
2121
} from '@angular/core/testing';
22+
import {OverlayContainer} from '@angular/cdk/overlay';
2223
import {MatButtonToggleModule} from '@angular/material/button-toggle';
2324
import {MatCheckboxModule} from '@angular/material/checkbox';
2425
import {MatSelectModule} from '@angular/material/select';
@@ -37,10 +38,13 @@ import {HistogramMode, TooltipSort, XAxisType} from '../../types';
3738
import {RightPaneComponent} from './right_pane_component';
3839
import {SettingsViewComponent, TEST_ONLY} from './settings_view_component';
3940
import {SettingsViewContainer} from './settings_view_container';
41+
import {SavingPinsDialogModule} from './saving_pins_dialog/saving_pins_dialog_module';
42+
import {SavingPinsCheckboxComponent} from './saving_pins_checkbox_component';
4043

4144
describe('metrics right_pane', () => {
4245
let store: MockStore<State>;
4346
let dispatchSpy: jasmine.Spy;
47+
let overlayContainer: OverlayContainer;
4448

4549
beforeEach(async () => {
4650
await TestBed.configureTestingModule({
@@ -49,13 +53,15 @@ describe('metrics right_pane', () => {
4953
DropdownModule,
5054
MatButtonToggleModule,
5155
MatCheckboxModule,
56+
SavingPinsDialogModule,
5257
MatSelectModule,
5358
MatSliderModule,
5459
],
5560
declarations: [
5661
RightPaneComponent,
5762
SettingsViewComponent,
5863
SettingsViewContainer,
64+
SavingPinsCheckboxComponent,
5965
],
6066
providers: [provideMockTbStore()],
6167
// Ignore errors from components that are out-of-scope for this test:
@@ -65,6 +71,7 @@ describe('metrics right_pane', () => {
6571

6672
store = TestBed.inject<Store<State>>(Store) as MockStore<State>;
6773
dispatchSpy = spyOn(store, 'dispatch');
74+
overlayContainer = TestBed.inject(OverlayContainer);
6875
});
6976

7077
afterEach(() => {
@@ -574,17 +581,64 @@ describe('metrics right_pane', () => {
574581
).toBeTrue();
575582
});
576583

577-
it('dispatches metricsEnableSavingPinsToggled on toggle', () => {
584+
it('dispatches metricsEnableSavingPinsToggled if user checks the box', () => {
578585
const fixture = TestBed.createComponent(SettingsViewContainer);
579586
fixture.detectChanges();
580587

581588
const checkbox = select(fixture, '.saving-pins input');
582589
checkbox.nativeElement.click();
583590

591+
const savingPinsDialog = overlayContainer
592+
.getContainerElement()
593+
.querySelectorAll('saving-pins-dialog');
594+
expect(savingPinsDialog.length).toBe(0);
584595
expect(dispatchSpy).toHaveBeenCalledWith(
585596
actions.metricsEnableSavingPinsToggled()
586597
);
587598
});
599+
600+
it('dispatches metricsEnableSavingPinsToggled if users clicks disable in the dialog', async () => {
601+
store.overrideSelector(selectors.getMetricsSavingPinsEnabled, true);
602+
const fixture = TestBed.createComponent(SettingsViewContainer);
603+
fixture.detectChanges();
604+
605+
const checkbox = select(fixture, '.saving-pins input');
606+
checkbox.nativeElement.click();
607+
608+
const savingPinsDialog = overlayContainer
609+
.getContainerElement()
610+
.querySelectorAll('saving-pins-dialog');
611+
612+
const disableButton = overlayContainer
613+
.getContainerElement()
614+
.querySelector('.disable-button');
615+
(disableButton as HTMLButtonElement).click();
616+
fixture.detectChanges();
617+
await fixture.whenStable();
618+
619+
expect(savingPinsDialog.length).toBe(1);
620+
expect(dispatchSpy).toHaveBeenCalledWith(
621+
actions.metricsEnableSavingPinsToggled()
622+
);
623+
});
624+
625+
it('does not dispatch metricsEnableSavingPinsToggled if users cancels the dialog', async () => {
626+
store.overrideSelector(selectors.getMetricsSavingPinsEnabled, true);
627+
const fixture = TestBed.createComponent(SettingsViewContainer);
628+
fixture.detectChanges();
629+
630+
const checkbox = select(fixture, '.saving-pins input');
631+
checkbox.nativeElement.click();
632+
633+
const disableButton = overlayContainer
634+
.getContainerElement()
635+
.querySelector('.cancel-button');
636+
(disableButton as HTMLButtonElement).click();
637+
fixture.detectChanges();
638+
await fixture.whenStable();
639+
640+
expect(dispatchSpy).not.toHaveBeenCalled();
641+
});
588642
});
589643
});
590644
});

tensorboard/webapp/metrics/views/right_pane/settings_view_component.ng.html

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -95,16 +95,11 @@ <h3 class="section-title">General</h3>
9595
</div>
9696

9797
<div class="control-row saving-pins" *ngIf="globalPinsFeatureEnabled">
98-
<mat-checkbox
99-
[checked]="isSavingPinsEnabled"
100-
(change)="onEnableSavingPinsToggled.emit()"
101-
>Enable saving pins (Scalars only)</mat-checkbox
98+
<saving-pins-checkbox
99+
[isChecked]="isSavingPinsEnabled"
100+
(onCheckboxToggled)="onEnableSavingPinsToggled.emit(isSavingPinsEnabled)"
102101
>
103-
<mat-icon
104-
class="info"
105-
svgIcon="help_outline_24px"
106-
title="When saving pins are enabled, pinned cards will be visible across multiple experiments."
107-
></mat-icon>
102+
</saving-pins-checkbox>
108103
</div>
109104
</section>
110105

tensorboard/webapp/metrics/views/right_pane/settings_view_container.ts

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ limitations under the License.
1414
==============================================================================*/
1515
import {ChangeDetectionStrategy, Component} from '@angular/core';
1616
import {Store} from '@ngrx/store';
17+
import {MatDialog} from '@angular/material/dialog';
1718
import {Observable} from 'rxjs';
1819
import {filter, map, take, withLatestFrom} from 'rxjs/operators';
1920
import {State} from '../../../app_state';
@@ -40,6 +41,10 @@ import {
4041
stepSelectorToggled,
4142
} from '../../actions';
4243
import {HistogramMode, TooltipSort, XAxisType} from '../../types';
44+
import {
45+
SavingPinsDialogComponent,
46+
SavingPinsDialogResult,
47+
} from './saving_pins_dialog/saving_pins_dialog_component';
4348

4449
@Component({
4550
selector: 'metrics-dashboard-settings',
@@ -85,15 +90,18 @@ import {HistogramMode, TooltipSort, XAxisType} from '../../types';
8590
(rangeSelectionToggled)="onRangeSelectionToggled()"
8691
(onSlideOutToggled)="onSlideOutToggled()"
8792
[isSavingPinsEnabled]="isSavingPinsEnabled$ | async"
88-
(onEnableSavingPinsToggled)="onEnableSavingPinsToggled()"
93+
(onEnableSavingPinsToggled)="onEnableSavingPinsToggled($event)"
8994
[globalPinsFeatureEnabled]="globalPinsFeatureEnabled$ | async"
9095
>
9196
</metrics-dashboard-settings-component>
9297
`,
9398
changeDetection: ChangeDetectionStrategy.OnPush,
9499
})
95100
export class SettingsViewContainer {
96-
constructor(private readonly store: Store<State>) {}
101+
constructor(
102+
private readonly store: Store<State>,
103+
private readonly dialog: MatDialog
104+
) {}
97105

98106
readonly isScalarStepSelectorEnabled$: Observable<boolean> =
99107
this.store.select(selectors.getMetricsStepSelectorEnabled);
@@ -234,7 +242,17 @@ export class SettingsViewContainer {
234242
this.store.dispatch(metricsSlideoutMenuToggled());
235243
}
236244

237-
onEnableSavingPinsToggled() {
238-
this.store.dispatch(metricsEnableSavingPinsToggled());
245+
onEnableSavingPinsToggled(isChecked: boolean) {
246+
if (isChecked) {
247+
// Show a dialog when user disables the saving pins feature.
248+
const dialogRef = this.dialog.open(SavingPinsDialogComponent);
249+
dialogRef.afterClosed().subscribe((result?: SavingPinsDialogResult) => {
250+
if (result?.shouldDisable) {
251+
this.store.dispatch(metricsEnableSavingPinsToggled());
252+
}
253+
});
254+
} else {
255+
this.store.dispatch(metricsEnableSavingPinsToggled());
256+
}
239257
}
240258
}

0 commit comments

Comments
 (0)