From f8a396b4759e057bde5056912adac633ebcf3d73 Mon Sep 17 00:00:00 2001 From: "Gregory R. Warnes" Date: Fri, 6 Jan 2023 17:34:09 -0500 Subject: [PATCH 1/3] Add `bs_accordion_multi` function. --- R/bs_accordion_multi.R | 99 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 R/bs_accordion_multi.R diff --git a/R/bs_accordion_multi.R b/R/bs_accordion_multi.R new file mode 100644 index 0000000..e969b98 --- /dev/null +++ b/R/bs_accordion_multi.R @@ -0,0 +1,99 @@ +#' Allow multiple `bs_accordion` sections to be open, and specify which ones start as open +#' +#' @param shinyBS::bs_accordion object +#' @param multi logical Should more than one panel be permitted to be open at one time. +#' @param open integer vector Indices of panels that should be open when the page loads. +#' +#' @return. Modified shinyBS::bs_accordion object +#' +#' @export +#' +#' @examples +#' +#' if(interactive()) +#' +#' shinyApp( +#' ui = fluidPage( +#' +#' tags$header( +#' tags$style( +#' HTML( +#' ' +#' .panel-heading.collapsed > .panel-title:before { +#' float: right !important; +#' padding-right: 5px; +#' content:"+" +#' } +#' +#' .panel-heading > .panel-title:before { +#' float: right !important; +#' font-family: FontAwesome; +#' padding-right: 5px; +#' content:"-" +#' } +#' ' +#' ) +#' ) +#' ), +#' +#' tags$h2("Multiple Open Panels, Panels 1 and 3 open at page load"), +#' bs_accordion(id = "beatles") %>% +#' bs_set_opts(panel_type = "success", use_heading_link = TRUE) %>% +#' bs_append(title = "John Lennon", content = "Rhythm guitar, vocals") %>% +#' bs_append(title = "Paul McCartney", content = "Bass guitar, vocals") %>% +#' bs_append(title = "George Harrison", content = "Lead guitar, vocals") %>% +#' bs_append(title = "Ringo Starr", content = "Drums, vocals") %>% +#' bs_accordion_multi( +#' multi=TRUE, +#' open=c(1,3) +#' ), +#' +#' tags$h2("One Open Panel, No panels open on page load."), +#' bs_accordion(id = "fruit") %>% +#' bs_set_opts(panel_type = "info") %>% +#' bs_append(title = "Apples", content = "An apple a day keeps the doctor away.") %>% +#' bs_append(title = "Bannana", content = "Watch out for bannana peels!") %>% +#' bs_append(title = "Kumquat", content = "What is a kumquat?!") %>% +#' bs_accordion_multi( +#' multi=FALSE, +#' open=c() +#' ) +#' ), +#' +#' server = function(input, output) {} +#' ) +#' +#' +#' +bs_accordion_multi <- function(X, multi=TRUE, open=1) { + for(i in 1:length(X$children)) + { + if(multi) + # Remove 'data-parent' attribute so multiple panels can be open at once + X$children[[i]]$children[[1]]$attribs$`data-parent` <- NULL + + # Remove 'in' class to prevent *any* panel from starting as open + classAttribs <- which(names(X$children[[i]]$children[[2]]$attribs) == "class") + for(j in classAttribs) + { + if(X$children[[i]]$children[[2]]$attribs[j]=="in") + { + X$children[[i]]$children[[2]]$attribs[j] <- NULL + } + } + + if(i %in% open) + { + # Add 'in' class (back) to panels selected to start as open + X$children[[i]]$children[[2]]$attribs <- append(X$children[[i]]$children[[2]]$attribs, list(class="in")) + } + else + { + # Add 'collapsed' class to panels slected to start as closed, so css rules work properly + X$children[[i]]$children[[1]]$attribs <- append(X$children[[i]]$children[[1]]$attribs, list(class="collapsed")) + } + } + + X + +} From 90949f30e74e7006b01f2609fd6e177d1a2e1c41 Mon Sep 17 00:00:00 2001 From: "Gregory R. Warnes" Date: Fri, 6 Jan 2023 17:38:09 -0500 Subject: [PATCH 2/3] * Correct missing parameter name in `bs_accordion_multi` documentation. * Regererate documentation. --- DESCRIPTION | 2 +- NAMESPACE | 1 + R/bs_accordion_multi.R | 2 +- man/bs_accordion_multi.Rd | 79 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 man/bs_accordion_multi.Rd diff --git a/DESCRIPTION b/DESCRIPTION index c0b2467..5665472 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -34,7 +34,7 @@ Imports: URL: https://github.com/ijlyttle/bsplus BugReports: https://github.com/ijlyttle/bsplus/issues Roxygen: list(markdown = TRUE) -RoxygenNote: 7.2.1 +RoxygenNote: 7.2.3 Encoding: UTF-8 Suggests: testthat, shiny, diff --git a/NAMESPACE b/NAMESPACE index 935e4fb..c46d4af 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -15,6 +15,7 @@ S3method(bs_set_opts,default) S3method(bs_set_opts,shiny.tag) export("%>%") export(bs_accordion) +export(bs_accordion_multi) export(bs_accordion_sidebar) export(bs_append) export(bs_attach_collapse) diff --git a/R/bs_accordion_multi.R b/R/bs_accordion_multi.R index e969b98..f5c222f 100644 --- a/R/bs_accordion_multi.R +++ b/R/bs_accordion_multi.R @@ -1,6 +1,6 @@ #' Allow multiple `bs_accordion` sections to be open, and specify which ones start as open #' -#' @param shinyBS::bs_accordion object +#' @param X shinyBS::bs_accordion object #' @param multi logical Should more than one panel be permitted to be open at one time. #' @param open integer vector Indices of panels that should be open when the page loads. #' diff --git a/man/bs_accordion_multi.Rd b/man/bs_accordion_multi.Rd new file mode 100644 index 0000000..6a4258c --- /dev/null +++ b/man/bs_accordion_multi.Rd @@ -0,0 +1,79 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/bs_accordion_multi.R +\name{bs_accordion_multi} +\alias{bs_accordion_multi} +\title{Allow multiple \code{bs_accordion} sections to be open, and specify which ones start as open} +\usage{ +bs_accordion_multi(X, multi = TRUE, open = 1) +} +\arguments{ +\item{X}{shinyBS::bs_accordion object} + +\item{multi}{logical Should more than one panel be permitted to be open at one time.} + +\item{open}{integer vector Indices of panels that should be open when the page loads.} +} +\value{ +. Modified shinyBS::bs_accordion object +} +\description{ +Allow multiple \code{bs_accordion} sections to be open, and specify which ones start as open +} +\examples{ + +if(interactive()) + +shinyApp( + ui = fluidPage( + + tags$header( + tags$style( + HTML( + ' + .panel-heading.collapsed > .panel-title:before { + float: right !important; + padding-right: 5px; + content:"+" + } + + .panel-heading > .panel-title:before { + float: right !important; + font-family: FontAwesome; + padding-right: 5px; + content:"-" + } + ' + ) + ) + ), + + tags$h2("Multiple Open Panels, Panels 1 and 3 open at page load"), + bs_accordion(id = "beatles") \%>\% + bs_set_opts(panel_type = "success", use_heading_link = TRUE) \%>\% + bs_append(title = "John Lennon", content = "Rhythm guitar, vocals") \%>\% + bs_append(title = "Paul McCartney", content = "Bass guitar, vocals") \%>\% + bs_append(title = "George Harrison", content = "Lead guitar, vocals") \%>\% + bs_append(title = "Ringo Starr", content = "Drums, vocals") \%>\% + bs_accordion_multi( + multi=TRUE, + open=c(1,3) + ), + + tags$h2("One Open Panel, No panels open on page load."), + bs_accordion(id = "fruit") \%>\% + bs_set_opts(panel_type = "info") \%>\% + bs_append(title = "Apples", content = "An apple a day keeps the doctor away.") \%>\% + bs_append(title = "Bannana", content = "Watch out for bannana peels!") \%>\% + bs_append(title = "Kumquat", content = "What is a kumquat?!") \%>\% + bs_accordion_multi( + multi=FALSE, + open=c() + ) + ), + + server = function(input, output) {} + ) + + + +} From 61bfc006b9939cd6d013220776e3aa5dddbad09a Mon Sep 17 00:00:00 2001 From: "Gregory R. Warnes" Date: Fri, 6 Jan 2023 17:45:32 -0500 Subject: [PATCH 3/3] * Fix typos in man page. * Add library calls so example works properly. --- R/bs_accordion_multi.R | 7 +++++-- man/bs_accordion_multi.Rd | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/R/bs_accordion_multi.R b/R/bs_accordion_multi.R index f5c222f..fb6ba6c 100644 --- a/R/bs_accordion_multi.R +++ b/R/bs_accordion_multi.R @@ -4,13 +4,16 @@ #' @param multi logical Should more than one panel be permitted to be open at one time. #' @param open integer vector Indices of panels that should be open when the page loads. #' -#' @return. Modified shinyBS::bs_accordion object +#' @return Modified shinyBS::bs_accordion object #' #' @export #' #' @examples #' #' if(interactive()) +#' { +#' library(shiny) +#' library(bsplus) #' #' shinyApp( #' ui = fluidPage( @@ -63,7 +66,7 @@ #' server = function(input, output) {} #' ) #' -#' +#' } #' bs_accordion_multi <- function(X, multi=TRUE, open=1) { for(i in 1:length(X$children)) diff --git a/man/bs_accordion_multi.Rd b/man/bs_accordion_multi.Rd index 6a4258c..bdc2fc2 100644 --- a/man/bs_accordion_multi.Rd +++ b/man/bs_accordion_multi.Rd @@ -14,7 +14,7 @@ bs_accordion_multi(X, multi = TRUE, open = 1) \item{open}{integer vector Indices of panels that should be open when the page loads.} } \value{ -. Modified shinyBS::bs_accordion object +Modified shinyBS::bs_accordion object } \description{ Allow multiple \code{bs_accordion} sections to be open, and specify which ones start as open @@ -22,6 +22,9 @@ Allow multiple \code{bs_accordion} sections to be open, and specify which ones s \examples{ if(interactive()) +{ +library(shiny) +library(bsplus) shinyApp( ui = fluidPage( @@ -74,6 +77,6 @@ shinyApp( server = function(input, output) {} ) - +} }