This commit is contained in:
Trey t
2025-11-07 12:57:25 -06:00
parent 1b777049a8
commit 4e14352cd1
11 changed files with 323 additions and 21 deletions

View File

@@ -165,4 +165,36 @@ class TaskApi(private val client: HttpClient = ApiClient.httpClient) {
ApiResult.Error(e.message ?: "Unknown error occurred")
}
}
suspend fun archiveTask(token: String, id: Int): ApiResult<TaskCancelResponse> {
return try {
val response = client.post("$baseUrl/tasks/$id/archive/") {
header("Authorization", "Token $token")
}
if (response.status.isSuccess()) {
ApiResult.Success(response.body())
} else {
ApiResult.Error("Failed to archive task", response.status.value)
}
} catch (e: Exception) {
ApiResult.Error(e.message ?: "Unknown error occurred")
}
}
suspend fun unarchiveTask(token: String, id: Int): ApiResult<TaskCancelResponse> {
return try {
val response = client.post("$baseUrl/tasks/$id/unarchive/") {
header("Authorization", "Token $token")
}
if (response.status.isSuccess()) {
ApiResult.Success(response.body())
} else {
ApiResult.Error("Failed to unarchive task", response.status.value)
}
} catch (e: Exception) {
ApiResult.Error(e.message ?: "Unknown error occurred")
}
}
}

View File

@@ -24,7 +24,9 @@ fun TaskCard(
onEditClick: () -> Unit,
onCancelClick: (() -> Unit)?,
onUncancelClick: (() -> Unit)?,
onMarkInProgressClick: (() -> Unit)? = null
onMarkInProgressClick: (() -> Unit)? = null,
onArchiveClick: (() -> Unit)? = null,
onUnarchiveClick: (() -> Unit)? = null
) {
Card(
modifier = Modifier.fillMaxWidth(),
@@ -356,6 +358,49 @@ fun TaskCard(
}
}
}
// Archive/Unarchive button row
if (task.archived) {
if (onUnarchiveClick != null) {
Spacer(modifier = Modifier.height(8.dp))
OutlinedButton(
onClick = onUnarchiveClick,
modifier = Modifier.fillMaxWidth(),
shape = RoundedCornerShape(12.dp),
colors = ButtonDefaults.outlinedButtonColors(
contentColor = MaterialTheme.colorScheme.primary
)
) {
Icon(
Icons.Default.Unarchive,
contentDescription = null,
modifier = Modifier.size(18.dp)
)
Spacer(modifier = Modifier.width(4.dp))
Text("Unarchive")
}
}
} else {
if (onArchiveClick != null) {
Spacer(modifier = Modifier.height(8.dp))
OutlinedButton(
onClick = onArchiveClick,
modifier = Modifier.fillMaxWidth(),
shape = RoundedCornerShape(12.dp),
colors = ButtonDefaults.outlinedButtonColors(
contentColor = MaterialTheme.colorScheme.outline
)
) {
Icon(
Icons.Default.Archive,
contentDescription = null,
modifier = Modifier.size(18.dp)
)
Spacer(modifier = Modifier.width(4.dp))
Text("Archive")
}
}
}
}
}
}

View File

