Skip to content

Commit 5e04ae6

Browse files
feat: Dashboard
1 parent 3c262ec commit 5e04ae6

File tree

34 files changed

+870
-617
lines changed

34 files changed

+870
-617
lines changed

app/src/main/java/org/openedx/app/AppRouter.kt

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ import org.openedx.auth.presentation.logistration.LogistrationFragment
88
import org.openedx.auth.presentation.restore.RestorePasswordFragment
99
import org.openedx.auth.presentation.signin.SignInFragment
1010
import org.openedx.auth.presentation.signup.SignUpFragment
11-
import org.openedx.core.CourseContainerTabEntity
1211
import org.openedx.core.FragmentViewType
12+
import org.openedx.core.presentation.course.CourseContainerTab
1313
import org.openedx.core.presentation.course.CourseViewMode
1414
import org.openedx.core.presentation.global.app_upgrade.AppUpgradeRouter
1515
import org.openedx.core.presentation.global.app_upgrade.UpgradeRequiredFragment
@@ -135,6 +135,18 @@ class AppRouter : AuthRouter, DiscoveryRouter, DashboardRouter, CourseRouter, Di
135135
) {
136136
replaceFragmentWithBackStack(fm, CourseInfoFragment.newInstance(courseId, infoType))
137137
}
138+
139+
override fun navigateToCourseOutline(
140+
fm: FragmentManager,
141+
courseId: String,
142+
courseTitle: String,
143+
enrollmentMode: String
144+
) {
145+
replaceFragmentWithBackStack(
146+
fm,
147+
CourseContainerFragment.newInstance(courseId, courseTitle, enrollmentMode)
148+
)
149+
}
138150
//endregion
139151

140152
//region DashboardRouter
@@ -144,11 +156,12 @@ class AppRouter : AuthRouter, DiscoveryRouter, DashboardRouter, CourseRouter, Di
144156
courseId: String,
145157
courseTitle: String,
146158
enrollmentMode: String,
147-
openTab: CourseContainerTabEntity
159+
requiredTab: CourseContainerTab,
160+
openBlock: String
148161
) {
149162
replaceFragmentWithBackStack(
150163
fm,
151-
CourseContainerFragment.newInstance(courseId, courseTitle, enrollmentMode, openTab)
164+
CourseContainerFragment.newInstance(courseId, courseTitle, enrollmentMode, requiredTab, openBlock)
152165
)
153166
}
154167

