RanonKahn
RanonKahn

Reputation: 872

How to display a confirmation message while switching tabs (tabPanel) within a R Shiny app?

I am trying to implement something similar to this within the app and not at the browser level as described here.

After capturing the value of the new tab (tabPanel value) selected, could not display the confirmation message before switching to the newly selected tab to display its content.

library(shiny)
library(ggplot2)
library(shinyalert)

ui <- fluidPage(useShinyalert(),
  tabsetPanel(id = "tabselected",
    tabPanel("Tab1"),
    tabPanel("Tab2",plotOutput("plot"))
  )
)

server <- function(input, output) {

  observeEvent(input$tabselected, {
    if(input$tabselected == "Tab2") 
      { 
       shinyalert(title = "Save your work before changing tab", type = "warning", showConfirmButton = TRUE)
       output$plot <- renderPlot({ ggplot(mtcars)+geom_abline() })
      }
  })

}

shinyApp(ui = ui, server = server)

Upvotes: 1

Views: 537

Answers (1)

ismirsehregal
ismirsehregal

Reputation: 33510

You can simply redirect to Tab1 via updateTabsetPanel as long as your desired condition is met.

Here is an example requiring the user to type something in the textInput before it's allowed to switch the tab.

library(shiny)
library(ggplot2)
library(shinyalert)

ui <- fluidPage(useShinyalert(),
                tabsetPanel(
                  id = "tabselected",
                  tabPanel("Tab1", p(), textInput("requiredText", "Required Text")),
                  tabPanel("Tab2", p(), plotOutput("plot"))
                ))

server <- function(input, output, session) {
  observeEvent(input$tabselected, {
    if (input$tabselected == "Tab2" && !isTruthy(input$requiredText)) {
      updateTabsetPanel(session, inputId = "tabselected", selected = "Tab1")
      shinyalert(title = "Save your work before changing tab",
                 type = "warning",
                 showConfirmButton = TRUE)
      output$plot <- renderPlot({
        ggplot(mtcars) + geom_abline() + ggtitle(req(input$requiredText))
      })
    }
  })
}

shinyApp(ui = ui, server = server)

Result

By the way an alternative approach wpuld be using showTab and hideTab to display the tabs only if all conditions are fulfilled.

Upvotes: 3

Related Questions