R/shiny_modified_inputs.R

Defines functions textInputCode textAreaInputAlt

Documented in textAreaInputAlt textInputCode

# ---- Modified Shiny Inputs ----
# The shiny package as a whole is distributed under GPL-3
# (GNU GENERAL PUBLIC LICENSE version 3).
# See https://github.com/rstudio/shiny/blob/master/LICENSE

#' Modified Text Area Input
#'
#' Standard [shiny::textAreaInput()] with additional `is_code` parameter, added
#' code font style for the input text and with `autocomplete`, `autocorrect`,
#' `autocapitalize` and `spellcheck` set to `off` or `false`.
#'
#' @inheritParams shiny::textAreaInput
#' @param is_code Should the text input be considered verbatim code input?
#' @family modified shiny inputs
textAreaInputAlt <- function(
  inputId,
  label,
  value = "",
  width = NULL,
  height = NULL,
  cols = NULL,
  rows = NULL,
  placeholder = NULL,
  resize = NULL,
  is_code = TRUE
) {
  value <- shiny::restoreInput(id = inputId, default = value)

  if (!is.null(resize)) {
    resize <- match.arg(resize, c("both", "none", "vertical", "horizontal"))
  }

  style <- paste(
    if (!is.null(width)) paste0("width: ", shiny::validateCssUnit(width), ";"),
    if (!is.null(height)) paste0("height: ", shiny::validateCssUnit(height), ";"),
    if (!is.null(resize)) paste0("resize: ", resize, ";"),
    if (is_code) 'font-family: "Monaco", "Inconsolata", monospace;'
  )

  parent_style <- paste(
    if (!is.null(width) && grepl("%", width)) paste0("width: ", width, ";"),
    if (!is.null(height) && grepl("%", height)) paste0("height: ", height, ";")
  )

  # Workaround for tag attribute=character(0) bug:
  #   https://github.com/rstudio/htmltools/issues/65
  if (length(style) == 0) style <- NULL

  shiny::div(
    class = "form-group shiny-input-container",
    tags$label(label, `for` = inputId),
    style = if (!parent_style %in% c(" ", "", "  ")) parent_style,
    shiny::tags$textarea(
      id = inputId,
      class = "form-control",
      placeholder = placeholder,
      style = style,
      rows = rows,
      cols = cols,
      autocomplete = "off",
      autocorrect = "off",
      autocapitalize = "off",
      spellcheck = "false",
      value
    )
  )
}

#' Modified Text Input
#'
#' Standard [shiny::textInput()] with additional `width` parameter, added code
#' font style for the input text and with `autocomplete`, `autocorrect`,
#' `autocapitalize` and `spellcheck` set to `off` or `false`.
#'
#' @inheritParams shiny::textInput
#' @param width Width of `shiny-input-container` div.
#' @param ... Extra elements to be included in the `input-group` div.
#' @family modified shiny inputs
textInputCode <- function(
  inputId,
  label,
  value = "",
  width = NULL,
  placeholder = NULL,
  ...
) {
  value <- shiny::restoreInput(id = inputId, default = value)

  shiny::div(
    class = "input-group shiny-input-container",
    style = if (!is.null(width)) paste0("width: ", shiny::validateCssUnit(width), ";"),
    tags$label(label, `for` = inputId),
    shiny::tags$input(
      id = inputId,
      type = "text",
      class = "form-control",
      value = value,
      style = 'font-family: "Monaco", "Inconsolata", monospace;',
      autocomplete = "off",
      autocorrect = "off",
      autocapitalize = "off",
      spellcheck = "false",
      placeholder = placeholder
    ),
    ...
  )
}
gadenbuie/regexhelp documentation built on June 1, 2021, 4:24 p.m.