diff --git a/src/app/core-ui/side-nav/side-nav.component.ts b/src/app/core-ui/side-nav/side-nav.component.ts index e8a17feecb9..c796d744677 100644 --- a/src/app/core-ui/side-nav/side-nav.component.ts +++ b/src/app/core-ui/side-nav/side-nav.component.ts @@ -47,7 +47,6 @@ import { selectUnarchivedHiddenProjectIds, selectUnarchivedVisibleProjects, } from '../../features/project/store/project.selectors'; -import { updateProject } from '../../features/project/store/project.actions'; import { SideNavItemComponent } from './side-nav-item/side-nav-item.component'; import { RouterLink, RouterLinkActive } from '@angular/router'; import { MatIcon } from '@angular/material/icon'; @@ -277,14 +276,7 @@ export class SideNavComponent implements OnDestroy { } toggleProjectVisibility(project: Project): void { - this._store.dispatch( - updateProject({ - project: { - id: project.id, - changes: { isHiddenFromMenu: !project.isHiddenFromMenu }, - }, - }), - ); + this.projectService.projectHideFromMenu(project); } async dropOnProjectList( diff --git a/src/app/features/boards/board-panel/board-panel.component.ts b/src/app/features/boards/board-panel/board-panel.component.ts index 360fbe8f475..66a5853dfdc 100644 --- a/src/app/features/boards/board-panel/board-panel.component.ts +++ b/src/app/features/boards/board-panel/board-panel.component.ts @@ -15,7 +15,7 @@ import { } from '../boards.model'; import { select, Store } from '@ngrx/store'; import { - selectAllTasks, + selectAllAvailableTasks, selectTaskById, selectTaskByIdWithSubTaskData, } from '../../tasks/store/task.selectors'; @@ -75,7 +75,7 @@ export class BoardPanelComponent { plannerService = inject(PlannerService); _matDialog = inject(MatDialog); - allTasks$ = this.store.select(selectAllTasks); + allTasks$ = this.store.select(selectAllAvailableTasks); allTasks = toSignal(this.allTasks$, { initialValue: [], }); diff --git a/src/app/features/project/project.service.ts b/src/app/features/project/project.service.ts index 338022b40b4..dee58f455c0 100644 --- a/src/app/features/project/project.service.ts +++ b/src/app/features/project/project.service.ts @@ -24,6 +24,7 @@ import { updateProject, updateProjectOrder, upsertProject, + toggleHideFromMenu, } from './store/project.actions'; import { DEFAULT_PROJECT } from './project.const'; import { @@ -213,4 +214,15 @@ export class ProjectService { updateOrder(ids: string[]): void { this._store$.dispatch(updateProjectOrder({ ids })); } + + async projectHideFromMenu(project: Project): Promise { + const newVisibilityState = !project.isHiddenFromMenu; + + this._store$.dispatch( + toggleHideFromMenu({ + projectId: project.id, + isHiddenFromMenu: newVisibilityState, + }), + ); + } } diff --git a/src/app/features/project/store/project.actions.ts b/src/app/features/project/store/project.actions.ts index 809f53d9c67..470f384184c 100644 --- a/src/app/features/project/store/project.actions.ts +++ b/src/app/features/project/store/project.actions.ts @@ -70,7 +70,10 @@ export const unarchiveProject = createAction( export const toggleHideFromMenu = createAction( '[Project] Toggle hide from menu', - props<{ id: string }>(), + props<{ + projectId: string; + isHiddenFromMenu: boolean; + }>(), ); // MOVE TASK ACTIONS diff --git a/src/app/features/project/store/project.reducer.ts b/src/app/features/project/store/project.reducer.ts index 69c70a95916..afa0bffca00 100644 --- a/src/app/features/project/store/project.reducer.ts +++ b/src/app/features/project/store/project.reducer.ts @@ -153,12 +153,12 @@ export const projectReducer = createReducer( // on(deleteProjects, (state, { ids }) => projectAdapter.removeMany(ids, state)), on(loadProjects, (state, { projects }) => projectAdapter.setAll(projects, state)), - on(toggleHideFromMenu, (state, { id }) => + on(toggleHideFromMenu, (state, { projectId, isHiddenFromMenu }) => projectAdapter.updateOne( { - id, + id: projectId, changes: { - isHiddenFromMenu: !state.entities[id]?.isHiddenFromMenu, + isHiddenFromMenu: isHiddenFromMenu, }, }, state, diff --git a/src/app/features/tasks/store/task.reducer.ts b/src/app/features/tasks/store/task.reducer.ts index 1a04f90c499..ffedd183742 100644 --- a/src/app/features/tasks/store/task.reducer.ts +++ b/src/app/features/tasks/store/task.reducer.ts @@ -113,21 +113,6 @@ export const taskReducer = createReducer( }); }), - on(TimeTrackingActions.addTimeSpent, (state, { task, date, duration }) => { - const currentTimeSpentForTickDay = - (task.timeSpentOnDay && +task.timeSpentOnDay[date]) || 0; - return updateTimeSpentForTask( - task.id, - { - ...task.timeSpentOnDay, - [date]: currentTimeSpentForTickDay + duration, - }, - state, - ); - }), - - //-------------------------------- - // TODO check if working on(setCurrentTask, (state, { id }) => { if (id) { diff --git a/src/app/features/tasks/store/task.selectors.ts b/src/app/features/tasks/store/task.selectors.ts index cf8861d516f..c508cf36f3b 100644 --- a/src/app/features/tasks/store/task.selectors.ts +++ b/src/app/features/tasks/store/task.selectors.ts @@ -5,6 +5,8 @@ import { taskAdapter } from './task.adapter'; import { devError } from '../../../util/dev-error'; import { TODAY_TAG } from '../../tag/tag.const'; import { IssueProvider } from '../../issue/issue.model'; +import { Project } from '../../project/project.model'; +import { selectAllProjects } from '../../project/store/project.selectors'; // TODO fix null stuff here @@ -334,3 +336,30 @@ export const selectAllTaskIssueIdsForIssueProvider = (issueProvider: IssueProvid .map((t) => t.issueId as string); }); }; + +export const selectAllAvailableTasks = createSelector( + selectAllTasks, + selectAllProjects, + (tasks: Task[], projects: Project[]): Task[] => { + const projectMap: { [id: string]: Project } = {}; + projects.forEach((project) => { + projectMap[project.id] = project; + }); + + return tasks.filter((task) => { + const projectId = task.projectId; + if (!projectId) return true; + + const project = projectMap[projectId]; + if (!project) return true; + + if (project.isHiddenFromMenu) return false; + + if (project.backlogTaskIds && project.backlogTaskIds.includes(task.id)) { + return false; + } + + return true; + }); + }, +);