app/src/main/java/org/openedx/app/di/ScreenModule.kt

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ import org.openedx.discussion.presentation.search.DiscussionSearchThreadViewMode
5151
import org.openedx.discussion.presentation.threads.DiscussionAddThreadViewModel
5252
import org.openedx.discussion.presentation.threads.DiscussionThreadsViewModel
5353
import org.openedx.discussion.presentation.topics.DiscussionTopicsViewModel
54+
import org.openedx.learn.presentation.LearnViewModel
5455
import org.openedx.profile.data.repository.ProfileRepository
5556
import org.openedx.profile.domain.interactor.ProfileInteractor
5657
import org.openedx.profile.domain.model.Account
@@ -119,8 +120,9 @@ val screenModule = module {
119120
factory { DashboardRepository(get(), get(), get(), get()) }
120121
factory { DashboardInteractor(get()) }
121122
viewModel { DashboardViewModel(get(), get(), get(), get(), get(), get(), get()) }
122-
viewModel { UserCoursesViewModel(get(), get(), get(), get(), get(), get()) }
123-
viewModel { AllEnrolledCoursesViewModel(get(), get(), get(), get(), get(), get()) }
123+
viewModel { UserCoursesViewModel(get(), get(), get(), get(), get(), get(), get()) }
124+
viewModel { AllEnrolledCoursesViewModel(get(), get(), get(), get(), get(), get(), get()) }
125+
viewModel { LearnViewModel(get(), get()) }
124126

125127
factory { DiscoveryRepository(get(), get(), get()) }
126128
factory { DiscoveryInteractor(get()) }
@@ -183,10 +185,11 @@ val screenModule = module {
183185
get()
184186
)
185187
}
186-
viewModel { (courseId: String, courseTitle: String, enrollmentMode: String) ->
188+
viewModel { (courseId: String, courseTitle: String, enrollmentMode: String, openBlock: String) ->
187189
CourseContainerViewModel(
188190
courseId,
189191
courseTitle,
192+
openBlock,
190193
enrollmentMode,
191194
get(),
192195
get(),
@@ -215,6 +218,7 @@ val screenModule = module {
215218
get(),
216219
get(),
217220
get(),
221+
get()
218222
)
219223
}
220224
viewModel { (courseId: String) ->
@@ -256,6 +260,7 @@ val screenModule = module {
256260
get(),
257261
get(),
258262
get(),
263+
get()
259264
)
260265
}
261266
viewModel { (courseId: String) -> BaseVideoViewModel(courseId, get()) }
@@ -293,6 +298,7 @@ val screenModule = module {
293298
get(),
294299
get(),
295300
get(),
301+
get()
296302
)
297303
}
298304
viewModel { (courseId: String, handoutsType: String) ->

core/src/main/java/org/openedx/core/CourseContainerTabEntity.kt

Lines changed: 0 additions & 9 deletions
This file was deleted.

core/src/main/java/org/openedx/core/data/api/CourseApi.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ interface CourseApi {
7272
suspend fun getUserCourses(
7373
@Path("username") username: String,
7474
@Query("page") page: Int = 1,
75+
@Query("page_size") pageSize: Int = 20,
7576
@Query("status") status: String? = null,
7677
@Query("requested_fields") fields: List<String> = emptyList()
7778
): CourseEnrollments

core/src/main/java/org/openedx/core/data/model/CourseAssignments.kt

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,25 @@ import com.google.gson.annotations.SerializedName
44
import org.openedx.core.data.model.room.discovery.CourseAssignmentsDb
55

66
data class CourseAssignments(
7-
@SerializedName("future_assignment")
8-
val futureAssignment: CourseDateBlock?,
7+
@SerializedName("future_assignments")
8+
val futureAssignments: List<CourseDateBlock>?,
99
@SerializedName("past_assignments")
1010
val pastAssignments: List<CourseDateBlock>?
1111
) {
1212
fun mapToDomain(): org.openedx.core.domain.model.CourseAssignments =
1313
org.openedx.core.domain.model.CourseAssignments(
14-
futureAssignment = futureAssignment?.mapToDomain(),
14+
futureAssignments = futureAssignments?.map {
15+
it.mapToDomain()
16+
},
1517
pastAssignments = pastAssignments?.map {
1618
it.mapToDomain()
1719
}
1820
)
1921

2022
fun mapToRoomEntity() = CourseAssignmentsDb(
21-
futureAssignment = futureAssignment?.mapToRoomEntity(),
23+
futureAssignments = futureAssignments?.map {
24+
it.mapToRoomEntity()
25+
},
2226
pastAssignments = pastAssignments?.map {
2327
it.mapToRoomEntity()
2428
}

core/src/main/java/org/openedx/core/data/model/room/discovery/EnrolledCourseEntity.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -201,13 +201,13 @@ data class CourseStatusDb(
201201
}
202202

203203
data class CourseAssignmentsDb(
204-
@Embedded
205-
val futureAssignment: CourseDateBlockDb?,
204+
@ColumnInfo("futureAssignments")
205+
val futureAssignments: List<CourseDateBlockDb>?,
206206
@ColumnInfo("pastAssignments")
207207
val pastAssignments: List<CourseDateBlockDb>?
208208
) {
209209
fun mapToDomain() = CourseAssignments(
210-
futureAssignment = futureAssignment?.mapToDomain(),
210+
futureAssignments = futureAssignments?.map { it.mapToDomain() },
211211
pastAssignments = pastAssignments?.map { it.mapToDomain() }
212212
)
213213
}

core/src/main/java/org/openedx/core/domain/model/CourseAssignments.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,6 @@ import kotlinx.parcelize.Parcelize
55

66
@Parcelize
77
data class CourseAssignments(
8-
val futureAssignment: CourseDateBlock?,
8+
val futureAssignments: List<CourseDateBlock>?,
99
val pastAssignments: List<CourseDateBlock>?
1010
): Parcelable

core/src/main/java/org/openedx/core/system/notifier/CourseNotifier.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,5 @@ class CourseNotifier {
2020
suspend fun send(event: CourseLoading) = channel.emit(event)
2121
suspend fun send(event: CourseDataReady) = channel.emit(event)
2222
suspend fun send(event: CourseRefresh) = channel.emit(event)
23+
suspend fun send(event: CourseOpenBlock) = channel.emit(event)
2324
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package org.openedx.core.system.notifier
2+
3+
data class CourseOpenBlock(val blockId: String) : CourseEvent

core/src/main/java/org/openedx/core/ui/ComposeCommon.kt

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import androidx.compose.foundation.lazy.LazyRow
2828
import androidx.compose.foundation.lazy.items
2929
import androidx.compose.foundation.lazy.itemsIndexed
3030
import androidx.compose.foundation.lazy.rememberLazyListState
31+
import androidx.compose.foundation.pager.HorizontalPager
3132
import androidx.compose.foundation.pager.PagerState
3233
import androidx.compose.foundation.pager.rememberPagerState
3334
import androidx.compose.foundation.shape.CircleShape
@@ -1204,17 +1205,22 @@ fun RoundTabsBar(
12041205
modifier: Modifier = Modifier,
12051206
items: List<TabItem>,
12061207
pagerState: PagerState,
1208+
contentPadding: PaddingValues = PaddingValues(),
1209+
withPager: Boolean = false,
12071210
rowState: LazyListState = rememberLazyListState(),
1208-
onPageChange: (Int) -> Unit
1211+
onTabClicked: (Int) -> Unit = { }
12091212
) {
1213+
// The pager state does not work without the pager and the tabs do not change.
1214+
if (!withPager) {
1215+
HorizontalPager(state = pagerState) { }
1216+
}
1217+
12101218
val scope = rememberCoroutineScope()
1211-
val windowSize = rememberWindowSize()
1212-
val horizontalPadding = if (!windowSize.isTablet) 12.dp else 98.dp
12131219
LazyRow(
12141220
modifier = modifier,
12151221
state = rowState,
12161222
horizontalArrangement = Arrangement.spacedBy(8.dp),
1217-
contentPadding = PaddingValues(vertical = 16.dp, horizontal = horizontalPadding),
1223+
contentPadding = contentPadding,
12181224
) {
12191225
itemsIndexed(items) { index, item ->
12201226
val isSelected = pagerState.currentPage == index
@@ -1237,10 +1243,10 @@ fun RoundTabsBar(
12371243
.clickable {
12381244
scope.launch {
12391245
pagerState.scrollToPage(index)
1240-
onPageChange(index)
1246+
onTabClicked(index)
12411247
}
12421248
}
1243-
.padding(horizontal = 12.dp),
1249+
.padding(horizontal = 16.dp),
12441250
item = item,
12451251
contentColor = contentColor
12461252
)
@@ -1259,12 +1265,15 @@ private fun RoundTab(
12591265
verticalAlignment = Alignment.CenterVertically,
12601266
horizontalArrangement = Arrangement.Center
12611267
) {
1262-
Icon(
1263-
painter = rememberVectorPainter(item.icon),
1264-
tint = contentColor,
1265-
contentDescription = null
1266-
)
1267-
Spacer(modifier = Modifier.width(4.dp))
1268+
val icon = item.icon
1269+
if (icon != null) {
1270+
Icon(
1271+
painter = rememberVectorPainter(icon),
1272+
tint = contentColor,
1273+
contentDescription = null
1274+
)
1275+
Spacer(modifier = Modifier.width(4.dp))
1276+
}
12681277
Text(
12691278
text = stringResource(item.labelResId),
12701279
color = contentColor
@@ -1365,7 +1374,7 @@ private fun RoundTabsBarPreview() {
13651374
items = listOf(mockTab, mockTab, mockTab),
13661375
rowState = rememberLazyListState(),
13671376
pagerState = rememberPagerState(pageCount = { 3 }),
1368-
onPageChange = { }
1377+
onTabClicked = { }
13691378
)
13701379
}
13711380
}

0 commit comments

Comments
 (0)