mirror of
https://github.com/smyalygames/checklist-tester.git
synced 2025-07-07 13:51:01 +02:00
feat(connector): add selecting projects
This commit is contained in:
parent
72412b1f80
commit
4d99e7cc2d
@ -17,7 +17,6 @@ import cafe.adriel.voyager.navigator.tab.Tab
|
||||
import cafe.adriel.voyager.navigator.tab.TabNavigator
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.launch
|
||||
import org.jetbrains.compose.resources.ExperimentalResourceApi
|
||||
import org.jetbrains.compose.ui.tooling.preview.Preview
|
||||
import org.koin.compose.KoinContext
|
||||
import tab.About
|
||||
@ -41,7 +40,7 @@ fun AppScaffold() {
|
||||
val drawerState = rememberDrawerState(initialValue = DrawerValue.Closed)
|
||||
val scope = rememberCoroutineScope()
|
||||
|
||||
TabNavigator(Projects()) {
|
||||
TabNavigator(Projects) {
|
||||
Scaffold(
|
||||
topBar = {
|
||||
TopBar(drawerState, scope)
|
||||
@ -108,7 +107,6 @@ fun TopBar(
|
||||
/**
|
||||
* Navigation drawer from the left side
|
||||
*/
|
||||
@OptIn(ExperimentalResourceApi::class)
|
||||
@Composable
|
||||
fun NavigationDrawer(
|
||||
drawerState: DrawerState,
|
||||
@ -120,11 +118,11 @@ fun NavigationDrawer(
|
||||
ModalDrawerSheet {
|
||||
Column(modifier = Modifier.verticalScroll(rememberScrollState()) ) {
|
||||
Text("Project Name...", modifier = Modifier.padding(16.dp))
|
||||
TabNavigationItem(Projects())
|
||||
TabNavigationItem(Projects)
|
||||
HorizontalDivider()
|
||||
|
||||
Text("Tester", modifier = Modifier.padding(16.dp))
|
||||
TabNavigationItem(Procedures())
|
||||
TabNavigationItem(Procedures)
|
||||
TabNavigationItem(SimulatorTest())
|
||||
TabNavigationItem(TestResults())
|
||||
HorizontalDivider()
|
||||
|
@ -1,4 +1,9 @@
|
||||
class InterfaceState {
|
||||
import org.koin.core.component.KoinComponent
|
||||
|
||||
class InterfaceState : KoinComponent {
|
||||
var simConnection: Boolean = false
|
||||
var projectId: Int? = null
|
||||
val projectSelected: Boolean
|
||||
get() = projectId != null
|
||||
|
||||
}
|
||||
|
@ -32,6 +32,6 @@ fun viewModelModule() = module {
|
||||
}
|
||||
|
||||
single<ProcedureScreenModel> {
|
||||
ProcedureScreenModel(db = get())
|
||||
ProcedureScreenModel(db = get(), interfaceState = get())
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
package tab.procedure
|
||||
|
||||
import InterfaceState
|
||||
import cafe.adriel.voyager.core.model.StateScreenModel
|
||||
import cafe.adriel.voyager.core.model.screenModelScope
|
||||
import io.anthonyberg.connector.shared.ProcedureTransaction
|
||||
@ -7,15 +8,20 @@ import io.anthonyberg.connector.shared.entity.Procedure
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
class ProcedureScreenModel (
|
||||
private val db: ProcedureTransaction
|
||||
private val db: ProcedureTransaction,
|
||||
private val interfaceState: InterfaceState
|
||||
) : StateScreenModel<ProcedureState>(ProcedureState.Loading) {
|
||||
|
||||
fun procedureExists() {
|
||||
screenModelScope.launch {
|
||||
val exists = db.proceduresExist()
|
||||
mutableState.value = ProcedureState.Loading
|
||||
|
||||
val projectId = interfaceState.projectId ?: return@launch
|
||||
|
||||
val exists = db.proceduresExist(projectId)
|
||||
|
||||
if (exists) {
|
||||
val procedures = getProcedures()
|
||||
val procedures = getProcedures(projectId)
|
||||
mutableState.value = ProcedureState.Result(procedures = procedures)
|
||||
} else {
|
||||
mutableState.value = ProcedureState.Init
|
||||
@ -23,8 +29,8 @@ class ProcedureScreenModel (
|
||||
}
|
||||
}
|
||||
|
||||
private fun getProcedures(): List<Procedure> {
|
||||
val procedures = db.getProcedures()
|
||||
private fun getProcedures(projectId: Int): List<Procedure> {
|
||||
val procedures = db.getProcedures(projectId)
|
||||
|
||||
return procedures
|
||||
}
|
||||
@ -37,11 +43,13 @@ class ProcedureScreenModel (
|
||||
screenModelScope.launch {
|
||||
mutableState.value = ProcedureState.Loading
|
||||
|
||||
val projectId = interfaceState.projectId ?: return@launch
|
||||
|
||||
// Add procedure to the database
|
||||
db.createProcedure(procedureName, procedureType, procedureDescription)
|
||||
db.createProcedure(projectId, procedureName, procedureType, procedureDescription)
|
||||
|
||||
// Load new procedures
|
||||
val procedures = getProcedures()
|
||||
val procedures = getProcedures(projectId)
|
||||
mutableState.value = ProcedureState.Result(procedures)
|
||||
}
|
||||
|
||||
|
@ -10,7 +10,9 @@ import cafe.adriel.voyager.navigator.Navigator
|
||||
import cafe.adriel.voyager.navigator.tab.Tab
|
||||
import cafe.adriel.voyager.navigator.tab.TabOptions
|
||||
|
||||
class Procedures : Tab {
|
||||
object Procedures : Tab {
|
||||
private fun readResolve(): Any = Procedures
|
||||
|
||||
override val options: TabOptions
|
||||
@Composable
|
||||
get() {
|
||||
|
@ -1,5 +1,6 @@
|
||||
package tab.project
|
||||
|
||||
import InterfaceState
|
||||
import androidx.compose.foundation.VerticalScrollbar
|
||||
import androidx.compose.foundation.clickable
|
||||
import androidx.compose.foundation.layout.Box
|
||||
@ -20,14 +21,21 @@ import androidx.compose.ui.Modifier
|
||||
import cafe.adriel.voyager.core.screen.Screen
|
||||
import cafe.adriel.voyager.navigator.LocalNavigator
|
||||
import cafe.adriel.voyager.navigator.currentOrThrow
|
||||
import cafe.adriel.voyager.navigator.tab.LocalTabNavigator
|
||||
import cafe.adriel.voyager.navigator.tab.TabNavigator
|
||||
import io.anthonyberg.connector.shared.entity.Project
|
||||
import org.koin.compose.koinInject
|
||||
import tab.procedure.Procedures
|
||||
|
||||
class ListProjects(private val projects: List<Project>) : Screen {
|
||||
@Composable
|
||||
override fun Content() {
|
||||
val navigator = LocalNavigator.currentOrThrow
|
||||
val tabNavigator = LocalTabNavigator.current
|
||||
val state = rememberLazyListState(0)
|
||||
|
||||
val viewModel = koinInject<InterfaceState>()
|
||||
|
||||
Scaffold (
|
||||
floatingActionButton = {
|
||||
ExtendedFloatingActionButton(
|
||||
@ -48,7 +56,7 @@ class ListProjects(private val projects: List<Project>) : Screen {
|
||||
) {
|
||||
LazyColumn(state = state) {
|
||||
items(projects) { project ->
|
||||
projectItem(project)
|
||||
projectItem(project, viewModel, tabNavigator)
|
||||
}
|
||||
}
|
||||
VerticalScrollbar(
|
||||
@ -66,13 +74,16 @@ class ListProjects(private val projects: List<Project>) : Screen {
|
||||
|
||||
|
||||
@Composable
|
||||
private fun projectItem(project: Project) {
|
||||
private fun projectItem(project: Project, viewModel: InterfaceState, tabNavigator: TabNavigator) {
|
||||
ListItem(
|
||||
modifier = Modifier
|
||||
.clickable(
|
||||
enabled = true,
|
||||
onClick = {
|
||||
// TODO add loading project
|
||||
viewModel.projectId = project.id
|
||||
|
||||
// Go to procedures page once project has been selected
|
||||
tabNavigator.current = Procedures
|
||||
}
|
||||
),
|
||||
overlineContent = { Text(project.aircraftType) },
|
||||
|
@ -11,7 +11,9 @@ import connector.composeapp.generated.resources.folder_24px
|
||||
import org.jetbrains.compose.resources.ExperimentalResourceApi
|
||||
import org.jetbrains.compose.resources.painterResource
|
||||
|
||||
class Projects : Tab {
|
||||
object Projects : Tab {
|
||||
private fun readResolve(): Any = Projects
|
||||
|
||||
@OptIn(ExperimentalResourceApi::class)
|
||||
override val options: TabOptions
|
||||
@Composable
|
||||
|
@ -12,8 +12,8 @@ class ProjectsContent : Screen {
|
||||
val state by screenModel.state.collectAsState()
|
||||
|
||||
when (val s = state) {
|
||||
is ProjectState.Init -> NoProjects().Content()
|
||||
is ProjectState.Loading -> LoadingScreen("Projects").Content()
|
||||
is ProjectState.Init -> NoProjects().Content()
|
||||
is ProjectState.Result -> ListProjects(s.projects).Content()
|
||||
}
|
||||
|
||||
|
@ -12,6 +12,8 @@ class ProjectsScreenModel (
|
||||
|
||||
fun projectExists() {
|
||||
screenModelScope.launch {
|
||||
mutableState.value = ProjectState.Loading
|
||||
|
||||
val exists = db.projectExists()
|
||||
|
||||
if (exists) {
|
||||
|
@ -15,13 +15,12 @@ class ProcedureTransaction (driverFactory: DriverFactory) {
|
||||
/**
|
||||
* Creates a procedure for a project
|
||||
*
|
||||
* @param projectId ID of the selected Project
|
||||
* @param name Name of the procedure
|
||||
* @param type Procedure type (e.g. Normal, Emergency)
|
||||
* @param description Description of what the procedure will do
|
||||
*/
|
||||
fun createProcedure(name: String, type: String, description: String) {
|
||||
// TODO add dynamic procedureId insertion
|
||||
val projectId = 1
|
||||
fun createProcedure(projectId: Int, name: String, type: String, description: String) {
|
||||
val currentTime = Clock.System.now().toString()
|
||||
|
||||
database.createProcedure(
|
||||
@ -36,11 +35,10 @@ class ProcedureTransaction (driverFactory: DriverFactory) {
|
||||
/**
|
||||
* Gets all procedures in current project
|
||||
*
|
||||
* @param projectId ID of the selected Project
|
||||
* @return List of [Procedure] in current project
|
||||
*/
|
||||
fun getProcedures(): List<Procedure> {
|
||||
// TODO add dynamic procedureId insertion
|
||||
val projectId = 1
|
||||
fun getProcedures(projectId: Int): List<Procedure> {
|
||||
|
||||
val procedures = database.getAllProcedures(projectId = projectId)
|
||||
|
||||
@ -62,24 +60,20 @@ class ProcedureTransaction (driverFactory: DriverFactory) {
|
||||
/**
|
||||
* Counts the amount of procedures that exist based on the current project
|
||||
*
|
||||
* @param projectId ID of current Project
|
||||
* @return Number of procedures in the database
|
||||
*/
|
||||
fun countProcedures(): Long {
|
||||
// TODO add dynamic procedureId insertion
|
||||
val projectId = 1
|
||||
|
||||
fun countProcedures(projectId: Int): Long {
|
||||
return database.countProcedures(projectId = projectId)
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if there are procedures on the database for the current project
|
||||
*
|
||||
* @param projectId ID of current Project
|
||||
* @return `true` if procedures exist for project
|
||||
*/
|
||||
fun proceduresExist(): Boolean {
|
||||
// TODO add dynamic procedureId insertion
|
||||
val projectId = 1
|
||||
|
||||
fun proceduresExist(projectId: Int): Boolean {
|
||||
return database.countProcedures(projectId = projectId) > 0
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user