Skip to content

Commit 50aee55

Browse files
committed
More reliable and standalone onHistoryEvent(this.router) #193
1 parent 789465e commit 50aee55

File tree

2 files changed

+24
-30
lines changed

2 files changed

+24
-30
lines changed

projects/natural/src/lib/classes/abstract-list.ts

Lines changed: 8 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,22 @@
11
import {SelectionModel} from '@angular/cdk/collections';
22
import {Directive, inject, Input, OnInit} from '@angular/core';
3+
import {takeUntilDestroyed} from '@angular/core/rxjs-interop';
34
import {PageEvent} from '@angular/material/paginator';
45
import {Sort} from '@angular/material/sort';
5-
import {ActivatedRoute, Data, NavigationEnd, NavigationExtras, NavigationStart, Router} from '@angular/router';
6+
import {ActivatedRoute, Data, NavigationExtras, Router} from '@angular/router';
67
import {defaults, isEmpty, isEqual, pick} from 'lodash-es';
78
import {Observable, Subject} from 'rxjs';
89
import {NaturalAlertService} from '../modules/alert/alert.service';
10+
import {AvailableColumn} from '../modules/columns-picker/types';
911
import {NaturalAbstractPanel} from '../modules/panels/abstract-panel';
1012
import {toGraphQLDoctrineFilter} from '../modules/search/classes/graphql-doctrine';
1113
import {fromUrl, toUrl} from '../modules/search/classes/url';
1214
import {NaturalSearchFacets} from '../modules/search/types/facet';
1315
import {NaturalSearchSelections} from '../modules/search/types/values';
1416
import {NaturalAbstractModelService} from '../services/abstract-model.service';
1517
import {NaturalPersistenceService} from '../services/persistence.service';
18+
import {ExtractTall, ExtractVall, Literal} from '../types/types';
19+
import {NavigableItem} from './abstract-navigable-list';
1620
import {NaturalDataSource, PaginatedData} from './data-source';
1721
import {
1822
NaturalQueryVariablesManager,
@@ -21,12 +25,7 @@ import {
2125
Sorting,
2226
SortingOrder,
2327
} from './query-variable-manager';
24-
import {ExtractTall, ExtractVall, Literal} from '../types/types';
25-
import {NavigableItem} from './abstract-navigable-list';
26-
import {filter} from 'rxjs/operators';
27-
import {AvailableColumn} from '../modules/columns-picker/types';
28-
import {validateColumns, validatePagination, validateSorting} from './utility';
29-
import {takeUntilDestroyed} from '@angular/core/rxjs-interop';
28+
import {onHistoryEvent, validateColumns, validatePagination, validateSorting} from './utility';
3029

3130
type MaybeNavigable = Literal | NavigableItem<Literal>;
3231

@@ -195,35 +194,15 @@ export class NaturalAbstractList<
195194
}
196195

197196
protected handleHistoryNavigation(): void {
198-
// Update natural search when history changes (back/forward buttons)
199-
// History state is detectable only on NavigationStart (popstate trigger)
200-
// But we need parameters from url after NavigationEnd. So proceed in two steps with a flag.
201-
let isPopState = false;
202-
this.router.events
203-
.pipe(
204-
takeUntilDestroyed(this.destroyRef),
205-
filter(event => event instanceof NavigationStart && event.navigationTrigger === 'popstate'),
206-
)
207-
.subscribe(() => (isPopState = true));
208-
209-
this.router.events
210-
.pipe(
211-
takeUntilDestroyed(this.destroyRef),
212-
filter(event => event instanceof NavigationEnd && isPopState),
213-
filter(() => this.historyNavigationFilter()),
214-
)
197+
onHistoryEvent(this.router)
198+
.pipe(takeUntilDestroyed(this.destroyRef))
215199
.subscribe(() => {
216-
isPopState = false; // reset flag
217200
const selections = fromUrl(this.persistenceService.getFromUrl('ns', this.route));
218201
this.naturalSearchSelections = selections;
219202
this.search(selections);
220203
});
221204
}
222205

223-
protected historyNavigationFilter(): boolean {
224-
return true;
225-
}
226-
227206
/**
228207
* Persist search and then launch whatever is required to refresh the list
229208
*/

projects/natural/src/lib/classes/utility.ts

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1+
import {NavigationEnd, NavigationStart, Router} from '@angular/router';
12
import {pickBy} from 'lodash-es';
2-
import {Literal} from '../types/types';
3+
import {Observable, switchMap, take} from 'rxjs';
4+
import {filter} from 'rxjs/operators';
35
import type {ReadonlyDeep} from 'type-fest';
6+
import {Literal} from '../types/types';
47
import {PaginationInput, Sorting, SortingOrder} from './query-variable-manager';
58

69
/**
@@ -298,3 +301,15 @@ export function validateColumns(data: unknown): string[] | null {
298301

299302
return data.split(',').filter(string => string);
300303
}
304+
305+
export function onHistoryEvent(router: Router): Observable<NavigationEnd> {
306+
return router.events.pipe(
307+
filter(e => e instanceof NavigationStart && e.navigationTrigger === 'popstate'),
308+
switchMap(() =>
309+
router.events.pipe(
310+
filter(e => e instanceof NavigationEnd),
311+
take(1),
312+
),
313+
),
314+
);
315+
}

0 commit comments

Comments
 (0)