Shiny: Desative tabPanel () usando shinejs

Oct 13 2020

Estou usando a resposta de @SriPaladugu fornecida aqui para desabilitar um tabPanel()e percebi que não funciona se houver um espaço em tabPanel(title,...). Eles escreveram seu próprio código JavaScript e usaram shinyjspara ativar / desativar painéis e não estou familiarizado com o código JavaScript para corrigir esse problema. O código que faz isso é armazenado no objeto jscode; como pode o código ser modificado para dar conta de espaços em tabPanel(title,...)?

library(shiny)
library(shinyjs)

jscode <- "
shinyjs.disableTab = function(name) {
var tab = $('.nav li a[data-value=' + name + ']'); tab.bind('click.tab', function(e) { e.preventDefault(); return false; }); tab.addClass('disabled'); } shinyjs.enableTab = function(name) { var tab = $('.nav li a[data-value=' + name + ']');
tab.unbind('click.tab');
tab.removeClass('disabled');
}
"
css <- "
.nav li a.disabled {
background-color: #aaa !important;
color: #333 !important;
cursor: not-allowed !important;
border-color: #aaa !important;
}"



ui <- shinyUI(fluidPage(
  shinyjs::useShinyjs(),
  shinyjs::extendShinyjs(text = jscode, functions = c("disableTab","enableTab")),
  shinyjs::inlineCSS(css),
  navbarPage("Test",id="navbarPage",
             tabPanel("FirstTab", id = "first_tab",
                      sidebarLayout(
                        sidebarPanel(),
                        mainPanel()
                      )
             ),
             tabPanel("Secondtab", id = "second_tab",
                      sidebarLayout(
                        sidebarPanel(),
                        mainPanel()
                      )
             ),
             tabPanel("Third tab", id = "third_tab",
                      sidebarLayout(
                        sidebarPanel(),
                        mainPanel()
                      )
             )
             )
))

server <- shinyServer(function(input, output, session) {
  # disable tabs Exposure, Covariate, and Construct on page load
  shinyjs::js$disableTab("Secondtab") shinyjs::js$disableTab("Third tab")
})

# Run the application
shinyApp(ui = ui, server = server)


Respostas

1 bretauv Oct 13 2020 at 03:16

Acho que você pode simplificar seu código, seguindo esta resposta e a documentação de shinyjs::disable():

library(shiny)
library(shinyjs)

css <- "
.nav li a.disabled {
background-color: #aaa !important;
color: #333 !important;
cursor: not-allowed !important;
border-color: #aaa !important;
}"

ui <- shinyUI(fluidPage(
  shinyjs::useShinyjs(),
  shinyjs::inlineCSS(css),
  navbarPage("Test",id="navbarPage",
             tabPanel("FirstTab", id = "first_tab",
                      sidebarLayout(
                        sidebarPanel(),
                        mainPanel()
                      )
             ),
             tabPanel("Secondtab", id = "second_tab",
                      sidebarLayout(
                        sidebarPanel(),
                        mainPanel()
                      )
             ),
             tabPanel("Third tab", id = "third_tab",
                      sidebarLayout(
                        sidebarPanel(),
                        mainPanel()
                      )
             )
  )
))

server <- shinyServer(function(input, output, session) {
  # disable tabs Exposure, Covariate, and Construct on page load
  shinyjs::disable(selector = '.navbar-nav a[data-value="Secondtab"')
  shinyjs::disable(selector = '.navbar-nav a[data-value="Third tab"')
})

# Run the application
shinyApp(ui = ui, server = server)

Apenas para completar esta resposta, para obter data-value, abra o aplicativo no navegador, faça Ctrl + Shift + C, passe o mouse sobre a aba desejada e verifique seu data-valueargumento no Inspetor.