diff --git a/src/app/app.component.html b/src/app/app.component.html index 007bddebb8..4fa951c1ee 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -1,4 +1,4 @@ - + diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 9bef717799..53270d3321 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -33,10 +33,10 @@ import {warpRouteAnimation} from './ui/animations/warp-route'; import {NoteService} from './features/note/note.service'; import {BreakpointObserver} from '@angular/cdk/layout'; import {DOCUMENT} from '@angular/common'; -import {map, take} from 'rxjs/operators'; +import {filter, map, take} from 'rxjs/operators'; import {MigrateService} from './imex/migrate/migrate.service'; import {combineLatest, Observable} from 'rxjs'; -import {selectIsAllProjectDataLoaded} from './features/project/store/project.reducer'; +import {selectIsRelatedDataLoadedForCurrentProject} from './features/project/store/project.reducer'; import {Store} from '@ngrx/store'; import {fadeAnimation} from './ui/animations/fade.ani'; import {IS_MAC} from './util/is-mac'; @@ -59,10 +59,14 @@ const SIDE_PANEL_BREAKPOINT = 900; changeDetection: ChangeDetectionStrategy.OnPush, }) export class AppComponent implements OnInit { - isAllDataLoaded$: Observable = combineLatest( - this._store.select(selectIsAllProjectDataLoaded), + isAllDataLoadedInitially$: Observable = combineLatest( + this._store.select(selectIsRelatedDataLoadedForCurrentProject), this._store.select(selectIsTaskDataLoaded), - ).pipe(map(([isProjectDataLoaded, isTaskDataLoaded]) => isProjectDataLoaded && isTaskDataLoaded)); + ).pipe( + map(([isProjectDataLoaded, isTaskDataLoaded]) => isProjectDataLoaded && isTaskDataLoaded), + filter(isLoaded => isLoaded), + take(1), + ); isSidePanelBp$: Observable = this._breakPointObserver.observe([ `(max-width: ${SIDE_PANEL_BREAKPOINT}px)`, ]).pipe(map(result => result.matches)); diff --git a/src/app/features/project/project.service.ts b/src/app/features/project/project.service.ts index fb7cdbee42..fb81506161 100644 --- a/src/app/features/project/project.service.ts +++ b/src/app/features/project/project.service.ts @@ -24,6 +24,7 @@ import { selectArchivedProjects, selectCurrentProject, selectCurrentProjectId, + selectIsRelatedDataLoadedForCurrentProject, selectProjectBasicCfg, selectProjectBreakNr, selectProjectBreakNrForDay, @@ -54,6 +55,8 @@ import {SnackService} from '../../core/snack/snack.service'; providedIn: 'root', }) export class ProjectService { + isRelatedDataLoadedForCurrentProject$: Observable = this._store$.pipe(select(selectIsRelatedDataLoadedForCurrentProject)); + list$: Observable = this._store$.pipe(select(selectUnarchivedProjects)); archived$: Observable = this._store$.pipe(select(selectArchivedProjects)); currentProject$: Observable = this._store$.pipe( diff --git a/src/app/features/project/store/project.reducer.ts b/src/app/features/project/store/project.reducer.ts index 6f9bcfb687..3b6d1b007f 100644 --- a/src/app/features/project/store/project.reducer.ts +++ b/src/app/features/project/store/project.reducer.ts @@ -1,16 +1,16 @@ -import { createEntityAdapter, EntityAdapter, EntityState } from '@ngrx/entity'; -import { BreakNr, BreakNrCopy, Project, ProjectBasicCfg, WorkStartEnd } from '../project.model'; -import { ProjectActions, ProjectActionTypes } from './project.actions'; -import { createFeatureSelector, createSelector } from '@ngrx/store'; -import { FIRST_PROJECT } from '../project.const'; -import { sortStringDates } from '../../../util/sortStringDates'; +import {createEntityAdapter, EntityAdapter, EntityState} from '@ngrx/entity'; +import {BreakNr, BreakNrCopy, Project, ProjectBasicCfg, WorkStartEnd} from '../project.model'; +import {ProjectActions, ProjectActionTypes} from './project.actions'; +import {createFeatureSelector, createSelector} from '@ngrx/store'; +import {FIRST_PROJECT} from '../project.const'; +import {sortStringDates} from '../../../util/sortStringDates'; export const PROJECT_FEATURE_NAME = 'projects'; export interface ProjectState extends EntityState { // additional entities state properties currentId: string | null; - isDataLoaded: boolean; + projectIdForLoadedRelatedData: string; } const sortByTitle = (p1: Project, p2: Project) => { @@ -31,7 +31,11 @@ export const selectAllProjects = createSelector(selectProjectFeatureState, selec export const selectUnarchivedProjects = createSelector(selectAllProjects, (projects) => projects.filter(p => !p.isArchived)); export const selectArchivedProjects = createSelector(selectAllProjects, (projects) => projects.filter(p => p.isArchived)); -export const selectIsAllProjectDataLoaded = createSelector(selectProjectFeatureState, state => state.isDataLoaded); +export const selectIsRelatedDataLoadedForCurrentProject = createSelector( + selectProjectFeatureState, + (state): boolean => state.currentId === state.projectIdForLoadedRelatedData +); + export const selectCurrentProject = createSelector(selectProjectFeatureState, (state) => state.entities[state.currentId] ); @@ -100,7 +104,7 @@ export const initialProjectState: ProjectState = projectAdapter.getInitialState( entities: { [FIRST_PROJECT.id]: FIRST_PROJECT }, - isDataLoaded: false, + projectIdForLoadedRelatedData: null, }); @@ -123,7 +127,7 @@ export function projectReducer( case ProjectActionTypes.LoadProjectRelatedDataSuccess: { return { ...state, - isDataLoaded: true, + projectIdForLoadedRelatedData: state.currentId, }; }