Home > Enterprise >  Set an alert when all boxes are closed or collapsed in shinydashboardPlus
Set an alert when all boxes are closed or collapsed in shinydashboardPlus

Time:07-05

I have a shinydashboard with 10 boxes, and which can be closed or collapsed. All the box id starts with "box". I was trying set an alert button when all boxes are closed or collapsed.

Below is the code of the dashboard:

library(shiny)
library(shinydashboardPlus)

box_create <- function(i){
  shinydashboardPlus::box(tags$p(paste0("Box",i)), 
                          id = paste0("box", i), 
                          closable = TRUE,
                          collapsible = TRUE)
}

all_box <- purrr::map(1:10, ~box_create(.x))

ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(),
  dashboardBody(
    all_box
  )
)

server <- function(input, output, session) {
  
}

shinyApp(ui, server)

I have noticed on pressing close or collapse button shiny sets the display = 'none' for that box. inspect Box1

So is it possible to extract all styles associated with the id which starts with 'box' and check if all the style property sets as 'none' using jQuery?

CodePudding user response:

Using shinydashboardPlus's dev version you can access the box state via it's id (pattern: input$mybox$collapsed).

Please see this result

CodePudding user response:

I thought you wanted a button when all were collapsed OR all were closed. Here is a solution for that.

library(shiny)
library(shinydashboard)
library(shinydashboardPlus)

box_create <- function(i){
  shinydashboardPlus::box(tags$p(paste0("Box",i)), 
                          id = paste0("box", i), 
                          closable = TRUE,
                          collapsible = TRUE)
}

all_box <- purrr::map(1:10, ~box_create(.x))

ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(),
  dashboardBody(
    all_box,
    div(id = "alert_button")
  )
)

server <- function(input, output, session) {
  observe({
    boxes <- paste0("box", 1:10)
    visible_status <- sapply(boxes, \(x) input[[x]]$visible)
    collapsed_status <- sapply(boxes, \(x) input[[x]]$collapsed)
    if (!any(visible_status) || all(collapsed_status)) {
      insertUI(
        selector = "#alert_button",
        ui = div(id = "added", actionButton("btn","all hidden OR all collapsed"))
      )
    } else {
      removeUI(selector = "#added")
    }
  })
  
}

shinyApp(ui, server)
  • Related