Skip to content

Commit 59e9805

Browse files
feat: Add reset button to metadata view (#231)
1 parent a2d4b8c commit 59e9805

9 files changed

+71
-12
lines changed

application/frontend/src/app/core/containers/metadata-control-bar/metadata-control-bar.component.html

+19-7
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,25 @@
22
[showModelSettings]="false"
33
[displayColumns]="displayColumns$ | async"
44
(displayColumnChange)="onDisplayColumnChange($event)">
5+
<app-filter-menu
6+
[filters]="filters$ | async"
7+
[filterOptions]="filterOptions$ | async"
8+
(addFilter)="onAddFilter($event)"
9+
(editFilter)="onEditFilter($event)"
10+
(removeFilter)="onRemoveFilter($event)">
11+
</app-filter-menu>
12+
<mat-divider vertical></mat-divider>
13+
<button
14+
mat-button
15+
class="mat-elevation-z0"
16+
color=""
17+
aria-label="Reset view"
18+
[disabled]="!(viewHasChanged$ | async)"
19+
(click)="onResetView()"
20+
title="Reset view">
21+
<mat-icon svgIcon="reset_settings"></mat-icon>
22+
<span class="reset-text">Reset view</span>
23+
</button>
524
<mat-divider preUndoRedo vertical></mat-divider>
625
<mat-button-toggle-group
726
preUndoRedo
@@ -18,13 +37,6 @@
1837
</mat-button-toggle>
1938
</mat-button-toggle-group>
2039
<mat-divider preUndoRedo vertical></mat-divider>
21-
<app-filter-menu
22-
[filters]="filters$ | async"
23-
[filterOptions]="filterOptions$ | async"
24-
(addFilter)="onAddFilter($event)"
25-
(editFilter)="onEditFilter($event)"
26-
(removeFilter)="onRemoveFilter($event)">
27-
</app-filter-menu>
2840
<mat-select
2941
(selectionChange)="onSelectionChange($event.value)"
3042
[value]="page$ | async"

application/frontend/src/app/core/containers/metadata-control-bar/metadata-control-bar.component.scss

+6
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,9 @@ mat-divider {
3030
height: 4em;
3131
margin: 0 0.5em;
3232
}
33+
34+
@media only screen and (max-width: 1600px) {
35+
.reset-text {
36+
display: none;
37+
}
38+
}

application/frontend/src/app/core/containers/metadata-control-bar/metadata-control-bar.component.spec.ts

+3
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import { FakeMatIconRegistry } from 'src/test/material-fakes';
2727
import RoutesMetadataSelectors from '../../selectors/routes-metadata.selectors';
2828
import * as fromUI from '../../selectors/ui.selectors';
2929
import { MetadataControlBarComponent } from './metadata-control-bar.component';
30+
import RoutesChartSelectors from '../../selectors/routes-chart.selectors';
3031

3132
describe('MetadataControlBarComponent', () => {
3233
let component: MetadataControlBarComponent;
@@ -45,6 +46,8 @@ describe('MetadataControlBarComponent', () => {
4546
{ selector: RoutesMetadataSelectors.selectAvailableDisplayColumnsOptions, value: [] },
4647
{ selector: RoutesMetadataSelectors.selectFilters, value: [] },
4748
{ selector: RoutesMetadataSelectors.selectDisplayColumns, value: null },
49+
{ selector: RoutesChartSelectors.selectViewHasChanged, value: false },
50+
{ selector: RoutesMetadataSelectors.selectViewHasChanged, value: false },
4851
],
4952
}),
5053
],

application/frontend/src/app/core/containers/metadata-control-bar/metadata-control-bar.component.ts

+14-2
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,18 @@ import {
2424
} from '@angular/core';
2525
import { Router } from '@angular/router';
2626
import { select, Store } from '@ngrx/store';
27-
import { Observable, Subscription } from 'rxjs';
27+
import { combineLatest, Observable, Subscription } from 'rxjs';
2828
import { exhaustMap, map, switchMap, take } from 'rxjs/operators';
2929
import { FilterMenuComponent } from 'src/app/shared/components';
3030
import { ActiveFilter, FilterOption } from 'src/app/shared/models';
3131
import { FilterService } from 'src/app/shared/services';
3232
import { positionTopLeftRelativeToTopLeft } from 'src/app/util';
33-
import { MetadataControlBarActions } from '../../actions';
33+
import { MetadataControlBarActions, RoutesChartActions } from '../../actions';
3434
import { Column, Page } from '../../models';
3535
import RoutesMetadataSelectors from '../../selectors/routes-metadata.selectors';
3636
import * as fromShipmentsMetadata from '../../selectors/shipments-metadata.selectors';
3737
import * as fromUI from '../../selectors/ui.selectors';
38+
import RoutesChartSelectors from '../../selectors/routes-chart.selectors';
3839

3940
export type MetadataSelectors = typeof RoutesMetadataSelectors | typeof fromShipmentsMetadata;
4041

@@ -52,6 +53,8 @@ export class MetadataControlBarComponent implements OnInit, OnDestroy {
5253
displayColumns$: Observable<Column[]>;
5354
page$: Observable<Page>;
5455
pageToggle$: Observable<Page>;
56+
viewHasChanged$: Observable<boolean>;
57+
5558
private pageSelectors$: Observable<{ page: Page; selectors: MetadataSelectors }>;
5659
private addSubscription: Subscription;
5760
private editSubscription: Subscription;
@@ -88,6 +91,11 @@ export class MetadataControlBarComponent implements OnInit, OnDestroy {
8891
this.store.pipe(select(selectors.selectAvailableDisplayColumnsOptions))
8992
)
9093
);
94+
95+
this.viewHasChanged$ = combineLatest([
96+
this.store.pipe(select(RoutesChartSelectors.selectViewHasChanged)),
97+
this.store.pipe(select(RoutesMetadataSelectors.selectViewHasChanged)),
98+
]).pipe(map(([chartChanged, metadataChanged]) => chartChanged || metadataChanged));
9199
}
92100

