Comments (3)
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.
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.
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)
- shiny.fluent::runExample("demo") returns Error in $: $ operator is invalid for atomic vectors
- Temporary alert for application users HOT 1
- [docs] add shiny.router on DESCRIPTION HOT 1
- selected item in navigation bar after clicking route_link HOT 2
- Refactor E2E tests to make them more resilient and easy to maintain
- Move CommandBar binding to JavaScript
- 'TimePicker' is not an exported object from 'namespace:shiny.fluent'
- The PivotItem resets state whenever the tab is changed HOT 2
- Enable reactableOutput to be used in shiny.fluent HOT 2
- Errors do not propagate into R console
- Add few examples for R users how to work the DetailsList
- Bugs: cannot provide/override props of SpinButton.shinyInput HOT 1
- `SpinButton.shinyInput` uses `value` improperly
- DatePicker.shinyInput returning date one day before selection HOT 1
- Bump version of shiny.react to 0.4.0 after it's accepted on CRAN
- Bug: Checkbox props `defaultChecked` being overwritten by `Value`
- v0.4.0 - CommandBarItem and ComboBox.shinyInput
- Bug: `reactOutput` may failed to render if there are nested React components within `div`
- `setInput()` example from documentation not working
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from shiny.fluent.