124 lines
4.7 KiB
Kotlin
124 lines
4.7 KiB
Kotlin
|
|
package no.naiv.meddetsamme.ui
|
||
|
|
|
||
|
|
import androidx.compose.foundation.layout.Arrangement
|
||
|
|
import androidx.compose.foundation.layout.Column
|
||
|
|
import androidx.compose.foundation.layout.fillMaxSize
|
||
|
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||
|
|
import androidx.compose.foundation.layout.padding
|
||
|
|
import androidx.compose.foundation.rememberScrollState
|
||
|
|
import androidx.compose.foundation.verticalScroll
|
||
|
|
import androidx.compose.material3.AlertDialog
|
||
|
|
import androidx.compose.material3.Button
|
||
|
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
||
|
|
import androidx.compose.material3.Icon
|
||
|
|
import androidx.compose.material3.IconButton
|
||
|
|
import androidx.compose.material3.MaterialTheme
|
||
|
|
import androidx.compose.material3.Scaffold
|
||
|
|
import androidx.compose.material3.Text
|
||
|
|
import androidx.compose.material3.TextButton
|
||
|
|
import androidx.compose.material3.TopAppBar
|
||
|
|
import androidx.compose.runtime.Composable
|
||
|
|
import androidx.compose.runtime.LaunchedEffect
|
||
|
|
import androidx.compose.runtime.getValue
|
||
|
|
import androidx.compose.runtime.mutableStateOf
|
||
|
|
import androidx.compose.runtime.remember
|
||
|
|
import androidx.compose.runtime.rememberCoroutineScope
|
||
|
|
import androidx.compose.runtime.setValue
|
||
|
|
import androidx.compose.ui.Modifier
|
||
|
|
import androidx.compose.ui.platform.LocalContext
|
||
|
|
import androidx.compose.ui.res.painterResource
|
||
|
|
import androidx.compose.ui.unit.dp
|
||
|
|
import kotlinx.coroutines.launch
|
||
|
|
import no.naiv.meddetsamme.R
|
||
|
|
import no.naiv.meddetsamme.data.MedDatabase
|
||
|
|
|
||
|
|
@OptIn(ExperimentalMaterial3Api::class)
|
||
|
|
@Composable
|
||
|
|
fun ItemEditScreen(nav: Nav, itemId: Long?) {
|
||
|
|
val context = LocalContext.current
|
||
|
|
val db = remember { MedDatabase.get(context) }
|
||
|
|
val scope = rememberCoroutineScope()
|
||
|
|
val form = remember { ItemFormState() }
|
||
|
|
var confirmDelete by remember { mutableStateOf(false) }
|
||
|
|
var deleteBlocked by remember { mutableStateOf(false) }
|
||
|
|
|
||
|
|
LaunchedEffect(itemId) {
|
||
|
|
itemId?.let { id -> db.inventoryDao().getById(id)?.let(form::loadFrom) }
|
||
|
|
}
|
||
|
|
|
||
|
|
Scaffold(
|
||
|
|
topBar = {
|
||
|
|
TopAppBar(
|
||
|
|
title = { Text(if (itemId == null) "Ny lagervare" else "Rediger lagervare") },
|
||
|
|
navigationIcon = {
|
||
|
|
IconButton(onClick = { nav.pop() }) {
|
||
|
|
Icon(painterResource(R.drawable.ic_back), contentDescription = "Tilbake")
|
||
|
|
}
|
||
|
|
},
|
||
|
|
)
|
||
|
|
},
|
||
|
|
) { padding ->
|
||
|
|
Column(
|
||
|
|
modifier = Modifier
|
||
|
|
.fillMaxSize()
|
||
|
|
.padding(padding)
|
||
|
|
.padding(horizontal = 16.dp)
|
||
|
|
.verticalScroll(rememberScrollState()),
|
||
|
|
verticalArrangement = Arrangement.spacedBy(10.dp),
|
||
|
|
) {
|
||
|
|
InventoryItemForm(form)
|
||
|
|
|
||
|
|
Button(
|
||
|
|
onClick = {
|
||
|
|
val item = form.buildItem(itemId ?: 0) ?: return@Button
|
||
|
|
scope.launch {
|
||
|
|
if (itemId == null) db.inventoryDao().insert(item) else db.inventoryDao().update(item)
|
||
|
|
nav.pop()
|
||
|
|
}
|
||
|
|
},
|
||
|
|
modifier = Modifier.fillMaxWidth(),
|
||
|
|
) { Text("Lagre") }
|
||
|
|
|
||
|
|
if (itemId != null) {
|
||
|
|
TextButton(
|
||
|
|
onClick = {
|
||
|
|
scope.launch {
|
||
|
|
if (db.inventoryDao().referencingMedCount(itemId) > 0) {
|
||
|
|
deleteBlocked = true
|
||
|
|
} else {
|
||
|
|
confirmDelete = true
|
||
|
|
}
|
||
|
|
}
|
||
|
|
},
|
||
|
|
modifier = Modifier.fillMaxWidth(),
|
||
|
|
) { Text("Slett vare", color = MaterialTheme.colorScheme.error) }
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if (deleteBlocked) {
|
||
|
|
AlertDialog(
|
||
|
|
onDismissRequest = { deleteBlocked = false },
|
||
|
|
title = { Text("Varen er i bruk") },
|
||
|
|
text = { Text("En medisin bruker denne varen. Slett eller avslutt medisinen først.") },
|
||
|
|
confirmButton = { TextButton(onClick = { deleteBlocked = false }) { Text("OK") } },
|
||
|
|
)
|
||
|
|
}
|
||
|
|
if (confirmDelete) {
|
||
|
|
AlertDialog(
|
||
|
|
onDismissRequest = { confirmDelete = false },
|
||
|
|
title = { Text("Slette ${form.name.ifBlank { "varen" }}?") },
|
||
|
|
text = { Text("Dette kan ikke angres.") },
|
||
|
|
confirmButton = {
|
||
|
|
TextButton(onClick = {
|
||
|
|
confirmDelete = false
|
||
|
|
scope.launch {
|
||
|
|
itemId?.let { db.inventoryDao().delete(it) }
|
||
|
|
nav.pop()
|
||
|
|
}
|
||
|
|
}) { Text("Slett", color = MaterialTheme.colorScheme.error) }
|
||
|
|
},
|
||
|
|
dismissButton = { TextButton(onClick = { confirmDelete = false }) { Text("Avbryt") } },
|
||
|
|
)
|
||
|
|
}
|
||
|
|
}
|