Search code examples
rshinyshinydashboard

Collapse dashboardSidebar menu after click


For the code below, I would like to have a menu (dashboardSidebar) that collapses when any menuItem but item2 is clicked.

library(shiny)
library(shinydashboard)

ui <- dashboardPage(

  dashboardHeader(),

  dashboardSidebar(collapsed = TRUE, sidebarMenu(id = "tabs",
       menuItem("item1", tabName = "item1", icon = icon("newspaper")),
       menuItem("item2", tabName = "item2", icon = icon("tv"),
         menuItem("item2_1",  tabName = "item2_1", icon = icon("tasks")),
         menuItem("item2_2", tabName = "item2_2", icon = icon("flag-checkered")),
         menuItem("item2_3", tabName = "item2_3", icon = icon("user-clock"))))),

  dashboardBody())

server <- function(input, output) {}

shinyApp(ui, server)

Thanks


Solution

  • Please check the following:

    library(shiny)
    library(shinydashboard)
    library(shinyjs)
    
    ui <- dashboardPage(
      dashboardHeader(),
      dashboardSidebar(collapsed = TRUE, sidebarMenu(
        id = "tabs",
        menuItem("item1", tabName = "item1", icon = icon("newspaper")),
        menuItem(
          "item2",
          tabName = "item2",
          icon = icon("tv"),
          menuItem("item2_1",  tabName = "item2_1", icon = icon("tasks")),
          menuItem(
            "item2_2",
            tabName = "item2_2",
            icon = icon("flag-checkered")
          ),
          menuItem("item2_3", tabName = "item2_3", icon = icon("user-clock"))
        )
      )),
      dashboardBody(useShinyjs(),
                    tabItems(
                      tabItem(tabName = "item1",
                              h2("item1 tab content")),
                      tabItem(tabName = "item2_1",
                              h2("item2_1 tab content")),
                      tabItem(tabName = "item2_2",
                              h2("item2_2 tab content")),
                      tabItem(tabName = "item2_3",
                              h2("item2_3 tab content"))
                    ))
    )
    
    server <- function(input, output, session) {
      observeEvent(input$tabs, {
        shinyjs::toggleClass(selector = "body", class = "sidebar-collapse")
      }, ignoreInit = TRUE)
    }
    
    shinyApp(ui, server)
    

    The only drawback is, that selecting the same menuItem twice doesn't collapse the sidebar, due to input$tabs remaining unchanged.