Как установить фокус на поле ввода текста после загрузки модального диалога в приложении R shiny?

#javascript #r #shiny

#javascript #r #блестящий

Вопрос:

Я создаю приложение для сканирования штрих-кодов, чтобы убедиться, что метка основного штрих-кода соответствует всем меткам вторичного штрих-кода, сгенерированным из основного. Текущая итерация использует диалоги R, shiny и modal для сканирования этикеток со штрих-кодом.

Я бы хотел, чтобы приложение автоматически фокусировалось на полях ввода текста после появления модального окна, чтобы пользователю не приходилось нажимать на поле ввода или вкладку к нему перед сканированием метки. Я читал, что функция фокусировки JS может быть подходящей, но я не уверен, где эта функция должна быть реализована. Мы ценим вашу помощь.

 .libPaths(c(.libPaths(), temp <- tempdir()))
if(!require(shiny)) {install.packages("shiny", lib=temp, repos='http://cran.us.r-project.org')}
if(!require(shinyWidgets)) {install.packages("shinyWidgets", lib=temp, repos='http://cran.us.r-project.org')}
if(!require(shinyalert)) {install.packages("shinyalert", lib=temp, repos='http://cran.us.r-project.org')}
if(!require(devtools)) {install.packages("devtools", lib=temp, repos='http://cran.us.r-project.org')}
if(!require(shinyBarcode)) {devtools::install_github("CannaData/shinyBarcode")}
if(!require(shinyjs)) {install.packages("shinyjs", lib=temp, repos='http://cran.us.r-project.org')}
if(!require(V8)) {install.packages("V8", lib=temp, repos='http://cran.us.r-project.org')}

library(shiny)
library(shinyWidgets)
library(shinyalert)
library(shinyBarcode)
library(shinyjs)
library(V8)

options(shiny.sanitize.errors = TRUE)

options(rsconnect.max.bundle.size="xxxlarge")
  
ui <- fluidPage(
  
  # must include javascript dependencies
  useShinyalert(), # Set up shinyalert
  
  shinyBarcode::includeJsBarcode(cdn = TRUE),
  shinyBarcode::barcodeOutput("barcode"),

  useShinyjs(),
  extendShinyjs(script = "beep.js"),
  extendShinyjs(script = "beep2.js"),

)

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

  vals <- reactiveValues(txt = NULL)
  
  # Create modals
  primary <- function(failed = FALSE) {
    modalDialog(
      textInput("txt", "Scan primary tube"),
      footer = NULL,
      actionButton("reset", "Reset")
    )
  }
  
  secondary <- function(failed = FALSE) {
    modalDialog(
      textInput("txt2", "Scan secondary tube"),
      footer = NULL,
      actionButton("reset", "Reset")
    )
  }
  
  # Show modal on startup
  showModal(primary())

  observeEvent(input$txt, {
    if (!is.null(input$txt) amp;amp; nzchar(input$txt)) {
      vals$txt <- input$txt
      removeModal()
      showModal(secondary())
    } else {
      showModal(primary(failed = TRUE))
    }
  })
  
  observeEvent(input$txt2, {
    if (!is.null(input$txt2) amp; nzchar(input$txt2) amp; input$txt2!="Reset") {
      vals$txt2 <- input$txt2
      removeModal()
      if (vals$txt2==vals$txt) {
        js$beep()
        showModal(secondary())
      }
      else if (vals$txt2!=vals$txt) {
        js$beep2()
        shinyalert("Error", "Primary and secondary labels do not match", type = "error")
        showModal(secondary())
      }
    } else if (!is.null(input$txt2) amp; nzchar(input$txt2) amp; input$txt2=="Reset"){
      showModal(primary())
    } else {
      showModal(secondary(failed = TRUE))
    }
  })
  
  observeEvent(input$reset, {
    showModal(primary())
    })
  
  output$barcode <- shinyBarcode::renderBarcode(vals$txt)

}

shinyApp(ui = ui, server = server)