93101
ngOnDestroy(): void {
@@ -182,4 +190,8 @@ export class MetadataControlBarComponent implements OnInit, OnDestroy {
182190
onToggleChange(selection: Page): void {
183191
this.router.navigateByUrl('/' + selection, { skipLocationChange: true });
184192
}
193+
194+
onResetView(): void {
195+
this.store.dispatch(RoutesChartActions.resetView());
196+
}
185197
}

application/frontend/src/app/core/containers/routes-chart-control-bar/routes-chart-control-bar.component.spec.ts

+3
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import Long from 'long';
3131
import { Page } from '../../models';
3232
import * as fromUI from 'src/app/core/selectors/ui.selectors';
3333
import { Component, EventEmitter, Input, Output } from '@angular/core';
34+
import RoutesMetadataSelectors from '../../selectors/routes-metadata.selectors';
3435

3536
@Component({
3637
selector: 'app-time-navigation',
@@ -78,6 +79,8 @@ describe('RoutesChartControlBarComponent', () => {
7879
{ selector: RoutesChartSelectors.selectRangeOffset, value: 0 },
7980
{ selector: RoutesChartSelectors.selectSelectedRange, value: null },
8081
{ selector: fromUI.selectPage, value: Page.RoutesChart },
82+
{ selector: RoutesChartSelectors.selectViewHasChanged, value: false },
83+
{ selector: RoutesMetadataSelectors.selectViewHasChanged, value: false },
8184
],
8285
}),
8386
],

application/frontend/src/app/core/containers/routes-chart-control-bar/routes-chart-control-bar.component.ts

+6-2
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import {
2323
ViewChild,
2424
} from '@angular/core';
2525
import { select, Store } from '@ngrx/store';
26-
import { Observable, Subscription } from 'rxjs';
26+
import { combineLatest, Observable, Subscription } from 'rxjs';
2727
import { exhaustMap, map, take } from 'rxjs/operators';
2828
import * as fromConfig from 'src/app/core/selectors/config.selectors';
2929
import RoutesChartSelectors from 'src/app/core/selectors/routes-chart.selectors';
@@ -37,6 +37,7 @@ import { Router } from '@angular/router';
3737
import { Range } from 'src/app/shared/models';
3838
import ShipmentModelSelectors from '../../selectors/shipment-model.selectors';
3939
import * as fromUI from 'src/app/core/selectors/ui.selectors';
40+
import RoutesMetadataSelectors from '../../selectors/routes-metadata.selectors';
4041

4142
@Component({
4243
selector: 'app-routes-chart-control-bar',
@@ -86,7 +87,10 @@ export class RoutesChartControlBarComponent implements OnInit, OnDestroy {
8687
select(fromUI.selectPage),
8788
map((page) => (page === Page.ShipmentsMetadata ? Page.RoutesMetadata : page))
8889
);
89-
this.viewHasChanged$ = this.store.pipe(select(RoutesChartSelectors.selectViewHasChanged));
90+
this.viewHasChanged$ = combineLatest([
91+
this.store.pipe(select(RoutesChartSelectors.selectViewHasChanged)),
92+
this.store.pipe(select(RoutesMetadataSelectors.selectViewHasChanged)),
93+
]).pipe(map(([chartChanged, metadataChanged]) => chartChanged || metadataChanged));
9094
}
9195

9296
ngOnDestroy(): void {

application/frontend/src/app/core/reducers/routes-metadata.reducer.ts

+2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import {
2121
MetadataControlBarActions,
2222
RoutesMetadataActions,
2323
PostSolveMetricsActions,
24+
RoutesChartActions,
2425
} from '../actions';
2526
import { Page, routeIdMetadataFilterOption } from '../models';
2627

@@ -93,6 +94,7 @@ export const reducer = createReducer(
9394
}
9495
: state
9596
),
97+
on(RoutesChartActions.resetView, () => initialState),
9698
on(RoutesMetadataActions.changeSort, (state, { active, direction }) => ({
9799
...state,
98100
sort: { active, direction },

application/frontend/src/app/core/selectors/routes-metadata.selectors.ts

+17
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,22 @@ const selectDisplayColumns = createSelector(
357357
}
358358
);
359359

360+
const selectViewHasChanged = createSelector(
361+
selectFilters,
362+
selectPageIndex,
363+
selectPageSize,
364+
selectSelected,
365+
selectDisplayColumnsState,
366+
selectSort,
367+
(filters, pageIndex, pageSize, selected, displayColumns, sort) =>
368+
filters.length > 0 ||
369+
pageIndex !== 0 ||
370+
pageSize !== 25 ||
371+
selected.length > 0 ||
372+
!!displayColumns ||
373+
sort.direction?.length > 0
374+
);
375+
360376
export const RoutesMetadataSelectors = {
361377
selectDisplayColumns,
362378
selectColumnsToDisplay,
@@ -386,6 +402,7 @@ export const RoutesMetadataSelectors = {
386402
selectSort,
387403
selectPageSize,
388404
selectPageIndex,
405+
selectViewHasChanged,
389406
};
390407

391408
export default RoutesMetadataSelectors;

application/lerna.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@
88
"$schema": "node_modules/lerna/schemas/lerna-schema.json",
99
"useNx": false,
1010
"useWorkspaces": false
11-
}
11+
}

0 commit comments

Comments
 (0)