Я создаю блестящую панель инструментов для отображения большого количества данных. Люди получают доступ к панели инструментов через отдельную страницу входа (не блестящую), которая находится впереди, после чего генерируется JWT и помещается в повар ie. Мне удалось прочитать в поваре ie в Shiny и проанализировать данные, сохранив токен в переменную с именем userPermissions
. Теперь, однако, Я хотел бы показать / скрыть вкладки на панели инструментов в зависимости от прав пользователя.
Например: у меня есть данные как о менеджерах, так и о помощниках. Я хочу показать данные менеджера любому пользователю с userPermissions == 'manager'
, а данные помощника любому пользователю с userPermissions == assistant
.
Я подумал, что лучше всего будет использовать conditionalPanel()
- вот (упрощенный) воспроизводимый пример:
library(shiny)
# UI file
ui <- fluidPage(
# JS to read cookie -- simplified to just return value!
tags$head(tags$script(
HTML('
Shiny.addCustomMessageHandler("goReadTheCookie", function (message) {
Shiny.onInputChange("cookie", "manager");
})
')
)
# Title
,titlePanel('Test')
# Navbar
,navbarPage(
id="navbar"
,conditionalPanel(condition = "userPermissions() == 'manager'",
mainPanel(textOutput('Manager data')))
,conditionalPanel(condition = "userPermissions() == 'assistant'",
mainPanel(textOutput('Assistant data')))
)
))
# Server file
server <- shinyServer(function(input, output,session){
## Grab permissions from Cookie
# Prepare output
userPermissions <- reactiveVal("")
# Tell JS to return cookie
session$sendCustomMessage(type="goReadTheCookie", message=list(name="cookie_name"))
# Listen for cookie
observeEvent(input$cookie,{
## -- Bunch of code omitted for sake of brevity -- ##
userPermissions("manager")
})
})
# Run app
shinyApp(ui=ui, server=server)
Проблема с этим кодом заключается в том, что в консоли браузера я получите ошибку Can't find variable: userPermissions
.
Я предполагаю, что здесь происходит то, что весь ui
выполняется, прежде чем JS сможет схватить и вернуть повара ie. Что было бы лучшим способом решить это?
Или, может быть, я поступаю неправильно. Очевидно, мне нужно проверить, что сервер ie на стороне сервера (т. Е. В R
) не разглашает секрет; и предпочтительно эта проверка, и скрытие / отображение завершено в самом начале приложения Shiny (userPermissions
не изменится во время сеанса). Может быть, есть другое (и лучшее) решение, чтобы добраться до этой точки?
Любая помощь будет очень признательна!