From 37a324304f27c34eb9687f9ea79e60c0bab278e3 Mon Sep 17 00:00:00 2001 From: andrie Date: Sat, 21 Sep 2024 16:16:55 +0100 Subject: [PATCH 01/18] Rename folder --- inst/shiny/{update_rank_list_method => update_rank_list}/app.R | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename inst/shiny/{update_rank_list_method => update_rank_list}/app.R (100%) diff --git a/inst/shiny/update_rank_list_method/app.R b/inst/shiny/update_rank_list/app.R similarity index 100% rename from inst/shiny/update_rank_list_method/app.R rename to inst/shiny/update_rank_list/app.R From b96e119a2021f03f9b6100ac53e01cfb4a1b2155 Mon Sep 17 00:00:00 2001 From: andrie Date: Sat, 21 Sep 2024 16:17:08 +0100 Subject: [PATCH 02/18] Add shiny tests --- .../shinytest2/test_change_labels-001.json | 5 ++ .../shinytest2/test_change_labels-001_.png | Bin 0 -> 755 bytes .../shinytest2/test_change_labels-002.json | 5 ++ .../shinytest2/test_change_labels-002_.png | Bin 0 -> 756 bytes .../shinytest2/test_empty_labels-001.json | 5 ++ .../shinytest2/test_empty_labels-001_.png | Bin 0 -> 755 bytes .../shinytest2/test_empty_labels-002.json | 5 ++ .../shinytest2/test_empty_labels-002_.png | Bin 0 -> 412 bytes .../shinytest2/test_empty_labels-003.json | 5 ++ .../shinytest2/test_empty_labels-003_.png | Bin 0 -> 857 bytes .../shinytest2/test_update_title-001.png | Bin 0 -> 17951 bytes .../shinytest2/test_update_title-002.png | Bin 0 -> 18443 bytes tests/testthat/app.R | 83 ++++++++++++++++++ tests/testthat/setup-shinytest2.R | 3 + tests/testthat/test-shinytest2.R | 43 +++++++++ 15 files changed, 154 insertions(+) create mode 100644 tests/testthat/_snaps/shinytest2/test_change_labels-001.json create mode 100644 tests/testthat/_snaps/shinytest2/test_change_labels-001_.png create mode 100644 tests/testthat/_snaps/shinytest2/test_change_labels-002.json create mode 100644 tests/testthat/_snaps/shinytest2/test_change_labels-002_.png create mode 100644 tests/testthat/_snaps/shinytest2/test_empty_labels-001.json create mode 100644 tests/testthat/_snaps/shinytest2/test_empty_labels-001_.png create mode 100644 tests/testthat/_snaps/shinytest2/test_empty_labels-002.json create mode 100644 tests/testthat/_snaps/shinytest2/test_empty_labels-002_.png create mode 100644 tests/testthat/_snaps/shinytest2/test_empty_labels-003.json create mode 100644 tests/testthat/_snaps/shinytest2/test_empty_labels-003_.png create mode 100644 tests/testthat/_snaps/windows-4.4/shinytest2/test_update_title-001.png create mode 100644 tests/testthat/_snaps/windows-4.4/shinytest2/test_update_title-002.png create mode 100644 tests/testthat/app.R create mode 100644 tests/testthat/setup-shinytest2.R create mode 100644 tests/testthat/test-shinytest2.R diff --git a/tests/testthat/_snaps/shinytest2/test_change_labels-001.json b/tests/testthat/_snaps/shinytest2/test_change_labels-001.json new file mode 100644 index 0000000..07bd362 --- /dev/null +++ b/tests/testthat/_snaps/shinytest2/test_change_labels-001.json @@ -0,0 +1,5 @@ +{ + "output": { + "results": "[1] \"a\" \"b\" \"c\" \"d\" \"e\"" + } +} diff --git a/tests/testthat/_snaps/shinytest2/test_change_labels-001_.png b/tests/testthat/_snaps/shinytest2/test_change_labels-001_.png new file mode 100644 index 0000000000000000000000000000000000000000..fffbdf5312c9ca47ef7b97e49344efa1309ad52a GIT binary patch literal 755 zcmVpC-6b9hioqYog3WutXyrv4t3@=a_vkJo##Go+9s&$z`MqwiHQS0g>@hgCK*=?be z3ru&u&ya!BlQXIN=iZyU^?Dru0002sv%cMW000000KPT>6951J0A~>}0RR91aF%Z& zgwV|5#<*$^mw&jjt;R9VnwQUGO~+OH@_AZmTaDkk!3hJLPV z*R~oDi{8ARrc7(Lfn9ySP3cl~9sYW(>*@9mvqr=O00017({%%;z4bdG>$l-P$+Do) zd=sg3vWIN>oT6*HTCPU(r0G%!&9clUi`3yyvn)ed#tS@F0001hkGN{U)Xeg7w}mU+ z0v_y(0{{R3Zt0yvzAvJEe%`$#t*xHQ<9~3n=4TNevJ|U#I@v>3K2>dkRra6wfGk6>o`7jnCgwbS@Ezj)ts?4`L z#76Tv(GlOB!F2vBZiY>D9Cv3hnJkCHScEW|FD9W#G3a*E-4jT9%sBu60Kf+vev8~Y zKK&Ls00000{yW#)A_o8f0Kk7}7ci}gVT^Hn?9icR7GsRbjt>F=007|2yIZfiPY)AO^$z*$tdPs$nGJ|kGyE@YU9-Y} zdVEZzc;qaL^3_6uXow`|UxB56IfROYoX^|J0_Mms_{V|K*%q z#?*gqh0f_BD~sFPMO|k<_q_A(a=!ZW72P?1cgd>HHeb9#)XyR)3TWy(w|I889ZA>b z_RT-Gul$Oy!}j9L^)tRYT%Q|g&s%+T4aofRAMZchE}i%_{qFXc3+(soEf?DEtnDHm zvQBtH*_@W6UzdLNv^v9n`P0(k;|%Ry?3atKM8g9#~=3m4U0`# zfAMtP`_*^N&REX>JWDzJp;*79*&ALSpxzHt_kEl2KI`MY*s0a=A-r4GOh3)8-*7g) zQldnfJ8xCt|4YK_L5|7}fAJD<-R zVy9-Gm?&xqRNe6YRrdP?F2yTXmHxbP+q}xIdcjxMTZKZ?PPgCTGMO~b_LE0KRajc70IcWGm19^epZ(*b-V0nS~u7H_EyW% ziAytY$%mi)7XmbaLEP%Eev!M)yZskHydQb{{_v=QSpRh88G}vV#czt+dUp;pP@v(% kMkRKT%=S%S`atYI_LDP`w|?&1wg4pT>FVdQ&MBb@0EXF3;{X5v literal 0 HcmV?d00001 diff --git a/tests/testthat/_snaps/shinytest2/test_empty_labels-001.json b/tests/testthat/_snaps/shinytest2/test_empty_labels-001.json new file mode 100644 index 0000000..07bd362 --- /dev/null +++ b/tests/testthat/_snaps/shinytest2/test_empty_labels-001.json @@ -0,0 +1,5 @@ +{ + "output": { + "results": "[1] \"a\" \"b\" \"c\" \"d\" \"e\"" + } +} diff --git a/tests/testthat/_snaps/shinytest2/test_empty_labels-001_.png b/tests/testthat/_snaps/shinytest2/test_empty_labels-001_.png new file mode 100644 index 0000000000000000000000000000000000000000..fffbdf5312c9ca47ef7b97e49344efa1309ad52a GIT binary patch literal 755 zcmVpC-6b9hioqYog3WutXyrv4t3@=a_vkJo##Go+9s&$z`MqwiHQS0g>@hgCK*=?be z3ru&u&ya!BlQXIN=iZyU^?Dru0002sv%cMW000000KPT>6951J0A~>}0RR91aF%Z& zgwV|5#<*$^mw&jjt;R9VnwQUGO~+OH@_AZmTaDkk!3hJLPV z*R~oDi{8ARrc7(Lfn9ySP3cl~9sYW(>*@9mvqr=O00017({%%;z4bdG>$l-P$+Do) zd=sg3vWIN>oT6*HTCPU(r0G%!&9clUi`3yyvn)ed#tS@F0001hkGN{U)Xeg7w}mU+ z0v_y(0{{R3Zt0yvzAvJEe%`$#t*xHQ<9~3n=4TNevJ|U#I@v>3K2>dkRra6wfGk6>o`7jnCgwbS@Ezj)ts?4`L z#76Tv(GlOB!F2vBZiY>D9Cv3hnJkCHScEW|FD9W#G3a*E-4jT9%sBu60Kf+vev8~Y zKK&Ls00000{yW#)A_o8f0Kk7}7ci}gVT^Hn?9icR7GsRbjt>F=007|2yIZf6J#y}U#Ltqh-UDc-M|T?8p2q7K-?`#2_X3eQ(95_c%KKT;6SCO(xU6tvuZngLE0XucXfCy4ve}kqz2;hZP?qq z^3C$BywkiuUc>#{v7ch^`K&p~2;>zsY~O#Plzs7*b@TUUzmARlcNc8&oC%NiYW-e0 zYwh+@^Q94M%B_oMSB5UXVtc6psE6TCzPNm9rEzDXXr_qZ)4N4Ra?fN01^1r(w6Es% zs?~|>9{sJ^z&lTDd*#OL9d#9Zw3&f=8jLSy&U$vk7^J`8P?!7{5aYmhRDX&x3WJ2# Z?qTXV$*CQAHVNW{cO)36JKSZ!9Z|eYh1k*gvlT$&8r4sesOB%gs}GR>FNksdA+N+xa!AI zWna1KxTxIt^P;`Qn`>oLGTIqr+wQ5nI?oPK{36k~`J}IyYv38C?C%$M&HS?R;X|LU zMHKNHgpkQEN`10ZTkKD<}A1~cMqy6!VU$@rT3VC1oH#gwr zC6>liueDCw@6|4vqN;pbw07T{g8|wzL>p(=$i3d4^k@!WL19>WkjUh3m!5nKnH2l_ z?XMNFOfhj+pA?3ucPnjhS#_m5sd{6sNErvjCk0EVFUwrwwfFnpbw~WBR!uy^f6MIC z-yf5G0`pDIC9l0 z3iej#f3hvgjSXA6E!KTy(E4|OKF7|i+4W`e!(FCJejLXS?h*-78Y*+!HqK zn|TX=NtArMG)r^qpRc$1F3*(RtDmT;`a5`9*e;m`T3|B|Jbh=^{4y~lQzifKw&`x$ zqV?^!yp8HxKTZDhucr5Np8i;v^8WSZm#a)p9cm1QxPH#JvzkRgOXH?&oj!4T=j=Nv z_h0NXd-O#o`%{HYuDP*RyLZ&mK($GgH=nuvC|&G=4&la^^cg!tTzWKiMrePIWj3Ir4%RA2q$4OTvKChg2eO@3W zK^3Uamh^dBwPW+^(|Yod1ljQau=iyX`?-t|ef&MDMG)4Dr}7W=`#!GP_U9K!z|+;w JWt~$(69C0ohBp8J literal 0 HcmV?d00001 diff --git a/tests/testthat/_snaps/windows-4.4/shinytest2/test_update_title-001.png b/tests/testthat/_snaps/windows-4.4/shinytest2/test_update_title-001.png new file mode 100644 index 0000000000000000000000000000000000000000..ec1dfe9f8e4ab9d8869b97d9e1055d9b2598e2e7 GIT binary patch literal 17951 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 Z-H(rVFCLm7e*+@=##NImWqOW}{u}LYT*LqX literal 0 HcmV?d00001 diff --git a/tests/testthat/_snaps/windows-4.4/shinytest2/test_update_title-002.png b/tests/testthat/_snaps/windows-4.4/shinytest2/test_update_title-002.png new file mode 100644 index 0000000000000000000000000000000000000000..bfee7982ceda6c0aa5aa44c945f28a7b584b7989 GIT binary patch literal 18443 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 literal 0 HcmV?d00001 diff --git a/tests/testthat/app.R b/tests/testthat/app.R new file mode 100644 index 0000000..870a8cd --- /dev/null +++ b/tests/testthat/app.R @@ -0,0 +1,83 @@ +## ---- update-rank-list-method-app --------------------------------------- +## Example shiny app that dynamically updates a rank list + +library(shiny) +library(sortable) +library(magrittr) + + +ui <- fluidPage( + tags$head( + tags$style(HTML(".bucket-list-container {min-height: 350px;}")) + ), + fluidRow( + column( + width = 12, + h2("Modify a rank list"), + actionButton("btnUpdateRank", label = "Update rank list title"), + actionButton("btnChangeLabels", label = "Change labels"), + actionButton("btnSortLabels", label = "Sort labels"), + actionButton("btnEmptyLabels", label = "Empty labels") + ) + ), + fluidRow( + column( + h2("Exercise"), + width = 12, + rank_list( + text = "Change the order", + labels = letters[1:5], + input_id = "rank_list_1" + ) + ) + ), + verbatimTextOutput("results") +) + +server <- function(input, output, session) { + + # test updating the bucket list label + counter_bucket <- reactiveVal(1) + + output$results <- renderPrint({ + input$rank_list_1 # This matches the input_id of the rank list + }) + + observe({ + update_rank_list( + "rank_list_1", + text = paste("You pressed the update button", counter_bucket(), "times"), + ) + counter_bucket(counter_bucket() + 1) + }) %>% + bindEvent(input$btnUpdateRank) + + + observe({ + update_rank_list( + "rank_list_1", + labels = sample(LETTERS, 5) + ) + }) %>% + bindEvent(input$btnChangeLabels) + + observe({ + update_rank_list( + "rank_list_1", + labels = list() + ) + }) %>% + bindEvent(input$btnEmptyLabels) + + observe({ + update_rank_list( + "rank_list_1", + labels = sort(input$rank_list_1) + ) + }) %>% + bindEvent(input$btnSortLabels) + + +} + +shinyApp(ui, server) diff --git a/tests/testthat/setup-shinytest2.R b/tests/testthat/setup-shinytest2.R new file mode 100644 index 0000000..fa5f65c --- /dev/null +++ b/tests/testthat/setup-shinytest2.R @@ -0,0 +1,3 @@ +# Load application support files into testing environment +shinytest2::load_app_env() +# print(getwd()) \ No newline at end of file diff --git a/tests/testthat/test-shinytest2.R b/tests/testthat/test-shinytest2.R new file mode 100644 index 0000000..3c00b94 --- /dev/null +++ b/tests/testthat/test-shinytest2.R @@ -0,0 +1,43 @@ +library(shinytest2) + +# test_that("getwd", { +# expect_equal(getwd(), "tests/") +# }) + +app_dir= "../../inst/shiny/update_rank_list" + +test_that("{shinytest2} recording: test_update_title", { + app <- AppDriver$new(variant = platform_variant(), name = "test_update_title", + app_dir =app_dir, + seed = 123, height = 945, width = 1619) + app$expect_screenshot() + app$click("btnUpdateRank") + app$expect_screenshot() +}) + + +test_that("{shinytest2} recording: test_change_labels", { + app <- AppDriver$new(name = "test_change_labels", + app_dir =app_dir, + seed = 123, height = 945, width = 1619) + app$expect_values(output = "results") + app$click("btnChangeLabels") + app$set_inputs(rank_list_1 = c("W", "C", "R", "F", "I"), allow_no_input_binding_ = TRUE, + priority_ = "event") + app$expect_values(output = "results") +}) + + +test_that("{shinytest2} recording: test_empty_labels", { + app <- AppDriver$new(name = "test_empty_labels", + app_dir =app_dir, + seed = 123, height = 945, width = 1619) + app$expect_values(output = "results") + app$click("btnEmptyLabels") + app$set_inputs(rank_list_1 = character(0), allow_no_input_binding_ = TRUE, priority_ = "event") + app$expect_values(output = "results") + app$click("btnChangeLabels") + app$set_inputs(rank_list_1 = c("M", "I", "Z", "W", "Q"), allow_no_input_binding_ = TRUE, + priority_ = "event") + app$expect_values(output = "results") +}) From d1d3f813df02cf56bb0ffaa301c16a0de44dd3de Mon Sep 17 00:00:00 2001 From: andrie Date: Sun, 7 Dec 2025 09:49:35 +0000 Subject: [PATCH 03/18] Change from RStudio to Posit --- DESCRIPTION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 26df9b7..fff85ba 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -10,13 +10,13 @@ Authors@R: person(given = "Barret", family = "Schloerke", role = "aut", - email = "barret@rstudio.com"), + email = "barret@posit.co"), person(given = "Kenton", family = "Russell", role = c("aut", "ccp"), email = "kent.russell@timelyportfolio.com", comment = "Original author"), - person("RStudio", role = c("cph", "fnd")), + person("Posit", role = c("cph", "fnd")), person(given = "Lebedev", family = "Konstantin", role = "cph", From 613fda0eb6d7db69f82b326d19bdea38b390fa7d Mon Sep 17 00:00:00 2001 From: andrie Date: Sun, 7 Dec 2025 09:52:04 +0000 Subject: [PATCH 04/18] Fix shiny modules problem --- DESCRIPTION | 5 +- NAMESPACE | 2 + R/methods.R | 21 ++++--- R/modules.R | 29 +++++++++ R/zzz.R | 12 ++++ _pkgdown.yml | 1 + inst/shiny/modules/app.R | 108 ++++++++++++++++++++++++++++++++++ man/modules.Rd | 23 ++++++++ man/sortable.Rd | 4 +- tests/testthat/test-modules.R | 12 ++++ 10 files changed, 205 insertions(+), 12 deletions(-) create mode 100644 R/modules.R create mode 100644 inst/shiny/modules/app.R create mode 100644 man/modules.Rd create mode 100644 tests/testthat/test-modules.R diff --git a/DESCRIPTION b/DESCRIPTION index fff85ba..f2e85c9 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -48,11 +48,12 @@ Suggests: magrittr, webshot, spelling, - covr + covr, + shinytest2 VignetteBuilder: knitr Encoding: UTF-8 Roxygen: list(markdown = TRUE) -RoxygenNote: 7.3.2 +RoxygenNote: 7.3.3 Language: en-US Config/testthat/edition: 3 diff --git a/NAMESPACE b/NAMESPACE index f281ce6..92a675d 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -9,6 +9,8 @@ S3method(question_ui_try_again,sortable_rank) export(add_rank_list) export(bucket_list) export(chain_js_events) +export(enable_modules) +export(is_modules_enabled) export(is_sortable_options) export(question_rank) export(rank_list) diff --git a/R/methods.R b/R/methods.R index c2fabe7..355d18d 100644 --- a/R/methods.R +++ b/R/methods.R @@ -24,14 +24,19 @@ print.bucket_list <- function(x, ...){ # The names must be suffix values to allow for modules which use prefix values # https://github.com/rstudio/sortable/issues/100 -as_rank_list_id <- function(id) { - paste0("rank-list-", id) +as_rank_list_id <- function(id, use_module = is_modules_enabled()) { + if (use_module){ + paste0(id, "-rank-list") + } else { + paste0("rank-list-", id) + } } -# TODO: in future, change the order of paste, to enable shiny modules -# paste0(id, "-rank-list") -as_bucket_list_id <- function(id) { - paste0("bucket-list-", id) +as_bucket_list_id <- function(id, use_module = is_modules_enabled()) { + if (use_module){ + paste0(id, "-bucket-list") + } else { + paste0("bucket-list-", id) + } } -# TODO: in future, change the order of paste, to enable shiny modules -# paste0(id, "-bucket-list") + diff --git a/R/modules.R b/R/modules.R new file mode 100644 index 0000000..f87d9f6 --- /dev/null +++ b/R/modules.R @@ -0,0 +1,29 @@ +# TODO: Create demo app with modules +# TODO: Ensure module settings for id gets passed to JavaScript binding + +# create environment for storing shiny module status +sortable_env = new.env() +sortable_env$modules = FALSE + +#' Check if shiny modules are enabled for `sortable`. +#' +#' Due to an early (regrettable) design decision, `sortable` in versions <= 0.5.0 +#' did not support shiny modules. +#' To use `sortable` with shiny modules, you have to opt in to different +#' behaviour, by calling `enable_modules()`. +#' +#' @rdname modules +#' @return Logical value indicating whether shiny modules are enabled or not. +#' @export +is_modules_enabled <- function(){ + isTRUE(sortable_env$modules) +} + +#' @rdname modules +#' @param enable If `TRUE`, enables modules. If `FALSE` disables them. +#' @export +enable_modules <- function(enable = TRUE){ + assertthat::assert_that(is.logical(enable)) + sortable_env$modules = enable + is_modules_enabled() +} diff --git a/R/zzz.R b/R/zzz.R index 1598598..5a16b53 100644 --- a/R/zzz.R +++ b/R/zzz.R @@ -2,6 +2,18 @@ .onLoad <- function(...) { + + # use the `cli` package to send a message on startup to use `enable_modules()` + msg <- c("") + packageStartupMessage( + # rlang::inform("This message will appear only once per session.", .frequency = "once", .frequency_id = "sortable"), + rlang::inform( + cli::cli_text("To use sortable with shiny modules, run {.run sortable::enable_modules()} to opt into the new standard."), + .frequency = "once", + .frequency_id = "sortable" + ) + ) + as_character_vector <- function(x) { # works for both x = NULL and x = list() if (length(x) == 0) { diff --git a/_pkgdown.yml b/_pkgdown.yml index 8d7ce0d..e5dd834 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -28,6 +28,7 @@ reference: - sortable_output - update_rank_list - update_bucket_list + - is_modules_enabled - title: Package documentation desc: ~ contents: diff --git a/inst/shiny/modules/app.R b/inst/shiny/modules/app.R new file mode 100644 index 0000000..2d2cc20 --- /dev/null +++ b/inst/shiny/modules/app.R @@ -0,0 +1,108 @@ +## ---- modules-app ----------------------------------------------------- +## Example shiny app that dynamically updates a rank list + +library(shiny) +library(sortable) +library(magrittr) + +# shiny module ui ---- +mod_rank_list_ui <- function(id, text, labels) { + ns <- NS(id) + fluidRow( + rank_list(text, labels, input_id = ns("rank_list_1")), + verbatimTextOutput(ns("results")) + ) +} + +# shiny module serevr ---- +mod_rank_list_server <- function(id) { + moduleServer(id, function(input, output, session) { + counter_bucket <- reactiveVal(1) + + output$results <- renderPrint({ + input$rank_list_1 # This matches the input_id of the rank list + }) + + observe({ + update_rank_list( + "rank_list_1", + text = paste("You pressed the update button", counter_bucket(), "times"), + ) + counter_bucket(counter_bucket() + 1) + }) %>% + bindEvent(input$btnUpdateRank) + + + observe({ + update_rank_list( + "rank_list_1", + labels = sample(LETTERS, 5) + ) + }) %>% + bindEvent(input$btnChangeLabels) + + observe({ + update_rank_list( + "rank_list_1", + labels = list() + ) + }) %>% + bindEvent(input$btnEmptyLabels) + + observe({ + update_rank_list( + "rank_list_1", + labels = sort(input$rank_list_1) + ) + }) %>% + bindEvent(input$btnSortLabels) + + }) +} + + +# shiny ui ---- +ui <- fluidPage( + tags$head( + tags$style(HTML(".bucket-list-container {min-height: 350px;}")) + ), + fluidRow( + column( + width = 12, + h2("Modify a rank list"), + actionButton("btnUpdateRank", label = "Update rank list title"), + actionButton("btnChangeLabels", label = "Change labels"), + actionButton("btnSortLabels", label = "Sort labels"), + actionButton("btnEmptyLabels", label = "Empty labels") + ) + ), + fluidRow( + column( + width = 6, + h2("Rank list A"), + mod_rank_list_ui( + id = "rl1", + text = "Change the order", + labels = letters[1:5] + ) + ), + column( + width = 6, + h2("Rank list B"), + mod_rank_list_ui( + id = "rl2", + text = "Second order", + labels = LETTERS[6:10] + ) + ) + ), +) + + +# shiny server ---- +server <- function(input, output, session) { + mod_rank_list_server("rl1") + results_2 <- mod_rank_list_server("rl2") +} + +shinyApp(ui, server) diff --git a/man/modules.Rd b/man/modules.Rd new file mode 100644 index 0000000..89ea0b2 --- /dev/null +++ b/man/modules.Rd @@ -0,0 +1,23 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/modules.R +\name{is_modules_enabled} +\alias{is_modules_enabled} +\alias{enable_modules} +\title{Check if shiny modules are enabled for \code{sortable}.} +\usage{ +is_modules_enabled() + +enable_modules(enable = TRUE) +} +\arguments{ +\item{enable}{If \code{TRUE}, enables modules. If \code{FALSE} disables them.} +} +\value{ +Logical value indicating whether shiny modules are enabled or not. +} +\description{ +Due to an early (regrettable) design decision, \code{sortable} in versions <= 0.5.0 +did not support shiny modules. +To use \code{sortable} with shiny modules, you have to opt in to different +behaviour, by calling \code{enable_modules()}. +} diff --git a/man/sortable.Rd b/man/sortable.Rd index 0ddfece..d0343c9 100644 --- a/man/sortable.Rd +++ b/man/sortable.Rd @@ -49,13 +49,13 @@ Useful links: Authors: \itemize{ - \item Barret Schloerke \email{barret@rstudio.com} + \item Barret Schloerke \email{barret@posit.co} \item Kenton Russell \email{kent.russell@timelyportfolio.com} (Original author) [conceptor] } Other contributors: \itemize{ - \item RStudio [copyright holder, funder] + \item Posit [copyright holder, funder] \item Lebedev Konstantin ('SortableJS', https://sortablejs.github.io/Sortable/) [copyright holder] } diff --git a/tests/testthat/test-modules.R b/tests/testthat/test-modules.R new file mode 100644 index 0000000..8d065d5 --- /dev/null +++ b/tests/testthat/test-modules.R @@ -0,0 +1,12 @@ +test_that("ids and modules are consistent", { + expect_false(is_modules_enabled()) + expect_equal(as_rank_list_id("one"), "rank-list-one") + + enable_modules() + expect_true(is_modules_enabled()) + expect_equal(as_rank_list_id("one"), "one-rank-list") + + enable_modules(FALSE) + expect_false(is_modules_enabled()) + expect_equal(as_rank_list_id("one"), "rank-list-one") +}) From 719a3245cb14068c19666568035bc382928f1447 Mon Sep 17 00:00:00 2001 From: andrie Date: Sun, 7 Dec 2025 09:55:07 +0000 Subject: [PATCH 05/18] Update project id --- sortable.Rproj | 1 + 1 file changed, 1 insertion(+) diff --git a/sortable.Rproj b/sortable.Rproj index 61d9e4a..79948c3 100644 --- a/sortable.Rproj +++ b/sortable.Rproj @@ -1,4 +1,5 @@ Version: 1.0 +ProjectId: f5b175a3-1218-4e55-8f73-192b92827f27 RestoreWorkspace: Default SaveWorkspace: Default From b6d536c426f8f3bf48c388a4e7d355ee3a5d5295 Mon Sep 17 00:00:00 2001 From: andrie Date: Sun, 7 Dec 2025 10:45:48 +0000 Subject: [PATCH 06/18] Add shinytest2 artifacts --- .../shinytest2/test_update_title-001.png | Bin 0 -> 22324 bytes .../shinytest2/test_update_title-002.png | Bin 0 -> 23344 bytes .../shinytest2/test_change_labels-001_.png | Bin 755 -> 1425 bytes .../shinytest2/test_change_labels-002_.png | Bin 756 -> 1397 bytes .../shinytest2/test_empty_labels-001_.png | Bin 755 -> 1425 bytes .../shinytest2/test_empty_labels-002_.png | Bin 412 -> 493 bytes .../shinytest2/test_empty_labels-003_.png | Bin 857 -> 1486 bytes .../shinytest2/test_update_title-001.png | Bin 17951 -> 0 bytes .../shinytest2/test_update_title-002.png | Bin 18443 -> 0 bytes 9 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/testthat/_snaps/linux-4.2/shinytest2/test_update_title-001.png create mode 100644 tests/testthat/_snaps/linux-4.2/shinytest2/test_update_title-002.png delete mode 100644 tests/testthat/_snaps/windows-4.4/shinytest2/test_update_title-001.png delete mode 100644 tests/testthat/_snaps/windows-4.4/shinytest2/test_update_title-002.png diff --git a/tests/testthat/_snaps/linux-4.2/shinytest2/test_update_title-001.png b/tests/testthat/_snaps/linux-4.2/shinytest2/test_update_title-001.png new file mode 100644 index 0000000000000000000000000000000000000000..034c62c85d010cc3c3ce7de8a1f00c3db43c3f8a GIT binary patch literal 22324 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 literal 0 HcmV?d00001 diff --git a/tests/testthat/_snaps/linux-4.2/shinytest2/test_update_title-002.png b/tests/testthat/_snaps/linux-4.2/shinytest2/test_update_title-002.png new file mode 100644 index 0000000000000000000000000000000000000000..b7e5005da8dda5263777d61ab4e6c35c1eb28b38 GIT binary patch literal 23344 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 DmsY6Y delta 732 zcmV<20wevA3-bk#BYy(ANklpC-6b9hioqYog3WutXyrv4t3@=a_vkJo# z#Go+9s&$z`MqwiHQS0g>@hgCK*=?be3ru&u&ya!BlQXIN=iZyU^?Dru0002sv%cMW z000000KPT>6951J0A~>}0RR91aF%Z&gwV|5#<*$^mw&jjt$)Tb&YG9cV@=0Z`|^2O zX$EW_{14+^WS--oN zogC8Zb@mdGB!8tR3~)l}MMk~-000000H1WXUavzli%uYcVC^Yz>H z$F$XWSgbbJ+2k`F-t1X~$A@KJtP*w&`_rat+stBKZm*Md{bSP6zyB@(004lC`hL~B zbq3RVu(@nz@nGlq@M#KaF003Ombpxio^*bT!x8Xj?vY^p?6RC8vhiv(rqHDWau152u=~4*Ivdkun z)ZtIFEJInw3p`c;004lGxN5-E%<^)#g)7|x9_)()0001P>77HqFQR>Z-n}HPt)9x` ze{izqXMYhMvJ|U#I@v>3K2>dkRra6wfGk6>o`7jnCgwbS@Ezj)ts?4`L#76Tv(GlOB!F2vBZiY>D9Cv3hnJkCH zScEW|FD9W#G3a*E-4jT9%sBu60Kf+vev8~YK2`k|IRF3v0RB7I+#&}6006*$XcsW8 zieZd#eC*JnW)@?N$&L>K0002s%ez~z*SDSl0001hFU%G>00000&hi^>nntLNN?Qv6 O0000hf@E}L9Ni&YyoHgU?%dH?!6@AF>1-}hZrUDL>f0jiFk$a6k7@`YT> z3x+p!T1D^j1}qo!sPvBAD#!J$@aXpH;_A#=UefQIgB3;!Xqz(pb zac3@aV&q!!k-eC!t=}80+rvTUVn*&~W@hg`;IYkeyBg5^;%y|La=2{QCvp8XiF&9~YdqF5o z^Rc~9+GN)6KrD_cbzizzdpzlU7BSXgN9|ckUXJFVa6@XNVz(Wqq3*EM&EE$XX^ru$ zt=1&pvOQ#soEW}xQ1npH0}uY22>pqH1-GWrA{X9ihzjcb`Z!VViWH!=1qYe2*yX_+ zv0~8*XKUPlCDn+00s_e1fBUqS8Vjx;Lq`h_2z@QWN%UZ3wzW)L#c&3fW(MB(?xH$H zd#eS55X7i3=Py1RVIX(L=JDP6LywIk80b?yZiL%J+W^ zYu1Le3_oa_{K)2pD&Bl`DyD{~i@RZX5Da*hR!Nm||LIAP;RXfx_Aq_Z!uk$)aEkum zFE>_XINqNWXICWh6w4{7eRSYZheG2VlP(AVe9=wi|>7WiS(61Z!>HmTJVZQx*2Cf zHXpc%5M93+0tpGl%z-*Poqp}kdAOqbSY>C%=E)}@x`v^*3oRnhF9j&4%gGZp6@T}k zx^OD-a;=EmO;;xpq|CNQE~Dn7ZajLqSzyNEEBOEs<*RkeY;^5Hr>zO$|5NoZ1y$xgW>1AN{*cUQ)V-p>oR;DPELxu)AR6SwOR!L0002E)z7~@ z000000N<{9fV&8o00000xXaHFLYPm|wXCR5mtS027k^orPUf4(b4|0N-aIx^ zdc^=&ls;tCzdrx~006)pKJH*jp5Mx{eCf5eAN>iFb^?#is4UBJIyl?66-ArpN!UF-M8tWKfJwn61PJuL>E-96OeYCgvIrx^GQ0)2h;MUbH@OO zN(a+&)LCDPagl7ow>w4+>nLw0$Gd*ky{@g^OW6x`k@Xi(<*0M26aWAK-~oQDR;w_d zq`%`svB!Lp4#RXmwK!gXQe9-@@Vxz2U1YD(%YN^x-G4UBIiK^IBUj-Tj~O=X4GaJP z0PvN*_K@#t@xEP^dtX!yw5*rQ2QPrlXL%TO8w+l#asSd2uK)l50KS7GD{_y}ilVRx zp4;{!4wpQLG;4)YN5VS~p7RrxYbS|N10QJz=LoSoDe zmD6Z*uu=0T8+At0K{bAzH`}#2b&;iM+8HSS-sUbWqv0{{R3fbg**2LJ#70JpLt2LJ#7z+L_a$(Uoc^NzNl P00000NkvXXu0mjfmH1Bm diff --git a/tests/testthat/_snaps/shinytest2/test_empty_labels-001_.png b/tests/testthat/_snaps/shinytest2/test_empty_labels-001_.png index fffbdf5312c9ca47ef7b97e49344efa1309ad52a..93d218688ef6b7d84c2e3a863e93f7b85fa72c93 100644 GIT binary patch delta 1407 zcmX|AdpOez7*?H1mviKj6`{n`#;8QXla3)8m9&_-9M>>&azBQj(jmE=Cgidu)>4gJ z+StL|7v`4cHkU~m4>qcqxjUyh&-wm(pYQoD@Ap3MC)|xc@c1OK+tC_+*&&i37(H=a z*-xS2+hATdNXWz>^xR)r|9nJ`S_sbweQE0pD~a20hPJi80okbz&v+Mf!S`|dw)2DbNA-B1XQQIk_1JpARvXb%YWRCb z)V!!?+9G^9ntQ!E(t3HG(4)*!xE9pml4V-|wZ#~3atLb76WIkhtE<~15^D<(D;}Xn z=Xj!Sth2qNk}yqEX4snR*lMf;Xs53DM2tYD9uZwdv|SP&eRQXd-$nt(nSQqrCPXpZ zK8bfN(c@qrw^t1{BAvwVUXd#?F$>T^1;`q$_1e&}r%_aj+|&n@A6cb~L_|SLXy(+b zH2aRs^eqrWp*!Toel6oV(A zkoHJ*27no6je(>Stk#IO7Xz~y*dpYK!>M3#pkQ8=?n&+QBMr}mMNt`toViAo77pU; zddHN2(DTqe5`NDQr*^x~?(ZyRghT}hFwj5F z$mg{mX=JAMVye?nGmFw3$JQo`En2;pE zH9_a*<|ueBUck8fAzSysLy-t)7iB`lH+902LUH>jLDo2>_uWf z*^HNWih@=wV)qua!JPV1G9f35Fzfb*;cy6QB}HY^#CWJIo8o=xiXCEVr`og?p}#6a zWu;8-v;P<7wt=JBcaqV2iCs|tJs{q?&*zw_fObV$;Sh3+HUTPh?sToegxsd5*CV>p zgKd9Or}iGqo^8{$l5f42$u#@RyqLcjFIEBW`ys8geA@YwFLg_38Hk%N&N@OsGKhY5 z7zbMe)i9)(t5F;vVPL`OX7a6ZH;S-XxL@F zI9fxA90XSm{~hbovvhDNT>D*s`%nnMj>l40x8f{MCX3gQMd`+-8)N_0HOiHzRep54 zxQ47wNWh72=I_sPu!H0idsJOwL6S8Mno2Q^4xNZ=;3bUgh<>1`2@qRnXwlCCQSLqG zjaDsNainrz`7vz70;%`Y2ZV_MZmx@e<+fHu^21kkJ8rM`!})YCCG&|ZTJ@ZnD21eB zO!+69={l@2!%gsop}%dtO=aBDrag33gZv{F7*^tHu?>-MMwDXN#Ee{YVkv4SXdQ|k zDhK@{p|jZvi!`0A!4Jr+Z2v&R0>21@-&VO{;R_}i?HBUCp439$S{)OPbj`Qvq*zoT z%5B-p!o&<|$&9$I3YMag1WG-({lA%}=e~3MWZL>JnuWHb)46+vKN8j!cJQ~qy5Ii? DmsY6Y delta 732 zcmV<20wevA3-bk#BYy(ANklpC-6b9hioqYog3WutXyrv4t3@=a_vkJo# z#Go+9s&$z`MqwiHQS0g>@hgCK*=?be3ru&u&ya!BlQXIN=iZyU^?Dru0002sv%cMW z000000KPT>6951J0A~>}0RR91aF%Z&gwV|5#<*$^mw&jjt$)Tb&YG9cV@=0Z`|^2O zX$EW_{14+^WS--oN zogC8Zb@mdGB!8tR3~)l}MMk~-000000H1WXUavzli%uYcVC^Yz>H z$F$XWSgbbJ+2k`F-t1X~$A@KJtP*w&`_rat+stBKZm*Md{bSP6zyB@(004lC`hL~B zbq3RVu(@nz@nGlq@M#KaF003Ombpxio^*bT!x8Xj?vY^p?6RC8vhiv(rqHDWau152u=~4*Ivdkun z)ZtIFEJInw3p`c;004lGxN5-E%<^)#g)7|x9_)()0001P>77HqFQR>Z-n}HPt)9x` ze{izqXMYhMvJ|U#I@v>3K2>dkRra6wfGk6>o`7jnCgwbS@Ezj)ts?4`L#76Tv(GlOB!F2vBZiY>D9Cv3hnJkCH zScEW|FD9W#G3a*E-4jT9%sBu60Kf+vev8~YK2`k|IRF3v0RB7I+#&}6006*$XcsW8 zieZd#eC*JnW)@?N$&L>K0002s%ez~z*SDSl0001hFU%G>00000&hi^>nntLNN?Qv6 O0000D2M~n4j(YTATG&+#nHe4X#A7 zN$i=)H>~ACWZ8fs4Nr~hpIGNDSz9n=Zj}?*;{752T=PnmeP368%lz`YEAv~uGb2Mi z1H%TJMcvM8r<%3xUA(!-C(Cn&ui8@+NnfW)Dpy@tfJQyA`WIPYGptSUL`)9XV>-JkqoNHgZ{P+1??E3QiWm}(o z`*p7SuX?%ux3tRdiJPPO3SWQy9sd1)1wR9W55oc8Z9yWgS0#ZaFhnF>6fFZW9t3fz lfoQQs2~0pLK@p96pJ91S($&j-Te(20JYD@<);T3K0RUK2!tnqA delta 385 zcmaFMJcoILN`11Yi(^Q|oVRxu`W+4sVSBK-&3uMqZ2PMDd(yIsIQdLF9nZeu%nC3* zv2v&Cg`ZFl+d?8(nw*jsL&yDXE50SNd)WvW3mgWv21 zP9W6~#^M9wZc$1A$uF3iWO~lh-~9IW=~pfM>&@lQ|GnIC)}%jNf4<$u`#eAu2P!p{ z7G1BNRomGM()U2UtHWb)VAORXH4v9?!`|kVZ-Wl8Yqyu0FO67JZe2XPGIaSB+e-}$RX|;T z^2Oy-D~&r7MKeVNpWZDpl6xj2D7g3Jr+qcASFKK5_vmlU2HtsM+bcI_@2IQTqsxSp8ivU>mYMh7=>B#8xc8pVz2AGjQzAp+&&~rUv!D>0zoH6OXU|xi{$b@Hjeo%AI`Ed}h;?acX(xmP z(OO*x1nnK=LanpE)zQCJ?C4y=`x!nHo4NHLj+v zX`(}ak4vXT3r-vX=^p_Hsi@{jd>1n^BC|V zEU35Hb0`fplMly+NX$bIcbyQrfwwhWX%Kp0?)+ywDp*;-9gmJ3Xi9z38-dF@=smmfBS(t}Po&S)%wqZ&j3L55R-+*^kI6 z8mpY1n9o>H`HiqMpa&VC3WmS$vCfP=Q-D4_-re1?z)At;rOepb0K!YMGtOAijIVce zYAV3F52hmN{=9R(j8Phwa8b01U?MMqo)uxzb=RtRo$rt7@_j%&_rsiNXRJW|q$zLp>hrLzf5k-I_>Uw6LR} zf`z8?b-S_#|Jr)uezAkYAauMebKC}u@z!u?fMkxFjTxO9ZC5F}L!yj7sQsj57?fp_ z4P>*GD%K*>FLXg;3k<4~l_&09)ixKmhU2VXy$weNz?W6a@Xphfs%8WrIC!CzF|<%z zt$MckK=QZ%qbI0(;!xp@9%67Gr%iH$NVMzf;@O#{@l4*^cmlrNW+{n&~%4c44Z4MTexJpb}s(Xp8LCS2B7A+hDGyvFAuXRUPBqk8V;|HBIx70dyAOqBI#?@Lw@<9+4M3|<2eIibk?58rv4 zEnTrFx1FMcHbZ*O_Lro4z)wa){GWza%+<^%D?ZN@l)3s;ORCumElJT?DYlevlP;qL zJb$FKPjMaapBq6W$JM}5p*gTyk9DfDIXs0`$$Y}#OSY=Z!t#i%a{t9g%%!1L5_46ny`IyWRdZBu5OeF|NK<>$BqB1 NpjVwCwYE1C{sq&`$pioZ delta 835 zcmX@deUoj1ay_$xr;B4q#hkZy*G^s)AaVR-dilG02gA8;i-a{*78!4uZ5HGs@{g&z zGwIHjUP{HDM$J(x!;igdY4wyyH|hfx;l;@zwc4~Y|kDOUu6a`IIuOY-U`BG zkdx+BgD}51HFH8(d-rs8gsi;YRa{?O_2a0ruUvIpRBrrv(ca?CwX!K0?F_PQ_f%e; zXNRbMk!aj}(pSti@C;M-_lvt`ep&hOp-G_u9^uw-8&9d`&sE+I8)v^SyGDkH7uR7unB#!+UpijO-?+daw;& zK0N=CJNfwIrTb^JKYsD+);e1u?<@c22E4q)(wOSC)@l2_+C@`Tm2ZpI?t61EKzoL0 z;|v?Q*V~gG&EYF33`-9Znf&e2laC>jVqd@gwIY@&ChqE!!VvXtr425tu5>3=Z_E`b z~LKnrZ>fv4~6nqMY{WUAyJ-ZtHBTeQCYmbX!T>!-<|{?+t;&eIw(E|$ z#mYC|ciuFt0*f)EZ*Y0%8R0nT%EafD^RCYege0m0_1Tg>Z>wx}Y<_)OPacvi8~z{m ozHDMYml2|ozelwQ!g}#k{-J)~$5q?@`~nGhy85}Sb4q9e01rWjb^rhX diff --git a/tests/testthat/_snaps/windows-4.4/shinytest2/test_update_title-001.png b/tests/testthat/_snaps/windows-4.4/shinytest2/test_update_title-001.png deleted file mode 100644 index ec1dfe9f8e4ab9d8869b97d9e1055d9b2598e2e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17951 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 Z-H(rVFCLm7e*+@=##NImWqOW}{u}LYT*LqX diff --git a/tests/testthat/_snaps/windows-4.4/shinytest2/test_update_title-002.png b/tests/testthat/_snaps/windows-4.4/shinytest2/test_update_title-002.png deleted file mode 100644 index bfee7982ceda6c0aa5aa44c945f28a7b584b7989..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18443 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 From 393cac2b81fb0e13d5293fa34fc36ef9de5fc659 Mon Sep 17 00:00:00 2001 From: andrie Date: Sun, 7 Dec 2025 11:41:39 +0000 Subject: [PATCH 07/18] Create vignette to explain fix for shiny modules --- vignettes/shiny_modules.Rmd | 346 ++++++++++++++++++++++++++++++++++++ 1 file changed, 346 insertions(+) create mode 100644 vignettes/shiny_modules.Rmd diff --git a/vignettes/shiny_modules.Rmd b/vignettes/shiny_modules.Rmd new file mode 100644 index 0000000..eeaee6a --- /dev/null +++ b/vignettes/shiny_modules.Rmd @@ -0,0 +1,346 @@ +--- +title: "Using sortable with Shiny Modules" +output: rmarkdown::html_vignette +description: > + This vignette explains how to use sortable with Shiny modules, including how to enable module support and how ID handling works with modules. +vignette: > + %\VignetteIndexEntry{Using sortable with Shiny Modules} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r, include = FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>" +) +``` + +```{css, echo=FALSE} +pre { + max-height: 15em; + overflow-y: auto; +} + +pre[class] { + max-height: 15em; +} +``` + +## Introduction + +Shiny modules provide a way to create reusable components in Shiny applications. When working with modules, namespacing of input and output IDs is crucial. Due to an early design decision, the `sortable` package (versions <= 0.5.0) did not fully support Shiny modules. This vignette explains how to use sortable with Shiny modules and the changes that were made to support this functionality. + +## Understanding the Module Namespacing Issue + +In Shiny modules, element IDs are automatically namespaced using a prefix followed by a dash. For example, if you create a module with ID "mymodule" and an input with ID "myinput", Shiny will create an ID like "mymodule-myinput". + +Initially, the `sortable` package used ID formats that were incompatible with this namespacing approach. The IDs were created as "rank-list-{id}" or "bucket-list-{id}", which placed the key part at the beginning of the ID. This caused issues with module namespacing, as reported in [GitHub issue #100](https://github.com/rstudio/sortable/issues/100). + +## Enabling and Disabling Modules Support + +The `sortable` package provides functions to control whether module support is enabled: + +### Checking the Current Status + +To check if module support is currently enabled: + +```r +is_modules_enabled() +``` + +This returns `TRUE` if module support is enabled, and `FALSE` otherwise. By default, this returns `FALSE` to maintain backward compatibility. + +### Enabling Module Support + +To enable module support: + +```r +enable_modules(TRUE) # or simply enable_modules() +``` + +When module support is enabled, the ID format changes: +- `as_rank_list_id("myid")` will return `"myid-rank-list"` (instead of `"rank-list-myid"`) +- `as_bucket_list_id("myid")` will return `"myid-bucket-list"` (instead of `"bucket-list-myid"`) + +This change puts the key part at the end, making it compatible with Shiny's module namespacing system. + +### Disabling Module Support + +To disable module support (reverting to pre-0.5.0 behavior): + +```r +enable_modules(FALSE) +``` + +This reverts the ID generation to the original format. + +### When to Enable Module Support + +Enable module support if: + +1. You're using sortable within Shiny modules +2. You're experiencing ID conflicts or namespacing issues +3. You're building a new application that uses modules + +It's best practice to call `enable_modules()` at the start of your application, before creating any UI elements. + +### Implementation Details + +Module support is implemented using a package-level environment variable: + +```r +sortable_env = new.env() +sortable_env$modules = FALSE # Default setting +``` + +The `is_modules_enabled()` function checks this environment variable, and `enable_modules()` modifies it. This approach allows the setting to persist throughout a session. + +## Example Module + +Here's an example of using a rank list inside a Shiny module: + +```r +## Example Module UI function +mod_rank_list_ui <- function(id, text, labels) { + ns <- NS(id) + fluidRow( + # Notice how input_id uses the namespace function + rank_list(text, labels, input_id = ns("rank_list_1")), + verbatimTextOutput(ns("results")) + ) +} + +## Example Module Server function +mod_rank_list_server <- function(id) { + moduleServer(id, function(input, output, session) { + output$results <- renderPrint({ + input$rank_list_1 # This matches the input_id of the rank list + }) + + # Example of updating the rank list within a module + observe({ + update_rank_list( + "rank_list_1", # ID within the module's namespace + text = "Updated title", + session = session # Important: use the module's session + ) + }) %>% + bindEvent(input$update_button) + }) +} +``` + +## Complete Example + +Below is a complete example of a Shiny app that uses modules with sortable: + +```r +library(shiny) +library(sortable) +library(magrittr) + +# First, enable modules support for sortable +enable_modules() + +# Module UI definition +mod_rank_list_ui <- function(id, text, labels) { + ns <- NS(id) + fluidRow( + rank_list(text, labels, input_id = ns("rank_list_1")), + verbatimTextOutput(ns("results")), + actionButton(ns("btnUpdateRank"), "Update rank list title") + ) +} + +# Module server definition +mod_rank_list_server <- function(id) { + moduleServer(id, function(input, output, session) { + counter_bucket <- reactiveVal(1) + + output$results <- renderPrint({ + input$rank_list_1 # This matches the input_id of the rank list + }) + + observe({ + update_rank_list( + "rank_list_1", + text = paste("You pressed the update button", counter_bucket(), "times"), + session = session + ) + counter_bucket(counter_bucket() + 1) + }) %>% + bindEvent(input$btnUpdateRank) + }) +} + +# Main app UI +ui <- fluidPage( + tags$h1("Sortable with Shiny Modules"), + fluidRow( + column( + width = 6, + h2("Rank list A"), + mod_rank_list_ui( + id = "rl1", + text = "Change the order", + labels = letters[1:5] + ) + ), + column( + width = 6, + h2("Rank list B"), + mod_rank_list_ui( + id = "rl2", + text = "Second order", + labels = LETTERS[6:10] + ) + ) + ) +) + +# Main app server +server <- function(input, output, session) { + mod_rank_list_server("rl1") + mod_rank_list_server("rl2") +} + +shinyApp(ui, server) +``` + +You can also find an example in the package at `system.file("shiny/modules/app.R", package = "sortable")`. + +## Explaining the Fix for Issue #100 + +### The Problem + +GitHub issue [#100](https://github.com/rstudio/sortable/issues/100) reported that the `sortable` package didn't work correctly with Shiny modules. The core problem was in how the package generated HTML element IDs. + +In the original implementation: + +1. For rank lists, IDs were created as `"rank-list-{id}"` (e.g., `"rank-list-mylist"`) +2. For bucket lists, IDs were created as `"bucket-list-{id}"` (e.g., `"bucket-list-mybucket"`) + +When using these within Shiny modules, the namespace would be applied to the whole ID: + +``` +Module namespace: "mymodule" +Rank list ID: "rank-list-mylist" +Result in module: "mymodule-rank-list-mylist" +``` + +This created a problem because the module namespace was separating the "rank-list" prefix from the actual ID, breaking the internal logic of the sortable package which expected the prefix to be intact. + +### The Solution + +The solution implemented in the fix was to: + +1. Add an environment flag to control whether "module mode" is enabled +2. When module mode is enabled, change the ID format to place the key part at the end: + - From: `"rank-list-{id}"` to `"{id}-rank-list"` + - From: `"bucket-list-{id}"` to `"{id}-bucket-list"` + +This change ensures that when a module namespace is applied, it doesn't break the logical structure: + +``` +Module namespace: "mymodule" +Rank list ID (with fix): "mylist-rank-list" +Result in module: "mymodule-mylist-rank-list" +``` + +In this format, the namespace is correctly applied as a prefix, while the essential ID structure (`"{id}-rank-list"`) remains intact. + +### Implementation Details + +The fix was implemented in the following files: + +1. In `R/methods.R`, two key functions were updated: + +```r +# The names must be suffix values to allow for modules which use prefix values +# https://github.com/rstudio/sortable/issues/100 +as_rank_list_id <- function(id, use_module = is_modules_enabled()) { + if (use_module){ + paste0(id, "-rank-list") # New format: {id}-rank-list + } else { + paste0("rank-list-", id) # Original format: rank-list-{id} + } +} + +as_bucket_list_id <- function(id, use_module = is_modules_enabled()) { + if (use_module){ + paste0(id, "-bucket-list") # New format: {id}-bucket-list + } else { + paste0("bucket-list-", id) # Original format: bucket-list-{id} + } +} +``` + +2. In `R/modules.R`, functions were added to manage the module mode: + +```r +# Create environment for storing shiny module status +sortable_env = new.env() +sortable_env$modules = FALSE + +# Check if modules are enabled +is_modules_enabled <- function(){ + isTRUE(sortable_env$modules) +} + +# Enable or disable modules +enable_modules <- function(enable = TRUE){ + assertthat::assert_that(is.logical(enable)) + sortable_env$modules = enable + is_modules_enabled() +} +``` + +### Testing the Fix + +The fix was tested with the test file `tests/testthat/test-modules.R`: + +```r +test_that("ids and modules are consistent", { + expect_false(is_modules_enabled()) + expect_equal(as_rank_list_id("one"), "rank-list-one") + + enable_modules() + expect_true(is_modules_enabled()) + expect_equal(as_rank_list_id("one"), "one-rank-list") + + enable_modules(FALSE) + expect_false(is_modules_enabled()) + expect_equal(as_rank_list_id("one"), "rank-list-one") +}) +``` + +### Backward Compatibility + +The fix was designed to be backward compatible: + +1. By default, module mode is disabled (`sortable_env$modules = FALSE`) +2. Users must explicitly opt-in by calling `enable_modules()` +3. Existing code that doesn't use modules continues to work without changes + +This approach ensures that existing applications won't break, while providing a path forward for applications that need module support. + +## Summary + +This vignette has explained: + +1. The issue with using sortable in Shiny modules (GitHub issue #100) +2. How to enable module support using `enable_modules()` +3. How the ID format changes when module support is enabled +4. Examples of using sortable with Shiny modules +5. The technical details of the fix + +## Best Practices + +When using sortable with Shiny modules: + +1. Call `enable_modules()` at the start of your application +2. Always use the `ns()` function for input IDs in module UI functions +3. Use the correct session object when updating rank or bucket lists from module server functions + +Following these practices will ensure that your sortable elements work correctly within Shiny modules. \ No newline at end of file From 008ec35403eb4425a048782dac8951c55b638c86 Mon Sep 17 00:00:00 2001 From: andrie Date: Sun, 7 Dec 2025 11:59:02 +0000 Subject: [PATCH 08/18] Add shiny_modules.Rmd to pkgdown --- _pkgdown.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_pkgdown.yml b/_pkgdown.yml index e5dd834..a1cfbb3 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -35,6 +35,7 @@ reference: - sortable tutorials: + - name: tutorial_question_rank title: Using ranking questions in learnr url: https://andrie-de-vries.shinyapps.io/sortable_tutorial_question_rank/ @@ -53,3 +54,7 @@ articles: - novel_solutions - cloning - updating_rank_list + +- title: Using sortable with shiny modules` + contents: + - shiny_modules From 4631125d08ad4e45af05fbdc2e5848cdb8fad0d1 Mon Sep 17 00:00:00 2001 From: andrie Date: Sun, 7 Dec 2025 12:08:50 +0000 Subject: [PATCH 09/18] Include shiny modules vignette in pkgdown site --- _pkgdown.yml | 2 +- vignettes/shiny_modules.Rmd | 293 +++--------------------------------- 2 files changed, 24 insertions(+), 271 deletions(-) diff --git a/_pkgdown.yml b/_pkgdown.yml index a1cfbb3..d2d82bd 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -55,6 +55,6 @@ articles: - cloning - updating_rank_list -- title: Using sortable with shiny modules` +- title: Using `sortable` with `shiny` modules contents: - shiny_modules diff --git a/vignettes/shiny_modules.Rmd b/vignettes/shiny_modules.Rmd index eeaee6a..da6a7a1 100644 --- a/vignettes/shiny_modules.Rmd +++ b/vignettes/shiny_modules.Rmd @@ -1,10 +1,10 @@ --- -title: "Using sortable with Shiny Modules" +title: "Using `sortable` with `shiny` modules" output: rmarkdown::html_vignette description: > - This vignette explains how to use sortable with Shiny modules, including how to enable module support and how ID handling works with modules. + This vignette explains how to use sortable with `shiny` modules, including how to enable module support and how ID handling works with modules. vignette: > - %\VignetteIndexEntry{Using sortable with Shiny Modules} + %\VignetteIndexEntry{Using sortable with shiny modules} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- @@ -27,21 +27,37 @@ pre[class] { } ``` + +## tl;dr + +If you use `sortable` with `shiny` modules, opt into a fix by adding this line of code to your app: + +```r +enable_modules(TRUE) # or simply enable_modules() +``` + + ## Introduction -Shiny modules provide a way to create reusable components in Shiny applications. When working with modules, namespacing of input and output IDs is crucial. Due to an early design decision, the `sortable` package (versions <= 0.5.0) did not fully support Shiny modules. This vignette explains how to use sortable with Shiny modules and the changes that were made to support this functionality. +Shiny modules provide a way to create reusable components in Shiny applications. When working with modules, namespacing of input and output IDs is crucial. + +Due to an early design decision, the `sortable` package (`versions <= 0.5.0`) did not fully support Shiny modules. + +This vignette explains how to use sortable with Shiny modules and the changes that were made to support this functionality. + ## Understanding the Module Namespacing Issue In Shiny modules, element IDs are automatically namespaced using a prefix followed by a dash. For example, if you create a module with ID "mymodule" and an input with ID "myinput", Shiny will create an ID like "mymodule-myinput". -Initially, the `sortable` package used ID formats that were incompatible with this namespacing approach. The IDs were created as "rank-list-{id}" or "bucket-list-{id}", which placed the key part at the beginning of the ID. This caused issues with module namespacing, as reported in [GitHub issue #100](https://github.com/rstudio/sortable/issues/100). +Initially, the `sortable` package used ID formats that were incompatible with this namespacing approach. The IDs were created as `rank-list-{id}` or `bucket-list-{id}`, which placed the key part at the beginning of the ID. + -## Enabling and Disabling Modules Support + +## Enabling and disabling shiny modules support The `sortable` package provides functions to control whether module support is enabled: -### Checking the Current Status To check if module support is currently enabled: @@ -49,9 +65,6 @@ To check if module support is currently enabled: is_modules_enabled() ``` -This returns `TRUE` if module support is enabled, and `FALSE` otherwise. By default, this returns `FALSE` to maintain backward compatibility. - -### Enabling Module Support To enable module support: @@ -65,7 +78,6 @@ When module support is enabled, the ID format changes: This change puts the key part at the end, making it compatible with Shiny's module namespacing system. -### Disabling Module Support To disable module support (reverting to pre-0.5.0 behavior): @@ -73,247 +85,6 @@ To disable module support (reverting to pre-0.5.0 behavior): enable_modules(FALSE) ``` -This reverts the ID generation to the original format. - -### When to Enable Module Support - -Enable module support if: - -1. You're using sortable within Shiny modules -2. You're experiencing ID conflicts or namespacing issues -3. You're building a new application that uses modules - -It's best practice to call `enable_modules()` at the start of your application, before creating any UI elements. - -### Implementation Details - -Module support is implemented using a package-level environment variable: - -```r -sortable_env = new.env() -sortable_env$modules = FALSE # Default setting -``` - -The `is_modules_enabled()` function checks this environment variable, and `enable_modules()` modifies it. This approach allows the setting to persist throughout a session. - -## Example Module - -Here's an example of using a rank list inside a Shiny module: - -```r -## Example Module UI function -mod_rank_list_ui <- function(id, text, labels) { - ns <- NS(id) - fluidRow( - # Notice how input_id uses the namespace function - rank_list(text, labels, input_id = ns("rank_list_1")), - verbatimTextOutput(ns("results")) - ) -} - -## Example Module Server function -mod_rank_list_server <- function(id) { - moduleServer(id, function(input, output, session) { - output$results <- renderPrint({ - input$rank_list_1 # This matches the input_id of the rank list - }) - - # Example of updating the rank list within a module - observe({ - update_rank_list( - "rank_list_1", # ID within the module's namespace - text = "Updated title", - session = session # Important: use the module's session - ) - }) %>% - bindEvent(input$update_button) - }) -} -``` - -## Complete Example - -Below is a complete example of a Shiny app that uses modules with sortable: - -```r -library(shiny) -library(sortable) -library(magrittr) - -# First, enable modules support for sortable -enable_modules() - -# Module UI definition -mod_rank_list_ui <- function(id, text, labels) { - ns <- NS(id) - fluidRow( - rank_list(text, labels, input_id = ns("rank_list_1")), - verbatimTextOutput(ns("results")), - actionButton(ns("btnUpdateRank"), "Update rank list title") - ) -} - -# Module server definition -mod_rank_list_server <- function(id) { - moduleServer(id, function(input, output, session) { - counter_bucket <- reactiveVal(1) - - output$results <- renderPrint({ - input$rank_list_1 # This matches the input_id of the rank list - }) - - observe({ - update_rank_list( - "rank_list_1", - text = paste("You pressed the update button", counter_bucket(), "times"), - session = session - ) - counter_bucket(counter_bucket() + 1) - }) %>% - bindEvent(input$btnUpdateRank) - }) -} - -# Main app UI -ui <- fluidPage( - tags$h1("Sortable with Shiny Modules"), - fluidRow( - column( - width = 6, - h2("Rank list A"), - mod_rank_list_ui( - id = "rl1", - text = "Change the order", - labels = letters[1:5] - ) - ), - column( - width = 6, - h2("Rank list B"), - mod_rank_list_ui( - id = "rl2", - text = "Second order", - labels = LETTERS[6:10] - ) - ) - ) -) - -# Main app server -server <- function(input, output, session) { - mod_rank_list_server("rl1") - mod_rank_list_server("rl2") -} - -shinyApp(ui, server) -``` - -You can also find an example in the package at `system.file("shiny/modules/app.R", package = "sortable")`. - -## Explaining the Fix for Issue #100 - -### The Problem - -GitHub issue [#100](https://github.com/rstudio/sortable/issues/100) reported that the `sortable` package didn't work correctly with Shiny modules. The core problem was in how the package generated HTML element IDs. - -In the original implementation: - -1. For rank lists, IDs were created as `"rank-list-{id}"` (e.g., `"rank-list-mylist"`) -2. For bucket lists, IDs were created as `"bucket-list-{id}"` (e.g., `"bucket-list-mybucket"`) - -When using these within Shiny modules, the namespace would be applied to the whole ID: - -``` -Module namespace: "mymodule" -Rank list ID: "rank-list-mylist" -Result in module: "mymodule-rank-list-mylist" -``` - -This created a problem because the module namespace was separating the "rank-list" prefix from the actual ID, breaking the internal logic of the sortable package which expected the prefix to be intact. - -### The Solution - -The solution implemented in the fix was to: - -1. Add an environment flag to control whether "module mode" is enabled -2. When module mode is enabled, change the ID format to place the key part at the end: - - From: `"rank-list-{id}"` to `"{id}-rank-list"` - - From: `"bucket-list-{id}"` to `"{id}-bucket-list"` - -This change ensures that when a module namespace is applied, it doesn't break the logical structure: - -``` -Module namespace: "mymodule" -Rank list ID (with fix): "mylist-rank-list" -Result in module: "mymodule-mylist-rank-list" -``` - -In this format, the namespace is correctly applied as a prefix, while the essential ID structure (`"{id}-rank-list"`) remains intact. - -### Implementation Details - -The fix was implemented in the following files: - -1. In `R/methods.R`, two key functions were updated: - -```r -# The names must be suffix values to allow for modules which use prefix values -# https://github.com/rstudio/sortable/issues/100 -as_rank_list_id <- function(id, use_module = is_modules_enabled()) { - if (use_module){ - paste0(id, "-rank-list") # New format: {id}-rank-list - } else { - paste0("rank-list-", id) # Original format: rank-list-{id} - } -} - -as_bucket_list_id <- function(id, use_module = is_modules_enabled()) { - if (use_module){ - paste0(id, "-bucket-list") # New format: {id}-bucket-list - } else { - paste0("bucket-list-", id) # Original format: bucket-list-{id} - } -} -``` - -2. In `R/modules.R`, functions were added to manage the module mode: - -```r -# Create environment for storing shiny module status -sortable_env = new.env() -sortable_env$modules = FALSE - -# Check if modules are enabled -is_modules_enabled <- function(){ - isTRUE(sortable_env$modules) -} - -# Enable or disable modules -enable_modules <- function(enable = TRUE){ - assertthat::assert_that(is.logical(enable)) - sortable_env$modules = enable - is_modules_enabled() -} -``` - -### Testing the Fix - -The fix was tested with the test file `tests/testthat/test-modules.R`: - -```r -test_that("ids and modules are consistent", { - expect_false(is_modules_enabled()) - expect_equal(as_rank_list_id("one"), "rank-list-one") - - enable_modules() - expect_true(is_modules_enabled()) - expect_equal(as_rank_list_id("one"), "one-rank-list") - - enable_modules(FALSE) - expect_false(is_modules_enabled()) - expect_equal(as_rank_list_id("one"), "rank-list-one") -}) -``` ### Backward Compatibility @@ -325,22 +96,4 @@ The fix was designed to be backward compatible: This approach ensures that existing applications won't break, while providing a path forward for applications that need module support. -## Summary - -This vignette has explained: - -1. The issue with using sortable in Shiny modules (GitHub issue #100) -2. How to enable module support using `enable_modules()` -3. How the ID format changes when module support is enabled -4. Examples of using sortable with Shiny modules -5. The technical details of the fix - -## Best Practices - -When using sortable with Shiny modules: - -1. Call `enable_modules()` at the start of your application -2. Always use the `ns()` function for input IDs in module UI functions -3. Use the correct session object when updating rank or bucket lists from module server functions -Following these practices will ensure that your sortable elements work correctly within Shiny modules. \ No newline at end of file From af55ff3bdcbbfd36900cc407d95a0f74e7557ef0 Mon Sep 17 00:00:00 2001 From: andrie Date: Sun, 7 Dec 2025 12:08:50 +0000 Subject: [PATCH 10/18] Include shiny modules vignette in pkgdown site --- _pkgdown.yml | 2 +- vignettes/shiny_modules.Rmd | 293 +++--------------------------------- 2 files changed, 24 insertions(+), 271 deletions(-) diff --git a/_pkgdown.yml b/_pkgdown.yml index a1cfbb3..d2d82bd 100644 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -55,6 +55,6 @@ articles: - cloning - updating_rank_list -- title: Using sortable with shiny modules` +- title: Using `sortable` with `shiny` modules contents: - shiny_modules diff --git a/vignettes/shiny_modules.Rmd b/vignettes/shiny_modules.Rmd index eeaee6a..1680ab0 100644 --- a/vignettes/shiny_modules.Rmd +++ b/vignettes/shiny_modules.Rmd @@ -1,10 +1,10 @@ --- -title: "Using sortable with Shiny Modules" +title: "Using `sortable` with `shiny` modules" output: rmarkdown::html_vignette description: > - This vignette explains how to use sortable with Shiny modules, including how to enable module support and how ID handling works with modules. + This vignette explains how to use sortable with `shiny` modules, including how to enable module support and how ID handling works with modules. vignette: > - %\VignetteIndexEntry{Using sortable with Shiny Modules} + %\VignetteIndexEntry{Using `sortable` with `shiny` modules} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- @@ -27,21 +27,37 @@ pre[class] { } ``` + +## tl;dr + +If you use `sortable` with `shiny` modules, opt into a fix by adding this line of code to your app: + +```r +enable_modules(TRUE) # or simply enable_modules() +``` + + ## Introduction -Shiny modules provide a way to create reusable components in Shiny applications. When working with modules, namespacing of input and output IDs is crucial. Due to an early design decision, the `sortable` package (versions <= 0.5.0) did not fully support Shiny modules. This vignette explains how to use sortable with Shiny modules and the changes that were made to support this functionality. +Shiny modules provide a way to create reusable components in Shiny applications. When working with modules, namespacing of input and output IDs is crucial. + +Due to an early design decision, the `sortable` package (`versions <= 0.5.0`) did not fully support Shiny modules. + +This vignette explains how to use sortable with Shiny modules and the changes that were made to support this functionality. + ## Understanding the Module Namespacing Issue In Shiny modules, element IDs are automatically namespaced using a prefix followed by a dash. For example, if you create a module with ID "mymodule" and an input with ID "myinput", Shiny will create an ID like "mymodule-myinput". -Initially, the `sortable` package used ID formats that were incompatible with this namespacing approach. The IDs were created as "rank-list-{id}" or "bucket-list-{id}", which placed the key part at the beginning of the ID. This caused issues with module namespacing, as reported in [GitHub issue #100](https://github.com/rstudio/sortable/issues/100). +Initially, the `sortable` package used ID formats that were incompatible with this namespacing approach. The IDs were created as `rank-list-{id}` or `bucket-list-{id}`, which placed the key part at the beginning of the ID. + -## Enabling and Disabling Modules Support + +## Enabling and disabling shiny modules support The `sortable` package provides functions to control whether module support is enabled: -### Checking the Current Status To check if module support is currently enabled: @@ -49,9 +65,6 @@ To check if module support is currently enabled: is_modules_enabled() ``` -This returns `TRUE` if module support is enabled, and `FALSE` otherwise. By default, this returns `FALSE` to maintain backward compatibility. - -### Enabling Module Support To enable module support: @@ -65,7 +78,6 @@ When module support is enabled, the ID format changes: This change puts the key part at the end, making it compatible with Shiny's module namespacing system. -### Disabling Module Support To disable module support (reverting to pre-0.5.0 behavior): @@ -73,247 +85,6 @@ To disable module support (reverting to pre-0.5.0 behavior): enable_modules(FALSE) ``` -This reverts the ID generation to the original format. - -### When to Enable Module Support - -Enable module support if: - -1. You're using sortable within Shiny modules -2. You're experiencing ID conflicts or namespacing issues -3. You're building a new application that uses modules - -It's best practice to call `enable_modules()` at the start of your application, before creating any UI elements. - -### Implementation Details - -Module support is implemented using a package-level environment variable: - -```r -sortable_env = new.env() -sortable_env$modules = FALSE # Default setting -``` - -The `is_modules_enabled()` function checks this environment variable, and `enable_modules()` modifies it. This approach allows the setting to persist throughout a session. - -## Example Module - -Here's an example of using a rank list inside a Shiny module: - -```r -## Example Module UI function -mod_rank_list_ui <- function(id, text, labels) { - ns <- NS(id) - fluidRow( - # Notice how input_id uses the namespace function - rank_list(text, labels, input_id = ns("rank_list_1")), - verbatimTextOutput(ns("results")) - ) -} - -## Example Module Server function -mod_rank_list_server <- function(id) { - moduleServer(id, function(input, output, session) { - output$results <- renderPrint({ - input$rank_list_1 # This matches the input_id of the rank list - }) - - # Example of updating the rank list within a module - observe({ - update_rank_list( - "rank_list_1", # ID within the module's namespace - text = "Updated title", - session = session # Important: use the module's session - ) - }) %>% - bindEvent(input$update_button) - }) -} -``` - -## Complete Example - -Below is a complete example of a Shiny app that uses modules with sortable: - -```r -library(shiny) -library(sortable) -library(magrittr) - -# First, enable modules support for sortable -enable_modules() - -# Module UI definition -mod_rank_list_ui <- function(id, text, labels) { - ns <- NS(id) - fluidRow( - rank_list(text, labels, input_id = ns("rank_list_1")), - verbatimTextOutput(ns("results")), - actionButton(ns("btnUpdateRank"), "Update rank list title") - ) -} - -# Module server definition -mod_rank_list_server <- function(id) { - moduleServer(id, function(input, output, session) { - counter_bucket <- reactiveVal(1) - - output$results <- renderPrint({ - input$rank_list_1 # This matches the input_id of the rank list - }) - - observe({ - update_rank_list( - "rank_list_1", - text = paste("You pressed the update button", counter_bucket(), "times"), - session = session - ) - counter_bucket(counter_bucket() + 1) - }) %>% - bindEvent(input$btnUpdateRank) - }) -} - -# Main app UI -ui <- fluidPage( - tags$h1("Sortable with Shiny Modules"), - fluidRow( - column( - width = 6, - h2("Rank list A"), - mod_rank_list_ui( - id = "rl1", - text = "Change the order", - labels = letters[1:5] - ) - ), - column( - width = 6, - h2("Rank list B"), - mod_rank_list_ui( - id = "rl2", - text = "Second order", - labels = LETTERS[6:10] - ) - ) - ) -) - -# Main app server -server <- function(input, output, session) { - mod_rank_list_server("rl1") - mod_rank_list_server("rl2") -} - -shinyApp(ui, server) -``` - -You can also find an example in the package at `system.file("shiny/modules/app.R", package = "sortable")`. - -## Explaining the Fix for Issue #100 - -### The Problem - -GitHub issue [#100](https://github.com/rstudio/sortable/issues/100) reported that the `sortable` package didn't work correctly with Shiny modules. The core problem was in how the package generated HTML element IDs. - -In the original implementation: - -1. For rank lists, IDs were created as `"rank-list-{id}"` (e.g., `"rank-list-mylist"`) -2. For bucket lists, IDs were created as `"bucket-list-{id}"` (e.g., `"bucket-list-mybucket"`) - -When using these within Shiny modules, the namespace would be applied to the whole ID: - -``` -Module namespace: "mymodule" -Rank list ID: "rank-list-mylist" -Result in module: "mymodule-rank-list-mylist" -``` - -This created a problem because the module namespace was separating the "rank-list" prefix from the actual ID, breaking the internal logic of the sortable package which expected the prefix to be intact. - -### The Solution - -The solution implemented in the fix was to: - -1. Add an environment flag to control whether "module mode" is enabled -2. When module mode is enabled, change the ID format to place the key part at the end: - - From: `"rank-list-{id}"` to `"{id}-rank-list"` - - From: `"bucket-list-{id}"` to `"{id}-bucket-list"` - -This change ensures that when a module namespace is applied, it doesn't break the logical structure: - -``` -Module namespace: "mymodule" -Rank list ID (with fix): "mylist-rank-list" -Result in module: "mymodule-mylist-rank-list" -``` - -In this format, the namespace is correctly applied as a prefix, while the essential ID structure (`"{id}-rank-list"`) remains intact. - -### Implementation Details - -The fix was implemented in the following files: - -1. In `R/methods.R`, two key functions were updated: - -```r -# The names must be suffix values to allow for modules which use prefix values -# https://github.com/rstudio/sortable/issues/100 -as_rank_list_id <- function(id, use_module = is_modules_enabled()) { - if (use_module){ - paste0(id, "-rank-list") # New format: {id}-rank-list - } else { - paste0("rank-list-", id) # Original format: rank-list-{id} - } -} - -as_bucket_list_id <- function(id, use_module = is_modules_enabled()) { - if (use_module){ - paste0(id, "-bucket-list") # New format: {id}-bucket-list - } else { - paste0("bucket-list-", id) # Original format: bucket-list-{id} - } -} -``` - -2. In `R/modules.R`, functions were added to manage the module mode: - -```r -# Create environment for storing shiny module status -sortable_env = new.env() -sortable_env$modules = FALSE - -# Check if modules are enabled -is_modules_enabled <- function(){ - isTRUE(sortable_env$modules) -} - -# Enable or disable modules -enable_modules <- function(enable = TRUE){ - assertthat::assert_that(is.logical(enable)) - sortable_env$modules = enable - is_modules_enabled() -} -``` - -### Testing the Fix - -The fix was tested with the test file `tests/testthat/test-modules.R`: - -```r -test_that("ids and modules are consistent", { - expect_false(is_modules_enabled()) - expect_equal(as_rank_list_id("one"), "rank-list-one") - - enable_modules() - expect_true(is_modules_enabled()) - expect_equal(as_rank_list_id("one"), "one-rank-list") - - enable_modules(FALSE) - expect_false(is_modules_enabled()) - expect_equal(as_rank_list_id("one"), "rank-list-one") -}) -``` ### Backward Compatibility @@ -325,22 +96,4 @@ The fix was designed to be backward compatible: This approach ensures that existing applications won't break, while providing a path forward for applications that need module support. -## Summary - -This vignette has explained: - -1. The issue with using sortable in Shiny modules (GitHub issue #100) -2. How to enable module support using `enable_modules()` -3. How the ID format changes when module support is enabled -4. Examples of using sortable with Shiny modules -5. The technical details of the fix - -## Best Practices - -When using sortable with Shiny modules: - -1. Call `enable_modules()` at the start of your application -2. Always use the `ns()` function for input IDs in module UI functions -3. Use the correct session object when updating rank or bucket lists from module server functions -Following these practices will ensure that your sortable elements work correctly within Shiny modules. \ No newline at end of file From 99deb0e6185914b4a8b0dc291410e7273420abef Mon Sep 17 00:00:00 2001 From: andrie Date: Sun, 7 Dec 2025 12:15:55 +0000 Subject: [PATCH 11/18] Bump version to 0.6.0 --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index f2e85c9..6553490 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Type: Package Package: sortable Title: Drag-and-Drop in 'shiny' Apps with 'SortableJS' -Version: 0.5.0.9000 +Version: 0.6.0 Authors@R: c(person(given = "Andrie", family = "de Vries", From 8ddf5df6cf498bf87b99262b12cb6be9f029a0ed Mon Sep 17 00:00:00 2001 From: andrie Date: Sun, 7 Dec 2025 12:24:31 +0000 Subject: [PATCH 12/18] `usethis::use_tidy_description()` (GitHub Actions) --- DESCRIPTION | 65 +++++++++++++++++++++++------------------------------ 1 file changed, 28 insertions(+), 37 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 6553490..877ffa1 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -2,58 +2,49 @@ Type: Package Package: sortable Title: Drag-and-Drop in 'shiny' Apps with 'SortableJS' Version: 0.6.0 -Authors@R: - c(person(given = "Andrie", - family = "de Vries", - role = c("cre", "aut"), - email = "apdevries@gmail.com"), - person(given = "Barret", - family = "Schloerke", - role = "aut", - email = "barret@posit.co"), - person(given = "Kenton", - family = "Russell", - role = c("aut", "ccp"), - email = "kent.russell@timelyportfolio.com", - comment = "Original author"), - person("Posit", role = c("cph", "fnd")), - person(given = "Lebedev", - family = "Konstantin", - role = "cph", - comment = "'SortableJS', https://sortablejs.github.io/Sortable/")) -Description: Enables drag-and-drop behaviour in Shiny apps, by exposing the - functionality of the 'SortableJS' - JavaScript library as an 'htmlwidget'. - You can use this in Shiny apps and widgets, 'learnr' tutorials as well as - R Markdown. In addition, provides a custom 'learnr' question type - - 'question_rank()' - that allows ranking questions with drag-and-drop. +Authors@R: c( + person("Andrie", "de Vries", , "apdevries@gmail.com", role = c("cre", "aut")), + person("Barret", "Schloerke", , "barret@posit.co", role = "aut"), + person("Kenton", "Russell", , "kent.russell@timelyportfolio.com", role = c("aut", "ccp"), + comment = "Original author"), + person("Posit", role = c("cph", "fnd")), + person("Lebedev", "Konstantin", role = "cph", + comment = "'SortableJS', https://sortablejs.github.io/Sortable/") + ) +Description: Enables drag-and-drop behaviour in Shiny apps, by exposing + the functionality of the 'SortableJS' + JavaScript library as an + 'htmlwidget'. You can use this in Shiny apps and widgets, 'learnr' + tutorials as well as R Markdown. In addition, provides a custom + 'learnr' question type - 'question_rank()' - that allows ranking + questions with drag-and-drop. License: MIT + file LICENSE URL: https://rstudio.github.io/sortable/ BugReports: https://github.com/rstudio/sortable/issues Imports: + assertthat, htmltools, htmlwidgets, + jsonlite, learnr (>= 0.10.0), + rlang (>= 1.0.0), shiny (>= 1.9.0), - assertthat, - jsonlite, - utils, - rlang (>= 1.0.0) + utils Suggests: base64enc, + covr, knitr, - testthat (>= 2.1.0), - withr, - rmarkdown, magrittr, - webshot, + rmarkdown, + shinytest2, spelling, - covr, - shinytest2 + testthat (>= 2.1.0), + webshot, + withr VignetteBuilder: knitr +Config/testthat/edition: 3 Encoding: UTF-8 +Language: en-US Roxygen: list(markdown = TRUE) RoxygenNote: 7.3.3 -Language: en-US -Config/testthat/edition: 3 From f23988c8b3409968fefe77156ad22a31702c1632 Mon Sep 17 00:00:00 2001 From: andrie Date: Sun, 7 Dec 2025 12:24:34 +0000 Subject: [PATCH 13/18] `devtools::build_readme()` (GitHub Actions) --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 95f01b0..6d169e5 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,4 @@ - # sortable From 63fbd8e397eff9e94d550828b3dd62757be909a0 Mon Sep 17 00:00:00 2001 From: andrie Date: Sun, 7 Dec 2025 12:45:42 +0000 Subject: [PATCH 14/18] Fix failing tests --- tests/testthat/test-shinytest2.R | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/tests/testthat/test-shinytest2.R b/tests/testthat/test-shinytest2.R index 3c00b94..6715d55 100644 --- a/tests/testthat/test-shinytest2.R +++ b/tests/testthat/test-shinytest2.R @@ -1,13 +1,9 @@ library(shinytest2) -# test_that("getwd", { -# expect_equal(getwd(), "tests/") -# }) - -app_dir= "../../inst/shiny/update_rank_list" +app_dir <- system.file("shiny/update_rank_list", package = "sortable") test_that("{shinytest2} recording: test_update_title", { - app <- AppDriver$new(variant = platform_variant(), name = "test_update_title", + app <- AppDriver$new(variant = platform_variant(), name = "test_update_title", app_dir =app_dir, seed = 123, height = 945, width = 1619) app$expect_screenshot() @@ -17,19 +13,19 @@ test_that("{shinytest2} recording: test_update_title", { test_that("{shinytest2} recording: test_change_labels", { - app <- AppDriver$new(name = "test_change_labels", + app <- AppDriver$new(name = "test_change_labels", app_dir =app_dir, seed = 123, height = 945, width = 1619) app$expect_values(output = "results") app$click("btnChangeLabels") - app$set_inputs(rank_list_1 = c("W", "C", "R", "F", "I"), allow_no_input_binding_ = TRUE, + app$set_inputs(rank_list_1 = c("W", "C", "R", "F", "I"), allow_no_input_binding_ = TRUE, priority_ = "event") app$expect_values(output = "results") }) test_that("{shinytest2} recording: test_empty_labels", { - app <- AppDriver$new(name = "test_empty_labels", + app <- AppDriver$new(name = "test_empty_labels", app_dir =app_dir, seed = 123, height = 945, width = 1619) app$expect_values(output = "results") @@ -37,7 +33,7 @@ test_that("{shinytest2} recording: test_empty_labels", { app$set_inputs(rank_list_1 = character(0), allow_no_input_binding_ = TRUE, priority_ = "event") app$expect_values(output = "results") app$click("btnChangeLabels") - app$set_inputs(rank_list_1 = c("M", "I", "Z", "W", "Q"), allow_no_input_binding_ = TRUE, + app$set_inputs(rank_list_1 = c("M", "I", "Z", "W", "Q"), allow_no_input_binding_ = TRUE, priority_ = "event") app$expect_values(output = "results") }) From 57fff619f79eebab4ecd799443deff7ea7f8e1c4 Mon Sep 17 00:00:00 2001 From: andrie Date: Sun, 7 Dec 2025 13:20:19 +0000 Subject: [PATCH 15/18] Fix failing tests --- DESCRIPTION | 1 + NAMESPACE | 1 + tests/testthat/test-shinytest2.R | 51 +++++++++++++++++++++++--------- 3 files changed, 39 insertions(+), 14 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 877ffa1..41a3fde 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -23,6 +23,7 @@ URL: https://rstudio.github.io/sortable/ BugReports: https://github.com/rstudio/sortable/issues Imports: assertthat, + cli, htmltools, htmlwidgets, jsonlite, diff --git a/NAMESPACE b/NAMESPACE index 92a675d..e4a1b40 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -25,6 +25,7 @@ export(update_rank_list) importFrom(assertthat,"on_failure<-") importFrom(assertthat,assert_that) importFrom(assertthat,is.string) +importFrom(cli,cli_text) importFrom(htmltools,tagList) importFrom(htmltools,tags) importFrom(htmlwidgets,shinyWidgetOutput) diff --git a/tests/testthat/test-shinytest2.R b/tests/testthat/test-shinytest2.R index 6715d55..c6e0ebd 100644 --- a/tests/testthat/test-shinytest2.R +++ b/tests/testthat/test-shinytest2.R @@ -3,9 +3,14 @@ library(shinytest2) app_dir <- system.file("shiny/update_rank_list", package = "sortable") test_that("{shinytest2} recording: test_update_title", { - app <- AppDriver$new(variant = platform_variant(), name = "test_update_title", - app_dir =app_dir, - seed = 123, height = 945, width = 1619) + app <- AppDriver$new( + variant = platform_variant(), + name = "test_update_title", + app_dir = app_dir, + seed = 123, + height = 945, + width = 1619 + ) app$expect_screenshot() app$click("btnUpdateRank") app$expect_screenshot() @@ -13,27 +18,45 @@ test_that("{shinytest2} recording: test_update_title", { test_that("{shinytest2} recording: test_change_labels", { - app <- AppDriver$new(name = "test_change_labels", - app_dir =app_dir, - seed = 123, height = 945, width = 1619) + app <- AppDriver$new( + name = "test_change_labels", + app_dir = app_dir, + seed = 123, + height = 945, + width = 1619 + ) app$expect_values(output = "results") app$click("btnChangeLabels") - app$set_inputs(rank_list_1 = c("W", "C", "R", "F", "I"), allow_no_input_binding_ = TRUE, - priority_ = "event") + app$set_inputs( + rank_list_1 = c("W", "C", "R", "F", "I"), + allow_no_input_binding_ = TRUE, + priority_ = "event" + ) app$expect_values(output = "results") }) test_that("{shinytest2} recording: test_empty_labels", { - app <- AppDriver$new(name = "test_empty_labels", - app_dir =app_dir, - seed = 123, height = 945, width = 1619) + app <- AppDriver$new( + name = "test_empty_labels", + app_dir = app_dir, + seed = 123, + height = 945, + width = 1619 + ) app$expect_values(output = "results") app$click("btnEmptyLabels") - app$set_inputs(rank_list_1 = character(0), allow_no_input_binding_ = TRUE, priority_ = "event") + app$set_inputs( + rank_list_1 = character(0), + allow_no_input_binding_ = TRUE, + priority_ = "event" + ) app$expect_values(output = "results") app$click("btnChangeLabels") - app$set_inputs(rank_list_1 = c("M", "I", "Z", "W", "Q"), allow_no_input_binding_ = TRUE, - priority_ = "event") + app$set_inputs( + rank_list_1 = c("M", "I", "Z", "W", "Q"), + allow_no_input_binding_ = TRUE, + priority_ = "event" + ) app$expect_values(output = "results") }) From 14b6a244a28ef1d60278a0ac0b3e3a20d717a4c3 Mon Sep 17 00:00:00 2001 From: andrie Date: Sun, 7 Dec 2025 13:24:42 +0000 Subject: [PATCH 16/18] `devtools::document()` (GitHub Actions) --- NAMESPACE | 1 - 1 file changed, 1 deletion(-) diff --git a/NAMESPACE b/NAMESPACE index e4a1b40..92a675d 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -25,7 +25,6 @@ export(update_rank_list) importFrom(assertthat,"on_failure<-") importFrom(assertthat,assert_that) importFrom(assertthat,is.string) -importFrom(cli,cli_text) importFrom(htmltools,tagList) importFrom(htmltools,tags) importFrom(htmlwidgets,shinyWidgetOutput) From f784d2947baad7e71a27f82dc979ba8b29e66100 Mon Sep 17 00:00:00 2001 From: andrie Date: Sun, 7 Dec 2025 13:58:07 +0000 Subject: [PATCH 17/18] Skip shinytest2 tests on CI and CRAN --- NAMESPACE | 1 + tests/testthat/setup-shinytest2.R | 3 +-- tests/testthat/test-shinytest2.R | 9 +++++++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index 92a675d..1598c72 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -35,4 +35,5 @@ importFrom(learnr,question_is_valid) importFrom(learnr,question_ui_completed) importFrom(learnr,question_ui_initialize) importFrom(learnr,question_ui_try_again) +importFrom(rlang,inform) importFrom(utils,modifyList) diff --git a/tests/testthat/setup-shinytest2.R b/tests/testthat/setup-shinytest2.R index fa5f65c..be65b4f 100644 --- a/tests/testthat/setup-shinytest2.R +++ b/tests/testthat/setup-shinytest2.R @@ -1,3 +1,2 @@ # Load application support files into testing environment -shinytest2::load_app_env() -# print(getwd()) \ No newline at end of file +shinytest2::load_app_env() diff --git a/tests/testthat/test-shinytest2.R b/tests/testthat/test-shinytest2.R index c6e0ebd..80c2369 100644 --- a/tests/testthat/test-shinytest2.R +++ b/tests/testthat/test-shinytest2.R @@ -3,6 +3,9 @@ library(shinytest2) app_dir <- system.file("shiny/update_rank_list", package = "sortable") test_that("{shinytest2} recording: test_update_title", { + skip_on_cran() + skip_on_ci() + app <- AppDriver$new( variant = platform_variant(), name = "test_update_title", @@ -18,6 +21,9 @@ test_that("{shinytest2} recording: test_update_title", { test_that("{shinytest2} recording: test_change_labels", { + skip_on_cran() + skip_on_ci() + app <- AppDriver$new( name = "test_change_labels", app_dir = app_dir, @@ -37,6 +43,9 @@ test_that("{shinytest2} recording: test_change_labels", { test_that("{shinytest2} recording: test_empty_labels", { + skip_on_cran() + skip_on_ci() + app <- AppDriver$new( name = "test_empty_labels", app_dir = app_dir, From 5505fa7303794d1b3d5ec697b50b0c1004a43fa9 Mon Sep 17 00:00:00 2001 From: andrie Date: Sun, 7 Dec 2025 14:03:58 +0000 Subject: [PATCH 18/18] `devtools::document()` (GitHub Actions) --- NAMESPACE | 1 - 1 file changed, 1 deletion(-) diff --git a/NAMESPACE b/NAMESPACE index 1598c72..92a675d 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -35,5 +35,4 @@ importFrom(learnr,question_is_valid) importFrom(learnr,question_ui_completed) importFrom(learnr,question_ui_initialize) importFrom(learnr,question_ui_try_again) -importFrom(rlang,inform) importFrom(utils,modifyList)