Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add 312-bslib-sidebar-resize #166

Open
wants to merge 29 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
dca0e3c
Add 312-bslib-sidebar-resize (manual app)
gadenbuie May 8, 2023
eac7185
Use `page_navbar()` for shared sidebar
gadenbuie May 9, 2023
daf5438
Programmatically test sidebar transition
gadenbuie May 9, 2023
db7723f
Generate apps deps (GitHub Actions)
gadenbuie May 9, 2023
ff5c45b
Update tests to use `diff()` and to include labels on all expectations
gadenbuie May 9, 2023
620c85c
Merge 'origin/main' into '312-bslib-sidebar-resize'
gadenbuie May 9, 2023
3673e29
Generate apps deps (GitHub Actions)
gadenbuie May 9, 2023
844bf7f
Refactor test code to avoid duplication
gadenbuie May 10, 2023
6164d43
Another small refactor for better failure backtraces
gadenbuie May 10, 2023
9eaee9a
Add client-size htmlwidget resizing test
gadenbuie May 15, 2023
0f8ef3c
Remove call to `browser()`
gadenbuie May 15, 2023
247df09
Merged origin/main into 312-bslib-sidebar-resize
gadenbuie May 18, 2023
50767b2
add debugging for windows and limit to just windows
gadenbuie May 18, 2023
2e443c3
debug: try again
gadenbuie May 18, 2023
b78e103
debug: more output printing
gadenbuie May 18, 2023
e7ad0ed
Revert debugging changes
gadenbuie May 19, 2023
6e42aea
Use `nav_panel()`
gadenbuie May 19, 2023
93831c8
Rename test file
gadenbuie May 19, 2023
d0f224d
Skip transition animation tests on windows
gadenbuie May 19, 2023
eb49d67
Split out helper code, split tests into blocks
gadenbuie May 19, 2023
09ecf09
Add README for 312
gadenbuie May 19, 2023
38fa35c
skip on windows without help from {shinycoreci}
gadenbuie May 19, 2023
509aca1
Merge 'origin/main' into '312-bslib-sidebar-resize'
gadenbuie May 20, 2023
610e93c
Generate apps deps (GitHub Actions)
gadenbuie May 20, 2023
c11a494
test again after routine file changes
gadenbuie May 20, 2023
52612da
bring back some debugging output
gadenbuie May 22, 2023
bee1c57
slow down transition to see if that helps
gadenbuie May 22, 2023
452178b
Hide debug messages behind envvar
gadenbuie May 22, 2023
8671d17
Add a `$wait_for_js()` to keep test in sync with browser
gadenbuie May 22, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions R/data-apps-deps.R
Original file line number Diff line number Diff line change
Expand Up @@ -60,5 +60,6 @@ apps_deps_map <- list(`001-hello` = "rsconnect", `012-datatables` = "ggplot2",
"rversions"), `305-bslib-value-box` = c("rlang", "rversions"
), `309-flexdashboard-tabs-navs` = "rmarkdown", `310-bslib-sidebar-dynamic` = c("rversions",
"testthat"), `311-bslib-sidebar-toggle-methods` = c("rversions",
"testthat"), `313-bslib-card-tab-focus` = c("rversions",
"testthat", "withr"))
"testthat"), `312-bslib-sidebar-resize` = c("ggplot2", "withr"
), `313-bslib-card-tab-focus` = c("rversions", "testthat",
"withr"))
15 changes: 15 additions & 0 deletions inst/apps/312-bslib-sidebar-resize/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# 312-bslib-sidebar-resize

## Description

`312-bslib-sidebar-resize` tests that outputs and htmlwidgets inside the main content area of sidebar layouts animate through the sidebar resizing transition. The test app includes three pages:

1. A layout with two ggplot2 plots created via `plotOutput()`. During the sidebar resizing transition, the plots should stretch. This causes some visible distortion of the image. When the transition is complete, the server updates the plot at the new resolution and the image should "snap" into place.

2. A layout with two plotly plots created via `plotlyOutput()`. During the sidebar resizing transition, the plots should grow or shrink smoothly to match the available space in the content area of the layout.

3. A layout with two htmlwidgets created via `plot_ly()`. During the sidebar resizing transition, the widgets should grow or shrink smoothly to match the available space in the content area of the layout.

## Notes

The animation is not smooth on Windows, at least on CI. The test suite currently skips testing around the plot animation on Windows, but does test the sidebar state. Manual testing on Windows should confirm that the animation is smooth.
144 changes: 144 additions & 0 deletions inst/apps/312-bslib-sidebar-resize/app.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
library(shiny)
library(bslib)
library(ggplot2)
library(plotly)

lorem1 <- p(
"Dolor cursus quis sociis, tempus laoreet integer vel,",
"nam suscipit sodales curabitur tristique. Hac massa",
"fames auctor ac posuere, non: primis semper egestas!",
"Porttitor interdum lobortis elementum arcu."
)

