diff --git a/.github/ISSUE_TEMPLATE/composant.md b/.github/ISSUE_TEMPLATE/composant.md index 6fa6a6e3..d9cc9fba 100644 --- a/.github/ISSUE_TEMPLATE/composant.md +++ b/.github/ISSUE_TEMPLATE/composant.md @@ -9,7 +9,7 @@ ETQ utilisateur/utilisatrice, je souhaite pouvoir ajouter un composant de type ` ## Critères d'acceptation des développements effectués -- [ ] Une fonction implementée, documentée, testée : `[COMPOSANT]_dsfr()' +- [ ] Une fonction implémentée, documentée, testée : `[COMPOSANT]_dsfr()' - [ ] Avec la documentation dans le corps de la fonction - [ ] La présentation dans une vignette - [ ] Des tests unitaires diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 106fd010..48162a29 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -59,7 +59,7 @@ representative at an online or offline event. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported to the community leaders responsible for enforcement at juliette.engelaere-lefebvre@developpement-durable.gouv.fr. +reported to the community leaders responsible for enforcement at juliette.engelaere@developpement-durable.gouv.fr. All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the diff --git a/DESCRIPTION b/DESCRIPTION index 7fa03266..9d10c9f1 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -2,7 +2,7 @@ Package: shinygouv Title: Implement the DSFR for your shiny applications Version: 1.0.2 Authors@R: c( - person("Juliette", "ENGELARE-LEFEBVRE", , "juliette.engelaere-lefebvre@developpement-durable.gouv.fr", role = c("aut", "cre")), + person("Juliette", "ENGELAERE-LEFEBVRE", , "juliette.engelaere-lefebvre@developpement-durable.gouv.fr", role = c("aut", "cre")), person("Sébastien", "Rochette", , "sebastien@thinkr.fr", role = "aut", comment = c(ORCID = "0000-0002-1565-9313")), person("Murielle", "Delmotte", , "murielle@thinkr.fr", role = "aut", @@ -11,7 +11,7 @@ Authors@R: c( comment = c(ORCID = "0000-0002-4816-4624")), person("Yohann", "Mansiaux", , "yohann@thinkr.fr", role = "aut", comment = c(ORCID = "0000-0002-8905-6603")), - person("Jean-Daniel", "LOMENEDE", role = "aut"), + person("Jean-Daniel", "LOMENEDE", , "jean-daniel.lomenede@seine-maritime.gouv.fr", role = "aut"), person("David", "Granjon", role = "ctb"), person("Alan", "Dipert", role = "ctb") ) diff --git a/R/convert_file_to_dsfr.R b/R/convert_file_to_dsfr.R index c36a8cba..ce95f33f 100644 --- a/R/convert_file_to_dsfr.R +++ b/R/convert_file_to_dsfr.R @@ -1,4 +1,4 @@ -# WARNING - Generated by {fusen} from /dev/tools/flat_convert_to_dsfr.Rmd: do not edit by hand +# WARNING - Generated by {fusen} from dev/tools/flat_convert_to_dsfr.Rmd: do not edit by hand #' convert_file_to_dsfr #' @@ -14,26 +14,28 @@ #' @return un fichier #' @noRd convert_file_to_dsfr <- function(file, tab_corresp) { + # verifie que c'est bien un fichier et non un dossier if (isTRUE(file_test("-f", file))) { + message(glue::glue("scan {file}")) file_read <- readLines(file) - + if (isTRUE(grep("tabPanel", file_read) > 0)) { - message(glue::glue("Attention le {file} contient un 'tabPanel': \n - Si celui ci \u00e9tait dans un navbarPage alors le remplacer par un navbarPanel_dsfr. \n - Si celui ci \u00e9tait dans un 'tabsetPanel', alors le remplacer par un 'tabPanel_dsfr'")) + message(glue::glue("Attention le {file} contient un 'tabPanel': \n - Si celui ci \u00e9tait dans un navbarPage alors le remplacer par un navbarPanel_dsfr. \n - Si celui ci \u00e9tait dans un 'tabsetPanel', alors le remplacer par un 'tabPanel_dsfr'")) } if (isTRUE(grep("navbarPage", file_read) > 0)) { - message(glue::glue("Attention le {file} contient un 'navbarPage()', la version dsfr n\u00e9cessite un header, voir \\?navbarPage_dsfr")) + message(glue::glue("Attention le {file} contient un 'navbarPage()', la version dsfr n\u00e9cessite un header, voir \\?navbarPage_dsfr")) } - + file_convert <- purrr::reduce2( paste0(tab_corresp$composant_shiny, "\\("), paste0(tab_corresp$composant_dsfr, "\\("), .init = file_read, - stringr::str_replace_all - ) + stringr::str_replace_all) writeLines(file_convert, con = file) + } return(NULL) } diff --git a/R/convert_to_dsfr.R b/R/convert_to_dsfr.R index 0f2b8478..c38bc7ff 100644 --- a/R/convert_to_dsfr.R +++ b/R/convert_to_dsfr.R @@ -1,11 +1,14 @@ -# WARNING - Generated by {fusen} from /dev/tools/flat_convert_to_dsfr.Rmd: do not edit by hand +# WARNING - Generated by {fusen} from dev/tools/flat_convert_to_dsfr.Rmd: do not edit by hand #' convert_to_dsfr #' #' @description #' `r lifecycle::badge("experimental")` #' -#' Il s'agit d'une fonction expérimentale qui vous permet de convertir une application shiny en une application shiny suivant le DSFR. Il reste des pionts de vigilances sur la convertion des tabPanel dans les navbarPage et les tabsetPanel +#' Il s'agit d'une fonction expérimentale qui vous permet de convertir une application shiny en une application shiny suivant le DSFR. +#' Cette fonction va modifier les fichiers de votre application, presents dans le repertoire `path`. +#' Cf. \href{https://spyrales.github.io/shinygouv/articles/convertir-une-app-shiny-en-app-shiny-dsfr.html}{vignette dediee}. +#' Il reste des points de vigilances sur la conversion des tabPanel dans les navbarPage et les tabsetPanel. #' #' @param path le chemin du dossier sur lequel faire la conversion, par defaut "R/" #' @param version le numero de version du dsfr a utiliser, par exemple "1.7.2". Par défaut, la derniere disponible. Utilisé plutot lors du developpement pour tester les retrocompatibilites. @@ -38,8 +41,7 @@ convert_to_dsfr <- function(path = "R/", version = get_dsfr_version()) { stop("Merci de preciser le numero de version a utiliser") } - if (!file.exists( - system.file(chem, package = "shinygouv"))) { + if (!file.exists(system.file(chem, package = "shinygouv"))) { stop(glue::glue("Le dossier 'v{version}' n existe pas")) } diff --git a/R/fluidpage_dsfr.R b/R/fluidpage_dsfr.R index e67446df..d251b2c1 100644 --- a/R/fluidpage_dsfr.R +++ b/R/fluidpage_dsfr.R @@ -17,7 +17,7 @@ #' #' @examples #' if (interactive()) { -#' +#' #' library(shiny) #' my_page <- fluidPage_dsfr( #' header = header_dsfr( @@ -26,7 +26,7 @@ #' title = "Gouv", #' htmltools::div("test") #' ) -#' +#' #' shiny::shinyApp( #' my_page, #' server = function(input, output) {} diff --git a/R/mod_input_ui.R b/R/mod_input_ui.R index dfe41d19..77448d94 100644 --- a/R/mod_input_ui.R +++ b/R/mod_input_ui.R @@ -27,7 +27,7 @@ mod_input_ui_ui <- function(id){ title = "Une prems tab", content = tagList( h3("Coucou"), - numericInput( + numericInput_dsfr( inputId = ns("tabpaneln"), label = "Nombre de points sur le graph", value = 100 @@ -40,7 +40,7 @@ mod_input_ui_ui <- function(id){ title = "Une deuxieme tab", content = tagList( h3("Salut"), - numericInput( + numericInput_dsfr( inputId = ns("tabpaneln2"), label = "Nombre de points sur le plot", value = 10 diff --git a/R/navbarpage_dsfr.R b/R/navbarpage_dsfr.R index 70f52cf8..82f1cd32 100644 --- a/R/navbarpage_dsfr.R +++ b/R/navbarpage_dsfr.R @@ -50,7 +50,7 @@ #' ) #' ) #' , -#' +#' #' # Second tab #' navbarPanel_dsfr( #' title = "radioButtons_dsfr()", @@ -86,13 +86,13 @@ #' output$output1 <- renderText({ #' paste("You clicked", input$go, "times") #' }) -#' +#' #' output$output2 <- renderText({ #' paste("You've selected", input$espece) #' }) -#' +#' #' } -#' +#' #' if (interactive()) { #' # Run the application #' shinyApp(ui = ui, server = server) @@ -100,7 +100,7 @@ navbarPage_dsfr <- function( title, ..., - header = NULL, + header = header_dsfr(intitule = "intitule a remplacer"), id = NULL, footer = NULL ) { diff --git a/R/run_app.R b/R/run_app.R index bd1e4ea9..d245b141 100644 --- a/R/run_app.R +++ b/R/run_app.R @@ -1,4 +1,4 @@ -#' Run the Shiny Application +#' Run the shinygouv-demo Application #' #' @param ... arguments to pass to golem_opts. #' See `?golem::get_golem_options` for more details. diff --git a/R/selectinput_dsfr.R b/R/selectinput_dsfr.R index acb42698..0fa795e9 100644 --- a/R/selectinput_dsfr.R +++ b/R/selectinput_dsfr.R @@ -7,6 +7,7 @@ #' @param choices Liste des valeurs à sélectionner (si les éléments de la liste portent un nom, c'est ce nom qui est affiché à l'utilisateur et non la valeur) #' @param selected Element selectionné #' @importFrom assertthat assert_that +#' @importFrom purrr map #' @return html #' #' @export diff --git a/README.Rmd b/README.Rmd index 3c310281..1d544b94 100644 --- a/README.Rmd +++ b/README.Rmd @@ -15,7 +15,15 @@ knitr::opts_chunk$set( # {shinygouv} -Le package {shinygouv} permet d'utiliser le template existant pour le `Système de Design de l'Etat` (DSFR) dans vos applications Shiny. +Le package {shinygouv} permet d'utiliser le [`Système de Design de l'Etat` (DSFR)](https://www.systeme-de-design.gouv.fr/) dans vos applications Shiny. + +Il s'installe depuis github : + +```{r} +# install.packages("remotes") +remotes::install_github("spyrales/shinygouv") +``` + # Comment utiliser le package @@ -46,14 +54,17 @@ shinyApp( ``` -# Visualiser un application de démonstration comprenant les composants déjà implémentés: +# Visualiser une application de démonstration comprenant les composants déjà implémentés: [shinygouv-demo](https://ssm-ecologie.shinyapps.io/shinygouv-demo/) +[shinygouv-demo version de dev](https://ssm-ecologie.shinyapps.io/shinygouv-demo-dev/) # Contribuer au développement du package -Voir le README du dossier [documentation](dev/documentation) +Voir les vignettes à l'intention des développeurs du [site de présentation du packages et de ses fonctions](https://spyrales.github.io/shinygouv/articles/index.html) # Code of Conduct -Please note that the {shinygouv} project is released with a Contributor Code of Conduct. By contributing to this project, you agree to abide by its terms. +Notez svp qu'un Code de conduite ([Contributor Code of Conduct](https://spyrales.github.io/shinygouv/CODE_OF_CONDUCT.html)) encadre la participation au projet {shinygouv}. + +En contribuant à ce projet, vous acceptez de le respecter. diff --git a/_pkgdown.yml b/_pkgdown.yml index 7fd8c47e..5e88487b 100755 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -11,3 +11,8 @@ articles: desc: Vignettes à l'intention des mainteneurs de `{shingouv}` contents: - starts_with("Dev") + +- title: Orientations initiales de développement + desc: Notes à l'intention des mainteneurs de `{shingouv}` curieux de comprendre son histoire + contents: + - starts_with("Hist") diff --git a/app.R b/app.R index 2436da17..60833952 100644 --- a/app.R +++ b/app.R @@ -1,4 +1,4 @@ -# Launch the ShinyApp (Do not remove this comment) +# Launch the ShinyApp shinygouv-demo (Do not remove this comment) # To deploy, run: rsconnect::deployApp() # Or use the blue button on top of this file diff --git a/dev/config_fusen.yaml b/dev/config_fusen.yaml index 7465a8d7..62f586e5 100644 --- a/dev/config_fusen.yaml +++ b/dev/config_fusen.yaml @@ -7,10 +7,10 @@ flat_actionButton.Rmd: tests: - tests/testthat/test-actionbutton_dsfr_template.R - tests/testthat/test-actionbutton_dsfr.R - vignettes: vignettes/actionbutton_dsfr.Rmd + vignettes: [] inflate: flat_file: dev/flat_composants/flat_actionButton.Rmd - vignette_name: actionButton_dsfr + vignette_name: .na open_vignette: yes check: no document: yes @@ -43,7 +43,7 @@ flat_checkBoxInput.Rmd: document: yes overwrite: ask flat_convert_to_dsfr.Rmd: - path: dev/flat_convert_to_dsfr.Rmd + path: dev/tools/flat_convert_to_dsfr.Rmd state: active R: - R/convert_file_to_dsfr.R @@ -53,12 +53,12 @@ flat_convert_to_dsfr.Rmd: - tests/testthat/test-convert_file_to_dsfr.R - tests/testthat/test-convert_to_dsfr.R - tests/testthat/test-get_dsfr_version.R - vignettes: vignettes/convertir-une-app-shiny-en-app-shiny-dsfr.Rmd + vignettes: [] inflate: - flat_file: dev/flat_convert_to_dsfr.Rmd - vignette_name: Convertir une app shiny en app shiny dsfr + flat_file: dev/tools/flat_convert_to_dsfr.Rmd + vignette_name: .na open_vignette: yes - check: yes + check: no document: yes overwrite: ask flat_fluidpage.Rmd: @@ -291,10 +291,10 @@ flat_withSpinner.Rmd: state: active R: R/withspinner_dsfr.R tests: tests/testthat/test-withspinner_dsfr.R - vignettes: vignettes/withspinner_dsfr.Rmd + vignettes: [] inflate: flat_file: dev/flat_composants/flat_withSpinner.Rmd - vignette_name: withSpinner_dsfr + vignette_name: .na open_vignette: no check: no document: yes diff --git a/dev/flat_composants/flat_fluidpage.Rmd b/dev/flat_composants/flat_fluidpage.Rmd index 9d8c8e2c..731f6cb2 100644 --- a/dev/flat_composants/flat_fluidpage.Rmd +++ b/dev/flat_composants/flat_fluidpage.Rmd @@ -686,7 +686,7 @@ test_that("column_dsfr works", { ## Conclusion -Voila plusieurs exemples d'implémentation de composants/layouts qui ne demandent pas d'intéraction avec {shiny}. Vous pouvez reproduire ce processus avec les [cartes](https://gouvfr.atlassian.net/wiki/spaces/DB/pages/222331445/Carte+-+Card) ou les [alertes](https://gouvfr.atlassian.net/wiki/spaces/DB/pages/736362500/Alertes+-+Alerts). +Voila plusieurs exemples d'implémentation de composants/layouts qui ne demandent pas d'interaction avec {shiny}. Vous pouvez reproduire ce processus avec les [cartes](https://gouvfr.atlassian.net/wiki/spaces/DB/pages/222331445/Carte+-+Card) ou les [alertes](https://gouvfr.atlassian.net/wiki/spaces/DB/pages/736362500/Alertes+-+Alerts). ```{r development-inflate, eval=FALSE} # Run but keep eval=FALSE to avoid infinite loop diff --git a/dev/flat_composants/flat_navbarPage.Rmd b/dev/flat_composants/flat_navbarPage.Rmd index 259ff1ba..158efaa8 100644 --- a/dev/flat_composants/flat_navbarPage.Rmd +++ b/dev/flat_composants/flat_navbarPage.Rmd @@ -39,7 +39,7 @@ La `navbarPage_dsfr()` se compose de : navbarPage_dsfr <- function( title, ..., - header = NULL, + header = header_dsfr(intitule = "intitule a remplacer"), id = NULL, footer = NULL ) { diff --git a/dev/flat_composants/flat_new_one.Rmd b/dev/flat_composants/flat_new_one.Rmd index de710e6d..9e7293b0 100644 --- a/dev/flat_composants/flat_new_one.Rmd +++ b/dev/flat_composants/flat_new_one.Rmd @@ -1,5 +1,5 @@ --- -title: "flat_new_one.Rmd empty" +title: "flat_nom_composant_shiny.Rmd empty" output: html_document editor_options: chunk_output_type: console diff --git a/dev/tools/deploy.R b/dev/tools/deploy.R index cbdbba3b..f7c9d945 100644 --- a/dev/tools/deploy.R +++ b/dev/tools/deploy.R @@ -5,7 +5,7 @@ options("repos" = "https://packagemanager.posit.co/cran/__linux__/jammy/latest") install.packages("remotes") install.packages("pak") remotes::install_deps() -remotes::install_local() +remotes::install_local(force = TRUE) message("--- Add server ---\n") @@ -19,8 +19,9 @@ rsconnect::setAccountInfo( message("--- Deploying app ---\n") appFiles <- list.files(".", recursive = TRUE) appFiles <- appFiles[!grepl(".Rprofile|renv|rstudio_|dev|data-raw|docker|testthat|test.convert.dsfr", appFiles)] - options(rsconnect.packrat = TRUE) +options(rsconnect.check.certificate = FALSE) +options(rsconnect.http.verbose = TRUE) rsconnect::deployApp( appDir = ".", diff --git a/dev/tools/flat_convert_to_dsfr.Rmd b/dev/tools/flat_convert_to_dsfr.Rmd index e2fa5669..b9e7c589 100644 --- a/dev/tools/flat_convert_to_dsfr.Rmd +++ b/dev/tools/flat_convert_to_dsfr.Rmd @@ -144,7 +144,10 @@ convert_to_dsfr(path = "le_chemin_de_mon_application") #' @description #' `r lifecycle::badge("experimental")` #' -#' Il s'agit d'une fonction expérimentale qui vous permet de convertir une application shiny en une application shiny suivant le DSFR. Il reste des pionts de vigilances sur la convertion des tabPanel dans les navbarPage et les tabsetPanel +#' Il s'agit d'une fonction expérimentale qui vous permet de convertir une application shiny en une application shiny suivant le DSFR. +#' Cette fonction va modifier les fichiers de votre application, presents dans le repertoire `path`. +#' Cf. \href{https://spyrales.github.io/shinygouv/articles/convertir-une-app-shiny-en-app-shiny-dsfr.html}{vignette dediee}. +#' Il reste des points de vigilances sur la conversion des tabPanel dans les navbarPage et les tabsetPanel. #' #' @param path le chemin du dossier sur lequel faire la conversion, par defaut "R/" #' @param version le numero de version du dsfr a utiliser, par exemple "1.7.2". Par défaut, la derniere disponible. Utilisé plutot lors du developpement pour tester les retrocompatibilites. @@ -163,8 +166,7 @@ convert_to_dsfr <- function(path = "R/", version = get_dsfr_version()) { stop("Merci de preciser le numero de version a utiliser") } - if (!file.exists( - system.file(chem, package = "shinygouv"))) { + if (!file.exists(system.file(chem, package = "shinygouv"))) { stop(glue::glue("Le dossier 'v{version}' n existe pas")) } diff --git a/inst/test.convert.dsfr/DESCRIPTION b/inst/test.convert.dsfr/DESCRIPTION index 7ec389fd..aa3ab019 100644 --- a/inst/test.convert.dsfr/DESCRIPTION +++ b/inst/test.convert.dsfr/DESCRIPTION @@ -1,9 +1,9 @@ Package: test.convert.dsfr -Title: PKG_TITLE +Title: App Shiny Test Convert DSFR Version: 0.0.0.9000 Authors@R: person("AUTHOR_FIRST", "AUTHOR_LAST", , "AUTHOR@MAIL.COM", role = c("cre", "aut")) -Description: PKG_DESC. +Description: App shiny test.convert.dsfr pour tester convert_to_dsfr(). License: MIT + file LICENSE Imports: config (>= 0.3.1), diff --git a/inst/test.convert.dsfr/dev/.gitignore b/inst/test.convert.dsfr/dev/.gitignore index f920f889..87b88dd3 100644 --- a/inst/test.convert.dsfr/dev/.gitignore +++ b/inst/test.convert.dsfr/dev/.gitignore @@ -1,2 +1,2 @@ - +zz_rsconnect* *.html diff --git a/man/convert_to_dsfr.Rd b/man/convert_to_dsfr.Rd index 5d5fa4c1..71b1e983 100644 --- a/man/convert_to_dsfr.Rd +++ b/man/convert_to_dsfr.Rd @@ -17,7 +17,10 @@ des fichiers modifies \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#experimental}{\figure{lifecycle-experimental.svg}{options: alt='[Experimental]'}}}{\strong{[Experimental]}} -Il s'agit d'une fonction expérimentale qui vous permet de convertir une application shiny en une application shiny suivant le DSFR. Il reste des pionts de vigilances sur la convertion des tabPanel dans les navbarPage et les tabsetPanel +Il s'agit d'une fonction expérimentale qui vous permet de convertir une application shiny en une application shiny suivant le DSFR. +Cette fonction va modifier les fichiers de votre application, presents dans le repertoire \code{path}. +Cf. \href{https://spyrales.github.io/shinygouv/articles/convertir-une-app-shiny-en-app-shiny-dsfr.html}{vignette dediee}. +Il reste des points de vigilances sur la conversion des tabPanel dans les navbarPage et les tabsetPanel. } \examples{ if (FALSE) { diff --git a/man/navbarPage_dsfr.Rd b/man/navbarPage_dsfr.Rd index f39458a1..ffc26b05 100644 --- a/man/navbarPage_dsfr.Rd +++ b/man/navbarPage_dsfr.Rd @@ -4,7 +4,13 @@ \alias{navbarPage_dsfr} \title{Page avec navbar} \usage{ -navbarPage_dsfr(title, ..., header = NULL, id = NULL, footer = NULL) +navbarPage_dsfr( + title, + ..., + header = header_dsfr(intitule = "intitule a remplacer"), + id = NULL, + footer = NULL +) } \arguments{ \item{title}{Titre de l'application (Attention, différent de shiny::navbarPage)} diff --git a/man/run_app.Rd b/man/run_app.Rd index 0156eda7..2d04d4b7 100644 --- a/man/run_app.Rd +++ b/man/run_app.Rd @@ -2,7 +2,7 @@ % Please edit documentation in R/run_app.R \name{run_app} \alias{run_app} -\title{Run the Shiny Application} +\title{Run the shinygouv-demo Application} \usage{ run_app( onStart = NULL, @@ -37,5 +37,5 @@ expression in order for the match to be considered successful.} See \code{?golem::get_golem_options} for more details.} } \description{ -Run the Shiny Application +Run the shinygouv-demo Application } diff --git a/man/shinygouv-package.Rd b/man/shinygouv-package.Rd index ae622e58..90d58e88 100644 --- a/man/shinygouv-package.Rd +++ b/man/shinygouv-package.Rd @@ -9,7 +9,7 @@ Components and tools to build or transform shiny applications with the Design System of France. } \author{ -\strong{Maintainer}: Juliette ENGELARE-LEFEBVRE \email{juliette.engelaere-lefebvre@developpement-durable.gouv.fr} +\strong{Maintainer}: Juliette ENGELAERE-LEFEBVRE \email{juliette.engelaere-lefebvre@developpement-durable.gouv.fr} Authors: \itemize{ @@ -17,7 +17,7 @@ Authors: \item Murielle Delmotte \email{murielle@thinkr.fr} (\href{https://orcid.org/0000-0002-1339-2424}{ORCID}) \item Cervan Girard \email{cervan@thinkr.fr} (\href{https://orcid.org/0000-0002-4816-4624}{ORCID}) \item Yohann Mansiaux \email{yohann@thinkr.fr} (\href{https://orcid.org/0000-0002-8905-6603}{ORCID}) - \item Jean-Daniel LOMENEDE + \item Jean-Daniel LOMENEDE \email{jean-daniel.lomenede@seine-maritime.gouv.fr} } Other contributors: diff --git a/tests/testthat/test-convert_file_to_dsfr.R b/tests/testthat/test-convert_file_to_dsfr.R index 12661771..c56ee221 100644 --- a/tests/testthat/test-convert_file_to_dsfr.R +++ b/tests/testthat/test-convert_file_to_dsfr.R @@ -1,6 +1,7 @@ # WARNING - Generated by {fusen} from /dev/tools/flat_convert_to_dsfr.Rmd: do not edit by hand test_that("convert_file_to_dsfr works", { + skip_on_ci() library(tibble) @@ -16,10 +17,8 @@ test_that("convert_file_to_dsfr works", { open = FALSE ) - table_passage <- tibble( - composant_shiny = c("actionButton", "fluidPage"), - composant_dsfr = c("actionButton_dsfr", "fluidPage_dsfr") - ) + table_passage <- tibble(composant_shiny = c("actionButton", "fluidPage"), + composant_dsfr = c("actionButton_dsfr", "fluidPage_dsfr")) fichier <- file.path(mydir, "R", "app_ui.R") convert_file_to_dsfr(file = fichier, table_passage) @@ -30,10 +29,8 @@ test_that("convert_file_to_dsfr works", { expect_false(any(stringr::str_detect(fichier_transform, pattern = "fluidPage\\("))) - table_passage <- tibble( - composant_shiny = c("actionButton", "fluidPage", NA), - composant_dsfr = c("actionButton_dsfr", "fluidPage_dsfr", "header_dsfr") - ) + table_passage <- tibble(composant_shiny = c("actionButton", "fluidPage", NA), + composant_dsfr = c("actionButton_dsfr", "fluidPage_dsfr", "header_dsfr")) fichier <- file.path(mydir, "R", "app_ui.R") convert_file_to_dsfr(file = fichier, table_passage) @@ -42,4 +39,5 @@ test_that("convert_file_to_dsfr works", { #' @description les composants dsfr n ayant pas d equivalent en shiny ne sont pas remplaces expect_false(any(stringr::str_detect(fichier_transform, pattern = "header_dsfr\\("))) + }) diff --git a/tests/testthat/test-convert_to_dsfr.R b/tests/testthat/test-convert_to_dsfr.R index df2c3d0a..c6727cea 100644 --- a/tests/testthat/test-convert_to_dsfr.R +++ b/tests/testthat/test-convert_to_dsfr.R @@ -13,10 +13,8 @@ test_that("convert_to_dsfr works", { open = FALSE ) - file.copy( - from = file.path(mydir, "R", "app_ui.R"), - to = file.path(mydir, "R", "module_ui.R") - ) + file.copy(from = file.path(mydir, "R", "app_ui.R"), + to = file.path(mydir, "R", "module_ui.R")) #' @description Retourne une erreur si le numero de version est NULL expect_error(convert_to_dsfr(path = file.path(mydir, "R"), version = NULL)) @@ -34,4 +32,5 @@ test_that("convert_to_dsfr works", { #' @description les composants dsfr n ayant pas d equivalent en shiny ne sont pas remplaces, par exemple header_dsfr expect_false(any(stringr::str_detect(app_ui, pattern = "header_dsfr\\("))) + }) diff --git a/vignettes/A-convertir-une-app-shiny-en-app-shiny-dsfr.Rmd b/vignettes/A-convertir-une-app-shiny-en-app-shiny-dsfr.Rmd index 00466465..86180d80 100644 --- a/vignettes/A-convertir-une-app-shiny-en-app-shiny-dsfr.Rmd +++ b/vignettes/A-convertir-une-app-shiny-en-app-shiny-dsfr.Rmd @@ -18,66 +18,79 @@ knitr::opts_chunk$set( library(shinygouv) ``` -# convert_to_dsfr +# Fonction `convert_to_dsfr()` -La fonction convertit tous les composants shiny présents dans les fichiers du dossier "R/" d'une application shiny, en composant dsfr, si et seulement si ceux ci ont été implémentés dans la {version} définie en paramètre. +La fonction `convert_to_dsfr()` a été pensée pour faciliter la conversion d'applications Shiny existantes au Design system de l'Etat. -## Table de correspondance +## Principe : Réécriture d'une application existante -Elle se base alors sur la table de correspondance des composants implémentés : +La fonction `convert_to_dsfr()` convertit tous les composants shiny présents dans les fichiers du dossier "R/" d'une application shiny, en composant shinygouv dsfr, dès lors qu'ils existent et qu'ils ont été implémentés dans le package, pour la {version} définie en paramètre. -Par exemple pour la version "1.7.2" ([v1.7.2/table_correspondance_shiny_dsfr.csv](https://github.com/spyrales/shinygouv/blob/main/inst/v1.7.2/table_correspondance_shiny_dsfr.csv)) +Attention, cette fonction modifie les fonctions des composants UI de votre application existante. +Pour un simple test, appliquez là sur une copie. + +Il reste des points de vigilances sur la conversion des tabPanel dans les navbarPage et les tabsetPanel. +Cette fonction est encore expérimentale. -```{r echo = FALSE, message = FALSE} -read.csv2( - system.file("v1.7.2/table_correspondance_shiny_dsfr.csv", package = "shinygouv") -) %>% - DT::datatable() -``` ## Dépendances -De plus, elle ajoute la dépendance au package {shinygouv} dans le fichier `app_ui.R` +Le fonction `convert_to_dsfr()` ajoute automatiquement la dépendance au package {shinygouv} dans le fichier `app_ui.R` de votre application shiny Golem. +Dans le cadre d'une application non packagée avec {golem}, vous devrez ajouter à la main la dépendance à {shinygouv}, souvent avec un `library(shinygouv)` dans votre fichier global.R. -## Conversion -Pour cela, il suffit de lancer dans votre projet contenant l'application shiny: +## Conversion +La conversion est réalisée en lançant dans la console, depuis votre projet contenant l'application shiny : ```{r eval = FALSE} convert_to_dsfr() ``` -Si l'ensemble des scripts `.R` de votre application ne se trouve pas dans un dossier "R/" à la racine de votre projet, vous pouvez passer en argument le `path` du dossier contenant l'ensemble de ces fichiers. -Comme par exemple: +Si l'ensemble des scripts `.R` de votre application ne se trouvent pas dans un dossier "R/" à la racine de votre projet, vous pouvez passer en argument le `path` du dossier contenant l'ensemble de ces fichiers. +Comme par exemple: ```{r eval = FALSE} convert_to_dsfr(path = "le_chemin_de_mon_application") ``` -*Attention*, dans le cadre d'une application hors {golem}, vous devrez ajouter la dépendance à {shinygouv} pour que votre application puisse utiliser les composants dsfr - - -```{r examples-convert_to_dsfr} -if (FALSE) { - mydir <- tempfile(pattern = "app") - dir.create(mydir) - golem::install_dev_deps( - force_install = TRUE - ) - golem::create_golem( - mydir, - overwrite = TRUE, - open = FALSE - ) - convert_to_dsfr(path = file.path(mydir, "R")) -} +*Attention*, dans le cadre d'une application simple (hors {golem}), vous devrez ajouter la dépendance à {shinygouv} pour que votre application puisse utiliser les composants dsfr (avec `library(shingouv)`). + + +## Table de correspondance + +Elle se base alors sur la table de correspondance des composants implémentés : + +Par exemple pour la version "1.7.2" ([v1.7.2/table_correspondance_shiny_dsfr.csv](https://github.com/spyrales/shinygouv/blob/main/inst/v1.7.2/table_correspondance_shiny_dsfr.csv)) + + +```{r echo = FALSE, message = FALSE} +read.csv2( + system.file("v1.7.2/table_correspondance_shiny_dsfr.csv", package = "shinygouv") +) %>% + DT::datatable() +``` + +# Quels sont les composants implémentés dans {shinygouv} ? + +Les composants d'interface utilisateur implémentés dans `{shinygouv}` et leur correspondance avec les fonctions habituelles de `{Shiny}` sont listées ici : + + +```{r echo = FALSE, message = FALSE} +read.csv2( + system.file(get_dsfr_version(with_v = TRUE), "/table_correspondance_shiny_dsfr.csv", package = "shinygouv") +) %>% + dplyr::select(composant_shiny, composant_dsfr) %>% + DT::datatable() ``` +Ils ne sont pas encore très nombreux et peuvent être améliorés, n'hésitez pas à contribuer, un guide est là pour vous aider à rejoindre les auteurs de {shinygouv} ! + + # Connaître la version du dsfr actuelle Pour savoir quelle version du dsfr est utilisée dans votre installation de {shinygouv}, vous pouvez exécuter `get_dsfr_version()` diff --git a/vignettes/Dev-A-guide-du-developpeur.Rmd b/vignettes/Dev-A-guide-du-developpeur.Rmd index 529aedfb..3fbba243 100644 --- a/vignettes/Dev-A-guide-du-developpeur.Rmd +++ b/vignettes/Dev-A-guide-du-developpeur.Rmd @@ -11,11 +11,24 @@ vignette: > knitr::opts_chunk$set(echo = TRUE, eval = FALSE) ``` -Ceci est un dossier de documentation dédié aux développeurs et développeuses. Il contient les choix de mode de développement et tout autre document qui ne s'adresserait pas directement aux utilisateurs. +Ceci est un dossier de documentation dédié aux développeurs et développeuses. + + +## Contribuer à {shinygouv} - Introduction +Pour des contributions au code de ce projet, svp regardez le guide général de contribution à https://spyrales.github.io/shinygouv/CONTRIBUTING.html + +## Structuration du repo (a compléter) + +Le développement de ce package a été réalisé [avec {fusen}](https://thinkr-open.github.io/fusen/) : les fonctions, vignettes et test sont générées par des fichiers Rmd dans le dossier /dev. + +Le repo contient deux app : +- une app de demo des composant de shinygouv : que l'on peut visualiser avec shinygouv::run_app(), +- une app de test pour la fonction de conversion convert_to_dsfr(), présente dans "inst/test.convert.dsfr/". + ## Version du framework dsfr en cours de développement -Pour s'assurer du bon developpement du package `shinygouv`, il a été ajouté au fichier `DESCRIPTION` la version du dsfr utilisé. +Pour s'assurer du bon développement du package `shinygouv`, il a été ajouté au fichier `DESCRIPTION` la version du dsfr utilisé. Pour connaître la version utilisée, vous pouvez lancer : @@ -25,7 +38,7 @@ desc::desc_get("VersionDsfr") ## Ajouter une nouvelle version du dsfr -Si vous souhaitez implémenter une nouvelle version du dsfr, vous devez suivre les instructions disponible: [Montee en version du dsfr : trouver les fichiers CSS et JS](Dev-C-montee-en-version-du-dsfr-trouver-les-fichiers-css-et-js.md). +Si vous devez implémenter une nouvelle version du dsfr, vous devez suivre les instructions disponible: [Montee en version du dsfr : trouver les fichiers CSS et JS](Dev-C-montee-en-version-du-dsfr-trouver-les-fichiers-css-et-js.md). Lorsque vous aurez implémenté toutes les composantes avec la nouvelle version, vous pourrez mettre à jour le fichier DESCRIPTION avec la commande suivante : @@ -33,6 +46,11 @@ Lorsque vous aurez implémenté toutes les composantes avec la nouvelle version, desc::desc_set("VersionDsfr" = "1.7.2") ``` +#### Ressources utiles : + +- Notes de versions du dsfr https://www.systeme-de-design.gouv.fr/a-propos/versions/version-courante +- Notes de versions shiny : https://github.com/rstudio/shiny/blob/main/NEWS.md + ## Workflow à suivre avant de dev sur le projet : @@ -88,11 +106,11 @@ chore : tout ce qui touche au projet en lui même, ne correspond pas à un feat ## Comprendre et appliquer le workflow pour développer le package -Pour développer ce package, des choix techniques ont été adoptés. Vous retrouverez les raisons [ici](Dev-F-documentation-inventaire.md). +Pour développer ce package, des choix techniques ont été adoptés. Vous retrouverez les raisons [ici](Hist-B-documentation-inventaire.md). Le workflow se découpe en deux possibilités : -- Les composants nécéssitant de la réactivité +- Les composants nécessitant de la réactivité - Les composants sans réactivité Ces deux possibilités se basent sur le même principe : **l'utilisation des templates html**. La trame générale de ce workflow est définie dans la documentation : @@ -102,13 +120,24 @@ Ces deux possibilités se basent sur le même principe : **l'utilisation des tem Vous trouverez des exemples pour d'autres composants : - Avec réactivité: - - [radio buttons](../reference/radioButtons_dsfr.html) + - [radio buttons](https://github.com/spyrales/shinygouv/blob/main/dev/flat_composants/flat_radioButtons.Rmd) - Sans réactivité: - - [Fluid page](../reference/fluidPage_dsfr.html) + - [Fluid page](https://github.com/spyrales/shinygouv/blob/main/dev/flat_composants/flat_fluidpage.Rmd) N'hésitez pas à amender cette liste au fur et à mesure de vos développements +## Workflow avant de commit + +Pensez à exécuter les lignes "Each time needed" du fichier [dev/02_dev.R](https://github.com/spyrales/shinygouv/blob/main/dev/02_dev.R) avant chaque commit. + +```{r, eval=FALSE} +rstudioapi::navigateToFile("dev/02_dev.R") +``` + + + + ## Les langues utilisées dans le projet - Rapports d'exploration (présentés en vignettes) : 🇫🇷 @@ -119,13 +148,3 @@ N'hésitez pas à amender cette liste au fur et à mesure de vos développements - Description des tests unitaires (de préférence en anglais) 🇫🇷 - Code of Conduct: template par défaut de {usethis} en anglais déjà présent comme pour {gouvdown} 🇬🇧 - Contributing: template par défaut de {usethis} en anglais peut être ajouté comme pour {gouvdown} 🇬🇧 - -## Workflow avant de commit - -Pensez à executer les lignes "Each time needed" du fichier [dev/02_dev.R](https://github.com/spyrales/shinygouv/blob/main/dev/02_dev.R) avant chaque commit. - -```{r, eval=FALSE} -rstudioapi::navigateToFile("dev/02_dev.R") -``` - - diff --git a/vignettes/Dev-B-comment-faire-un-composant-shiny.Rmd b/vignettes/Dev-B-comment-faire-un-composant-shiny.Rmd index af99f33f..443ad1c9 100644 --- a/vignettes/Dev-B-comment-faire-un-composant-shiny.Rmd +++ b/vignettes/Dev-B-comment-faire-un-composant-shiny.Rmd @@ -46,9 +46,12 @@ _Ici nous prenons l'exemple d'un composant développé pour la version 1.7.2 du #### Première étape -- Copier dans le dossier `inst/v1.7.2/composant` le template html du bouton pour dsfr - - Se rendre sur - - Enregistrer le code html par défaut du bouton dans un fichier `inst/v1.7.2/composant/bouton.html` +- Copier dans le dossier `inst/v1.7.2/composant` le template html du bouton pour dsfr + + - Se rendre sur + + - Enregistrer le code html par défaut du bouton dans un fichier `inst/v1.7.2/composant/bouton.html` + ``` @@ -57,10 +60,11 @@ _Ici nous prenons l'exemple d'un composant développé pour la version 1.7.2 du #### Deuxième étape -- Modifier le code html pour mettre les paramètres nécéssaires à son bon fonctionnement dans {shiny} - - Ajouter un `id` pour le futur `inputId` - - Ajouter la classe permettant de déclencher l'événement côté {shiny} - - Ajouter/Remplacer aussi les autres paramètres nécéssaires à la personnalisation du composant +- Modifier le code html pour mettre les paramètres nécessaires à son bon fonctionnement dans {shiny} + + - Ajouter un `id` pour le futur `inputId` + - Ajouter la classe permettant de déclencher l'évènement côté {shiny} + - Ajouter/Remplacer aussi les autres paramètres nécessaires à la personnalisation du composant Après retravail sur le composant `actionButton()`, voici son template html: @@ -74,7 +78,7 @@ Après retravail sur le composant `actionButton()`, voici son template html: Dans notre cas, nous traitons le `actionButton()` et la classe a ajouter est `action-button`. Comment savoir ? -Le plus simple est d'exécuter la fonction de l'input dans shiny dans la console: +Le plus simple est d'exécuter la fonction de l'input dans shiny dans la console : ```{r eval = FALSE} shiny::actionButton("test", "test") @@ -84,7 +88,11 @@ shiny::actionButton("test", "test") `` ``` -On observe alors que dans "class" nous avons des classes liées à bootstrap `btn-*` et une classe à part `action-button`. C'est souvent cette classe qui permet de déclencher l'évenement coté server. Si cela n'est pas suffisant, il faudra chercher dans le code du package {shiny}. Le code se trouve [ici](https://github.com/rstudio/shiny/tree/main/srcts/src/bindings/input) et en ouvrant le fichier `.ts` vous trouverez alors un endroit ou on recherche la classe qui active l'input : +> On observe alors que dans "class" nous avons des classes liées à bootstrap `btn-*` et une classe à part `action-button`. +> C'est souvent cette classe qui permet de déclencher l’évènement coté server. +> Si cela n'est pas suffisant, il faudra chercher dans le code du package {shiny}. +Le code se trouve [ici](https://github.com/rstudio/shiny/tree/main/srcts/src/bindings/input) et en ouvrant le fichier `.ts` vous trouverez alors un endroit ou on recherche la classe qui active l'input : + ``` find(scope: HTMLElement): JQuery { return $(scope).find(".action-button"); @@ -94,14 +102,15 @@ On observe alors que dans "class" nous avons des classes liées à bootstrap `bt #### Troisième étape -- Créer la fonction qui permettra d'utiliser ce nouveau bouton. - - Copier coller le flat se trouvant dans [dev/flat_composants/flat_new_one.Rmd](https://github.com/spyrales/shinygouv/blob/main/dev/flat_composants/flat_new_one.Rmd) dans - `dev/flat_composants/` et le renommer "flat_nom_du_composant_shiny.Rmd". Dans cet exemple, `flat_actionButton.Rmd` - - Dans votre nouveau flat, il faut remplacer "nom_composant_shiny" par le nom du composant shiny (dans cet exemple, `actionButton`) - - Changer le chemin du fichier de votre `.html` dans la fonction `*_template` - - Compléter les paramètres et leur documentation dans vos fonctions selon la personnalisation de votre `.html` - - Adapter les tests unitaires en fonction des paramètres choisis (y compris la date du snapshot). - - Puis lancer le dernier chunck `fusen::inflate()` +- Créer la fonction qui permettra d'utiliser ce nouveau bouton : + + - Copier/coller le flat se trouvant dans [dev/flat_composants/flat_new_one.Rmd](https://github.com/spyrales/shinygouv/blob/main/dev/flat_composants/flat_new_one.Rmd) dans + `dev/flat_composants/` et le renommer "flat_nom_du_composant_shiny.Rmd". Dans cet exemple, `flat_actionButton.Rmd`. + - Dans votre nouveau flat, il faut remplacer "nom_composant_shiny" par le nom du composant shiny (dans cet exemple, `actionButton`). + - Changer le chemin du fichier de votre `.html` dans la fonction `*_template`. + - Compléter les paramètres et leur documentation dans vos fonctions selon la personnalisation de votre `.html`. + - Adapter les tests unitaires en fonction des paramètres choisis (y compris la date du snapshot). + - Puis lancer le dernier chunk `fusen::inflate()`. Voir exemple [dev/flat_composants/flat_actionButton.Rmd](https://github.com/spyrales/shinygouv/blob/main/dev/flat_composants/flat_actionButton.Rmd) @@ -112,19 +121,21 @@ Ayez une attention particulière pour les tests unitaires qui sont la garantie d #### Quatrième étape -- Créer la fonction qui permettra de mettre à jour votre input (si nécessaire). -- Certains composants comme l'actionButton() n'ont pas besoin de mise à jour, c'est le cas pour beaucoup d'autres composants. -- Certains fonctions de mise à jour de composants correspondent en fait à l'appel de la fonction native `{shiny}` correspondante (voir par ex `updateNumericInput_dsfr()`). -- Pour certains composants non présents nativement dans `{shiny}`, des implémentations adhoc ont dû être réalisées (voir par ex `updateRadioGroupButtons_dsfr()`). - + Dans ce cas précis il faut être vigilant sur l'utilisation de la fonction `ns()` dans le nom des inputId. Il est indispensable de prendre en compte la fonction `ns()` partout, sauf dans le cas d'un appel à la fonction shiny `session$sendInputMessage()` car le ns() est géré en interne. Le plus simple reste d'observer la fonction `updateRadioGroupButtons_dsfr()`. - +- Créer la fonction qui permettra de mettre à jour votre input (si nécessaire). +- Certains composants comme l' `actionButton()` n'ont pas besoin de mise à jour, c'est le cas pour beaucoup d'autres composants. +- Certains fonctions de mise à jour de composants correspondent en fait à l'appel de la fonction native `{shiny}` correspondante (voir par ex `updateNumericInput_dsfr()`). +- Pour certains composants non présents nativement dans `{shiny}`, des implémentations adhoc ont dû être réalisées (voir par ex `updateRadioGroupButtons_dsfr()`). + + Dans ce cas précis il faut être vigilant sur l'utilisation de la fonction `ns()` dans le nom des inputId. Il est indispensable de prendre en compte la fonction `ns()` partout, sauf dans le cas d'un appel à la fonction shiny `session$sendInputMessage()` car le ns() est géré en interne. Le plus simple reste d'observer la fonction `updateRadioGroupButtons_dsfr()`. + #### Cinquième étape -Lorsque l'implementation de votre nouveau composant dsfr est terminée: -- remplir la table de correspondance disponible dans [inst/v1.9.3/table_correspondance_shiny_dsfr.csv](https://github.com/spyrales/shinygouv/blob/main/inst/v1.9.3/table_correspondance_shiny_dsfr.csv) (en adaptant sur la version en cours d'implementation) +Lorsque l’implémentation de votre nouveau composant dsfr est terminée : -La colonne `composant_shiny` restera vide si le composant dsfr n'a pas d'équivalent dans {shiny}. -Cette table de correspondance permettra le bon déroulement de la conversion d'une app shiny en une app shiny dsfr (en utilisant `convert_to_dsfr()`) +- remplir la table de correspondance disponible dans [inst/v1.9.3/table_correspondance_shiny_dsfr.csv](https://github.com/spyrales/shinygouv/blob/main/inst/v1.9.3/table_correspondance_shiny_dsfr.csv) (en adaptant sur la version en cours d’implémentation) +La colonne `composant_shiny` restera vide si le composant dsfr n'a pas d'équivalent dans {shiny}. + +Cette table de correspondance permettra le bon déroulement de la conversion d'une app shiny en une app shiny dsfr (en utilisant `convert_to_dsfr()`) +Vous pouvez également ajouter votre composant dans l'[application de démonstration]("https://github.com/spyrales/shinygouv/tree/main/dev/R). diff --git a/vignettes/Dev-C-montee-en-version-du-dsfr-trouver-les-fichiers-css-et-js.Rmd b/vignettes/Dev-C-montee-en-version-du-dsfr-trouver-les-fichiers-css-et-js.Rmd index 63d54eb2..12a6b099 100644 --- a/vignettes/Dev-C-montee-en-version-du-dsfr-trouver-les-fichiers-css-et-js.Rmd +++ b/vignettes/Dev-C-montee-en-version-du-dsfr-trouver-les-fichiers-css-et-js.Rmd @@ -24,6 +24,15 @@ library(shinygouv) knitr::opts_chunk$set(eval = FALSE) ``` +# Comment savoir ce qui a été mis à jour ? + +Le principe de ce package est de proposer une transposition des fonctions de {shiny} à la charte graphique Marque Etat grâce au [design system de l'Etat](https://www.systeme-de-design.gouv.fr/elements-d-interface/composants/. Pour savoir si une montée de version est nécessaire, consultez les notes de versions du dsfr sur https://www.systeme-de-design.gouv.fr/a-propos/versions/version-courante. + +Egalement, les fonctions shiny transposées peuvent évoluer : consultez ici les notes de versions de shiny : https://github.com/rstudio/shiny/blob/main/NEWS.md. + + +# Procéder à une montée de version du dsfr + Dans le dossier "inst/" du package, nous allons créer deux dossiers: - un pour récolter les css et js du dsfr, @@ -38,7 +47,7 @@ Indiquez ici le numéro de la nouvelle version à implémenter que vous pourrez nouvelle_version <- "1.9.3" ``` -# Récolter les fichiers CSS et JS du DSFR +## Récolter les fichiers CSS et JS du DSFR - Télécharger le zip de la dernière version `1.7.2` qui se trouve [ici](https://gouvfr.atlassian.net/wiki/spaces/DB/pages/223019574/D+veloppeurs) - Décompresser le fichier @@ -79,7 +88,7 @@ Vous pouvez lancer le contenu du script [dev/tools/maj_version_dsfr.R](https://g On pourra ensuite créer une fonction qui permettera d'ajouter les dépendances dans les applications {shiny}. -## Mettre à jour les composants avec le nouveau dsfr +### Mettre à jour les composants avec le nouveau dsfr Dans le fichier "table_correspondance_shiny_dsfr.csv", mettez `non` dans la colonne `mis_a_jour` car pour le moment, vous ne vous êtes pas assurer du bon foncionnement des composants dans la nouvelle version. @@ -101,7 +110,7 @@ cat( ) ``` -# Monter le numéro de version dans DESCRIPTION +## Monter le numéro de version dans DESCRIPTION Quand tous les dossiers sont prêt, pour garder trace de la version du dsfr utilisée dans {shinygouv}, nous stockons celle en cours dans le fichier DESCRIPTION @@ -110,7 +119,7 @@ Quand tous les dossiers sont prêt, pour garder trace de la version du dsfr util desc::desc_set("VersionDsfr" = nouvelle_version) ``` -# Nettoyer la version d'avant +## Nettoyer la version d'avant Nous n'avons pas besoin de stocker toutes les versions du dsfr dans le package. Maintenant que vous avez récupéré les fichiers pour une nouvelle version, vous pouvez supprimer la plus ancienne. @@ -133,7 +142,7 @@ if (length(all_versions > 2)) { } ``` -# Récupérer les codes HTML un par un +## Récupérer les codes HTML un par un Suivre la procédure de création de composant dans la vignette `Comment faire un composant shiny` diff --git a/vignettes/Dev-D-Faire-tourner-les-applications-shiny-du-package-shinygouv.Rmd b/vignettes/Dev-D-Faire-tourner-les-applications-shiny-du-package-shinygouv.Rmd new file mode 100644 index 00000000..2fe07164 --- /dev/null +++ b/vignettes/Dev-D-Faire-tourner-les-applications-shiny-du-package-shinygouv.Rmd @@ -0,0 +1,57 @@ +--- +title: "Faire tourner les applications shiny du package shinygouv" +output: github_document +vignette: > + %\VignetteIndexEntry{Dev-D-Faire-tourner-les-applications-shiny-du-package-shinygouv} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r setup, include = FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>" +) +``` + +Ce package contient 2 applications shiny Golem : + +- une première application au design classique a été placée dans [inst/test.convert.dsfr]("https://github.com/spyrales/shinygouv/tree/main/inst/inst/test.convert.dsfr), pour tester la fonction de conversion `convert_to_dsfr()` ; +- une seconde application, mise au design DSFR, permet de visualiser les composants de `{shinygouv}`, elle déployée par intégration continue. + +## Application au design classique inst/test.convert.dsfr + +Pour faire fonctionner localement l'app Shiny incluse dans "inst/", il faut lancer: +```{r eval = FALSE} +withr::with_dir("inst/inst/test.convert.dsfr/", { + pkgload::load_all(export_all = FALSE, helpers = FALSE, attach_testthat = FALSE, quiet = TRUE) + test.convert.dsfr::run_app() +}) +``` + +Et pour tester la conversion à la volée avec +```{r eval = FALSE} +pkgload::load_all() +mydir <- tempfile(pattern = "app") +fs::dir_copy("inst/test.convert.dsfr/", mydir) +withr::with_dir(mydir, { + convert_to_dsfr() + pkgload::load_all(export_all = FALSE, helpers = FALSE, attach_testthat = FALSE, quiet = TRUE) + test.convert.dsfr::run_app() +}) +``` + +## Application de demo du package + +Le package `{shinygouv}` contient une application de démo, qui permet de visualiser les composants implémentés. + +Elle peut être lancée en local avec : + +```{r eval=FALSE} +shinygouv::run_app() +``` + +Cette application est déployée par intégration continue sur : + +- https://ssm-ecologie.shinyapps.io/shinygouv-demo/ pour la branche principale, en production +- https://ssm-ecologie.shinyapps.io/shinygouv-demo-dev/ pour la branche de dev diff --git a/vignettes/Dev-G-test-and-coverage.Rmd b/vignettes/Dev-G-test-and-coverage.Rmd index 6b0e9a61..3380b61a 100644 --- a/vignettes/Dev-G-test-and-coverage.Rmd +++ b/vignettes/Dev-G-test-and-coverage.Rmd @@ -140,3 +140,20 @@ Session Info + + +## Description of coverage report + +- Total coverage percentage, this is the total number of lines covered by a test divided by the total number of lines requiring testing. +- File = Name of the file, the code coverage is calculated per file. +- Lines = Number of lines in the file, corresponds to the number of lines inside the file. +- Relevant = Corresponds to the lines of code to be tested (i.e. the lines inside the function brackets with the brackets and comments removed). +- Covered = Number of lines covered by a test +- Missed = Number of lines not covered by a test +- Hits/Line = Corresponds to the average number of times specific lines are tested in the file. + + In other words, if I have an 11-lines file where (1) the first 6 lines are tested 4 times, (2) the seventh is tested 1 time, (3) the last 4 are tested 10 times. The calculation is then: ((6 * 4) + 1 + (10 * 4))/11 = 6. This gives the average number of times a line is tested, here 6. +- Coverage = corresponds to the percentage of lines covered by a test. Calculation: Covered / Relevant * 100, number of lines covered by a test divided by the number of lines requiring testing. +- If we go into detail by file, the color code is as follows: + - green line = line tested by at least one test (the x? corresponds to the number of times the line is tested) + - red line = line not covered by a test + - white line = lines not to be tested (comments, ...) diff --git a/vignettes/Dev-E-recommandation-pour-l-implementation-de-dsfr.Rmd b/vignettes/Hist-A-recommandation-pour-l-implementation-de-dsfr.Rmd similarity index 78% rename from vignettes/Dev-E-recommandation-pour-l-implementation-de-dsfr.Rmd rename to vignettes/Hist-A-recommandation-pour-l-implementation-de-dsfr.Rmd index 9958a94d..cb59c92c 100644 --- a/vignettes/Dev-E-recommandation-pour-l-implementation-de-dsfr.Rmd +++ b/vignettes/Hist-A-recommandation-pour-l-implementation-de-dsfr.Rmd @@ -2,7 +2,7 @@ title: "Recommandation pour l'implementation de DSFR" output: rmarkdown::html_vignette vignette: > - %\VignetteIndexEntry{recommandation-pour-l-implementation-de-dsfr} + %\VignetteIndexEntry{Hist-A-recommandation-pour-l-implementation-de-dsfr} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- @@ -19,6 +19,8 @@ knitr::opts_chunk$set( library(shinygouv) ``` +# Note sur les orientations initiales de développement : présentation des options + ### Comparaison entre les différentes possibilités pour répondre au besoin d'utilisation du framework [DSFR](https://gouvfr.atlassian.net/wiki/spaces/DB/overview?homepageId=145359476) Pour ce faire, nous avons rédigé un tableau comparatif entre les éléments trouvés dans le framework DSFR et {shiny}. @@ -42,7 +44,7 @@ DT::datatable( ### Option A {shiny} + {bslib} : -Utiliser les fonctionalités de {bslib} pour utiliser le framework DSFR. +Utiliser les fonctionnalités de {bslib} pour utiliser le framework DSFR. Avantages : @@ -51,8 +53,8 @@ Avantages : Inconvénients: -- Limiter par les paramètres modifiables. -- Nécéssiterait de transformer le CSS de DSFR pour une compatibilité avec bootstrap (ce qui semble être un non-sens :)). +- Limité par les paramètres modifiables. +- Nécessiterait de transformer le CSS de DSFR pour une compatibilité avec bootstrap (ce qui semble être un non-sens :)). - Il faut maintenir le thème DSFR qui est le résultat de la transformation du CSS. Donc une connaissance assez élevée sur bootstrap et DSFR. ThinkR ne peut garantir le succès de cette méthode. Cette méthode n'a jamais été expérimentée. @@ -113,7 +115,7 @@ Avantages: Inconvénients: -- Limiter par ce que propose {shiny}. On ne peut appliquer que les classes DSFR qui ont un équivalent déjà existantes dans bootstrap. +- Limité par ce que propose {shiny}. On ne peut appliquer que les classes DSFR qui ont un équivalent déjà existantes dans bootstrap. - Cela réécrit le code au lancement de l'application et peut donc altérer l'expérience utilisateur. - Ne permet pas d'appliquer les règles d'utilisations des différents composants de DSFR. - Double travail : il faut maintenir un tableau de correspondance entre les deux frameworks. Donc une connaissance assez élevée sur les deux. @@ -199,7 +201,7 @@ server <- function(input, output, session) { shinyApp(ui, server) ``` -Ceci sera transformé en fonction et documenter dans un package +Ceci sera transformé en fonction et documenté dans un package Avantages : @@ -210,14 +212,14 @@ Avantages : Inconvénients: -- Nécéssite plus de développement et donc de temps +- Nécessite plus de développement et donc de temps - Oblige les utilisateurs à remplacer les fonctions {shiny} par les fonctions DSFR - Bonne connaissance en JS pour maintenir le package -On peut tout à fait imaginer une fonction qui parserait le code pour remplacer les appels à {shiny} avec les fonctions {DSFR}. +On peut tout à fait imaginer une fonction qui parcourt le code pour remplacer les appels à {shiny} avec les fonctions {DSFR}. -### Option D `from scratch mais pas vraiement` +### Option D `from scratch mais pas vraiment` On pourrait recoder les inputs en conservant les classes CSS qui permettent l'activation du backend JS (comme pour shinyWidgets). @@ -225,7 +227,7 @@ Exemple pour le actionButton de {shinyWidgets} Néanmoins, le temps gagné sur les inputs basiques pourrait permettre d'implementer de nouveaux inputs si nécéssaire -- Implementation plus simple pour les composants compatibles. +- Implémentation plus simple pour les composants compatibles. - Pas besoin de connaissances avancées en JS pour les composants compatibles. Inconvénients : -- Liée au package {shiny} et aux inputs implémentés +- Lié au package {shiny} et aux inputs implémentés - Si l'input n'existe pas dans {shiny}, alors il faudra recoder la partie JS (c'est vrai pour les options A et B) - Maintenance : suivre {shiny} et DSFR. Autrement dit, si la classe de l'input {shiny} devient autre chose que `action-button` notre code ne marchera plus (peu probable...). @@ -276,7 +278,7 @@ Les changements sont énumérés: - pour shiny: - pour DSFR: -On peut tout à fait imaginer une fonction qui parserait le code pour remplacer les appels à {shiny} avec les fonctions {DSFR}. +On peut tout à fait imaginer une fonction qui parcourt le code pour remplacer les appels à {shiny} avec les fonctions {DSFR}. ## Les inputs recensés dans les apps "ssm-écologie" par option @@ -294,7 +296,8 @@ DT::datatable( ) ``` -Les éléments tels que navbarpage, tabpanel etc sont possible dans la limite de ce que propose DSFR. Ils nécéssitent plus ou moins une demi-journée par composant (codé avec des htmlTemplates). +Les éléments tels que `navbarPage()`, `tabPanel()` etc sont possibles dans la limite de ce que propose le DSFR. +Ils nécessitent plus ou moins une demi-journée par composant (codé avec des htmlTemplates). @@ -302,6 +305,6 @@ Les éléments tels que navbarpage, tabpanel etc sont possible dans la limite de Nous préconisons l'**option D**. Pourquoi ? -Cette aprroche permet de mettre en avant le travail réalisé sur le framework DSFR avec une implementation possible de l'intégralité des fonctionnalités sans la contrainte et la lourdeur de connaitre le JS. Elle permet aussi de faciliter la maintenance du package par les futures mainteneurs. Bien que cette option ne réponde pas directement à l'objectif : `éviter d'avoir des fonctions spécifiques pour ne pas géner le passage d'un template à un autre`, on peut tout à fait imaginer une fonction qui parserait le code pour remplacer les appels à {shiny} avec les fonctions {DSFR}. - - +Cette approche permet de mettre en avant le travail réalisé sur le framework DSFR avec une implémentation possible de l'intégralité des fonctionnalités sans la contrainte et la lourdeur de connaitre le JS. +Elle permet aussi de faciliter la maintenance du package par les futures mainteneurs. +Bien que cette option ne réponde pas directement à l'objectif : `éviter d'avoir des fonctions spécifiques pour ne pas géner le passage d'un template à un autre`, on peut tout à fait imaginer une fonction qui parcourt le code pour remplacer les appels à {shiny} avec les fonctions {DSFR}. diff --git a/vignettes/Dev-F-documentation-inventaire.Rmd b/vignettes/Hist-B-documentation-inventaire.Rmd similarity index 94% rename from vignettes/Dev-F-documentation-inventaire.Rmd rename to vignettes/Hist-B-documentation-inventaire.Rmd index 1d168e01..4b20de29 100644 --- a/vignettes/Dev-F-documentation-inventaire.Rmd +++ b/vignettes/Hist-B-documentation-inventaire.Rmd @@ -2,7 +2,7 @@ title: "Documentation-Inventaire" output: rmarkdown::html_vignette vignette: > - %\VignetteIndexEntry{Dev-F-documentation-inventaire} + %\VignetteIndexEntry{Hist-B-documentation-inventaire} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- @@ -20,6 +20,8 @@ library(shinygouv) ``` +# Note sur les orientations initiales de développement : études des usages au ministère de l'Ecologie + Vous trouverez ci dessous les observations suite à un inventaire (non exhaustif) des outils de mises en pages ainsi que les différentes composantes, utilisées dans les applications shiny déployées sous https://ssm-ecologie.shinyapps.io diff --git a/vignettes/Dev-D-retour-sur-shiny.dsfr.Rmd b/vignettes/Hist-C-retour-sur-shiny.dsfr.Rmd similarity index 62% rename from vignettes/Dev-D-retour-sur-shiny.dsfr.Rmd rename to vignettes/Hist-C-retour-sur-shiny.dsfr.Rmd index 692bfca7..cf6d615d 100644 --- a/vignettes/Dev-D-retour-sur-shiny.dsfr.Rmd +++ b/vignettes/Hist-C-retour-sur-shiny.dsfr.Rmd @@ -2,7 +2,7 @@ title: 'Retour sur shiny.dsfr' output: github_document vignette: > - %\VignetteIndexEntry{Dev-D-retour-sur-shiny.dsfr} + %\VignetteIndexEntry{Hist-C-retour-sur-shiny.dsfr} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- @@ -11,14 +11,18 @@ vignette: > knitr::opts_chunk$set(echo = TRUE, eval = FALSE) ``` +# Note sur les orientations initiales de développement : comparaison avec {shiny.dsfr} + Le package {shiny.dsfr} disponible [ici](https://gitlab-forge.din.developpement-durable.gouv.fr/dreal-pdl/csd/shiny.dsfr/-/tree/main/) utilise {charpente} et reprend la structure "classique" d'un package qui implémente une nouvelle interface utilisateur. Cependant, cette méthode oblige le développeur à convertir le code HTML fourni par le framework dsfr en R, pour ensuite devoir le retraduire en html pour shiny. -Suite à la recommandation adoptée par le client, à savoir l'option D de la vignette `Recommandation`, voici les différents points d'explication sur la méthodologie complémentaire retenue par nos soins en comparaison de {shiny.dsfr} : +Suite à la recommandation adoptée par le client, à savoir l'option D de la vignette [Recommandation](Hist-A-recommandation-pour-l-implementation-de-dsfr), voici les différents points d'explication sur la méthodologie complémentaire retenue par nos soins en comparaison de {shiny.dsfr} : - Premièrement, nous privilégions une approche différente pour ce package en utilisant directement les codes html et htmlTemplate. L'avantage est de ne pas traduire le code html en R, la fonction htmlTemplate le fait pour nous. Cela permettra de maintenir seulement les différents fichiers `.html`. Ensuite, une batterie d'outils sera à disposition du développeur pour créer les fonctions qui exploiteront ces fichiers `html`. -- Deuxièment, dans la mesure du possible, nous souhaiterions ne pas avoir à recoder les `inputs-bindings` de shiny. Pour cela, on réutilisera les classes déjà existantes dans {shiny}. +- Deuxièmement, dans la mesure du possible, nous souhaiterions ne pas avoir à recoder les `inputs-bindings` de shiny. Pour cela, on réutilisera les classes déjà existantes dans {shiny}. -Néanmoins, nous allons nous inspirer du package {shiny.dsfr} qui apporte une logique métier dans certains composants déjà implementés. Par exemple, la gestion de la dépendance avec {bootstrap}. Autrement dit, nous allons reprendre le travail déjà réalisé par Jean-Daniel Lomenede en remplaçant le code {shiny} par des html templates. +Néanmoins, nous allons nous inspirer du package {shiny.dsfr} qui apporte une logique métier dans certains composants déjà implémentes. +Par exemple, la gestion de la dépendance avec {bootstrap}. +Autrement dit, nous allons reprendre le travail déjà réalisé par Jean-Daniel Lomenede en remplaçant le code {shiny} par des html templates.