parent
							
								
									6a676c2fad
								
							
						
					
					
						commit
						6765229d37
					
				
					 14 changed files with 249 additions and 30 deletions
				
			
		| 
						 | 
				
			
			@ -4,7 +4,6 @@ import androidx.compose.foundation.layout.Column
 | 
			
		|||
import androidx.compose.foundation.layout.padding
 | 
			
		||||
import androidx.compose.foundation.lazy.LazyColumn
 | 
			
		||||
import androidx.compose.foundation.lazy.items
 | 
			
		||||
import androidx.compose.material.ButtonDefaults
 | 
			
		||||
import androidx.compose.material.Icon
 | 
			
		||||
import androidx.compose.material.IconButton
 | 
			
		||||
import androidx.compose.material.icons.Icons
 | 
			
		||||
| 
						 | 
				
			
			@ -12,15 +11,12 @@ import androidx.compose.material.icons.filled.Edit
 | 
			
		|||
import androidx.compose.runtime.Composable
 | 
			
		||||
import androidx.compose.runtime.collectAsState
 | 
			
		||||
import androidx.compose.ui.Modifier
 | 
			
		||||
import androidx.compose.ui.graphics.Color
 | 
			
		||||
import androidx.compose.ui.tooling.preview.Preview
 | 
			
		||||
import androidx.compose.ui.unit.dp
 | 
			
		||||
import be.ugent.sel.studeez.R
 | 
			
		||||
import be.ugent.sel.studeez.common.composable.BasicButton
 | 
			
		||||
import be.ugent.sel.studeez.common.composable.NewTaskSubjectButton
 | 
			
		||||
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.data.local.models.task.Subject
 | 
			
		||||
import be.ugent.sel.studeez.data.local.models.task.Task
 | 
			
		||||
import be.ugent.sel.studeez.resources
 | 
			
		||||