lorem2 <- p(
"Elit aptent vivamus, eu habitasse fringilla venenatis",
"viverra tellus metus. Maecenas ultrices fermentum",
"nunc turpis libero nascetur!"
)

ui <- page_navbar(
title = "312 | bslib-sidebar-resize",
theme = bs_theme(
"bslib-sidebar-transition-duration" = Sys.getenv("SIDEBAR_TRANSITION_TIME", "0.5s")
),
sidebar = sidebar(
title = "Shared Sidebar",
id = "sidebar-shared",
open = "open",
p("The plots should resize smoothly when this sidebar or the local sidebar are toggled.")
),
nav_panel(
"Static",
h2("Static plot resizing"),
p(
"The plot in the layout below should stretch while the sidebar is",
"opening or closing. After the transition is complete, the server will",
"update the plot with the final dimensions."
),
layout_sidebar(
sidebar = sidebar(
title = "Toggle me",
id = "sidebar-local-static",
lorem1, lorem2, lorem1
),
lorem1,
plotOutput("plot_static_local"),
lorem2
),
h2("Shared only", class = "my-3"),
p(
"The next plot should resize smoothly only when the shared sidebar is transitioning."
),
div(
class = "row",
div(class = "col-6", plotOutput("plot_static_shared")),
div(class = "col-6", lorem2, lorem1)
)
),
nav_panel(
"Widget",
h2("Widget plot resizing"),
p(
"The plot in the layout below should stretch while the sidebar is opening",
"or closing. There should be no layout shift after the transition is",
"complete."
),
layout_sidebar(
sidebar = sidebar(
title = "Toggle me",
id = "sidebar-local-widget",
lorem1, lorem2, lorem1
),
lorem1,
plotlyOutput("plot_widget_local"),
lorem2
),
h2("Shared only", class = "my-3"),
p(
"The next plot should resize smoothly only when the shared sidebar is transitioning."
),
div(
class = "row",
div(class = "col-6", plotlyOutput("plot_widget_shared")),
div(class = "col-6", lorem2, lorem1)
)
),
nav_panel(
"Client",
h2("Client-side htmlwidget resizing"),
p(
"The plot in the layout below should stretch while the sidebar is opening",
"or closing. There should be no layout shift after the transition is",
"complete."
),
layout_sidebar(
sidebar = sidebar(
title = "Toggle me",
id = "sidebar-local-client",
lorem1, lorem2, lorem1
),
lorem1,
div(id = "plot_client_local", plot_ly(x = rnorm(100))),
lorem2
),
h2("Shared only", class = "my-3"),
p(
"The next plot should resize smoothly only when the shared sidebar is transitioning."
),
div(
class = "row",
div(
class = "col-6",
div(id = "plot_client_shared", plot_ly(x = rnorm(100)))
),
div(class = "col-6", lorem2, lorem1)
)
),
footer = div(style = "min-height: 100vh")
)

server <- function(input, output, session) {
observeEvent(input$open_sidebar_shared, {
sidebar_toggle("sidebar-shared", open = "open")
})

plot <- reactive({
ggplot(mtcars, aes(mpg, wt)) +
geom_point(aes(color = factor(cyl))) +
labs(
title = "Cars go brrrrr",
x = "Miles per gallon",
y = "Weight (tons)",
color = "Cylinders"
) +
theme_gray(base_size = 16)
})

output$plot_static_local <- renderPlot(plot())
output$plot_static_shared <- renderPlot(plot())

output$plot_widget_local <- renderPlotly(ggplotly(plot()))
output$plot_widget_shared <- renderPlotly(ggplotly(plot()))
}

shinyApp(ui, server)
1 change: 1 addition & 0 deletions inst/apps/312-bslib-sidebar-resize/tests/testthat.R
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
shinytest2::test_app()
29 changes: 29 additions & 0 deletions inst/apps/312-bslib-sidebar-resize/tests/testthat/helpers-js.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
js_sidebar_transition_complete <- function(id) {
paste0("!", js_sidebar_is_transitioning(id))
}

js_sidebar_is_transitioning <- function(id) {
sprintf(
"document.getElementById('%s').parentElement.classList.contains('transitioning');",
id
)
}

js_sidebar_state <- function(id) {
sprintf(
"(function() {
return {
layout_classes: Array.from(document.getElementById('%s').closest('.bslib-sidebar-layout').classList),
content_display: window.getComputedStyle(document.querySelector('#%s .sidebar-content')).getPropertyValue('display'),
sidebar_hidden: document.getElementById('%s').hidden
}})();",
id, id, id
)
}

js_element_width <- function(selector) {
sprintf(
"document.querySelector('%s').getBoundingClientRect().width;",
selector
)
}
Loading