1
1
import React from "react"
2
2
import { enrollmentQueries } from "api/mitxonline-hooks/enrollment"
3
3
import {
4
+ Collapse ,
5
+ Link ,
4
6
PlainList ,
5
7
PlainListProps ,
6
8
Typography ,
7
9
TypographyProps ,
8
10
styled ,
11
+ theme ,
9
12
} from "ol-components"
10
13
import { useQuery } from "@tanstack/react-query"
11
14
import { mitxonlineEnrollments } from "./transform"
@@ -42,7 +45,7 @@ const Title = styled(Typography)<Pick<TypographyProps, "component">>(
42
45
} ) ,
43
46
)
44
47
45
- const EnrollmentList = styled ( PlainList ) < Pick < PlainListProps , "itemSpacing" > > (
48
+ const EnrollmentsList = styled ( PlainList ) < Pick < PlainListProps , "itemSpacing" > > (
46
49
( { theme } ) => ( {
47
50
[ theme . breakpoints . down ( "md" ) ] : {
48
51
borderTop : `1px solid ${ theme . custom . colors . lightGray2 } ` ,
@@ -53,6 +56,23 @@ const EnrollmentList = styled(PlainList)<Pick<PlainListProps, "itemSpacing">>(
53
56
} ) ,
54
57
)
55
58
59
+ const HiddenEnrollmentsList = styled ( EnrollmentsList ) ( {
60
+ marginTop : "16px" ,
61
+ [ theme . breakpoints . down ( "md" ) ] : {
62
+ borderTop : "none" ,
63
+ marginTop : "0" ,
64
+ } ,
65
+ } )
66
+
67
+ const ShowAllContainer = styled . div ( ( { theme } ) => ( {
68
+ display : "flex" ,
69
+ justifyContent : "center" ,
70
+ marginTop : "24px" ,
71
+ [ theme . breakpoints . down ( "md" ) ] : {
72
+ marginBottom : "24px" ,
73
+ } ,
74
+ } ) )
75
+
56
76
const alphabeticalSort = ( a : DashboardCourse , b : DashboardCourse ) =>
57
77
a . title . localeCompare ( b . title )
58
78
@@ -65,15 +85,18 @@ const startsSooner = (a: DashboardCourse, b: DashboardCourse) => {
65
85
return x . getTime ( ) - y . getTime ( )
66
86
}
67
87
const sortEnrollments = ( resources : DashboardCourse [ ] ) => {
68
- const ended : DashboardCourse [ ] = [ ]
88
+ const expired : DashboardCourse [ ] = [ ]
89
+ const completed : DashboardCourse [ ] = [ ]
69
90
const started : DashboardCourse [ ] = [ ]
70
91
const notStarted : DashboardCourse [ ] = [ ]
71
92
resources . forEach ( ( resource ) => {
72
- if (
73
- resource . enrollment ?. status === EnrollmentStatus . Completed ||
74
- ( resource . run . endDate && new Date ( resource . run . endDate ) < new Date ( ) )
93
+ if ( resource . enrollment ?. status === EnrollmentStatus . Completed ) {
94
+ completed . push ( resource )
95
+ } else if (
96
+ resource . run . endDate &&
97
+ new Date ( resource . run . endDate ) < new Date ( )
75
98
) {
76
- ended . push ( resource )
99
+ expired . push ( resource )
77
100
} else if (
78
101
resource . run . startDate &&
79
102
new Date ( resource . run . startDate ) < new Date ( )
@@ -85,12 +108,62 @@ const sortEnrollments = (resources: DashboardCourse[]) => {
85
108
} )
86
109
87
110
return {
88
- ended : ended . sort ( alphabeticalSort ) ,
111
+ completed : completed . sort ( alphabeticalSort ) ,
112
+ expired : expired . sort ( alphabeticalSort ) ,
89
113
started : started . sort ( alphabeticalSort ) ,
90
114
notStarted : notStarted . sort ( startsSooner ) ,
91
115
}
92
116
}
93
117
118
+ interface EnrollmentExpandCollapseProps {
119
+ shownEnrollments : DashboardCourse [ ]
120
+ hiddenEnrollments : DashboardCourse [ ]
121
+ }
122
+
123
+ const EnrollmentExpandCollapse : React . FC < EnrollmentExpandCollapseProps > = ( {
124
+ shownEnrollments,
125
+ hiddenEnrollments,
126
+ } ) => {
127
+ const [ shown , setShown ] = React . useState ( false )
128
+
129
+ const handleToggle = ( event : React . MouseEvent ) => {
130
+ event . preventDefault ( )
131
+ setShown ( ! shown )
132
+ }
133
+
134
+ return (
135
+ < >
136
+ < EnrollmentsList itemSpacing = { "16px" } >
137
+ { shownEnrollments . map ( ( course ) => (
138
+ < DashboardCardStyled
139
+ key = { course . id }
140
+ Component = "li"
141
+ dashboardResource = { course }
142
+ showNotComplete = { false }
143
+ />
144
+ ) ) }
145
+ </ EnrollmentsList >
146
+ < Collapse orientation = "vertical" in = { shown } >
147
+ < HiddenEnrollmentsList itemSpacing = { "16px" } >
148
+ { hiddenEnrollments . map ( ( course ) => (
149
+ < DashboardCardStyled
150
+ key = { course . id }
151
+ Component = "li"
152
+ dashboardResource = { course }
153
+ showNotComplete = { false }
154
+ />
155
+ ) ) }
156
+ </ HiddenEnrollmentsList >
157
+ </ Collapse >
158
+ < ShowAllContainer >
159
+ < Link color = "red" size = "medium" onClick = { handleToggle } >
160
+ { shown ? "Show less" : "Show all" }
161
+ </ Link >
162
+ </ ShowAllContainer >
163
+ </ >
164
+ )
165
+ }
166
+
94
167
const EnrollmentDisplay = ( ) => {
95
168
const { data : enrolledCourses } = useQuery ( {
96
169
...enrollmentQueries . coursesList ( ) ,
@@ -106,24 +179,20 @@ const EnrollmentDisplay = () => {
106
179
* The constants below are separate for impending "Show All" functionality.
107
180
* The above TODO could be handled then.
108
181
*/
109
- const { ended, started, notStarted } = sortEnrollments ( enrolledCourses || [ ] )
110
- const sorted = [ ...started , ...notStarted , ...ended ]
182
+ const { completed, expired, started, notStarted } = sortEnrollments (
183
+ enrolledCourses || [ ] ,
184
+ )
185
+ const shownEnrollments = [ ...started , ...notStarted , ...completed ]
111
186
112
187
return (
113
188
< Wrapper >
114
189
< Title variant = "h5" component = "h2" >
115
190
My Learning
116
191
</ Title >
117
- < EnrollmentList itemSpacing = { "16px" } >
118
- { sorted ?. map ( ( course ) => (
119
- < DashboardCardStyled
120
- key = { course . id }
121
- Component = "li"
122
- showNotComplete = { false }
123
- dashboardResource = { course }
124
- />
125
- ) ) }
126
- </ EnrollmentList >
192
+ < EnrollmentExpandCollapse
193
+ shownEnrollments = { shownEnrollments }
194
+ hiddenEnrollments = { expired }
195
+ />
127
196
</ Wrapper >
128
197
)
129
198
}
0 commit comments