parent
71590bd5a2
commit
831050f3f2
9 changed files with 207 additions and 3 deletions
|
@ -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(
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -72,7 +72,7 @@ fun TaskEntry(
|
|||
Text(
|
||||
text = "${HoursMinutesSeconds(task.time)}",
|
||||
color = color,
|
||||
modifier = Modifier.weight(5f)
|
||||
modifier = Modifier.weight(7f)
|
||||
)
|
||||
|
||||
}
|
||||
|
|
|
@ -10,4 +10,6 @@ interface SubjectDAO {
|
|||
fun saveSubject(newSubject: Subject)
|
||||
|
||||
fun deleteSubject(oldSubject: Subject)
|
||||
|
||||
fun updateSubject(newSubject: Subject)
|
||||
}
|
|
@ -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)
|
||||
|
|
|
@ -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 {}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
package be.ugent.sel.studeez.screens.tasks.forms
|
||||
|
||||
data class SubjectFormUiState(
|
||||
val name: String = "",
|
||||
val color: Long = 0xFFF44336,
|
||||
)
|
|
@ -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)
|
||||
}
|
||||
}
|
|
@ -44,10 +44,11 @@
|
|||
<string name="tasks">Tasks</string>
|
||||
<string name="new_subject">New Subject</string>
|
||||
<string name="new_task">New Task</string>
|
||||
<string name="view_task">View</string>
|
||||
<string name="edit_subject">Edit Subject</string>
|
||||
<string name="edit_task">Edit Task</string>
|
||||
<string name="delete_subject">Delete Subject</string>
|
||||
<string name="delete_task">Delete Task</string>
|
||||
<string name="view_tasks">View</string>
|
||||
|
||||
<!-- Sessions -->
|
||||
<string name="sessions">Sessions</string>
|
||||
|
|
Reference in a new issue