активировать / деактивировать вкладку в правой части панели Shinydashboardplus при нажатии на элемент меню левой боковой панели - PullRequest
0 голосов
/ 19 сентября 2019

Я создаю приложение Shiny, используя отличный пакет ShinyDashoardPlus (стилизованный под тему из пакета Dashboardthemes), в котором три tabItems содержат содержимое для трех разделов приложения (раздел A, разделB и раздел C), доступны через sidebarMenu слева dashboardSidebar и правой боковой панели с двумя вкладками (реализовано как rightSidebarTabContent со следующими идентификаторами: T_A и T_B), удерживающими элементы управления для исследованиядалее содержание разделов A и B. соответственно.

Поскольку rightSidebarTabContent T_A относится только к section A, а rightSidebarTabContent T_B относится только к section B, я бы хотелчто (1) пользователь щелкнет по пунктам меню левой боковой панели A или B и может активировать соответствующую вкладку в правой боковой панели .Более того, поскольку ни один из rightSidebarTabContents не имеет отношения к section C, я также хотел бы, чтобы (2) пользователь щелкнул левой кнопкой мыши на элементе меню боковой панели C и мог закрыть панель прав, если он открыт.

Я нашел возможную подсказку о том, как решить мои проблемы ( Автоматическое всплывающее окно rightSidebar при нажатии на MenuItem в shinydashboardPlus ), и я действительно смог частично решить свою первую проблему, добавив /удаление некоторого класса CSS с помощью shinyjs для активации части различных вкладок в rightSidebar при нажатии на menuItems.

Как я уже сказал, это решение частично работает для моей первой проблемы, хотя тольконижняя часть rightSidebarTabContent активируется / деактивируется таким образом, но не заголовок вкладки со значками для навигации между ними.Более того, возможно, из-за добавления дополнительных классов CSS, когда я применяю тему «shinydashboard» «темный», я не могу переключать закрытие пункта меню rightSidebar при щелчке section C (выпуск № 2).

Подводя итог:

  1. Элемент правой боковой панели T_A должен расширяться при выборе элемента левой боковой панели section A.Аналогично для T_A и section B.
  2. Правая боковая панель должна разрушаться, если на левой боковой панели выбрано section C

Может кто-нибудь помочь с этим?Заранее спасибо за любую помощь!

library(shiny)
library(shinyjs)
library(shinyWidgets)
library(shinydashboard)
library(shinydashboardPlus)
library(dashboardthemes)

ui <- dashboardPagePlus(
  useShinyjs(),
  header = dashboardHeaderPlus(
    title = "Dashboard",
    enable_rightsidebar = TRUE,
    rightSidebarIcon = "info-circle"
  ),
  sidebar = dashboardSidebar(
    sidebarMenu(
      menuItem("Section A", tabName = "Section_A", icon = icon("map")),
      menuItem("Section B", tabName = "Section_B", icon = icon("chart-line")),
      menuItem("Section C", tabName = "Section_C", icon = icon( "gears")),
      id = "nav"
    )
  ),
  body = dashboardBody(
    shinyDashboardThemes(
      theme = "grey_dark"
    ),
    tabItems(
      tabItem(
        tabName = "Section_A",
        p("Some content for section A")),
      tabItem(
        tabName = "Section_B",
        p("Some content for section B")),
      tabItem(
        tabName = "Section_C",
        p("Some content for section C"))
      )
  ),
  rightsidebar = rightSidebar(
    background = "dark",
    rightSidebarTabContent(
      id = "T_A",
      title = "Tab for section A",
      icon = "desktop",
      active = TRUE,
      p("Some content frelevant for section A"),
      sliderInput(
        "obs",
        "Number of observations:",
        min = 0, max = 1000, value = 500
      )
    ),
    rightSidebarTabContent(
      id = "T_B",
      title = "Tab for section B",
      p("Some content frelevant for section B"),
      textInput("caption", "Caption", "Data Summary")
    )
  ),
  title = "Right Sidebar"
)


