---
title: "loadingButton and showToast"
author: "Andy Merlino"
date: "`r Sys.Date()`"
output: rmarkdown::html_vignette
vignette: >
%\VignetteIndexEntry{loadingButton and showToast}
%\VignetteEngine{knitr::rmarkdown}
%\VignetteEncoding{UTF-8}
---
# loadingButton
`loadingButton` is similar to `shiny::actionButton()` but, when clicked, it
changes styles to resemble a loading state. Your Shiny app can then make some
calculations or execute some database queries while the button is in this loading
state. Once your app is done loading, call `resetLoadingButton()` to restore the
loading button to an active state.
```{r, eval = FALSE}
library(shiny)
library(shinyFeedback)
ui <- fluidPage(
fluidRow(
column(
12,
br(),
loadingButton(
"myLoadingButton",
label = "Submit"
),
loadingButton(
"myCancelButton",
label = "Cancel",
class = "btn btn-danger",
loadingLabel = "Cancelling...",
)
)
)
)
server <- function(input, output, session) {
# reset the loadingButton to its active state after 3 seconds
observeEvent(input$myLoadingButton, {
Sys.sleep(3)
resetLoadingButton("myLoadingButton")
})
observeEvent(input$myCancelButton, {
Sys.sleep(3)
resetLoadingButton("myCancelButton")
})
}
shinyApp(ui, server)
```
# showToast
Show a toast notification. `showToast()` wraps the JavaScript [toastr library](https://github.com/CodeSeven/toastr). To use `showToast()` include `useShinyFeedback()`
at the top of your ui. If you only want to use the toasts you can set the "feedback" argument
to `FALSE` to only include css and js for the toasts.
```{r, eval = FALSE}
library(shiny)
library(shinyFeedback)
ui <- fluidPage(
useShinyFeedback(feedback = FALSE),
fluidRow(
column(
12,
br(),
loadingButton(
"myFirstButton",
label = "Submit"
)
)
)
)
server <- function(input, output, session) {
# reset the loadingButton to its active state after 2 seconds
observeEvent(input$myFirstButton, {
Sys.sleep(2)
resetLoadingButton("myFirstButton")
showToast(
"success",
"I'll toast to that!"
)
})
}
shinyApp(ui, server)
```
shinyFeedback is not the first R package to wrap the toastr JavaScript library. The [shinytoastr package](https://github.com/MangoTheCat/shinytoastr) did this years ago. The main difference between the `shinyFeedback::showToast()` implementation and `shinytoastr`'s is that we
supply a ".options" argument rather than having an argument for each toastr option. This allows
you to more easily set global toast options. e.g.
```{r, eval = FALSE}
# use this list for all your toasts
myToastOptions <- list(
positionClass = "toast-top-right",
progressBar = FALSE,
timeOut = 3000,
closeButton = TRUE,
# same as defaults
newestOnTop = TRUE,
preventDuplicates = FALSE,
showDuration = 300,
hideDuration = 1000,
extendedTimeOut = 1000,
showEasing = "linear",
hideEasing = "linear",
showMethod = "fadeIn",
hideMethod = "fadeOut"
)
library(shiny)
library(shinyFeedback)
ui <- fluidPage(
useShinyFeedback(feedback = FALSE),
fluidRow(
column(
12,
br(),
loadingButton(
"myLoadingButton",
label = "Submit"
),
loadingButton(
"myErrorButton",
label = "Error",
class = "btn btn-danger",
loadingLabel = "Erroring...",
)
)
)
)
server <- function(input, output, session) {
# reset the loadingButton to its active state after 2 seconds
observeEvent(input$myLoadingButton, {
Sys.sleep(2)
resetLoadingButton("myLoadingButton")
showToast(
"success",
"I'll toast to that!",
.options = myToastOptions
)
})
observeEvent(input$myErrorButton, {
Sys.sleep(2)
resetLoadingButton("myErrorButton")
showToast(
"error",
"Your toast is on fire!",
.options = myToastOptions
)
})
}
shinyApp(ui, server)
```