From 831050f3f2bf8c1b60094d2b9e3d67c1dcba8b32 Mon Sep 17 00:00:00 2001 From: brreynie Date: Wed, 3 May 2023 21:48:23 +0200 Subject: [PATCH] #15 and #16 form to create and edit subject --- .../common/composable/ButtonComposable.kt | 22 ++++ .../common/composable/tasks/SubjectEntry.kt | 2 +- .../common/composable/tasks/TaskEntry.kt | 2 +- .../be/ugent/sel/studeez/domain/SubjectDAO.kt | 2 + .../implementation/FireBaseSubjectDAO.kt | 4 + .../screens/tasks/forms/SubjectFormScreen.kt | 106 ++++++++++++++++++ .../screens/tasks/forms/SubjectFormUiState.kt | 6 + .../tasks/forms/SubjectFormViewModel.kt | 63 +++++++++++ app/src/main/res/values/strings.xml | 3 +- 9 files changed, 207 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/tasks/forms/SubjectFormScreen.kt create mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/tasks/forms/SubjectFormUiState.kt create mode 100644 app/src/main/java/be/ugent/sel/studeez/screens/tasks/forms/SubjectFormViewModel.kt diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/ButtonComposable.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/ButtonComposable.kt index 286ea96..0d6d9e8 100644 --- a/app/src/main/java/be/ugent/sel/studeez/common/composable/ButtonComposable.kt +++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/ButtonComposable.kt @@ -88,6 +88,28 @@ fun StealthButtonCardPreview() { } } + +@Composable +fun DeleteButton( + onClick: () -> Unit, +) { + BasicButton( + text = R.string.delete_subject, + modifier = Modifier.basicButton(), + onClick = onClick, + colors = ButtonDefaults.buttonColors( + backgroundColor = Color.Red, + contentColor = Color.White, + ), + ) +} + +@Preview +@Composable +fun DeleteButtonPreview() { + DeleteButton {} +} + @Composable fun DialogConfirmButton(@StringRes text: Int, action: () -> Unit) { Button( 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 54fc2a2..5c19c80 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 @@ -84,7 +84,7 @@ fun SubjectEntry( } } StealthButton( - text = R.string.view_task, + text = R.string.view_tasks, modifier = Modifier .padding(start = 10.dp, end = 5.dp) .weight(1f) diff --git a/app/src/main/java/be/ugent/sel/studeez/common/composable/tasks/TaskEntry.kt b/app/src/main/java/be/ugent/sel/studeez/common/composable/tasks/TaskEntry.kt index 458cafc..fefb924 100644 --- a/app/src/main/java/be/ugent/sel/studeez/common/composable/tasks/TaskEntry.kt +++ b/app/src/main/java/be/ugent/sel/studeez/common/composable/tasks/TaskEntry.kt @@ -72,7 +72,7 @@ fun TaskEntry( Text( text = "${HoursMinutesSeconds(task.time)}", color = color, - modifier = Modifier.weight(5f) + modifier = Modifier.weight(7f) ) } diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/SubjectDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/SubjectDAO.kt index dd24b45..2749fac 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/SubjectDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/SubjectDAO.kt @@ -10,4 +10,6 @@ interface SubjectDAO { fun saveSubject(newSubject: Subject) fun deleteSubject(oldSubject: Subject) + + fun updateSubject(newSubject: Subject) } \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FireBaseSubjectDAO.kt b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FireBaseSubjectDAO.kt index 04b1351..7d90fbf 100644 --- a/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FireBaseSubjectDAO.kt +++ b/app/src/main/java/be/ugent/sel/studeez/domain/implementation/FireBaseSubjectDAO.kt @@ -28,6 +28,10 @@ class FireBaseSubjectDAO @Inject constructor( currentUserSubjectsCollection().document(oldSubject.id).delete() } + override fun updateSubject(newSubject: Subject) { + currentUserSubjectsCollection().document(newSubject.id).set(newSubject) + } + private fun currentUserSubjectsCollection(): CollectionReference = firestore.collection(FireBaseCollections.USER_COLLECTION) .document(auth.currentUserId) diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/tasks/forms/SubjectFormScreen.kt b/app/src/main/java/be/ugent/sel/studeez/screens/tasks/forms/SubjectFormScreen.kt new file mode 100644 index 0000000..b2a8055 --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/tasks/forms/SubjectFormScreen.kt @@ -0,0 +1,106 @@ +package be.ugent.sel.studeez.screens.tasks.forms + +import androidx.annotation.StringRes +import androidx.compose.foundation.layout.Column +import androidx.compose.material.OutlinedTextField +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import be.ugent.sel.studeez.R +import be.ugent.sel.studeez.common.composable.BasicButton +import be.ugent.sel.studeez.common.composable.DeleteButton +import be.ugent.sel.studeez.common.composable.SecondaryScreenTemplate +import be.ugent.sel.studeez.common.ext.basicButton +import be.ugent.sel.studeez.common.ext.fieldModifier +import be.ugent.sel.studeez.resources + +@Composable +fun SubjectAddRoute( + goBack: () -> Unit, + open: (String) -> Unit, + viewModel: SubjectFormViewModel, +) { + val uiState by viewModel.uiState + SubjectForm( + title = R.string.new_subject, + goBack = goBack, + uiState = uiState, + onConfirm = { viewModel.onCreate(open) }, + ) +} + +@Composable +fun SubjectEditRoute( + goBack: () -> Unit, + open: (String) -> Unit, + viewModel: SubjectFormViewModel, +) { + val uiState by viewModel.uiState + SubjectForm( + title = R.string.edit_subject, + goBack = goBack, + uiState = uiState, + onConfirm = { viewModel.onEdit(open) }, + ) { + DeleteButton(onClick = viewModel::onDelete) + } +} + +@Composable +fun SubjectForm( + @StringRes title: Int, + goBack: () -> Unit, + uiState: SubjectFormUiState, + onConfirm: () -> Unit, + extraButton: @Composable () -> Unit = {}, +) { + SecondaryScreenTemplate( + title = resources().getString(title), + popUp = goBack, + ) { + Column { + OutlinedTextField( + singleLine = true, + value = uiState.name, + onValueChange = {}, + placeholder = { Text(stringResource(id = R.string.username)) }, + modifier = Modifier.fieldModifier(), + ) + BasicButton( + text = R.string.confirm, + modifier = Modifier.basicButton(), + onClick = onConfirm, + ) + extraButton() + } + } +} + +@Preview +@Composable +fun AddSubjectFormPreview() { + SubjectForm( + title = R.string.new_subject, + goBack = {}, + uiState = SubjectFormUiState(), + onConfirm = {}, + ) +} + +@Preview +@Composable +fun EditSubjectFormPreview() { + SubjectForm( + title = R.string.edit_subject, + goBack = {}, + uiState = SubjectFormUiState( + name = "Test Subject", + ), + onConfirm = {}, + ) { + DeleteButton {} + } +} \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/tasks/forms/SubjectFormUiState.kt b/app/src/main/java/be/ugent/sel/studeez/screens/tasks/forms/SubjectFormUiState.kt new file mode 100644 index 0000000..6e8f9cf --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/tasks/forms/SubjectFormUiState.kt @@ -0,0 +1,6 @@ +package be.ugent.sel.studeez.screens.tasks.forms + +data class SubjectFormUiState( + val name: String = "", + val color: Long = 0xFFF44336, +) \ No newline at end of file diff --git a/app/src/main/java/be/ugent/sel/studeez/screens/tasks/forms/SubjectFormViewModel.kt b/app/src/main/java/be/ugent/sel/studeez/screens/tasks/forms/SubjectFormViewModel.kt new file mode 100644 index 0000000..99ea85c --- /dev/null +++ b/app/src/main/java/be/ugent/sel/studeez/screens/tasks/forms/SubjectFormViewModel.kt @@ -0,0 +1,63 @@ +package be.ugent.sel.studeez.screens.tasks.forms + +import androidx.compose.runtime.mutableStateOf +import be.ugent.sel.studeez.data.SelectedSubject +import be.ugent.sel.studeez.data.local.models.task.Subject +import be.ugent.sel.studeez.domain.LogService +import be.ugent.sel.studeez.domain.SubjectDAO +import be.ugent.sel.studeez.navigation.StudeezDestinations +import be.ugent.sel.studeez.screens.StudeezViewModel +import dagger.hilt.android.lifecycle.HiltViewModel +import javax.inject.Inject + +@HiltViewModel +class SubjectFormViewModel @Inject constructor( + private val subjectDAO: SubjectDAO, + private val selectedSubject: SelectedSubject, + logService: LogService, +) : StudeezViewModel(logService) { + var uiState = mutableStateOf(SubjectFormUiState()) + private set + + private val name: String + get() = uiState.value.name + + private val color: Long + get() = uiState.value.color + + fun onNameChange(newValue: String) { + uiState.value = uiState.value.copy(name = newValue) + } + + fun onColorChange(newValue: Long) { + uiState.value = uiState.value.copy(color = newValue) + } + + fun onDelete() { + subjectDAO.deleteSubject(selectedSubject()) + } + + fun onCreate(open: (String) -> Unit) { + val newSubject = Subject( + name = name, + argb_color = color, + ) + subjectDAO.saveSubject( + newSubject + ) + selectedSubject.set(newSubject) + // TODO open newly created subject +// open(StudeezDestinations.TASKS_SCREEN) + } + + fun onEdit(open: (String) -> Unit) { + val newSubject = selectedSubject().copy( + name = name, + argb_color = color, + ) + subjectDAO.updateSubject( + newSubject + ) + open(StudeezDestinations.TASKS_SCREEN) + } +} \ 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 fbf6c5b..de9589f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -44,10 +44,11 @@ Tasks New Subject New Task - View + Edit Subject Edit Task Delete Subject Delete Task + View Sessions