From 8e2b4932ab1ad10293997b65d220e458a26fb30c Mon Sep 17 00:00:00 2001 From: Christian Oswald Date: Thu, 19 Mar 2026 14:10:31 +0100 Subject: [PATCH] Versuch mit datatable --- R/buchungen_mod.R | 186 +++++++++++++++++++++++----------------------- global.R | 2 - 2 files changed, 91 insertions(+), 97 deletions(-) diff --git a/R/buchungen_mod.R b/R/buchungen_mod.R index 770405a..7a2e770 100644 --- a/R/buchungen_mod.R +++ b/R/buchungen_mod.R @@ -12,7 +12,7 @@ buchungenUI <- function(id) { actionBttn(ns("add_trans"), "Transaktion hinzu", size = "sm", style = "material-flat", color = "warning"), actionBttn(ns("del_trans"), "Transaktion Löschen", size = "sm", style = "material-flat", color = "danger"), actionBttn(ns("add_detail"), "Detail hinzu", size = "sm", style = "material-flat", color = "success"), - + # Das UI-Element des Moduls (auch wenn es leer ist) postingModuleUI(ns("posting_modal")) ) @@ -20,111 +20,107 @@ buchungenUI <- function(id) { buchungenServer <- function(id, conn) { moduleServer(id, function(input, output, session) { - ns <- session$ns - - # Reactive States ---- + ns <- session$ns + # * Reactive Variablen ---- postings_data <- reactiveVal(read_buch_tabelle(conn)) - details_data <- reactiveVal(NULL) + details_data <- reactiveVal(NULL) selected_trans_id <- reactiveVal(NULL) current_main_idx <- reactiveVal(NULL) - current_page <- reactiveVal(1) - - # Trigger-Objekt für das Modal: enthält post_id und einen Counter # Der Counter erzwingt eine Reaktion, auch wenn die gleiche ID zweimal geklickt wird modal_trigger <- reactiveVal(list(post_id = NULL, counter = 0)) - - # --- MODUL-SERVER STARTEN (EINMALIG) ---- + # * Modal starten (EINMALIG) ---- update_db_trigger <- postingModuleServer("posting_modal", conn, selected_trans_id, modal_trigger) - - # Haupttabelle rendern ---- + + # * Haupttabelle rendern ---- output$buchungen_table <- renderReactable({ req(postings_data()) - f_reactable(daten = postings_data(), coldefs = coldef_entries_tabelle, + f_reactable( + daten = postings_data(), coldefs = coldef_entries_tabelle, selection = "single", hoehe = "60vh", - defaultSelected = current_main_idx()) - }) - - - - # Details laden wenn Zeile gewählt wird ---- - sel_details <- reactive(getReactableState("buchungen_table", "selected")) - observeEvent(sel_details(), ignoreInit = T, { - current_main_idx(getReactableState("buchungen_table", "selected")) - t_id <- postings_data()[sel_details(), "entry_id"] %>% pull() - selected_trans_id(t_id) - details_data(read_buch_tabelle(conn, trans_id = t_id)) - }) - - output$details_table <- renderReactable({ - req(details_data()) - f_reactable(details_data(), coldefs = coldef_entries_tabelle, selection = "single", hoehe = NULL) - }) - - # Event: Detail hinzufügen (Neu) ---- - observeEvent(input$add_detail, { - req(selected_trans_id()) - modal_trigger(list(post_id = NULL, counter = modal_trigger()$counter + 1)) - }) - - # Event: Detail editieren (Klick auf Detail-Tabelle) ---- - sel_detail <- reactive(getReactableState("details_table", "selected")) - observeEvent(sel_detail(), ignoreInit = T, { - p_id <- details_data()$id[sel_detail()] - modal_trigger(list(post_id = p_id, counter = modal_trigger()$counter + 1)) - }) - - # --- DAS REAKTIVE UPDATE ---- - # Wenn das Modal sagt "Fertig", laden wir die Details neu - observeEvent(update_db_trigger(), ignoreInit = TRUE, { - req(selected_trans_id()) - # Tabellen-Daten neu aus DB ziehen - details_data(read_buch_tabelle(conn, trans_id = selected_trans_id())) - # Optional: Auch Haupttabelle erneuern, falls sich Summen geändert haben - postings_data(read_buch_tabelle(conn)) - updateReactable("buchungen_table", data = postings_data(read_buch_tabelle(conn))) - }) - - # Neue Transaktion Observer ---- - observeEvent(input$add_trans, { - new_t_id <- max_id(conn, "entries") + 1 - # 1. Entry anlegen - dbxInsert(conn, "entries", data.frame(id = new_t_id)) - # 2. Zwei Postings direkt vor-anlegen (z.B. mit Betrag 0) - p_id1 <- max_id(conn, "postings") + 1 - p_id2 <- p_id1 + 1 - new_postings <- data.frame( - id = c(p_id1, p_id2), - entry_id = c(new_t_id, new_t_id), - amount = c(0, 0), - account_id = c(0, 0), - valuta = c(Sys.Date(), Sys.Date()) + defaultSelected = current_main_idx() ) - dbxInsert(conn, "postings", new_postings) - # 3. UI refreshen - selected_trans_id(new_t_id) - postings_data(read_buch_tabelle(conn)) - details_data(read_buch_tabelle(conn, trans_id = new_t_id)) - daten_postings <- postings_data() - daten_details <- details_data() + }) - updateReactable("buchungen_table", data = daten_postings) - }) - - observeEvent(input$del_trans, ignoreInit = T, { - req(selected_trans_id()) - print( selected_trans_id()) - dbxDelete(conn, "postings", where = data.frame(entry_id= selected_trans_id())) - dbxDelete(conn, "entries", where = data.frame(id = selected_trans_id())) - postings_data(read_buch_tabelle(conn)) - details_data(leer_df_from_table(conn, "postings") ) - daten_postings <- postings_data() - daten_details <- details_data() - updateReactable("buchungen_table", data = daten_postings) - updateReactable("details_table", data = daten_details ) - - }) - + # * Details-Tabelle laden ---- + # sel_details <- reactive(getReactableState("buchungen_table", "selected")) + # observeEvent(sel_details(), ignoreInit = T, { + # browser() + # req(sel_details()) + # current_main_idx(getReactableState("buchungen_table", "selected")) + # t_id <- postings_data()[sel_details(), "entry_id"] %>% pull() + # selected_trans_id(t_id) + # details_data(read_buch_tabelle(conn, trans_id = t_id)) + # }) + # output$details_table <- renderReactable({ + # req(details_data()) + # f_reactable(details_data(), coldefs = coldef_entries_tabelle, selection = "single", hoehe = NULL) + # }) + + # * Detail hinzufügen ---- + # observeEvent(input$add_detail, { + # req(selected_trans_id()) + # modal_trigger(list(post_id = NULL, counter = modal_trigger()$counter + 1)) + # }) + + # * Detail editieren (Klick auf Detail-Tabelle) ---- + # sel_detail <- reactive(getReactableState("details_table", "selected")) + # observeEvent(sel_detail(), ignoreInit = T, { + # p_id <- details_data()$id[sel_detail()] + # modal_trigger(list(post_id = p_id, counter = modal_trigger()$counter + 1)) + # }) + + # * Details laden ---- + # observeEvent(update_db_trigger(), ignoreInit = TRUE, { + # req(selected_trans_id()) + # # Tabellen-Daten neu aus DB ziehen + # details_data(read_buch_tabelle(conn, trans_id = selected_trans_id())) + # # Optional: Auch Haupttabelle erneuern, falls sich Summen geändert haben + # postings_data(read_buch_tabelle(conn)) + # updateReactable("buchungen_table", data = postings_data(read_buch_tabelle(conn))) + # }) + + # * Neue Transaktion ---- + # observeEvent(input$add_trans, { + # new_t_id <- max_id(conn, "entries") + 1 + # # 1. Entry anlegen + # dbxInsert(conn, "entries", data.frame(id = new_t_id)) + # # 2. Zwei Postings direkt vor-anlegen (z.B. mit Betrag 0) + # p_id1 <- max_id(conn, "postings") + 1 + # p_id2 <- p_id1 + 1 + # new_postings <- data.frame( + # id = c(p_id1, p_id2), + # entry_id = c(new_t_id, new_t_id), + # amount = c(0, 0), + # account_id = c(0, 0), + # valuta = c(Sys.Date(), Sys.Date()) + # ) + # dbxInsert(conn, "postings", new_postings) + # # 3. UI refreshen + # selected_trans_id(new_t_id) + # postings_data(read_buch_tabelle(conn)) + # neue_zeile <- which(postings_data()$id == p_id1) + # details_data(read_buch_tabelle(conn, trans_id = new_t_id)) + # daten_postings <- postings_data() + # daten_details <- details_data() + # updateReactable("buchungen_table", data = daten_postings, selected = neue_zeile, filters = NULL, sortsBy=NULL) + # }) + + # * Transaktion löschen ---- + # observeEvent(input$del_trans, ignoreInit = T, { + # req(selected_trans_id()) + # print(selected_trans_id()) + # dbxDelete(conn, "postings", where = data.frame(entry_id = selected_trans_id())) + # dbxDelete(conn, "entries", where = data.frame(id = selected_trans_id())) + # postings_data(read_buch_tabelle(conn)) + # details_data(leer_df_from_table(conn, "postings")) + # daten_postings <- postings_data() + # daten_details <- details_data(NULL) + # browser() + # updateReactable("buchungen_table", data = daten_postings) + # current_main_idx(NULL) + # # updateReactable("details_table", data = daten_details) + # }) }) -} \ No newline at end of file +} diff --git a/global.R b/global.R index 1f3c2c1..f7d8029 100644 --- a/global.R +++ b/global.R @@ -13,8 +13,6 @@ library("R.utils") conflicts_prefer(dplyr::select) conflicts_prefer(dplyr::filter) -options(shiny.reactlog = TRUE) -options(shiny.error = browser) conn <- dbConnect(RSQLite::SQLite(), "db/development.sqlite") sourceDirectory("R/")