work1
This commit is contained in:
parent
af8f416ea8
commit
90aef7e59a
@ -60,6 +60,4 @@ class RestTaskRepository(
|
|||||||
override suspend fun deleteTask(task: Task) {
|
override suspend fun deleteTask(task: Task) {
|
||||||
service.deleteTask(task.uid).toTask()
|
service.deleteTask(task.uid).toTask()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
@ -27,7 +27,7 @@ data class Task(
|
|||||||
@ColumnInfo(name = "endDate")
|
@ColumnInfo(name = "endDate")
|
||||||
val endDate: String,
|
val endDate: String,
|
||||||
@ColumnInfo(name = "favorite")
|
@ColumnInfo(name = "favorite")
|
||||||
val favorite: Boolean,
|
var favorite: Boolean,
|
||||||
@ColumnInfo(name = "user_id", index = true)
|
@ColumnInfo(name = "user_id", index = true)
|
||||||
val userId: Int,
|
val userId: Int,
|
||||||
) {
|
) {
|
||||||
|
@ -27,6 +27,9 @@ class OfflineTaskRepository(private val taskDao: TaskDao) : TaskRepository {
|
|||||||
override suspend fun updateTask(task: Task) = taskDao.update(task)
|
override suspend fun updateTask(task: Task) = taskDao.update(task)
|
||||||
|
|
||||||
override suspend fun deleteTask(task: Task) = taskDao.delete(task)
|
override suspend fun deleteTask(task: Task) = taskDao.delete(task)
|
||||||
|
override suspend fun favoriteTask(task: Task) {
|
||||||
|
TODO("Not yet implemented")
|
||||||
|
}
|
||||||
|
|
||||||
fun getAllTasksPagingSource(): PagingSource<Int, Task> = taskDao.getAll()
|
fun getAllTasksPagingSource(): PagingSource<Int, Task> = taskDao.getAll()
|
||||||
|
|
||||||
|
@ -15,9 +15,12 @@ import androidx.compose.foundation.layout.fillMaxWidth
|
|||||||
import androidx.compose.foundation.layout.padding
|
import androidx.compose.foundation.layout.padding
|
||||||
import androidx.compose.foundation.lazy.LazyColumn
|
import androidx.compose.foundation.lazy.LazyColumn
|
||||||
import androidx.compose.material.ExperimentalMaterialApi
|
import androidx.compose.material.ExperimentalMaterialApi
|
||||||
|
import androidx.compose.material.IconButton
|
||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
import androidx.compose.material.icons.filled.Add
|
import androidx.compose.material.icons.filled.Add
|
||||||
import androidx.compose.material.icons.filled.Delete
|
import androidx.compose.material.icons.filled.Delete
|
||||||
|
import androidx.compose.material.icons.filled.Edit
|
||||||
|
import androidx.compose.material.icons.filled.Favorite
|
||||||
import androidx.compose.material.pullrefresh.PullRefreshIndicator
|
import androidx.compose.material.pullrefresh.PullRefreshIndicator
|
||||||
import androidx.compose.material.pullrefresh.pullRefresh
|
import androidx.compose.material.pullrefresh.pullRefresh
|
||||||
import androidx.compose.material.pullrefresh.rememberPullRefreshState
|
import androidx.compose.material.pullrefresh.rememberPullRefreshState
|
||||||
@ -93,10 +96,22 @@ fun TaskList(
|
|||||||
val route = Screen.TaskEdit.route.replace("{id}", uid.toString())
|
val route = Screen.TaskEdit.route.replace("{id}", uid.toString())
|
||||||
navController.navigate(route)
|
navController.navigate(route)
|
||||||
},
|
},
|
||||||
onSwipe = { task: Task ->
|
onDeleteClick = { task: Task ->
|
||||||
|
// Обработка удаления задачи
|
||||||
coroutineScope.launch {
|
coroutineScope.launch {
|
||||||
viewModel.deleteTask(task)
|
viewModel.deleteTask(task)
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
onAddToFavoritesClick = { task: Task ->
|
||||||
|
// Обработка добавления задачи в избранное
|
||||||
|
coroutineScope.launch {
|
||||||
|
viewModel.favoriteTask(task)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onEditClick = { task: Task ->
|
||||||
|
// Обработка редактирования задачи
|
||||||
|
val route = Screen.TaskEdit.route.replace("{id}", task.uid.toString())
|
||||||
|
navController.navigate(route)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@ -130,29 +145,64 @@ fun DismissBackground(dismissState: DismissState) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@OptIn(ExperimentalMaterial3Api::class)
|
@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterialApi::class)
|
||||||
@Composable
|
@Composable
|
||||||
private fun SwipeToDelete(
|
private fun SwipeToDelete(
|
||||||
dismissState: DismissState,
|
|
||||||
task: Task,
|
task: Task,
|
||||||
onClick: (uid: Int) -> Unit
|
onClick: (uid: Int) -> Unit,
|
||||||
|
onDeleteClick: (task: Task) -> Unit,
|
||||||
|
onAddToFavoritesClick: (task: Task) -> Unit,
|
||||||
|
onEditClick: (task: Task) -> Unit
|
||||||
) {
|
) {
|
||||||
SwipeToDismiss(
|
Card(
|
||||||
modifier = Modifier.zIndex(1f),
|
modifier = Modifier
|
||||||
state = dismissState,
|
.fillMaxWidth()
|
||||||
directions = setOf(
|
.padding(vertical = 7.dp)
|
||||||
DismissDirection.EndToStart
|
) {
|
||||||
),
|
Row(
|
||||||
background = {
|
modifier = Modifier
|
||||||
DismissBackground(dismissState)
|
.fillMaxWidth()
|
||||||
},
|
.padding(16.dp),
|
||||||
dismissContent = {
|
verticalAlignment = Alignment.CenterVertically
|
||||||
TaskListItem(task = task,
|
) {
|
||||||
modifier = Modifier
|
Text(
|
||||||
.padding(vertical = 7.dp)
|
text = String.format("%s %s", task.name, task.description),
|
||||||
.clickable { onClick(task.uid) })
|
modifier = Modifier.weight(1f)
|
||||||
|
)
|
||||||
|
|
||||||
|
IconButton(
|
||||||
|
onClick = { onEditClick(task) },
|
||||||
|
modifier = Modifier.padding(start = 8.dp)
|
||||||
|
) {
|
||||||
|
Icon(
|
||||||
|
imageVector = Icons.Default.Edit,
|
||||||
|
contentDescription = "Редактировать",
|
||||||
|
tint = Color.Blue
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
IconButton(
|
||||||
|
onClick = { onDeleteClick(task) },
|
||||||
|
modifier = Modifier.padding(start = 8.dp)
|
||||||
|
) {
|
||||||
|
Icon(
|
||||||
|
imageVector = Icons.Default.Delete,
|
||||||
|
contentDescription = "Удалить",
|
||||||
|
tint = Color.Red
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
IconButton(
|
||||||
|
onClick = { onAddToFavoritesClick(task) },
|
||||||
|
modifier = Modifier.padding(start = 8.dp)
|
||||||
|
) {
|
||||||
|
Icon(
|
||||||
|
imageVector = Icons.Default.Favorite,
|
||||||
|
contentDescription = "Добавить в избранное"
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
)
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterialApi::class)
|
@OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterialApi::class)
|
||||||
@ -161,7 +211,9 @@ private fun TaskList(
|
|||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
taskList: LazyPagingItems<Task>,
|
taskList: LazyPagingItems<Task>,
|
||||||
onClick: (uid: Int) -> Unit,
|
onClick: (uid: Int) -> Unit,
|
||||||
onSwipe: (task: Task) -> Unit
|
onDeleteClick: (task: Task) -> Unit,
|
||||||
|
onAddToFavoritesClick: (task: Task) -> Unit,
|
||||||
|
onEditClick: (task: Task) -> Unit
|
||||||
) {
|
) {
|
||||||
val refreshScope = rememberCoroutineScope()
|
val refreshScope = rememberCoroutineScope()
|
||||||
var refreshing by remember { mutableStateOf(false) }
|
var refreshing by remember { mutableStateOf(false) }
|
||||||
@ -186,34 +238,13 @@ private fun TaskList(
|
|||||||
) { index ->
|
) { index ->
|
||||||
val task = taskList[index]
|
val task = taskList[index]
|
||||||
task?.let {
|
task?.let {
|
||||||
var show by remember { mutableStateOf(true) }
|
SwipeToDelete(
|
||||||
val dismissState = rememberDismissState(
|
task = task,
|
||||||
confirmValueChange = {
|
onClick = onClick,
|
||||||
if (it == DismissValue.DismissedToStart ||
|
onDeleteClick = onDeleteClick,
|
||||||
it == DismissValue.DismissedToEnd
|
onAddToFavoritesClick = onAddToFavoritesClick,
|
||||||
) {
|
onEditClick = onEditClick
|
||||||
show = false
|
|
||||||
true
|
|
||||||
} else false
|
|
||||||
}, positionalThreshold = { 200.dp.toPx() }
|
|
||||||
)
|
)
|
||||||
|
|
||||||
AnimatedVisibility(
|
|
||||||
show, exit = fadeOut(spring())
|
|
||||||
) {
|
|
||||||
SwipeToDelete(
|
|
||||||
dismissState = dismissState,
|
|
||||||
task = task,
|
|
||||||
onClick = onClick
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
LaunchedEffect(show) {
|
|
||||||
if (!show) {
|
|
||||||
delay(800)
|
|
||||||
onSwipe(task)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -227,6 +258,8 @@ private fun TaskList(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
private fun TaskListItem(
|
private fun TaskListItem(
|
||||||
task: Task, modifier: Modifier = Modifier
|
task: Task, modifier: Modifier = Modifier
|
||||||
@ -244,41 +277,3 @@ private fun TaskListItem(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Preview(name = "Light Mode", showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_NO)
|
|
||||||
@Preview(name = "Dark Mode", showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES)
|
|
||||||
@Composable
|
|
||||||
fun TaskListPreview() {
|
|
||||||
PmudemoTheme {
|
|
||||||
Surface(
|
|
||||||
color = MaterialTheme.colorScheme.background
|
|
||||||
) {
|
|
||||||
TaskList(
|
|
||||||
taskList = MutableStateFlow(
|
|
||||||
PagingData.from((1..20).map { i -> Task.getTask(i) })
|
|
||||||
).collectAsLazyPagingItems(),
|
|
||||||
onClick = {},
|
|
||||||
onSwipe = {}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Preview(name = "Light Mode", showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_NO)
|
|
||||||
@Preview(name = "Dark Mode", showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES)
|
|
||||||
@Composable
|
|
||||||
fun TaskEmptyListPreview() {
|
|
||||||
PmudemoTheme {
|
|
||||||
Surface(
|
|
||||||
color = MaterialTheme.colorScheme.background
|
|
||||||
) {
|
|
||||||
TaskList(
|
|
||||||
taskList = MutableStateFlow(
|
|
||||||
PagingData.empty<Task>()
|
|
||||||
).collectAsLazyPagingItems(),
|
|
||||||
onClick = {},
|
|
||||||
onSwipe = {}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -15,4 +15,5 @@ class TaskListViewModel(
|
|||||||
suspend fun deleteTask(task: Task) {
|
suspend fun deleteTask(task: Task) {
|
||||||
taskRepository.deleteTask(task)
|
taskRepository.deleteTask(task)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -14,19 +14,11 @@
|
|||||||
"tasks": [
|
"tasks": [
|
||||||
{
|
{
|
||||||
"id": 1,
|
"id": 1,
|
||||||
"name": "Test",
|
"name": "123456",
|
||||||
"description": "Test",
|
"description": "32155",
|
||||||
"endDate": "20.12.2023",
|
"endDate": "55",
|
||||||
"favorite": false,
|
"favorite": false,
|
||||||
"userId": 1
|
"userId": 1
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Test1",
|
|
||||||
"description": "Test2",
|
|
||||||
"endDate": "Test3",
|
|
||||||
"favorite": false,
|
|
||||||
"userId": 1,
|
|
||||||
"id": 2
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user