diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/navbar/NavigationBarViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/navbar/NavigationBarViewModel.kt index 07a5bf9..d2f4f09 100644 --- a/app/src/main/java/be/ugent/sel/studeez/common/composable/navbar/NavigationBarViewModel.kt +++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/navbar/NavigationBarViewModel.kt @@ -4,6 +4,7 @@ import be.ugent.sel.studeez.common.snackbar.SnackbarManager import be.ugent.sel.studeez.domain.LogService import be.ugent.sel.studeez.navigation.StudeezDestinations.HOME_SCREEN import be.ugent.sel.studeez.navigation.StudeezDestinations.PROFILE_SCREEN +import be.ugent.sel.studeez.navigation.StudeezDestinations.SELECT_SUBJECT import be.ugent.sel.studeez.navigation.StudeezDestinations.SESSIONS_SCREEN import be.ugent.sel.studeez.navigation.StudeezDestinations.SUBJECT_SCREEN import be.ugent.sel.studeez.screens.StudeezViewModel @@ -33,8 +34,7 @@ class NavigationBarViewModel @Inject constructor( } fun onAddTaskClick(open: (String) -> Unit) { - // TODO open(CREATE_TASK_SCREEN) - SnackbarManager.showMessage(AppText.create_task_not_possible_yet) // TODO Remove + open(SELECT_SUBJECT) } fun onAddFriendClick(open: (String) -> Unit) { diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/tasks/SubjectEntry.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/tasks/SubjectEntry.kt index c6631ce..63d4fbe 100644 --- a/app/src/main/java/be/ugent/sel/studeez/common/composable/tasks/SubjectEntry.kt +++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/tasks/SubjectEntry.kt @@ -30,10 +30,10 @@ import be.ugent.sel.studeez.R.string as AppText @Composable fun SubjectEntry( subject: Subject, - onViewSubject: () -> Unit, getTaskCount: () -> Flow, getCompletedTaskCount: () -> Flow, getStudyTime: () -> Flow, + selectButton: @Composable (RowScope) -> Unit, ) { val studytime by getStudyTime().collectAsState(initial = 0) val taskCount by getTaskCount().collectAsState(initial = 0) @@ -89,14 +89,7 @@ fun SubjectEntry( } } } - StealthButton( - text = AppText.view_tasks, - modifier = Modifier - .padding(start = 10.dp, end = 5.dp) - .weight(1f) - ) { - onViewSubject() - } + selectButton(this) } } } @@ -109,11 +102,16 @@ fun SubjectEntryPreview() { name = "Test Subject", argb_color = 0xFFFFD200, ), - onViewSubject = {}, getTaskCount = { flowOf() }, getCompletedTaskCount = { flowOf() }, getStudyTime = { flowOf() }, - ) + ) { + StealthButton( + text = AppText.view_tasks, + modifier = Modifier + .padding(start = 10.dp, end = 5.dp) + ) {} + } } @Preview @@ -124,9 +122,8 @@ fun OverflowSubjectEntryPreview() { name = "Testttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttt", argb_color = 0xFFFFD200, ), - onViewSubject = {}, getTaskCount = { flowOf() }, getCompletedTaskCount = { flowOf() }, getStudyTime = { flowOf() }, - ) + ) {} } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/navigation/StudeezDestinations.kt b/app/src/main/java/be/ugent/sel/studeez/navigation/StudeezDestinations.kt index 578c74a..9d146ec 100644 --- a/app/src/main/java/be/ugent/sel/studeez/navigation/StudeezDestinations.kt +++ b/app/src/main/java/be/ugent/sel/studeez/navigation/StudeezDestinations.kt @@ -27,6 +27,7 @@ object StudeezDestinations { const val EDIT_SUBJECT_FORM = "edit_subject" const val TASKS_SCREEN = "tasks" const val ADD_TASK_FORM = "add_task" + const val SELECT_SUBJECT = "select_subject" const val EDIT_TASK_FORM = "edit_task" // Friends flow diff --git a/app/src/main/java/be/ugent/sel/studeez/navigation/StudeezNavGraph.kt b/app/src/main/java/be/ugent/sel/studeez/navigation/StudeezNavGraph.kt index 6b59abc..532a550 100644 --- a/app/src/main/java/be/ugent/sel/studeez/navigation/StudeezNavGraph.kt +++ b/app/src/main/java/be/ugent/sel/studeez/navigation/StudeezNavGraph.kt @@ -30,6 +30,7 @@ import be.ugent.sel.studeez.screens.splash.SplashRoute import be.ugent.sel.studeez.screens.subjects.SubjectRoute import be.ugent.sel.studeez.screens.subjects.form.SubjectCreateRoute import be.ugent.sel.studeez.screens.subjects.form.SubjectEditRoute +import be.ugent.sel.studeez.screens.subjects.select.SubjectSelectionRoute import be.ugent.sel.studeez.screens.tasks.TaskRoute import be.ugent.sel.studeez.screens.tasks.form.TaskCreateRoute import be.ugent.sel.studeez.screens.tasks.form.TaskEditRoute @@ -68,7 +69,7 @@ fun StudeezNavGraph( // NavBar composable(StudeezDestinations.HOME_SCREEN) { HomeRoute( - open, + open = open, drawerActions = drawerActions, navigationBarActions = navigationBarActions, feedViewModel = hiltViewModel(), @@ -85,6 +86,14 @@ fun StudeezNavGraph( ) } + composable(StudeezDestinations.SELECT_SUBJECT) { + SubjectSelectionRoute( + open = { openAndPopUp(it, StudeezDestinations.SELECT_SUBJECT) }, + goBack = goBack, + viewModel = hiltViewModel(), + ) + } + composable(StudeezDestinations.ADD_SUBJECT_FORM) { SubjectCreateRoute( goBack = goBack, @@ -103,7 +112,7 @@ fun StudeezNavGraph( composable(StudeezDestinations.TASKS_SCREEN) { TaskRoute( - goBack = goBack, + goBack = { openAndPopUp(StudeezDestinations.SUBJECT_SCREEN, StudeezDestinations.TASKS_SCREEN) }, open = open, viewModel = hiltViewModel(), ) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/subjects/SubjectScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/subjects/SubjectScreen.kt index 852c0e5..accb7de 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/subjects/SubjectScreen.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/subjects/SubjectScreen.kt @@ -15,10 +15,12 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import be.ugent.sel.studeez.common.composable.NewTaskSubjectButton import be.ugent.sel.studeez.common.composable.PrimaryScreenTemplate +import be.ugent.sel.studeez.common.composable.StealthButton import be.ugent.sel.studeez.common.composable.drawer.DrawerActions import be.ugent.sel.studeez.common.composable.navbar.NavigationBarActions import be.ugent.sel.studeez.common.composable.tasks.SubjectEntry import be.ugent.sel.studeez.data.local.models.task.Subject +import be.ugent.sel.studeez.navigation.StudeezDestinations import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flowOf import be.ugent.sel.studeez.R.string as AppText @@ -35,11 +37,11 @@ fun SubjectRoute( drawerActions = drawerActions, navigationBarActions = navigationBarActions, onAddSubject = { viewModel.onAddSubject(open) }, - onViewSubject = { viewModel.onViewSubject(it, open) }, + onViewSubject = { viewModel.onSelectSubject(it) { open(StudeezDestinations.TASKS_SCREEN) } }, getTaskCount = viewModel::getTaskCount, getCompletedTaskCount = viewModel::getCompletedTaskCount, getStudyTime = viewModel::getStudyTime, - uiState, + uiState = uiState, ) } @@ -76,14 +78,22 @@ fun SubjectScreen( ) { NewTaskSubjectButton(onClick = onAddSubject, AppText.new_subject) LazyColumn { - items(uiState.subjects) { + items(uiState.subjects) { subject -> SubjectEntry( - subject = it, - onViewSubject = { onViewSubject(it) }, - getTaskCount = { getTaskCount(it) }, - getCompletedTaskCount = { getCompletedTaskCount(it) }, - getStudyTime = { getStudyTime(it) }, - ) + subject = subject, + getTaskCount = { getTaskCount(subject) }, + getCompletedTaskCount = { getCompletedTaskCount(subject) }, + getStudyTime = { getStudyTime(subject) }, + ) { + StealthButton( + text = AppText.view_tasks, + modifier = Modifier + .padding(start = 10.dp, end = 5.dp) + .weight(1f) + ) { + onViewSubject(subject) + } + } } } } diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/subjects/SubjectViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/subjects/SubjectViewModel.kt index 19ba396..0c5b354 100644 --- a/app/src/main/java/be/ugent/sel/studeez/screens/subjects/SubjectViewModel.kt +++ b/app/src/main/java/be/ugent/sel/studeez/screens/subjects/SubjectViewModel.kt @@ -42,8 +42,8 @@ class SubjectViewModel @Inject constructor( return subjectDAO.getStudyTime(subject) } - fun onViewSubject(subject: Subject, open: (String) -> Unit) { + fun onSelectSubject(subject: Subject, open: () -> Unit) { selectedSubject.set(subject) - open(StudeezDestinations.TASKS_SCREEN) + open() } } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/subjects/select/SubjectSelectionScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/subjects/select/SubjectSelectionScreen.kt new file mode 100644 index 0000000..099786e --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/subjects/select/SubjectSelectionScreen.kt @@ -0,0 +1,128 @@ +package be.ugent.sel.studeez.screens.subjects.select + +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material.CircularProgressIndicator +import androidx.compose.material.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import be.ugent.sel.studeez.R +import be.ugent.sel.studeez.common.composable.SecondaryScreenTemplate +import be.ugent.sel.studeez.common.composable.StealthButton +import be.ugent.sel.studeez.common.composable.tasks.SubjectEntry +import be.ugent.sel.studeez.data.local.models.task.Subject +import be.ugent.sel.studeez.navigation.StudeezDestinations +import be.ugent.sel.studeez.screens.subjects.SubjectUiState +import be.ugent.sel.studeez.screens.subjects.SubjectViewModel +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flowOf + +@Composable +fun SubjectSelectionRoute( + open: (String) -> Unit, + goBack: () -> Unit, + viewModel: SubjectViewModel, +) { + val uiState by viewModel.uiState.collectAsState() + SubjectSelectionScreen( + onViewSubject = { viewModel.onSelectSubject(it) { open(StudeezDestinations.ADD_TASK_FORM) } }, + getTaskCount = viewModel::getTaskCount, + getCompletedTaskCount = viewModel::getCompletedTaskCount, + getStudyTime = viewModel::getStudyTime, + goBack = goBack, + uiState = uiState, + ) +} + +@Composable +fun SubjectSelectionScreen( + goBack: () -> Unit, + onViewSubject: (Subject) -> Unit, + getTaskCount: (Subject) -> Flow, + getCompletedTaskCount: (Subject) -> Flow, + getStudyTime: (Subject) -> Flow, + uiState: SubjectUiState, +) { + SecondaryScreenTemplate( + title = stringResource(R.string.select_subject_title), + barAction = {}, + popUp = goBack, + ) { + when (uiState) { + SubjectUiState.Loading -> Column( + modifier = Modifier + .fillMaxWidth() + .fillMaxHeight(), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally + ) { + CircularProgressIndicator(color = MaterialTheme.colors.onBackground) + } + is SubjectUiState.Succes -> { + Column( + modifier = Modifier.padding(top = 5.dp) + ) { + LazyColumn { + items(uiState.subjects) { subject -> + SubjectEntry( + subject = subject, + getTaskCount = { getTaskCount(subject) }, + getCompletedTaskCount = { getCompletedTaskCount(subject) }, + getStudyTime = { getStudyTime(subject) }, + ) { + StealthButton( + text = R.string.select_subject, + modifier = Modifier + .padding(start = 4.dp, end = 4.dp) + .weight(1f) + ) { + onViewSubject(subject) + } + } + } + } + } + } + } + } +} + +@Preview +@Composable +fun SubjectScreenPreview() { + SubjectSelectionScreen( + goBack = {}, + onViewSubject = {}, + getTaskCount = { flowOf() }, + getCompletedTaskCount = { flowOf() }, + getStudyTime = { flowOf() }, + uiState = SubjectUiState.Succes( + listOf( + Subject( + name = "Test Subject", + argb_color = 0xFFFFD200, + ) + ) + ) + ) +} + +@Preview +@Composable +fun SubjectScreenLoadingPreview() { + SubjectSelectionScreen( + goBack = {}, + onViewSubject = {}, + getTaskCount = { flowOf() }, + getCompletedTaskCount = { flowOf() }, + getStudyTime = { flowOf() }, + uiState = SubjectUiState.Loading, + ) +} \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f7d2666..18eb296 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -40,6 +40,7 @@ Tasks Task My Subjects + Select Subject New Subject New Task Edit Subject @@ -47,6 +48,7 @@ Delete Subject Delete Task View + Select Regenerate Color