| 
						 | 
				
			
			@ -38,7 +34,7 @@ data class TaskActions(
 | 
			
		|||
 | 
			
		||||
fun getTaskActions(viewModel: TaskViewModel, open: (String) -> Unit): TaskActions {
 | 
			
		||||
    return TaskActions(
 | 
			
		||||
        addTask = viewModel::addTask,
 | 
			
		||||
        addTask = { viewModel.addTask(open) },
 | 
			
		||||
        getTasks = viewModel::getTasks,
 | 
			
		||||
        getSubject = viewModel::getSelectedSubject,
 | 
			
		||||
        deleteTask = viewModel::deleteTask,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,8 +19,8 @@ class TaskViewModel @Inject constructor(
 | 
			
		|||
    private val selectedSubject: SelectedSubject,
 | 
			
		||||
    logService: LogService,
 | 
			
		||||
) : StudeezViewModel(logService) {
 | 
			
		||||
    fun addTask() {
 | 
			
		||||
 | 
			
		||||
    fun addTask(open: (String) -> Unit) {
 | 
			
		||||
        open(StudeezDestinations.ADD_TASK_FORM)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun getTasks(): Flow<List<Task>> {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -21,7 +21,7 @@ import be.ugent.sel.studeez.resources
 | 
			
		|||
@Composable
 | 
			
		||||
fun SubjectAddRoute(
 | 
			
		||||
    goBack: () -> Unit,
 | 
			
		||||
    open: (String) -> Unit,
 | 
			
		||||
    openAndPopUp: (String, String) -> Unit,
 | 
			
		||||
    viewModel: SubjectFormViewModel,
 | 
			
		||||
) {
 | 
			
		||||
    val uiState by viewModel.uiState
 | 
			
		||||
| 
						 | 
				
			
			@ -29,7 +29,7 @@ fun SubjectAddRoute(
 | 
			
		|||
        title = R.string.new_subject,
 | 
			
		||||
        goBack = goBack,
 | 
			
		||||
        uiState = uiState,
 | 
			
		||||
        onConfirm = { viewModel.onCreate(open) },
 | 
			
		||||
        onConfirm = { viewModel.onCreate(openAndPopUp) },
 | 
			
		||||
        onNameChange = viewModel::onNameChange,
 | 
			
		||||
        onColorChange = {},
 | 
			
		||||
    )
 | 
			
		||||
| 
						 | 
				
			
			@ -38,7 +38,7 @@ fun SubjectAddRoute(
 | 
			
		|||
@Composable
 | 
			
		||||
fun SubjectEditRoute(
 | 
			
		||||
    goBack: () -> Unit,
 | 
			
		||||
    open: (String) -> Unit,
 | 
			
		||||
    openAndPopUp: (String, String) -> Unit,
 | 
			
		||||
    viewModel: SubjectFormViewModel,
 | 
			
		||||
) {
 | 
			
		||||
    val uiState by viewModel.uiState
 | 
			
		||||
| 
						 | 
				
			
			@ -46,11 +46,13 @@ fun SubjectEditRoute(
 | 
			
		|||
        title = R.string.edit_subject,
 | 
			
		||||
        goBack = goBack,
 | 
			
		||||
        uiState = uiState,
 | 
			
		||||
        onConfirm = { viewModel.onEdit(open) },
 | 
			
		||||
        onConfirm = { viewModel.onEdit(openAndPopUp) },
 | 
			
		||||
        onNameChange = viewModel::onNameChange,
 | 
			
		||||
        onColorChange = {},
 | 
			
		||||
    ) {
 | 
			
		||||
        DeleteButton(onClick = { viewModel.onDelete(open) })
 | 
			
		||||
        DeleteButton(text = R.string.delete_subject) {
 | 
			
		||||
            viewModel.onDelete(openAndPopUp)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -112,6 +114,6 @@ fun EditSubjectFormPreview() {
 | 
			
		|||
        onNameChange = {},
 | 
			
		||||
        onColorChange = {},
 | 
			
		||||
    ) {
 | 
			
		||||
        DeleteButton {}
 | 
			
		||||
        DeleteButton(text = R.string.delete_subject) {}
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -16,7 +16,13 @@ class SubjectFormViewModel @Inject constructor(
 | 
			
		|||
    private val selectedSubject: SelectedSubject,
 | 
			
		||||
    logService: LogService,
 | 
			
		||||
) : StudeezViewModel(logService) {
 | 
			
		||||
    var uiState = mutableStateOf(SubjectFormUiState())
 | 
			
		||||
    var uiState = mutableStateOf(
 | 
			
		||||
        if (selectedSubject.isSet()) SubjectFormUiState(
 | 
			
		||||
            name = selectedSubject().name,
 | 
			
		||||
            color = selectedSubject().argb_color
 | 
			
		||||
        )
 | 
			
		||||
        else SubjectFormUiState()
 | 
			
		||||
    )
 | 
			
		||||
        private set
 | 
			
		||||
 | 
			
		||||
    private val name: String
 | 
			
		||||
| 
						 | 
				
			
			@ -33,12 +39,12 @@ class SubjectFormViewModel @Inject constructor(
 | 
			
		|||
        uiState.value = uiState.value.copy(color = newValue)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun onDelete(open: (String) -> Unit) {
 | 
			
		||||
    fun onDelete(openAndPopUp: (String, String) -> Unit) {
 | 
			
		||||
        subjectDAO.deleteSubject(selectedSubject())
 | 
			
		||||
        open(StudeezDestinations.SUBJECT_SCREEN)
 | 
			
		||||
        openAndPopUp(StudeezDestinations.SUBJECT_SCREEN, StudeezDestinations.EDIT_SUBJECT_FORM)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun onCreate(open: (String) -> Unit) {
 | 
			
		||||
    fun onCreate(openAndPopUp: (String, String) -> Unit) {
 | 
			
		||||
        val newSubject = Subject(
 | 
			
		||||
            name = name,
 | 
			
		||||
            argb_color = color,
 | 
			
		||||
| 
						 | 
				
			
			@ -46,20 +52,18 @@ class SubjectFormViewModel @Inject constructor(
 | 
			
		|||
        subjectDAO.saveSubject(
 | 
			
		||||
            newSubject
 | 
			
		||||
        )
 | 
			
		||||
        selectedSubject.set(newSubject)
 | 
			
		||||
        // TODO open newly created subject
 | 
			
		||||
//        selectedSubject.set(newSubject)
 | 
			
		||||
//        open(StudeezDestinations.TASKS_SCREEN)
 | 
			
		||||
        open(StudeezDestinations.SUBJECT_SCREEN)
 | 
			
		||||
        openAndPopUp(StudeezDestinations.SUBJECT_SCREEN, StudeezDestinations.ADD_SUBJECT_FORM)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun onEdit(open: (String) -> Unit) {
 | 
			
		||||
    fun onEdit(openAndPopUp: (String, String) -> Unit) {
 | 
			
		||||
        val newSubject = selectedSubject().copy(
 | 
			
		||||
            name = name,
 | 
			
		||||
            argb_color = color,
 | 
			
		||||
        )
 | 
			
		||||
        subjectDAO.updateSubject(
 | 
			
		||||
            newSubject
 | 
			
		||||
        )
 | 
			
		||||
        open(StudeezDestinations.TASKS_SCREEN)
 | 
			
		||||
        subjectDAO.updateSubject(newSubject)
 | 
			
		||||
        openAndPopUp(StudeezDestinations.TASKS_SCREEN, StudeezDestinations.EDIT_SUBJECT_FORM)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,113 @@
 | 
			
		|||
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 TaskAddRoute(
 | 
			
		||||
    goBack: () -> Unit,
 | 
			
		||||
    openAndPopUp: (String, String) -> Unit,
 | 
			
		||||
    viewModel: TaskFormViewModel,
 | 
			
		||||
) {
 | 
			
		||||
    val uiState by viewModel.uiState
 | 
			
		||||
    TaskForm(
 | 
			
		||||
        title = R.string.new_task,
 | 
			
		||||
        goBack = goBack,
 | 
			
		||||
        uiState = uiState,
 | 
			
		||||
        onConfirm = { viewModel.onCreate(openAndPopUp) },
 | 
			
		||||
        onNameChange = viewModel::onNameChange
 | 
			
		||||
    )
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun TaskEditRoute(
 | 
			
		||||
    goBack: () -> Unit,
 | 
			
		||||
    openAndPopUp: (String, String) -> Unit,
 | 
			
		||||
    viewModel: TaskFormViewModel,
 | 
			
		||||
) {
 | 
			
		||||
    val uiState by viewModel.uiState
 | 
			
		||||
    TaskForm(
 | 
			
		||||
        title = R.string.edit_task,
 | 
			
		||||
        goBack = goBack,
 | 
			
		||||
        uiState = uiState,
 | 
			
		||||
        onConfirm = { viewModel.onEdit(openAndPopUp) },
 | 
			
		||||
        onNameChange = viewModel::onNameChange
 | 
			
		||||
    ) {
 | 
			
		||||
        DeleteButton(text = R.string.delete_task) {
 | 
			
		||||
            viewModel.onDelete(openAndPopUp)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun TaskForm(
 | 
			
		||||
    @StringRes title: Int,
 | 
			
		||||
    goBack: () -> Unit,
 | 
			
		||||
    uiState: TaskFormUiState,
 | 
			
		||||
    onConfirm: () -> Unit,
 | 
			
		||||
    onNameChange: (String) -> Unit,
 | 
			
		||||
    extraButton: @Composable () -> Unit = {}
 | 
			
		||||
) {
 | 
			
		||||
    SecondaryScreenTemplate(
 | 
			
		||||
        title = resources().getString(title),
 | 
			
		||||
        popUp = goBack,
 | 
			
		||||
    ) {
 | 
			
		||||
        Column {
 | 
			
		||||
            OutlinedTextField(
 | 
			
		||||
                singleLine = true,
 | 
			
		||||
                value = uiState.name,
 | 
			
		||||
                onValueChange = onNameChange,
 | 
			
		||||
                placeholder = { Text(stringResource(id = R.string.name)) },
 | 
			
		||||
                modifier = Modifier.fieldModifier(),
 | 
			
		||||
            )
 | 
			
		||||
            BasicButton(
 | 
			
		||||
                text = R.string.confirm,
 | 
			
		||||
                modifier = Modifier.basicButton(),
 | 
			
		||||
                onClick = onConfirm,
 | 
			
		||||
            )
 | 
			
		||||
            extraButton()
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@Preview
 | 
			
		||||
@Composable
 | 
			
		||||
fun AddTaskFormPreview() {
 | 
			
		||||
    TaskForm(
 | 
			
		||||
        title = R.string.new_task,
 | 
			
		||||
        goBack = {},
 | 
			
		||||
        uiState = TaskFormUiState(),
 | 
			
		||||
        onConfirm = {},
 | 
			
		||||
        onNameChange = {},
 | 
			
		||||
    )
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@Preview
 | 
			
		||||
@Composable
 | 
			
		||||
fun EditTaskFormPreview() {
 | 
			
		||||
    TaskForm(
 | 
			
		||||
        title = R.string.edit_task,
 | 
			
		||||
        goBack = {},
 | 
			
		||||
        uiState = TaskFormUiState(
 | 
			
		||||
            name = "Test Task",
 | 
			
		||||
        ),
 | 
			
		||||
        onConfirm = {},
 | 
			
		||||
        onNameChange = {},
 | 
			
		||||
    ) {
 | 
			
		||||
        DeleteButton(text = R.string.delete_task) {}
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,5 @@
 | 
			
		|||
package be.ugent.sel.studeez.screens.tasks.forms
 | 
			
		||||
 | 
			
		||||
data class TaskFormUiState(
 | 
			
		||||
    val name: String = "",
 | 
			
		||||
)
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,49 @@
 | 
			
		|||
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.SelectedTask
 | 
			
		||||
import be.ugent.sel.studeez.data.local.models.task.Task
 | 
			
		||||
import be.ugent.sel.studeez.domain.LogService
 | 
			
		||||
import be.ugent.sel.studeez.domain.TaskDAO
 | 
			
		||||
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 TaskFormViewModel @Inject constructor(
 | 
			
		||||
    private val taskDAO: TaskDAO,
 | 
			
		||||
    private val selectedSubject: SelectedSubject,
 | 
			
		||||
    private val selectedTask: SelectedTask,
 | 
			
		||||
    logService: LogService,
 | 
			
		||||
) : StudeezViewModel(logService) {
 | 
			
		||||
    var uiState = mutableStateOf(
 | 
			
		||||
        if (selectedTask.isSet()) TaskFormUiState(selectedTask().name) else TaskFormUiState()
 | 
			
		||||
    )
 | 
			
		||||
        private set
 | 
			
		||||
 | 
			
		||||
    private val name: String
 | 
			
		||||
        get() = uiState.value.name
 | 
			
		||||
 | 
			
		||||
    fun onNameChange(newValue: String) {
 | 
			
		||||
        uiState.value = uiState.value.copy(name = newValue)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun onDelete(openAndPopUp: (String, String) -> Unit) {
 | 
			
		||||
        taskDAO.deleteTask(selectedTask())
 | 
			
		||||
        openAndPopUp(StudeezDestinations.TASKS_SCREEN, StudeezDestinations.EDIT_TASK_FORM)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun onCreate(openAndPopUp: (String, String) -> Unit) {
 | 
			
		||||
        val newTask = Task(name = name, subjectId = selectedSubject().id)
 | 
			
		||||
        taskDAO.saveTask(newTask)
 | 
			
		||||
        openAndPopUp(StudeezDestinations.TASKS_SCREEN, StudeezDestinations.ADD_TASK_FORM)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun onEdit(openAndPopUp: (String, String) -> Unit) {
 | 
			
		||||
        val newTask = Task(name = name)
 | 
			
		||||
        taskDAO.updateTask(newTask)
 | 
			
		||||
        openAndPopUp(StudeezDestinations.TASKS_SCREEN, StudeezDestinations.EDIT_TASK_FORM)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Reference in a new issue