@@ -7,21 +7,23 @@ import {
77 Observable ,
88 Subject ,
99 auditTime ,
10+ first ,
1011 merge ,
1112 of ,
1213 tap ,
1314 withLatestFrom ,
1415} from 'rxjs' ;
1516import { ProjectService } from 'src/app/api/services/project.service' ;
17+ import { UnitService } from 'src/app/api/services/unit.service' ;
1618import { GlobalStateService , ViewType } from '../../index/global-state.service' ;
1719import { UserService } from 'src/app/api/services/user.service' ;
1820import { Project , TaskDefinition } from 'src/app/api/models/doubtfire-model' ;
1921
2022@Component ( {
21- selector : 'f-project-dashboard' ,
22- templateUrl : './project-dashboard.component.html' ,
23- styleUrl : './project-dashboard.component.scss' ,
24- standalone : false
23+ selector : 'f-project-dashboard' ,
24+ templateUrl : './project-dashboard.component.html' ,
25+ styleUrl : './project-dashboard.component.scss' ,
26+ standalone : false ,
2527} )
2628export class ProjectDashboardComponent implements OnInit {
2729 @Input ( ) public project$ : Observable < Project > ;
@@ -34,16 +36,20 @@ export class ProjectDashboardComponent implements OnInit {
3436 new BehaviorSubject < TaskDefinition > ( null ) ;
3537
3638 subs$ : Observable < unknown > ;
39+ readonly skeletonRows = Array . from ( { length : 10 } , ( _ , index ) => index ) ;
40+ private readonly projectSubject = new BehaviorSubject < Project > ( null ) ;
3741
3842 private leftComponentStartSize$ = new Subject < number > ( ) ;
3943 private dragMove$ = new Subject < { event : CdkDragMove ; div : HTMLDivElement } > ( ) ;
4044 private dragMoveAudited$ ;
45+ private projectReady = false ;
4146
4247 projectTasks = [ ] ;
4348
4449 constructor (
4550 private currentUser : UserService ,
4651 private projectService : ProjectService ,
52+ private unitService : UnitService ,
4753 private globalStateService : GlobalStateService ,
4854 private route : ActivatedRoute ,
4955 ) { }
@@ -54,6 +60,24 @@ export class ProjectDashboardComponent implements OnInit {
5460
5561 public startLeftX = 0 ;
5662
63+ public isProjectTaskListReady ( project : Project ) : boolean {
64+ return (
65+ this . projectReady &&
66+ ! ! project ?. id &&
67+ ! ! project . unit ?. id &&
68+ project . targetGrade !== undefined &&
69+ project . targetGrade !== null
70+ ) ;
71+ }
72+
73+ public taskDefinitionsForProject ( project : Project ) : TaskDefinition [ ] {
74+ if ( ! this . isProjectTaskListReady ( project ) ) {
75+ return [ ] ;
76+ }
77+
78+ return project . unit . taskDefinitionsForGrade ( project . targetGrade ) ;
79+ }
80+
5781 startedDragging ( event : CdkDragStart , boundary : HTMLElement ) {
5882 const rect = boundary . getBoundingClientRect ( ) ;
5983 // x relative to the container
@@ -80,7 +104,15 @@ export class ProjectDashboardComponent implements OnInit {
80104 }
81105
82106 ngOnInit ( ) : void {
83- this . project$ = this . project$ ?? of ( this . route . parent ?. snapshot . data . project as Project ) ;
107+ const initialProject$ =
108+ this . project$ ?? of ( this . route . parent ?. snapshot . data . project as Project ) ;
109+ this . project$ = this . projectSubject . asObservable ( ) ;
110+ initialProject$ . pipe ( first ( ) ) . subscribe ( ( project ) => {
111+ this . projectSubject . next ( project ) ;
112+ this . loadProject (
113+ project ?. id ?? Number ( this . route . parent ?. snapshot . paramMap . get ( 'projectId' ) ) ,
114+ ) ;
115+ } ) ;
84116
85117 this . dragMoveAudited$ = this . dragMove$ . pipe (
86118 withLatestFrom ( this . leftComponentStartSize$ ) ,
@@ -112,4 +144,45 @@ export class ProjectDashboardComponent implements OnInit {
112144 this . subs$ = merge ( this . dragMoveAudited$ , of ( true ) ) ;
113145 window . dispatchEvent ( new Event ( 'resize' ) ) ;
114146 }
147+
148+ private loadProject ( projectId : number ) : void {
149+ if ( ! projectId ) {
150+ return ;
151+ }
152+
153+ this . projectService
154+ . get (
155+ { id : projectId } ,
156+ {
157+ cacheBehaviourOnGet : 'cacheQuery' ,
158+ mappingCompleteCallback : ( project : Project ) => this . loadUnit ( project ) ,
159+ } ,
160+ )
161+ . subscribe ( ) ;
162+ }
163+
164+ private loadUnit ( project : Project ) : void {
165+ const unitId = project . unit ?. id ;
166+ if ( ! unitId ) {
167+ this . showLoadedProject ( project ) ;
168+ return ;
169+ }
170+
171+ this . unitService . get ( unitId ) . subscribe ( {
172+ next : ( unit ) => {
173+ project . unit = unit ;
174+ unit . studentCache . add ( project ) ;
175+ this . showLoadedProject ( project ) ;
176+ } ,
177+ error : ( ) => {
178+ this . showLoadedProject ( project ) ;
179+ } ,
180+ } ) ;
181+ }
182+
183+ private showLoadedProject ( project : Project ) : void {
184+ this . projectReady = true ;
185+ this . globalStateService . setView ( ViewType . PROJECT , project ) ;
186+ this . projectSubject . next ( project ) ;
187+ }
115188}
0 commit comments