feat(connector): add layout for action screen

This commit is contained in:
Anthony Berg 2024-04-25 18:18:51 +01:00
parent ad70ec5add
commit 87350ff1ec
2 changed files with 120 additions and 27 deletions

View File

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960"
android:tint="?attr/colorControlNormal">
<path
android:fillColor="#FFFFFF"
android:pathData="M840,280L840,760Q840,793 816.5,816.5Q793,840 760,840L200,840Q167,840 143.5,816.5Q120,793 120,760L120,200Q120,167 143.5,143.5Q167,120 200,120L680,120L840,280ZM760,314L646,200L200,200Q200,200 200,200Q200,200 200,200L200,760Q200,760 200,760Q200,760 200,760L760,760Q760,760 760,760Q760,760 760,760L760,314ZM480,720Q530,720 565,685Q600,650 600,600Q600,550 565,515Q530,480 480,480Q430,480 395,515Q360,550 360,600Q360,650 395,685Q430,720 480,720ZM240,400L600,400L600,240L240,240L240,400ZM200,314L200,760Q200,760 200,760Q200,760 200,760L200,760Q200,760 200,760Q200,760 200,760L200,200Q200,200 200,200Q200,200 200,200L200,200L200,314Z"/>
</vector>

View File

@ -1,28 +1,42 @@
package tab.procedure package tab.procedure
import InterfaceState import InterfaceState
import androidx.compose.foundation.VerticalScrollbar
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.rememberScrollbarAdapter
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.outlined.ArrowBack import androidx.compose.material.icons.automirrored.outlined.ArrowBack
import androidx.compose.material.icons.outlined.Add import androidx.compose.material.icons.outlined.Add
import androidx.compose.material3.* import androidx.compose.material3.*
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateListOf
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import cafe.adriel.voyager.core.screen.Screen import cafe.adriel.voyager.core.screen.Screen
import cafe.adriel.voyager.navigator.LocalNavigator import cafe.adriel.voyager.navigator.LocalNavigator
import cafe.adriel.voyager.navigator.Navigator
import cafe.adriel.voyager.navigator.currentOrThrow import cafe.adriel.voyager.navigator.currentOrThrow
import connector.composeapp.generated.resources.Res
import connector.composeapp.generated.resources.save_24px
import org.jetbrains.compose.resources.ExperimentalResourceApi
import org.jetbrains.compose.resources.painterResource
import org.koin.compose.koinInject import org.koin.compose.koinInject
class Actions : Screen { class Actions : Screen {
private val columnPadding = 24.dp
private val itemPadding = 24.dp
private var inputs = mutableStateListOf(1)
@Composable @Composable
override fun Content() { override fun Content() {
val navigator = LocalNavigator.currentOrThrow val navigator = LocalNavigator.currentOrThrow
val viewModel = koinInject<InterfaceState>() val viewModel = koinInject<InterfaceState>()
val columnPadding = 24.dp val state = rememberLazyListState(0)
// Checks if a project has been selected before viewing contents // Checks if a project has been selected before viewing contents
if (viewModel.procedureId == null) { if (viewModel.procedureId == null) {
@ -45,37 +59,106 @@ class Actions : Screen {
modifier = Modifier modifier = Modifier
.fillMaxHeight() .fillMaxHeight()
.fillMaxWidth() .fillMaxWidth()
.verticalScroll(rememberScrollState())
.padding(top = columnPadding, bottom = columnPadding), .padding(top = columnPadding, bottom = columnPadding),
horizontalAlignment = Alignment.CenterHorizontally, horizontalAlignment = Alignment.CenterHorizontally,
) {
Column(
Modifier.fillMaxWidth(0.7F),
verticalArrangement = Arrangement.spacedBy(24.dp)
) {
Text(
text = "Edit Actions",
style = MaterialTheme.typography.headlineSmall
)
Button( ) {
contentPadding = ButtonDefaults.ButtonWithIconContentPadding, Box(
onClick = { modifier = Modifier.fillMaxWidth(0.7F),
// TODO make checks ) {
navigator.pop() LazyColumn(
viewModel.procedureId = null state = state,
} verticalArrangement = Arrangement.spacedBy(itemPadding)
) { ) {
Icon(Icons.Outlined.Add, "Create Procedure", modifier = Modifier.size(18.dp))
Spacer(Modifier.size(ButtonDefaults.IconSpacing)) item {
Text( Header()
"Create", }
style = MaterialTheme.typography.labelLarge,
color = MaterialTheme.colorScheme.onPrimary items(
) items = inputs,
key = { input -> input }
) { item ->
ActionItem(item)
}
item {
Footer(navigator, viewModel)
}
} }
VerticalScrollbar(
modifier = Modifier
.align(Alignment.CenterEnd)
.fillMaxHeight(),
adapter = rememberScrollbarAdapter(
scrollState = state,
),
)
} }
} }
} }
} }
@Composable
private fun Header() {
Text(
text = "Edit Actions",
style = MaterialTheme.typography.headlineSmall
)
}
@Composable
private fun ActionItem(item: Int) {
Column (
verticalArrangement = Arrangement.spacedBy(itemPadding)
) {
Text(text = "Action $item")
HorizontalDivider()
}
}
@OptIn(ExperimentalResourceApi::class)
@Composable
private fun Footer(navigator: Navigator, viewModel: InterfaceState) {
Row (
Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceBetween
) {
// Add Step
FilledTonalButton(
contentPadding = ButtonDefaults.ButtonWithIconContentPadding,
onClick = {
// TODO make this a proper data array for each item in checklist
inputs += inputs.last() + 1
}
) {
Icon(Icons.Outlined.Add, "Add", modifier = Modifier.size(18.dp))
Spacer(Modifier.size(ButtonDefaults.IconSpacing))
Text(
"Add Step",
style = MaterialTheme.typography.labelLarge,
)
}
// Save
Button(
contentPadding = ButtonDefaults.ButtonWithIconContentPadding,
onClick = {
// TODO make checks
// TODO save to database
navigator.pop()
viewModel.procedureId = null
}
) {
Icon(painterResource(Res.drawable.save_24px), "Save", modifier = Modifier.size(18.dp))
Spacer(Modifier.size(ButtonDefaults.IconSpacing))
Text(
"Save",
style = MaterialTheme.typography.labelLarge,
)
}
}
}
} }