@@ -33,7 +33,9 @@ fun TaskKanbanView(
onEditTask: (TaskDetail) -> Unit,
onCancelTask: ((TaskDetail) -> Unit)?,
onUncancelTask: ((TaskDetail) -> Unit)?,
onMarkInProgress: ((TaskDetail) -> Unit)?
onMarkInProgress: ((TaskDetail) -> Unit)?,
onArchiveTask: ((TaskDetail) -> Unit)?,
onUnarchiveTask: ((TaskDetail) -> Unit)?
) {
val pagerState = rememberPagerState(pageCount = { 4 })
@@ -55,7 +57,9 @@ fun TaskKanbanView(
onEditTask = onEditTask,
onCancelTask = onCancelTask,
onUncancelTask = onUncancelTask,
onMarkInProgress = onMarkInProgress
onMarkInProgress = onMarkInProgress,
onArchiveTask = onArchiveTask,
onUnarchiveTask = null
)
1 -> TaskColumn(
title = "In Progress",
@@ -67,7 +71,9 @@ fun TaskKanbanView(
onEditTask = onEditTask,
onCancelTask = onCancelTask,
onUncancelTask = onUncancelTask,
onMarkInProgress = null
onMarkInProgress = null,
onArchiveTask = onArchiveTask,
onUnarchiveTask = null
)
2 -> TaskColumn(
title = "Done",
@@ -79,7 +85,9 @@ fun TaskKanbanView(
onEditTask = onEditTask,
onCancelTask = null,
onUncancelTask = null,
onMarkInProgress = null
onMarkInProgress = null,
onArchiveTask = onArchiveTask,
onUnarchiveTask = null
)
3 -> TaskColumn(
title = "Archived",
@@ -91,7 +99,9 @@ fun TaskKanbanView(
onEditTask = onEditTask,
onCancelTask = null,
onUncancelTask = null,
onMarkInProgress = null
onMarkInProgress = null,
onArchiveTask = null,
onUnarchiveTask = onUnarchiveTask
)
}
}
@@ -109,7 +119,9 @@ private fun TaskColumn(
onEditTask: (TaskDetail) -> Unit,
onCancelTask: ((TaskDetail) -> Unit)?,
onUncancelTask: ((TaskDetail) -> Unit)?,
onMarkInProgress: ((TaskDetail) -> Unit)?
onMarkInProgress: ((TaskDetail) -> Unit)?,
onArchiveTask: ((TaskDetail) -> Unit)?,
onUnarchiveTask: ((TaskDetail) -> Unit)?
) {
Column(
modifier = Modifier
@@ -202,6 +214,12 @@ private fun TaskColumn(
} else null,
onMarkInProgressClick = if (onMarkInProgress != null) {
{ onMarkInProgress(task) }
} else null,
onArchiveClick = if (onArchiveTask != null) {
{ onArchiveTask(task) }
} else null,
onUnarchiveClick = if (onUnarchiveTask != null) {
{ onUnarchiveTask(task) }
} else null
)
}

View File

@@ -247,6 +247,20 @@ fun AllTasksScreen(
viewModel.loadTasks()
}
}
},
onArchiveTask = { task ->
viewModel.archiveTask(task.id) { success ->
if (success) {
viewModel.loadTasks()
}
}
},
onUnarchiveTask = { task ->
viewModel.unarchiveTask(task.id) { success ->
if (success) {
viewModel.loadTasks()
}
}
}
)
}

View File

@@ -456,6 +456,20 @@ fun ResidenceDetailScreen(
residenceViewModel.loadResidenceTasks(residenceId)
}
}
},
onArchiveTask = { task ->
taskViewModel.archiveTask(task.id) { success ->
if (success) {
residenceViewModel.loadResidenceTasks(residenceId)
}
}
},
onUnarchiveTask = { task ->
taskViewModel.unarchiveTask(task.id) { success ->
if (success) {
residenceViewModel.loadResidenceTasks(residenceId)
}
}
}
)
}

View File

@@ -94,4 +94,46 @@ class TaskViewModel : ViewModel() {
}
}
}
fun archiveTask(taskId: Int, onComplete: (Boolean) -> Unit) {
viewModelScope.launch {
val token = TokenStorage.getToken()
if (token != null) {
when (val result = taskApi.archiveTask(token, taskId)) {
is ApiResult.Success -> {
onComplete(true)
}
is ApiResult.Error -> {
onComplete(false)
}
else -> {
onComplete(false)
}
}
} else {
onComplete(false)
}
}
}
fun unarchiveTask(taskId: Int, onComplete: (Boolean) -> Unit) {
viewModelScope.launch {
val token = TokenStorage.getToken()
if (token != null) {
when (val result = taskApi.unarchiveTask(token, taskId)) {
is ApiResult.Success -> {
onComplete(true)
}
is ApiResult.Error -> {
onComplete(false)
}
else -> {
onComplete(false)
}
}
} else {
onComplete(false)
}
}
}
}