JohnCoene / waiter

🕰️ Loading screens for Shiny
https://waiter.john-coene.com/
Other
495 stars 25 forks source link

AutoWaiter in ShinyModules shows not on all modules at the same time #133

Open DavZim opened 1 year ago

DavZim commented 1 year ago

When I have a shiny app with multiple modules, autoWaiter does not pick up all elements at the same time but only "hides" the second element when the first one is done rendering.

MWE - autoWaiter in main UI

library(shiny)
library(waiter)
sleep <- function(id) {
  cat("ID =", id, ":\n")
  for (i in seq(2)) cat(Sys.sleep(1), i, "\n")
}

UI <- function(id) {
  ns <- NS(id)
  column(width = 4, "mod =", id,
         plotOutput(ns("plot"), width = "300px", height = "300px"))
}

Server <- function(id, data) {
  moduleServer(
    id,
    function(input, output, session) {
      data_plot <- reactive({
        sleep(id)
        data
      })

      output$plot <- renderPlot({
        plot(data_plot()$x, data_plot()$y)
      })
    }
  )
}

ui <- fluidPage(
  useWaiter(),
  autoWaiter(),
  fluidRow(
    column(width = 4, "mod = main-ui",
           plotOutput("plot", width = "300px", height = "300px")),
    UI("mod1"),
    UI("mod2")
  )
)

server <- function(input, output, session) {
  Server("mod1", iris[, c("Sepal.Width", "Sepal.Length")] |> setNames(c("x", "y")))
  Server("mod2", mtcars[, c("wt", "mpg")] |> setNames(c("x", "y")))

  output$plot <- renderPlot({
    sleep("main-ui")
    plot(1:10, rnorm(10))
  })
}

shinyApp(ui, server)

This leads to waiter first showing the spinner on the first module, then the second (when the first module is done waiting), then the plot from the main ui. I would expect to see the waiter on all reactive elements from the start. Note that all spinners disappear when the last element is rendered.

image