Used to construct a multi-page modal dialog. Next and Back buttons are used to navigate the pages sequentially. Optional validation functions may be specified for each page. A callback function may be specified to obtain the user's inputs.

slatesModalMultiPage(
  id,
  session,
  pages.ui,
  submit.fun,
  validators = NULL,
  back.button = TRUE,
  default.size = c("m", "s", "l", "xl"),
  observers = list()
)

Arguments

id

dialog id

session

shiny server session

pages.ui

a list of functions, each used to build a page. These functions may define any number of arguments used to build the page's UI. The return value of these functions should be a valid shiny.tag definition.

submit.fun

a function that returns the results of the user interaction with the modal dialog. The return value should be a list with named elements.

validators

a list of functions used to validate the state of each page. A user may not proceed to the next page of the modal dialog until the validator function for the current page returns TRUE.

back.button

whether or not to show the back button on the modal's pages.

observers

a list containing any number of observers. This is used solely to allow the modal dialog to destroy the observers when it is destroyed.

size

default width of the modal dialog. One of "s", "m", "l", "xl". Note that the show() function can override this setting if desired.

Value

A list containing the modal id and the show() function (see details below).

Details

After creating the modal dialog, the show function is used to display it. This function takes in a mandatory callback argument, and optional title. When the user exits the dialog by pressing the OK button, the provided callback function is called with each argument named as an element of the result from submit.fun. Additional arguments provided to the show method will be passed on to the UI definition functions provided in pages.ui. See example below.

Examples

if (interactive()) { exampleMultiPageModal <- function(id, session) { ID <- function(x) paste0(id, "_", x) ns <- session$ns input <- session$input pages.ui <- list( function(common.label, text.value = "") { tagList( helpText("Hello there! This is page 1! Please enter less than 5 characters."), textInput(ns(ID("text_input")), label = common.label, value = text.value) ) }, function(common.label, numeric.value) { tagList( helpText("Hi again! We're on page 2 now. Enter 42 below."), numericInput(ns(ID("numeric_input")), label = common.label, value = numeric.value) ) } ) submit.fun <- function() { list(text.value = session$input[[ ID("text_input") ]], numeric.value = session$input[[ ID("numeric_input") ]]) } validators <- list( function() { return(nchar(input[[ ID("text_input") ]]) < 5) }, function() { return(input[[ ID("numeric_input") ]] == 42) } ) slatesModalMultiPage(id, session, pages.ui = pages.ui, submit.fun = submit.fun, validators = validators) } app <- shinyApp( ui = fluidPage( shinyjs::useShinyjs(), actionButton("show", "Show Modal") ), server = function(input, output, session) { modal <- exampleMultiPageModal("modal", session) observeEvent(input$show, { modal$show( common.label = "Some input", text.value = "Something", numeric.value = 41, title = "Example Multi-Page Modal", callback = function(text.value, numeric.value) { print(paste("Modal returned:", text.value, ",", numeric.value)) } ) }) } ) runApp(app) }