From 1d41fcf67e8b1d96477260bd481ceddfb0f95fff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Ver=C3=ADssimo?= <211358+averissimo@users.noreply.github.com> Date: Wed, 9 Apr 2025 18:06:38 +0100 Subject: [PATCH 01/10] feat: initial support --- R/module_transform_data.R | 34 ++++++++++++++++++++++++++++++---- inst/css/validation.css | 18 ++++++++++++++++++ 2 files changed, 48 insertions(+), 4 deletions(-) diff --git a/R/module_transform_data.R b/R/module_transform_data.R index 26b49f0b47..b1b26b47cd 100644 --- a/R/module_transform_data.R +++ b/R/module_transform_data.R @@ -37,9 +37,17 @@ ui_transform_teal_data <- function(id, transformators, class = "well") { display_fun( bslib::accordion( + id = ns("wrapper"), + class = "validation-wrapper", bslib::accordion_panel( attr(data_mod, "label"), icon = bsicons::bs_icon("palette-fill"), + tags$div( + class = "disabled-info", + title = "Disabled until data becomes valid", + bsicons::bs_icon("info-circle"), + "Disabled until data becomes valid. Check your inputs." + ), tags$div( id = transform_wrapper_id, if (is.null(data_mod$ui)) { @@ -76,19 +84,38 @@ srv_transform_teal_data <- function(id, data, transformators, modules = NULL, is names(transformators) <- sprintf("transform_%d", seq_len(length(transformators))) moduleServer(id, function(input, output, session) { + data_original_handled <- reactive(tryCatch(data(), error = function(e) e)) module_output <- Reduce( function(data_previous, name) { moduleServer(name, function(input, output, session) { logger::log_debug("srv_transform_teal_data@1 initializing module for { name }.") data_out <- reactiveVal() + transform_wrapper_id <- sprintf("wrapper_%s", name) + + # Disable all elements if original data is not yet a teal_data + observeEvent(data_original_handled(), { + (if (!inherits(data_original_handled(), "teal_data")) shinyjs::disable else shinyjs::enable)("wrapper") + }) + .call_once_when(inherits(data_previous(), "teal_data"), { logger::log_debug("srv_teal_transform_teal_data@2 triggering a transform module call for { name }.") data_unhandled <- transformators[[name]]$server("transform", data = data_previous) data_handled <- reactive(tryCatch(data_unhandled(), error = function(e) e)) - observeEvent(data_handled(), { - if (inherits(data_handled(), "teal_data")) { + observeEvent({ + data_handled() + data_original_handled() + }, { + if (!inherits(data_original_handled(), "teal_data")) { + data_out( + within( + teal.code::qenv(), + stop("Error with original data: ", message), + message = data_original_handled()$message + ) + ) + } else if (inherits(data_handled(), "teal_data")) { if (!identical(data_handled(), data_out())) { data_out(data_handled()) } @@ -97,7 +124,7 @@ srv_transform_teal_data <- function(id, data, transformators, modules = NULL, is is_transform_failed[[name]] <- FALSE observeEvent(data_handled(), { - if (inherits(data_handled(), "teal_data")) { + if (inherits(data_handled(), "teal_data") || rlang::is_condition(data_original_handled())) { is_transform_failed[[name]] <- FALSE } else { is_transform_failed[[name]] <- TRUE @@ -124,7 +151,6 @@ srv_transform_teal_data <- function(id, data, transformators, modules = NULL, is } }) - transform_wrapper_id <- sprintf("wrapper_%s", name) output$error_wrapper <- renderUI({ if (is_previous_failed()) { shinyjs::disable(transform_wrapper_id) diff --git a/inst/css/validation.css b/inst/css/validation.css index 665fac2d73..dcff198ae2 100644 --- a/inst/css/validation.css +++ b/inst/css/validation.css @@ -47,3 +47,21 @@ border: 1px solid red; padding: 1em; } + +.validation-wrapper[disabled="disabled"] { + --bs-accordion-bg: var(--bs-gray-100); + background-color: var(--bs-gray-100); +} + +.validation-wrapper[disabled="disabled"]:has(.shiny-output-error, .teal-output-warning) .disabled-info, +.validation-wrapper .disabled-info { + display: none; +} + +.validation-wrapper[disabled="disabled"] .disabled-info { + display: block; + border-color: var(--bs-info); + padding: 1em; + color: color-mix(in srgb, var(--bs-info), black 20%); + background-color: color-mix(in srgb, var(--bs-info) 5%, transparent); +} From 10ac4793ebb0bfd66770ae6df727081a7faec159 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Ver=C3=ADssimo?= <211358+averissimo@users.noreply.github.com> Date: Mon, 14 Apr 2025 12:20:08 +0100 Subject: [PATCH 02/10] feat: accordion still works --- R/module_transform_data.R | 8 ++++---- inst/css/validation.css | 6 +++--- teal.Rproj | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/R/module_transform_data.R b/R/module_transform_data.R index b1b26b47cd..816a0c21d3 100644 --- a/R/module_transform_data.R +++ b/R/module_transform_data.R @@ -40,6 +40,8 @@ ui_transform_teal_data <- function(id, transformators, class = "well") { id = ns("wrapper"), class = "validation-wrapper", bslib::accordion_panel( + id = ns("wrapper_panel"), + class = "validation-panel", attr(data_mod, "label"), icon = bsicons::bs_icon("palette-fill"), tags$div( @@ -95,7 +97,7 @@ srv_transform_teal_data <- function(id, data, transformators, modules = NULL, is # Disable all elements if original data is not yet a teal_data observeEvent(data_original_handled(), { - (if (!inherits(data_original_handled(), "teal_data")) shinyjs::disable else shinyjs::enable)("wrapper") + (if (!inherits(data_original_handled(), "teal_data")) shinyjs::disable else shinyjs::enable)("wrapper_panel") }) .call_once_when(inherits(data_previous(), "teal_data"), { @@ -170,9 +172,7 @@ srv_transform_teal_data <- function(id, data, transformators, modules = NULL, is }) # Ignoring unwanted reactivity breaks during initialization - reactive({ - req(data_out()) - }) + reactive(req(data_out())) }) }, x = names(transformators), diff --git a/inst/css/validation.css b/inst/css/validation.css index dcff198ae2..919572cf8b 100644 --- a/inst/css/validation.css +++ b/inst/css/validation.css @@ -48,17 +48,17 @@ padding: 1em; } -.validation-wrapper[disabled="disabled"] { +.validation-wrapper:has(.validation-panel[disabled="disabled"]) { --bs-accordion-bg: var(--bs-gray-100); background-color: var(--bs-gray-100); } -.validation-wrapper[disabled="disabled"]:has(.shiny-output-error, .teal-output-warning) .disabled-info, +.validation-wrapper:has(.validation-panel[disabled="disabled"] .shiny-output-error, .teal-output-warning) .disabled-info, .validation-wrapper .disabled-info { display: none; } -.validation-wrapper[disabled="disabled"] .disabled-info { +.validation-wrapper .validation-panel[disabled="disabled"] .disabled-info { display: block; border-color: var(--bs-info); padding: 1em; diff --git a/teal.Rproj b/teal.Rproj index ab99014abb..876e0b7f96 100644 --- a/teal.Rproj +++ b/teal.Rproj @@ -1,4 +1,5 @@ Version: 1.0 +ProjectId: fa9b6a6c-a470-42a8-bc1a-165563e5ac01 RestoreWorkspace: Default SaveWorkspace: Default From 32c1cd494a7c7a6537a3f1a5ee563274add88492 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Ver=C3=ADssimo?= <211358+averissimo@users.noreply.github.com> Date: Mon, 14 Apr 2025 12:44:06 +0100 Subject: [PATCH 03/10] feat: improve on styling and simplify shinyjs --- R/module_transform_data.R | 11 +++++++++-- inst/css/validation.css | 7 ++++++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/R/module_transform_data.R b/R/module_transform_data.R index 816a0c21d3..641147be24 100644 --- a/R/module_transform_data.R +++ b/R/module_transform_data.R @@ -97,7 +97,7 @@ srv_transform_teal_data <- function(id, data, transformators, modules = NULL, is # Disable all elements if original data is not yet a teal_data observeEvent(data_original_handled(), { - (if (!inherits(data_original_handled(), "teal_data")) shinyjs::disable else shinyjs::enable)("wrapper_panel") + shinyjs::toggleState("wrapper_panel", condition = inherits(data_original_handled(), "teal_data")) }) .call_once_when(inherits(data_previous(), "teal_data"), { @@ -109,7 +109,7 @@ srv_transform_teal_data <- function(id, data, transformators, modules = NULL, is data_handled() data_original_handled() }, { - if (!inherits(data_original_handled(), "teal_data")) { + if (inherits(data_original_handled(), "condition")) { data_out( within( teal.code::qenv(), @@ -121,6 +121,13 @@ srv_transform_teal_data <- function(id, data, transformators, modules = NULL, is if (!identical(data_handled(), data_out())) { data_out(data_handled()) } + } else { + data_out( + within( + teal.code::qenv(), + stop("Error: cannot handle class ", paste(collapse(class(data_handled())))) + ) + ) } }) diff --git a/inst/css/validation.css b/inst/css/validation.css index 919572cf8b..657c176046 100644 --- a/inst/css/validation.css +++ b/inst/css/validation.css @@ -58,9 +58,14 @@ display: none; } +.validation-wrapper .validation-panel[disabled="disabled"] { + padding-top: 0; +} + .validation-wrapper .validation-panel[disabled="disabled"] .disabled-info { display: block; - border-color: var(--bs-info); + border: 1px solid var(--bs-info); + border-radius: 4px; padding: 1em; color: color-mix(in srgb, var(--bs-info), black 20%); background-color: color-mix(in srgb, var(--bs-info) 5%, transparent); From 44c4143fe8d29ca12dd708cfc0a8297f767fa380 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Ver=C3=ADssimo?= <211358+averissimo@users.noreply.github.com> Date: Wed, 16 Apr 2025 16:07:51 +0100 Subject: [PATCH 04/10] fix: reactivity error --- R/module_nested_tabs.R | 4 +-- R/module_teal_data.R | 6 +---- R/module_transform_data.R | 51 ++++++++++++++++++++------------------- inst/css/validation.css | 7 +++++- 4 files changed, 35 insertions(+), 33 deletions(-) diff --git a/R/module_nested_tabs.R b/R/module_nested_tabs.R index 59e819a2a0..47716c2c23 100644 --- a/R/module_nested_tabs.R +++ b/R/module_nested_tabs.R @@ -359,8 +359,8 @@ srv_teal_module.teal_module <- function(id, }) module_teal_data <- reactive({ - req(inherits(transformed_teal_data(), "teal_data")) - all_teal_data <- transformed_teal_data() + all_teal_data <- tryCatch(transformed_teal_data(), error = function(e) e) + req(inherits(all_teal_data, "teal_data")) module_datanames <- .resolve_module_datanames(data = all_teal_data, modules = modules) all_teal_data[c(module_datanames, ".raw_data")] }) diff --git a/R/module_teal_data.R b/R/module_teal_data.R index ff42ab84f3..b119ffa56f 100644 --- a/R/module_teal_data.R +++ b/R/module_teal_data.R @@ -85,11 +85,7 @@ srv_teal_data_module <- function(id, }) observeEvent(is_previous_failed(), { - if (is_previous_failed()) { - shinyjs::disable("wrapper") - } else { - shinyjs::enable("wrapper") - } + shinyjs::toggleState("wrapper", !is_previous_failed()) }) srv_validate_reactive_teal_data( diff --git a/R/module_transform_data.R b/R/module_transform_data.R index 641147be24..b3934d4b03 100644 --- a/R/module_transform_data.R +++ b/R/module_transform_data.R @@ -97,7 +97,10 @@ srv_transform_teal_data <- function(id, data, transformators, modules = NULL, is # Disable all elements if original data is not yet a teal_data observeEvent(data_original_handled(), { - shinyjs::toggleState("wrapper_panel", condition = inherits(data_original_handled(), "teal_data")) + shinyjs::toggleState( + "wrapper_panel", + condition = inherits(data_original_handled(), "teal_data") + ) }) .call_once_when(inherits(data_previous(), "teal_data"), { @@ -105,31 +108,25 @@ srv_transform_teal_data <- function(id, data, transformators, modules = NULL, is data_unhandled <- transformators[[name]]$server("transform", data = data_previous) data_handled <- reactive(tryCatch(data_unhandled(), error = function(e) e)) - observeEvent({ - data_handled() - data_original_handled() - }, { - if (inherits(data_original_handled(), "condition")) { - data_out( - within( - teal.code::qenv(), - stop("Error with original data: ", message), - message = data_original_handled()$message - ) - ) - } else if (inherits(data_handled(), "teal_data")) { - if (!identical(data_handled(), data_out())) { + observeEvent( + { + data_handled() + data_original_handled() + }, + { + if (inherits(data_original_handled(), "condition")) { + data_out(data_original_handled()) + } else if (inherits(data_handled(), "teal_data")) { + if (!identical(data_handled(), data_out())) { + data_out(data_handled()) + } + } else if (inherits(data_handled(), "condition")) { + data_out(data_handled()) + } else { data_out(data_handled()) } - } else { - data_out( - within( - teal.code::qenv(), - stop("Error: cannot handle class ", paste(collapse(class(data_handled())))) - ) - ) } - }) + ) is_transform_failed[[name]] <- FALSE observeEvent(data_handled(), { @@ -154,6 +151,7 @@ srv_transform_teal_data <- function(id, data, transformators, modules = NULL, is } # When there is no UI (`ui = NULL`) it should still show the errors + # It is a 1-way operation as there is no UI to correct the state observe({ if (!inherits(data_handled(), "teal_data") && !is_previous_failed()) { shinyjs::show("wrapper") @@ -167,7 +165,7 @@ srv_transform_teal_data <- function(id, data, transformators, modules = NULL, is "One of previous transformators failed. Please check its inputs.", class = "teal-output-warning" ) - } else { + } else if (inherits(data_original_handled(), "teal_data")) { shinyjs::enable(transform_wrapper_id) shiny::tagList( ui_validate_error(session$ns("silent_error")), @@ -179,7 +177,10 @@ srv_transform_teal_data <- function(id, data, transformators, modules = NULL, is }) # Ignoring unwanted reactivity breaks during initialization - reactive(req(data_out())) + reactive({ + if (inherits(req(data_out()), "condition")) stop(data_out()) + data_out() + }) }) }, x = names(transformators), diff --git a/inst/css/validation.css b/inst/css/validation.css index 657c176046..1734e73fe5 100644 --- a/inst/css/validation.css +++ b/inst/css/validation.css @@ -53,7 +53,12 @@ background-color: var(--bs-gray-100); } -.validation-wrapper:has(.validation-panel[disabled="disabled"] .shiny-output-error, .teal-output-warning) .disabled-info, +.validation-wrapper:has(.validation-panel[disabled="disabled"]) .teal_validated, +.validation-wrapper:has(.validation-panel[disabled="disabled"]) .shiny-output-error, +.validation-wrapper:has(.validation-panel[disabled="disabled"]) .teal-output-warning { + display: none; +} + .validation-wrapper .disabled-info { display: none; } From 5f7d1b38035f4dac686853addcfb60b342329517 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Ver=C3=ADssimo?= <211358+averissimo@users.noreply.github.com> Date: Wed, 16 Apr 2025 17:24:54 +0100 Subject: [PATCH 05/10] chore: use inherits instead of rlang::is_condition --- R/module_transform_data.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/module_transform_data.R b/R/module_transform_data.R index b3934d4b03..1429b42c10 100644 --- a/R/module_transform_data.R +++ b/R/module_transform_data.R @@ -130,7 +130,7 @@ srv_transform_teal_data <- function(id, data, transformators, modules = NULL, is is_transform_failed[[name]] <- FALSE observeEvent(data_handled(), { - if (inherits(data_handled(), "teal_data") || rlang::is_condition(data_original_handled())) { + if (inherits(data_handled(), "teal_data") || inherits(data_original_handled(), "condition")) { is_transform_failed[[name]] <- FALSE } else { is_transform_failed[[name]] <- TRUE From cc80dae0ac0456dada3f16cea5c2d648982b6b83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Ver=C3=ADssimo?= <211358+averissimo@users.noreply.github.com> Date: Wed, 7 May 2025 14:48:43 +0100 Subject: [PATCH 06/10] fix: revert unecessary change --- R/module_teal_data.R | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/R/module_teal_data.R b/R/module_teal_data.R index b119ffa56f..3d7eecfd68 100644 --- a/R/module_teal_data.R +++ b/R/module_teal_data.R @@ -85,7 +85,11 @@ srv_teal_data_module <- function(id, }) observeEvent(is_previous_failed(), { - shinyjs::toggleState("wrapper", !is_previous_failed()) + if (is_previous_failed()) { + shinyjs::disable("wrapper") + } else { + shinyjs::enable("wrapper") + } }) srv_validate_reactive_teal_data( From c4c9fe3256519f52f5d386f14a0f6dcfd22ea9ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Ver=C3=ADssimo?= <211358+averissimo@users.noreply.github.com> Date: Wed, 7 May 2025 14:59:16 +0100 Subject: [PATCH 07/10] fix: missing space --- R/module_teal_data.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/module_teal_data.R b/R/module_teal_data.R index 3d7eecfd68..ff42ab84f3 100644 --- a/R/module_teal_data.R +++ b/R/module_teal_data.R @@ -85,7 +85,7 @@ srv_teal_data_module <- function(id, }) observeEvent(is_previous_failed(), { - if (is_previous_failed()) { + if (is_previous_failed()) { shinyjs::disable("wrapper") } else { shinyjs::enable("wrapper") From 121c468cad978f0a354ebb446bba3ec1ed8f094e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Ver=C3=ADssimo?= <211358+averissimo@users.noreply.github.com> Date: Fri, 9 May 2025 02:20:58 +0100 Subject: [PATCH 08/10] feat: removes 'is_transform_failed' and improves solution --- R/module_nested_tabs.R | 27 ++++++++++----------------- R/module_transform_data.R | 19 ++++--------------- 2 files changed, 14 insertions(+), 32 deletions(-) diff --git a/R/module_nested_tabs.R b/R/module_nested_tabs.R index 47716c2c23..978c5b3a33 100644 --- a/R/module_nested_tabs.R +++ b/R/module_nested_tabs.R @@ -336,33 +336,26 @@ srv_teal_module.teal_module <- function(id, data = data, is_active = is_active ) - is_transform_failed <- reactiveValues() transformed_teal_data <- srv_transform_teal_data( "data_transform", data = filtered_teal_data, transformators = modules$transformators, - modules = modules, - is_transform_failed = is_transform_failed + modules = modules ) any_transform_failed <- reactive({ - any(unlist(reactiveValuesToList(is_transform_failed))) + !inherits(try(transformed_teal_data(), silent = TRUE), "teal_data") && + inherits(filtered_teal_data(), "teal_data") }) observeEvent(any_transform_failed(), { - if (isTRUE(any_transform_failed())) { - shinyjs::hide("teal_module_ui") - shinyjs::show("transform_failure_info") - } else { - shinyjs::show("teal_module_ui") - shinyjs::hide("transform_failure_info") - } + shinyjs::toggleElement("transform_failure_info", condition = any_transform_failed()) }) - module_teal_data <- reactive({ - all_teal_data <- tryCatch(transformed_teal_data(), error = function(e) e) - req(inherits(all_teal_data, "teal_data")) - module_datanames <- .resolve_module_datanames(data = all_teal_data, modules = modules) - all_teal_data[c(module_datanames, ".raw_data")] + summary_data <- reactiveVal(NULL) + module_teal_data <- eventReactive(transformed_teal_data(), { + module_datanames <- .resolve_module_datanames(data = transformed_teal_data(), modules = modules) + summary_data(transformed_teal_data()[c(module_datanames, ".raw_data")]) + summary_data() }) srv_check_module_datanames( @@ -371,7 +364,7 @@ srv_teal_module.teal_module <- function(id, modules = modules ) - summary_table <- srv_data_summary("data_summary", module_teal_data) + summary_table <- srv_data_summary("data_summary", summary_data) # Only updates on success observeEvent(input$data_summary_toggle, { bslib::toggle_sidebar(id = "teal_module_sidebar", open = TRUE) diff --git a/R/module_transform_data.R b/R/module_transform_data.R index 1429b42c10..ad19fed7ae 100644 --- a/R/module_transform_data.R +++ b/R/module_transform_data.R @@ -72,7 +72,7 @@ ui_transform_teal_data <- function(id, transformators, class = "well") { #' @export #' @rdname module_transform_data -srv_transform_teal_data <- function(id, data, transformators, modules = NULL, is_transform_failed = reactiveValues()) { +srv_transform_teal_data <- function(id, data, transformators, modules = NULL) { checkmate::assert_string(id) assert_reactive(data) checkmate::assert_class(modules, "teal_module", null.ok = TRUE) @@ -128,20 +128,9 @@ srv_transform_teal_data <- function(id, data, transformators, modules = NULL, is } ) - is_transform_failed[[name]] <- FALSE - observeEvent(data_handled(), { - if (inherits(data_handled(), "teal_data") || inherits(data_original_handled(), "condition")) { - is_transform_failed[[name]] <- FALSE - } else { - is_transform_failed[[name]] <- TRUE - } - }) - is_previous_failed <- reactive({ - idx_this <- which(names(is_transform_failed) == name) - is_transform_failed_list <- reactiveValuesToList(is_transform_failed) - idx_failures <- which(unlist(is_transform_failed_list)) - any(idx_failures < idx_this) + inherits(data_original_handled(), "teal_data") && + !inherits(try(data_previous(), silent = TRUE), "teal_data") }) srv_validate_error("silent_error", data_handled, validate_shiny_silent_error = FALSE) @@ -178,7 +167,7 @@ srv_transform_teal_data <- function(id, data, transformators, modules = NULL, is # Ignoring unwanted reactivity breaks during initialization reactive({ - if (inherits(req(data_out()), "condition")) stop(data_out()) + validate(need(inherits(data_out(), "teal_data"), message = data_out()$message)) # rethrow message data_out() }) }) From bf65eccb82e4290593f05926fa2255b527759880 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 9 May 2025 07:02:21 +0000 Subject: [PATCH 09/10] [skip roxygen] [skip vbump] Roxygen Man Pages Auto Update --- man/module_transform_data.Rd | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/man/module_transform_data.Rd b/man/module_transform_data.Rd index fca1273403..28386f13d3 100644 --- a/man/module_transform_data.Rd +++ b/man/module_transform_data.Rd @@ -8,13 +8,7 @@ \usage{ ui_transform_teal_data(id, transformators, class = "well") -srv_transform_teal_data( - id, - data, - transformators, - modules = NULL, - is_transform_failed = reactiveValues() -) +srv_transform_teal_data(id, data, transformators, modules = NULL) } \arguments{ \item{id}{(\code{character(1)}) \code{shiny} module instance id.} @@ -27,10 +21,6 @@ To learn more check \code{vignette("transform-input-data", package = "teal")}.} \item{data}{(\code{reactive} returning \code{teal_data})} \item{modules}{(\code{teal_modules} or \code{teal_module}) For \code{datanames} validation purpose} - -\item{is_transform_failed}{(\code{reactiveValues}) contains \code{logical} flags named after each transformator. -Help to determine if any previous transformator failed, so that following transformators can be disabled -and display a generic failure message.} } \value{ \code{reactive} \code{teal_data} From 9225ed04caa2f56eac3ed557526cf10802fc8f60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Ver=C3=ADssimo?= <211358+averissimo@users.noreply.github.com> Date: Fri, 9 May 2025 11:42:54 +0100 Subject: [PATCH 10/10] feat: safer rethrow --- R/module_transform_data.R | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/R/module_transform_data.R b/R/module_transform_data.R index ad19fed7ae..7a82c9322e 100644 --- a/R/module_transform_data.R +++ b/R/module_transform_data.R @@ -91,9 +91,7 @@ srv_transform_teal_data <- function(id, data, transformators, modules = NULL) { function(data_previous, name) { moduleServer(name, function(input, output, session) { logger::log_debug("srv_transform_teal_data@1 initializing module for { name }.") - data_out <- reactiveVal() - transform_wrapper_id <- sprintf("wrapper_%s", name) # Disable all elements if original data is not yet a teal_data observeEvent(data_original_handled(), { @@ -120,8 +118,6 @@ srv_transform_teal_data <- function(id, data, transformators, modules = NULL) { if (!identical(data_handled(), data_out())) { data_out(data_handled()) } - } else if (inherits(data_handled(), "condition")) { - data_out(data_handled()) } else { data_out(data_handled()) } @@ -147,6 +143,7 @@ srv_transform_teal_data <- function(id, data, transformators, modules = NULL) { } }) + transform_wrapper_id <- sprintf("wrapper_%s", name) output$error_wrapper <- renderUI({ if (is_previous_failed()) { shinyjs::disable(transform_wrapper_id) @@ -167,7 +164,7 @@ srv_transform_teal_data <- function(id, data, transformators, modules = NULL) { # Ignoring unwanted reactivity breaks during initialization reactive({ - validate(need(inherits(data_out(), "teal_data"), message = data_out()$message)) # rethrow message + validate(need(!inherits(data_out(), "condition"), message = data_out()$message)) # rethrow message data_out() }) })