RhoInc / datadigest

Concise interactive data summaries in R
https://rhoinc.github.io/web-codebook/test-page/default/
Other
58 stars 9 forks source link

Add Inputs for loading additional data on the "files" tab #4

Open jwildfire opened 7 years ago

jwildfire commented 7 years ago

Add inputs to the .instructions section of the files tab that allow users to add files to the codebook.

jwildfire commented 7 years ago

There are a few steps to figure out.

1) Once the files tab is drawn server.R add the buttons to the tab (this isn't done by the javascript library) 2) When a button is clicked, the file or files should be added to the files table (this requires passing info from client -> server -> client)

jwildfire commented 7 years ago

A few (possibly) helpful links:

jwildfire commented 7 years ago

Pretty sure we want to use observeEvent() for these. This example is close, but we need to trigger on a custom js from codebook.js ("renderComplete" or whatever we choose to call it) instead of a named input (input$go):

  shinyApp(
    ui = basicPage(actionButton("go", "Go")),
    server = function(input, output, session) {
      observeEvent(input$go, {
        insertUI("#go", "afterEnd",
                 actionButton("dynamic", "click to remove"))

        # set up an observer that depends on the dynamic
        # input, so that it doesn't run when the input is
        # created, and only runs once after that (since
        # the side effect is remove the input from the DOM)
        observeEvent(input$dynamic, {
          removeUI("#dynamic")
        }, ignoreInit = TRUE, once = TRUE)
      })
    }
  )
}

EDIT: No longer convinced observeEvent() is the way to go. Not clear to me if you can trigger this based on an output changing state, or if it has to be an input. Not able to find an example where this triggers on an arbitrary js event (although seems like it should be doable ...)

jwildfire commented 7 years ago

This looks like a good option for js -> R -> js rendering. Can be used to trigger an update in the files table once a new file is added.

jwildfire commented 7 years ago

And this might be the way to add content after the initial loads. Can be used to add the file upload buttons after the explorer Shiny output is validated.

jwildfire commented 7 years ago

Simple implementation of part #1 ("Once the files tab is drawn server.R adds the buttons to the tab") done like so:

    Sys.sleep(1)
    insertUI(
      selector="div.explorer div.instructions.section",
      where="beforeEnd",
      ui=fileInput('datafile','Upload a file',accept = c('.sas7bdat','.csv'))
    )

Need to add in some of bootstrap's CSS to make it look decent and would be better to trigger on a call back, but all things considered, waiting for a second works reasonably well ...

jwildfire commented 7 years ago

One is basically good to go. Going to create separate issues for part 2 below:

  1. Once the files tab is drawn server.R add the buttons to the tab (this isn't done by the javascript library)
  2. When a button is clicked, the file or files should be added to the files table (this requires passing info from client -> server -> client)
jwildfire commented 7 years ago

Alas, bumping from v0.2.0. Sys.sleep() didn't play nice with interactivity. Seems like we probably need to use a more typical javascript event workflow to do this. Will tackle in a future version.