Как отображать разные вкладки заголовков в Shiny в зависимости от разрешения пользователя?

Я работаю с функцией входа в систему для блестящего веб-сайта, где разные пользователи имеют доступ к разным вещам (базовым и продвинутым). Я пытаюсь создать новую вкладку, подобную той, что называется «Личная страница», доступ к которой должны иметь только опытные пользователи.

Разделение между продвинутыми и обычными пользователями, похоже, работает нормально, однако при этом я изо всех сил пытаюсь создать новую видимую вкладку. Он создает «дополнительную» вкладку без имени (см. Прикрепленное изображение), где я хочу, чтобы вкладка выглядела как «Личная страница».

см. изображение здесь

Мой код:

    ui <- navbarPage(title = "TBI Rehabilitation",
                 theme = "style/style.css",
                 fluid = FALSE,
                 collapsible = TRUE,
                 inverse = FALSE,

                 div(class = "login",
                     uiOutput("uiLogin"),
                     textOutput("pass"),
                     tags$head(tags$style("#pass{color: red;"))),

                 div(class = "login",
                     uiOutput("permission")),

                 div(class = "login",
                     uiOutput("body")),


                 fluidRow(
                   column(8,
                          div(class = "logininfo",
                              uiOutput("userPanel")
                          ))),

                 tabPanel("Personal page",icon=icon("spa"),
                                           h1("This works fine here. 
                                         But needs to be moved to Login function 
                                        in order to make the tab available only
                                        for the advanced user"))
)



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

  USER <- reactiveValues(Logged = FALSE , session = session$user) 

  source("www/Login.R",  local = TRUE)

}


shinyApp(ui = ui, server = server) 

и код для моей функции входа в систему:

PASSWORD <- data.frame(
  user = c("patient","caregiver"), 
  pw = c("0000","1234"),
  permission  = c("basic", "advanced"), 
  stringsAsFactors = F
)

output$uiLogin <- renderUI({
  if (USER$Logged == FALSE) {
    wellPanel(
      textInput("userName", "Username:"),
      passwordInput("passwd", "Password:"),
      br(),
      actionButton("Login", "Login")
    )
  }
})


output$body <- renderUI ({
  if (USER$Logged == TRUE) {
    if (PASSWORD[,"permission"][which(PASSWORD$user==input$userName)]=="advanced"){
      tabItems( 
        tabItem(
          title = "Test",class = "active",
          h2("test Test ")),
        p(strong("Test - Advanced access")))

    }
    else {
      tabItems(
        tabPanel(
          title = "Test - Basic access "))

    }
  }
})   

output$permission <- renderUI ({
  if (USER$Logged == TRUE) {
    if (PASSWORD[,"permission"][which(PASSWORD$user==input$userName)]=="advanced"){
      tabItems( 
        tabPanel("Test",tabName = "Advanced access test Page", icon=icon("user"))
      )

    }
    else {
      tabItems(
        tabPanel(
          title = "Basic access test page"))


    }
  }
})     



output$pass <- renderText({  
  if (USER$Logged == FALSE) {
    USER$pass
  }  
})


# Login info during session ----
output$userPanel <- renderUI({
  if (USER$Logged == TRUE) {
    fluidRow(
      column(2,
             "User: ", USER$name
      ),
      column(1, actionLink("logout", "Logout"))
    )
  }  
})

# control login
observeEvent(input$Login , {
  Username <- isolate(input$userName)
  Password <- isolate(input$passwd)
  Id.username <- which(PASSWORD$user == Username)
  Id.password <- which(PASSWORD$pw    == Password)
  if (length(Id.username) > 0 & length(Id.password) > 0) {
    if (Id.username == Id.password) {
      USER$Logged <- TRUE 
      USER$name <- Username   

    } 
  } else {
    USER$pass <- "User name or password failed!"
  }
})

# control logout
observeEvent(input$logout , {
  USER$Logged <- FALSE
  USER$pass <- ""


})

Я пробовал много разных вариантов (с разными ошибками), но на данный момент я получаю следующую ошибку: Ожидается, что тег будет иметь класс «панель вкладок». Я получаю ту же ошибку, если я изменяю class = 'login' на class = 'tab-pane' для uiOutput («разрешение») и uiOutput («тело»).

Есть ли простой способ отображать разные вкладки (в заголовке, а не на боковой панели) в зависимости от разрешения пользователя?


person Matilde Nesheim    schedule 09.05.2020    source источник
comment
Спасибо @Бен. Я пробовал, но тоже не смог, к сожалению.   -  person Matilde Nesheim    schedule 09.05.2020
comment
Это немного запутано в отношении макета, который вы здесь планировали. Существуют другие примеры добавления вкладок ( помимо моей предыдущей рекомендации) на navbarPage. Может быть, вы хотите начать с них?   -  person Ben    schedule 10.05.2020
comment
Спасибо @Бен! Оно работает! В итоге я использовал только пароль и не использовал имя пользователя на сервере вместе с hideTab + showTab, перейдя по ссылке, которую вы разместили. Большое спасибо :)   -  person Matilde Nesheim    schedule 10.05.2020