From 0864436939a6a9932ff7b222c954d653294b3298 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=B4=9D?= Date: Tue, 26 May 2026 09:56:01 +0800 Subject: [PATCH 1/7] chore: clean up debug statements, deprecated attributes, and improve accessibility (#1298) - Remove print() debug statements from TLG module, use log_error() instead - Remove unused require(magrittr) and require(stats) from app.R - Replace deprecated HTML align attributes with inline CSS - Standardize button CSS classes (remove duplicate btn prefix) - Add aria-label to 15 icon-only buttons for screen reader support - Remove redundant disabled=FALSE default from actionButton Co-Authored-By: Claude Opus 4.7 --- DESCRIPTION | 2 +- NEWS.md | 9 +++++++++ inst/shiny/app.R | 2 -- inst/shiny/functions/utils-exclusions.R | 3 ++- inst/shiny/modules/tab_explore.R | 2 +- inst/shiny/modules/tab_explore/plot_sidebar.R | 2 +- inst/shiny/modules/tab_explore/qc_plot.R | 2 +- inst/shiny/modules/tab_explore/saved_outputs.R | 3 ++- inst/shiny/modules/tab_nca.R | 2 +- inst/shiny/modules/tab_nca/excretion_analysis.R | 2 +- inst/shiny/modules/tab_nca/non_nca_ratios.R | 4 ++-- inst/shiny/modules/tab_nca/setup/data_imputation.R | 4 ++-- inst/shiny/modules/tab_nca/setup/general_exclusions.R | 4 ++-- .../modules/tab_nca/setup/parameter_exclusions.R | 4 ++-- .../shiny/modules/tab_nca/setup/parameter_selection.R | 2 +- .../modules/tab_nca/setup/ratio_calculations_table.R | 2 +- inst/shiny/modules/tab_nca/setup/settings.R | 4 ++-- inst/shiny/modules/tab_nca/setup/slope_selector.R | 2 +- inst/shiny/modules/tab_nca/units_table.R | 3 +-- inst/shiny/modules/tab_nca/zip.R | 8 ++++---- inst/shiny/modules/tab_tlg.R | 1 - inst/shiny/modules/tab_tlg/tlg_module.R | 11 +++++------ 22 files changed, 42 insertions(+), 36 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index c9c635d40..240a66132 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: aNCA Title: (Pre-)Clinical NCA in a Dynamic Shiny App -Version: 0.1.0.9173 +Version: 0.1.0.9174 Authors@R: c( person("Ercan", "Suekuer", email = "ercan.suekuer@roche.com", role = "aut", comment = c(ORCID = "0009-0001-1626-1526")), diff --git a/NEWS.md b/NEWS.md index d38b0f701..3ea38a4de 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,14 @@ # aNCA (development version) +## Code Quality + +* Removed debug `print()` statements from TLG module and replaced with proper logging (#1298) +* Removed unused `require(magrittr)` and `require(stats)` calls from `app.R` (#1298) +* Replaced deprecated HTML `align` attributes with inline CSS in TLG module (#1298) +* Standardized button CSS classes: removed redundant `btn` prefix where duplicate with `btn-*` (#1298) +* Added `aria-label` attributes to 15 icon-only buttons for accessibility (#1298) +* Removed redundant `disabled = FALSE` default from units table actionButton (#1298) + ## Features ### Settings & Configuration diff --git a/inst/shiny/app.R b/inst/shiny/app.R index 55e5c4c96..0554411c4 100644 --- a/inst/shiny/app.R +++ b/inst/shiny/app.R @@ -5,7 +5,6 @@ require(dplyr) require(htmlwidgets) require(logger) require(formatters) -require(magrittr) require(plotly) require(purrr) require(reactable) @@ -15,7 +14,6 @@ require(shinycssloaders) require(shinyjs) require(shinyjqui) require(shinyWidgets) -require(stats) require(tidyr) require(tools) diff --git a/inst/shiny/functions/utils-exclusions.R b/inst/shiny/functions/utils-exclusions.R index e16946cff..c1a4bb1be 100644 --- a/inst/shiny/functions/utils-exclusions.R +++ b/inst/shiny/functions/utils-exclusions.R @@ -167,7 +167,8 @@ EXCL_COLOR_PARAM <- "#FFF3CD" # yellow — parameter exclusion ns(value), label = NULL, icon = shiny::icon("times"), - class = "btn btn-link btn-sm", + `aria-label` = "Remove exclusion", + class = "btn-link btn-sm", style = "padding:2px 6px;" ) ) diff --git a/inst/shiny/modules/tab_explore.R b/inst/shiny/modules/tab_explore.R index b175b5451..5cd9b478f 100644 --- a/inst/shiny/modules/tab_explore.R +++ b/inst/shiny/modules/tab_explore.R @@ -219,7 +219,7 @@ tab_explore_server <- function(id, pknca_data, extra_group_vars) { footer = tagList( modalButton("Cancel"), actionButton(ns("confirm_add_to_exports"), "Save", - class = "btn btn-primary") + class = "btn-primary") ), size = "s", easyClose = TRUE diff --git a/inst/shiny/modules/tab_explore/plot_sidebar.R b/inst/shiny/modules/tab_explore/plot_sidebar.R index bc25a4715..77c1a3dc1 100644 --- a/inst/shiny/modules/tab_explore/plot_sidebar.R +++ b/inst/shiny/modules/tab_explore/plot_sidebar.R @@ -17,7 +17,7 @@ plot_sidebar_ui <- function(id, is_mean_plot = FALSE, extra_ui = NULL) { ns("add_to_exports"), label = "Add to Exports", icon = icon("plus"), - class = "btn btn-primary btn-sm", + class = "btn-primary btn-sm", width = "100%" ), extra_ui, diff --git a/inst/shiny/modules/tab_explore/qc_plot.R b/inst/shiny/modules/tab_explore/qc_plot.R index 9e67be183..fd965bcbc 100644 --- a/inst/shiny/modules/tab_explore/qc_plot.R +++ b/inst/shiny/modules/tab_explore/qc_plot.R @@ -23,7 +23,7 @@ pk_dose_qc_plot_ui <- function(id, extra_ui = NULL) { ns("add_to_exports"), label = "Add to Exports", icon = icon("plus"), - class = "btn btn-primary btn-sm", + class = "btn-primary btn-sm", width = "100%" ), extra_ui, diff --git a/inst/shiny/modules/tab_explore/saved_outputs.R b/inst/shiny/modules/tab_explore/saved_outputs.R index 1db2e7779..f1a4a6ca4 100644 --- a/inst/shiny/modules/tab_explore/saved_outputs.R +++ b/inst/shiny/modules/tab_explore/saved_outputs.R @@ -59,7 +59,7 @@ saved_outputs_ui <- function(id) { ns("view_exports"), label = "View Exports", icon = icon("eye"), - class = "btn btn-primary btn-sm", + class = "btn-primary btn-sm", width = "100%" ) } @@ -209,6 +209,7 @@ saved_outputs_server <- function(id, saved_plots_metadata, get_plot_obj, "color: #dc3545; font-size: 1.2em; ", "text-decoration: none;" ), + `aria-label` = "Remove from exports", title = "Remove from exports", icon("times") ) diff --git a/inst/shiny/modules/tab_nca.R b/inst/shiny/modules/tab_nca.R index bb0f8ae60..db08b66c4 100644 --- a/inst/shiny/modules/tab_nca.R +++ b/inst/shiny/modules/tab_nca.R @@ -32,7 +32,7 @@ tab_nca_ui <- function(id) { inputId = ns("run_nca"), label = "Run NCA", icon = icon("play"), - class = "btn btn-primary", + class = "btn-primary", width = "100%" ), nca_setup_ui(ns("nca_setup")), diff --git a/inst/shiny/modules/tab_nca/excretion_analysis.R b/inst/shiny/modules/tab_nca/excretion_analysis.R index d105badcc..1f588b7d1 100644 --- a/inst/shiny/modules/tab_nca/excretion_analysis.R +++ b/inst/shiny/modules/tab_nca/excretion_analysis.R @@ -273,7 +273,7 @@ excretion_help_ui <- function() { ) ), style = "unite", - icon = icon("question"), + icon = icon("question"), `aria-label` = "Help", status = "primary" ) } diff --git a/inst/shiny/modules/tab_nca/non_nca_ratios.R b/inst/shiny/modules/tab_nca/non_nca_ratios.R index 0d4ab9e16..939ca4216 100644 --- a/inst/shiny/modules/tab_nca/non_nca_ratios.R +++ b/inst/shiny/modules/tab_nca/non_nca_ratios.R @@ -127,7 +127,7 @@ non_nca_ratio_server <- function(id, data, grouping_vars) { ), div( class = "ratio-remove-btn-wrapper", - actionButton(ns(paste0("remove_", count)), "", icon = icon("trash-alt")) + actionButton(ns(paste0("remove_", count)), "", `aria-label` = "Remove ratio pair", icon = icon("trash-alt")) ) ) @@ -243,7 +243,7 @@ non_nca_ratio_help_ui <- function(title) { ), style = "unite", placement = "left", - icon = icon("question"), + icon = icon("question"), `aria-label` = "Help", status = "primary" ) } diff --git a/inst/shiny/modules/tab_nca/setup/data_imputation.R b/inst/shiny/modules/tab_nca/setup/data_imputation.R index eb5c5f6f9..4ecf00e85 100644 --- a/inst/shiny/modules/tab_nca/setup/data_imputation.R +++ b/inst/shiny/modules/tab_nca/setup/data_imputation.R @@ -53,7 +53,7 @@ data_imputation_ui <- function(id) { ), style = "unite", right = TRUE, - icon = icon("question"), + icon = icon("question"), `aria-label` = "Help", status = "primary", width = "500px" ) @@ -123,7 +123,7 @@ data_imputation_ui <- function(id) { ), style = "unite", right = TRUE, - icon = icon("question"), + icon = icon("question"), `aria-label` = "Help", status = "primary", width = "500px" ) diff --git a/inst/shiny/modules/tab_nca/setup/general_exclusions.R b/inst/shiny/modules/tab_nca/setup/general_exclusions.R index 9a2fe9ce2..50f99c355 100644 --- a/inst/shiny/modules/tab_nca/setup/general_exclusions.R +++ b/inst/shiny/modules/tab_nca/setup/general_exclusions.R @@ -37,7 +37,7 @@ general_exclusions_ui <- function(id) { actionButton( ns("add_exclusion_reason"), label = "Add", - class = "btn btn-primary btn-sm" + class = "btn-primary btn-sm" ), # Help button (dropdown) dropdown( @@ -78,7 +78,7 @@ general_exclusions_ui <- function(id) { ), style = "unite", right = TRUE, - icon = icon("question"), + icon = icon("question"), `aria-label` = "Help", status = "primary" ) ), diff --git a/inst/shiny/modules/tab_nca/setup/parameter_exclusions.R b/inst/shiny/modules/tab_nca/setup/parameter_exclusions.R index 5cc954c22..92b08b603 100644 --- a/inst/shiny/modules/tab_nca/setup/parameter_exclusions.R +++ b/inst/shiny/modules/tab_nca/setup/parameter_exclusions.R @@ -21,7 +21,7 @@ parameter_exclusions_ui <- function(id) { actionButton( ns("add_exclusion"), label = "Add", - class = "btn btn-primary btn-sm" + class = "btn-primary btn-sm" ), dropdown( div( @@ -45,7 +45,7 @@ parameter_exclusions_ui <- function(id) { ), style = "unite", right = TRUE, - icon = icon("question"), + icon = icon("question"), `aria-label` = "Help", status = "primary" ) ), diff --git a/inst/shiny/modules/tab_nca/setup/parameter_selection.R b/inst/shiny/modules/tab_nca/setup/parameter_selection.R index ea153562f..8dbe9e10a 100644 --- a/inst/shiny/modules/tab_nca/setup/parameter_selection.R +++ b/inst/shiny/modules/tab_nca/setup/parameter_selection.R @@ -81,7 +81,7 @@ parameter_selection_ui <- function(id, ), style = "unite", right = TRUE, - icon = icon("question"), + icon = icon("question"), `aria-label` = "Help", status = "primary", width = "500px" ), diff --git a/inst/shiny/modules/tab_nca/setup/ratio_calculations_table.R b/inst/shiny/modules/tab_nca/setup/ratio_calculations_table.R index 3decad423..e5a42b7a8 100644 --- a/inst/shiny/modules/tab_nca/setup/ratio_calculations_table.R +++ b/inst/shiny/modules/tab_nca/setup/ratio_calculations_table.R @@ -77,7 +77,7 @@ ratios_table_ui <- function(id) { ), style = "unite", right = TRUE, - icon = icon("question"), + icon = icon("question"), `aria-label` = "Help", status = "primary", width = "500px" ) diff --git a/inst/shiny/modules/tab_nca/setup/settings.R b/inst/shiny/modules/tab_nca/setup/settings.R index ceda5ae39..5bd359da0 100644 --- a/inst/shiny/modules/tab_nca/setup/settings.R +++ b/inst/shiny/modules/tab_nca/setup/settings.R @@ -81,7 +81,7 @@ partial_intervals_ui <- function(id) { ), style = "unite", right = TRUE, - icon = icon("question"), + icon = icon("question"), `aria-label` = "Help", status = "primary", width = "600px" ) @@ -186,7 +186,7 @@ settings_ui <- function(id) { ), style = "unite", right = TRUE, - icon = icon("question"), + icon = icon("question"), `aria-label` = "Help", status = "primary", width = "400px" ) diff --git a/inst/shiny/modules/tab_nca/setup/slope_selector.R b/inst/shiny/modules/tab_nca/setup/slope_selector.R index 7f3cfe0f1..e5f35b90d 100644 --- a/inst/shiny/modules/tab_nca/setup/slope_selector.R +++ b/inst/shiny/modules/tab_nca/setup/slope_selector.R @@ -79,7 +79,7 @@ slope_selector_ui <- function(id) { ), style = "unite", right = TRUE, - icon = icon("question"), + icon = icon("question"), `aria-label` = "Help", status = "primary", width = "600px" ), diff --git a/inst/shiny/modules/tab_nca/units_table.R b/inst/shiny/modules/tab_nca/units_table.R index 58e4e75d2..1272ee8ed 100644 --- a/inst/shiny/modules/tab_nca/units_table.R +++ b/inst/shiny/modules/tab_nca/units_table.R @@ -18,8 +18,7 @@ units_table_ui <- function(id) { actionButton( ns("open_units_table"), icon = icon("scale-balanced"), - label = "Parameter Units", - disabled = FALSE + label = "Parameter Units" ) ) } diff --git a/inst/shiny/modules/tab_nca/zip.R b/inst/shiny/modules/tab_nca/zip.R index 5334e49ac..d0b18017a 100644 --- a/inst/shiny/modules/tab_nca/zip.R +++ b/inst/shiny/modules/tab_nca/zip.R @@ -18,7 +18,7 @@ zip_ui <- function(id) { inputId = ns("open_zip_modal"), label = "Save", icon = icon("download"), - class = "btn btn-primary", + class = "btn-primary", style = paste( "margin-left: 10px;", "padding: 8px 18px;", @@ -228,7 +228,7 @@ zip_ui <- function(id) { actionButton(ns("back_to_export"), "Back", icon = icon("arrow-left")), div( modalButton("Cancel"), - downloadButton(ns("download_zip_configured"), "Export", class = "btn btn-primary") + downloadButton(ns("download_zip_configured"), "Export", class = "btn-primary") ) ) ), @@ -450,7 +450,7 @@ zip_ui <- function(id) { ns("confirm_export"), label = "Export ZIP with Results", icon = icon("download"), - class = "btn btn-primary" + class = "btn-primary" ) ), easyClose = FALSE, @@ -598,7 +598,7 @@ zip_server <- function(id, res_nca, adnca_data, settings, grouping_vars) { actionButton(ns("back_to_export"), "Back", icon = icon("arrow-left")), div( modalButton("Cancel"), - downloadButton(ns("download_zip"), "Export", class = "btn btn-primary") + downloadButton(ns("download_zip"), "Export", class = "btn-primary") ) ) ), diff --git a/inst/shiny/modules/tab_tlg.R b/inst/shiny/modules/tab_tlg.R index af331ae86..69790184f 100644 --- a/inst/shiny/modules/tab_tlg.R +++ b/inst/shiny/modules/tab_tlg.R @@ -232,7 +232,6 @@ tab_tlg_server <- function(id, data) { # Submit the TLG order, filter selected TLGs tlg_order_filtered <- reactive({ req(data()) - print(tlg_order()) tlg_order_filt <- tlg_order()[tlg_order()$Selection, ] log_debug("Submitted TLGs:\n", paste0("* ", tlg_order_filt$Description, collapse = "\n")) diff --git a/inst/shiny/modules/tab_tlg/tlg_module.R b/inst/shiny/modules/tab_tlg/tlg_module.R index 4a1f20030..85e5a5c4b 100644 --- a/inst/shiny/modules/tab_tlg/tlg_module.R +++ b/inst/shiny/modules/tab_tlg/tlg_module.R @@ -56,7 +56,7 @@ tlg_module_ui <- function(id, type, options) { ), style = "unite", right = TRUE, - icon = icon("question"), + icon = icon("question"), `aria-label` = "Help", status = "primary" ), actionButton( @@ -69,7 +69,7 @@ tlg_module_ui <- function(id, type, options) { div( class = "tlg-widgets-container", div( - align = "left", + style = "text-align: left;", tags$span( class = "inline-select-input", style = "margin-right: 5em;", @@ -83,7 +83,7 @@ tlg_module_ui <- function(id, type, options) { shinyjs::disabled(actionButton(ns("previous_page"), "Previous Page", class = "btn-page")) ), div( - align = "center", + style = "text-align: center;", tags$span( class = "inline-select-input", tags$span("Page "), @@ -96,7 +96,7 @@ tlg_module_ui <- function(id, type, options) { uiOutput(ns("page_number"), inline = TRUE), ) ), - div(align = "right", actionButton(ns("next_page"), "Next Page", class = "btn-page")) + div(style = "text-align: right;", actionButton(ns("next_page"), "Next Page", class = "btn-page")) ), shinycssloaders::withSpinner( switch( @@ -183,8 +183,7 @@ tlg_module_server <- function(id, data, type, render_list, options = NULL) { do.call(render_list, purrr::list_modify(list(data = tlg_data), !!!list_options)) }, error = function(e) { - log_error("Error in list rendering:") - print(e) + log_error("Error in list rendering: ", e$message) "Error: list rendering failed with current options. Check the R console for more information." }) From fd897311fd6be45f045474c1a405b41bceb4141b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=B4=9D?= Date: Tue, 26 May 2026 11:01:58 +0800 Subject: [PATCH 2/7] chore: extract inline hex colors to shared R constants and SCSS variables (#1298) - Create inst/shiny/functions/colors.R with 16 semantic color constants - Expand _colors.scss with grey-6/7/8, accent, and border variables - Replace ~25 inline hex values across 9 Shiny module files Co-Authored-By: Claude Opus 4.7 --- NEWS.md | 1 + inst/shiny/functions/colors.R | 26 +++++++++++++++++++ inst/shiny/functions/utils-exclusions.R | 4 +-- inst/shiny/modules/tab_about.R | 6 ++--- inst/shiny/modules/tab_data/data_mapping.R | 2 +- inst/shiny/modules/tab_data/data_upload.R | 4 +-- .../shiny/modules/tab_explore/saved_outputs.R | 10 +++---- inst/shiny/modules/tab_nca/nca_results.R | 2 +- .../tab_nca/setup/manual_slopes_table.R | 4 +-- .../tab_nca/setup/parameter_selection.R | 2 +- inst/shiny/modules/tab_nca/setup/settings.R | 4 +-- inst/shiny/modules/tab_nca/zip.R | 6 ++--- inst/shiny/modules/tab_tlg/tlg_option_table.R | 2 +- inst/shiny/www/styles/modules/_colors.scss | 11 ++++++++ 14 files changed, 61 insertions(+), 23 deletions(-) create mode 100644 inst/shiny/functions/colors.R diff --git a/NEWS.md b/NEWS.md index 3ea38a4de..16db549d4 100644 --- a/NEWS.md +++ b/NEWS.md @@ -8,6 +8,7 @@ * Standardized button CSS classes: removed redundant `btn` prefix where duplicate with `btn-*` (#1298) * Added `aria-label` attributes to 15 icon-only buttons for accessibility (#1298) * Removed redundant `disabled = FALSE` default from units table actionButton (#1298) +* Extracted inline hex colors to shared `colors.R` constants and SCSS variables (#1298) ## Features diff --git a/inst/shiny/functions/colors.R b/inst/shiny/functions/colors.R new file mode 100644 index 000000000..1db8b2b90 --- /dev/null +++ b/inst/shiny/functions/colors.R @@ -0,0 +1,26 @@ +# Color constants — keep in sync with inst/shiny/www/styles/modules/_colors.scss +# See https://github.com/pharmaverse/aNCA/issues/1298 + +# Backgrounds +BG_GREY_LIGHT <- "#eeeeee" +BG_GREY_HEADER <- "#e9e9e9" +BG_HIGHLIGHT_BLUE <- "#CCE5FF" +BG_BLUE_LIGHT <- "#e6f2ff" +ANCA_WHITE <- "#ffffff" + +# Text +TEXT_MUTED <- "#999999" +TEXT_DIM <- "#888888" +TEXT_SUBTLE <- "#777777" +TEXT_SECONDARY <- "#666666" +TEXT_HEADING <- "#555555" + +# Borders +BORDER_LIGHT <- "#dddddd" +BORDER_MUTED <- "#cccccc" +BORDER_PANEL <- "#dee2e6" + +# Accent +ACCENT_BLUE <- "#0d6efd" +ACCENT_ORANGE <- "#ffa62d" +ACCENT_DANGER <- "#dc3545" diff --git a/inst/shiny/functions/utils-exclusions.R b/inst/shiny/functions/utils-exclusions.R index c1a4bb1be..b0fc2b598 100644 --- a/inst/shiny/functions/utils-exclusions.R +++ b/inst/shiny/functions/utils-exclusions.R @@ -11,7 +11,7 @@ EXCL_COLOR_PARAM <- "#FFF3CD" # yellow — parameter exclusion style = "display:flex; align-items:center; gap:6px;", div(style = paste0( "width:14px; height:14px; background:", color, - "; border:1px solid #ddd;" + "; border:1px solid ", BORDER_LIGHT, ";" )), span(label, style = "font-size:0.9em;") ) @@ -197,7 +197,7 @@ EXCL_COLOR_PARAM <- "#FFF3CD" # yellow — parameter exclusion pagination = FALSE, defaultPageSize = nrow(df), theme = reactable::reactableTheme( - headerStyle = list(background = "#e9e9e9") + headerStyle = list(background = BG_GREY_HEADER) ), columns = cols ) diff --git a/inst/shiny/modules/tab_about.R b/inst/shiny/modules/tab_about.R index 4f371f758..68d528e99 100644 --- a/inst/shiny/modules/tab_about.R +++ b/inst/shiny/modules/tab_about.R @@ -154,7 +154,7 @@ tab_about_server <- function(id) { } ) tags$blockquote( - style = "border-left: 3px solid #ccc; padding-left: 1em; color: #555;", + style = paste0("border-left: 3px solid ", BORDER_MUTED, "; padding-left: 1em; color: ", TEXT_HEADING, ";"), tags$p(cit_text) ) }) @@ -163,7 +163,7 @@ tab_about_server <- function(id) { cit <- utils::citation("PKNCA") cit_text <- paste(format(cit, style = "text"), collapse = "\n\n") tags$blockquote( - style = "border-left: 3px solid #ccc; padding-left: 1em; color: #555;", + style = paste0("border-left: 3px solid ", BORDER_MUTED, "; padding-left: 1em; color: ", TEXT_HEADING, ";"), tags$p(cit_text) ) }) @@ -255,7 +255,7 @@ tab_about_server <- function(id) { style = "margin-bottom: 0.3em;", tags$a(href = url, target = "_blank", label), tags$span( - style = "color: #999; font-size: 0.85em; margin-left: 0.5em;", + style = paste0("color: ", TEXT_MUTED, "; font-size: 0.85em; margin-left: 0.5em;"), url ) ) diff --git a/inst/shiny/modules/tab_data/data_mapping.R b/inst/shiny/modules/tab_data/data_mapping.R index 14bd5d1f0..12eb873af 100644 --- a/inst/shiny/modules/tab_data/data_mapping.R +++ b/inst/shiny/modules/tab_data/data_mapping.R @@ -535,7 +535,7 @@ data_mapping_server <- function(id, adnca_data, imported_mapping, trigger) { if (dup_data[index, ".dup_group"] %% 2 == 0) { list(background = "white") } else { - list(background = "#e6f2ff") + list(background = BG_BLUE_LIGHT) } }, selection = "multiple", diff --git a/inst/shiny/modules/tab_data/data_upload.R b/inst/shiny/modules/tab_data/data_upload.R index a10a0a69d..46393053d 100644 --- a/inst/shiny/modules/tab_data/data_upload.R +++ b/inst/shiny/modules/tab_data/data_upload.R @@ -225,8 +225,8 @@ data_upload_server <- function(id) { defaultPageSize = 10, theme = reactableTheme( rowSelectedStyle = list( - backgroundColor = "#CCE5FF", - boxShadow = "inset 2px 0 0 0 #0d6efd" + backgroundColor = BG_HIGHLIGHT_BLUE, + boxShadow = paste0("inset 2px 0 0 0 ", ACCENT_BLUE) ) ), columns = list( diff --git a/inst/shiny/modules/tab_explore/saved_outputs.R b/inst/shiny/modules/tab_explore/saved_outputs.R index f1a4a6ca4..f89d0a6bb 100644 --- a/inst/shiny/modules/tab_explore/saved_outputs.R +++ b/inst/shiny/modules/tab_explore/saved_outputs.R @@ -168,7 +168,7 @@ saved_outputs_server <- function(id, saved_plots_metadata, get_plot_obj, "No plots saved yet. Use ", tags$strong("Add to Exports"), " to save plots.", - style = "color: #888; font-style: italic; margin: 16px 0;" + style = paste0("color: ", TEXT_DIM, "; font-style: italic; margin: 16px 0;") )) } @@ -187,8 +187,8 @@ saved_outputs_server <- function(id, saved_plots_metadata, get_plot_obj, tags$div( style = paste0( - "border: 1px solid #dee2e6; border-radius: 6px; ", - "padding: 12px; margin-bottom: 16px; background: #fff;" + "border: 1px solid ", BORDER_PANEL, "; border-radius: 6px; ", + "padding: 12px; margin-bottom: 16px; background: ", ANCA_WHITE, ";" ), tags$div( style = paste0( @@ -199,14 +199,14 @@ saved_outputs_server <- function(id, saved_plots_metadata, get_plot_obj, tags$strong(plot_name, style = "font-size: 1.1em;"), tags$span( paste0(" \u2014 ", plot_type, " \u00b7 ", plot_ts), - style = "color: #666; font-size: 0.9em;" + style = paste0("color: ", TEXT_SECONDARY, "; font-size: 0.9em;") ) ), tags$a( href = "#", onclick = paste0(remove_js, "return false;"), style = paste0( - "color: #dc3545; font-size: 1.2em; ", + "color: ", ACCENT_DANGER, "; font-size: 1.2em; ", "text-decoration: none;" ), `aria-label` = "Remove from exports", diff --git a/inst/shiny/modules/tab_nca/nca_results.R b/inst/shiny/modules/tab_nca/nca_results.R index 65a6d7b8c..405eab44c 100644 --- a/inst/shiny/modules/tab_nca/nca_results.R +++ b/inst/shiny/modules/tab_nca/nca_results.R @@ -33,7 +33,7 @@ nca_results_ui <- function(id) { span("MISSING", style = "font-size:0.9em;") ), div(style = "display:flex; align-items:center; gap:6px;", - div(style = "width:14px; height:14px; background:#ffffff; border:1px solid #ddd;"), + div(style = paste0("width:14px; height:14px; background:", ANCA_WHITE, "; border:1px solid ", BORDER_LIGHT, ";")), span("ACCEPTED", style = "font-size:0.9em;") ) ), diff --git a/inst/shiny/modules/tab_nca/setup/manual_slopes_table.R b/inst/shiny/modules/tab_nca/setup/manual_slopes_table.R index 163215844..66948384d 100644 --- a/inst/shiny/modules/tab_nca/setup/manual_slopes_table.R +++ b/inst/shiny/modules/tab_nca/setup/manual_slopes_table.R @@ -182,8 +182,8 @@ manual_slopes_table_server <- function( borderless = TRUE, theme = reactableTheme( rowSelectedStyle = list( - backgroundColor = "#eee", - boxShadow = "inset 2px 0 0 0 #ffa62d" + backgroundColor = BG_GREY_LIGHT, + boxShadow = paste0("inset 2px 0 0 0 ", ACCENT_ORANGE) ) ) ) diff --git a/inst/shiny/modules/tab_nca/setup/parameter_selection.R b/inst/shiny/modules/tab_nca/setup/parameter_selection.R index 8dbe9e10a..4764238be 100644 --- a/inst/shiny/modules/tab_nca/setup/parameter_selection.R +++ b/inst/shiny/modules/tab_nca/setup/parameter_selection.R @@ -428,7 +428,7 @@ parameter_selection_server <- function(id, processed_pknca_data, parameter_overr href = func_url, target = "_blank", style = paste0( - "color: #0d6efd;", + "color: ", ACCENT_BLUE, ";", "text-decoration: underline;" ), value diff --git a/inst/shiny/modules/tab_nca/setup/settings.R b/inst/shiny/modules/tab_nca/setup/settings.R index 5bd359da0..93d296f43 100644 --- a/inst/shiny/modules/tab_nca/setup/settings.R +++ b/inst/shiny/modules/tab_nca/setup/settings.R @@ -403,8 +403,8 @@ settings_server <- function(id, data, adnca_data, settings_override) { borderless = TRUE, theme = reactableTheme( rowSelectedStyle = list( - backgroundColor = "#eee", - boxShadow = "inset 2px 0 0 0 #ffa62d" + backgroundColor = BG_GREY_LIGHT, + boxShadow = paste0("inset 2px 0 0 0 ", ACCENT_ORANGE) ) ) ) diff --git a/inst/shiny/modules/tab_nca/zip.R b/inst/shiny/modules/tab_nca/zip.R index d0b18017a..74ad4ab9f 100644 --- a/inst/shiny/modules/tab_nca/zip.R +++ b/inst/shiny/modules/tab_nca/zip.R @@ -149,7 +149,7 @@ zip_ui <- function(id) { width = 6, div( h4("PK Parameters", style = "margin-bottom: 0.25em;"), - p(style = "color: #777; font-size: 0.85em; margin-top: 0; margin-bottom: 0.75em;", + p(style = paste0("color: ", TEXT_SUBTLE, "; font-size: 0.85em; margin-top: 0; margin-bottom: 0.75em;"), "Parameters included in the slide tables") ), div( @@ -310,8 +310,8 @@ zip_ui <- function(id) { span( style = paste( "display: inline-block;", - "background-color: #dc3545;", - "color: #fff;", + paste0("background-color: ", ACCENT_DANGER, ";"), + paste0("color: ", ANCA_WHITE, ";"), "border-radius: 20px;", "padding: 5px 14px;", "font-size: 0.85rem;", diff --git a/inst/shiny/modules/tab_tlg/tlg_option_table.R b/inst/shiny/modules/tab_tlg/tlg_option_table.R index 7cb985587..6f87191dd 100644 --- a/inst/shiny/modules/tab_tlg/tlg_option_table.R +++ b/inst/shiny/modules/tab_tlg/tlg_option_table.R @@ -90,7 +90,7 @@ tlg_option_table_server <- function(id, opt_def, data, reset_trigger) { pageSizeOptions = c(10, 25, 50, 100, nrow(edits_table())), defaultPageSize = 10, theme = reactableTheme( - rowSelectedStyle = list(backgroundColor = "#eee", boxShadow = "inset 2px 0 0 0 #ffa62d") + rowSelectedStyle = list(backgroundColor = BG_GREY_LIGHT, boxShadow = paste0("inset 2px 0 0 0 ", ACCENT_ORANGE)) ) ) }) %>% diff --git a/inst/shiny/www/styles/modules/_colors.scss b/inst/shiny/www/styles/modules/_colors.scss index 4c2dcb807..7f16a39c9 100644 --- a/inst/shiny/www/styles/modules/_colors.scss +++ b/inst/shiny/www/styles/modules/_colors.scss @@ -9,3 +9,14 @@ $grey-2: #b4b4b4; $grey-3: #c0c0c0; $grey-4: #cdcdcd; $grey-5: #dadada; +$grey-6: #dddddd; +$grey-7: #e9e9e9; +$grey-8: #eeeeee; + +// Accent colors +$accent-blue: #0d6efd; +$accent-orange: #ffa62d; +$accent-danger: #dc3545; + +// Border colors +$border-panel: #dee2e6; From 6b8de75dd9052ee176736c977a89ac1f158d9d91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=B4=9D?= Date: Wed, 27 May 2026 15:41:12 +0800 Subject: [PATCH 3/7] =?UTF-8?q?fix:=20address=20review=20comments=20?= =?UTF-8?q?=E2=80=94=20glue=20interpolation,=20accessibility,=20and=20sync?= =?UTF-8?q?=20notes=20(#1298)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Replace paste0/paste with glue::glue() for cleaner style string interpolation across 8 files (tab_about.R, saved_outputs.R, zip.R, utils-exclusions.R, nca_results.R, manual_slopes_table.R, settings.R, tlg_option_table.R) - Replace ineffective `aria-label` with `label = "Help"` on 12 dropdown() calls — dropdown() forwards `label` to the trigger button but `aria-label` only reaches the inner content div - Add bidirectional sync note in _colors.scss pointing back to colors.R - Recompile main.css (no visual changes — new SCSS variables are not yet consumed by any CSS rules) Co-Authored-By: Claude Opus 4.7 --- inst/shiny/functions/utils-exclusions.R | 6 +++--- inst/shiny/modules/tab_about.R | 6 +++--- inst/shiny/modules/tab_explore/saved_outputs.R | 14 +++++++------- .../shiny/modules/tab_nca/excretion_analysis.R | 2 +- inst/shiny/modules/tab_nca/nca_results.R | 2 +- inst/shiny/modules/tab_nca/non_nca_ratios.R | 2 +- .../modules/tab_nca/setup/data_imputation.R | 4 ++-- .../modules/tab_nca/setup/general_exclusions.R | 2 +- .../tab_nca/setup/manual_slopes_table.R | 2 +- .../tab_nca/setup/parameter_exclusions.R | 2 +- .../tab_nca/setup/parameter_selection.R | 2 +- .../tab_nca/setup/ratio_calculations_table.R | 2 +- inst/shiny/modules/tab_nca/setup/settings.R | 6 +++--- .../modules/tab_nca/setup/slope_selector.R | 2 +- inst/shiny/modules/tab_nca/zip.R | 18 +++++++++--------- inst/shiny/modules/tab_tlg/tlg_module.R | 2 +- inst/shiny/modules/tab_tlg/tlg_option_table.R | 2 +- inst/shiny/www/styles/modules/_colors.scss | 2 ++ 18 files changed, 40 insertions(+), 38 deletions(-) diff --git a/inst/shiny/functions/utils-exclusions.R b/inst/shiny/functions/utils-exclusions.R index b0fc2b598..97a3d7aee 100644 --- a/inst/shiny/functions/utils-exclusions.R +++ b/inst/shiny/functions/utils-exclusions.R @@ -9,9 +9,9 @@ EXCL_COLOR_PARAM <- "#FFF3CD" # yellow — parameter exclusion .legend_swatch <- function(color, label) { div( style = "display:flex; align-items:center; gap:6px;", - div(style = paste0( - "width:14px; height:14px; background:", color, - "; border:1px solid ", BORDER_LIGHT, ";" + div(style = glue::glue( + "width:14px; height:14px; background:{color}", + "; border:1px solid {BORDER_LIGHT};" )), span(label, style = "font-size:0.9em;") ) diff --git a/inst/shiny/modules/tab_about.R b/inst/shiny/modules/tab_about.R index 68d528e99..a9639a55e 100644 --- a/inst/shiny/modules/tab_about.R +++ b/inst/shiny/modules/tab_about.R @@ -154,7 +154,7 @@ tab_about_server <- function(id) { } ) tags$blockquote( - style = paste0("border-left: 3px solid ", BORDER_MUTED, "; padding-left: 1em; color: ", TEXT_HEADING, ";"), + style = glue::glue("border-left: 3px solid {BORDER_MUTED}; padding-left: 1em; color: {TEXT_HEADING};"), tags$p(cit_text) ) }) @@ -163,7 +163,7 @@ tab_about_server <- function(id) { cit <- utils::citation("PKNCA") cit_text <- paste(format(cit, style = "text"), collapse = "\n\n") tags$blockquote( - style = paste0("border-left: 3px solid ", BORDER_MUTED, "; padding-left: 1em; color: ", TEXT_HEADING, ";"), + style = glue::glue("border-left: 3px solid {BORDER_MUTED}; padding-left: 1em; color: {TEXT_HEADING};"), tags$p(cit_text) ) }) @@ -255,7 +255,7 @@ tab_about_server <- function(id) { style = "margin-bottom: 0.3em;", tags$a(href = url, target = "_blank", label), tags$span( - style = paste0("color: ", TEXT_MUTED, "; font-size: 0.85em; margin-left: 0.5em;"), + style = glue::glue("color: {TEXT_MUTED}; font-size: 0.85em; margin-left: 0.5em;"), url ) ) diff --git a/inst/shiny/modules/tab_explore/saved_outputs.R b/inst/shiny/modules/tab_explore/saved_outputs.R index f89d0a6bb..186f13403 100644 --- a/inst/shiny/modules/tab_explore/saved_outputs.R +++ b/inst/shiny/modules/tab_explore/saved_outputs.R @@ -168,7 +168,7 @@ saved_outputs_server <- function(id, saved_plots_metadata, get_plot_obj, "No plots saved yet. Use ", tags$strong("Add to Exports"), " to save plots.", - style = paste0("color: ", TEXT_DIM, "; font-style: italic; margin: 16px 0;") + style = glue::glue("color: {TEXT_DIM}; font-style: italic; margin: 16px 0;") )) } @@ -186,9 +186,9 @@ saved_outputs_server <- function(id, saved_plots_metadata, get_plot_obj, ) tags$div( - style = paste0( - "border: 1px solid ", BORDER_PANEL, "; border-radius: 6px; ", - "padding: 12px; margin-bottom: 16px; background: ", ANCA_WHITE, ";" + style = glue::glue( + "border: 1px solid {BORDER_PANEL}; border-radius: 6px; ", + "padding: 12px; margin-bottom: 16px; background: {ANCA_WHITE};" ), tags$div( style = paste0( @@ -199,14 +199,14 @@ saved_outputs_server <- function(id, saved_plots_metadata, get_plot_obj, tags$strong(plot_name, style = "font-size: 1.1em;"), tags$span( paste0(" \u2014 ", plot_type, " \u00b7 ", plot_ts), - style = paste0("color: ", TEXT_SECONDARY, "; font-size: 0.9em;") + style = glue::glue("color: {TEXT_SECONDARY}; font-size: 0.9em;") ) ), tags$a( href = "#", onclick = paste0(remove_js, "return false;"), - style = paste0( - "color: ", ACCENT_DANGER, "; font-size: 1.2em; ", + style = glue::glue( + "color: {ACCENT_DANGER}; font-size: 1.2em; ", "text-decoration: none;" ), `aria-label` = "Remove from exports", diff --git a/inst/shiny/modules/tab_nca/excretion_analysis.R b/inst/shiny/modules/tab_nca/excretion_analysis.R index 1f588b7d1..4f47da79a 100644 --- a/inst/shiny/modules/tab_nca/excretion_analysis.R +++ b/inst/shiny/modules/tab_nca/excretion_analysis.R @@ -273,7 +273,7 @@ excretion_help_ui <- function() { ) ), style = "unite", - icon = icon("question"), `aria-label` = "Help", + icon = icon("question"), label = "Help", status = "primary" ) } diff --git a/inst/shiny/modules/tab_nca/nca_results.R b/inst/shiny/modules/tab_nca/nca_results.R index 405eab44c..bfcc02043 100644 --- a/inst/shiny/modules/tab_nca/nca_results.R +++ b/inst/shiny/modules/tab_nca/nca_results.R @@ -33,7 +33,7 @@ nca_results_ui <- function(id) { span("MISSING", style = "font-size:0.9em;") ), div(style = "display:flex; align-items:center; gap:6px;", - div(style = paste0("width:14px; height:14px; background:", ANCA_WHITE, "; border:1px solid ", BORDER_LIGHT, ";")), + div(style = glue::glue("width:14px; height:14px; background:{ANCA_WHITE}; border:1px solid {BORDER_LIGHT};")), span("ACCEPTED", style = "font-size:0.9em;") ) ), diff --git a/inst/shiny/modules/tab_nca/non_nca_ratios.R b/inst/shiny/modules/tab_nca/non_nca_ratios.R index 939ca4216..976f2234e 100644 --- a/inst/shiny/modules/tab_nca/non_nca_ratios.R +++ b/inst/shiny/modules/tab_nca/non_nca_ratios.R @@ -243,7 +243,7 @@ non_nca_ratio_help_ui <- function(title) { ), style = "unite", placement = "left", - icon = icon("question"), `aria-label` = "Help", + icon = icon("question"), label = "Help", status = "primary" ) } diff --git a/inst/shiny/modules/tab_nca/setup/data_imputation.R b/inst/shiny/modules/tab_nca/setup/data_imputation.R index 4ecf00e85..984cc8798 100644 --- a/inst/shiny/modules/tab_nca/setup/data_imputation.R +++ b/inst/shiny/modules/tab_nca/setup/data_imputation.R @@ -53,7 +53,7 @@ data_imputation_ui <- function(id) { ), style = "unite", right = TRUE, - icon = icon("question"), `aria-label` = "Help", + icon = icon("question"), label = "Help", status = "primary", width = "500px" ) @@ -123,7 +123,7 @@ data_imputation_ui <- function(id) { ), style = "unite", right = TRUE, - icon = icon("question"), `aria-label` = "Help", + icon = icon("question"), label = "Help", status = "primary", width = "500px" ) diff --git a/inst/shiny/modules/tab_nca/setup/general_exclusions.R b/inst/shiny/modules/tab_nca/setup/general_exclusions.R index 50f99c355..777196901 100644 --- a/inst/shiny/modules/tab_nca/setup/general_exclusions.R +++ b/inst/shiny/modules/tab_nca/setup/general_exclusions.R @@ -78,7 +78,7 @@ general_exclusions_ui <- function(id) { ), style = "unite", right = TRUE, - icon = icon("question"), `aria-label` = "Help", + icon = icon("question"), label = "Help", status = "primary" ) ), diff --git a/inst/shiny/modules/tab_nca/setup/manual_slopes_table.R b/inst/shiny/modules/tab_nca/setup/manual_slopes_table.R index 66948384d..f38d6375b 100644 --- a/inst/shiny/modules/tab_nca/setup/manual_slopes_table.R +++ b/inst/shiny/modules/tab_nca/setup/manual_slopes_table.R @@ -183,7 +183,7 @@ manual_slopes_table_server <- function( theme = reactableTheme( rowSelectedStyle = list( backgroundColor = BG_GREY_LIGHT, - boxShadow = paste0("inset 2px 0 0 0 ", ACCENT_ORANGE) + boxShadow = glue::glue("inset 2px 0 0 0 {ACCENT_ORANGE}") ) ) ) diff --git a/inst/shiny/modules/tab_nca/setup/parameter_exclusions.R b/inst/shiny/modules/tab_nca/setup/parameter_exclusions.R index 92b08b603..993cc1fc3 100644 --- a/inst/shiny/modules/tab_nca/setup/parameter_exclusions.R +++ b/inst/shiny/modules/tab_nca/setup/parameter_exclusions.R @@ -45,7 +45,7 @@ parameter_exclusions_ui <- function(id) { ), style = "unite", right = TRUE, - icon = icon("question"), `aria-label` = "Help", + icon = icon("question"), label = "Help", status = "primary" ) ), diff --git a/inst/shiny/modules/tab_nca/setup/parameter_selection.R b/inst/shiny/modules/tab_nca/setup/parameter_selection.R index 4764238be..83e88eb51 100644 --- a/inst/shiny/modules/tab_nca/setup/parameter_selection.R +++ b/inst/shiny/modules/tab_nca/setup/parameter_selection.R @@ -81,7 +81,7 @@ parameter_selection_ui <- function(id, ), style = "unite", right = TRUE, - icon = icon("question"), `aria-label` = "Help", + icon = icon("question"), label = "Help", status = "primary", width = "500px" ), diff --git a/inst/shiny/modules/tab_nca/setup/ratio_calculations_table.R b/inst/shiny/modules/tab_nca/setup/ratio_calculations_table.R index e5a42b7a8..e256d1166 100644 --- a/inst/shiny/modules/tab_nca/setup/ratio_calculations_table.R +++ b/inst/shiny/modules/tab_nca/setup/ratio_calculations_table.R @@ -77,7 +77,7 @@ ratios_table_ui <- function(id) { ), style = "unite", right = TRUE, - icon = icon("question"), `aria-label` = "Help", + icon = icon("question"), label = "Help", status = "primary", width = "500px" ) diff --git a/inst/shiny/modules/tab_nca/setup/settings.R b/inst/shiny/modules/tab_nca/setup/settings.R index 93d296f43..ddf29092d 100644 --- a/inst/shiny/modules/tab_nca/setup/settings.R +++ b/inst/shiny/modules/tab_nca/setup/settings.R @@ -81,7 +81,7 @@ partial_intervals_ui <- function(id) { ), style = "unite", right = TRUE, - icon = icon("question"), `aria-label` = "Help", + icon = icon("question"), label = "Help", status = "primary", width = "600px" ) @@ -186,7 +186,7 @@ settings_ui <- function(id) { ), style = "unite", right = TRUE, - icon = icon("question"), `aria-label` = "Help", + icon = icon("question"), label = "Help", status = "primary", width = "400px" ) @@ -404,7 +404,7 @@ settings_server <- function(id, data, adnca_data, settings_override) { theme = reactableTheme( rowSelectedStyle = list( backgroundColor = BG_GREY_LIGHT, - boxShadow = paste0("inset 2px 0 0 0 ", ACCENT_ORANGE) + boxShadow = glue::glue("inset 2px 0 0 0 {ACCENT_ORANGE}") ) ) ) diff --git a/inst/shiny/modules/tab_nca/setup/slope_selector.R b/inst/shiny/modules/tab_nca/setup/slope_selector.R index e5f35b90d..526d91cd8 100644 --- a/inst/shiny/modules/tab_nca/setup/slope_selector.R +++ b/inst/shiny/modules/tab_nca/setup/slope_selector.R @@ -79,7 +79,7 @@ slope_selector_ui <- function(id) { ), style = "unite", right = TRUE, - icon = icon("question"), `aria-label` = "Help", + icon = icon("question"), label = "Help", status = "primary", width = "600px" ), diff --git a/inst/shiny/modules/tab_nca/zip.R b/inst/shiny/modules/tab_nca/zip.R index 74ad4ab9f..7a157926e 100644 --- a/inst/shiny/modules/tab_nca/zip.R +++ b/inst/shiny/modules/tab_nca/zip.R @@ -149,7 +149,7 @@ zip_ui <- function(id) { width = 6, div( h4("PK Parameters", style = "margin-bottom: 0.25em;"), - p(style = paste0("color: ", TEXT_SUBTLE, "; font-size: 0.85em; margin-top: 0; margin-bottom: 0.75em;"), + p(style = glue::glue("color: {TEXT_SUBTLE}; font-size: 0.85em; margin-top: 0; margin-bottom: 0.75em;"), "Parameters included in the slide tables") ), div( @@ -308,14 +308,14 @@ zip_ui <- function(id) { "padding: 6px 0 2px;" ), span( - style = paste( - "display: inline-block;", - paste0("background-color: ", ACCENT_DANGER, ";"), - paste0("color: ", ANCA_WHITE, ";"), - "border-radius: 20px;", - "padding: 5px 14px;", - "font-size: 0.85rem;", - "font-weight: 500;", + style = glue::glue( + "display: inline-block; ", + "background-color: {ACCENT_DANGER}; ", + "color: {ANCA_WHITE}; ", + "border-radius: 20px; ", + "padding: 5px 14px; ", + "font-size: 0.85rem; ", + "font-weight: 500; ", "line-height: 1.4;" ), icon("triangle-exclamation"), diff --git a/inst/shiny/modules/tab_tlg/tlg_module.R b/inst/shiny/modules/tab_tlg/tlg_module.R index 85e5a5c4b..853e68e50 100644 --- a/inst/shiny/modules/tab_tlg/tlg_module.R +++ b/inst/shiny/modules/tab_tlg/tlg_module.R @@ -56,7 +56,7 @@ tlg_module_ui <- function(id, type, options) { ), style = "unite", right = TRUE, - icon = icon("question"), `aria-label` = "Help", + icon = icon("question"), label = "Help", status = "primary" ), actionButton( diff --git a/inst/shiny/modules/tab_tlg/tlg_option_table.R b/inst/shiny/modules/tab_tlg/tlg_option_table.R index 6f87191dd..3167ed92d 100644 --- a/inst/shiny/modules/tab_tlg/tlg_option_table.R +++ b/inst/shiny/modules/tab_tlg/tlg_option_table.R @@ -90,7 +90,7 @@ tlg_option_table_server <- function(id, opt_def, data, reset_trigger) { pageSizeOptions = c(10, 25, 50, 100, nrow(edits_table())), defaultPageSize = 10, theme = reactableTheme( - rowSelectedStyle = list(backgroundColor = BG_GREY_LIGHT, boxShadow = paste0("inset 2px 0 0 0 ", ACCENT_ORANGE)) + rowSelectedStyle = list(backgroundColor = BG_GREY_LIGHT, boxShadow = glue::glue("inset 2px 0 0 0 {ACCENT_ORANGE}")) ) ) }) %>% diff --git a/inst/shiny/www/styles/modules/_colors.scss b/inst/shiny/www/styles/modules/_colors.scss index 7f16a39c9..3203e6db3 100644 --- a/inst/shiny/www/styles/modules/_colors.scss +++ b/inst/shiny/www/styles/modules/_colors.scss @@ -1,3 +1,5 @@ +// Color constants — keep in sync with inst/shiny/functions/colors.R +// See https://github.com/pharmaverse/aNCA/issues/1298 $anca-white: #ffffff; $anca-black: #000000; $anca-black-2: #21201f; From a5b78fec1686f1d39f957aff053300a8343a97bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=B4=9D?= Date: Wed, 27 May 2026 15:58:04 +0800 Subject: [PATCH 4/7] style: fix line-length lints from glue and paste0 refactoring (#1298) Co-Authored-By: Claude Opus 4.7 --- .gitignore | 2 +- inst/shiny/modules/tab_about.R | 8 ++++++-- inst/shiny/modules/tab_nca/nca_results.R | 4 +++- inst/shiny/modules/tab_nca/non_nca_ratios.R | 5 ++++- inst/shiny/modules/tab_nca/zip.R | 8 ++++++-- inst/shiny/modules/tab_tlg/tlg_module.R | 5 ++++- inst/shiny/modules/tab_tlg/tlg_option_table.R | 5 ++++- 7 files changed, 28 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index ba2ec833b..9d89c418f 100644 --- a/.gitignore +++ b/.gitignore @@ -15,4 +15,4 @@ inst/shiny/log/* .DS_Store # {shinytest2}: Ignore new debug snapshots for `$expect_values()` *_.new.png -desktop.ini \ No newline at end of file +desktop.initests/testthat/Rplots.pdf diff --git a/inst/shiny/modules/tab_about.R b/inst/shiny/modules/tab_about.R index a9639a55e..568f6b463 100644 --- a/inst/shiny/modules/tab_about.R +++ b/inst/shiny/modules/tab_about.R @@ -154,7 +154,9 @@ tab_about_server <- function(id) { } ) tags$blockquote( - style = glue::glue("border-left: 3px solid {BORDER_MUTED}; padding-left: 1em; color: {TEXT_HEADING};"), + style = glue::glue( + "border-left: 3px solid {BORDER_MUTED}; padding-left: 1em; color: {TEXT_HEADING};" + ), tags$p(cit_text) ) }) @@ -163,7 +165,9 @@ tab_about_server <- function(id) { cit <- utils::citation("PKNCA") cit_text <- paste(format(cit, style = "text"), collapse = "\n\n") tags$blockquote( - style = glue::glue("border-left: 3px solid {BORDER_MUTED}; padding-left: 1em; color: {TEXT_HEADING};"), + style = glue::glue( + "border-left: 3px solid {BORDER_MUTED}; padding-left: 1em; color: {TEXT_HEADING};" + ), tags$p(cit_text) ) }) diff --git a/inst/shiny/modules/tab_nca/nca_results.R b/inst/shiny/modules/tab_nca/nca_results.R index bfcc02043..912f43c70 100644 --- a/inst/shiny/modules/tab_nca/nca_results.R +++ b/inst/shiny/modules/tab_nca/nca_results.R @@ -33,7 +33,9 @@ nca_results_ui <- function(id) { span("MISSING", style = "font-size:0.9em;") ), div(style = "display:flex; align-items:center; gap:6px;", - div(style = glue::glue("width:14px; height:14px; background:{ANCA_WHITE}; border:1px solid {BORDER_LIGHT};")), + div(style = glue::glue( + "width:14px; height:14px; background:{ANCA_WHITE}; border:1px solid {BORDER_LIGHT};" + )), span("ACCEPTED", style = "font-size:0.9em;") ) ), diff --git a/inst/shiny/modules/tab_nca/non_nca_ratios.R b/inst/shiny/modules/tab_nca/non_nca_ratios.R index 976f2234e..00090001e 100644 --- a/inst/shiny/modules/tab_nca/non_nca_ratios.R +++ b/inst/shiny/modules/tab_nca/non_nca_ratios.R @@ -127,7 +127,10 @@ non_nca_ratio_server <- function(id, data, grouping_vars) { ), div( class = "ratio-remove-btn-wrapper", - actionButton(ns(paste0("remove_", count)), "", `aria-label` = "Remove ratio pair", icon = icon("trash-alt")) + actionButton( + ns(paste0("remove_", count)), "", + `aria-label` = "Remove ratio pair", icon = icon("trash-alt") + ) ) ) diff --git a/inst/shiny/modules/tab_nca/zip.R b/inst/shiny/modules/tab_nca/zip.R index 7a157926e..0b0fbc052 100644 --- a/inst/shiny/modules/tab_nca/zip.R +++ b/inst/shiny/modules/tab_nca/zip.R @@ -149,8 +149,12 @@ zip_ui <- function(id) { width = 6, div( h4("PK Parameters", style = "margin-bottom: 0.25em;"), - p(style = glue::glue("color: {TEXT_SUBTLE}; font-size: 0.85em; margin-top: 0; margin-bottom: 0.75em;"), - "Parameters included in the slide tables") + p( + style = glue::glue( + "color: {TEXT_SUBTLE}; font-size: 0.85em; margin-top: 0; margin-bottom: 0.75em;" + ), + "Parameters included in the slide tables" + ) ), div( id = ns("ind_params_container"), diff --git a/inst/shiny/modules/tab_tlg/tlg_module.R b/inst/shiny/modules/tab_tlg/tlg_module.R index 853e68e50..2b234435b 100644 --- a/inst/shiny/modules/tab_tlg/tlg_module.R +++ b/inst/shiny/modules/tab_tlg/tlg_module.R @@ -96,7 +96,10 @@ tlg_module_ui <- function(id, type, options) { uiOutput(ns("page_number"), inline = TRUE), ) ), - div(style = "text-align: right;", actionButton(ns("next_page"), "Next Page", class = "btn-page")) + div( + style = "text-align: right;", + actionButton(ns("next_page"), "Next Page", class = "btn-page") + ) ), shinycssloaders::withSpinner( switch( diff --git a/inst/shiny/modules/tab_tlg/tlg_option_table.R b/inst/shiny/modules/tab_tlg/tlg_option_table.R index 3167ed92d..8385c4a90 100644 --- a/inst/shiny/modules/tab_tlg/tlg_option_table.R +++ b/inst/shiny/modules/tab_tlg/tlg_option_table.R @@ -90,7 +90,10 @@ tlg_option_table_server <- function(id, opt_def, data, reset_trigger) { pageSizeOptions = c(10, 25, 50, 100, nrow(edits_table())), defaultPageSize = 10, theme = reactableTheme( - rowSelectedStyle = list(backgroundColor = BG_GREY_LIGHT, boxShadow = glue::glue("inset 2px 0 0 0 {ACCENT_ORANGE}")) + rowSelectedStyle = list( + backgroundColor = BG_GREY_LIGHT, + boxShadow = glue::glue("inset 2px 0 0 0 {ACCENT_ORANGE}") + ) ) ) }) %>% From 80d9d74b72a5c389b87c24ce95e2c58a4a832cda Mon Sep 17 00:00:00 2001 From: Valentin Legras Date: Thu, 28 May 2026 14:21:03 +0000 Subject: [PATCH 5/7] chore: add actionButton and SCSS to WORDLIST Co-authored-by: Ona --- inst/WORDLIST | 2 ++ 1 file changed, 2 insertions(+) diff --git a/inst/WORDLIST b/inst/WORDLIST index fd3495e3b..112e98fb2 100644 --- a/inst/WORDLIST +++ b/inst/WORDLIST @@ -115,6 +115,7 @@ RefParameter Req Roadmap SBS +SCSS SDTM SDTMIG SMS @@ -144,6 +145,7 @@ Walkthrough XPT YAML aNCA's +actionButton adnca analysing analyte From fba29090463a654d1f08be6066d38e295210ed55 Mon Sep 17 00:00:00 2001 From: Wang Zheng Date: Thu, 4 Jun 2026 09:36:21 +0800 Subject: [PATCH 6/7] fix: correct .gitignore corruption and use tooltip instead of label for help dropdowns (#1320) - Fix .gitignore: missing trailing newline caused desktop.ini and tests/testthat/Rplots.pdf to be concatenated into one invalid pattern - Replace label="Help" with tooltip=tooltipOptions(title="Help") on all 12 shinyWidgets::dropdown() instances to preserve original icon-only visual appearance while maintaining accessibility Co-Authored-By: Claude Opus 4.7 --- .gitignore | 3 ++- inst/shiny/modules/tab_nca/excretion_analysis.R | 2 +- inst/shiny/modules/tab_nca/non_nca_ratios.R | 2 +- inst/shiny/modules/tab_nca/setup/data_imputation.R | 4 ++-- inst/shiny/modules/tab_nca/setup/general_exclusions.R | 2 +- inst/shiny/modules/tab_nca/setup/parameter_exclusions.R | 2 +- inst/shiny/modules/tab_nca/setup/parameter_selection.R | 2 +- inst/shiny/modules/tab_nca/setup/ratio_calculations_table.R | 2 +- inst/shiny/modules/tab_nca/setup/settings.R | 4 ++-- inst/shiny/modules/tab_nca/setup/slope_selector.R | 2 +- inst/shiny/modules/tab_tlg/tlg_module.R | 2 +- 11 files changed, 14 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index 9d89c418f..d33256211 100644 --- a/.gitignore +++ b/.gitignore @@ -15,4 +15,5 @@ inst/shiny/log/* .DS_Store # {shinytest2}: Ignore new debug snapshots for `$expect_values()` *_.new.png -desktop.initests/testthat/Rplots.pdf +desktop.ini +tests/testthat/Rplots.pdf diff --git a/inst/shiny/modules/tab_nca/excretion_analysis.R b/inst/shiny/modules/tab_nca/excretion_analysis.R index 4f47da79a..d847b985a 100644 --- a/inst/shiny/modules/tab_nca/excretion_analysis.R +++ b/inst/shiny/modules/tab_nca/excretion_analysis.R @@ -273,7 +273,7 @@ excretion_help_ui <- function() { ) ), style = "unite", - icon = icon("question"), label = "Help", + icon = icon("question"), tooltip = tooltipOptions(title = "Help"), status = "primary" ) } diff --git a/inst/shiny/modules/tab_nca/non_nca_ratios.R b/inst/shiny/modules/tab_nca/non_nca_ratios.R index 00090001e..b78fb3389 100644 --- a/inst/shiny/modules/tab_nca/non_nca_ratios.R +++ b/inst/shiny/modules/tab_nca/non_nca_ratios.R @@ -246,7 +246,7 @@ non_nca_ratio_help_ui <- function(title) { ), style = "unite", placement = "left", - icon = icon("question"), label = "Help", + icon = icon("question"), tooltip = tooltipOptions(title = "Help"), status = "primary" ) } diff --git a/inst/shiny/modules/tab_nca/setup/data_imputation.R b/inst/shiny/modules/tab_nca/setup/data_imputation.R index 984cc8798..e8b0f2a53 100644 --- a/inst/shiny/modules/tab_nca/setup/data_imputation.R +++ b/inst/shiny/modules/tab_nca/setup/data_imputation.R @@ -53,7 +53,7 @@ data_imputation_ui <- function(id) { ), style = "unite", right = TRUE, - icon = icon("question"), label = "Help", + icon = icon("question"), tooltip = tooltipOptions(title = "Help"), status = "primary", width = "500px" ) @@ -123,7 +123,7 @@ data_imputation_ui <- function(id) { ), style = "unite", right = TRUE, - icon = icon("question"), label = "Help", + icon = icon("question"), tooltip = tooltipOptions(title = "Help"), status = "primary", width = "500px" ) diff --git a/inst/shiny/modules/tab_nca/setup/general_exclusions.R b/inst/shiny/modules/tab_nca/setup/general_exclusions.R index 777196901..3d1b00c66 100644 --- a/inst/shiny/modules/tab_nca/setup/general_exclusions.R +++ b/inst/shiny/modules/tab_nca/setup/general_exclusions.R @@ -78,7 +78,7 @@ general_exclusions_ui <- function(id) { ), style = "unite", right = TRUE, - icon = icon("question"), label = "Help", + icon = icon("question"), tooltip = tooltipOptions(title = "Help"), status = "primary" ) ), diff --git a/inst/shiny/modules/tab_nca/setup/parameter_exclusions.R b/inst/shiny/modules/tab_nca/setup/parameter_exclusions.R index 993cc1fc3..a17979354 100644 --- a/inst/shiny/modules/tab_nca/setup/parameter_exclusions.R +++ b/inst/shiny/modules/tab_nca/setup/parameter_exclusions.R @@ -45,7 +45,7 @@ parameter_exclusions_ui <- function(id) { ), style = "unite", right = TRUE, - icon = icon("question"), label = "Help", + icon = icon("question"), tooltip = tooltipOptions(title = "Help"), status = "primary" ) ), diff --git a/inst/shiny/modules/tab_nca/setup/parameter_selection.R b/inst/shiny/modules/tab_nca/setup/parameter_selection.R index 83e88eb51..2fded7745 100644 --- a/inst/shiny/modules/tab_nca/setup/parameter_selection.R +++ b/inst/shiny/modules/tab_nca/setup/parameter_selection.R @@ -81,7 +81,7 @@ parameter_selection_ui <- function(id, ), style = "unite", right = TRUE, - icon = icon("question"), label = "Help", + icon = icon("question"), tooltip = tooltipOptions(title = "Help"), status = "primary", width = "500px" ), diff --git a/inst/shiny/modules/tab_nca/setup/ratio_calculations_table.R b/inst/shiny/modules/tab_nca/setup/ratio_calculations_table.R index e256d1166..595e2f878 100644 --- a/inst/shiny/modules/tab_nca/setup/ratio_calculations_table.R +++ b/inst/shiny/modules/tab_nca/setup/ratio_calculations_table.R @@ -77,7 +77,7 @@ ratios_table_ui <- function(id) { ), style = "unite", right = TRUE, - icon = icon("question"), label = "Help", + icon = icon("question"), tooltip = tooltipOptions(title = "Help"), status = "primary", width = "500px" ) diff --git a/inst/shiny/modules/tab_nca/setup/settings.R b/inst/shiny/modules/tab_nca/setup/settings.R index ddf29092d..11c9f1006 100644 --- a/inst/shiny/modules/tab_nca/setup/settings.R +++ b/inst/shiny/modules/tab_nca/setup/settings.R @@ -81,7 +81,7 @@ partial_intervals_ui <- function(id) { ), style = "unite", right = TRUE, - icon = icon("question"), label = "Help", + icon = icon("question"), tooltip = tooltipOptions(title = "Help"), status = "primary", width = "600px" ) @@ -186,7 +186,7 @@ settings_ui <- function(id) { ), style = "unite", right = TRUE, - icon = icon("question"), label = "Help", + icon = icon("question"), tooltip = tooltipOptions(title = "Help"), status = "primary", width = "400px" ) diff --git a/inst/shiny/modules/tab_nca/setup/slope_selector.R b/inst/shiny/modules/tab_nca/setup/slope_selector.R index 526d91cd8..f2c3f728c 100644 --- a/inst/shiny/modules/tab_nca/setup/slope_selector.R +++ b/inst/shiny/modules/tab_nca/setup/slope_selector.R @@ -79,7 +79,7 @@ slope_selector_ui <- function(id) { ), style = "unite", right = TRUE, - icon = icon("question"), label = "Help", + icon = icon("question"), tooltip = tooltipOptions(title = "Help"), status = "primary", width = "600px" ), diff --git a/inst/shiny/modules/tab_tlg/tlg_module.R b/inst/shiny/modules/tab_tlg/tlg_module.R index 2b234435b..8b0feac06 100644 --- a/inst/shiny/modules/tab_tlg/tlg_module.R +++ b/inst/shiny/modules/tab_tlg/tlg_module.R @@ -56,7 +56,7 @@ tlg_module_ui <- function(id, type, options) { ), style = "unite", right = TRUE, - icon = icon("question"), label = "Help", + icon = icon("question"), tooltip = tooltipOptions(title = "Help"), status = "primary" ), actionButton( From 35119235263caf2ef135a44f527136b51fa94426 Mon Sep 17 00:00:00 2001 From: Wang Zheng Date: Thu, 4 Jun 2026 09:37:47 +0800 Subject: [PATCH 7/7] fix: wrap pkcg02 example in \donttest{} to avoid Windows CI timeout (#1320) The pkcg02 example exceeds the 5s R CMD check timing threshold on Windows CI runners (5.83s elapsed), producing a NOTE that fails the check. The new inline ggplot2 implementation from #1316 runs slightly slower on Windows. Wrapping in \donttest{} skips the example during automated checks while keeping it runnable for users. Co-Authored-By: Claude Opus 4.7 --- R/g_pkcg.R | 3 ++- man/PKNCA_update_data_object.Rd | 2 +- man/pkcg02.Rd | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/R/g_pkcg.R b/R/g_pkcg.R index 4d94198e7..eef7b6ce4 100644 --- a/R/g_pkcg.R +++ b/R/g_pkcg.R @@ -393,6 +393,7 @@ g_pkcg02_log <- function(data, ...) { #' @importFrom stats setNames #' @examples +#' \donttest{ #' # Make an example small dataset #' adnca <- adnca_example #' adnca <- adnca[adnca$USUBJID %in% unique(adnca$USUBJID)[c(1, 2)],] @@ -403,7 +404,7 @@ g_pkcg02_log <- function(data, ...) { #' plots <- pkcg02(adnca) #' plots_log <- pkcg02(adnca, scale = "LOG") #' plotly::plotly_build(plots[[1]]) # View the first plot -#' +#' } #' @export #' @author Kezia Kobana pkcg02 <- function( diff --git a/man/PKNCA_update_data_object.Rd b/man/PKNCA_update_data_object.Rd index 5d25cc246..0caf9b823 100644 --- a/man/PKNCA_update_data_object.Rd +++ b/man/PKNCA_update_data_object.Rd @@ -62,7 +62,7 @@ by study type (forwarded to \code{\link[=update_main_intervals]{update_main_inte (forwarded to \code{\link[=update_main_intervals]{update_main_intervals()}}).} \item{custom_units_table}{Optional data frame with PPSTRESU overrides. -When provided, applied via \code{\link[dplyr:rows]{dplyr::rows_update()}} on the PKNCAdata units table.} +When provided, applied via \code{\link[dplyr:rows_update]{dplyr::rows_update()}} on the PKNCAdata units table.} } \value{ A fully configured \code{PKNCAdata} object. diff --git a/man/pkcg02.Rd b/man/pkcg02.Rd index 3e43b12b6..0d4f48b6d 100644 --- a/man/pkcg02.Rd +++ b/man/pkcg02.Rd @@ -88,6 +88,7 @@ A list of ggplot or plotly objects for each unique group. This function generates a list of plotly objects PK concentration-time profiles by group } \examples{ +\donttest{ # Make an example small dataset adnca <- adnca_example adnca <- adnca[adnca$USUBJID \%in\% unique(adnca$USUBJID)[c(1, 2)],] @@ -98,7 +99,7 @@ attr(adnca[["AVAL"]], "label") <- "Analysis value" plots <- pkcg02(adnca) plots_log <- pkcg02(adnca, scale = "LOG") plotly::plotly_build(plots[[1]]) # View the first plot - +} } \author{ Kezia Kobana