Skip to content

Commit 270c500

Browse files
authored
Column Customization: Move header order to NGRX (#6078)
* Motivation for features / changes This is part of the Column Customization effort which will allow users to select which headers they want to appear in the scalar card data table and in which order. In order to do this we need to have that selection and order stored in the ngrx state . This change simply moves that information from being set in the ScalarCardContainer to being set in the default ngrx state. * Technical description of changes In order to make no visible changes in production I added special logic to remove the smoothed column if smoothing is disabled. I think there should be some discussion on how this is handled in the future. * Screenshots of UI changes No visible change to users
1 parent 66a11b2 commit 270c500

File tree

7 files changed

+87
-23
lines changed

7 files changed

+87
-23
lines changed

tensorboard/webapp/metrics/store/BUILD

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ tf_ts_library(
2222
"//tensorboard/webapp/metrics:utils",
2323
"//tensorboard/webapp/metrics/actions",
2424
"//tensorboard/webapp/metrics/data_source",
25+
"//tensorboard/webapp/metrics/views/card_renderer:scalar_card_types",
2526
"//tensorboard/webapp/persistent_settings",
2627
"//tensorboard/webapp/types",
2728
"//tensorboard/webapp/util:dom",
@@ -69,6 +70,7 @@ tf_ts_library(
6970
"//tensorboard/webapp/app_routing:namespaced_state_reducer_helper",
7071
"//tensorboard/webapp/metrics:internal_types",
7172
"//tensorboard/webapp/metrics/data_source",
73+
"//tensorboard/webapp/metrics/views/card_renderer:scalar_card_types",
7274
"//tensorboard/webapp/types",
7375
"//tensorboard/webapp/util:dom",
7476
],

tensorboard/webapp/metrics/store/metrics_reducers.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ import {
4646
URLDeserializedState,
4747
} from '../internal_types';
4848
import {groupCardIdWithMetdata} from '../utils';
49+
import {ColumnHeaders} from '../views/card_renderer/scalar_card_types';
4950
import {
5051
buildOrReturnStateWithPinnedCopy,
5152
buildOrReturnStateWithUnresolvedImportedPins,
@@ -262,6 +263,24 @@ const {initialState, reducers: namespaceContextedReducer} =
262263
linkedTimeEnabled: false,
263264
stepSelectorEnabled: false,
264265
rangeSelectionEnabled: false,
266+
singleSelectionHeaders: [
267+
ColumnHeaders.RUN,
268+
ColumnHeaders.SMOOTHED,
269+
ColumnHeaders.VALUE,
270+
ColumnHeaders.STEP,
271+
ColumnHeaders.RELATIVE_TIME,
272+
],
273+
rangeSelectionHeaders: [
274+
ColumnHeaders.RUN,
275+
ColumnHeaders.MIN_VALUE,
276+
ColumnHeaders.MAX_VALUE,
277+
ColumnHeaders.START_VALUE,
278+
ColumnHeaders.END_VALUE,
279+
ColumnHeaders.VALUE_CHANGE,
280+
ColumnHeaders.PERCENTAGE_CHANGE,
281+
ColumnHeaders.START_STEP,
282+
ColumnHeaders.END_STEP,
283+
],
265284
filteredPluginTypes: new Set(),
266285
stepMinMax: {
267286
min: Infinity,

tensorboard/webapp/metrics/store/metrics_selectors.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import {
3030
TooltipSort,
3131
XAxisType,
3232
} from '../internal_types';
33+
import {ColumnHeaders} from '../views/card_renderer/scalar_card_types';
3334
import * as storeUtils from './metrics_store_internal_utils';
3435
import {
3536
CardMetadataMap,
@@ -386,6 +387,20 @@ export const getMetricsStepMinMax = createSelector(
386387
}
387388
);
388389

390+
export const getSingleSelectionHeaders = createSelector(
391+
selectMetricsState,
392+
(state: MetricsState): ColumnHeaders[] => {
393+
return state.singleSelectionHeaders;
394+
}
395+
);
396+
397+
export const getRangeSelectionHeaders = createSelector(
398+
selectMetricsState,
399+
(state: MetricsState): ColumnHeaders[] => {
400+
return state.rangeSelectionHeaders;
401+
}
402+
);
403+
389404
/**
390405
* Returns value of the linked time set by user. When linked time selection is never
391406
* set, it returns the default value which is derived from the timeseries data

tensorboard/webapp/metrics/store/metrics_types.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import {
3636
TooltipSort,
3737
XAxisType,
3838
} from '../internal_types';
39+
import {ColumnHeaders} from '../views/card_renderer/scalar_card_types';
3940

4041
export const METRICS_FEATURE_KEY = 'metrics';
4142

@@ -176,6 +177,8 @@ export interface MetricsNamespacedState {
176177
linkedTimeEnabled: boolean;
177178
stepSelectorEnabled: boolean;
178179
rangeSelectionEnabled: boolean;
180+
singleSelectionHeaders: ColumnHeaders[];
181+
rangeSelectionHeaders: ColumnHeaders[];
179182
// Empty Set would signify "show all". `filteredPluginTypes` will never have
180183
// all pluginTypes in the Set.
181184
filteredPluginTypes: Set<PluginType>;

tensorboard/webapp/metrics/testing.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,8 @@ function buildBlankState(): MetricsState {
102102
linkedTimeEnabled: false,
103103
stepSelectorEnabled: false,
104104
rangeSelectionEnabled: false,
105+
singleSelectionHeaders: [],
106+
rangeSelectionHeaders: [],
105107
filteredPluginTypes: new Set(),
106108
stepMinMax: {min: Infinity, max: -Infinity},
107109
isSettingsPaneOpen: false,

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

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ import {
8383
getMetricsScalarSmoothing,
8484
getMetricsTooltipSort,
8585
getMetricsXAxisType,
86+
getRangeSelectionHeaders,
87+
getSingleSelectionHeaders,
8688
RunToSeries,
8789
} from '../../store';
8890
import {CardId, CardMetadata, XAxisType} from '../../types';
@@ -483,32 +485,33 @@ export class ScalarCardContainer implements CardRenderer, OnInit, OnDestroy {
483485
this.columnHeaders$ = combineLatest([
484486
this.smoothingEnabled$,
485487
this.stepOrLinkedTimeSelection$,
488+
this.store.select(getSingleSelectionHeaders),
489+
this.store.select(getRangeSelectionHeaders),
486490
]).pipe(
487-
map(([smoothingEnabled, timeSelection]) => {
488-
const headers: ColumnHeaders[] = [];
489-
if (timeSelection === null || timeSelection.end === null) {
490-
// Single Step Selected
491-
headers.push(ColumnHeaders.RUN);
492-
if (smoothingEnabled) {
493-
headers.push(ColumnHeaders.SMOOTHED);
491+
map(
492+
([
493+
smoothingEnabled,
494+
timeSelection,
495+
singleSelectionHeaders,
496+
rangeSelectionHeaders,
497+
]) => {
498+
const headers: ColumnHeaders[] = [];
499+
if (timeSelection === null || timeSelection.end === null) {
500+
if (!smoothingEnabled) {
501+
// Return single selection headers without smoothed header.
502+
const indexOfSmoothed = singleSelectionHeaders.indexOf(
503+
ColumnHeaders.SMOOTHED
504+
);
505+
return singleSelectionHeaders
506+
.slice(0, indexOfSmoothed)
507+
.concat(singleSelectionHeaders.slice(indexOfSmoothed + 1));
508+
}
509+
return singleSelectionHeaders;
510+
} else {
511+
return rangeSelectionHeaders;
494512
}
495-
headers.push(ColumnHeaders.VALUE);
496-
headers.push(ColumnHeaders.STEP);
497-
headers.push(ColumnHeaders.RELATIVE_TIME);
498-
} else {
499-
// Range selection headers.
500-
headers.push(ColumnHeaders.RUN);
501-
headers.push(ColumnHeaders.MIN_VALUE);
502-
headers.push(ColumnHeaders.MAX_VALUE);
503-
headers.push(ColumnHeaders.START_VALUE);
504-
headers.push(ColumnHeaders.END_VALUE);
505-
headers.push(ColumnHeaders.VALUE_CHANGE);
506-
headers.push(ColumnHeaders.PERCENTAGE_CHANGE);
507-
headers.push(ColumnHeaders.START_STEP);
508-
headers.push(ColumnHeaders.END_STEP);
509513
}
510-
return headers;
511-
})
514+
)
512515
);
513516

514517
this.chartMetadataMap$ = partitionedSeries$.pipe(

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ import {
8181
getMetricsRangeSelectionEnabled,
8282
getMetricsScalarSmoothing,
8383
getMetricsStepSelectorEnabled,
84+
getRangeSelectionHeaders,
85+
getSingleSelectionHeaders,
8486
} from '../../store';
8587
import {
8688
appStateFromMetricsState,
@@ -2552,6 +2554,24 @@ describe('scalar card', () => {
25522554
describe('getTimeSelectionTableData', () => {
25532555
beforeEach(() => {
25542556
store.overrideSelector(getMetricsLinkedTimeEnabled, true);
2557+
store.overrideSelector(getSingleSelectionHeaders, [
2558+
ColumnHeaders.RUN,
2559+
ColumnHeaders.SMOOTHED,
2560+
ColumnHeaders.VALUE,
2561+
ColumnHeaders.STEP,
2562+
ColumnHeaders.RELATIVE_TIME,
2563+
]);
2564+
store.overrideSelector(getRangeSelectionHeaders, [
2565+
ColumnHeaders.RUN,
2566+
ColumnHeaders.MIN_VALUE,
2567+
ColumnHeaders.MAX_VALUE,
2568+
ColumnHeaders.START_VALUE,
2569+
ColumnHeaders.END_VALUE,
2570+
ColumnHeaders.VALUE_CHANGE,
2571+
ColumnHeaders.PERCENTAGE_CHANGE,
2572+
ColumnHeaders.START_STEP,
2573+
ColumnHeaders.END_STEP,
2574+
]);
25552575
});
25562576

25572577
it('builds single selected step data object', fakeAsync(() => {

0 commit comments

Comments
 (0)