From 41b769f91be594925edbcfbc24dd36b6d0d9fd89 Mon Sep 17 00:00:00 2001 From: cervan Date: Tue, 4 Jul 2023 11:20:29 +0200 Subject: [PATCH] [fix] Restructuration de la doc - restructuration du dossier dev - restructuration du dossier vignette --- .github/workflows/deploy-dev.yaml | 2 +- .github/workflows/deploy.yaml | 2 +- _pkgdown.yml | 13 + dev/02_dev.R | 47 +++ dev/dev_history_connect.R | 102 ----- dev/dev_history_deliverables.R | 97 ----- dev/dev_history_package.R | 153 ------- dev/dev_history_renv.R | 123 ------ dev/documentation/.gitignore | 2 - dev/documentation/README.md | 149 ------- dev/documentation/fluidpage_dsfr.Rmd | 210 ---------- dev/documentation/header_dsfr.Rmd | 41 -- dev/documentation/radiobuttons_dsfr.Rmd | 222 ---------- dev/flat_comment-faire-un-composant-shiny.Rmd | 123 ------ dev/flat_compare_dsfr_shiny.Rmd | 301 -------------- dev/flat_composants/flat_actionButton.Rmd | 14 +- dev/flat_composants/flat_fluidpage.Rmd | 2 +- dev/flat_composants/flat_header.Rmd | 53 +-- dev/flat_composants/flat_navbarPage.Rmd | 28 +- .../flat_new_one.Rmd | 149 ++++--- dev/flat_composants/flat_numericInput.Rmd | 42 +- dev/flat_composants/flat_radioButtons.Rmd | 2 +- dev/flat_composants/flat_selectInput.Rmd | 2 +- dev/flat_composants/flat_withSpinner.Rmd | 86 ++-- dev/flat_doc_inventaire.Rmd | 98 ----- dev/flat_montee_version_dsfr.Rmd | 145 ------- dev/flat_new_app_dsfr.Rmd | 72 ---- dev/flat_userproject.Rmd | 384 ------------------ dev/pkgs_deps.csv | 42 -- dev/{ => tools}/deploy.R | 0 dev/{ => tools}/flat_convert_to_dsfr.Rmd | 141 ++++--- dev/{ => tools}/flat_tools.Rmd | 38 +- dev/{ => tools}/maj_version_dsfr.R | 0 ...ertir-une-app-shiny-en-app-shiny-dsfr.Rmd} | 2 +- ...r-une-nouvelle-application-shiny-dsfr.Rmd} | 2 +- .../Dev-A-guide-du-developpeur.Rmd | 14 +- ...Dev-B-comment-faire-un-composant-shiny.Rmd | 5 +- ...du-dsfr-trouver-les-fichiers-css-et-js.Rmd | 11 +- .../Dev-D-retour-sur-shiny.dsfr.Rmd | 9 +- ...ndation-pour-l-implementation-de-dsfr.Rmd} | 3 +- ...Rmd => Dev-F-documentation-inventaire.Rmd} | 5 +- ...verage.Rmd => Dev-G-test-and-coverage.Rmd} | 2 +- vignettes/actionbutton_dsfr.Rmd | 67 --- vignettes/html-vers-shiny-tag.Rmd | 41 -- ...du-dsfr-trouver-les-fichiers-css-et-js.Rmd | 140 ------- vignettes/navbarpage_dsfr.Rmd | 116 ------ vignettes/numericinput_dsfr.Rmd | 176 -------- vignettes/selectinput_dsfr.Rmd | 153 ------- vignettes/withspinner_dsfr.Rmd | 81 ---- 49 files changed, 358 insertions(+), 3354 deletions(-) delete mode 100755 dev/dev_history_connect.R delete mode 100755 dev/dev_history_deliverables.R delete mode 100755 dev/dev_history_package.R delete mode 100755 dev/dev_history_renv.R delete mode 100644 dev/documentation/.gitignore delete mode 100644 dev/documentation/README.md delete mode 100644 dev/documentation/fluidpage_dsfr.Rmd delete mode 100644 dev/documentation/header_dsfr.Rmd delete mode 100644 dev/documentation/radiobuttons_dsfr.Rmd delete mode 100644 dev/flat_comment-faire-un-composant-shiny.Rmd delete mode 100644 dev/flat_compare_dsfr_shiny.Rmd rename dev/{documentation => flat_composants}/flat_new_one.Rmd (69%) delete mode 100644 dev/flat_doc_inventaire.Rmd delete mode 100644 dev/flat_montee_version_dsfr.Rmd delete mode 100644 dev/flat_new_app_dsfr.Rmd delete mode 100755 dev/flat_userproject.Rmd delete mode 100644 dev/pkgs_deps.csv rename dev/{ => tools}/deploy.R (100%) rename dev/{ => tools}/flat_convert_to_dsfr.Rmd (64%) rename dev/{ => tools}/flat_tools.Rmd (84%) rename dev/{ => tools}/maj_version_dsfr.R (100%) rename vignettes/{convertir-une-app-shiny-en-app-shiny-dsfr.Rmd => A-convertir-une-app-shiny-en-app-shiny-dsfr.Rmd} (97%) rename vignettes/{comment-demarrer-une-nouvelle-application-shiny-dsfr.Rmd => B-comment-demarrer-une-nouvelle-application-shiny-dsfr.Rmd} (97%) rename dev/documentation/README.Rmd => vignettes/Dev-A-guide-du-developpeur.Rmd (92%) rename dev/documentation/comment-faire-un-composant-shiny.Rmd => vignettes/Dev-B-comment-faire-un-composant-shiny.Rmd (97%) rename dev/documentation/montee-en-version-du-dsfr-trouver-les-fichiers-css-et-js.Rmd => vignettes/Dev-C-montee-en-version-du-dsfr-trouver-les-fichiers-css-et-js.Rmd (91%) rename dev/documentation/explo_shiny.dsfr.Rmd => vignettes/Dev-D-retour-sur-shiny.dsfr.Rmd (89%) rename vignettes/{recommandation-pour-l-implementation-de-dsfr.Rmd => Dev-E-recommandation-pour-l-implementation-de-dsfr.Rmd} (99%) rename vignettes/{documentation-inventaire.Rmd => Dev-F-documentation-inventaire.Rmd} (96%) rename vignettes/{tests_and_coverage.Rmd => Dev-G-test-and-coverage.Rmd} (99%) delete mode 100644 vignettes/actionbutton_dsfr.Rmd delete mode 100644 vignettes/html-vers-shiny-tag.Rmd delete mode 100644 vignettes/montee-en-version-du-dsfr-trouver-les-fichiers-css-et-js.Rmd delete mode 100644 vignettes/navbarpage_dsfr.Rmd delete mode 100644 vignettes/numericinput_dsfr.Rmd delete mode 100644 vignettes/selectinput_dsfr.Rmd delete mode 100644 vignettes/withspinner_dsfr.Rmd diff --git a/.github/workflows/deploy-dev.yaml b/.github/workflows/deploy-dev.yaml index 9b0c0922..180df4af 100644 --- a/.github/workflows/deploy-dev.yaml +++ b/.github/workflows/deploy-dev.yaml @@ -34,4 +34,4 @@ jobs: run: | git config --local user.name "$GITHUB_ACTOR" git config --local user.email "$GITHUB_ACTOR@users.noreply.github.com" - Rscript "dev/deploy.R" + Rscript "dev/tools/deploy.R" diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml index 250a8a77..1ff752a1 100644 --- a/.github/workflows/deploy.yaml +++ b/.github/workflows/deploy.yaml @@ -34,4 +34,4 @@ jobs: run: | git config --local user.name "$GITHUB_ACTOR" git config --local user.email "$GITHUB_ACTOR@users.noreply.github.com" - Rscript "dev/deploy.R" + Rscript "dev/tools/deploy.R" diff --git a/_pkgdown.yml b/_pkgdown.yml index e69de29b..7fd8c47e 100755 --- a/_pkgdown.yml +++ b/_pkgdown.yml @@ -0,0 +1,13 @@ +lang: fr + +articles: +- title: Utiliser `{shinygouv}` + navbar: ~ + contents: + - A-convertir-une-app-shiny-en-app-shiny-dsfr + - B-comment-demarrer-une-nouvelle-application-shiny-dsfr + +- title: Developper `{shinygouv}` + desc: Vignettes à l'intention des mainteneurs de `{shingouv}` + contents: + - starts_with("Dev") diff --git a/dev/02_dev.R b/dev/02_dev.R index 75d685c7..b8a745e9 100644 --- a/dev/02_dev.R +++ b/dev/02_dev.R @@ -11,10 +11,57 @@ #### CURRENT FILE: DEV SCRIPT ##### ################################### + +# ==== Each time needed ==== +# Dependencies ---- +## Ce qu'il faut avant d'envoyer sur le serveur +# devtools::install_github("ThinkR-open/attachment") +# attachment::att_amend_desc(extra.suggests = c("bookdown")) +# attachment::create_dependencies_file() +attachment::att_amend_desc() +# Cela est normal : "Error in eval(x, envir = envir) : object 'db_local' not found" + +devtools::build_readme() + +check_n_covr <- function() { + res <- devtools::check(args = c("--no-tests")) + print(res) + covr::package_coverage(type = "tests", quiet = TRUE) +} + +check_n_covr() +# fusen::check_n_covr() + +# Verifier que les md sont disponibles dans le dossier dev/documentation, +# sinon knit les Rmd en modifiant l'output par github_document + +# Utils for dev ---- +# Get global variables +checkhelper::print_globals() +# styler the package +# install.packages("grkstyle", repos = "https://gadenbuie.r-universe.dev") +grkstyle::grk_style_pkg(pkg = ".") +# linter +lintr::lint_package() +# bump version +desc::desc_bump_version("patch") +# Install +devtools::install(upgrade = "never") +# devtools::load_all() +devtools::check(vignettes = TRUE) +# ascii +stringi::stri_trans_general("è", "hex") +# Create a summary readme for the testthat subdirectory +covrpage::covrpage() + +# Documentation and dev ---- +charpente::get_dependency_versions("@gouvfr/dsfr") + # Engineering: to do everytime # => In dev/dev_history_package.R + # ==== To do once with {golem} ==== ## Add modules ---- ## Create a module infrastructure in R/ diff --git a/dev/dev_history_connect.R b/dev/dev_history_connect.R deleted file mode 100755 index 8e5fc07f..00000000 --- a/dev/dev_history_connect.R +++ /dev/null @@ -1,102 +0,0 @@ -## Script pour deployer sur Connect avec le CI -# _Créer un token de déploiement dédié au projet pour le user générique sur Connect -# _Ajouter le token en variable privée masquée dans le dépot GitLab: CONNECT_TOKEN -# _Ajouter le nom d'utilisateur Connect en variable privée masquée dans le dépot GitLab: CONNECT_USER -# _Dans le projet GitLab Settings > CI/CD > Variables > Expand > Add variable -# _Attention : si vous cochez "Protected" au moment de la création de la variable, alors celle-ci ne sera active que pour les branches protégées -# _Ajouter la ligne suivante dans votre gitlab-ci.yml, après la création du pkgdown -# __ Si c'est le pkgdown que vous voulez envoyer -# ` - Rscript "dev/dev_history_connect.R"` - -# Ajouter aussi ces 2 variables d'environnement dans votre .Rprofile local -# pour le premier envoi manuel sur Connect - -# Un stage complet de CI peut-être (Attention avec les espaces, faire du LINT) -# Changer master par main si besoin - -# connect: -# stage: deploy-connect -# dependencies: -# - pages -# only: -# - main -# - master -# - test-ci -# script: -# # To uncomment if you want to deploy a ShinyApp from a {golem} -# # - echo "Library path for packages :" $R_LIBS -# # - mkdir -p $R_LIBS -# # - Rscript 'install.packages("remotes")' -# # - Rscript -e 'remotes::install_local(upgrade = "never", dependencies = TRUE)' -# - Rscript "dev/dev_history_connect.R" -# artifacts: -# paths: -# # This will download artifacts from previous jobs -# - public -# expire_in: 30 days - -# Ne pas oublier d'ajouter le stage "deploy-connect" -# à la liste des stages du début du fichier gitlab-ci.yml -# Dans cet ordre - -# stages: -# - build -# - test -# - pkgdown -# - pkgdown-move -# - deploy -# - deploy-connect - -# /!\ => La premiere fois, executer en commentant le parametre "appID" -# Les fois suivantes, décommenter "appID" pour mettre le numéro de l'app sur Connect -# Choisir les paramètres ci-dessous en fonction de votre besoin - -# Définir les droits de lecture de l'app sur Connect avec des individus et pas des groupes. -# Seuls les devs du projet et le client contact y ont accès - -# Changer `mypackage` par le nom de votre package dans ce fichier - -# Après le premier envoi manuel, définissez une url sur Connect directement -# pour avoir accès au site web - Ajuster les droits de lecture aussi -# Ensuite, mettez à jour le README pour dire où est le rapport de CI - pkgdown et coverage -# Doc and coverage - -# - pkgdown: https://connect.thinkr.fr/mypackage-pkgdown-website/ -# - coverage report: https://connect.thinkr.fr/mypackage-pkgdown-website/coverage.html - - -# Deps -install.packages("rsconnect") - -## deploy shinyapp -# orgiwd <- setwd(".") # Uncomment here and below -## deploy pkgdown -# pkgdown::build_site() -if (dir.exists("public")) { - origwd <- setwd("public") -} else { - origwd <- setwd("docs") -} -print(paste("--", getwd(), "--")) - -rsconnect::addServer("https://connect.thinkr.fr/__api__", name = "connect") -rsconnect::connectApiUser(account = Sys.getenv("CONNECT_USER"), - server = "connect", apiKey = Sys.getenv("CONNECT_TOKEN")) - -# S'il y a {renv} dans votre projet, vous devrez probablement cacher quelques dossiers, par exemple -appFiles <- list.files(".", recursive = TRUE) -appFiles <- appFiles[!grepl(".Rprofile|renv|rstudio_|deliverables|dev|data-raw|docker", appFiles)] - -rsconnect::deployApp( - ".", # the directory containing the content - appName = "mypackage-pkgdown-website", - appFiles = appFiles, # the list of files to include as dependencies (all of them) - appPrimaryDoc = "index.html", # the primary file for pkgdown - # appPrimaryDoc = "app.R", # the primary file for shinyapp # Uncomment here - # appId = 000, # Define when known - account = Sys.getenv("CONNECT_USER"), - server = "connect", - forceUpdate = FALSE -) - -setwd(origwd) diff --git a/dev/dev_history_deliverables.R b/dev/dev_history_deliverables.R deleted file mode 100755 index 57f73ac4..00000000 --- a/dev/dev_history_deliverables.R +++ /dev/null @@ -1,97 +0,0 @@ -# Deliverables ==== - -# Deliverables -dir.create("deliverables") -usethis::use_build_ignore("deliverables") -usethis::use_git_ignore("deliverables") - -## Upgrade version Number in DESCRIPTION -usethis::use_version(which = c("major", "minor", "patch", "dev")[2]) -## Update NEWS.md -rstudioapi::navigateToFile("NEWS.md") -## Create a commit for the version -## Add tag on version commit - -## _covr ---- -x <- covr::package_coverage() -# Change {my-project} -covr::report(x, file = "deliverables/codecoverage/codecoverage-full-report.html") -# Add read information -file.copy(from = "dev/codecoverage_explanation.md", - to = "deliverables", overwrite = TRUE) - -## _add covrpage ---- -# remotes::install_github("metrumresearchgroup/covrpage") -covrpage::covrpage(vignette = TRUE) -file.remove("tests/README.md") - -## _pkgdown ---- - -## __Create gitdown ---- -# => Create deliverable commit - -# remotes::install_github("ThinkR-open/gitdown", upgrade = "never") -gitdown::git_down( - pattern = c("Issues" = "#[[:digit:]]+"), - author = "Sébastien Rochette, ThinkR; Murielle Delmotte, ThinkR; Cervan Girard, ThinkR", - ref = "main") - -# rmarkdown::render("gitdown/index.Rmd") - -# Git issues names -library(gh) -library(purrr) -library(dplyr) -# gh_token() -issue_list <- gh( - "/repos/:owner/:repo/issues", - owner = "spyrales", - repo = "shinygouv", - state = "all", since = "2022-05-01T00:00:00Z", - .limit = Inf) -issue_df <- issue_list %>% - tibble(number = map_int(., "number"), - id = map_int(., "id"), - title = map_chr(., "title"), - state = map_chr(., "state"), - n_comments = map_int(., "comments"), - opener = map_chr(., c("user", "login")), - created_at = map_chr(., "created_at") %>% as.Date()) -issue_df - -my_pattern_table <- issue_df %>% - mutate( - pattern = paste0("#", number), - title = paste(pattern, title) - ) %>% - select(pattern, title) - -my_pattern_table -gitdown::git_down( - pattern = c("Issues" = "#[[:digit:]]+" - ), - pattern.table = my_pattern_table, - author = "Sébastien Rochette, ThinkR; Murielle Delmotte, ThinkR; Cervan Girard, ThinkR", - ref = "main") - -down_dir <- "deliverables/gitdown" -unlink(down_dir, recursive = TRUE) -file.copy("gitdown", "deliverables", recursive = TRUE) -unlink("gitdown", recursive = TRUE) - -## __Create testdown ---- -# remotes::install_github("ThinkR-open/testdown") -testdown::test_down() -down_dir <- "deliverables/testdown" -unlink(down_dir, recursive = TRUE) -file.copy("tests/testdown", "deliverables", recursive = TRUE) -unlink("tests/testdown", recursive = TRUE) - -# _DockerFile and sources ---- - -# Create sources -usethis::use_git_ignore("deliverables/sources/") -dir.create("deliverables/sources") -devtools::build(path = "deliverables/sources/") - -# END of deliverables ==== diff --git a/dev/dev_history_package.R b/dev/dev_history_package.R deleted file mode 100755 index bf11a6d4..00000000 --- a/dev/dev_history_package.R +++ /dev/null @@ -1,153 +0,0 @@ -# ==== Each time needed ==== -# Dependencies ---- -## Ce qu'il faut avant d'envoyer sur le serveur -# devtools::install_github("ThinkR-open/attachment") -# attachment::att_amend_desc(extra.suggests = c("bookdown")) -# attachment::create_dependencies_file() -attachment::att_amend_desc() -# Cela est normal : "Error in eval(x, envir = envir) : object 'db_local' not found" - -devtools::build_readme() - -check_n_covr <- function() { - res <- devtools::check(args = c("--no-tests")) - print(res) - covr::package_coverage(type = "tests", quiet = TRUE) -} - -check_n_covr() -# fusen::check_n_covr() - -# Verifier que les md sont disponibles dans le dossier dev/documentation, -# sinon knit les Rmd en modifiant l'output par github_document - -# Utils for dev ---- -# Get global variables -checkhelper::print_globals() -# styler the package -# install.packages("grkstyle", repos = "https://gadenbuie.r-universe.dev") -grkstyle::grk_style_pkg(pkg = ".") -# linter -lintr::lint_package() -# bump version -desc::desc_bump_version("patch") -# Install -devtools::install(upgrade = "never") -# devtools::load_all() -devtools::check(vignettes = TRUE) -# ascii -stringi::stri_trans_general("è", "hex") -# Create a summary readme for the testthat subdirectory -covrpage::covrpage() - -# Documentation and dev ---- -charpente::get_dependency_versions("@gouvfr/dsfr") - -## deps for dev ---- -## Only for describe deps for developper -install.packages("remotes") -remotes::install_cran("attachment") -pkgs <- unique( - c( - attachment::att_from_rmds("dev"), - attachment::att_from_rscripts("dev") - ) -) - -remotes_or_not <- lapply(pkgs, function(x) { - packageDescription(x) -}) %>% - setNames(pkgs) - -cran_or_not <- lapply(remotes_or_not, function(x) { - try(x[["Repository"]], silent = TRUE) -}) %>% - sapply(., is.null) - -github_pkg <- names(cran_or_not[cran_or_not]) -cran_pkg <- names(cran_or_not[!cran_or_not]) -github_repo <- lapply(github_pkg, function(x) { - desc <- remotes_or_not[[x]] - tolower(paste(desc$RemoteUsername, desc$RemoteRepo, sep = "/")) -}) %>% - setNames(github_pkg) %>% - purrr::compact() - -packages_and_deps <- rbind( - data.frame( - name_pkg = cran_pkg, cran = TRUE, remote = "" - ), - data.frame( - name_pkg = names(github_repo), cran = FALSE, remote = unlist(github_repo) - ) -) - -write.csv(x = packages_and_deps, "dev/pkgs_deps.csv") - - - -# ==== Usually once ==== -# Hide this file from build -usethis::use_build_ignore("dev") -usethis::use_build_ignore("ci/lib") -usethis::use_build_ignore("rsconnect") -usethis::use_git_ignore("docs/") -usethis::use_git_ignore("rsconnect/") -# usethis::create_package(".") - -# Vaccinate for MacOS -usethis::git_vaccinate() -usethis::use_git_ignore(c(".DS_Store", ".Rproj.user", ".Rdata", ".Rhistory", ".httr-oauth")) - -# Licence ---- -# usethis::use_mit_license("ThinkR") - - -# Pipe ---- -usethis::use_pipe() - -# Data -dir.create("inst") -dir.create("inst/excel_files") - -# Package quality ---- - -# _Tests ---- -usethis::use_testthat() -usethis::use_test("app") - -# GitHub Actions ---- -usethis::use_readme_rmd() -usethis::use_github_action_check_standard() -usethis::use_github_action("pkgdown") -# _Add remotes::install_github("ThinkR-open/thinkrtemplate") in this action -usethis::use_github_action("test-coverage") -## Set the code coverage service ("codecov" or "coveralls") -usethis::use_coverage() - -# _rhub -# rhub::check_for_cran() - - -# Documentation ---- -# _Readme -# usethis::use_readme_rmd() -# CoC -usethis::use_code_of_conduct(contact = "juliette.engelaere-lefebvre@developpement-durable.gouv.fr") -# Contributing -usethis::use_tidy_contributing() - -# _News -usethis::use_news_md() - -# package-level documentation -usethis::use_package_doc() - -# _Vignette -# usethis::use_vignette("ab-model") -devtools::build_vignettes() - - -# _Pkgdown - Pas besoin d'inclure le pkgdown pour un projet open-source avec un gh-pages -usethis::use_pkgdown() -# pkgdown::build_site() # pour tests en local diff --git a/dev/dev_history_renv.R b/dev/dev_history_renv.R deleted file mode 100755 index b6e3f48a..00000000 --- a/dev/dev_history_renv.R +++ /dev/null @@ -1,123 +0,0 @@ -# Start {renv} the first time ==== -renv::init() - -# Set RENV cache ==== -# Recommend setting a global variable: RENV_PATHS_CACHE -# With cache path where to store all R packages, between projects -# usethis::edit_r_environ(scope = "project") -# => Restart session -# => Tell all contributors to set this Environment variable - -# Add the following lines to your .Rprofile in the project -#- On modifie le ".Rprofile" pour -# - figer les depot CRAN et leur nom -# - forcer l'utilisation du cache partagé {renv} -# - mettre en adéquation les depot d'installation et ceux du renv.lock - -# -# Sourcing user .Rprofile if it exists -home_profile <- file.path( - Sys.getenv("HOME"), - ".Rprofile" -) -if (file.exists(home_profile)){ - source(home_profile) -} - -options(renv.config.pak.enabled = TRUE) - -# Fix CRAN version -source("renv/activate.R") -lock_ <- renv:::lockfile(file = "renv.lock") -# -if (grepl("ubuntu 18.04|debian 8", tolower(utils::osVersion))) { - repos <- c("RSPM" = "https://packagemanager.rstudio.com/all/__linux__/bionic/latest", - "thinkropen" = "https://thinkr-open.r-universe.dev", - "CRAN" = "https://cran.rstudio.com") -} else if (grepl("ubuntu 20.04|debian 9", tolower(utils::osVersion))) { - repos <- c("RSPM" = "https://packagemanager.rstudio.com/all/__linux__/focal/latest", - "thinkropen" = "https://thinkr-open.r-universe.dev", - "CRAN" = "https://cran.rstudio.com") -} else if (grepl("centos", tolower(utils::osVersion))) { - # Important for MacOS users in particular - repos <- c("RSPM" = "https://packagemanager.rstudio.com/all/__linux__/centos7/latest", - "thinkropen" = "https://thinkr-open.r-universe.dev", - "CRAN" = "https://cran.rstudio.com") -} else { - # Important for MacOS and Windows users in particular - repos <- c("CRAN" = "https://cran.rstudio.com", - "RSPM" = "https://cran.rstudio.com", - "thinkropen" = "https://thinkr-open.r-universe.dev") -} - - -lock_$repos(.repos = repos) -options(repos = repos) - - -lock_$write(file = "renv.lock") -rm(lock_) -rm(repos) - - -renv::activate() - -# cache ---- -# usethis::edit_r_environ(scope = "project") - -renv::settings$use.cache(TRUE) - -# Setting shiny.autoload.r to FALSE -options(shiny.autoload.r = FALSE) - -# - - - -# ==> Restart RStudio Session <== - - - -# You may need to verify renv.lock with: -# "Name": "REPO_NAME", -# "URL": "https://packagemanager.rstudio.com/all/latest" - -# You may need to verify not empty -# Sys.getenv("RENV_PATHS_CACHE") - -# Install from CRAN ---- -install.packages("rstudioapi", repos = getOption("repos")["CRAN"]) -install.packages("remotes", repos = getOption("repos")["CRAN"]) -remotes::install_cran("devtools", repos = getOption("repos")["CRAN"]) -# If needed -- -# remotes::install_cran("golem", repos = getOption("repos")["CRAN"]) -# remotes::install_cran("shiny", repos = getOption("repos")["CRAN"]) -# Install from GitHub through r-universe first -- -# remotes::install_cran("attachment", repos = getOption("repos")[c("thinkropen", "CRAN")]) -remotes::install_cran("fusen", repos = getOption("repos")[c("thinkropen", "CRAN")]) -remotes::install_cran("checkhelper", repos = getOption("repos")[c("thinkropen", "CRAN")]) -remotes::install_cran("thinkrtemplate", repos = getOption("repos")[c("thinkropen", "CRAN")]) - - -# git push / pull ==== -## Ce qu'il faut avant d'envoyer sur le serveur -# install.packages("attachment", repos = getOption("repos")["thinkropen"]) -# attachment::att_amend_desc(extra.suggests = c("bookdown")) -# attachment::create_dependencies_file() -attachment::att_amend_desc() -devtools::check() - -# _renv -custom_packages <- c( - attachment::att_from_description(), - "renv", "utils", - "devtools", "roxygen2", "usethis", "pkgload", - "testthat", "covr", "attachment", - "pkgdown", "styler", "checkhelper", "remotes", "fusen", - # remotes::install_github("ThinkR-open/thinkrtemplate") - "thinkrtemplate" -) -renv::snapshot(packages = custom_packages) - -## After pull -renv::restore() diff --git a/dev/documentation/.gitignore b/dev/documentation/.gitignore deleted file mode 100644 index 88b06327..00000000 --- a/dev/documentation/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -*.md -!README.md diff --git a/dev/documentation/README.md b/dev/documentation/README.md deleted file mode 100644 index d5580c09..00000000 --- a/dev/documentation/README.md +++ /dev/null @@ -1,149 +0,0 @@ -Guide du développeur -================ - -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. - -## 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 connaître la version utilisée, vous pouvez lancer : - -``` r -desc::desc_get("VersionDsfr") -``` - - ## VersionDsfr - ## "1.7.2" - -## Ajouter une nouvelle version du dsfr - -Si vous souhaitez implémenter une nouvelle version du dsfr, vous devez -suivre les instructions dans “dev/flat_montee_version_dsfr.Rmd”. - -``` r -rstudioapi::navigateToFile("dev/flat_montee_version_dsfr.Rmd") -``` - - ## [1] "8DB8266C" - -Lorsque vous aurez implémenté toutes les composantes avec la nouvelle -version, vous pourrez mettre à jour le fichier DESCRIPTION avec la -commande suivante : - -``` r -desc::desc_set("VersionDsfr" = "1.7.2") -``` - -## Workflow à suivre avant de dev sur le projet : - -### Ajouter le template de commit : - - git config --local commit.template .github/template_commit - -### Suivre cette convention pour les commits et les tags : - -- Un mot clé et un titre en début de message pour dire le principal - objectif de ce commit. -- Une ligne `tags` qui reprend les mots clés pour ce qui est fait dans - le commit - -Voici un exemple : - - feat: ma fonctionnalité de ouf - - # Tags possibles du plus au moins important : - Tags: ci, fix, feat, doc, test, style, chore - - Pourquoi ? - - Quoi ? - - Tickets - -Et voici la liste des tags possible dans l’ordre d’importance pour le -choix du tag majeur dans le titre du commit : - - ci : tout ce qui touche au ci, meme les fix du ci pour l'instant - fix : correction d'un bug dans la code base - feat : l'ajout d'une nouvelle feature - doc : doc du package, on devrait voir que ça la sur ces 3 jours en gros - test: pour les tests unitaires - style : pour la mise en forme de code - chore : tout ce qui touche au projet en lui même, ne correspond pas à un feat ou un fix - -### S’assurer d’avoir une issue à résoudre - -- Dans le cadre de l’ajout d’un nouveau composant, vous pouvez créer - une issue avec le template d’issue “composant” - - Il se trouve sur GitHub à la création d’une issue, ou dans le - package: “.github/ISSUE_TEMPLATE/composant.md” - -### Développer dans une branche - -- Chaque développement se fait dans une nouvelle branche - - Elle est nommée à partir du numéro de l’issue à traiter -- Les développements sont intégrés à la branche principale après - demande de PR de votre branche vers la branche principale - -## 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](explo_shiny.dsfr.md). - -Le workflow se découpe en deux possibilités : - -- Les composants nécéssitant 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 : - -- [Comment faire un composant - shiny](comment-faire-un-composant-shiny.md) - -Vous trouverez des exemples pour d’autres composants : - -- Avec réactivité: - - [radio buttons](radiobuttons-dsfr.md) -- Sans réactivité: - - [Fluid page](fluidpage_dsfr.md) - -N’hésitez pas à amender cette liste au fur et à mesure de vos -développements - -## Les langues utilisées dans le projet - -- Rapports d’exploration (présentés en vignettes) : 🇫🇷 -- Vignettes utilisateurs: les vignettes qui expliquent comment - utiliser les fonctions du package 🇫🇷 -- Contenu du Readme 🇫🇷 -- Documentation {roxygen2} des fonctions 🇫🇷 -- Messages de commit (de préférence en anglais, par habitude chez - nous) 🇫🇷 -- Description des tests unitaires (de préférence en anglais) 🇫🇷 -- Contenu du NEWS.md 🇫🇷 -- 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} 🇬🇧 - -## Les packages nécéssaires au developpement - -En plus des dépendances du package, un ensemble de packages sera -nécessaire pour le bon developpement du package. - -Vous retrouverez cette liste dans le fichier `dev/pkgs_deps.csv`. - -## Workflow avant de commit - -Pensez à executer les lignes “Each time needed” du fichier -`dev/dev_history_package.R` avant chaque commit. - -``` r -rstudioapi::navigateToFile("dev/dev_history_package.R") -``` diff --git a/dev/documentation/fluidpage_dsfr.Rmd b/dev/documentation/fluidpage_dsfr.Rmd deleted file mode 100644 index d753be0f..00000000 --- a/dev/documentation/fluidpage_dsfr.Rmd +++ /dev/null @@ -1,210 +0,0 @@ ---- -title: "fluidPage_dsfr" -output: rmarkdown::html_vignette -vignette: > - %\VignetteIndexEntry{fluidpage_dsfr} - %\VignetteEngine{knitr::rmarkdown} - %\VignetteEncoding{UTF-8} ---- - -```{r, include = FALSE} -knitr::opts_chunk$set( - collapse = TRUE, - comment = "#>" -) -``` - -```{r setup} -library(shinygouv) -``` - - - -Documentation sur l'implementation des composants `fluidPage_dsfr`, `fluidRow_dsfr` et les columns. - -Nous allons dans un premier temps nous attaquer au fluidPage. - - -# fluidPage_dsfr_template - -Comme expliqué dans le workflow de création des composants, nous avons un fichier `html` dans le dossier `inst/v1.7.2/composant/fluidpage.html`. Celui ci reprend la structure de base de la page pour dsfr. - -Ensuite, vient la traduction avec `htmlTemplate` : - - -```{r eval = FALSE, echo = TRUE} -fluidPage_dsfr_template <- function( - header, - title, - body - ) { - - htmltools::htmlTemplate( - filename = system.file( - get_dsfr_version(with_v = TRUE), - "composant", - "fluidpage.html", - package = "shinygouv" - ), - header = NULL, - title = title, - body = body - ) -} -``` - -Les paramètres `header`, `title` et `body` sont repris dans le html pour pouvoir le créer. - - -# fluidPage_dsfr - -Le template étant défini, nous allons pourvoir apporter notre logique métier dans la fonction `fluidPage_dsfr`. Pour ça, la fonction reprend le template précédent. Ensuite, cette fonction permet d'ajouter une logique sur les paramètres, comme checker avec des assertthat ou autre. - -Aussi, c'est ici que nous ajoutons les dépendences à notre application avec `add_dsfr_deps`. Autrement dit, nous chargons à cet endroit le css, js et autres. - -Petit détail technique, le `parse_html` n'est pas appliqué exceptionnellement dans le `fluidPage_dsfr`afin de conserver les dépendances des `htmlwidgets`. -Il est donc à noter qu'il ne sera pas possible de faire des tags Attributes sur l'objet `ui`. - - -```{r eval = FALSE, echo = TRUE} -fluidPage_dsfr <- function( - ..., - header = NULL, - title = NULL, - theme = NULL, - lang = NULL - ) { - - # TODO theme et lang - # check les params - ui <- fluidPage_dsfr_template( - header = tagList(header), - title = tagList(title), - body = tagList( - ... - ) - ) %>% - parse_html(zone = "/html") %>% - add_dsfr_deps() - ui - -} -``` - -```{r examples-fluidPage_dsfr, eval = FALSE} -my_page <- fluidPage_dsfr( - header = header_dsfr( - intitule = "Prefet de", - officiel = "Bretagne", - ), - title = "Gouv", - htmltools::div("test") -) -if (interactive()) { - shiny::shinyApp( - my_page, - server = function(input, output) {} - ) -} -``` - -# fluidRow_dsfr - -Voici un autre exemple pour les layouts. Un ensemble de fonction va reposer sur un seul template, celui du layout. On trouve alors un fichier `html` dans un dossier `layout`. - - -```{r echo = TRUE, eval = FALSE} -layout_dsfr_template <- function( - html, - class, - other_class - ) { - - htmltools::htmlTemplate( - filename = system.file( - get_dsfr_version(with_v = TRUE), - "layout", - "layout.html", - package = "shinygouv" - ), - html = html, - class = class, - other_class = other_class - ) -} -``` - -Avec cette fonction, on va pouvoir initier tout un ensemble d'éléments pour notre application, comme les fluidRow, les containers et les columns - - -## Exemple pour `fluidRow_dsfr()` - -On reprend le template layout et on ajoute notre logique métier sur les paramètres. - - -```{r example-fluidRow_dsfr} -if (interactive()) { - shiny::shinyApp( - ui = fluidPage_dsfr( - title = "exemple", - fluidRow_dsfr( - shiny::p("Voici un exemple") - ) - ), - server = function(input, output) {} - ) -} -``` - -## Exemple avec les colonnes - -Le fonctionnement des colonnes est un peu différent pour le dsfr. Si la largeur n'est pas précisée alors la taille des colonnes est automatiquement calculée en fonction du nombre. Mais on a quand même la possibilité de changer la taille comme dans {shiny}. Nous allons donc implementer cette logique en essayant de penser à la conversion de nos applications. - - -```{r echo = TRUE, eval = FALSE} -column_dsfr <- function(width = NULL, ...) { - - if (is.null(width)) { - add_width <- "" - } else { - if (width != 0) { - add_width <- paste0("-", width) - } else { - add_width <- "" - } - } - - class <- paste0("fr-col", add_width) - - layout_dsfr_template( - html = tagList( - ... - ), - class = class, - other_class = NULL - ) -} -``` - -```{r example-column_dsfr} -if (interactive()) { - shiny::shinyApp( - ui = fluidPage_dsfr( - title = "exemple", - fluidRow_dsfr( - column_dsfr(0, "test"), - column_dsfr(0, "test"), - column_dsfr(0, "test"), - column_dsfr(0, "test") - ) - ), - server = function(input, output) {} - ) -} -``` - -## 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). - - diff --git a/dev/documentation/header_dsfr.Rmd b/dev/documentation/header_dsfr.Rmd deleted file mode 100644 index e3a3473b..00000000 --- a/dev/documentation/header_dsfr.Rmd +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: "header_dsfr" -output: rmarkdown::html_vignette -vignette: > - %\VignetteIndexEntry{header_dsfr} - %\VignetteEngine{knitr::rmarkdown} - %\VignetteEncoding{UTF-8} ---- - -```{r, include = FALSE} -knitr::opts_chunk$set( - collapse = TRUE, - comment = "#>" -) -``` - -```{r setup} -library(shinygouv) -``` - - - -# header_dsfr_template - - - - - - - - - -# header_dsfr - -```{r examples-header_dsfr} - header_dsfr( - intitule = "Prefet de", - officiel = "Bretagne", - ) -``` - diff --git a/dev/documentation/radiobuttons_dsfr.Rmd b/dev/documentation/radiobuttons_dsfr.Rmd deleted file mode 100644 index 8c3e7a0d..00000000 --- a/dev/documentation/radiobuttons_dsfr.Rmd +++ /dev/null @@ -1,222 +0,0 @@ ---- -title: "radioButtons_dsfr" -output: github_document -vignette: > - %\VignetteIndexEntry{radiobuttons_dsfr} - %\VignetteEngine{knitr::rmarkdown} - %\VignetteEncoding{UTF-8} ---- - -```{r, include = FALSE} -knitr::opts_chunk$set( - collapse = TRUE, - comment = "#>" -) -``` - -```{r setup} -library(shinygouv) -``` - - - -Le développement du composant shiny `radioButton_dsfr` nécessite quelques étapes supplémentaires. -En effet, le code html de ce type de composant se structure en plusieurs htmlTemplates. - -``` -
-
- - Légende pour l’ensemble de champs - -
-
- - -
-
- - -
-
- - -
-
-
-
-``` - -Il est donc nécessaire de scinder les htmlTemplates dans différents fichiers .html. -Suivre les 2 premières étape de la procédure décrite dans `dev/documentation/comment-faire-un-composant-shiny.Rmd` uniquement pour la partie `
`. - -Quelques précisions: -- Pour utiliser le fonctionnement classique du radioButtons {shiny}: - - l'argument `value` a été rajouté - - la classe `shiny-options-group` a été rajouté (ce qui permettra d'implémenter/utiliser une fonction `updateRadioButtons_dsfr()`) - - reprendre la div `label` du radioButtons de shiny ainsi que ses attributs. - - -# radioButtons_unique_dsfr_template - -Avant l'utilisation de `htmlTemplate()`, notre fonction nécessite de considérer les différents cas de figure pour certains paramètres. -Par exemple, l'utilisation ou non d'un vecteur nommé doit modifier la personnalisation du template `.html` (si le vecteur n'est pas nommé alors le `nom_choix` doit être égal au `value_choix`). - - - -```{r eval = FALSE} -radioButtons_unique_dsfr_template <- function(inputId, choix, nom_choix, name, inline = FALSE - ){ - - if(isTRUE(inline)){ - class_inline <- "-inline" - } else { - class_inline <- NULL} - - htmltools::htmlTemplate( - filename = system.file( - "v1.7.2", - "composant", - "radiobouton.html", - package = "shinygouv" - ), - inputId = inputId, - name = name, - nom_choix = nom_choix, - value_choix = choix, - class_inline = class_inline - ) -} -``` - - - - -Le travail précedemment réalisé, peut maintenant être répeté au niveau de la `
`: - -- 2 première étape de la procédure `dev/documentation/comment-faire-un-composant-shiny.Rmd`. - - -# radioButtons_dsfr_template - -De la même manière que pour la fonction précédente, il est nécessaire d'adapter la personnalisation en fonction des paramètres passés en arguments. -Cette fonction repose sur `radioButtons_unique_dsfr_template()` qui devra être répeter autant de fois qu'il y a de choix (utilisation de `purrr::map(...)`) - - -```{r eval = FALSE} -radioButtons_dsfr_template <- function(inputId, label, choix, inline = FALSE, class = NULL - ){ - inline <- FALSE #TODO - if (isTRUE(inline)){ - class_inline <- "fr-fieldset--inline" - class <- "shiny-input-container-inline" - } else { - class_inline = NULL - } - - if (is.null(names(choix))) { - nom_choix <- choix - } else { - nom_choix <- names(choix) - } - - - x <- 0 - htmltools::htmlTemplate( - filename = system.file( - "v1.7.2", - "composant", - "radiobouton_group.html", - package = "shinygouv" - ), - inputId = inputId, - label = label, - choix = purrr::map2(.x = choix, - .y = nom_choix - ~ { - x <<- x+1 - radioButtons_unique_dsfr_template( - inputId = paste0(inputId,"-", x), - name = inputId, - choix = .x, - nom_choix = nom_choix, - inline = inline - ) - }) %>% - htmltools::tagList(), - inline = class_inline, - class = class - ) -} -``` - - - - -L'implementation de la fonction `radioButtons_dsfr()` reste quant à elle similaire à la suite de la procédure. - - -# radioButtons_dsfr - -```{r examples-radioButtons_dsfr} -radioButtons_dsfr( - inputId = "test", label = "Test", choices = c("A","B"), class = NULL -) - -# radioButtons_dsfr( -# inputId = "test", -# label = "Test", -# choices = c("Choix A" = "A","Choix B" = "B"), -# class = NULL -# ) -``` - -# updateRadioButtons_dsfr - - - - - -```{r example-updateRadioButtons_dsfr} -## Only run examples in interactive R sessions -if (interactive()) { -ui <- fluidPage_dsfr( - radioButtons_dsfr(inputId = "inRadioButtons", - label = "Input radio buttons", - choices = c("Item A","Item B", "Item C")), - actionButton_dsfr("go","Change") -) - -server <- function(input, output, session) { - - observeEvent(input$go,{ - updateRadioButtons_dsfr( - session = session, - inputId = "inRadioButtons", - label = "Un nouveau label", - choices = c("A" = "a") - ) - }) - - observeEvent(input$inRadioButtons,{ - message(input$inRadioButtons) - }) -} - -shinyApp(ui, server) -} - -``` - - - - - - - - - - diff --git a/dev/flat_comment-faire-un-composant-shiny.Rmd b/dev/flat_comment-faire-un-composant-shiny.Rmd deleted file mode 100644 index 95c26de2..00000000 --- a/dev/flat_comment-faire-un-composant-shiny.Rmd +++ /dev/null @@ -1,123 +0,0 @@ ---- -title: "flat_comment-faire-un-composant-shiny.Rmd empty" -output: html_document -editor_options: - chunk_output_type: console ---- - - -Si vous êtes sur le développement d'un nouveau composant, il faut s'assurer de la version du dsfr utilisé actuellement : - -```{r} -desc::desc_get("VersionDsfr") -``` - -Vous devriez trouver un dossier dans "inst/" avec le bon numéro de version. Si ce n'est pas le cas, suivre la vignette `montee-en-version-du-dsfr-trouver-fichiers-css-et-js`. - -Si vous êtes sur une montée de version, les dossiers devraient déjà être prêts. - -## Développement d'un composant avec interaction shiny - -Pour expliquer le workflow de ce package, nous allons détailler comment développer le futur `actionButton()`. - -_Ici nous prenons l'exemple d'un composant développé pour la version 1.7.2 du dsfr._ - -#### 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` - -``` - -``` - -#### 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 - -Après retravail sur le composant `actionButton()`, voici son template html: - -``` - -``` - -##### Exemple avec le `actionButton()` - -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: -```{r, eval = FALSE} -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 : -``` - find(scope: HTMLElement): JQuery { - return $(scope).find(".action-button"); - } -``` - -#### Troisième étape - -- Créer la fonction qui permettra d'utiliser ce nouveau bouton. - - Copier coller le flat se trouvant dans `dev/documentation/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()` - - -Voir exemple `dev/flat_composants/flat_actionButton.Rmd` - -**/!\\ Attention: ** -Ayez une attention particulière pour les tests unitaires qui sont la garantie du bon fonctionnement du package. - - -#### Quatrième étape - -Lorsque l'implementation de votre nouveau composant dsfr est terminée: -- remplir la table de correspondance disponible dans `inst/v1.7.2/table_correspondance_shiny_dsfr.csv` (en adaptant sur la version en cours d'implementation) - -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()`) - -```{r development-inflate, eval=FALSE} -# Run but keep eval=FALSE to avoid infinite loop -# Execute in the console directly -# Inflate, but put vignette in "dev/documentation" -spec_infalte <- function(){ - nom <- "Comment faire un composant shiny" - fusen::inflate( - flat_file = "dev/flat_comment-faire-un-composant-shiny.Rmd", - vignette_name = nom, - check = FALSE) - - nom_c <- gsub(x = tolower(nom), "\\s", "-") - nom_file <- paste0(nom_c, ".Rmd") - - file.copy( - file.path("vignettes", nom_file), - file.path("dev","documentation", nom_file), - overwrite = TRUE - ) - - unlink(file.path("vignettes", nom_file)) -} -spec_infalte() - -``` - diff --git a/dev/flat_compare_dsfr_shiny.Rmd b/dev/flat_compare_dsfr_shiny.Rmd deleted file mode 100644 index e863da27..00000000 --- a/dev/flat_compare_dsfr_shiny.Rmd +++ /dev/null @@ -1,301 +0,0 @@ ---- -title: "Recommandation pour l'implementation de DSFR" -output: html_document -editor_options: - chunk_output_type: console ---- - -```{r development, include=FALSE} -library(testthat) -``` - -```{r development-1} -# Load already included functions -pkgload::load_all(export_all = FALSE) -``` - -### 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}. -Il permet notamment de mettre en évidence la direction technique à employer selon deux méthodes envisagées pour utiliser DSFR dans une application {shiny}. - -```{r, echo=FALSE} -DT::datatable(readxl::read_excel( - system.file( - "comparaison", - "shinygouv.xlsx", - package = "shinygouv" - ) -), -options = list("dom" = "tp") -) -``` - - -# Récapitulatif - -### Option A {shiny} + {bslib} : - -Utiliser les fonctionalités de {bslib} pour utiliser le framework DSFR. - - -Avantages : - -- Simple d'utilisation, une fonction ou deux pour appliquer le bon thème bootstrap qui reprend les règles CSS de DSFR - -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 :)). -- 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. - -### Option B {shiny} et replace_me :) : - -On utilise seulement le package {shiny} avec des scripts au démarrage pour remplacer les classes bootstrap par les classes de DSFR. Voici une app qui le fait - -Exemple pour le actionButton: - -```{r, eval=FALSE} -library(shiny) -addResourcePath("fonts", system.file("dsfr-v1.6.0/dist/fonts", package = "shinygouv")) - - -ui <- fluidPage( - includeCSS(system.file("dsfr-v1.6.0/dist/dsfr.min.css", package = "shinygouv")), - h2("Exemple avec un bouton"), - br(), - actionButton("test", "test"), - textOutput("texte") -) - -remplace_bttn <- function(ui){ - res<-rapply( - ui, - function(attribut){ - gsub( - x=attribut, - pattern="btn btn-default", - replacement="fr-btn") - }, - how="replace", - classes = "character" - ) -} - -server <- function(input, output, session) { - output$texte <- renderText({ - input$test - }) -} - -shinyApp(remplace_bttn(ui), server) -``` - -```{r, echo=FALSE} -knitr::include_graphics(system.file("comparaison", "option_b_btn.png", package = "shinygouv")) -``` - - -Avantages: - -- Facile à mettre en oeuvre pour les utilisateurs. -- Ne change pas les fonctions {shiny} à utiliser. -- Applicable sur une application déjà existante. - - -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. -- 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. - - -### Option C `From scratch` - -Coder l'équivalent de la partie 'UI' {shiny} (ou quasiment) avec le framework DSFR. -La partie 'server' reposera toujours sur la partie {shiny}. -Un exemple : et aussi - - -Exemple de code pour actionButton : - -```{r, eval=FALSE} -library(shiny) - -addResourcePath("fonts", system.file("dsfr-v1.6.0/dist/fonts", package = "shinygouv")) - -actionButton_dsfr <- function(inputId, label){ - tags$button(id = inputId, - class="fr-btn", - value = 0, - label - ) -} - -ui <- fluidPage( - tags$head( - includeCSS(system.file("dsfr-v1.6.0/dist/dsfr.min.css", package = "shinygouv")), - tags$script( - "$(document).on('click', '.fr-btn', function(evt) { - var el = evt.target; - while (el.nodeName != 'BUTTON'){ - el = el.parentNode; - } - el = $(el); - el.val( parseInt(el.val()) + 1) - el.trigger('updated'); -}); - var buttons = new Shiny.InputBinding(); - -$.extend(buttons, { - find: function(scope) { - - return $(scope).find('.fr-btn') - }, - getValue: function(el) { - console.log($(el)) - return parseInt($(el).val()) - }, - setValue: function(el, value) { - // JS code to set value - }, - receiveMessage: function(el, data) { - // this.setValue(el, data); - }, - subscribe: function(el, callback) { - $(el).on('updated.buttons', function(e) { - callback(); - }); - - }, - unsubscribe: function(el) { - $(el).off('.buttons'); - } -}); -Shiny.inputBindings.register(buttons);" - )), - actionButton_dsfr("test", "test"), - -) - -server <- function(input, output, session) { - observeEvent(input$test,{ - message(input$test) - }) -} - -shinyApp(ui, server) -``` - -Ceci sera transformé en fonction et documenter dans un package - -Avantages : - -- Permet de reprendre exactement la totalité des composants de DSFR -- Ne dépend plus de bootstrap et {shiny} (mais n'est pas incompatible) -- Permet de maintenir seulement les changements liés à DSFR -- C'est la façon la plus propre et la solution la plus pérenne dans le temps pour les utilisateurs - -Inconvénients: - -- Nécéssite 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}. - -### Option D `from scratch mais pas vraiement` - -On pourrait recoder les inputs en conservant les classes CSS qui permettent l'activation du backend JS (comme pour shinyWidgets). - -Exemple pour le actionButton de {shinyWidgets} - -Ou pour notre actionButon : - -Le fait de lui donner la classe action-button lui permet d'être reconnu par le JS de {shiny} et donc d'avoir une interaction. De même, le fait de lui donner la classe fr-btn en plus, lui permet d'être reconnu par le CSS du DSFR. - -```{r, eval=FALSE} -library(shiny) - -addResourcePath("fonts", system.file("dsfr-v1.6.0/dist/fonts", package = "shinygouv")) - -actionButton_dsfr <- function(inputId, label){ - tags$button(id = inputId, - class="fr-btn action-button", - value = 0, - label - ) -} - -ui <- fluidPage( - - includeCSS(system.file("dsfr-v1.6.0/dist/dsfr.min.css", package = "shinygouv")), - actionButton_dsfr("test", "test") -) - -server <- function(input, output, session) { - observeEvent(input$test,{ - message(input$test) - }) - -} - -shinyApp(ui, server) - -``` - - -Avantages : - -- Permet de reprendre le JS de {shiny} pour les composants compatibles DSFR (exemple actionButton) - -> 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. -- 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 -- 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...). - -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}. - -## Les inputs recensés dans les apps "ssm-écologie" par option - -```{r, echo=FALSE} -DT::datatable(readxl::read_excel( - system.file( - "comparaison", - "list_input_par_option.xlsx", - package = "shinygouv" - ) -), -options = list("dom" = "tp") -) -``` - -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). - - -## Notre recommandation - -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}. - -```{r development-inflate, eval=FALSE} -# Run but keep eval=FALSE to avoid infinite loop -# Execute in the console directly -fusen::inflate(flat_file = "dev/flat_compare_dsfr_shiny.Rmd", vignette_name = "Recommandation pour l'implementation de DSFR") -``` - diff --git a/dev/flat_composants/flat_actionButton.Rmd b/dev/flat_composants/flat_actionButton.Rmd index 9891e647..5b06b150 100644 --- a/dev/flat_composants/flat_actionButton.Rmd +++ b/dev/flat_composants/flat_actionButton.Rmd @@ -27,9 +27,9 @@ pkgload::load_all(export_all = TRUE) #' @importFrom htmltools htmlTemplate #' @return html actionButton_dsfr_template <- function( - inputId, - label, - class + inputId, + label, + class ) { htmltools::htmlTemplate( filename = system.file( @@ -144,9 +144,9 @@ test_that("actionButton_dsfr_template works", { #' #' @examples actionButton_dsfr <- function( - inputId, - label, - class = NULL + inputId, + label, + class = NULL ) { actionButton_dsfr_template( inputId, @@ -240,7 +240,7 @@ test_that("actionButton_dsfr works", { # Execute in the console directly fusen::inflate( flat_file = "dev/flat_composants/flat_actionButton.Rmd", - vignette_name = "actionButton_dsfr", + vignette_name = NA, check = FALSE ) ``` diff --git a/dev/flat_composants/flat_fluidpage.Rmd b/dev/flat_composants/flat_fluidpage.Rmd index f4d575ba..9992f36b 100644 --- a/dev/flat_composants/flat_fluidpage.Rmd +++ b/dev/flat_composants/flat_fluidpage.Rmd @@ -681,7 +681,7 @@ spec_inflate <- function() { nom <- "fluidPage_dsfr" fusen::inflate( flat_file = "dev/flat_composants/flat_fluidpage.Rmd", - vignette_name = nom) + vignette_name = NA) nom_c <- gsub(x = tolower(nom), "\\s", "-") nom_file <- paste0(nom_c, ".Rmd") diff --git a/dev/flat_composants/flat_header.Rmd b/dev/flat_composants/flat_header.Rmd index 7bfce725..01943dce 100644 --- a/dev/flat_composants/flat_header.Rmd +++ b/dev/flat_composants/flat_header.Rmd @@ -46,8 +46,8 @@ fluidPage_dsfr( #' @importFrom htmltools htmlTemplate #' @return html header_dsfr_template <- function( - intitule, officiel, url, titre, nom_site_service, baseline, class - ){ + intitule, officiel, url, titre, nom_site_service, baseline, class + ) { htmltools::htmlTemplate( filename = system.file( @@ -63,9 +63,8 @@ header_dsfr_template <- function( titre = titre, nom_site_service = nom_site_service, baseline = baseline - ) + ) } - ``` @@ -158,14 +157,14 @@ test_that("header_dsfr_template works", { #' #' @examples header_dsfr <- function( - intitule, - officiel, - url = "/", - titre = NULL, - nom_site_service = NULL, - baseline = NULL, - class = "fr-container" -) { + intitule, + officiel, + url = "/", + titre = NULL, + nom_site_service = NULL, + baseline = NULL, + class = "fr-container" + ) { # check les params assertthat::assert_that(is.character(intitule)) assertthat::assert_that(is.character(officiel)) @@ -187,17 +186,17 @@ header_dsfr <- function( ``` ```{r examples-header_dsfr} - header_dsfr( - intitule = "Prefet de", - officiel = "Bretagne", - ) +header_dsfr( + intitule = "Prefet de", + officiel = "Bretagne", +) ``` ```{r tests-header_dsfr} test_that("header_dsfr works", { test_html <- header_dsfr( - intitule = "Prefet de", - officiel = "Bretagne", + intitule = "Prefet de", + officiel = "Bretagne", ) #' @description tester si shiny.tag expect_s3_class(test_html, "shiny.tag") @@ -214,7 +213,7 @@ test_that("header_dsfr works", { # Retire tous les espaces et saut de ligne pour la comparaison # Pour eviter les problèmes inter-OS expect_equal(gsub("\\s|\\n", "", test_html), - gsub("\\s|\\n", "", snapshot_html)) + gsub("\\s|\\n", "", snapshot_html)) # Si erreur au précedent test deux cas possible : # @@ -238,22 +237,6 @@ test_that("header_dsfr works", { # Run but keep eval=FALSE to avoid infinite loop # Execute in the console directly -spec_inflate <- function(){ - nom <- "header_dsfr" - fusen::inflate( - flat_file = "dev/flat_composants/flat_header.Rmd", - vignette_name = nom, open_vignette = FALSE) - - nom_c <- gsub(x = tolower(nom), "\\s", "-") - nom_file <- paste0(nom_c, ".Rmd") - file.copy( - file.path("vignettes", nom_file), - file.path("dev","documentation", nom_file) - ) - - unlink(file.path("vignettes", nom_file)) -} -spec_inflate() fusen::inflate( flat_file = "dev/flat_composants/flat_header.Rmd", vignette_name = NA, diff --git a/dev/flat_composants/flat_navbarPage.Rmd b/dev/flat_composants/flat_navbarPage.Rmd index 8547c570..5212641b 100644 --- a/dev/flat_composants/flat_navbarPage.Rmd +++ b/dev/flat_composants/flat_navbarPage.Rmd @@ -36,10 +36,10 @@ La `navbarPage_dsfr()` se compose de : #' #' @examples navbarPage_dsfr <- function( - title, - ..., - header = NULL, - id = NULL + title, + ..., + header = NULL, + id = NULL ) { all_navs <- list(...) # Making the first tab the current one @@ -120,9 +120,9 @@ navbarPage_dsfr <- function( #' #' @export navbarPanel_dsfr <- function( - title, - ... -){ + title, + ... + ) { list( title = title, @@ -152,11 +152,11 @@ ui <- navbarPage_dsfr( title = "actionButton_dsfr()", fluidRow_dsfr( column_dsfr( - 12, - h3('Demo actionButton_dsfr()'), - # Adding space to the column - # https://www.systeme-de-design.gouv.fr/elements-d-interface/fondamentaux-techniques/espacement - extra_class = "fr-my-6w" + 12, + h3('Demo actionButton_dsfr()'), + # Adding space to the column + # https://www.systeme-de-design.gouv.fr/elements-d-interface/fondamentaux-techniques/espacement + extra_class = "fr-my-6w" ), column_dsfr( 4, @@ -222,8 +222,6 @@ if (interactive()) { # Run the application shinyApp(ui = ui, server = server) } - - ``` ```{r tests-navbarPage_dsfr} @@ -283,7 +281,7 @@ test_that("navbarPage_dsfr works", { # Execute in the console directly fusen::inflate( flat_file = "dev/flat_composants/flat_navbarPage.Rmd", - vignette_name = "navbarPage_dsfr", + vignette_name = NA, check = FALSE ) ``` diff --git a/dev/documentation/flat_new_one.Rmd b/dev/flat_composants/flat_new_one.Rmd similarity index 69% rename from dev/documentation/flat_new_one.Rmd rename to dev/flat_composants/flat_new_one.Rmd index 26555808..de710e6d 100644 --- a/dev/documentation/flat_new_one.Rmd +++ b/dev/flat_composants/flat_new_one.Rmd @@ -19,14 +19,14 @@ pkgload::load_all(export_all = TRUE) ```{r function-nom_composant_shiny_dsfr_template} #' nom_composant_shiny_dsfr_template -#' +#' #' @importFrom htmltools htmlTemplate #' @return html #' @noRd nom_composant_shiny_dsfr_template <- function( - # ajouter vos params - ){ - + # ajouter vos params +) { + htmltools::htmlTemplate( filename = system.file( get_dsfr_version(with_v = TRUE), @@ -35,84 +35,83 @@ nom_composant_shiny_dsfr_template <- function( package = "shinygouv" ) # ajouter vos params - ) + ) } - ``` ```{r tests-nom_composant_shiny_dsfr_template} test_that("nom_composant_shiny_dsfr_template works", { - expect_true(inherits(nom_composant_shiny_dsfr_template, "function")) - - htmlfile <- readLines( + expect_true(inherits(nom_composant_shiny_dsfr_template, "function")) + + htmlfile <- readLines( system.file( "chemin vers le fichier", package = "shinygouv" ) ) - + #' @description Comparer les parametres par rapport a ceux de la version precedente - + purrr::walk( c( # ajouter vos params - ), - function(param){ - with_moustache <- paste0("\\{\\{",param,"\\}\\}") + ), + function(param) { + with_moustache <- paste0("\\{\\{", param, "\\}\\}") expect_true(any(grepl(pattern = with_moustache, htmlfile)), - label = paste0("sans moustache '", param, "'")) + label = paste0("sans moustache '", param, "'")) }) - - - test_html <- nom_composant_shiny_dsfr_template( - # ajouter vos params - ) - + + + test_html <- nom_composant_shiny_dsfr_template( + # ajouter vos params + ) + #' @description tester si tous les params sont remplaces expect_false(grepl(pattern = "\\{\\{", test_html)) - - + + #' @description Verifie que les parametres ont bien ete remplace par leurs valeurs purrr::walk( c( - # ajouter les valeurs de vos params passes à test - ), - function(param){ - expect_true(any(grepl(pattern = param, test_html)), - label = paste0("remplacement de '", param, "'")) + # ajouter les valeurs de vos params passes à test + ), + function(param) { + expect_true(any(grepl(pattern = param, test_html)), + label = paste0("remplacement de '", param, "'")) }) - - ## lecture snapshot + + ## lecture snapshot snapshot_html <- readRDS( file = file.path( - "snapshot", # pour passer les tests en production (apres le inflate), - #"tests/testthat/snapshot", # pour passer les tests en developpement (avant le inflate), + "snapshot", # pour passer les tests en production (apres le inflate), + # "tests/testthat/snapshot", # pour passer les tests en developpement (avant le inflate), "nom_composant_shiny_dsfr_template.Rda") ) - + #' @description Verifie le HTML créé - # Retire tous les espaces et saut de ligne pour la comparaison + # Retire tous les espaces et saut de ligne pour la comparaison # Pour eviter les problèmes inter-OS expect_equal(gsub("\\s|\\n", "", test_html), - gsub("\\s|\\n", "", snapshot_html)) - - # Si erreur au précedent test deux cas possible : - # - # - nouveau composant: Lancer le saveRDS, relancer le test et recommenter le saveRDS - # - # - composant a mettre a jour: si le test ne passe plus avant de changer le snapshot, - # assurez vous d'avoir bien pris en compte la nouvelle personnalisation - # dans la fonction nom_composant_shiny_dsfr_template puis lancer le saveRDS, relancer le test et recommenter le saveRDS - - # saveRDS(test_html, - # file = file.path("tests/testthat/snapshot", - # "nom_composant_shiny_dsfr_template.Rda" - # ) - # ) + gsub("\\s|\\n", "", snapshot_html)) + + # Si erreur au précedent test deux cas possible : + # + # - nouveau composant: Lancer le saveRDS, relancer le test et recommenter le saveRDS + # + # - composant a mettre a jour: si le test ne passe plus avant de changer le snapshot, + # assurez vous d'avoir bien pris en compte la nouvelle personnalisation + # dans la fonction nom_composant_shiny_dsfr_template puis lancer le saveRDS, relancer le test et recommenter le saveRDS + + # saveRDS(test_html, + # file = file.path("tests/testthat/snapshot", + # "nom_composant_shiny_dsfr_template.Rda" + # ) + # ) + - }) ``` @@ -121,24 +120,24 @@ test_that("nom_composant_shiny_dsfr_template works", { ```{r function-nom_composant_shiny_dsfr} #' nom_composant_shiny_dsfr -#' -#' +#' +#' #' @return html -#' +#' #' @export #' #' @examples nom_composant_shiny_dsfr <- function( - # ajouter vos paramètres - ) { - + # ajouter vos paramètres +) { + # check les params # assertthat::assert_that(is.character(params)) - - nom_composant_shiny_dsfr_template( - # ajouter vos params - ) %>% - parse_html() + + nom_composant_shiny_dsfr_template( + # ajouter vos params + ) %>% + parse_html() } ``` @@ -156,7 +155,7 @@ test_that("nom_composant_shiny_dsfr works", { ) #' @description tester si shiny.tag expect_s3_class(test_html, "shiny.tag") - + ## lecture snapshot snapshot_html <- readRDS( file = file.path( @@ -164,13 +163,13 @@ test_that("nom_composant_shiny_dsfr works", { # "tests/testthat/snapshot", # pour passer les tests en developpement (avant le inflate), "nom_composant_shiny_dsfr.Rda") ) - + #' @description Verifer que le HTML est correct en sortie - # Retire tous les espaces et saut de ligne pour la comparaison + # Retire tous les espaces et saut de ligne pour la comparaison # Pour eviter les problèmes inter-OS expect_equal(gsub("\\s|\\n", "", test_html), - gsub("\\s|\\n", "", snapshot_html)) - + gsub("\\s|\\n", "", snapshot_html)) + # Si erreur au précedent test deux cas possible : # # - nouveau composant: Lancer le saveRDS, relancer le test et recommenter le saveRDS @@ -178,21 +177,21 @@ test_that("nom_composant_shiny_dsfr works", { # - composant a mettre a jour: si le test ne passe plus avant de changer le snapshot, # assurez vous d'avoir bien pris en compte la nouvelle personnalisation # dans la fonction nom_composant_shiny_dsfr puis lancer le saveRDS, relancer le test et recommenter le saveRDS - + # saveRDS(test_html, # file = file.path("tests/testthat/snapshot", # "nom_composant_shiny_dsfr.Rda" # ) # ) - - + + # Ajouter des tests pour controler le type des parametres d'entree # Cela verifie que les 'assertthat' fonctionnent correctement - + #' @description tester le type du param `monparam` - expect_error( nom_composant_shiny_dsfr( - # ajouter vos params - # changer le type de `monparam` + expect_error(nom_composant_shiny_dsfr( + # ajouter vos params + # changer le type de `monparam` )) }) ``` @@ -206,7 +205,7 @@ Pour les fonctions de type `update_*`, voir l'exemple de "flat_radioButtons.Rmd" # Run but keep eval=FALSE to avoid infinite loop # Execute in the console directly -fusen::inflate(flat_file = "dev/flat_composants/chemin à modifier", - vignette_name = "nom_composant_shiny_dsfr") +fusen::inflate(flat_file = "dev/flat_composants/chemin à modifier", + vignette_name = NA) ``` diff --git a/dev/flat_composants/flat_numericInput.Rmd b/dev/flat_composants/flat_numericInput.Rmd index 77fdf76f..da225aca 100644 --- a/dev/flat_composants/flat_numericInput.Rmd +++ b/dev/flat_composants/flat_numericInput.Rmd @@ -24,12 +24,12 @@ pkgload::load_all(export_all = TRUE) #' @return html #' @noRd numericInput_dsfr_template <- function( - inputId, - label, - value, - min = NA, - max = NA, - step = NA + inputId, + label, + value, + min = NA, + max = NA, + step = NA ) { htmltools::htmlTemplate( filename = system.file( @@ -165,12 +165,12 @@ test_that("numericInput_dsfr_template works", { #' #' @examples numericInput_dsfr <- function( - inputId = inputId, - label = label, - value = value, - min = NA, - max = NA, - step = NA + inputId = inputId, + label = label, + value = value, + min = NA, + max = NA, + step = NA ) { # check les params assertthat::assert_that(is.character(inputId)) @@ -355,13 +355,13 @@ test_that("numericInput_dsfr works", { #' #' @export updateNumericInput_dsfr <- function( - inputId, - label = NULL, - value = NULL, - min = NULL, - max = NULL, - step = NULL, - session = shiny::getDefaultReactiveDomain() + inputId, + label = NULL, + value = NULL, + min = NULL, + max = NULL, + step = NULL, + session = shiny::getDefaultReactiveDomain() ) { ns <- session$ns @@ -449,7 +449,7 @@ if (interactive()) { session = session, inputId = "mynumericinput", value = sample(1:1000, size = 1) - ) + ) }) observeEvent(input$updateMin, { @@ -520,7 +520,7 @@ test_that("updateNumericInput_dsfr works", { # Execute in the console directly fusen::inflate( flat_file = "dev/flat_composants/flat_numericInput.Rmd", - vignette_name = "numericInput_dsfr", + vignette_name = NA, check = FALSE ) ``` diff --git a/dev/flat_composants/flat_radioButtons.Rmd b/dev/flat_composants/flat_radioButtons.Rmd index 5fb2b687..b98e9195 100644 --- a/dev/flat_composants/flat_radioButtons.Rmd +++ b/dev/flat_composants/flat_radioButtons.Rmd @@ -763,7 +763,7 @@ spec_inflate <- function() { nom <- "radioButtons_dsfr" fusen::inflate( flat_file = "dev/flat_composants/flat_radioButtons.Rmd", - vignette_name = nom, open_vignette = FALSE) + vignette_name = NA, open_vignette = FALSE) nom_c <- gsub(x = tolower(nom), "\\s", "-") nom_file <- paste0(nom_c, ".Rmd") diff --git a/dev/flat_composants/flat_selectInput.Rmd b/dev/flat_composants/flat_selectInput.Rmd index cf76e280..22bd98ed 100644 --- a/dev/flat_composants/flat_selectInput.Rmd +++ b/dev/flat_composants/flat_selectInput.Rmd @@ -622,7 +622,7 @@ test_that("updateSelectInput_dsfr works", { # Execute in the console directly fusen::inflate( flat_file = "dev/flat_composants/flat_selectInput.Rmd", - vignette_name = "selectInput_dsfr", + vignette_name = NA, check = FALSE ) ``` diff --git a/dev/flat_composants/flat_withSpinner.Rmd b/dev/flat_composants/flat_withSpinner.Rmd index 98f0716a..59ce8d4e 100644 --- a/dev/flat_composants/flat_withSpinner.Rmd +++ b/dev/flat_composants/flat_withSpinner.Rmd @@ -49,8 +49,8 @@ test_that("addWithSpinner works", { #' @filename withSpinner_dsfr #' @noRd showSpinner_dsfr <- function( - inputId, - session = shiny::getDefaultReactiveDomain() + inputId, + session = shiny::getDefaultReactiveDomain() ) { session$sendCustomMessage("show_spinner", inputId) } @@ -76,8 +76,8 @@ test_that("showSpinner_dsfr works", { #' @filename withSpinner_dsfr #' @noRd hideSpinner_dsfr <- function( - inputId, - session = shiny::getDefaultReactiveDomain() + inputId, + session = shiny::getDefaultReactiveDomain() ) { session$sendCustomMessage("hide_spinner", inputId) } @@ -103,8 +103,8 @@ test_that("hideSpinner_dsfr works", { #' @return html #' @export withSpinner_dsfr <- function( - expr, - session = shiny::getDefaultReactiveDomain() + expr, + session = shiny::getDefaultReactiveDomain() ) { showSpinner_dsfr(inputId = "lds-ring", session = session) force(expr) @@ -113,60 +113,60 @@ withSpinner_dsfr <- function( ``` ```{r examples-withSpinner_dsfr} -if(interactive()) { -library(shiny) -library(shinygouv) - -ui <- fluidPage_dsfr( - header = header_dsfr( - intitule = "Intitule", - officiel = "Officiel", - nom_site_service = "Nom du site / service", - baseline = "baseline - precisions sur l organisation", - class = "fr-m-1w" - ), - title = "Exemple", - fluidRow_dsfr( - column_dsfr( - 0, - shiny::p("Exemple colonne") +if (interactive()) { + library(shiny) + library(shinygouv) + + ui <- fluidPage_dsfr( + header = header_dsfr( + intitule = "Intitule", + officiel = "Officiel", + nom_site_service = "Nom du site / service", + baseline = "baseline - precisions sur l organisation", + class = "fr-m-1w" ), - actionButton_dsfr( - inputId = "showspinner", - label = "Afficher le spinner pendant 5 secondes" + title = "Exemple", + fluidRow_dsfr( + column_dsfr( + 0, + shiny::p("Exemple colonne") + ), + actionButton_dsfr( + inputId = "showspinner", + label = "Afficher le spinner pendant 5 secondes" + ) ) ) -) -server <- function(input, output, session) { - observeEvent( - input$showspinner, - { - withSpinner_dsfr( - expr = { - message("Je vais m'afficher pendant 5 secondes") - Sys.sleep(5) - } - ) - } - ) -} + server <- function(input, output, session) { + observeEvent( + input$showspinner, + { + withSpinner_dsfr( + expr = { + message("Je vais m'afficher pendant 5 secondes") + Sys.sleep(5) + } + ) + } + ) + } -shinyApp(ui, server) + shinyApp(ui, server) } ``` ```{r tests-withSpinner_dsfr} test_that("withSpinner_dsfr works", { expect_true(inherits(withSpinner_dsfr, "function")) -# TODO + # TODO }) ``` ```{r development-inflate, eval=FALSE} fusen::inflate( flat_file = "dev/flat_composants/flat_withSpinner.Rmd", - vignette_name = "withSpinner_dsfr", + vignette_name = NA, check = FALSE, overwrite = TRUE, open_vignette = FALSE diff --git a/dev/flat_doc_inventaire.Rmd b/dev/flat_doc_inventaire.Rmd deleted file mode 100644 index 51828fda..00000000 --- a/dev/flat_doc_inventaire.Rmd +++ /dev/null @@ -1,98 +0,0 @@ ---- -title: "flat_doc_inventaire.Rmd empty" -output: html_document -editor_options: - chunk_output_type: console ---- - -```{r development, include=FALSE} -library(testthat) -library(tibble) -``` - -```{r development-load} -# Load already included functions if relevant -pkgload::load_all(export_all = FALSE) -``` - -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 - -## La mise en page - -Plus de la moitié des applications shiny actuellement déployées sont des `shinydashboard`. - -Quelques exemples: - -- https://ssm-ecologie.shinyapps.io/datapas4/ -- https://ssm-ecologie.shinyapps.io/siclop/ -- https://ssm-ecologie.shinyapps.io/CoQua/ - -Pour le reste des applications, la mise en page `navbarPage` est essentiellement utilisées. - -Quelques exemples: - -- https://ssm-ecologie.shinyapps.io/maille_habitat/ -- https://ssm-ecologie.shinyapps.io/app_transports/ -- https://ssm-ecologie.shinyapps.io/Carte_Interactive_Loyers/ - -L'observatoire des territoires utilisent, quant à lui, pour la plus part de ses applications, des `navlistPanel` comme par exemple: - -- https://ssm-ecologie.shinyapps.io/SOFIE/ - -Dans l'ensemble, les applications actuellement déployées utilisent les `tabPanel`, que ce soit dans un `shinydashboard` ou un `navbarPage`. - -A noter, que durant cet inventaire, il n'a été observé qu'une utilisation de `bslib`: - -- https://ssm-ecologie.shinyapps.io/observatoire-odd - -## Les composantes - -### Shiny - -Voici les composantes `shiny` les plus utilisées dans les applications déployées sous https://ssm-ecologie.shinyapps.io : - -```{r, echo = FALSE} - -compo_shiny <- c("actionButton", "selectInput", "sliderInput", - "radioButtons", "numericInput", "checkboxInput") -compo_shiny - -``` - -De plus, seulement quelques applications utilisent les composantes suivantes: - -```{r, echo = FALSE} - -compo_shiny_bonus <- c("fileInput", "dateRangeInput", "showModal") -compo_shiny_bonus - -``` -### Hors Shiny - -Les applications utilisent quelques composantes issues d'autres packages que {shiny}, telles que: - -```{r, echo = FALSE} -leaflet <- tibble::tibble("package" = "leaflet", - "composantes" = c("leaflet"), - "utilisation" = "forte") - -shinywidgets <- tibble::tibble("package" = "shinyWidgets", - "composantes" = c("pickerInput", - "radioGroupButtons", - "materialSwitch"), - "utilisation" = "modérée") - -shinycssloaders <- tibble::tibble("package" = "shinycssloaders", - "composantes" = c("withSpinner"), - "utilisation" = "faible") - -composantes_autres <- rbind(leaflet, shinywidgets, shinycssloaders) -``` - - -```{r development-inflate, eval=FALSE} -# Run but keep eval=FALSE to avoid infinite loop -# Execute in the console directly -fusen::inflate(flat_file = "dev/flat_doc_inventaire.Rmd", vignette_name = "Documentation-Inventaire") -``` - diff --git a/dev/flat_montee_version_dsfr.Rmd b/dev/flat_montee_version_dsfr.Rmd deleted file mode 100644 index 356d0075..00000000 --- a/dev/flat_montee_version_dsfr.Rmd +++ /dev/null @@ -1,145 +0,0 @@ ---- -title: "Montee en version du dsfr : trouver les fichiers CSS et JS" -output: html_document -editor_options: - chunk_output_type: console ---- - -```{r development, include=FALSE} -library(testthat) -``` - -```{r} -knitr::opts_chunk$set(eval = FALSE) -``` - -Dans le dossier "inst/" du package, nous allons créer deux dossiers: - -- un pour récolter les css et js du dsfr, -- et un pour stocker les templates HTML que vous aurez converti - -_Ci-dessous, nous prenons l'exemple de la montée de version de 1.6.0 vers 1.7.2_ - -Indiquez ici le numéro de la nouvelle version à implémenter que vous pourrez trouver sur [la page du dsfr](https://gouvfr.atlassian.net/wiki/spaces/DB/pages/223019574/D+veloppeurs) - -```{r} -nouvelle_version <- "2.0.0" -``` - -# 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 -- Déplacer le dossier "dsfr-v1.7.2/dist" dans le dossier "inst/" du package 'shinygouv'. - -Pour une version minimale, les seuls fichiers à garder sont : - -``` -/ Racine du projet -└── index.html -└── dsfr.min.css -└── dsfr.module.min.js -└── dsfr.nomodule.min.js -└── favicon -└── font -└── icons -└── utility - └── icons -``` - -Vous pouvez lancer le contenu du script "dev/maj_version_dsfr.R" pour votre version pour réaliser ce nettoyage - -```{r} -source("dev/maj_version_dsfr.R") -maj_version_dsfr() -``` - - -On pourra ensuite créer une fonction qui permettera d'ajouter les dépendances dans les applications {shiny}. - -# Créer un dossier pour le code HTML des composants - -Nous recommandons de faire une copie du dossier de la version précédente - -```{r} -last_version <- max(list.files("inst", pattern = "^v\\d")) -if (last_version != paste0("v", nouvelle_version)) { - fs::dir_copy(path = file.path("inst", last_version), - new_path = paste0("inst/v", nouvelle_version)) -} -``` - -Dans le fichier "table_correspondance_shiny_dsfr.csv", mettez `non` dans la colonne `mis_a_jour` car pour le moment, vous n'avez pas récupéré le HTML de toutes les composantes de la nouvelle version - -```{r} -corresp <- read.csv2(file.path("inst", paste0("v", nouvelle_version), "table_correspondance_shiny_dsfr.csv")) -corresp[,"mis_a_jour"] <- "non" -write.csv2(corresp, file.path("inst", paste0("v", nouvelle_version), "table_correspondance_shiny_dsfr.csv")) -``` - -Vous pouvez ouvrir une issue pour lister tous les fichiers HTML de composants à vérifier avant de mettre `oui` dans la colonne `mis_a_jour` - -```{r} -corresp <- read.csv2(file.path("inst", paste0("v", nouvelle_version), "table_correspondance_shiny_dsfr.csv")) - -# A coller dans votre issue -cat( - paste("- [ ]", corresp[["fichier"]]), - sep = "\n" -) -``` - -# 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 - -```{r} -desc::desc_set("VersionDsfr" = nouvelle_version) -``` - -# 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. - -```{r} -all_versions <- list.files("inst", pattern = "^v\\d") -if (length(all_versions > 2)) { - unlink(file.path("inst", min(all_versions)), recursive = TRUE) -} -``` - -# Récupérer les codes HTML un par un - -Suivre la procédure de création de composant dans "dev/flat_comment-faire-un-composant-shiny.Rmd", même pour mettre à jour l'existant. - -```{r} -rstudioapi::navigateToFile("dev/flat_comment-faire-un-composant-shiny.Rmd") -``` - - -```{r development-inflate, eval=FALSE} -# Run but keep eval=FALSE to avoid infinite loop -# Execute in the console directly - -spec_infalte <- function(){ - nom <- "Montee en version du dsfr : trouver les fichiers CSS et JS" - fusen::inflate( - flat_file = "dev/flat_montee_version_dsfr.Rmd", - vignette_name = nom, - check = FALSE) - - nom_c <- gsub(x = tolower(nom), " : |\\s", "-") - nom_file <- paste0(nom_c, ".Rmd") - - file.copy( - file.path("vignettes", nom_file), - file.path("dev","documentation", nom_file), - overwrite = TRUE - ) - - # unlink(file.path("vignettes", nom_file)) -} -spec_infalte() -``` - diff --git a/dev/flat_new_app_dsfr.Rmd b/dev/flat_new_app_dsfr.Rmd deleted file mode 100644 index 0c96b1d2..00000000 --- a/dev/flat_new_app_dsfr.Rmd +++ /dev/null @@ -1,72 +0,0 @@ ---- -title: "flat_new_app_dsfr.Rmd empty" -output: html_document -editor_options: - chunk_output_type: console ---- - -## Les étapes pour commencer une nouvelle application shiny dsfr - -#### Créer une application golem minimale - -{golem} est un package R destiné à la création d'applications Shiny. - -```{r, eval = FALSE} -install.packages("golem") -``` - -+ New project > New directory > Package for Shiny App using {golem} - -Pour plus d'information, veuillez consulter la documentation de [golem](https://thinkr-open.github.io/golem/articles/a_start.html) - -#### Convertir cette application pour qu'elle suive le Système de Design de l'État. - -L'application minimale {golem} ne possède qu'un `fluidPage`. - -Une fonction a été développée pour convertir votre application, soit tous les scripts R du dossier `R`, en précisant la version du dsfr que vous souhaitez utiliser. -Depuis votre projet, lancer: - -```{r, eval = FALSE} -convert_to_dsfr() -``` - -Pour plus d'information, veuillez consulter la documentation de cette fonction `convert_to_dsfr()` - - -#### Le cas d'une application hors golem - -Dans le cas d'une nouvelle application créée sans le package {golem}, il sera nécessaire de préciser le dossier comprenant les scripts `.R` de l'application. -Par exemple: - -```{r, eval = FALSE} -convert_to_dsfr(path = "lechemindemonapplication") -``` - -La dépendance au package {shinygouv} ne sera quant à elle pas prise en compte par la fonction `convert_to_dsfr()` et devra être effectuée manuellement dans les scripts en y ajoutant l'une des 2 possibilités suivantes (en fonction du mode développement utilisé): -- `library(shinygouv)` -- `@import shinygouv` - -#### Utiliser d'autres composants dsfr - -Pour toute utilisation de composants dsfr, il est nécessaire de se référer à la documentation afin d'en connaitre les paramètres possibles. - -La liste des composants déjà implémentés est disponible dans le package, selon la version du dsfr souhaitée: - -- Par exemple pour la version "1.7.2" (`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"))[,"composant_dsfr", drop = FALSE] %>% - knitr::kable() -``` - - -#### Les régles d'usage du DSFR - -Toutes les règles d'usage de la charte graphique du Système de Design de l'État sont disponibles [https://www.systeme-de-design.gouv.fr/comment-utiliser-le-dsfr](https://www.systeme-de-design.gouv.fr/comment-utiliser-le-dsfr) - -```{r development-inflate, eval=FALSE} -# Run but keep eval=FALSE to avoid infinite loop -# Execute in the console directly -fusen::inflate(flat_file = "dev/flat_new_app_dsfr.Rmd", vignette_name = "Comment demarrer une nouvelle application shiny dsfr") -``` - diff --git a/dev/flat_userproject.Rmd b/dev/flat_userproject.Rmd deleted file mode 100755 index 4b6a8561..00000000 --- a/dev/flat_userproject.Rmd +++ /dev/null @@ -1,384 +0,0 @@ ---- -title: "Creating a project" -author: "Sebastien Rochette" -date: "23/01/2021" -output: html_document -editor_options: - chunk_output_type: console ---- - -```{r development, include=FALSE} -library(testthat) -``` - - - -```{r dev-first-time} -# Empty vignette -# usethis::use_vignette('e-user-project-readme') - -# {thinkridentity} template -file.copy( - system.file("package", "e-user-project-readme.Rmd", package = "thinkridentity"), - here::here("vignettes"), - recursive = TRUE -) -``` - - - -```{r development-update} -# To modify ---- -# Which vignettes to copy for users to test the package -the_vignettes <- c("the-vignette.Rmd") -# Name of the vignette used as Readme -the_readme_vignette <- "e-user-project-readme.Rmd" - -# If rsproject does not exist ---- -if (!dir.exists(here::here("inst/rsproject"))) { - dir.create(here::here("inst/rsproject"), recursive = TRUE) -} - -# If specific versions need to be forced ---- -# renv::install("usethis@2.0.0") -# renv::install("odbc@1.2.2") - -# Load already included functions -pkgload::load_all(export_all = FALSE) - -# Update DESCRIPTION ---- -attachment::att_amend_desc( - # pkg_ignore = c("whereami"), # if needed - # extra.suggests = c("DT", "knitr") # if needed -) - -# Update renv in the current development project ---- -custom_packages <- c( - attachment::att_from_description(), - "renv", - "devtools", "roxygen2", "usethis", "pkgload", - "testthat", "covr", "attachment", "remotes", - "bookdown", "DT", "pak", - "zip", "credentials", - "gert", - "fontawesome", - "pkgdown", "styler", "checkhelper", "fusen", "boxr" -) -renv::snapshot(packages = custom_packages, prompt = FALSE) - -# Create dir with RStudio project ready ---- -dir.create(here::here("inst/rsproject")) -dir.create(here::here("inst/rstudio/templates/project"), recursive = TRUE) - -# Copy Rprofile -file.copy(here::here(".Rprofile"), here::here("inst/rsproject/Rprofile"), overwrite = TRUE) - -# Copy renv files -dir.create(here::here("inst/rsproject/renv")) -file.copy(here::here("renv/.gitignore"), here::here("inst/rsproject/renv/.gitignore"), overwrite = TRUE) -file.copy(here::here("renv/activate.R"), here::here("inst/rsproject/renv/activate.R"), overwrite = TRUE) -file.copy(here::here("renv/settings.dcf"), here::here("inst/rsproject/renv/settings.dcf"), overwrite = TRUE) - -# Upgrade renv.lock in the user project ---- -renv::install("usethis@1.6.3") - -custom_packages <- c( - attachment::att_from_description(field = c("Depends", "Imports", "Suggests")), - "renv", "pkgload", - "remotes", "styler", "knitr", "rmarkdown", "rstudioapi", - "DT", "zip", "credentials", - "gert", - "fontawesome", "pak" -) -renv::snapshot(packages = custom_packages, lockfile = here::here("inst/rsproject/renv.lock"), prompt = FALSE) - -lock_ <- renv:::lockfile(file = here::here("inst/rsproject/renv.lock")) - -# Enable this universe -options( - repos = c( - # thinkropen = 'https://thinkr-open.r-universe.dev', - CRAN = "https://cran.rstudio.com" - ) -) -lock_$repos( - # thinkropen = 'https://thinkr-open.r-universe.dev', - CRAN = "https://cran.rstudio.com" -) - -lock_$write(file = here::here("inst/rsproject/renv.lock")) -rm(lock_) - -# Update vignettes ---- -for (vignette in the_vignettes) { - file.copy(here::here("vignettes", vignette), - here::here("inst/rsproject", vignette), overwrite = TRUE) -} - -# Update Readme and clean yaml ---- -temp_readme <- tempfile("readme", fileext = ".Rmd") -file.copy(here::here("vignettes", the_readme_vignette), - temp_readme) -readme_lines <- readLines(temp_readme) -w.clean <- grep("WARNING", readme_lines)[1] -w.yaml.end <- grep("^---$", readme_lines)[2] -readme_lines <- readme_lines[-c(1:max(w.clean, w.yaml.end))] -cat(c("--- -output: github_document -editor_options: - chunk_output_type: console ----", -readme_lines), -sep = "\n", -file = here::here("inst/rsproject/README.Rmd"), -append = FALSE) - - -# Back to normal Rprofile ---- -source(here::here(".Rprofile")) -# Re-install development versions if needed -# renv::install("usethis@2.0.0") -``` - - - - -## Create directory with everything needed to use the package - -You can create a new directory with Rmd files needed to use the package, as well as the {renv} environment to reproduce the conditions of development. - -### Create the project with RStudio or command line - -- Use the RStudio project creation with the template 'the.package' - - File > New Project > New directory > "Admin project with {the.package}" - - Choose where to create the project - -OR with command line - -- Run `the.package::create_new_project("your/path/of/choice")` - - Restart the R session inside the new project - -### Restore the conditions of development - -- To install all R packages with correct versions inside the newly created package, run: - -```r -renv::restore() -``` - -- Re-install the {the.package} package inside this environment - -```r -# install.packages("remotes") -remotes::install_local("the.package_0.1.0.tar.gz", upgrade = "never") -``` - -### Use the package - -Then, you can use the files: - -- "the-vignette.Rmd" to test the package - -```{r function-create_new_project} -#' Create directory with everything needed to use the package -#' -#' @param path Path of the directory where to create the project -#' @param open Logical. Whether to open the directory when created -#' @param overwrite Logical. Whether to overwrite all existing files. -#' -#' @importFrom utils browseURL -#' @importFrom usethis create_project -#' @export -create_new_project <- function(path = tempfile("path"), open = FALSE, - overwrite = FALSE) { - path <- normalizePath(path, mustWork = FALSE) - if (!dir.exists(path)) { - dir.create(path) - } else { - message("Files added to existing path: ", path) - } - - files_to_copy <- file.path( - app_sys_admin("rsproject"), - list.files(app_sys_admin("rsproject"))) - files_to_copy <- files_to_copy[!grepl("Rprofile", files_to_copy)] - - file.copy(from = files_to_copy, to = path, - recursive = TRUE, overwrite = overwrite) - - # Specific to .Rprofile - file.copy(from = app_sys_admin("rsproject", "Rprofile"), - to = file.path(path, ".Rprofile"), - overwrite = overwrite) - - # Create the project - create_project(path, open = open) - - if (isTRUE(open)) { - browseURL(path) - } - - return(path) -} -``` - -```{r examples-create_new_project} -# Define a directory, new or existing -my_directory <- tempdir() -# Create the content -create_new_project(my_directory) -# See the content of the directory -fs::dir_tree(my_directory) -``` - -```{r tests-create_new_project} -test_that("create_new_project works properly", { - - skip_if_not(Sys.getenv("RSTUDIO_PROGRAM_MODE") == "desktop") - - # Define a directory, new or existing - my_directory <- tempfile(pattern = "admin-") - - # Create the content - create_new_project(my_directory, open = FALSE) - - # fs::dir_tree(my_directory, all = TRUE) - - all_files <- c("renv.lock", ".Rprofile", "renv/activate.R", - "README.Rmd", - "the-vignette.Rmd") - - for (the_file in all_files) { - expect_true(file.exists(file.path(my_directory, the_file))) - } - - # No error to open file, but message because of existing directory - expect_message(create_new_project(my_directory, open = TRUE), regexp = "Files added to existing path") - - -# Test locally during dev only that content was updated ---- - message("create_new_project is up-to-date") - skip_if_not(file.exists("../../.Rprofile")) - - all_files <- c(".Rprofile", "renv/activate.R") # "renv.lock", - for (the_file in all_files) { - file_expected <- readLines(file.path("..", "..", the_file)) - file_created <- readLines(file.path(my_directory, the_file)) - expect_equal(file_created, file_expected) - } - - all_files <- c("the-vignette.Rmd") - for (the_file in all_files) { - file_expected <- readLines(file.path("..", "..", "vignettes", the_file)) - file_created <- readLines(file.path(my_directory, the_file)) - expect_equal(file_created, file_expected) - } - -}) -``` - - -```{r development-inflate, eval=FALSE} -# Run but keep eval=FALSE to avoid infinite loop -# Execute in the console directly -fusen::inflate(flat_file = "dev/flat_userproject.Rmd", - vignette_name = "d - create admin project", - open_vignette = FALSE, - overwrite = "yes", - check = FALSE) - -# Test file for updated skeleton -pkgload::load_all() -testthat::test_file(here::here("tests/testthat/test-create_new_project.R")) -``` - - - -```{r development-delivery} -# _RS Project update ---- -rs_dir <- "deliverables/the.package_project" -unlink(rs_dir, recursive = TRUE) -usethis::use_git_ignore("deliverables") -pkgload::load_all() -outdir <- create_new_project(path = file.path(tempdir(), "the.package_project")) -file.copy(outdir, "deliverables", recursive = TRUE) -unlink(outdir, recursive = TRUE) -# => Do not forget to add sources in the project - -# _Sources build ---- -temp_install <- file.path(tempdir(), "temp_pkg_folder") -unlink(temp_install, recursive = TRUE) -dir.create(temp_install) - -# Build with all except what is in Rbuildignore -rbuildignore <- gsub("\\\\[.]", "[.]", paste(readLines(".Rbuildignore"), collapse = "|")) -all.files.noinst <- list.files(here::here())[ - !grepl(rbuildignore, list.files(here::here()))] - -# Copy the entire folder in tempdir() -file.copy(from = all.files.noinst, - to = temp_install, - recursive = TRUE) -list.files(temp_install) - -# Build sources from reduced package -dir.create("deliverables/sources") -devtools::build(pkg = temp_install, - path = "deliverables/sources", - vignettes = FALSE) # build the package - -unlink(temp_install, recursive = TRUE) - -# _Copy sources in the.package_project ---- -# dir.create("deliverables/the.package_project/renv/cellar", recursive = TRUE) -file.copy(tail( - list.files("deliverables/sources", pattern = ".tar.gz", full.names = TRUE), 1), - to = "deliverables/the.package_project", overwrite = TRUE) - -# Verify the Readme, but you maybe deliver this "deliverables/the.package_project" as is to your clients -``` - diff --git a/dev/pkgs_deps.csv b/dev/pkgs_deps.csv deleted file mode 100644 index 8508b01f..00000000 --- a/dev/pkgs_deps.csv +++ /dev/null @@ -1,42 +0,0 @@ -"","name_pkg","cran","remote" -"1","knitr",TRUE,"" -"2","testthat",TRUE,"" -"3","pkgload",TRUE,"" -"4","DT",TRUE,"" -"5","readxl",TRUE,"" -"6","tibble",TRUE,"" -"7","dplyr",TRUE,"" -"8","kableExtra",TRUE,"" -"9","purrr",TRUE,"" -"10","XML",TRUE,"" -"11","stringr",TRUE,"" -"12","htmltools",TRUE,"" -"13","here",TRUE,"" -"14","renv",TRUE,"" -"15","fs",TRUE,"" -"16","usethis",TRUE,"" -"17","devtools",TRUE,"" -"18","golem",TRUE,"" -"19","rstudioapi",TRUE,"" -"20","rhub",TRUE,"" -"21","rsconnect",TRUE,"" -"22","git2r",TRUE,"" -"23","remotes",TRUE,"" -"24","chameleon",TRUE,"" -"25","covr",TRUE,"" -"26","covrpage",TRUE,"" -"27","gitdown",TRUE,"" -"28","writexl",TRUE,"" -"29","testdown",TRUE,"" -"30","thinkridentity",TRUE,"" -"31","rmarkdown",TRUE,"" -"32","bookdown",TRUE,"" -"33","lintr",TRUE,"" -"34","desc",TRUE,"" -"35","stringi",TRUE,"" -"36","httpuv",TRUE,"" -"attachment","attachment",FALSE,"thinkr-open/attachment" -"gitlabr","gitlabr",FALSE,"statnmap/gitlabr" -"checkhelper","checkhelper",FALSE,"thinkr-open/checkhelper" -"grkstyle","grkstyle",FALSE,"gadenbuie/grkstyle" -"charpente","charpente",FALSE,"rinterface/charpente" diff --git a/dev/deploy.R b/dev/tools/deploy.R similarity index 100% rename from dev/deploy.R rename to dev/tools/deploy.R diff --git a/dev/flat_convert_to_dsfr.Rmd b/dev/tools/flat_convert_to_dsfr.Rmd similarity index 64% rename from dev/flat_convert_to_dsfr.Rmd rename to dev/tools/flat_convert_to_dsfr.Rmd index a79ca929..fec03dd9 100644 --- a/dev/flat_convert_to_dsfr.Rmd +++ b/dev/tools/flat_convert_to_dsfr.Rmd @@ -28,62 +28,61 @@ pkgload::load_all(export_all = FALSE) #' @importFrom utils file_test #' #' @return un fichier -convert_file_to_dsfr <- function(file, tab_corresp){ +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))){ + # 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) file_convert <- purrr::reduce2( - paste0(tab_corresp$composant_shiny,"\\("), - paste0(tab_corresp$composant_dsfr,"\\("), - .init = file_read, - stringr::str_replace_all) + paste0(tab_corresp$composant_shiny, "\\("), + paste0(tab_corresp$composant_dsfr, "\\("), + .init = file_read, + stringr::str_replace_all) writeLines(file_convert, con = file) } return(NULL) } - ``` ```{r tests-convert_file_to_dsfr} test_that("convert_file_to_dsfr works", { -skip_on_ci() + skip_on_ci() -library(tibble) + library(tibble) -mydir <- tempfile(pattern = "app") -dir.create(mydir) -golem::install_dev_deps( - force_install = TRUE -) -golem::create_golem( - mydir, - overwrite = TRUE, - open = FALSE -) + mydir <- tempfile(pattern = "app") + dir.create(mydir) + golem::install_dev_deps( + force_install = TRUE + ) + golem::create_golem( + mydir, + overwrite = TRUE, + 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) -fichier_transform <- readLines(fichier) + fichier <- file.path(mydir, "R", "app_ui.R") + convert_file_to_dsfr(file = fichier, table_passage) + fichier_transform <- readLines(fichier) #' @description le fluidPage de shiny a bien ete remplace 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) -fichier_transform <- readLines(fichier) + fichier <- file.path(mydir, "R", "app_ui.R") + convert_file_to_dsfr(file = fichier, table_passage) + fichier_transform <- readLines(fichier) #' @description les composants dsfr n ayant pas d equivalent en shiny ne sont pas remplaces @@ -144,45 +143,45 @@ convert_to_dsfr(path = "le_chemin_de_mon_application") #' @return des fichiers modifies #' #' @export -convert_to_dsfr <- function(path = "R/", version = get_dsfr_version()){ +convert_to_dsfr <- function(path = "R/", version = get_dsfr_version()) { -chem <- glue::glue("v{version}/table_correspondance_shiny_dsfr.csv") + chem <- glue::glue("v{version}/table_correspondance_shiny_dsfr.csv") - if (is.null(version)){ + if (is.null(version)) { stop("Merci de preciser le numero de version a utiliser") } if (!file.exists( - system.file(chem, package = "shinygouv"))){ + system.file(chem, package = "shinygouv"))) { stop(glue::glue("Le dossier 'v{version}' n existe pas")) } chemin_tab_corresp <- system.file(chem, package = "shinygouv") - if (chemin_tab_corresp == ""){ + if (chemin_tab_corresp == "") { stop(glue::glue("Le fichier 'v{version}/table_correspondance_shiny_dsfr.csv' n existe pas")) } - tab_corresp <- read.csv2(chemin_tab_corresp, na.strings = c("","NA")) - tab_corresp <- tab_corresp[!is.na(tab_corresp[["composant_shiny"]]),] + tab_corresp <- read.csv2(chemin_tab_corresp, na.strings = c("", "NA")) + tab_corresp <- tab_corresp[!is.na(tab_corresp[["composant_shiny"]]), ] # recuperation de la table de correspondance fic <- list.files(path = path, full.names = TRUE) res <- purrr::map(.x = fic, - ~convert_file_to_dsfr(.x, - tab_corresp ) + ~ convert_file_to_dsfr(.x, + tab_corresp) ) # ajout de la dependance a app_ui.R si il existe - if (file.exists(file.path(path,"app_ui.R"))){ - file_read <- readLines(file.path(path,"app_ui.R")) - local <- stringr::str_which(string = file_read, pattern = "@import shiny") - for ( i in local){ - file_read <- append(file_read, "#' @import shinygouv", after=i) - } - message("la dependance a shinygouv a ete ajoute dans app_ui.R") - writeLines(file_read, con = file.path(path,"app_ui.R")) + if (file.exists(file.path(path, "app_ui.R"))) { + file_read <- readLines(file.path(path, "app_ui.R")) + local <- stringr::str_which(string = file_read, pattern = "@import shiny") + for (i in local) { + file_read <- append(file_read, "#' @import shinygouv", after = i) + } + message("la dependance a shinygouv a ete ajoute dans app_ui.R") + writeLines(file_read, con = file.path(path, "app_ui.R")) } return("Conversion terminee") @@ -208,35 +207,35 @@ if (FALSE) { ```{r tests-convert_to_dsfr} test_that("convert_to_dsfr works", { -skip_on_ci() -mydir <- tempfile(pattern = "app") -dir.create(mydir) -golem::install_dev_deps( - force_install = TRUE -) -golem::create_golem( - mydir, - overwrite = TRUE, - open = FALSE -) + skip_on_ci() + mydir <- tempfile(pattern = "app") + dir.create(mydir) + golem::install_dev_deps( + force_install = TRUE + ) + golem::create_golem( + mydir, + overwrite = TRUE, + 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)) + #' @description Retourne une erreur si le numero de version est NULL + expect_error(convert_to_dsfr(path = file.path(mydir, "R"), version = NULL)) -#' @description Retourne une erreur si le tableau de correspondance n'existe pas pour la version specifiee -expect_error(convert_to_dsfr(path = file.path(mydir,"R"), version = "A.A.A.A"), msg ="Le dossier 'vA.A.A.A' n'existe pas") + #' @description Retourne une erreur si le tableau de correspondance n'existe pas pour la version specifiee + expect_error(convert_to_dsfr(path = file.path(mydir, "R"), version = "A.A.A.A"), msg = "Le dossier 'vA.A.A.A' n'existe pas") -expect_error(convert_to_dsfr(path = file.path(mydir,"R")), regexp = NA) -app_ui <- readLines(file.path(mydir,"R","app_ui.R")) + expect_error(convert_to_dsfr(path = file.path(mydir, "R")), regexp = NA) + app_ui <- readLines(file.path(mydir, "R", "app_ui.R")) -#' @description la dependance a shinygouv a ete ajoute a app_ui.R -expect_true(any(stringr::str_detect(string = app_ui,pattern = "@import shinygouv"))) + #' @description la dependance a shinygouv a ete ajoute a app_ui.R + expect_true(any(stringr::str_detect(string = app_ui, pattern = "@import shinygouv"))) -#' @description les composants dsfr n ayant pas d equivalent en shiny ne sont pas remplaces, par exemple header_dsfr + #' @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\\("))) @@ -254,7 +253,7 @@ Pour savoir quelle version du dsfr est utilisée dans votre installation de {shi #' @return Character. Numero de version #' #' @export -get_dsfr_version <- function(with_v = FALSE){ +get_dsfr_version <- function(with_v = FALSE) { res <- utils::packageDescription(pkg = 'shinygouv')[["VersionDsfr"]] if (isTRUE(with_v)) { res <- paste0("v", res) @@ -280,6 +279,6 @@ test_that("get_dsfr_version works", { ```{r development-inflate, eval=FALSE} # Run but keep eval=FALSE to avoid infinite loop # Execute in the console directly -fusen::inflate(flat_file = "dev/flat_convert_to_dsfr.Rmd", vignette_name = "Convertir une app shiny en app shiny dsfr") +fusen::inflate(flat_file = "dev/tools/flat_convert_to_dsfr.Rmd", vignette_name = "Convertir une app shiny en app shiny dsfr") ``` diff --git a/dev/flat_tools.Rmd b/dev/tools/flat_tools.Rmd similarity index 84% rename from dev/flat_tools.Rmd rename to dev/tools/flat_tools.Rmd index 44881239..d59b8219 100644 --- a/dev/flat_tools.Rmd +++ b/dev/tools/flat_tools.Rmd @@ -25,18 +25,18 @@ pkgload::load_all(export_all = FALSE) #' @param html_code resultat de la fonction htmlTemplate #' @importFrom XML htmlParse getNodeSet #' -parse_to_xml <- function(html_code, zone = "/html/body/*"){ - if(inherits(html_code, "XMLInternalElementNode")){ +parse_to_xml <- function(html_code, zone = "/html/body/*") { + if (inherits(html_code, "XMLInternalElementNode")) { stop("Use this function with character or shiny.tag.list") } - if(!is.character(html_code)){ + if (!is.character(html_code)) { html_code <- as.character(html_code) } - html_code %>% - XML::htmlParse(encoding = "UTF-8") %>% - XML::getNodeSet(zone) %>% - getElement(1) + html_code %>% + XML::htmlParse(encoding = "UTF-8") %>% + XML::getNodeSet(zone) %>% + getElement(1) } ``` @@ -64,7 +64,7 @@ test_that("parse_to_xml works", { #' @description tester la classe du resultat de la fonction sur un shiny.tag expect_s3_class(test2, "XMLInternalElementNode") - }) +}) ``` @@ -81,27 +81,27 @@ test_that("parse_to_xml works", { #' @importFrom stringr str_pad #' @importFrom purrr partial #' -render_node <- function (node, indent = 0, prefix = FALSE) { +render_node <- function(node, indent = 0, prefix = FALSE) { if (xmlName(node) == "text") { txt <- xmlValue(node) if (nchar(trimws(txt)) > 0) { paste0("\"", trimws(txt), "\"") } - }else { - tagName <- if (prefix){ + } else { + tagName <- if (prefix) { paste0("tags$", xmlName(node)) - }else { + } else { xmlName(node) } my_render <- partial(render_node, indent = newIndent, - prefix = prefix) + prefix = prefix) newIndent <- indent + length(tagName) + 1 xmlChildren(node) %>% Keep(my_render, .) %>% append(make_attrs(node), .) %>% paste(collapse = str_pad(",\n", width = newIndent, - side = c("right"))) %>% + side = c("right"))) %>% trimws(which = c("left")) %>% paste0(tagName, "(", ., ")") } @@ -110,7 +110,7 @@ render_node <- function (node, indent = 0, prefix = FALSE) { #' @noRd #' @importFrom XML xmlAttrs #' @importFrom stringr str_detect -make_attrs <- function (node) { +make_attrs <- function(node) { attrs <- xmlAttrs(node) names(attrs) %>% Map(function(name) { val <- attrs[[name]] @@ -118,16 +118,14 @@ make_attrs <- function (node) { pattern = "for")) { name <- paste0("`", name, "`") } - paste0(name, " = ", if (val == "") {"NA"}else{ paste0("\"", val, "\"")}) + paste0(name, " = ", if (val == "") {"NA"} else { paste0("\"", val, "\"")}) }, .) } #' @noRd -Keep <- function (fun, xs) { +Keep <- function(fun, xs) { Map(fun, xs) %>% Filter(Negate(is.null), .) } - - ``` @@ -189,6 +187,6 @@ test_that("tester parse_html", { ```{r development-inflate, eval=FALSE} # Run but keep eval=FALSE to avoid infinite loop # Execute in the console directly -fusen::inflate(flat_file = "dev/flat_tools.Rmd", vignette_name = "html vers shiny.tag", check = FALSE, overwrite = TRUE) +fusen::inflate(flat_file = "dev/tools/flat_tools.Rmd", vignette_name = NA, check = FALSE, overwrite = TRUE) ``` diff --git a/dev/maj_version_dsfr.R b/dev/tools/maj_version_dsfr.R similarity index 100% rename from dev/maj_version_dsfr.R rename to dev/tools/maj_version_dsfr.R diff --git a/vignettes/convertir-une-app-shiny-en-app-shiny-dsfr.Rmd b/vignettes/A-convertir-une-app-shiny-en-app-shiny-dsfr.Rmd similarity index 97% rename from vignettes/convertir-une-app-shiny-en-app-shiny-dsfr.Rmd rename to vignettes/A-convertir-une-app-shiny-en-app-shiny-dsfr.Rmd index 4460f55e..a0518413 100644 --- a/vignettes/convertir-une-app-shiny-en-app-shiny-dsfr.Rmd +++ b/vignettes/A-convertir-une-app-shiny-en-app-shiny-dsfr.Rmd @@ -2,7 +2,7 @@ title: "Convertir une app shiny en app shiny dsfr" output: rmarkdown::html_vignette vignette: > - %\VignetteIndexEntry{convertir-une-app-shiny-en-app-shiny-dsfr} + %\VignetteIndexEntry{A-convertir-une-app-shiny-en-app-shiny-dsfr} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- diff --git a/vignettes/comment-demarrer-une-nouvelle-application-shiny-dsfr.Rmd b/vignettes/B-comment-demarrer-une-nouvelle-application-shiny-dsfr.Rmd similarity index 97% rename from vignettes/comment-demarrer-une-nouvelle-application-shiny-dsfr.Rmd rename to vignettes/B-comment-demarrer-une-nouvelle-application-shiny-dsfr.Rmd index e432fbf6..c4043587 100644 --- a/vignettes/comment-demarrer-une-nouvelle-application-shiny-dsfr.Rmd +++ b/vignettes/B-comment-demarrer-une-nouvelle-application-shiny-dsfr.Rmd @@ -2,7 +2,7 @@ title: "Comment demarrer une nouvelle application shiny dsfr" output: rmarkdown::html_vignette vignette: > - %\VignetteIndexEntry{comment-demarrer-une-nouvelle-application-shiny-dsfr} + %\VignetteIndexEntry{B-comment-demarrer-une-nouvelle-application-shiny-dsfr} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- diff --git a/dev/documentation/README.Rmd b/vignettes/Dev-A-guide-du-developpeur.Rmd similarity index 92% rename from dev/documentation/README.Rmd rename to vignettes/Dev-A-guide-du-developpeur.Rmd index fa9ff1dd..e8d594a6 100644 --- a/dev/documentation/README.Rmd +++ b/vignettes/Dev-A-guide-du-developpeur.Rmd @@ -1,12 +1,14 @@ --- title: 'Guide du développeur' output: github_document -editor_options: - chunk_output_type: console +vignette: > + %\VignetteIndexEntry{Dev-A-guide-du-developpeur} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} --- ```{r setup, include=FALSE} -knitr::opts_chunk$set(echo = TRUE) +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. @@ -99,15 +101,15 @@ Le workflow se découpe en deux possibilités : 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 : -- [Comment faire un composant shiny](comment-faire-un-composant-shiny.md) +- [Comment faire un composant shiny](Dev-B-comment-faire-un-composant-shiny.md) Vous trouverez des exemples pour d'autres composants : - Avec réactivité: - - [radio buttons](radiobuttons-dsfr.md) + - [radio buttons](reference/radiobuttons-dsfr.html) - Sans réactivité: - - [Fluid page](fluidpage_dsfr.md) + - [Fluid page](reference/fluidpage_dsfr.html) N'hésitez pas à amender cette liste au fur et à mesure de vos développements diff --git a/dev/documentation/comment-faire-un-composant-shiny.Rmd b/vignettes/Dev-B-comment-faire-un-composant-shiny.Rmd similarity index 97% rename from dev/documentation/comment-faire-un-composant-shiny.Rmd rename to vignettes/Dev-B-comment-faire-un-composant-shiny.Rmd index e292f24b..ec092dba 100644 --- a/dev/documentation/comment-faire-un-composant-shiny.Rmd +++ b/vignettes/Dev-B-comment-faire-un-composant-shiny.Rmd @@ -2,7 +2,7 @@ title: "Comment faire un composant shiny" output: github_document vignette: > - %\VignetteIndexEntry{comment-faire-un-composant-shiny} + %\VignetteIndexEntry{Dev-B-comment-faire-un-composant-shiny} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- @@ -10,7 +10,8 @@ vignette: > ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, - comment = "#>" + comment = "#>", + eval = FALSE ) ``` diff --git a/dev/documentation/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 similarity index 91% rename from dev/documentation/montee-en-version-du-dsfr-trouver-les-fichiers-css-et-js.Rmd rename to vignettes/Dev-C-montee-en-version-du-dsfr-trouver-les-fichiers-css-et-js.Rmd index 469c2a11..0f461501 100644 --- a/dev/documentation/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 @@ -10,7 +10,8 @@ vignette: > ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, - comment = "#>" + comment = "#>", + eval = FALSE ) ``` @@ -70,7 +71,7 @@ Pour une version minimale, les seuls fichiers à garder sont : └── icons ``` -Vous pouvez lancer le contenu du script "dev/maj_version_dsfr.R" pour votre version pour réaliser ce nettoyage +Vous pouvez lancer le contenu du script "dev/tools/maj_version_dsfr.R" pour votre version pour réaliser ce nettoyage On pourra ensuite créer une fonction qui permettera d'ajouter les dépendances dans les applications {shiny}. @@ -127,10 +128,6 @@ if (length(all_versions > 2)) { # Récupérer les codes HTML un par un -Suivre la procédure de création de composant dans "dev/flat_comment-faire-un-composant-shiny.Rmd", même pour mettre à jour l'existant. +Suivre la procédure de création de composant dans la vignette `Comment faire un composant shiny` -```{r} -rstudioapi::navigateToFile("dev/flat_comment-faire-un-composant-shiny.Rmd") -``` - diff --git a/dev/documentation/explo_shiny.dsfr.Rmd b/vignettes/Dev-D-retour-sur-shiny.dsfr.Rmd similarity index 89% rename from dev/documentation/explo_shiny.dsfr.Rmd rename to vignettes/Dev-D-retour-sur-shiny.dsfr.Rmd index f37e63ac..692bfca7 100644 --- a/dev/documentation/explo_shiny.dsfr.Rmd +++ b/vignettes/Dev-D-retour-sur-shiny.dsfr.Rmd @@ -1,11 +1,14 @@ --- -title: "Retour sur {shiny.dsfr}" +title: 'Retour sur shiny.dsfr' output: github_document -date: "2022-08-08" +vignette: > + %\VignetteIndexEntry{Dev-D-retour-sur-shiny.dsfr} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} --- ```{r setup, include=FALSE} -knitr::opts_chunk$set(echo = TRUE) +knitr::opts_chunk$set(echo = TRUE, eval = FALSE) ``` 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. diff --git a/vignettes/recommandation-pour-l-implementation-de-dsfr.Rmd b/vignettes/Dev-E-recommandation-pour-l-implementation-de-dsfr.Rmd similarity index 99% rename from vignettes/recommandation-pour-l-implementation-de-dsfr.Rmd rename to vignettes/Dev-E-recommandation-pour-l-implementation-de-dsfr.Rmd index d7550818..4c69a691 100644 --- a/vignettes/recommandation-pour-l-implementation-de-dsfr.Rmd +++ b/vignettes/Dev-E-recommandation-pour-l-implementation-de-dsfr.Rmd @@ -10,7 +10,8 @@ vignette: > ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, - comment = "#>" + comment = "#>", + eval = FALSE ) ``` diff --git a/vignettes/documentation-inventaire.Rmd b/vignettes/Dev-F-documentation-inventaire.Rmd similarity index 96% rename from vignettes/documentation-inventaire.Rmd rename to vignettes/Dev-F-documentation-inventaire.Rmd index 79aec953..1c3f2fc3 100644 --- a/vignettes/documentation-inventaire.Rmd +++ b/vignettes/Dev-F-documentation-inventaire.Rmd @@ -2,7 +2,7 @@ title: "Documentation-Inventaire" output: rmarkdown::html_vignette vignette: > - %\VignetteIndexEntry{documentation-inventaire} + %\VignetteIndexEntry{Dev-F-documentation-inventaire} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- @@ -10,7 +10,8 @@ vignette: > ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, - comment = "#>" + comment = "#>", + eval = FALSE ) ``` diff --git a/vignettes/tests_and_coverage.Rmd b/vignettes/Dev-G-test-and-coverage.Rmd similarity index 99% rename from vignettes/tests_and_coverage.Rmd rename to vignettes/Dev-G-test-and-coverage.Rmd index a773346e..6b0e9a61 100644 --- a/vignettes/tests_and_coverage.Rmd +++ b/vignettes/Dev-G-test-and-coverage.Rmd @@ -3,7 +3,7 @@ title: "Tests and Coverage" date: "`r format(Sys.time(), '%d %B, %Y %H:%M:%S')`" output: rmarkdown::html_vignette vignette: > - %\VignetteIndexEntry{Tests and Coverage} + %\VignetteIndexEntry{Dev-G-test-and-coverage} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- diff --git a/vignettes/actionbutton_dsfr.Rmd b/vignettes/actionbutton_dsfr.Rmd deleted file mode 100644 index 81755e0d..00000000 --- a/vignettes/actionbutton_dsfr.Rmd +++ /dev/null @@ -1,67 +0,0 @@ ---- -title: "actionButton_dsfr" -output: rmarkdown::html_vignette -vignette: > - %\VignetteIndexEntry{actionbutton_dsfr} - %\VignetteEngine{knitr::rmarkdown} - %\VignetteEncoding{UTF-8} ---- - -```{r, include = FALSE} -knitr::opts_chunk$set( - collapse = TRUE, - comment = "#>" -) -``` - -```{r setup} -library(shinygouv) -``` - - - -# actionButton_dsfr_template - - - - - - - - - -# actionButton_dsfr - -```{r examples-actionButton_dsfr} -if (interactive()) { - library(shiny) - library(shinygouv) - - ui <- fluidPage_dsfr( - header = header_dsfr( - intitule = "Intitule", - officiel = "Officiel", - nom_site_service = "Nom du site / service", - baseline = "baseline - precisions sur l organisation", - class = "fr-m-1w" - ), - title = "Exemple", - fluidRow_dsfr( - actionButton_dsfr( - inputId = "test", - label = "Cliquez moi", - class = "fr-btn--icon-left fr-icon-checkbox-circle-line" - ), - verbatimTextOutput(outputId = "nbclic") - ) - ) - server <- function(input, output, session) { - output$nbclic <- renderText({ - paste("Vous avez cliqu\u00e9", input$test, "fois sur le bouton") - }) - } - - shinyApp(ui, server) -} -``` - diff --git a/vignettes/html-vers-shiny-tag.Rmd b/vignettes/html-vers-shiny-tag.Rmd deleted file mode 100644 index 13dd8f1a..00000000 --- a/vignettes/html-vers-shiny-tag.Rmd +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: "html vers shiny.tag" -output: rmarkdown::html_vignette -vignette: > - %\VignetteIndexEntry{html-vers-shiny-tag} - %\VignetteEngine{knitr::rmarkdown} - %\VignetteEncoding{UTF-8} ---- - -```{r, include = FALSE} -knitr::opts_chunk$set( - collapse = TRUE, - comment = "#>" -) -``` - -```{r setup} -library(shinygouv) -``` - - - -# parse_to_xml - - - - - - - - - -# render_node - -# parse_html - -```{r examples-parse_html} -html_code <- '' -parse_html(html_code) -``` - diff --git a/vignettes/montee-en-version-du-dsfr-trouver-les-fichiers-css-et-js.Rmd b/vignettes/montee-en-version-du-dsfr-trouver-les-fichiers-css-et-js.Rmd deleted file mode 100644 index 3bfe1b61..00000000 --- a/vignettes/montee-en-version-du-dsfr-trouver-les-fichiers-css-et-js.Rmd +++ /dev/null @@ -1,140 +0,0 @@ ---- -title: "Montee en version du dsfr : trouver les fichiers CSS et JS" -output: rmarkdown::html_vignette -vignette: > - %\VignetteIndexEntry{montee-en-version-du-dsfr-trouver-les-fichiers-css-et-js} - %\VignetteEngine{knitr::rmarkdown} - %\VignetteEncoding{UTF-8} ---- - -```{r, include = FALSE} -knitr::opts_chunk$set( - collapse = TRUE, - comment = "#>" -) -``` - -```{r setup} -library(shinygouv) -``` - - - -```{r} -knitr::opts_chunk$set(eval = FALSE) -``` - -Dans le dossier "inst/" du package, nous allons créer deux dossiers: - -- un pour récolter les css et js du dsfr, -- et un pour stocker les templates HTML que vous aurez converti - -_Ci-dessous, nous prenons l'exemple de la montée de version de 1.6.0 vers 1.7.2_ - -Indiquez ici le numéro de la nouvelle version à implémenter que vous pourrez trouver sur [la page du dsfr](https://gouvfr.atlassian.net/wiki/spaces/DB/pages/223019574/D+veloppeurs) - - -```{r} -nouvelle_version <- "2.0.0" -``` - -# 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 -- Déplacer le dossier "dsfr-v1.7.2/dist" dans le dossier "inst/" du package 'shinygouv'. - -Pour une version minimale, les seuls fichiers à garder sont : - -``` -/ Racine du projet -└── index.html -└── dsfr.min.css -└── dsfr.module.min.js -└── dsfr.nomodule.min.js -└── favicon -└── font -└── icons -└── utility - └── icons -``` - -Vous pouvez lancer le contenu du script "dev/maj_version_dsfr.R" pour votre version pour réaliser ce nettoyage - - -```{r} -source("dev/maj_version_dsfr.R") -maj_version_dsfr() -``` - -On pourra ensuite créer une fonction qui permettera d'ajouter les dépendances dans les applications {shiny}. - - -# Créer un dossier pour le code HTML des composants - -Nous recommandons de faire une copie du dossier de la version précédente - - -```{r} -last_version <- max(list.files("inst", pattern = "^v\\d")) -if (last_version != paste0("v", nouvelle_version)) { - fs::dir_copy( - path = file.path("inst", last_version), - new_path = paste0("inst/v", nouvelle_version) - ) -} -``` - -Dans le fichier "table_correspondance_shiny_dsfr.csv", mettez `non` dans la colonne `mis_a_jour` car pour le moment, vous n'avez pas récupéré le HTML de toutes les composantes de la nouvelle version - - -```{r} -corresp <- read.csv2(file.path("inst", paste0("v", nouvelle_version), "table_correspondance_shiny_dsfr.csv")) -corresp[, "mis_a_jour"] <- "non" -write.csv2(corresp, file.path("inst", paste0("v", nouvelle_version), "table_correspondance_shiny_dsfr.csv")) -``` - -Vous pouvez ouvrir une issue pour lister tous les fichiers HTML de composants à vérifier avant de mettre `oui` dans la colonne `mis_a_jour` - - -```{r} -corresp <- read.csv2(file.path("inst", paste0("v", nouvelle_version), "table_correspondance_shiny_dsfr.csv")) - -# A coller dans votre issue -cat( - paste("- [ ]", corresp[["fichier"]]), - sep = "\n" -) -``` - -# 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 - - -```{r} -desc::desc_set("VersionDsfr" = nouvelle_version) -``` - -# 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. - - -```{r} -all_versions <- list.files("inst", pattern = "^v\\d") -if (length(all_versions > 2)) { - unlink(file.path("inst", min(all_versions)), recursive = TRUE) -} -``` - -# Récupérer les codes HTML un par un - -Suivre la procédure de création de composant dans "dev/flat_comment-faire-un-composant-shiny.Rmd", même pour mettre à jour l'existant. - - -```{r} -rstudioapi::navigateToFile("dev/flat_comment-faire-un-composant-shiny.Rmd") -``` - diff --git a/vignettes/navbarpage_dsfr.Rmd b/vignettes/navbarpage_dsfr.Rmd deleted file mode 100644 index 1cc72924..00000000 --- a/vignettes/navbarpage_dsfr.Rmd +++ /dev/null @@ -1,116 +0,0 @@ ---- -title: "navbarPage_dsfr" -output: rmarkdown::html_vignette -vignette: > - %\VignetteIndexEntry{navbarpage_dsfr} - %\VignetteEngine{knitr::rmarkdown} - %\VignetteEncoding{UTF-8} ---- - -```{r, include = FALSE} -knitr::opts_chunk$set( - collapse = TRUE, - comment = "#>" -) -``` - -```{r setup} -library(shinygouv) -``` - - - -# navbarPage_dsfr - -La `navbarPage_dsfr()` se compose de : - -- Un header, défini par la fonction `header_dsfr()` -- Une navbar, définie par une série d'élement `navbarPanel_dsfr()` - - -```{r examples-navbarPage_dsfr} -library(shiny) -# Define UI -ui <- navbarPage_dsfr( - title = "Welcome to the Jungle", - id = "nav", - header = header_dsfr( - intitule = "République", - officiel = "Française", - nom_site_service = "Nom du site / service", - baseline = "Baseline - pr\u00E9cisions sur l organisation" - ), - # First tab - navbarPanel_dsfr( - title = "actionButton_dsfr()", - fluidRow_dsfr( - column_dsfr( - 12, - h3("Demo actionButton_dsfr()"), - # Adding space to the column - # https://www.systeme-de-design.gouv.fr/elements-d-interface/fondamentaux-techniques/espacement - extra_class = "fr-my-6w" - ), - column_dsfr( - 4, - actionButton_dsfr( - "go", - label = "Un bouton avec un \u00E9!" - ) - ), - column_dsfr( - 8, - p("Salut les gens!"), - verbatimTextOutput( - "output1" - ) - ) - ) - ), - # Second tab - navbarPanel_dsfr( - title = "radioButtons_dsfr()", - fluidRow_dsfr( - column_dsfr( - 12, - h3("Demo radioButtons_dsfr()"), - # Adding space to the column - # https://www.systeme-de-design.gouv.fr/elements-d-interface/fondamentaux-techniques/espacement - extra_class = "fr-my-6w" - ), - column_dsfr( - 6, - radioButtons_dsfr( - inputId = "espece", - label = "Especes", - choices = c("Setosa" = "setosa", "Versicolor" = "versicolor"), - class = NULL - ) - ), - column_dsfr( - 6, - verbatimTextOutput( - "output2" - ) - ) - ) - ) -) -# Define server logic -server <- function(input, output) { - # Server logic for Tab 1 - 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) -} -``` - diff --git a/vignettes/numericinput_dsfr.Rmd b/vignettes/numericinput_dsfr.Rmd deleted file mode 100644 index 8a1cf56c..00000000 --- a/vignettes/numericinput_dsfr.Rmd +++ /dev/null @@ -1,176 +0,0 @@ ---- -title: "numericInput_dsfr" -output: rmarkdown::html_vignette -vignette: > - %\VignetteIndexEntry{numericinput_dsfr} - %\VignetteEngine{knitr::rmarkdown} - %\VignetteEncoding{UTF-8} ---- - -```{r, include = FALSE} -knitr::opts_chunk$set( - collapse = TRUE, - comment = "#>" -) -``` - -```{r setup} -library(shinygouv) -``` - - - -# numericInput_dsfr_template - - - - - - - - - -# numericInput_dsfr - -```{r examples-numericInput_dsfr} -## Only run examples in interactive R sessions -if (interactive()) { - library(shiny) - library(shinygouv) - - ui <- fluidPage_dsfr( - header = header_dsfr( - intitule = "Intitule", - officiel = "Officiel", - nom_site_service = "Nom du site / service", - baseline = "baseline - precisions sur l organisation", - class = "fr-m-1w" - ), - title = "Exemple", - fluidRow_dsfr( - numericInput_dsfr( - inputId = "mynumericinput", - label = "Numeric input", - value = 12, - min = 0, - max = NA, - step = 2 - ), - verbatimTextOutput(outputId = "numericinputvalue") - ) - ) - server <- function(input, output, session) { - output$numericinputvalue <- renderText({ - paste("La valeur de l'input est", input$mynumericinput) - }) - } - - shinyApp(ui, server) -} -``` - -# updateNumericInput_dsfr - -```{r examples-upateNumericInput_dsfr} -## Only run examples in interactive R sessions -if (interactive()) { - library(shiny) - library(shinygouv) - - ui <- fluidPage_dsfr( - header = header_dsfr( - intitule = "Intitule", - officiel = "Officiel", - nom_site_service = "Nom du site / service", - baseline = "baseline - precisions sur l organisation", - class = "fr-m-1w" - ), - title = "Exemple", - fluidRow_dsfr( - numericInput_dsfr( - inputId = "mynumericinput", - label = "Numeric input", - value = 12, - min = 0, - max = NA, - step = 2 - ), - actionButton_dsfr( - inputId = "updateLabel", - label = "updateLabel" - ), - actionButton_dsfr( - inputId = "updateValue", - label = "updateValue" - ), - actionButton_dsfr( - inputId = "updateMin", - label = "updateMin à la valeur en cours" - ), - actionButton_dsfr( - inputId = "updateMax", - label = "updateMax à la valeur en cours" - ), - actionButton_dsfr( - inputId = "updateStep", - label = "updateStep" - ), - verbatimTextOutput(outputId = "numericinputvalue") - ) - ) - server <- function(input, output, session) { - output$numericinputvalue <- renderText({ - paste("La valeur de l'input est", input$mynumericinput) - }) - - r <- reactiveValues() - - observeEvent(input$mynumericinput, { - r$current_value <- input$mynumericinput - }) - - observeEvent(input$updateLabel, { - updateNumericInput_dsfr( - session = session, - inputId = "mynumericinput", - label = sample(LETTERS, 10) - ) - }) - - observeEvent(input$updateValue, { - updateNumericInput_dsfr( - session = session, - inputId = "mynumericinput", - value = sample(1:1000, size = 1) - ) - }) - - observeEvent(input$updateMin, { - updateNumericInput_dsfr( - session = session, - inputId = "mynumericinput", - min = r$current_value - ) - }) - - observeEvent(input$updateMax, { - updateNumericInput_dsfr( - session = session, - inputId = "mynumericinput", - max = r$current_value - ) - }) - - observeEvent(input$updateStep, { - updateNumericInput_dsfr( - session = session, - inputId = "mynumericinput", - step = sample(seq(0.1, 1, by = .1), size = 1) - ) - }) - } - - shinyApp(ui, server) -} -``` - diff --git a/vignettes/selectinput_dsfr.Rmd b/vignettes/selectinput_dsfr.Rmd deleted file mode 100644 index a68222fb..00000000 --- a/vignettes/selectinput_dsfr.Rmd +++ /dev/null @@ -1,153 +0,0 @@ ---- -title: "selectInput_dsfr" -output: rmarkdown::html_vignette -vignette: > - %\VignetteIndexEntry{selectinput_dsfr} - %\VignetteEngine{knitr::rmarkdown} - %\VignetteEncoding{UTF-8} ---- - -```{r, include = FALSE} -knitr::opts_chunk$set( - collapse = TRUE, - comment = "#>" -) -``` - -```{r setup} -library(shinygouv) -``` - - - -# selectInput_options_dsfr_template - - - - - - - -# selectInput_dsfr_template - - - - - - - - - -# selectInput_dsfr - -```{r examples-selectInput_dsfr} -## Only run examples in interactive R sessions -if (interactive()) { - library(shiny) - library(shinygouv) - - ui <- fluidPage_dsfr( - header = header_dsfr( - intitule = "Intitule", - officiel = "Officiel", - nom_site_service = "Nom du site / service", - baseline = "baseline - precisions sur l organisation", - class = "fr-m-1w" - ), - title = "Exemple", - fluidRow_dsfr( - # sans vecteur nommé - selectInput_dsfr( - inputId = "myselectInput", - label = "Mon label", - choices = c( - "cyl", - "am", - "gear" - ) - ), - fluidRow_dsfr( - # avec un vecteur nommé et une valeur sélectionnée - selectInput_dsfr( - inputId = "myselectInput2", - label = "Mon label2", - choices = c( - "Cylinders" = "cyl", - "Transmission" = "am", - "Gears" = "gear" - ), - selected = "gear" - ) - ) - ) - ) - server <- function(input, output, session) { - } - - shinyApp(ui, server) -} -``` - -# updateSelectInput_dsfr - - - -```{r example-updateSelectInput_dsfr} -## Only run examples in interactive R sessions -if (interactive()) { - library(shiny) - library(shinygouv) - - ui <- fluidPage_dsfr( - header = header_dsfr( - intitule = "Intitule", - officiel = "Officiel", - nom_site_service = "Nom du site / service", - baseline = "baseline - precisions sur l organisation", - class = "fr-m-1w" - ), - title = "Exemple", - fluidRow_dsfr( - selectInput_dsfr( - inputId = "variable", - label = "Variable:", - choices = c( - "Cylinders" = "cyl", - "Transmission" = "am", - "Gears" = "gear" - ) - ) - ), - fluidRow_dsfr( - actionButton_dsfr(inputId = "update", label = "update label") - ), - fluidRow_dsfr( - actionButton_dsfr(inputId = "update2", label = "update choices") - ), - fluidRow_dsfr( - actionButton_dsfr(inputId = "update3", label = "update selected") - ) - ) - server <- function(input, output, session) { - observeEvent(input$update, { - updateSelectInput_dsfr(inputId = "variable", label = "Nouveau label") - }) - - observeEvent(input$update2, { - updateSelectInput_dsfr(inputId = "variable", choices = LETTERS) - }) - - observeEvent(input$update3, { - updateSelectInput_dsfr(inputId = "variable", selected = LETTERS[12]) - }) - } - - shinyApp(ui, server) -} -``` - - - - - - diff --git a/vignettes/withspinner_dsfr.Rmd b/vignettes/withspinner_dsfr.Rmd deleted file mode 100644 index cff528c2..00000000 --- a/vignettes/withspinner_dsfr.Rmd +++ /dev/null @@ -1,81 +0,0 @@ ---- -title: "withSpinner_dsfr" -output: rmarkdown::html_vignette -vignette: > - %\VignetteIndexEntry{withspinner_dsfr} - %\VignetteEngine{knitr::rmarkdown} - %\VignetteEncoding{UTF-8} ---- - -```{r, include = FALSE} -knitr::opts_chunk$set( - collapse = TRUE, - comment = "#>" -) -``` - -```{r setup} -library(shinygouv) -``` - - - -# withSpinner html - -# showSpinner_dsfr - - - - - - -# hideSpinner_dsfr - - - -# withSpinner_dsfr - -```{r examples-withSpinner_dsfr} -if (interactive()) { - library(shiny) - library(shinygouv) - - ui <- fluidPage_dsfr( - header = header_dsfr( - intitule = "Intitule", - officiel = "Officiel", - nom_site_service = "Nom du site / service", - baseline = "baseline - precisions sur l organisation", - class = "fr-m-1w" - ), - title = "Exemple", - fluidRow_dsfr( - column_dsfr( - 0, - shiny::p("Exemple colonne") - ), - actionButton_dsfr( - inputId = "showspinner", - label = "Afficher le spinner pendant 5 secondes" - ) - ) - ) - - server <- function(input, output, session) { - observeEvent( - input$showspinner, - { - withSpinner_dsfr( - expr = { - message("Je vais m'afficher pendant 5 secondes") - Sys.sleep(5) - } - ) - } - ) - } - - shinyApp(ui, server) -} -``` -