diff --git a/R/app_ui.R b/R/app_ui.R index 0f91fd5..7e8b4bc 100644 --- a/R/app_ui.R +++ b/R/app_ui.R @@ -26,6 +26,13 @@ app_ui <- function(request){ z-index: 1000; /* Make sure it's above other UI elements */ } + /* quand l'icône est focus ou actif (sélectionné) */ + .bi-info-circle { + border: 2px solid white !important; + border-radius: 50%; + outline: none !important; + } + .navbar { position: relative; } @@ -44,6 +51,22 @@ app_ui <- function(request){ title = img(src = "www/logos_mapdo_evs_ofb.png"), windowTitle = "Mapd'O App", + header = tagList( + tags$head( + tags$style(HTML(" + /* texte des onglets */ + .navbar-nav > li > a { + font-size: 24px; /* augmenter taille */ + font-weight: bold; /* mettre en gras */ + color: #000000 !important; /* couleur texte */ + } + + /* barre du haut */ + .navbar { + background-color: #DEEDFF; /* gris clair */ + } + ")) + )), tabPanel("Exploration & Classification", icon = icon("compass"), # find more icons here: https://fontawesome.com/search?q=info&o=r&m=free mod_explore_ui("explore_1") ), diff --git a/R/fct_analysis_plots.R b/R/fct_analysis_plots.R index 85f4179..008ab07 100644 --- a/R/fct_analysis_plots.R +++ b/R/fct_analysis_plots.R @@ -293,7 +293,8 @@ analysis_plot_classes_distr <- function(df){ yaxis = list(title = "Pourcentage", showgrid = T, showticklabels = T), showlegend = TRUE # margin = list(b = 70, autoexpand = FALSE) - ) + )%>% + plotly::config(displaylogo = FALSE) # Remove plotly logo return(plot) } @@ -389,7 +390,8 @@ create_analysis_biplot <- function(df, metric_x, metric_y, classes = FALSE, lm = metric_x_title, get(metric_x), metric_y_title, get(metric_y), measure / 1000), # Convert measure to kilometers - hoverinfo = 'text') + hoverinfo = 'text')%>% + plotly::config(displaylogo = FALSE) # Remove plotly logo } @@ -415,7 +417,8 @@ create_analysis_biplot <- function(df, metric_x, metric_y, classes = FALSE, lm = xref = 'paper', yref = 'paper', # Use 'paper' units (relative to the plot) bgcolor = "#ffccd5", bordercolor = "#000", borderwidth = 1, font = list(size = 11) - )) + ))%>% + plotly::config(displaylogo = FALSE) # Remove plotly logo } diff --git a/R/fct_analysis_tables.R b/R/fct_analysis_tables.R index 4d397e1..74524a9 100644 --- a/R/fct_analysis_tables.R +++ b/R/fct_analysis_tables.R @@ -57,6 +57,7 @@ prepare_selact_stats_for_table <- function(data, .names = "{.col}_{.fn}")) %>% mutate(scale = "Axe", strahler = max(axis_data$strahler)) # Add the scale and strahler column + #browser() } # default and only France-scale stats @@ -101,6 +102,7 @@ prepare_selact_stats_for_table <- function(data, .default = scale )) %>% select(-scale) + #browser() #Go through here 3rd } #' Prepare metrics-statistics dataframe for reactable table for regions @@ -120,7 +122,7 @@ prepare_regions_stats_for_table <- function(data, region_names = NULL) { # if_else(strahler != 0, # paste0(r_names[level_name], ", Ordre ", strahler), # r_names[level_name])) - + #browser() #Go through here 1st return(df) } @@ -187,17 +189,16 @@ create_analysis_table <- function(df, vars, scale_name = "") { ) } - # Create the reactable table <- reactable( data = df, columns = columns_list, - height = 420, + height = "auto", defaultPageSize = 9, highlight = TRUE, # highlight rows on hover compact = TRUE, pagination = FALSE, striped = TRUE ) - + #browser() ##Go through here 2nd return(table) } diff --git a/R/fct_data.R b/R/fct_data.R index b1bd1e7..977deb6 100644 --- a/R/fct_data.R +++ b/R/fct_data.R @@ -319,28 +319,28 @@ data_get_distr_class <- function(con, class_name) { class_name == "class_urban" ~ "CASE WHEN built_environment_pc IS NULL THEN 'unvalid' - WHEN built_environment_pc >= 70 THEN 'fortement urbanisé' - WHEN built_environment_pc >= 40 THEN 'urbanisé' - WHEN built_environment_pc >= 10 THEN 'modérément urbanisé' - WHEN built_environment_pc >= 0 THEN 'Presque pas/pas urbanisé' + WHEN built_environment_pc >= 70 THEN 'Fortement urbanisé' + WHEN built_environment_pc >= 40 THEN 'Urbanisé' + WHEN built_environment_pc >= 10 THEN 'Modérément urbanisé' + WHEN built_environment_pc >= 0 THEN 'Presque pas/Pas urbanisé' ELSE 'unvalid' END AS class_name", class_name == "class_agriculture" ~ "CASE WHEN crops_pc IS NULL THEN 'unvalid' - WHEN crops_pc >= 70 THEN 'Forte impact agricole' - WHEN crops_pc >= 40 THEN 'Impact agricole élevé' - WHEN crops_pc >= 10 THEN 'Impact agricole modéré' - WHEN crops_pc >= 0 THEN 'Presque pas/pas d''impact agricole' + WHEN crops_pc >= 70 THEN 'Très Forte' + WHEN crops_pc >= 40 THEN 'Forte' + WHEN crops_pc >= 10 THEN 'Modéré' + WHEN crops_pc >= 0 THEN 'Basse/Absente' ELSE 'unvalid' END AS class_name", class_name == "class_nature" ~ "CASE WHEN natural_open_pc IS NULL OR forest_pc IS NULL OR grassland_pc IS NULL THEN 'unvalid' - WHEN (natural_open_pc + forest_pc + grassland_pc) >= 70 THEN 'Très forte utilisation naturelle' - WHEN (natural_open_pc + forest_pc + grassland_pc) >= 40 THEN 'Forte utilisation naturelle' - WHEN (natural_open_pc + forest_pc + grassland_pc) >= 10 THEN 'Utilisation naturelle modérée' - WHEN (natural_open_pc + forest_pc + grassland_pc) >= 0 THEN 'Presque pas/pas naturelle' + WHEN (natural_open_pc + forest_pc + grassland_pc) >= 70 THEN 'Très forte' + WHEN (natural_open_pc + forest_pc + grassland_pc) >= 40 THEN 'Forte' + WHEN (natural_open_pc + forest_pc + grassland_pc) >= 10 THEN 'Modérée' + WHEN (natural_open_pc + forest_pc + grassland_pc) >= 0 THEN 'Presque pas/Pas naturelle' ELSE 'unvalid' END AS class_name", class_name == "class_gravel" ~ @@ -354,19 +354,19 @@ data_get_distr_class <- function(con, class_name) { class_name == "class_confinement" ~ "CASE WHEN idx_confinement IS NULL THEN 'unvalid' - WHEN idx_confinement >= 0.7 THEN 'espace abondant' - WHEN idx_confinement >= 0.4 THEN 'modérement espace' - WHEN idx_confinement >= 0.1 THEN 'confiné' - WHEN idx_confinement >= 0 THEN 'très confiné' + WHEN idx_confinement >= 0.7 THEN 'Peu confiné' + WHEN idx_confinement >= 0.4 THEN 'Modérement confiné' + WHEN idx_confinement >= 0.1 THEN 'Confiné' + WHEN idx_confinement >= 0 THEN 'Très confiné' ELSE 'unvalid' END AS class_name", class_name == "class_habitat" ~ "CASE WHEN riparian_corridor_pc IS NULL OR semi_natural_pc IS NULL THEN 'unvalid' - WHEN (riparian_corridor_pc + semi_natural_pc) >= 70 THEN 'très bien connecté' - WHEN (riparian_corridor_pc + semi_natural_pc) >= 40 THEN 'bien connecté' - WHEN (riparian_corridor_pc + semi_natural_pc) >= 10 THEN 'moyen connecté' - WHEN (riparian_corridor_pc + semi_natural_pc) >= 0 THEN 'faible / absente' + WHEN (riparian_corridor_pc + semi_natural_pc) >= 70 THEN 'Élevée' + WHEN (riparian_corridor_pc + semi_natural_pc) >= 40 THEN 'Bonne' + WHEN (riparian_corridor_pc + semi_natural_pc) >= 10 THEN 'Moyenne' + WHEN (riparian_corridor_pc + semi_natural_pc) >= 0 THEN 'Faible/Absente' ELSE 'unvalid' END AS class_name", .default = NULL @@ -772,59 +772,59 @@ data_get_axis_dgos <- function(selected_axis_id, con) { -- Urban Land Use Classification CASE WHEN built_environment_pc IS NULL THEN 'unvalid' - WHEN built_environment_pc >= 70 THEN 'fortement urbanisé' - WHEN built_environment_pc >= 40 THEN 'urbanisé' - WHEN built_environment_pc >= 10 THEN 'modérément urbanisé' - WHEN built_environment_pc >= 0 THEN 'Presque pas/pas urbanisé' + WHEN built_environment_pc >= 70 THEN 'Fortement urbanisé' + WHEN built_environment_pc >= 40 THEN 'Urbanisé' + WHEN built_environment_pc >= 10 THEN 'Modérément urbanisé' + WHEN built_environment_pc >= 0 THEN 'Presque pas/Pas urbanisé' ELSE 'unvalid' END AS class_urban, -- Agricultural Land Use Classification CASE WHEN crops_pc IS NULL THEN 'unvalid' - WHEN crops_pc >= 70 THEN 'Forte impact agricole' - WHEN crops_pc >= 40 THEN 'Impact agricole élevé' - WHEN crops_pc >= 10 THEN 'Impact agricole modéré' - WHEN crops_pc >= 0 THEN 'Presque pas/pas d''impact agricole' + WHEN crops_pc >= 70 THEN 'Très Forte' + WHEN crops_pc >= 40 THEN 'Forte' + WHEN crops_pc >= 10 THEN 'Modéré' + WHEN crops_pc >= 0 THEN 'Basse/Absente' ELSE 'unvalid' END AS class_agriculture, -- Natural Land Use Classification CASE WHEN natural_open_pc IS NULL OR forest_pc IS NULL OR grassland_pc IS NULL THEN 'unvalid' - WHEN (natural_open_pc + forest_pc + grassland_pc) >= 70 THEN 'Très forte utilisation naturelle' - WHEN (natural_open_pc + forest_pc + grassland_pc) >= 40 THEN 'Forte utilisation naturelle' - WHEN (natural_open_pc + forest_pc + grassland_pc) >= 10 THEN 'Utilisation naturelle modérée' - WHEN (natural_open_pc + forest_pc + grassland_pc) >= 0 THEN 'Presque pas/pas naturelle' + WHEN (natural_open_pc + forest_pc + grassland_pc) >= 70 THEN 'Très forte' + WHEN (natural_open_pc + forest_pc + grassland_pc) >= 40 THEN 'Forte' + WHEN (natural_open_pc + forest_pc + grassland_pc) >= 10 THEN 'Modérée' + WHEN (natural_open_pc + forest_pc + grassland_pc) >= 0 THEN 'Presque pas/Pas naturelle' ELSE 'unvalid' END AS class_nature, -- Gravel Bars Classification CASE WHEN gravel_bars IS NULL OR water_channel IS NULL THEN 'unvalid' - WHEN (gravel_bars / NULLIF(water_channel + gravel_bars, 0)) >= 0.5 THEN 'abundant' - WHEN (gravel_bars / NULLIF(water_channel + gravel_bars, 0)) > 0 THEN 'moyennement présente' - WHEN (gravel_bars / NULLIF(water_channel + gravel_bars, 0)) = 0 THEN 'absent' + WHEN (gravel_bars / NULLIF(water_channel + gravel_bars, 0)) >= 0.5 THEN 'Fréquent' + WHEN (gravel_bars / NULLIF(water_channel + gravel_bars, 0)) > 0 THEN 'Occasionnel' + WHEN (gravel_bars / NULLIF(water_channel + gravel_bars, 0)) = 0 THEN 'Absent' ELSE 'unvalid' END AS class_gravel, -- Confinement Classification CASE WHEN idx_confinement IS NULL THEN 'unvalid' - WHEN idx_confinement >= 0.7 THEN 'espace abondant' - WHEN idx_confinement >= 0.4 THEN 'modérement espace' - WHEN idx_confinement >= 0.1 THEN 'confiné' - WHEN idx_confinement >= 0 THEN 'très confiné' + WHEN idx_confinement >= 0.7 THEN 'Peu confiné' + WHEN idx_confinement >= 0.4 THEN 'Modérément confiné' + WHEN idx_confinement >= 0.1 THEN 'Confiné' + WHEN idx_confinement >= 0 THEN 'Très confiné' ELSE 'unvalid' END AS class_confinement, -- Habitat Classification CASE WHEN riparian_corridor_pc IS NULL OR semi_natural_pc IS NULL THEN 'unvalid' - WHEN (riparian_corridor_pc + semi_natural_pc) >= 70 THEN 'très bien connecté' - WHEN (riparian_corridor_pc + semi_natural_pc) >= 40 THEN 'bien connecté' - WHEN (riparian_corridor_pc + semi_natural_pc) >= 10 THEN 'moyen connecté' - WHEN (riparian_corridor_pc + semi_natural_pc) >= 0 THEN 'faible / absente' + WHEN (riparian_corridor_pc + semi_natural_pc) >= 70 THEN 'Élevée' + WHEN (riparian_corridor_pc + semi_natural_pc) >= 40 THEN 'Bonne' + WHEN (riparian_corridor_pc + semi_natural_pc) >= 10 THEN 'Moyenne' + WHEN (riparian_corridor_pc + semi_natural_pc) >= 0 THEN 'Faible/Absente' ELSE 'unvalid' END AS class_habitat FROM network_metrics @@ -916,59 +916,59 @@ data_get_axis_dgos_from_region <- function(selected_region_id, con) { -- Urban Land Use Classification CASE WHEN built_environment_pc IS NULL THEN 'unvalid' - WHEN built_environment_pc >= 70 THEN 'fortement urbanisé' - WHEN built_environment_pc >= 40 THEN 'urbanisé' - WHEN built_environment_pc >= 10 THEN 'modérément urbanisé' - WHEN built_environment_pc >= 0 THEN 'Presque pas/pas urbanisé' + WHEN built_environment_pc >= 70 THEN 'Fortement urbanisé' + WHEN built_environment_pc >= 40 THEN 'Urbanisé' + WHEN built_environment_pc >= 10 THEN 'Modérément urbanisé' + WHEN built_environment_pc >= 0 THEN 'Presque pas/Pas urbanisé' ELSE 'unvalid' END AS class_urban, -- Agricultural Land Use Classification CASE WHEN crops_pc IS NULL THEN 'unvalid' - WHEN crops_pc >= 70 THEN 'Forte impact agricole' - WHEN crops_pc >= 40 THEN 'Impact agricole élevé' - WHEN crops_pc >= 10 THEN 'Impact agricole modéré' - WHEN crops_pc >= 0 THEN 'Presque pas/pas d''impact agricole' + WHEN crops_pc >= 70 THEN 'Très Forte' + WHEN crops_pc >= 40 THEN 'Forte' + WHEN crops_pc >= 10 THEN 'Modéré' + WHEN crops_pc >= 0 THEN 'Basse/Absente' ELSE 'unvalid' END AS class_agriculture, -- Natural Land Use Classification CASE WHEN natural_open_pc IS NULL OR forest_pc IS NULL OR grassland_pc IS NULL THEN 'unvalid' - WHEN (natural_open_pc + forest_pc + grassland_pc) >= 70 THEN 'Très forte utilisation naturelle' - WHEN (natural_open_pc + forest_pc + grassland_pc) >= 40 THEN 'Forte utilisation naturelle' - WHEN (natural_open_pc + forest_pc + grassland_pc) >= 10 THEN 'Utilisation naturelle modérée' - WHEN (natural_open_pc + forest_pc + grassland_pc) >= 0 THEN 'Presque pas/pas naturelle' + WHEN (natural_open_pc + forest_pc + grassland_pc) >= 70 THEN 'Très forte' + WHEN (natural_open_pc + forest_pc + grassland_pc) >= 40 THEN 'Forte' + WHEN (natural_open_pc + forest_pc + grassland_pc) >= 10 THEN 'Modérée' + WHEN (natural_open_pc + forest_pc + grassland_pc) >= 0 THEN 'Presque pas/Pas naturelle' ELSE 'unvalid' END AS class_nature, -- Gravel Bars Classification CASE WHEN gravel_bars IS NULL OR water_channel IS NULL THEN 'unvalid' - WHEN (gravel_bars / NULLIF(water_channel + gravel_bars, 0)) >= 0.5 THEN 'abundant' - WHEN (gravel_bars / NULLIF(water_channel + gravel_bars, 0)) > 0 THEN 'moyennement présente' - WHEN (gravel_bars / NULLIF(water_channel + gravel_bars, 0)) = 0 THEN 'absent' + WHEN (gravel_bars / NULLIF(water_channel + gravel_bars, 0)) >= 0.5 THEN 'Fréquent' + WHEN (gravel_bars / NULLIF(water_channel + gravel_bars, 0)) > 0 THEN 'Occasionnel' + WHEN (gravel_bars / NULLIF(water_channel + gravel_bars, 0)) = 0 THEN 'Absent' ELSE 'unvalid' END AS class_gravel, -- Confinement Classification CASE WHEN idx_confinement IS NULL THEN 'unvalid' - WHEN idx_confinement >= 0.7 THEN 'espace abondant' - WHEN idx_confinement >= 0.4 THEN 'modérement espace' - WHEN idx_confinement >= 0.1 THEN 'confiné' - WHEN idx_confinement >= 0 THEN 'très confiné' + WHEN idx_confinement >= 0.7 THEN 'Peu confiné' + WHEN idx_confinement >= 0.4 THEN 'Modérément confiné' + WHEN idx_confinement >= 0.1 THEN 'Confiné' + WHEN idx_confinement >= 0 THEN 'Très confiné' ELSE 'unvalid' END AS class_confinement, -- Habitat Classification CASE WHEN riparian_corridor_pc IS NULL OR semi_natural_pc IS NULL THEN 'unvalid' - WHEN (riparian_corridor_pc + semi_natural_pc) >= 70 THEN 'très bien connecté' - WHEN (riparian_corridor_pc + semi_natural_pc) >= 40 THEN 'bien connecté' - WHEN (riparian_corridor_pc + semi_natural_pc) >= 10 THEN 'moyen connecté' - WHEN (riparian_corridor_pc + semi_natural_pc) >= 0 THEN 'faible / absente' + WHEN (riparian_corridor_pc + semi_natural_pc) >= 70 THEN 'Élevée' + WHEN (riparian_corridor_pc + semi_natural_pc) >= 40 THEN 'Bonne' + WHEN (riparian_corridor_pc + semi_natural_pc) >= 10 THEN 'Moyenne' + WHEN (riparian_corridor_pc + semi_natural_pc) >= 0 THEN 'Faible/Absente' ELSE 'unvalid' END AS class_habitat FROM network_metrics diff --git a/R/fct_map.R b/R/fct_map.R index 27d38d7..4f1637e 100644 --- a/R/fct_map.R +++ b/R/fct_map.R @@ -521,11 +521,11 @@ map_add_axes <- function(map, data_axis, group, selected_axis_id = NULL) { #' #' @return An updated Leaflet map with axis data added. #' @export -map_add_axis_dgos <- function(map, axis_data, group) { - +map_add_axis_dgos <- function(map, axis_data, Proposed_class, group) { # create HTML conditional tooltip labels tooltip_label <- lapply(paste0(' ', axis_data$toponyme, '
', - ' ', round(axis_data$measure/1000, 2), ' km depuis l\'exutoire', ' '), + ' ', round(axis_data$measure/1000, 2), ' km depuis l\'exutoire', '
', + ' Classe : ', axis_data[[Proposed_class]], ' '), htmltools::HTML) map %>% diff --git a/R/fct_params.R b/R/fct_params.R index b73bbe0..04e6662 100644 --- a/R/fct_params.R +++ b/R/fct_params.R @@ -271,15 +271,15 @@ params_classes <- function() { ), description = c( # strahler - "Répresent la complexité du réseaux hydrographique. L'ordre de Strahler est de 1 pour tout cours d'eau entre sa source et sa première confluence et mont avec chaque confluence.", + "Représente la complexité du réseaux hydrographique. L'ordre de Strahler est de 1 pour tout cours d'eau entre sa source et sa première confluence et mont avec chaque confluence.", # topographie "Classification simple basée sur la pente et la hauteur du cours de la rivière : - - plaines de basse altitude (> 0 m & < 0.5 % pente) - - plaines de moyenne altitude (> 300 m & < 0.5 % pente) - - plaines de montagne (> 1000 m & < 0.5 % pente) - - pentes de basse altitude (> 0 m & > 0.5 % pente) - - pentes de moyenne altitude (> 300 m & > 0.5 % pente) - - pentes de montagne (> 1000 m & > 0.5 % pente) + - Plaines de basse altitude (> 0 m & < 0.5 % pente) + - Plaines de moyenne altitude (> 300 m & < 0.5 % pente) + - Plaines de montagne (> 1000 m & < 0.5 % pente) + - Pentes de basse altitude (> 0 m & > 0.5 % pente) + - Pentes de moyenne altitude (> 300 m & > 0.5 % pente) + - Pentes de montagne (> 1000 m & > 0.5 % pente) ", # dominant land use "Indique la classe d'utilisation des sols la plus dominante dans la zone du fond de vallée de chaque segment de cours d'eau : @@ -290,39 +290,39 @@ params_classes <- function() { ", # urban areas "Indique le degré de couverture urbaine du fond de vallée du segment : - - fortement urbanisé (> 70 % zones construites) - - urbanisé (> 40 % zones construites) - - modérément urbanisé (> 10 % zones construites) - - Presque pas/pas urbanisé (< 10 % zones construites)", + - Fortement urbanisé (> 70 % zones construites) + - Urbanisé (> 40 % zones construites) + - Modérément urbanisé (> 10 % zones construites) + - Presque pas/Pas urbanisé (< 10 % zones construites)", # agriculture "indique la part de l'utilisation des terres agricoles dans la zone du fond de vallée de chaque segment de cours d'eau - - Forte impact agricole (> 70 % cultures) - - Impact agricole élevé (> 40 % cultures) - - Impact agricole modéré (> 10 % cultures) - - Presque pas/pas d'impact agricole (< 10 % cultures)", + - Très Forte (> 70 % cultures) + - Très élevé (> 40 % cultures) + - Modéré (> 10 % cultures) + - Basse/Absente (< 10 % cultures)", # natural "indique la part de l'occupation naturelle des sols dans la zone du fond de vallée de chaque tronçon fluvial : - Très forte utilisation naturelle (> 70 % espaces naturels) - Forte utilisation naturelle (> 40 % espaces naturels) - Utilisation naturelle modérée (> 10 % espaces naturels) - - Presque pas/pas naturelle (< 10 % espaces naturels)", + - Presque pas/Pas naturelle (< 10 % espaces naturels)", # gravel bars "la présence de bancs sédimentaires. Basé sur le ratio entre la surface des sédiments et la surface du chenal actif, qui se compose des surfaces de sédiments et d'eau : - Absent (pas des bancs sédimentaires) - - occasionnel (bancs sédimentaires < 50 % du chenal actif) - - fréquent (bancs sédimentaires >= 50 % du chenal actif)", + - Occasionnel (bancs sédimentaires < 50 % du chenal actif) + - Fréquent (bancs sédimentaires >= 50 % du chenal actif)", # confinement "Indique le dégrée du confinement du chenal actif. Basé sur le ratio entre la largeur du chenal actif et la largeur du fond de la vallée. - - espace abondant (chenal actif > 70 % du fond de la vallée) - - modérement espace (chenal actif > 40 % du fond de la vallée) - - confiné (chenal actif > 10 % du fond de la vallée) - - très confiné (chenal actif < 10 % du fond de la vallée)", + - Peu confiné (chenal actif > 70 % du fond de la vallée) + - Modérement confiné (chenal actif > 40 % du fond de la vallée) + - Confiné (chenal actif > 10 % du fond de la vallée) + - Très confiné (chenal actif < 10 % du fond de la vallée)", # habitat connectivity "Indique la présence d'un corridor riverain naturel. Basé sur ratio de la surface du corridor connecté (comprenant le chenal actif, le corridor naturel et les corridors semi-naturels) et le fond de la vallée : - - très bien connecté (>= 70 %) - - bien connecté (>= 40 %) - - moyen connecté (>= 10 % ) - - faible / absente (< 10 %)" + - Élevée (>= 70 %) + - Bonne (>= 40 %) + - Moyenne (>= 10 % ) + - Faible/Absente (< 10 %)" ), class_name = c( "class_strahler", @@ -477,7 +477,7 @@ params_classes_colors <- function() { setNames(c(1,2,3,4,5,6)) # TOPOGRAPHY - df$class_topographie <- c( "#bb3e03", "#e9d8a6", "#a3b18a", + df$class_topographie <- c( "#bb3e03", "#85ba55", "#2ca555", "#780000","#ee9b00", "#3a5a40") %>% setNames( c("Plaines de montagne", @@ -495,39 +495,39 @@ params_classes_colors <- function() { # URBAN df$class_urban <- c("#6a040f", "#dc2f02", "#ffdd00", "#74c69d") %>% setNames( - c("fortement urbanisé", "urbanisé", "modérément urbanisé", "Presque pas/pas urbanisé") + c("Fortement urbanisé", "Urbanisé", "Modérément urbanisé", "Presque pas/Pas urbanisé") ) - # AGRICULTURE + # AGRICULTURE / impact agricole df$class_agriculture <- c("#6a040f", "#dc2f02", "#ffdd00", "#74c69d") %>% setNames( - c("Forte impact agricole", "Impact agricole élevé", - "Impact agricole modéré", "Presque pas/pas d'impact agricole") + c("Très Forte", "Forte", + "Modéré", "Basse/Absente") ) - # NATURE + # NATURE / utilisation naturelle df$class_nature <- c("#081c15", "#2d6a4f", "#74c69d", "#d8f3dc") %>% setNames( - c("Très forte utilisation naturelle", "Forte utilisation naturelle", - "Utilisation naturelle modérée", "Presque pas/pas naturelle") + c("Très forte", "Forte", + "Modérée", "Presque pas/Pas naturelle") ) # GRAVEL BARS df$class_gravel <- c("#603808", "#e7bc91", "#0077b6") %>% setNames( - c("abundant", "moyennement présente", "absent") + c("Fréquent", "Occasionnel", "Absent") ) # CONFINEMENT df$class_confinement <- c("#2d6a4f", "#99d98c", "#ffdd00", "#ba181b") %>% setNames( - c("espace abondant", "modérement espace", "confiné", "très confiné") + c("Peu confiné", "Modérément confiné", "Confiné", "Très confiné") ) # HABITAT CONNECTIVITY df$class_habitat <- c("#2d6a4f", "#99d98c", "#ffdd00", "#ba181b") %>% setNames( - c("très bien connecté", "bien connecté", "moyen connecté", "faible / absente") + c("Élevée", "Bonne", "Moyenne", "Faible/Absente") ) return(df) diff --git a/R/fct_plot_crosssection.R b/R/fct_plot_crosssection.R index 14a3c4e..a9586f1 100644 --- a/R/fct_plot_crosssection.R +++ b/R/fct_plot_crosssection.R @@ -43,7 +43,7 @@ cr_profile_empty <- function() { #' #' @return plotly cross section plot. #' @export -cr_profile_main <- function(data, axis_toponyme){ +cr_profile_main <- function(data, selected_dgo, axis_toponyme){ section <- plot_ly(data = data, x = ~distance, y = ~profile, type = 'scatter', yaxis = 'y1', key = data$id, # the "id" column for hover text mode = 'lines+markers', fill = 'tozeroy', fillcolor = '#B0B0B0', @@ -67,6 +67,11 @@ cr_profile_main <- function(data, axis_toponyme){ xref = "paper", yref = "paper", showarrow = FALSE, font = list(size = 14, weight = "bold") ), + list( + text = paste(round(selected_dgo$measure/1000, 2)," km depuis l'exutoire ", sep = ""), x = 0.5, y = 1.1, + xref = "paper", yref = "paper", showarrow = FALSE, + font = list(size = 14, weight = "bold") + ), list( text = axis_toponyme, x = 1, y = -0.18, xref = "paper", yref = "paper", showarrow = FALSE, diff --git a/R/mod_analysis.R b/R/mod_analysis.R index f27d795..a359a87 100644 --- a/R/mod_analysis.R +++ b/R/mod_analysis.R @@ -21,7 +21,8 @@ mod_analysis_ui <- function(id){ tags$head( tags$style( HTML(" - .form-group{margin-bottom: 10px} + .form-group{} + .nav-pills > li > a {line-height: 5%;} ") ) ), # head @@ -32,20 +33,20 @@ mod_analysis_ui <- function(id){ # show table with France, basin, region (+ same stats but just for the strahler order of selected axis), # stats together with selected axis # below show distribution plots of selection - fluidRow( - style = "margin-top: 10px; margin-bottom: 10px; margin-left: 10px;", - textOutput(ns("selection_textUI")), + fluidRow(style = "margin-top: 2px; margin-bottom: 2px", column( width = 9, hr(), # horizontal line - uiOutput(ns("selact_tableUI")) %>% shinycssloaders::withSpinner(type = 8, caption = "Calculs en cours..."), # overview table + fluidRow(style = "margin-top: 2px; margin-bottom: 0px", + uiOutput(ns("selact_tableUI")) %>% shinycssloaders::withSpinner(type = 8, caption = "Calculs en cours...")), # overview table hr(), # horizontal line - fluidRow(style = "margin-top: 20px;"), - plotlyOutput(ns("selact_plotUI")) %>% shinycssloaders::withSpinner(type = 8, caption = "Calculs en cours..."), # distribution plot + textOutput(ns("selection_textUI")), + fluidRow(style = "margin-top:2px; margin-bottom: 0px;"), + plotlyOutput(ns("selact_plotUI")) %>% shinycssloaders::withSpinner(type = 8, caption = "Calculs en cours..."), # distribution plot ), column( width = 3, - div( + div(style = "height: 20%;", id = ns("selact_modifications"), multiInput( inputId = ns("selact_metric_select"), @@ -66,14 +67,15 @@ mod_analysis_ui <- function(id){ ))), tabPanel("Comparaison des Régions", fluidRow( - style = "margin-top: 10px; margin-bottom: 10px; margin-left: 10px;", + style = "margin-top: 2px; margin-bottom: 2px; margin-left: 2px;", column( width = 9, hr(), # horizontal line + fluidRow(style = "margin-top: 5px; margin-bottom: 10px;"), reactableOutput(ns("regions_table"), width = "100%") %>% shinycssloaders::withSpinner(type = 8, caption = "Calculs en cours..."), hr(), - fluidRow(style = "margin-top: 20px;"), - plotlyOutput(ns("regions_plotUI"), width = "100%") %>% shinycssloaders::withSpinner(type = 8, caption = "Calculs en cours...") + fluidRow(style = "margin-top: 12px; margin-bottom: 2px;"), + #plotlyOutput(ns("regions_plotUI"), width = "100%") %>% shinycssloaders::withSpinner(type = 8, caption = "Calculs en cours...") ), column( width = 3, @@ -96,7 +98,7 @@ mod_analysis_ui <- function(id){ actionButton(inputId = ns("regions_apply_button"), "Actualiser") ) ) - ) + ), ), tabPanel("Analyse Bimétrique", mod_analysis_bimetric_ui("analysis_bimetric_1") diff --git a/R/mod_analysis_bimetric.R b/R/mod_analysis_bimetric.R index 992e3d0..cdd7af4 100644 --- a/R/mod_analysis_bimetric.R +++ b/R/mod_analysis_bimetric.R @@ -37,7 +37,7 @@ mod_analysis_bimetric_ui <- function(id) { span( style = "display: flex; margin-left: 10px; margin-top: 20px", popover( - trigger = bsicons::bs_icon("info-circle"), + trigger = bsicons::bs_icon("info-circle", size="1.5rem", class = "text-primary"), "", placement = "right", id = ns("popover_metric_x") @@ -52,7 +52,7 @@ mod_analysis_bimetric_ui <- function(id) { span( style = "display: flex; margin-left: 10px; margin-top: 20px", popover( - trigger = bsicons::bs_icon("info-circle"), + trigger = bsicons::bs_icon("info-circle", size="1.5rem", class = "text-primary"), "", placement = "right", id = ns("popover_metric_y") @@ -67,7 +67,7 @@ mod_analysis_bimetric_ui <- function(id) { span( style = "display: flex; margin-left: 10px; margin-top: -5px", popover( - trigger = bsicons::bs_icon("info-circle"), + trigger = bsicons::bs_icon("info-circle", size="1.5rem", class = "text-primary"), "", placement = "right", id = ns("popover_lm") diff --git a/R/mod_download.R b/R/mod_download.R index 7ab5cf5..0385e0c 100644 --- a/R/mod_download.R +++ b/R/mod_download.R @@ -14,7 +14,19 @@ mod_download_ui <- function(id) { tags$head( tags$style( HTML(" - .form-group{margin-bottom: 10px} + .form-group{margin-bottom: 5px} + .nav-pills > li > a {line-height: 5%;} + .sticky-table thead th { + position: sticky; + top: 0; + background-color: white; + z-index: 2; + } + .sticky-wrapper { + height: 300px; /* zone scrollable */ + overflow-y: scroll; + border: 1px solid #ccc; + } ") ) ), # head @@ -63,7 +75,8 @@ mod_download_ui <- function(id) { ), # table - div(style = 'overflow-x: auto; width: 100%;', # Horizontal scroll and full-width div + div(class = "sticky-wrapper", + class = "sticky-table", style = 'overflow-x: auto; width: 100%; height: 75vh', # Horizontal scroll and full-width div tableOutput(ns("table_data")) ), ) diff --git a/R/mod_expl_classes_manual.R b/R/mod_expl_classes_manual.R index a1e33b4..77d341a 100644 --- a/R/mod_expl_classes_manual.R +++ b/R/mod_expl_classes_manual.R @@ -22,7 +22,7 @@ mod_expl_classes_manual_ui <- function(id){ id = ns("manual_classificationUI"), fluidRow( style = "margin-top: 10px;", - uiOutput(ns("metric_selectUI")) + uiOutput(ns("metric_selectUI"))%>% shinycssloaders::withSpinner(type = 1, caption = "Construction...") ), fluidRow( style = "margin-bottom: 0px; padding-bottom: 0px;", @@ -77,7 +77,7 @@ mod_expl_classes_manual_server <- function(id, con, r_val, globals){ span( style = "display: flex; margin-left: 10px; margin-top: -10px", popover( - trigger = bsicons::bs_icon("info-circle"), + trigger = bsicons::bs_icon("info-circle", size="1.5rem", class = "text-primary"), "", placement = "right", id = ns("popover_metric") diff --git a/R/mod_expl_classes_proposed.R b/R/mod_expl_classes_proposed.R index 24b1613..70bfc85 100644 --- a/R/mod_expl_classes_proposed.R +++ b/R/mod_expl_classes_proposed.R @@ -87,6 +87,16 @@ mod_expl_classes_proposed_server <- function(id, r_val, globals){ assign_classes_proposed(proposed_class = globals$classes_proposed[r_val$classes_proposed_selected,]$class_name, colors_df = globals$classes_proposed_colors) } + + # reload of the tooltip_label for the axis dgo + if(r_val$selection_text != ""){ + if(r_val$classes_proposed_selected!=1){ + r_val$map_proxy %>% + map_add_axis_dgos(globals$axis_data(), + Proposed_class = globals$classes_proposed[r_val$classes_proposed_selected,]$class_name, + group = globals$map_group_params[["dgo_axis"]]) + } + } }) }) diff --git a/R/mod_expl_plot_crosssection.R b/R/mod_expl_plot_crosssection.R index 746d0ba..aeb2830 100644 --- a/R/mod_expl_plot_crosssection.R +++ b/R/mod_expl_plot_crosssection.R @@ -43,6 +43,7 @@ mod_expl_plot_crosssection_server <- function(id, r_val){ # check if dgo is selected if (!is.null(r_val$swath_data_section)) { r_val_locals$section = cr_profile_main(data = r_val$swath_data_section, + selected_dgo = r_val$swath_data_dgo, axis_toponyme = r_val$axis_name) } diff --git a/R/mod_expl_plot_long.R b/R/mod_expl_plot_long.R index 07dd30b..7898a61 100644 --- a/R/mod_expl_plot_long.R +++ b/R/mod_expl_plot_long.R @@ -32,7 +32,7 @@ mod_expl_plot_long_ui <- function(id){ uiOutput(ns("profile_backgroundUI")), uiOutput(ns("profile_background_smoothUI")), uiOutput(ns("profile_background_smooth_selUI"), - style = "margin-left : 23px;") + style = "margin-left : 15px;") ) ) ) @@ -102,7 +102,7 @@ mod_expl_plot_long_server <- function(id, r_val, globals){ span( style = "display: flex; margin-left: 10px; margin-top: 20px", popover( - trigger = bsicons::bs_icon("info-circle"), + trigger = bsicons::bs_icon("info-circle", size="1.5rem", class = "text-primary"), "", placement = "right", id = ns("popover_metric") @@ -122,7 +122,7 @@ mod_expl_plot_long_server <- function(id, r_val, globals){ span( style = "margin-left: 10px; margin-top: 20px", popover( - trigger = bsicons::bs_icon("info-circle"), + trigger = bsicons::bs_icon("info-circle", size="1.5rem", class = "text-primary"), "", placement = "right", id = ns("popover_metric2") @@ -149,12 +149,24 @@ mod_expl_plot_long_server <- function(id, r_val, globals){ # selectinput for background classification smoothing output$profile_background_smooth_selUI <- renderUI({ - r_val_local$ui_background_smooth_sel + if (!is.null(r_val_local$ui_background_smooth_sel)) { + div( + style = "display: flex; align-items: center", + r_val_local$ui_background_smooth_sel, + span( + style = "margin-left: 10px; margin-bottom: -10px; margin-top: 20px", + popover( + trigger = bsicons::bs_icon("info-circle", size="1.5rem", class = "text-primary"), + "", + placement = "right", + id = ns("popover_metric3") + ) + ) + ) + } }) - - # make plot available to other observe({ r_val$plot_long_proxy <- plotlyProxy("long_profile") @@ -209,6 +221,23 @@ mod_expl_plot_long_server <- function(id, r_val, globals){ } }) + ## update infobutton when metric selected changes for the homogeneisation "singuliers" et "en paires" + observe({ + if (!is.null(input$background_profile)) { + update_popover("popover_metric3", + HTML( + # check if no metric is selected + if (is.null(input$background_smooth_sel)){ + "Permet l'affichage en fond de la classification" + } else if (input$background_smooth_sel == "singuliers") { + "description de l'homogénéisation dites singuliers" + } else { + "description de l'homogénéisation dites en paires" + } + )) + } + }) + #### plot 1st metric #### observeEvent(c(!is.null(input$profile_first_metric), globals$axis_data()), { diff --git a/R/mod_explore.R b/R/mod_explore.R index c499e66..f168657 100644 --- a/R/mod_explore.R +++ b/R/mod_explore.R @@ -28,9 +28,10 @@ mod_explore_ui <- function(id){ tags$head( tags$style( HTML(" - .form-group{margin-bottom: 10px} + .form-group{margin-bottom: 5px} + .nav-pills > li > a {line-height: 5%;} ") - ) + ) # style ), # head fluidRow( column( @@ -424,7 +425,7 @@ mod_explore_server <- function(id, con, r_val, globals, waitress){ # add axis to map r_val$map_proxy %>% map_add_axes(globals$axes(), group = globals$map_group_params[["axis"]], selected_axis_id = r_val$axis_id) %>% - map_add_axis_dgos(globals$axis_data(), group = globals$map_group_params[["dgo_axis"]]) %>% + map_add_axis_dgos(globals$axis_data(), Proposed_class = globals$classes_proposed[r_val$classes_proposed_selected,]$class_name, group = globals$map_group_params[["dgo_axis"]]) %>% map_add_axis_start_end(axis_start_end = r_val$axis_start_end, group = globals$map_group_params[["axis_start_end"]]) %>% clearGroup(globals$map_group_params[["dgo"]]) diff --git a/R/mod_help_guide.R b/R/mod_help_guide.R index 128d516..18788f9 100644 --- a/R/mod_help_guide.R +++ b/R/mod_help_guide.R @@ -13,7 +13,20 @@ mod_help_guide_ui <- function(id) { ns <- NS(id) tagList( - actionButton(ns("help_btn"), " Aide", + tags$head( + tags$style(HTML(" + .highlight-on-start { + animation: pulseGlow 2.5s ease-in-out 100; + } + + @keyframes pulseGlow { + 0% { box-shadow: 0 0 5px 2px #2e61d9; } + 50% { box-shadow: 0 0 20px 8px #2e61d9; } + 100% { box-shadow: 0 0 5px 2px #2e61d9; } + } +")) + ), + actionButton(ns("help_btn"), " Aide", class = "btn-primary highlight-on-start", icon = icon("circle-question")), use_cicerone() # Load the cicerone dependencies ) @@ -28,8 +41,6 @@ mod_help_guide_server <- function(id, r_val){ moduleServer(id, function(input, output, session){ ns <- session$ns - - # Set up a dynamic observer based on the active tab observeEvent(input$help_btn, { @@ -83,7 +94,7 @@ mod_help_guide_server <- function(id, r_val){ if (r_val$tab_classes == "Classification manuelle") { tour$step("expl_classes_manual_1-manual_classificationUI", "Classification manuelle", - description = "Créez une classification basée sur une mesure spécifique. Choisissez d'abord une métrique, puis éditez les noms de classe, les seuils et les couleurs pour chaque classe. Les seuils initiaux des classes sont, pour exclure les valeurs aberrantes, basés sur le quantile à 95 % de la métrique correspondante pour l'ensemble du réseau français. En cliquant sur la flèche en haut à droite, vous pouvez ajuster l'étendue du quantile ou la base de l'échelle. En outre, vous pouvez définir le nombre de classes que vous souhaitez appliquer. Des informations sur la métrique sélectionnée peuvent être obtenues en cliquant sur le bouton info à côté de la sélection de la métrique.", + description = "Créez une classification basée sur une mesure spécifique. Choisissez d'abord une métrique, puis éditez les noms de classe, les seuils et les couleurs pour chaque classe. Les seuils initiaux des classes sont, pour exclure les valeurs aberrantes, basés sur le quantile à 95 % de la métrique correspondante pour l'ensemble du réseau français. En cliquant sur la flèche en haut à droite, vous pouvez ajuster l'étendue du quantile ou la base de l'échelle. En outre, vous pouvez définir le nombre de classes que vous souhaitez appliquer dans la flèche en-dessous du i d'information. Des informations sur la métrique sélectionnée peuvent être obtenues en cliquant sur le bouton info à côté de la sélection de la métrique.", position = "left") } diff --git a/man/cr_profile_main.Rd b/man/cr_profile_main.Rd index d45464f..55d93fd 100644 --- a/man/cr_profile_main.Rd +++ b/man/cr_profile_main.Rd @@ -4,7 +4,7 @@ \alias{cr_profile_main} \title{Create a cross section plot for selected DGO data.} \usage{ -cr_profile_main(data, axis_toponyme) +cr_profile_main(data, selected_dgo, axis_toponyme) } \arguments{ \item{data}{data.frame elevation profiles from selected dgo.} diff --git a/man/map_add_axis_dgos.Rd b/man/map_add_axis_dgos.Rd index 70da837..5201801 100644 --- a/man/map_add_axis_dgos.Rd +++ b/man/map_add_axis_dgos.Rd @@ -4,7 +4,7 @@ \alias{map_add_axis_dgos} \title{Add Axis Data to an Existing Leaflet Map} \usage{ -map_add_axis_dgos(map, axis_data, group) +map_add_axis_dgos(map, axis_data, Proposed_class, group) } \arguments{ \item{map}{An existing Leaflet map to which axis data will be added.}