server <- function(input, output) {
  observe({
    if (req(input$nav) == "Section_A"){
      message("Section A has been selected")
      shinyjs::removeClass(id = "control-sidebar-T_A-tab", class = "tab-pane")
      shinyjs::removeClass(id = "control-sidebar-T_B-tab", class = "tab-pane active")
      shinyjs::addClass(id = "control-sidebar-T_A-tab", class = "tab-pane active")
      shinyjs::addClass(id = "control-sidebar-T_B-tab", class = "tab-pane")
    }
    if (req(input$nav) == "Section_B"){
      message("Section B has been selected")
      shinyjs::removeClass(id = "control-sidebar-T_B-tab", class = "tab-pane")
      shinyjs::removeClass(id = "control-sidebar-T_A-tab", class = "tab-pane active")
      shinyjs::addClass(id = "control-sidebar-T_B-tab", class = "tab-pane active")
      shinyjs::addClass(id = "control-sidebar-T_A-tab", class = "tab-pane")
    }
    if (req(input$nav) == "Section_C"){
      message("Section C has been selected")
      shinyjs::removeClass(selector = "aside.control-sidebar-open aside.control-sidebar-dark", class = "control-sidebar-open aside.control-sidebar-dark-open")
      shinyjs::addClass(selector = "aside.control-sidebar", class = "control-sidebar")
    }
  })
}


shinyApp(ui = ui, server = server)

1 Ответ

0 голосов
/ 20 сентября 2019

Вы можете визуализировать элементы правой боковой панели с помощью renderUI вместо изменения CSS.Внутри rightSidebar мы можем поместить один uiOutput, который будет заполнен различным содержимым в зависимости от выбранного элемента в левой боковой панели.Обратите внимание, что это частичное решение.Развернутая боковая панель по-прежнему не будет сворачиваться при выборе section C на левой боковой панели.[См. Правку ниже, в которой рассматривается свертывание правой боковой панели.]

library(shinyjs)
library(shinyWidgets)
library(shinydashboard)
library(shinydashboardPlus)
library(dashboardthemes)

ui <- dashboardPagePlus(
  useShinyjs(),
  header = dashboardHeaderPlus(
    title = "Dashboard",
    enable_rightsidebar = TRUE,
    rightSidebarIcon = "info-circle"
  ),
  sidebar = dashboardSidebar(
    sidebarMenu(
      menuItem("Section A", tabName = "Section_A", icon = icon("map")),
      menuItem("Section B", tabName = "Section_B", icon = icon("chart-line")),
      menuItem("Section C", tabName = "Section_C", icon = icon( "gears")),
      id = "nav"
    )
  ),
  body = dashboardBody(
    shinyDashboardThemes(
      theme = "grey_dark"
    ),
    tabItems(
      tabItem(
        tabName = "Section_A",
        p("Some content for section A")),
      tabItem(
        tabName = "Section_B",
        p("Some content for section B")),
      tabItem(
        tabName = "Section_C",
        p("Some content for section C"))
    )
  ),
  rightsidebar = rightSidebar(
    background = "dark",
    uiOutput("side_bar"),
    title = "Right Sidebar"
  )
)

server <- function(input, output) {
  observe({
    if (req(input$nav) == "Section_A"){
      message("Section A has been selected")
      # added in edit
      shinyjs::addClass(selector = "aside.control-sidebar", class = "control-sidebar-open")
      output$side_bar <- renderUI({
        rightSidebarTabContent(
          id = "T_A",
          title = "Tab for section A",
          p("Some content relevant for section A"),
          sliderInput(
            "obs",
            "Number of observations:",
            min = 0, max = 1000, value = 500
          )
        )
      })
    }
    if (req(input$nav) == "Section_B"){
      message("Section B has been selected")
      # added in edit
      shinyjs::addClass(selector = "aside.control-sidebar", class = "control-sidebar-open")
      output$side_bar <- renderUI({
        rightSidebarTabContent(
          id = "T_B",
          title = "Tab for section B",
          p("Some content relevant for section B"),
          textInput("caption", "Caption", "Data Summary")
        )
      })
    }

    if (req(input$nav) == "Section_C"){
      message("Section C has been selected")
      # added in edit
      shinyjs::removeClass(selector = "aside.control-sidebar", class = "control-sidebar-open")

      output$side_bar <- renderUI({ div() })
    }
  })
}


shinyApp(ui = ui, server = server)

Редактировать: сворачивание правой боковой панели при нажатии section C .После более внимательного прочтения поста, который вы связали, вы можете просто добавить

shinyjs::addClass(selector = "aside.control-sidebar", class = "control-sidebar-open")

в своем обозревателе, когда выбраны section A и section B, и добавить

shinyjs::removeClass(selector = "aside.control-sidebar", class = "control-sidebar-open")

, когда section C выбран.

Затем правая боковая панель будет расширяться и сворачиваться в зависимости от выбора в левой боковой панели.

GIF поведения:

enter image description here

...