R/actionBusyButton.R

Defines functions actionBusyButtonUI actionBusyButton

#' @export
actionBusyButtonUI <- function(id, text = "Go", class = NULL){
  # indicators taken from https://github.com/daattali/advanced-shiny/tree/master/busy-indicator
  ns <- NS(id)
  loadingGif <- "data:image/gif;base64,R0lGODlhEAALAPQAAP///wAAANra2tDQ0Orq6gYGBgAAAC4uLoKCgmBgYLq6uiIiIkpKSoqKimRkZL6+viYmJgQEBE5OTubm5tjY2PT09Dg4ONzc3PLy8ra2tqCgoMrKyu7u7gAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCwAAACwAAAAAEAALAAAFLSAgjmRpnqSgCuLKAq5AEIM4zDVw03ve27ifDgfkEYe04kDIDC5zrtYKRa2WQgAh+QQJCwAAACwAAAAAEAALAAAFJGBhGAVgnqhpHIeRvsDawqns0qeN5+y967tYLyicBYE7EYkYAgAh+QQJCwAAACwAAAAAEAALAAAFNiAgjothLOOIJAkiGgxjpGKiKMkbz7SN6zIawJcDwIK9W/HISxGBzdHTuBNOmcJVCyoUlk7CEAAh+QQJCwAAACwAAAAAEAALAAAFNSAgjqQIRRFUAo3jNGIkSdHqPI8Tz3V55zuaDacDyIQ+YrBH+hWPzJFzOQQaeavWi7oqnVIhACH5BAkLAAAALAAAAAAQAAsAAAUyICCOZGme1rJY5kRRk7hI0mJSVUXJtF3iOl7tltsBZsNfUegjAY3I5sgFY55KqdX1GgIAIfkECQsAAAAsAAAAABAACwAABTcgII5kaZ4kcV2EqLJipmnZhWGXaOOitm2aXQ4g7P2Ct2ER4AMul00kj5g0Al8tADY2y6C+4FIIACH5BAkLAAAALAAAAAAQAAsAAAUvICCOZGme5ERRk6iy7qpyHCVStA3gNa/7txxwlwv2isSacYUc+l4tADQGQ1mvpBAAIfkECQsAAAAsAAAAABAACwAABS8gII5kaZ7kRFGTqLLuqnIcJVK0DeA1r/u3HHCXC/aKxJpxhRz6Xi0ANAZDWa+kEAA7AAAAAAAAAAAA"
  tagList(
    div(
      `data-for-btn` = ns("actionBusyButton"),
      actionButton(ns("actionBusyButton"),text, class = class),
      #button,
      span(
        class = "btn-loading-container",
        hidden(
          img(src = loadingGif, class = ns("btn-loading-indicator")),
          icon("check", class = ns("btn-done-indicator"))
        )
      ),
      hidden(
        div(class = "btn-err",
            div(icon("exclamation-circle"),
                tags$b("Error: "),
                span(class = "btn-err-msg")
            )
        )
      )
    )
  )
}

#' @export
actionBusyButton <- function(input,output,session, expr){

  ns <- session$ns
  buttonId <- ns("actionBusyButton")
  loadingEl <- sprintf(paste0("[data-for-btn=%s] .", ns("btn-loading-indicator")), buttonId)
  doneEl <- sprintf(paste0("[data-for-btn=%s] .", ns("btn-done-indicator")), buttonId)
  errEl <- sprintf(paste0("[data-for-btn=%s] .",ns("btn-err")), buttonId)

  # on.exit({
  #   shinyjs::enable(buttonId)
  #   shinyjs::hide(selector = loadingEl)
  # })



  buttonReactive <- eventReactive(input$actionBusyButton,{
    if(is.reactive(expr))
      expr <- expr()
    shinyjs::disable(buttonId)
    shinyjs::show(selector = loadingEl)
    shinyjs::hide(selector = doneEl)
    shinyjs::hide(selector = errEl)
    message("busyButton", input$actionBusyButton)
    out <- eval(expr)
    shinyjs::enable(buttonId)
    shinyjs::hide(selector = loadingEl)
    shinyjs::show(selector = doneEl)
    return(out)
  })
  buttonReactive
}
jpmarindiaz/dsAppModules documentation built on May 24, 2019, 4:07 a.m.