Component,
EventEmitter,
Input,
- NgZone,
OnChanges,
OnDestroy,
OnInit,
TableColumnProp
} from '@swimlane/ngx-datatable';
import _ from 'lodash';
-import { Observable, Subject, Subscription, timer as observableTimer } from 'rxjs';
+import { Observable, of, Subject, Subscription } from 'rxjs';
import { TableStatus } from '~/app/shared/classes/table-status';
import { CellTemplate } from '~/app/shared/enum/cell-template.enum';
import { CdTableFetchDataContext } from '~/app/shared/models/cd-table-fetch-data-context';
import { CdTableSelection } from '~/app/shared/models/cd-table-selection';
import { CdUserConfig } from '~/app/shared/models/cd-user-config';
+import { TimerService } from '~/app/shared/services/timer.service';
@Component({
selector: 'cd-table',
});
}
- constructor(private ngZone: NgZone, private cdRef: ChangeDetectorRef) {}
+ constructor(
+ // private ngZone: NgZone,
+ private cdRef: ChangeDetectorRef,
+ private timerService: TimerService
+ ) {}
static prepareSearch(search: string) {
search = search.toLowerCase().replace(/,/g, '');
this.loadingIndicator = true;
}
if (_.isInteger(this.autoReload) && this.autoReload > 0) {
- this.ngZone.runOutsideAngular(() => {
- this.reloadSubscriber = observableTimer(0, this.autoReload).subscribe(() => {
- this.ngZone.run(() => {
- return this.reloadData();
- });
+ this.reloadSubscriber = this.timerService
+ .get(() => of(0), this.autoReload)
+ .subscribe(() => {
+ this.reloadData();
});
- });
} else if (!this.autoReload) {
this.reloadData();
} else {
--- /dev/null
+import { fromEvent, Observable, partition } from 'rxjs';
+import { repeatWhen, shareReplay, takeUntil } from 'rxjs/operators';
+
+export function whenPageVisible() {
+ const visibilitychange$ = fromEvent(document, 'visibilitychange').pipe(
+ shareReplay({ refCount: true, bufferSize: 1 })
+ );
+
+ const [pageVisible$, pageHidden$] = partition(
+ visibilitychange$,
+ () => document.visibilityState === 'visible'
+ );
+
+ return function <T>(source: Observable<T>) {
+ return source.pipe(
+ takeUntil(pageHidden$),
+ repeatWhen(() => pageVisible$)
+ );
+ };
+}
import { catchError, delay, mergeMap, repeat, tap } from 'rxjs/operators';
import { Motd, MotdService } from '~/app/shared/api/motd.service';
+import { whenPageVisible } from '../rxjs/operators/page-visibilty.operator';
@Injectable({
providedIn: 'root'
}),
tap((motd: Motd | null) => this.processResponse(motd)),
delay(60000),
- repeat()
+ repeat(),
+ whenPageVisible()
)
.subscribe();
}
import { Observable, timer } from 'rxjs';
import { observeOn, shareReplay, switchMap } from 'rxjs/operators';
+import { whenPageVisible } from '../rxjs/operators/page-visibilty.operator';
import { NgZoneSchedulerService } from './ngzone-scheduler.service';
@Injectable({
return timer(dueTime, refreshInterval, this.ngZone.leave).pipe(
observeOn(this.ngZone.enter),
switchMap(next),
- shareReplay({ refCount: true, bufferSize: 1 })
+ shareReplay({ refCount: true, bufferSize: 1 }),
+ whenPageVisible()
);
}
}