Я modalDialog
app
Shiny
app
в котором пользователь может открыть modalDialog
, щелкнув точки в сюжете. В modalDialog
содержится график необработанных данных за точкой, нажатой. Пользователю представлен actionButton
связанный с кодом, чтобы сохранить подробный сюжет в modalDialog
с сообщением sweetalert
swal
с inputfield
. Проблема в том, что силы bootstrap
сосредотачиваются на modalDialog
, заставляя входное поле блокироваться от использования для ввода.
Я видел несколько javascipt
онлайн, которые должны перезаписать actioncefocus, но я не могу сделать эту работу в R
Фиктивный ниже код имеет такую же структуру, как и мое основное приложение, и я уменьшил его, насколько это возможно (возможно, оставило несколько ненужных libraries
, но все они используются в моем app
, и не должен вызывать проблемы. Все packages
являются наиболее последние версии.
Возможные решения используют этот код:
$.fn.modal.Constructor.prototype.enforceFocus = function () {};
или из бутстрапа 4
$.fn.modal.Constructor.prototype._enforceFocus = function() {};
Или более сложный подход javascipt
можно найти здесь: link3
Как заставить app
сосредоточиться на поле input
, а второй - вернуть фокус в modalDialog
после того, как sweetalert
закрыт?
Спасибо за любую помощь!
ПРИЛОЖЕНИЕ:
library(shiny)
library(shinyjs)
library(shinyBS)
library(sweetalertR)
library(shinyjqui)
# ui section --------------------------------------------------------------
jscode <- "
shinyjs.swalsavepulse = function(params) {
var defaultParams = {
title: null,
text : null
};
params = shinyjs.getParams(params, defaultParams);
swal({title : params.title, text : params.text,
type: 'input',
inputType : 'text',
html: true,
showCancelButton : false,
showConfirmButton : true,
closeOnConfirm: true,
confirmButtonColor: '#339FFF',
allowOutsideClick: true },
evalFunction = function(isConfirm){
if (isConfirm === true) {
var val1= 1;
Shiny.onInputChange('pulsefilename', [val1, Math.random()]);}
});
};"
ui <- fluidPage(
shinyjs::useShinyjs(), ### code for the sweetalerts
shinyjs::extendShinyjs(text = jscode), ### code for the sweetalerts
tags$head(
tags$script(src = "https://cdnjs.cloudflare.com/ajax/libs/sweetalert/1.0.1/sweetalert.min.js"), ### code for the sweetalerts
tags$link(rel = "stylesheet", type = "text/css", ### code for the sweetalerts
href = "https://cdnjs.cloudflare.com/ajax/libs/sweetalert/1.0.1/sweetalert.min.css") ### code for the sweetalerts
),
actionButton(inputId = "popup", label = "Popup")
)
# server section ----------------------------------------------------------
server <- function(input, output, session) {
observeEvent(input$popup, {
pulseModal <- function(failed = FALSE) {
modalDialog(
title = HTML(paste('<span style="color:white; font-size: 16px; font-weight:bold; font-family:sans-serif ">Pulse shape viewer<span>')),
actionButton(inputId = "message", label = "message"),
easyClose = TRUE,
footer = NULL) }
showModal(div(id= "modalPulse", pulseModal() ))
jqui_draggable(selector = '.modal-content')
})
observeEvent(input$message, {
shinyjs::js$swalsavepulse(title = '<span style="color:#339FFF; font-size: 30px">Save pulse shape<span>',
text = "Enter file name.")
})
}
shinyApp(ui, server)
Я не знаю, исправлена ли эта проблема, но вот мой ответ.
У меня была та же проблема, что и tabindex="-1"
на Bootstrap modal.
Как я исправил:
// call this before showing SweetAlert:
function fixBootstrapModal() {
var modalNode = document.querySelector('.modal[tabindex="-1"]');
if (!modalNode) return;
modalNode.removeAttribute('tabindex');
modalNode.classList.add('js-swal-fixed');
}
// call this before hiding SweetAlert (inside done callback):
function restoreBootstrapModal() {
var modalNode = document.querySelector('.modal.js-swal-fixed');
if (!modalNode) return;
modalNode.setAttribute('tabindex', '-1');
modalNode.classList.remove('js-swal-fixed');
}
Надеюсь, это поможет вам.