Code Monkey home page Code Monkey logo

Comments (3)

justacec avatar justacec commented on June 20, 2024

My suspicion on this is that the downloadButton is hidden inside the react_data structure which is rendered after the page has been downloaded after the server function is executed. When the server function executes, there is no button in the DOM for the id selector to catch it, and therefore the href is not updated to the correction value.

A fix for this would be some sort of callback to be executed after the data is rendered, but not sure how that would work.

A secondary deeper dirtier fix for this would be to have a hidden download button on the main page with reactive values for the filename and the data that can be updated by later nested modules. The reactive values would just need to be passed to each of the follow-on modules.

I am not sure if this is the issue, what are your thoughts?

from shiny.fluent.

justacec avatar justacec commented on June 20, 2024

I have a potential working solution which honors keeping all of the relevant code in the same file (for modularity) and it supports nested modules cleanly. The idea is to inject a static hidden download button from the server function right after the body tag which means that it completly circumvents the React system. Then, when the downloadHandler is called, the DOM contains the element.

library(shiny)
library(shiny.fluent)
library(shinyjs)

ui <- fluentPage(
  useShinyjs(),

  # This one is outside the Pivot and will likely work correctly
  div(
    downloadButton("download_outside", label = "")
  ),

  Pivot(
    PivotItem(id = 'pivot1', headerText = 'One', alwaysRender = TRUE, tagList(
      # This one is inside the Pivot and will not work correctly
      div(
        PrimaryButton.shinyInput('downloadButton', text = 'Download', iconProps = list(iconName = "Download"))      )
    ))
  )
)

server <- function(input, output, session) {
  insertUI('body', 'afterBegin', session = session, ui = tagList(
      div(
      style = 'visibility: hidden; display: none',
      downloadButton('download_inside', label = 'Download')
      )
  ))

  observeEvent(input$downloadButton, {
    click('download_inside')
  })

  output$download_inside <- downloadHandler(
    filename = function() {
      paste("data-", Sys.Date(), ".csv", sep="")
    },
    content = function(file) {
      write.csv(iris, file)
    }
  )

  output$download_outside <- downloadHandler(
    filename = function() {
      paste("data-", Sys.Date(), ".csv", sep="")
    },
    content = function(file) {
      write.csv(iris, file)
    }
  )

  outputOptions(output, 'download_inside', suspendWhenHidden = FALSE)

}

shiny::runApp(shinyApp(ui, server), launch.browser = FALSE)

from shiny.fluent.

jakubsob avatar jakubsob commented on June 20, 2024

Thanks @justacec for taking time to submit such a detailed description of the issue.

The issue boils down to downloadHandler not working in reactContext, we'll use this example as a starting point to fixing the issue:

library(shiny)
library(shiny.fluent)
library(shinyjs)

ui <- fluentPage(
  useShinyjs(),
  # This one is outside the Pivot and will likely work correctly
  downloadButton("download_outside", label = ""),
  shiny.react:::ReactContext(
    # This one is inside the Pivot and will not work correctly
    downloadButton("download_inside", label = "")
  )
)

server <- function(input, output, session) {  
  output$download_inside <- downloadHandler(
    filename = function() {
      paste("data-", Sys.Date(), ".csv", sep="")
    },
    content = function(file) {
      write.csv(iris, file)
    }
  )

  output$download_outside <- downloadHandler(
    filename = function() {
      paste("data-", Sys.Date(), ".csv", sep="")
    },
    content = function(file) {
      write.csv(iris, file)
    }
  )
}

shiny::runApp(shinyApp(ui, server))

from shiny.fluent.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.