76 lines
2.1 KiB
R
76 lines
2.1 KiB
R
#' File Upload Control
|
|
#'
|
|
#' Creates more accessible shiny file upload input.
|
|
#'
|
|
#' @inheritParams shiny::fileInput
|
|
#'
|
|
#' @seealso [shiny::fileInput()]
|
|
#'
|
|
#' @export
|
|
a11yFileInput <- function(
|
|
inputId, label, multiple = FALSE, accept = NULL, width = NULL,
|
|
buttonLabel = "Browse...", placeholder = "No file selected",
|
|
capture = NULL
|
|
) {
|
|
restoredValue <- shiny::restoreInput(id = inputId, default = NULL)
|
|
if (!is.null(restoredValue) && !is.data.frame(restoredValue)) {
|
|
warning("Restored value for ", inputId, " has incorrect format.")
|
|
restoredValue <- NULL
|
|
}
|
|
if (!is.null(restoredValue)) {
|
|
restoredValue <- jsonlite::toJSON(restoredValue, strict_atomic = FALSE)
|
|
}
|
|
|
|
inputTag <- htmltools::tags$input(
|
|
id = inputId,
|
|
class = "shiny-input-file",
|
|
name = inputId,
|
|
type = "file",
|
|
style = "position: absolute !important; top: -99999px !important; \
|
|
left: -99999px !important;",
|
|
`data-restore` = restoredValue
|
|
)
|
|
if (multiple) {
|
|
inputTag$attribs$multiple <- "multiple"
|
|
}
|
|
if (length(accept) > 0) {
|
|
inputTag$attribs$accept <- paste(accept, collapse = ",")
|
|
}
|
|
if (!is.null(capture)) {
|
|
inputTag$attribs$capture <- capture
|
|
}
|
|
htmltools::tags$div(
|
|
class = "form-group shiny-input-container",
|
|
style = htmltools::css(width = htmltools::validateCssUnit(width)),
|
|
htmltools::tags$label(
|
|
label,
|
|
class = "control-label",
|
|
class = if (is.null(label)) "shiny-label-null",
|
|
id = paste0(inputId, "-label"),
|
|
`for` = inputId
|
|
),
|
|
htmltools::tags$div(
|
|
class = "input-group",
|
|
htmltools::tags$div(
|
|
class = "input-group-btn input-group-prepend",
|
|
htmltools::tags$span(
|
|
class = "btn btn-default btn-file", buttonLabel
|
|
),
|
|
inputTag
|
|
),
|
|
htmltools::tags$input(
|
|
type = "text",
|
|
class = "form-control",
|
|
placeholder = placeholder,
|
|
readonly = "readonly",
|
|
`aria-label` = "Uploaded file name"
|
|
)
|
|
),
|
|
htmltools::tags$div(
|
|
id = paste(inputId, "_progress", sep = ""),
|
|
class = "progress active shiny-file-input-progress",
|
|
htmltools::tags$div(class = "progress-bar")
|
|
)
|
|
)
|
|
}
|