diff --git a/Ledger/app/src/main/java/at/xaxa/ledger/data/EntryRepository.kt b/Ledger/app/src/main/java/at/xaxa/ledger/data/EntryRepository.kt index 670d200..9794243 100644 --- a/Ledger/app/src/main/java/at/xaxa/ledger/data/EntryRepository.kt +++ b/Ledger/app/src/main/java/at/xaxa/ledger/data/EntryRepository.kt @@ -34,7 +34,6 @@ class EntryRepository(private val ledgerDao: LedgerDao){ ) } suspend fun findCategoryById(id: Int): CategoryEntity { - Log.w("xaver", id.toString()) val category = ledgerDao.findCategoryById(id) return CategoryEntity( category._id, category.categoryName, category.icon diff --git a/Ledger/app/src/main/java/at/xaxa/ledger/ui/category/add/AddCategoryUI.kt b/Ledger/app/src/main/java/at/xaxa/ledger/ui/category/add/AddCategoryUI.kt index ef97d0a..76f2649 100644 --- a/Ledger/app/src/main/java/at/xaxa/ledger/ui/category/add/AddCategoryUI.kt +++ b/Ledger/app/src/main/java/at/xaxa/ledger/ui/category/add/AddCategoryUI.kt @@ -46,59 +46,62 @@ fun AddCategory( .padding(16.dp, 0.dp), horizontalAlignment = Alignment.CenterHorizontally ) { - OutlinedTextField( - value = name, - onValueChange = { name = it }, - label = { Text("Category Name") }, - modifier = Modifier - .fillMaxWidth() - ) - - ExposedDropdownMenuBox( - expanded = expanded, - onExpandedChange = { expanded = it } + Column( + Modifier.weight(1f) ) { OutlinedTextField( - value = iconNames[selectedIconIndex], // Show selected icon name - onValueChange = {}, - label = { Text("Icon") }, - readOnly = true, - leadingIcon = { - Icon( - imageVector = icons[selectedIconIndex], // Replace with your desired icon - contentDescription = "Leading Icon" - ) - }, - trailingIcon = { - ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) - }, + value = name, + onValueChange = { name = it }, + label = { Text("Category Name") }, modifier = Modifier - .menuAnchor() .fillMaxWidth() ) - ExposedDropdownMenu( + ExposedDropdownMenuBox( expanded = expanded, - onDismissRequest = { expanded = false } + onExpandedChange = { expanded = it } ) { - icons.forEachIndexed { index, icon -> - DropdownMenuItem( - text = { Text(text = iconNames[index]) }, // Use name from iconNames - onClick = { - selectedIconIndex = index // Update selected index - expanded = false - }, - leadingIcon = { - androidx.compose.material3.Icon( - imageVector = icon, - contentDescription = iconNames[index] - ) - } - ) + OutlinedTextField( + value = iconNames[selectedIconIndex], // Show selected icon name + onValueChange = {}, + label = { Text("Icon") }, + readOnly = true, + leadingIcon = { + Icon( + imageVector = icons[selectedIconIndex], // Replace with your desired icon + contentDescription = "Leading Icon" + ) + }, + trailingIcon = { + ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) + }, + modifier = Modifier + .menuAnchor() + .fillMaxWidth() + ) + + ExposedDropdownMenu( + expanded = expanded, + onDismissRequest = { expanded = false } + ) { + icons.forEachIndexed { index, icon -> + DropdownMenuItem( + text = { Text(text = iconNames[index]) }, // Use name from iconNames + onClick = { + selectedIconIndex = index // Update selected index + expanded = false + }, + leadingIcon = { + androidx.compose.material3.Icon( + imageVector = icon, + contentDescription = iconNames[index] + ) + } + ) + } } } } - Box( modifier = Modifier .fillMaxWidth(), diff --git a/Ledger/app/src/main/java/at/xaxa/ledger/ui/category/edit/EditCategory.kt b/Ledger/app/src/main/java/at/xaxa/ledger/ui/category/edit/EditCategory.kt index 646e938..9253ad7 100644 --- a/Ledger/app/src/main/java/at/xaxa/ledger/ui/category/edit/EditCategory.kt +++ b/Ledger/app/src/main/java/at/xaxa/ledger/ui/category/edit/EditCategory.kt @@ -6,6 +6,9 @@ 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.material.icons.Icons +import androidx.compose.material.icons.filled.Info +import androidx.compose.material3.AlertDialog import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExposedDropdownMenuBox @@ -13,6 +16,7 @@ import androidx.compose.material3.ExposedDropdownMenuDefaults import androidx.compose.material3.Icon import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text +import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue @@ -40,22 +44,55 @@ fun EditCategory( editCategoryViewModel: EditCategoryViewModel = viewModel(factory = AppViewModelProvider.Factory) ) { val category = editCategoryViewModel.categoryUi.category - var expanded by remember { mutableStateOf(false) } // Controls dropdown visibility - var selectedIconIndex by remember { mutableIntStateOf(category.icon) } // Store index of selected icon + var showError by remember { mutableStateOf(editCategoryViewModel.entryUIState) } + var deleteStarted by remember { mutableStateOf(false) } + var expanded by remember { mutableStateOf(false) } + var selectedIconIndex by remember { mutableIntStateOf(category.icon) } LaunchedEffect(category) { selectedIconIndex = category.icon } - /* - val categories by categoryViewModel.categoryUiState.categories.collectAsState(initial = emptyList()) - val category = categoryViewModel.categoryUi.category - var expanded by remember { mutableStateOf(false) }*/ + LaunchedEffect(deleteStarted) { + if (deleteStarted) { + editCategoryViewModel.findEntryByCategoryId() + showError = editCategoryViewModel.entryUIState + } + } + if (deleteStarted && showError) { + AlertDialog( + icon = { + Icon(Icons.Default.Info, contentDescription = "Info Icon") + }, + title = { + Text(text = "Category in use") + }, + text = { + Text(text = "You are trying to delete a Category which is still in use. Please delete or change the Category in your entries which are in use.") + }, + onDismissRequest = { + deleteStarted = false + showError = false + }, + confirmButton = { + TextButton( + onClick = { + deleteStarted = false + showError = false + } + ) { + Text("Okay") + } + } + ) + }else if(deleteStarted && !showError){ + Log.w("xaver", "delete") + editCategoryViewModel.deleteEntry() + onButtonClick() + } - Log.w("vm", category.categoryName.toString()) - Log.w("vm", category.icon.toString()) - Log.w("vm", selectedIconIndex.toString()) + Log.w("xaver", "deleteStarted $deleteStarted : showError $showError" ) Column( modifier = modifier @@ -79,13 +116,13 @@ fun EditCategory( onExpandedChange = { expanded = it } ) { OutlinedTextField( - value = iconNames[selectedIconIndex], // Show selected icon name + value = iconNames[selectedIconIndex], onValueChange = {}, label = { Text("Icon") }, readOnly = true, leadingIcon = { Icon( - imageVector = icons[selectedIconIndex], // Replace with your desired icon + imageVector = icons[selectedIconIndex], contentDescription = "Leading Icon" ) }, @@ -103,10 +140,9 @@ fun EditCategory( ) { icons.forEachIndexed { index, icon -> DropdownMenuItem( - text = { Text(text = iconNames[index]) }, // Use name from iconNames + text = { Text(text = iconNames[index]) }, onClick = { - selectedIconIndex = index // Update selected index - + selectedIconIndex = index editCategoryViewModel.updateCategory(category.copy(icon = index)) expanded = false }, @@ -124,23 +160,21 @@ fun EditCategory( Column( modifier = Modifier.fillMaxWidth(), - horizontalAlignment = Alignment.CenterHorizontally // Center buttons horizontally + horizontalAlignment = Alignment.CenterHorizontally ) { ButtonDanger( modifier = Modifier .padding(bottom = 8.dp), "Delete Category", onClick = { - editCategoryViewModel.deleteEntry() - onButtonClick() + deleteStarted = true + editCategoryViewModel.findEntryByCategoryId() } ) ButtonSuccess( modifier = Modifier, "Save Category", onClick = { - editCategoryViewModel.findEntryByCategoryId() - Log.d("dsdsssee", editCategoryViewModel.entryUIState.toString()) editCategoryViewModel.saveCategory() onButtonClick() } diff --git a/Ledger/app/src/main/java/at/xaxa/ledger/ui/category/edit/EditCategoryViewModel.kt b/Ledger/app/src/main/java/at/xaxa/ledger/ui/category/edit/EditCategoryViewModel.kt index 78fa024..171c4f4 100644 --- a/Ledger/app/src/main/java/at/xaxa/ledger/ui/category/edit/EditCategoryViewModel.kt +++ b/Ledger/app/src/main/java/at/xaxa/ledger/ui/category/edit/EditCategoryViewModel.kt @@ -29,7 +29,7 @@ class EditCategoryViewModel(private val savedStateHandle: SavedStateHandle, priv var categoryUi by mutableStateOf(CategoryUIState()) private set - var entryUIState by mutableStateOf(0) + var entryUIState by mutableStateOf(false) @@ -71,10 +71,10 @@ class EditCategoryViewModel(private val savedStateHandle: SavedStateHandle, priv val fetchedEntries = withContext(Dispatchers.IO) { entryRepository.findEntryByCategoryId(categoryId) } - entryUIState = fetchedEntries - Log.w("ASASDADS", categoryId.toString()) - Log.w("ASASDADS", fetchedEntries.toString()) + if(fetchedEntries>0){ + entryUIState = true + } } //print("ASASDADS$categoryId") } diff --git a/Ledger/app/src/main/java/at/xaxa/ledger/ui/category/overview/OverviewCategoryViewModel.kt b/Ledger/app/src/main/java/at/xaxa/ledger/ui/category/overview/OverviewCategoryViewModel.kt index 150fa48..5272fa7 100644 --- a/Ledger/app/src/main/java/at/xaxa/ledger/ui/category/overview/OverviewCategoryViewModel.kt +++ b/Ledger/app/src/main/java/at/xaxa/ledger/ui/category/overview/OverviewCategoryViewModel.kt @@ -25,7 +25,6 @@ class OverviewCategoryViewModel( private val repository: EntryRepository ) : ViewModel() { var categoryUiState by mutableStateOf(CategoryListUIState()) - var categoryUi by mutableStateOf(CategoryUIState()) private set init { diff --git a/Ledger/app/src/main/java/at/xaxa/ledger/ui/entry/add/AddUI.kt b/Ledger/app/src/main/java/at/xaxa/ledger/ui/entry/add/AddUI.kt index 2e70593..3c45955 100644 --- a/Ledger/app/src/main/java/at/xaxa/ledger/ui/entry/add/AddUI.kt +++ b/Ledger/app/src/main/java/at/xaxa/ledger/ui/entry/add/AddUI.kt @@ -1,10 +1,14 @@ package at.xaxa.ledger.ui.entry.add +import android.util.Log import androidx.compose.foundation.layout.Box 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.material.icons.Icons +import androidx.compose.material.icons.filled.Info +import androidx.compose.material3.AlertDialog import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExposedDropdownMenuBox @@ -12,6 +16,7 @@ import androidx.compose.material3.ExposedDropdownMenuDefaults import androidx.compose.material3.Icon import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text +import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue @@ -30,6 +35,7 @@ import at.xaxa.ledger.ui.ButtonSuccess import at.xaxa.ledger.ui.DatePickerDocked import at.xaxa.ledger.ui.category.iconNames import at.xaxa.ledger.ui.category.icons +import kotlin.math.log @OptIn(ExperimentalMaterial3Api::class) @Composable @@ -39,12 +45,41 @@ fun Add( addViewModel: AddViewModel = viewModel(factory = AppViewModelProvider.Factory) ) { var name by remember { mutableStateOf("") } + var categories = addViewModel.categoryUiState.categories.collectAsState(emptyList()).value var spending by remember { mutableStateOf("") } - var selectedDate by remember { mutableLongStateOf(0) } + var selectedDate by remember { mutableLongStateOf(System.currentTimeMillis()) } var expanded by remember { mutableStateOf(false) } var selectedIconIndex by remember { mutableStateOf(0) } // Store index of selected icon + var selectedCategoryName by remember { mutableStateOf("") } // Store index of selected icon var selectedCategory by remember { mutableIntStateOf(-1) } + var parsingError by remember { mutableStateOf(false) } + + if (parsingError) { + AlertDialog( + icon = { + Icon(Icons.Default.Info, contentDescription = "Info Icon") + }, + title = { + Text(text = "Parsing error") + }, + text = { + Text(text = "One or more fields contain invalid input. Please review your entries and try again.") + }, + onDismissRequest = { + parsingError = false + }, + confirmButton = { + TextButton( + onClick = { + parsingError = false + } + ) { + Text("Okay") + } + } + ) + } Column( modifier = modifier @@ -76,9 +111,9 @@ fun Add( onExpandedChange = { expanded = it } ) { OutlinedTextField( - value = iconNames[selectedIconIndex], // Show selected icon name + value = selectedCategoryName, // Show selected icon name onValueChange = {}, - label = { Text("Icon") }, + label = { Text("Category") }, readOnly = true, leadingIcon = { Icon( @@ -98,17 +133,19 @@ fun Add( expanded = expanded, onDismissRequest = { expanded = false } ) { - icons.forEachIndexed { index, icon -> + categories.forEachIndexed { index, category -> DropdownMenuItem( - text = { Text(text = iconNames[index]) }, // Use name from iconNames + text = { Text(text = category.categoryName) }, // Use name from iconNames onClick = { - selectedIconIndex = index // Update selected index + selectedIconIndex = category.icon // Update selected index expanded = false + selectedCategoryName = category.categoryName + selectedCategory = category._id }, leadingIcon = { androidx.compose.material3.Icon( - imageVector = icon, - contentDescription = iconNames[index] + imageVector = icons[category.icon], + contentDescription = iconNames[category.icon] ) } ) @@ -116,8 +153,8 @@ fun Add( } } - DatePickerDocked{ - dateMilis -> selectedDate = dateMilis + DatePickerDocked { dateMilis -> + selectedDate = dateMilis } } @@ -130,7 +167,12 @@ fun Add( modifier = Modifier, "Add Transaction", onClick = { - if (name.isNotBlank() && spending.toFloat() != 0f && selectedDate != 0L && selectedCategory != -1) { + val isValidSpending = spending.matches(Regex("^[+-]?\\d*(\\.\\d+)?$")) + Log.w("xaxaxa", name.isNotBlank().toString() ) + Log.w("xaxaxa", isValidSpending.toString() ) + Log.w("xaxaxa", (selectedDate != 0L).toString() ) + Log.w("xaxaxa", (selectedCategory != -1).toString() ) + if (name.isNotBlank() && isValidSpending && selectedDate != 0L && selectedCategory != -1) { val newEntry = Entry( id = 0, name = name, @@ -140,6 +182,8 @@ fun Add( ) addViewModel.addEntryToDB(newEntry) onCardClick() + } else { + parsingError = true; } } )