From c508f080d3bcaa7ab6c0bdd17674e868103c9744 Mon Sep 17 00:00:00 2001 From: Florian Date: Wed, 15 Jan 2025 18:25:56 +0100 Subject: [PATCH 1/3] .asdd --- Ledger/app/src/main/java/at/xaxa/ledger/ui/LedgerUI.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Ledger/app/src/main/java/at/xaxa/ledger/ui/LedgerUI.kt b/Ledger/app/src/main/java/at/xaxa/ledger/ui/LedgerUI.kt index 1352370..13b0d55 100644 --- a/Ledger/app/src/main/java/at/xaxa/ledger/ui/LedgerUI.kt +++ b/Ledger/app/src/main/java/at/xaxa/ledger/ui/LedgerUI.kt @@ -168,8 +168,10 @@ fun CategoryCard( LayoutMediaText(modifier, name) Icon( - icons[iconid], - contentDescription = "$name Icon" + imageVector = icons[iconid], + contentDescription = "$name Icon", + modifier = Modifier.size(24.dp), + tint = Color.Black ) } } From 4f65e88b6381c70af5bbff0bcc4dc04919834d4b Mon Sep 17 00:00:00 2001 From: Florian Date: Wed, 15 Jan 2025 18:34:24 +0100 Subject: [PATCH 2/3] jjdjdj --- Ledger/app/src/main/java/at/xaxa/ledger/ui/LedgerUI.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/Ledger/app/src/main/java/at/xaxa/ledger/ui/LedgerUI.kt b/Ledger/app/src/main/java/at/xaxa/ledger/ui/LedgerUI.kt index 13b0d55..b08ea80 100644 --- a/Ledger/app/src/main/java/at/xaxa/ledger/ui/LedgerUI.kt +++ b/Ledger/app/src/main/java/at/xaxa/ledger/ui/LedgerUI.kt @@ -13,6 +13,7 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.requiredHeight +import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.wrapContentHeight import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.layout.wrapContentWidth From 14d7eb6a0fab7a6f56f2d8452e75b4d79f159586 Mon Sep 17 00:00:00 2001 From: Florian Date: Wed, 15 Jan 2025 20:03:45 +0100 Subject: [PATCH 3/3] editCategory almost works(Icon doesnt change) --- .../at/xaxa/ledger/data/EntryRepository.kt | 6 + .../at/xaxa/ledger/ui/AppViewModelProvider.kt | 4 + .../main/java/at/xaxa/ledger/ui/LedgerApp.kt | 4 +- .../at/xaxa/ledger/ui/add/AddViewModel.kt | 17 -- .../ledger/ui/category/edit/EditCategory.kt | 151 ++++++++++-------- .../ui/category/edit/EditCategoryViewModel.kt | 66 ++++++++ 6 files changed, 158 insertions(+), 90 deletions(-) create mode 100644 Ledger/app/src/main/java/at/xaxa/ledger/ui/category/edit/EditCategoryViewModel.kt 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 7604946..6e21244 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 @@ -43,9 +43,15 @@ class EntryRepository(private val ledgerDao: LedgerDao){ suspend fun updateEntry(entry: Entry) { ledgerDao.updateEntry(EntryEntity(entry.id, entry.name, entry.amount, entry.date, entry.categoryID)) } + suspend fun updateCategory(category: CategoryEntity) { + ledgerDao.updateCategory(CategoryEntity(category._id, category.categoryName, category.icon)) + } suspend fun deleteEntry(entry: Entry) { ledgerDao.deleteEntry(EntryEntity(_id = entry.id, entry.name, entry.amount, entry.date, entry.categoryID)) } + suspend fun deleteCategory(category: CategoryEntity) { + ledgerDao.deleteCategory(CategoryEntity(_id = category._id, category.categoryName, category.icon)) + } } \ No newline at end of file diff --git a/Ledger/app/src/main/java/at/xaxa/ledger/ui/AppViewModelProvider.kt b/Ledger/app/src/main/java/at/xaxa/ledger/ui/AppViewModelProvider.kt index 72b1cd7..1f35380 100644 --- a/Ledger/app/src/main/java/at/xaxa/ledger/ui/AppViewModelProvider.kt +++ b/Ledger/app/src/main/java/at/xaxa/ledger/ui/AppViewModelProvider.kt @@ -7,6 +7,7 @@ import androidx.lifecycle.viewmodel.viewModelFactory import at.xaxa.ledger.LedgerApplication import at.xaxa.ledger.ui.add.AddViewModel import at.xaxa.ledger.ui.category.CategoryViewModel +import at.xaxa.ledger.ui.category.edit.EditCategoryViewModel import at.xaxa.ledger.ui.edit.EditViewModel import at.xaxa.ledger.ui.home.HomeViewModel @@ -27,5 +28,8 @@ object AppViewModelProvider { initializer { CategoryViewModel(this.createSavedStateHandle(), (this[APPLICATION_KEY] as LedgerApplication).entryRepository) } + initializer { + EditCategoryViewModel(this.createSavedStateHandle(), (this[APPLICATION_KEY] as LedgerApplication).entryRepository) + } } } \ No newline at end of file diff --git a/Ledger/app/src/main/java/at/xaxa/ledger/ui/LedgerApp.kt b/Ledger/app/src/main/java/at/xaxa/ledger/ui/LedgerApp.kt index 81384f4..47767c7 100644 --- a/Ledger/app/src/main/java/at/xaxa/ledger/ui/LedgerApp.kt +++ b/Ledger/app/src/main/java/at/xaxa/ledger/ui/LedgerApp.kt @@ -81,7 +81,7 @@ fun LedgerApp(modifier: Modifier = Modifier){ backStackEntry -> EditCategory( modifier = Modifier, - onCardClick = { + onButtonClick = { navController.navigate("category") } ) @@ -89,7 +89,7 @@ fun LedgerApp(modifier: Modifier = Modifier){ composable(AppRoutes.AddCategory.route){ AddCategory( onButtonClick = { - navController.navigate("gome") + navController.navigate("home") } ) } diff --git a/Ledger/app/src/main/java/at/xaxa/ledger/ui/add/AddViewModel.kt b/Ledger/app/src/main/java/at/xaxa/ledger/ui/add/AddViewModel.kt index 4079f00..5066769 100644 --- a/Ledger/app/src/main/java/at/xaxa/ledger/ui/add/AddViewModel.kt +++ b/Ledger/app/src/main/java/at/xaxa/ledger/ui/add/AddViewModel.kt @@ -61,23 +61,6 @@ class AddViewModel( } } - fun addCategory(category: CategoryEntity) { - viewModelScope.launch { - try { - val categoryEntity = CategoryEntity( - _id = category._id, - categoryName = category.categoryName, - icon = category.icon, - ) - - withContext(Dispatchers.IO) { - repository.insertCategory(categoryEntity) // Add game to the database - } - // Optionally, log or update UI state to reflect that the game was added - } catch (e: Exception) { - } - } - } fun getAllCategories() { viewModelScope.launch { 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 f948822..6e4d7bd 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 @@ -1,6 +1,7 @@ package at.xaxa.ledger.ui.category.edit 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 @@ -8,7 +9,9 @@ import androidx.compose.foundation.layout.padding import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExposedDropdownMenuBox +import androidx.compose.material3.ExposedDropdownMenuDefaults import androidx.compose.material3.ExposedDropdownMenuDefaults.TrailingIcon +import androidx.compose.material3.Icon import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -22,110 +25,116 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel import at.xaxa.ledger.data.Entry +import at.xaxa.ledger.data.db.Category.CategoryEntity import at.xaxa.ledger.ui.AppViewModelProvider import at.xaxa.ledger.ui.ButtonDanger import at.xaxa.ledger.ui.ButtonSuccess import at.xaxa.ledger.ui.DatePickerDocked +import at.xaxa.ledger.ui.category.CategoryViewModel +import at.xaxa.ledger.ui.category.iconNames +import at.xaxa.ledger.ui.category.icons import at.xaxa.ledger.ui.edit.EditViewModel + @OptIn(ExperimentalMaterial3Api::class) @Composable -fun EditCategory(modifier: Modifier = Modifier, onCardClick: () -> Unit, editViewModel : EditViewModel = viewModel(factory = AppViewModelProvider.Factory), onValueChange: (Entry) -> Unit = {}, +fun EditCategory( + onButtonClick: () -> Unit, + modifier: Modifier = Modifier, + editCategoryViewModel: EditCategoryViewModel = viewModel(factory = AppViewModelProvider.Factory) ) { - /* - val entry = editViewModel.editUiState.entry - val category = editViewModel.categoryUi.category - val categories by editViewModel.categoryListUiState.categories.collectAsState(initial = emptyList()) - var expanded by remember { mutableStateOf(false) } + var expanded by remember { mutableStateOf(false) } // Controls dropdown visibility + val category = editCategoryViewModel.categoryUi.category + var selectedIconIndex = category.icon // Store index of selected icon + + Log.d( + "kkjkjkjkj", + category.categoryName) + + + /* + val categories by categoryViewModel.categoryUiState.categories.collectAsState(initial = emptyList()) + val category = categoryViewModel.categoryUi.category + var expanded by remember { mutableStateOf(false) }*/ Column( - modifier = modifier.fillMaxSize() + modifier = modifier + .fillMaxSize() .padding(16.dp, 0.dp), horizontalAlignment = Alignment.CenterHorizontally ) { - Column( - Modifier.weight(1f) + OutlinedTextField( + value = category.categoryName, + onValueChange = { editCategoryViewModel.updateCategory(category.copy(categoryName = it)) }, + label = { Text("Category Name") }, + modifier = Modifier + .fillMaxWidth() + ) + + ExposedDropdownMenuBox( + expanded = expanded, + onExpandedChange = { expanded = it } ) { OutlinedTextField( - value = entry.name, - onValueChange = {editViewModel.updateEntry(entry.copy(name = it))}, - label = { Text("Name") }, - modifier = Modifier - .fillMaxWidth() - ) - OutlinedTextField( - value = entry.amount.toString(), - onValueChange = { editViewModel.updateEntry(entry.copy(amount = it.toFloat())) }, - label = { Text("Spending") }, + 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() ) - ExposedDropdownMenuBox( + ExposedDropdownMenu( expanded = expanded, - onExpandedChange = { expanded = it } + onDismissRequest = { expanded = false } ) { - // TextField to display the selected item and trigger the dropdown - OutlinedTextField( - value = category.categoryName, - onValueChange = {}, - label = { Text("Category") }, - readOnly = true, - trailingIcon = { - TrailingIcon(expanded = expanded) - }, - modifier = Modifier - .menuAnchor() - .fillMaxWidth() - ) + icons.forEachIndexed { index, icon -> + DropdownMenuItem( + text = { Text(text = iconNames[index]) }, // Use name from iconNames + onClick = { + selectedIconIndex = index // Update selected index - // Dropdown menu - ExposedDropdownMenu( - expanded = expanded, - onDismissRequest = { expanded = false } - ) { - categories.forEach { item -> - DropdownMenuItem( - text = { Text(text = item.categoryName) }, - onClick = { - entry.copy(categoryID = item._id) - editViewModel.updateEntry(entry) - expanded = false - } - ) - } + category.copy(_id = index) + editCategoryViewModel.updateCategory(category) + expanded = false + }, + leadingIcon = { + androidx.compose.material3.Icon( + imageVector = icon, + contentDescription = iconNames[index] + ) + } + ) } } - - - Log.w("xaver", entry.date.toString()) - - DatePickerDocked(entry){ - dateMilis -> editViewModel.updateEntry(entry.copy(date = dateMilis)) - } } - Column( - modifier = Modifier.fillMaxWidth(), - horizontalAlignment = Alignment.CenterHorizontally // Center buttons horizontally + Box( + modifier = Modifier + .fillMaxWidth(), + contentAlignment = Alignment.Center ) { - ButtonDanger( - modifier = Modifier - .fillMaxWidth() - .padding(bottom = 8.dp), - text = "Delete", - onClick = { onCardClick() } - ) ButtonSuccess( - modifier = Modifier.fillMaxWidth(), // Add spacing between buttons - text = "Done", + modifier = Modifier, + "Edit Category", onClick = { - editViewModel.saveEntry() - onCardClick() + 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 new file mode 100644 index 0000000..b6e898e --- /dev/null +++ b/Ledger/app/src/main/java/at/xaxa/ledger/ui/category/edit/EditCategoryViewModel.kt @@ -0,0 +1,66 @@ +package at.xaxa.ledger.ui.category.edit + +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import androidx.lifecycle.SavedStateHandle +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import at.xaxa.ledger.data.Entry +import at.xaxa.ledger.data.EntryRepository +import at.xaxa.ledger.data.db.Category.CategoryEntity +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flowOf +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext + +data class CategoryUIState(val category: CategoryEntity = CategoryEntity(0,"",0)) + + + +class EditCategoryViewModel(private val savedStateHandle: SavedStateHandle, + private val entryRepository: EntryRepository +) : ViewModel() { + + + private val categoryId: Int = checkNotNull(savedStateHandle["categoryId"]) + + + var categoryUiState by mutableStateOf(CategoryUIState()) + var categoryUi by mutableStateOf(CategoryUIState()) + private set + + + init { + viewModelScope.launch { + val category = withContext(Dispatchers.IO) { + entryRepository.findCategoryById(categoryId) + } + categoryUi = CategoryUIState(category) + } + } + + fun updateCategory(category: CategoryEntity) { + categoryUi = categoryUi.copy(category = category) + } + fun onDeleteEntry(category: CategoryEntity) { + viewModelScope.launch { + entryRepository.deleteCategory(category) + } + } + fun saveCategory() { + viewModelScope.launch { + entryRepository.updateCategory(categoryUi.category) + } + } + + fun findCategoryByID(categoryId: Int) { + viewModelScope.launch { + val category = withContext(Dispatchers.IO) { + entryRepository.findCategoryById(categoryId) + } + categoryUi = CategoryUIState(category) + } + } +}