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
|
@Composable
|
||||||
fun DialogConfirmButton(@StringRes text: Int, action: () -> Unit) {
|
fun DialogConfirmButton(@StringRes text: Int, action: () -> Unit) {
|
||||||
Button(
|
Button(
|
||||||
|
|
|
@ -84,7 +84,7 @@ fun SubjectEntry(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
StealthButton(
|
StealthButton(
|
||||||
text = R.string.view_task,
|
text = R.string.view_tasks,
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.padding(start = 10.dp, end = 5.dp)
|
.padding(start = 10.dp, end = 5.dp)
|
||||||
.weight(1f)
|
.weight(1f)
|
||||||
|
|
|
@ -72,7 +72,7 @@ fun TaskEntry(
|
||||||
Text(
|
Text(
|
||||||
text = "${HoursMinutesSeconds(task.time)}",
|
text = "${HoursMinutesSeconds(task.time)}",
|
||||||
color = color,
|
color = color,
|
||||||
modifier = Modifier.weight(5f)
|
modifier = Modifier.weight(7f)
|
||||||
)
|
)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,4 +10,6 @@ interface SubjectDAO {
|
||||||
fun saveSubject(newSubject: Subject)
|
fun saveSubject(newSubject: Subject)
|
||||||
|
|
||||||
fun deleteSubject(oldSubject: Subject)
|
fun deleteSubject(oldSubject: Subject)
|
||||||
|
|
||||||
|
fun updateSubject(newSubject: Subject)
|
||||||
}
|
}
|
|
@ -28,6 +28,10 @@ class FireBaseSubjectDAO @Inject constructor(
|
||||||
currentUserSubjectsCollection().document(oldSubject.id).delete()
|
currentUserSubjectsCollection().document(oldSubject.id).delete()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun updateSubject(newSubject: Subject) {
|
||||||
|
currentUserSubjectsCollection().document(newSubject.id).set(newSubject)
|
||||||
|
}
|
||||||
|
|
||||||
private fun currentUserSubjectsCollection(): CollectionReference =
|
private fun currentUserSubjectsCollection(): CollectionReference =
|
||||||
firestore.collection(FireBaseCollections.USER_COLLECTION)
|
firestore.collection(FireBaseCollections.USER_COLLECTION)
|
||||||
.document(auth.currentUserId)
|
.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="tasks">Tasks</string>
|
||||||
<string name="new_subject">New Subject</string>
|
<string name="new_subject">New Subject</string>
|
||||||
<string name="new_task">New Task</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="edit_task">Edit Task</string>
|
||||||
<string name="delete_subject">Delete Subject</string>
|
<string name="delete_subject">Delete Subject</string>
|
||||||
<string name="delete_task">Delete Task</string>
|
<string name="delete_task">Delete Task</string>
|
||||||
|
<string name="view_tasks">View</string>
|
||||||
|
|
||||||
<!-- Sessions -->
|
<!-- Sessions -->
|
||||||
<string name="sessions">Sessions</string>
|
<string name="sessions">Sessions</string>
|
||||||
|
|
Reference in a new issue