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