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

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

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

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

Мой код:

    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 <- ""


})

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...