#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)