@@ -11,9 +11,9 @@ import {
11
11
of ,
12
12
shareReplay ,
13
13
switchMap ,
14
- tap ,
15
14
} from "rxjs" ;
16
15
import { LessonPresencesRestService } from "src/app/shared/services/lesson-presences-rest.service" ;
16
+ import { LoadingService } from "src/app/shared/services/loading-service" ;
17
17
import { StudentsRestService } from "src/app/shared/services/students-rest.service" ;
18
18
import { TeachersRestService } from "src/app/shared/services/teachers-rest.service" ;
19
19
import { UserSettingsService } from "src/app/shared/services/user-settings.service" ;
@@ -49,7 +49,7 @@ export class DashboardTimetableComponent {
49
49
isTeacher$ = this . dashboardService . hasLessonTeacherRole$ ;
50
50
isStudent$ = this . dashboardService . hasStudentRole$ ;
51
51
date$ = new BehaviorSubject ( startOfDay ( new Date ( ) ) ) ;
52
- loading$ = new BehaviorSubject ( true ) ;
52
+ loading$ = this . loadingService . loading$ ;
53
53
timetableEntries$ = this . loadTimetableEntries ( ) ;
54
54
55
55
constructor (
@@ -58,20 +58,18 @@ export class DashboardTimetableComponent {
58
58
private lessonPresencesService : LessonPresencesRestService ,
59
59
private userSettings : UserSettingsService ,
60
60
private dashboardService : DashboardService ,
61
+ private loadingService : LoadingService ,
61
62
) { }
62
63
63
64
gotoToday ( ) : void {
64
- this . loading$ . next ( true ) ;
65
65
this . date$ . next ( startOfDay ( new Date ( ) ) ) ;
66
66
}
67
67
68
68
gotoPreviousDay ( ) : void {
69
- this . loading$ . next ( true ) ;
70
69
this . date$ . next ( subDays ( this . date$ . getValue ( ) , 1 ) ) ;
71
70
}
72
71
73
72
gotoNextDay ( ) : void {
74
- this . loading$ . next ( true ) ;
75
73
this . date$ . next ( addDays ( this . date$ . getValue ( ) , 1 ) ) ;
76
74
}
77
75
@@ -82,33 +80,41 @@ export class DashboardTimetableComponent {
82
80
private loadTimetableEntries ( ) : Observable <
83
81
ReadonlyArray < DashboardTimetableEntry >
84
82
> {
85
- return combineLatest ( [ this . isTeacher$ , this . isStudent$ ] ) . pipe (
86
- switchMap ( ( [ isTeacher , isStudent ] ) => {
87
- if ( isTeacher ) {
88
- return this . fetchTimetableEntries ( "teacher" ) ;
89
- } else if ( isStudent ) {
90
- return this . fetchTimetableEntries ( "student" ) ;
91
- }
92
- return of ( [ ] ) ;
83
+ return combineLatest ( [
84
+ this . isTeacher$ ,
85
+ this . isStudent$ ,
86
+ this . userId$ ,
87
+ this . date$ ,
88
+ ] ) . pipe (
89
+ switchMap ( ( [ isTeacher , isStudent , userId , date ] ) => {
90
+ const fetch = ( ) => {
91
+ if ( isTeacher ) {
92
+ return this . fetchTimetableEntries ( "teacher" , userId , date ) ;
93
+ } else if ( isStudent ) {
94
+ return this . fetchTimetableEntries ( "student" , userId , date ) ;
95
+ }
96
+ return of ( [ ] ) ;
97
+ } ;
98
+ return this . loadingService . load ( fetch ( ) ) ;
93
99
} ) ,
94
- tap ( ( ) => this . loading$ . next ( false ) ) ,
95
100
shareReplay ( 1 ) ,
96
101
) ;
97
102
}
98
103
99
104
private fetchTimetableEntries (
100
105
userType : "teacher" | "student" ,
106
+ userId : number ,
107
+ date : Date ,
101
108
) : Observable < ReadonlyArray < DashboardTimetableEntry > > {
102
- return combineLatest ( [ this . userId$ , this . date$ ] ) . pipe (
103
- switchMap ( ( [ userId , date ] ) => {
104
- const params : Dict < string > = {
105
- "filter.From" : `=${ format ( date , "yyyy-MM-dd" ) } ` ,
106
- sort : "From,To" ,
107
- } ;
108
- return userType === "teacher"
109
- ? this . teachersService . getTimetableEntries ( userId , params )
110
- : this . studentsService . getTimetableEntries ( userId , params ) ;
111
- } ) ,
109
+ const params : Dict < string > = {
110
+ "filter.From" : `=${ format ( date , "yyyy-MM-dd" ) } ` ,
111
+ sort : "From,To" ,
112
+ } ;
113
+ return (
114
+ userType === "teacher"
115
+ ? this . teachersService . getTimetableEntries ( userId , params )
116
+ : this . studentsService . getTimetableEntries ( userId , params )
117
+ ) . pipe (
112
118
map ( ( entries ) => entries . map ( convertTimetableEntry ) ) ,
113
119
map ( ( entries ) => uniqBy ( entries , ( entry ) => entry . id ) ) , // Due to a bug, the backend returns duplicate entries, so we filter them out here (this can be removed once fixed)
114
120
switchMap ( ( entries ) => {
@@ -119,7 +125,7 @@ export class DashboardTimetableComponent {
119
125
// comma-separated) we fetch the study classes separately from the
120
126
// lesson presences for now. This can be removed, once the classes are
121
127
// provided on the timetable entries in a clean way.
122
- return this . loadStudyClasses ( ) . pipe (
128
+ return this . loadStudyClasses ( date ) . pipe (
123
129
map ( ( studyClasses ) => decorateStudyClasses ( entries , studyClasses ) ) ,
124
130
) ;
125
131
} else {
@@ -130,12 +136,11 @@ export class DashboardTimetableComponent {
130
136
) ;
131
137
}
132
138
133
- private loadStudyClasses ( ) : Observable < Dict < ReadonlyArray < string > > > {
134
- return this . date$ . pipe (
135
- switchMap ( ( date ) =>
136
- this . lessonPresencesService . getLessonStudyClassesByDate ( date ) ,
137
- ) ,
138
- map ( createStudyClassesMap ) ,
139
- ) ;
139
+ private loadStudyClasses (
140
+ date : Date ,
141
+ ) : Observable < Dict < ReadonlyArray < string > > > {
142
+ return this . lessonPresencesService
143
+ . getLessonStudyClassesByDate ( date )
144
+ . pipe ( map ( createStudyClassesMap ) ) ;
140
145
}
141
146
}
0 commit comments