parent
b7a74a13d7
commit
71590bd5a2
6 changed files with 42 additions and 11 deletions
|
@ -18,7 +18,6 @@ import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.graphics.Color
|
import androidx.compose.ui.graphics.Color
|
||||||
import androidx.compose.ui.text.font.FontWeight
|
|
||||||
import androidx.compose.ui.text.style.TextOverflow
|
import androidx.compose.ui.text.style.TextOverflow
|
||||||
import androidx.compose.ui.tooling.preview.Preview
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
|
@ -31,13 +30,15 @@ import be.ugent.sel.studeez.resources
|
||||||
@Composable
|
@Composable
|
||||||
fun TaskEntry(
|
fun TaskEntry(
|
||||||
task: Task,
|
task: Task,
|
||||||
|
onCheckTask: (Boolean) -> Unit,
|
||||||
|
onDeleteTask: () -> Unit,
|
||||||
) {
|
) {
|
||||||
Card(
|
Card(
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.fillMaxWidth()
|
.fillMaxWidth()
|
||||||
.padding(horizontal = 10.dp, vertical = 5.dp),
|
.padding(horizontal = 10.dp, vertical = 5.dp),
|
||||||
) {
|
) {
|
||||||
val color = if (task.completed) Color.Gray else Color.Black
|
val color = if (task.completed) Color.Gray else MaterialTheme.colors.onSurface
|
||||||
Row(
|
Row(
|
||||||
horizontalArrangement = Arrangement.SpaceBetween,
|
horizontalArrangement = Arrangement.SpaceBetween,
|
||||||
verticalAlignment = Alignment.CenterVertically,
|
verticalAlignment = Alignment.CenterVertically,
|
||||||
|
@ -50,7 +51,7 @@ fun TaskEntry(
|
||||||
) {
|
) {
|
||||||
Checkbox(
|
Checkbox(
|
||||||
checked = task.completed,
|
checked = task.completed,
|
||||||
onCheckedChange = {},
|
onCheckedChange = onCheckTask,
|
||||||
colors = CheckboxDefaults.colors(
|
colors = CheckboxDefaults.colors(
|
||||||
checkedColor = Color.Gray,
|
checkedColor = Color.Gray,
|
||||||
uncheckedColor = MaterialTheme.colors.onSurface,
|
uncheckedColor = MaterialTheme.colors.onSurface,
|
||||||
|
@ -79,7 +80,7 @@ fun TaskEntry(
|
||||||
Box(modifier = Modifier.weight(7f)) {
|
Box(modifier = Modifier.weight(7f)) {
|
||||||
if (task.completed) {
|
if (task.completed) {
|
||||||
IconButton(
|
IconButton(
|
||||||
onClick = { /*TODO*/ },
|
onClick = onDeleteTask,
|
||||||
modifier = Modifier
|
modifier = Modifier
|
||||||
.padding(start = 20.dp)
|
.padding(start = 20.dp)
|
||||||
) {
|
) {
|
||||||
|
@ -109,6 +110,7 @@ fun TaskEntryPreview() {
|
||||||
name = "Test Task",
|
name = "Test Task",
|
||||||
completed = false,
|
completed = false,
|
||||||
),
|
),
|
||||||
|
{}, {},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -119,7 +121,8 @@ fun CompletedTaskEntryPreview() {
|
||||||
task = Task(
|
task = Task(
|
||||||
name = "Test Task",
|
name = "Test Task",
|
||||||
completed = true,
|
completed = true,
|
||||||
)
|
),
|
||||||
|
{}, {},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -131,5 +134,6 @@ fun OverflowTaskEntryPreview() {
|
||||||
name = "Test Taskkkkkkkkkkkkkkkkkkkkkkkkkkk",
|
name = "Test Taskkkkkkkkkkkkkkkkkkkkkkkkkkk",
|
||||||
completed = false,
|
completed = false,
|
||||||
),
|
),
|
||||||
|
{}, {},
|
||||||
)
|
)
|
||||||
}
|
}
|
|
@ -7,4 +7,5 @@ data class Task(
|
||||||
val name: String = "",
|
val name: String = "",
|
||||||
val completed: Boolean = false,
|
val completed: Boolean = false,
|
||||||
val time: Int = 0,
|
val time: Int = 0,
|
||||||
|
val subjectId: String = "",
|
||||||
)
|
)
|
||||||
|
|
|
@ -11,4 +11,6 @@ interface TaskDAO {
|
||||||
fun saveTask(newTask: Task)
|
fun saveTask(newTask: Task)
|
||||||
|
|
||||||
fun deleteTask(oldTask: Task)
|
fun deleteTask(oldTask: Task)
|
||||||
|
|
||||||
|
fun toggleTaskCompleted(task: Task, completed: Boolean)
|
||||||
}
|
}
|
|
@ -16,7 +16,7 @@ class FireBaseTaskDAO @Inject constructor(
|
||||||
private val auth: AccountDAO,
|
private val auth: AccountDAO,
|
||||||
) : TaskDAO {
|
) : TaskDAO {
|
||||||
override fun getTasks(subject: Subject): Flow<List<Task>> {
|
override fun getTasks(subject: Subject): Flow<List<Task>> {
|
||||||
return selectedSubjectTasksCollection(subject)
|
return selectedSubjectTasksCollection(subject.id)
|
||||||
.snapshots()
|
.snapshots()
|
||||||
.map { it.toObjects(Task::class.java) }
|
.map { it.toObjects(Task::class.java) }
|
||||||
}
|
}
|
||||||
|
@ -26,13 +26,19 @@ class FireBaseTaskDAO @Inject constructor(
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun deleteTask(oldTask: Task) {
|
override fun deleteTask(oldTask: Task) {
|
||||||
TODO("Not yet implemented")
|
selectedSubjectTasksCollection(oldTask.subjectId).document(oldTask.id).delete()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun selectedSubjectTasksCollection(subject: Subject): CollectionReference =
|
override fun toggleTaskCompleted(task: Task, completed: Boolean) {
|
||||||
|
selectedSubjectTasksCollection(task.subjectId)
|
||||||
|
.document(task.id)
|
||||||
|
.update("completed", completed)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun selectedSubjectTasksCollection(subjectId: String): CollectionReference =
|
||||||
firestore.collection(FireBaseCollections.USER_COLLECTION)
|
firestore.collection(FireBaseCollections.USER_COLLECTION)
|
||||||
.document(auth.currentUserId)
|
.document(auth.currentUserId)
|
||||||
.collection(FireBaseCollections.SUBJECT_COLLECTION)
|
.collection(FireBaseCollections.SUBJECT_COLLECTION)
|
||||||
.document(subject.id)
|
.document(subjectId)
|
||||||
.collection(FireBaseCollections.TASK_COLLECTION)
|
.collection(FireBaseCollections.TASK_COLLECTION)
|
||||||
}
|
}
|
|
@ -7,7 +7,6 @@ import androidx.compose.foundation.lazy.items
|
||||||
import androidx.compose.material.ButtonDefaults
|
import androidx.compose.material.ButtonDefaults
|
||||||
import androidx.compose.material.Icon
|
import androidx.compose.material.Icon
|
||||||
import androidx.compose.material.IconButton
|
import androidx.compose.material.IconButton
|
||||||
import androidx.compose.material.Text
|
|
||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
import androidx.compose.material.icons.filled.Edit
|
import androidx.compose.material.icons.filled.Edit
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
|
@ -20,6 +19,7 @@ import be.ugent.sel.studeez.R
|
||||||
import be.ugent.sel.studeez.common.composable.BasicButton
|
import be.ugent.sel.studeez.common.composable.BasicButton
|
||||||
import be.ugent.sel.studeez.common.composable.NewTaskSubjectButton
|
import be.ugent.sel.studeez.common.composable.NewTaskSubjectButton
|
||||||
import be.ugent.sel.studeez.common.composable.SecondaryScreenTemplate
|
import be.ugent.sel.studeez.common.composable.SecondaryScreenTemplate
|
||||||
|
import be.ugent.sel.studeez.common.composable.tasks.TaskEntry
|
||||||
import be.ugent.sel.studeez.common.ext.basicButton
|
import be.ugent.sel.studeez.common.ext.basicButton
|
||||||
import be.ugent.sel.studeez.data.local.models.task.Subject
|
import be.ugent.sel.studeez.data.local.models.task.Subject
|
||||||
import be.ugent.sel.studeez.data.local.models.task.Task
|
import be.ugent.sel.studeez.data.local.models.task.Task
|
||||||
|
@ -32,6 +32,8 @@ data class TaskActions(
|
||||||
val getSubject: () -> Subject,
|
val getSubject: () -> Subject,
|
||||||
val getTasks: () -> Flow<List<Task>>,
|
val getTasks: () -> Flow<List<Task>>,
|
||||||
val deleteSubject: () -> Unit,
|
val deleteSubject: () -> Unit,
|
||||||
|
val deleteTask: (Task) -> Unit,
|
||||||
|
val onCheckTask: (Task, Boolean) -> Unit,
|
||||||
)
|
)
|
||||||
|
|
||||||
fun getTaskActions(viewModel: TaskViewModel, open: (String) -> Unit): TaskActions {
|
fun getTaskActions(viewModel: TaskViewModel, open: (String) -> Unit): TaskActions {
|
||||||
|
@ -40,6 +42,8 @@ fun getTaskActions(viewModel: TaskViewModel, open: (String) -> Unit): TaskAction
|
||||||
getTasks = viewModel::getTasks,
|
getTasks = viewModel::getTasks,
|
||||||
getSubject = viewModel::getSelectedSubject,
|
getSubject = viewModel::getSelectedSubject,
|
||||||
deleteSubject = { viewModel.deleteSubject(open) },
|
deleteSubject = { viewModel.deleteSubject(open) },
|
||||||
|
deleteTask = viewModel::deleteTask,
|
||||||
|
onCheckTask = { task, isChecked -> viewModel.toggleTaskCompleted(task, isChecked) },
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,7 +75,11 @@ fun TaskScreen(
|
||||||
) {
|
) {
|
||||||
LazyColumn {
|
LazyColumn {
|
||||||
items(tasks.value) {
|
items(tasks.value) {
|
||||||
Text(text = it.name)
|
TaskEntry(
|
||||||
|
task = it,
|
||||||
|
onCheckTask = { isChecked -> taskActions.onCheckTask(it, isChecked) },
|
||||||
|
onDeleteTask = { taskActions.deleteTask(it) },
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
NewTaskSubjectButton(onClick = taskActions.addTask, R.string.new_task)
|
NewTaskSubjectButton(onClick = taskActions.addTask, R.string.new_task)
|
||||||
|
@ -111,6 +119,8 @@ fun TaskScreenPreview() {
|
||||||
{ Subject(name = "Test Subject") },
|
{ Subject(name = "Test Subject") },
|
||||||
{ flowOf() },
|
{ flowOf() },
|
||||||
{},
|
{},
|
||||||
|
{},
|
||||||
|
{ _, _ -> run {} },
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
|
@ -35,4 +35,12 @@ class TaskViewModel @Inject constructor(
|
||||||
fun getSelectedSubject(): Subject {
|
fun getSelectedSubject(): Subject {
|
||||||
return selectedSubject()
|
return selectedSubject()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun deleteTask(task: Task) {
|
||||||
|
taskDAO.deleteTask(task)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun toggleTaskCompleted(task: Task, completed: Boolean) {
|
||||||
|
taskDAO.toggleTaskCompleted(task, completed)
|
||||||
|
}
|
||||||
}
|
}
|
Reference in a new issue