2024-12-09 14:00:44 +01:00
# ns <- NS(id)
ui_elements <- list (
2025-01-15 16:21:38 +01:00
##############################################################################
#########
######### Home panel
#########
##############################################################################
" home" = bslib :: nav_panel (
title = " freesearcheR" ,
2025-02-25 09:51:42 +01:00
shiny :: fluidRow (
shiny :: column ( width = 2 ) ,
shiny :: column (
width = 8 ,
shiny :: markdown ( readLines ( " www/intro.md" ) ) ,
shiny :: column ( width = 2 )
)
) ,
2025-01-15 16:21:38 +01:00
icon = shiny :: icon ( " home" )
) ,
2024-12-09 14:00:44 +01:00
##############################################################################
#########
######### Import panel
#########
##############################################################################
" import" = bslib :: nav_panel (
2024-12-13 13:37:19 +01:00
title = " Import" ,
2025-02-25 09:51:42 +01:00
shiny :: fluidRow (
shiny :: column ( width = 2 ) ,
shiny :: column (
width = 8 ,
2025-02-26 12:18:46 +01:00
shiny :: h4 ( " Choose your data source" ) ,
shiny :: br ( ) ,
shinyWidgets :: radioGroupButtons (
inputId = " source" ,
selected = " env" ,
choices = c (
" File upload" = " file" ,
2025-02-26 21:09:08 +01:00
" REDCap server export" = " redcap" ,
" Local or sample data" = " env"
2025-02-26 12:18:46 +01:00
) ,
width = " 100%"
) ,
shiny :: helpText ( " Upload a file from your device, get data directly from REDCap or select a sample data set for testing from the app." ) ,
2025-02-26 21:09:08 +01:00
shiny :: br ( ) ,
shiny :: br ( ) ,
2025-02-26 12:18:46 +01:00
shiny :: conditionalPanel (
condition = " input.source=='file'" ,
2025-03-11 13:42:57 +01:00
import_file_ui (
id = " file_import" ,
layout_params = " dropdown" ,
2025-03-13 12:41:50 +01:00
# title = "Choose a datafile to upload",
2025-03-17 15:00:13 +01:00
file_extensions = c ( " .csv" , " .tsv" , " .txt" , " .xls" , " .xlsx" , " .rds" , " .ods" , " .dta" )
2025-02-26 12:18:46 +01:00
)
) ,
shiny :: conditionalPanel (
condition = " input.source=='redcap'" ,
2025-03-13 12:41:50 +01:00
m_redcap_readUI (
id = " redcap_import" ,
title = " "
)
2025-02-26 12:18:46 +01:00
) ,
shiny :: conditionalPanel (
condition = " input.source=='env'" ,
import_globalenv_ui ( id = " env" , title = NULL )
) ,
shiny :: conditionalPanel (
condition = " input.source=='redcap'" ,
DT :: DTOutput ( outputId = " redcap_prev" )
) ,
shiny :: br ( ) ,
shiny :: br ( ) ,
2025-03-12 18:27:46 +01:00
shiny :: h5 ( " Specify variables to include" ) ,
2025-02-27 13:34:45 +01:00
shiny :: fluidRow (
2025-03-11 13:42:57 +01:00
shiny :: column (
width = 6 ,
shiny :: br ( ) ,
2025-03-12 18:27:46 +01:00
shiny :: p ( " Filter by completeness threshold and manual selection:" ) ,
2025-03-11 13:42:57 +01:00
shiny :: br ( ) ,
shiny :: br ( )
) ,
shiny :: column (
width = 6 ,
shinyWidgets :: noUiSliderInput (
inputId = " complete_cutoff" ,
label = NULL ,
min = 0 ,
max = 100 ,
step = 5 ,
value = 70 ,
format = shinyWidgets :: wNumbFormat ( decimals = 0 ) ,
color = datamods ::: get_primary_color ( )
) ,
2025-03-12 18:27:46 +01:00
shiny :: helpText ( " Filter variables with completeness above the specified percentage." ) ,
shiny :: br ( ) ,
shiny :: br ( ) ,
shiny :: uiOutput ( outputId = " import_var" )
2025-03-11 13:42:57 +01:00
)
2025-02-26 12:18:46 +01:00
) ,
shiny :: br ( ) ,
shiny :: br ( ) ,
shiny :: actionButton (
inputId = " act_start" ,
label = " Start" ,
width = " 100%" ,
2025-02-27 13:34:45 +01:00
icon = shiny :: icon ( " play" ) ,
disabled = TRUE
2025-02-26 12:18:46 +01:00
) ,
shiny :: helpText ( ' After importing, hit "Start" or navigate to the desired tab.' ) ,
shiny :: br ( ) ,
shiny :: br ( ) ,
shiny :: column ( width = 2 )
2025-02-25 09:51:42 +01:00
)
)
2024-12-13 13:37:19 +01:00
) ,
##############################################################################
#########
######### Data overview panel
#########
##############################################################################
2024-12-16 22:21:54 +01:00
" overview" =
2025-01-15 16:21:38 +01:00
# bslib::nav_panel_hidden(
2024-12-16 22:21:54 +01:00
bslib :: nav_panel (
# value = "overview",
2025-01-15 16:21:38 +01:00
title = " Data" ,
2024-12-16 22:21:54 +01:00
bslib :: navset_bar (
fillable = TRUE ,
2025-01-15 16:21:38 +01:00
bslib :: nav_panel (
2025-02-26 12:18:46 +01:00
title = " Overview" ,
tags $ h3 ( " Overview and filtering" ) ,
2025-02-25 09:51:42 +01:00
fluidRow (
shiny :: column (
width = 9 ,
shiny :: tags $ p (
" B e l o w i s a s h o r t s u m m a r y t a b l e o f t h e p r o v i d e d d a t a .
On the right hand side you have the option to create filters.
At the bottom you ' l l f i n d a r a w o v e r v i e w o f t h e o r i g i n a l v s t h e m o d i f i e d d a t a . "
)
)
) ,
fluidRow (
shiny :: column (
width = 9 ,
data_summary_ui ( id = " data_summary" )
) ,
shiny :: column (
width = 3 ,
IDEAFilter :: IDEAFilter_ui ( " data_filter" ) ,
shiny :: tags $ br ( )
)
)
) ,
bslib :: nav_panel (
2025-02-26 12:18:46 +01:00
title = " Browse" ,
tags $ h3 ( " Browse the provided data" ) ,
shiny :: tags $ p (
" Below is a table with all the modified data provided to browse and understand data."
) ,
shinyWidgets :: html_dependency_winbox ( ) ,
fluidRow (
toastui :: datagridOutput ( outputId = " table_mod" )
) ,
shiny :: tags $ br ( ) ,
shiny :: tags $ br ( ) ,
shiny :: tags $ br ( ) ,
shiny :: tags $ br ( ) ,
shiny :: tags $ br ( )
) ,
bslib :: nav_panel (
title = " Modify" ,
tags $ h3 ( " Subset, rename and convert variables" ) ,
2025-02-25 09:51:42 +01:00
fluidRow (
shiny :: column (
width = 9 ,
2025-03-13 15:04:29 +01:00
shiny :: tags $ p ( shiny :: markdown ( " Below, are several options to update variables (rename, set new labels (for nicer tables in the report) and change variable classes (numeric, factor/categorical etc.).), modify factor/categorical variables as well as create new factor from a continous variable or new variables with *R* code." ) )
2025-02-26 12:18:46 +01:00
)
) ,
2025-03-11 13:42:57 +01:00
shiny :: tags $ br ( ) ,
shiny :: tags $ br ( ) ,
2025-02-26 12:18:46 +01:00
fluidRow (
shiny :: column (
width = 2
2025-02-25 09:51:42 +01:00
) ,
2025-02-26 12:18:46 +01:00
shiny :: column (
width = 8 ,
fluidRow (
shiny :: column (
width = 6 ,
2025-03-13 15:04:29 +01:00
tags $ h4 ( " Update or modify variables" ) ,
2025-02-26 12:18:46 +01:00
shiny :: tags $ br ( ) ,
shiny :: actionButton (
inputId = " modal_variables" ,
label = " Subset, rename and change class/type" ,
width = " 100%"
) ,
shiny :: tags $ br ( ) ,
shiny :: helpText ( " Subset variables, rename variables and labels, and apply new class to variables" ) ,
shiny :: tags $ br ( ) ,
shiny :: tags $ br ( ) ,
shiny :: actionButton (
inputId = " modal_update" ,
label = " Reorder factor levels" ,
width = " 100%"
) ,
shiny :: tags $ br ( ) ,
shiny :: helpText ( " Reorder the levels of factor/categorical variables." ) ,
shiny :: tags $ br ( ) ,
shiny :: tags $ br ( )
) ,
shiny :: column (
width = 6 ,
tags $ h4 ( " Create new variables" ) ,
shiny :: tags $ br ( ) ,
shiny :: actionButton (
inputId = " modal_cut" ,
2025-03-13 15:04:29 +01:00
label = " New factor" ,
2025-02-26 12:18:46 +01:00
width = " 100%"
) ,
shiny :: tags $ br ( ) ,
2025-03-13 15:04:29 +01:00
shiny :: helpText ( " Create factor/categorical variable from a continous variable (number/date/time)." ) ,
2025-02-26 12:18:46 +01:00
shiny :: tags $ br ( ) ,
shiny :: tags $ br ( ) ,
shiny :: actionButton (
inputId = " modal_column" ,
label = " New variable" ,
width = " 100%"
) ,
shiny :: tags $ br ( ) ,
shiny :: helpText ( shiny :: markdown ( " Create a new variable/column based on an *R*-expression." ) ) ,
shiny :: tags $ br ( ) ,
shiny :: tags $ br ( )
)
) ,
tags $ h4 ( " Restore" ) ,
shiny :: actionButton (
inputId = " data_reset" ,
label = " Restore original data" ,
width = " 100%"
) ,
shiny :: tags $ br ( ) ,
shiny :: helpText ( " Reset to original imported dataset. Careful! There is no un-doing." )
2025-02-25 09:51:42 +01:00
) ,
2025-02-26 12:18:46 +01:00
shiny :: column (
width = 2
)
) ,
shiny :: tags $ br ( ) ,
shiny :: tags $ br ( ) ,
tags $ h4 ( " Restore" ) ,
shiny :: tags $ br ( ) ,
shiny :: tags $ p (
" Below, you'll find a raw overview of the original vs the modified data."
2025-02-25 09:51:42 +01:00
) ,
2025-02-26 12:18:46 +01:00
shiny :: tags $ br ( ) ,
shiny :: tags $ br ( ) ,
2025-02-25 09:51:42 +01:00
fluidRow (
column (
width = 6 ,
tags $ b ( " Original data:" ) ,
# verbatimTextOutput("original"),
verbatimTextOutput ( " original_str" )
) ,
column (
width = 6 ,
tags $ b ( " Modified data:" ) ,
# verbatimTextOutput("modified"),
verbatimTextOutput ( " modified_str" )
)
)
2024-12-09 14:00:44 +01:00
)
2024-12-16 22:21:54 +01:00
)
) ,
2024-12-09 14:00:44 +01:00
##############################################################################
#########
2025-02-07 16:24:09 +01:00
######### Descriptive analyses panel
2024-12-09 14:00:44 +01:00
#########
##############################################################################
2025-02-07 16:24:09 +01:00
" describe" =
2024-12-16 22:21:54 +01:00
bslib :: nav_panel (
2025-02-07 16:24:09 +01:00
title = " Evaluate" ,
id = " navdescribe" ,
2024-12-16 22:21:54 +01:00
bslib :: navset_bar (
title = " " ,
sidebar = bslib :: sidebar (
2025-01-17 15:59:24 +01:00
bslib :: accordion (
open = " acc_chars" ,
multiple = FALSE ,
2025-01-30 14:32:11 +01:00
bslib :: accordion_panel (
value = " acc_chars" ,
title = " Characteristics" ,
icon = bsicons :: bs_icon ( " table" ) ,
shiny :: uiOutput ( " strat_var" ) ,
shiny :: helpText ( " Only factor/categorical variables are available for stratification. Go back to the 'Data' tab to reclass a variable if it's not on the list." ) ,
shiny :: conditionalPanel (
condition = " input.strat_var!='none'" ,
shiny :: radioButtons (
inputId = " add_p" ,
label = " Compare strata?" ,
selected = " no" ,
inline = TRUE ,
choices = list (
" No" = " no" ,
" Yes" = " yes"
)
) ,
shiny :: helpText ( " Option to perform statistical comparisons between strata in baseline table." )
)
) ,
2025-02-07 16:24:09 +01:00
bslib :: accordion_panel (
2025-02-07 17:09:52 +01:00
vlaue = " acc_cor" ,
2025-02-07 16:24:09 +01:00
title = " Correlations" ,
2025-03-13 14:13:18 +01:00
icon = bsicons :: bs_icon ( " bounding-box" ) ,
2025-02-07 17:09:52 +01:00
shiny :: uiOutput ( " outcome_var_cor" ) ,
2025-03-13 14:13:18 +01:00
shiny :: helpText ( " To avoid evaluating the correlation of the outcome variable, this can be excluded from the plot or select 'none'." ) ,
2025-02-07 17:09:52 +01:00
shiny :: br ( ) ,
2025-02-25 09:51:42 +01:00
shinyWidgets :: noUiSliderInput (
2025-02-07 16:24:09 +01:00
inputId = " cor_cutoff" ,
label = " Correlation cut-off" ,
min = 0 ,
max = 1 ,
2025-02-25 09:51:42 +01:00
step = .01 ,
2025-02-07 17:09:52 +01:00
value = .8 ,
2025-02-25 09:51:42 +01:00
format = shinyWidgets :: wNumbFormat ( decimals = 2 ) ,
color = datamods ::: get_primary_color ( )
2025-03-13 14:13:18 +01:00
) ,
shiny :: helpText ( " Set the cut-off for considered 'highly correlated'." )
2025-02-07 16:24:09 +01:00
)
)
) ,
bslib :: nav_panel (
title = " Baseline characteristics" ,
gt :: gt_output ( outputId = " table1" )
) ,
bslib :: nav_panel (
title = " Variable correlations" ,
data_correlations_ui ( id = " correlations" , height = 600 )
)
)
) ,
##############################################################################
#########
2025-02-25 09:51:42 +01:00
######### Download panel
#########
##############################################################################
" visuals" = bslib :: nav_panel (
title = " Visuals" ,
id = " navvisuals" ,
do.call (
bslib :: navset_bar ,
c (
data_visuals_ui ( " visuals" ) ,
shiny :: tagList (
bslib :: nav_spacer ( ) ,
bslib :: nav_panel (
title = " Notes" ,
shiny :: fluidRow (
shiny :: column ( width = 2 ) ,
shiny :: column (
width = 8 ,
shiny :: markdown ( readLines ( " www/notes_visuals.md" ) ) ,
shiny :: column ( width = 2 )
)
)
)
)
)
)
) ,
##############################################################################
#########
2025-02-07 16:24:09 +01:00
######### Regression analyses panel
#########
##############################################################################
" analyze" =
bslib :: nav_panel (
title = " Regression" ,
id = " navanalyses" ,
bslib :: navset_bar (
title = " " ,
# bslib::layout_sidebar(
# fillable = TRUE,
sidebar = bslib :: sidebar (
bslib :: accordion (
open = " acc_reg" ,
multiple = FALSE ,
2025-01-30 14:32:11 +01:00
bslib :: accordion_panel (
value = " acc_reg" ,
title = " Regression" ,
icon = bsicons :: bs_icon ( " calculator" ) ,
shiny :: uiOutput ( " outcome_var" ) ,
# shiny::selectInput(
# inputId = "design",
# label = "Study design",
# selected = "no",
# inline = TRUE,
# choices = list(
# "Cross-sectional" = "cross-sectional"
# )
# ),
shiny :: uiOutput ( " regression_type" ) ,
2025-01-17 15:59:24 +01:00
shiny :: radioButtons (
2025-01-30 14:32:11 +01:00
inputId = " add_regression_p" ,
label = " Add p-value" ,
2025-01-17 15:59:24 +01:00
inline = TRUE ,
2025-01-30 14:32:11 +01:00
selected = " yes" ,
2025-01-17 15:59:24 +01:00
choices = list (
2025-01-30 14:32:11 +01:00
" Yes" = " yes" ,
" No" = " no"
2025-01-17 15:59:24 +01:00
)
) ,
2025-01-30 14:32:11 +01:00
bslib :: input_task_button (
id = " load" ,
label = " Analyse" ,
# icon = shiny::icon("pencil", lib = "glyphicon"),
icon = bsicons :: bs_icon ( " pencil" ) ,
label_busy = " Working..." ,
icon_busy = fontawesome :: fa_i ( " arrows-rotate" ,
class = " fa-spin" ,
" aria-hidden" = " true"
) ,
type = " secondary" ,
auto_reset = TRUE
2025-01-17 15:59:24 +01:00
) ,
2025-02-07 16:24:09 +01:00
shiny :: helpText ( " Press 'Analyse' again after changing parameters." ) ,
shiny :: tags $ br ( ) ,
2025-01-30 14:32:11 +01:00
shiny :: uiOutput ( " plot_model" )
2025-01-17 15:59:24 +01:00
) ,
2025-01-30 14:32:11 +01:00
bslib :: accordion_panel (
value = " acc_advanced" ,
title = " Advanced" ,
icon = bsicons :: bs_icon ( " gear" ) ,
shiny :: radioButtons (
inputId = " all" ,
label = " Specify covariables" ,
inline = TRUE , selected = 2 ,
choiceNames = c (
" Yes" ,
" No"
) ,
choiceValues = c ( 1 , 2 )
) ,
shiny :: conditionalPanel (
condition = " input.all==1" ,
shiny :: uiOutput ( " include_vars" )
2025-01-17 15:59:24 +01:00
)
)
2024-12-16 22:21:54 +01:00
) ,
2025-01-17 15:59:24 +01:00
# shiny::helpText(em("Please specify relevant settings for your data, and press 'Analyse'")),
# shiny::radioButtons(
# inputId = "specify_factors",
# label = "Specify categorical variables?",
# selected = "no",
# inline = TRUE,
# choices = list(
# "Yes" = "yes",
# "No" = "no"
# )
# ),
# shiny::conditionalPanel(
# condition = "input.specify_factors=='yes'",
# shiny::uiOutput("factor_vars")
# ),
2024-12-18 11:26:00 +01:00
# shiny::conditionalPanel(
# condition = "output.ready=='yes'",
2025-01-17 15:59:24 +01:00
# shiny::tags$hr(),
2024-12-13 13:37:19 +01:00
) ,
2024-12-16 22:21:54 +01:00
bslib :: nav_panel (
title = " Regression table" ,
gt :: gt_output ( outputId = " table2" )
2024-12-13 13:37:19 +01:00
) ,
2024-12-16 22:21:54 +01:00
bslib :: nav_panel (
2025-01-30 14:32:11 +01:00
title = " Coefficient plot" ,
shiny :: plotOutput ( outputId = " regression_plot" )
) ,
bslib :: nav_panel (
title = " Model checks" ,
2024-12-16 22:21:54 +01:00
shiny :: plotOutput ( outputId = " check" )
2025-01-30 14:32:11 +01:00
# shiny::uiOutput(outputId = "check_1")
2024-12-16 22:21:54 +01:00
)
2024-12-09 14:00:44 +01:00
)
2024-12-16 22:21:54 +01:00
) ,
2024-12-09 14:00:44 +01:00
##############################################################################
#########
2025-02-07 16:24:09 +01:00
######### Download panel
#########
##############################################################################
" download" =
bslib :: nav_panel (
title = " Download" ,
id = " navdownload" ,
2025-02-25 09:51:42 +01:00
shiny :: fluidRow (
shiny :: column ( width = 2 ) ,
shiny :: column (
width = 8 ,
2025-02-26 12:18:46 +01:00
shiny :: fluidRow (
shiny :: column (
width = 6 ,
shiny :: h4 ( " Report" ) ,
shiny :: helpText ( " Choose your favourite output file format for further work, and download, when the analyses are done." ) ,
shiny :: br ( ) ,
shiny :: br ( ) ,
shiny :: selectInput (
inputId = " output_type" ,
label = " Output format" ,
selected = NULL ,
choices = list (
" MS Word" = " docx" ,
" LibreOffice" = " odt"
# ,
# "PDF" = "pdf",
# "All the above" = "all"
)
) ,
shiny :: br ( ) ,
# Button
shiny :: downloadButton (
outputId = " report" ,
label = " Download report" ,
icon = shiny :: icon ( " download" )
)
# shiny::helpText("If choosing to output to MS Word, please note, that when opening the document, two errors will pop-up. Choose to repair and choose not to update references. The issue is being worked on. You can always choose LibreOffice instead."),
) ,
shiny :: column (
width = 6 ,
shiny :: h4 ( " Data" ) ,
shiny :: helpText ( " Choose your favourite output data format to download the modified data." ) ,
shiny :: br ( ) ,
shiny :: br ( ) ,
shiny :: selectInput (
inputId = " data_type" ,
label = " Data format" ,
selected = NULL ,
choices = list (
" R" = " rds" ,
" stata" = " dta" ,
" CSV" = " csv"
)
) ,
shiny :: helpText ( " No metadata is saved when exporting to csv." ) ,
shiny :: br ( ) ,
shiny :: br ( ) ,
# Button
shiny :: downloadButton (
outputId = " data_modified" ,
label = " Download data" ,
icon = shiny :: icon ( " download" )
)
2025-02-07 16:24:09 +01:00
)
) ,
shiny :: br ( ) ,
2025-02-25 09:51:42 +01:00
shiny :: br ( ) ,
2025-03-18 08:27:05 +01:00
shiny :: h4 ( " Code snippets" ) ,
shiny :: tags $ p ( " Below are the code used to create the final data set. This can be saved for reproducibility. The code may not be 100 % correct, but kan be used for learning and example code to get started on coding yourself." ) ,
2025-02-26 12:18:46 +01:00
shiny :: verbatimTextOutput ( outputId = " code_import" ) ,
shiny :: verbatimTextOutput ( outputId = " code_data" ) ,
shiny :: verbatimTextOutput ( outputId = " code_filter" ) ,
shiny :: tags $ br ( ) ,
2025-02-07 16:24:09 +01:00
shiny :: br ( ) ,
2025-02-26 12:18:46 +01:00
shiny :: column ( width = 2 )
2025-02-25 09:51:42 +01:00
)
)
2025-02-07 16:24:09 +01:00
) ,
##############################################################################
#########
2024-12-09 14:00:44 +01:00
######### Documentation panel
#########
##############################################################################
2025-01-16 12:23:39 +01:00
" docs" = bslib :: nav_item (
# shiny::img(shiny::icon("book")),
shiny :: tags $ a (
2025-03-17 21:13:49 +01:00
href = " https://agdamsbo.github.io/FreesearchR/" ,
2025-01-16 14:24:38 +01:00
" Docs (external)" ,
target = " _blank" ,
rel = " noopener noreferrer"
)
2024-12-09 14:00:44 +01:00
)
2025-01-16 12:23:39 +01:00
# bslib::nav_panel(
# title = "Documentation",
# # shiny::tags$iframe("www/docs.html", height=600, width=535),
# shiny::htmlOutput("docs_file"),
# shiny::br()
# )
2024-12-09 14:00:44 +01:00
)
2024-12-18 10:37:37 +01:00
# Initial attempt at creating light and dark versions
light <- custom_theme ( )
2024-12-18 11:26:00 +01:00
dark <- custom_theme (
bg = " #000" ,
fg = " #fff"
)
2024-12-18 10:37:37 +01:00
# Fonts to consider:
# https://webdesignerdepot.com/17-open-source-fonts-youll-actually-love/
2025-01-15 16:21:38 +01:00
ui <- bslib :: page_fixed (
2025-01-16 14:24:38 +01:00
shiny :: tags $ head ( includeHTML ( ( " www/umami-app.html" ) ) ) ,
2025-01-15 16:21:38 +01:00
shiny :: tags $ style (
type = " text/css" ,
# add the name of the tab you want to use as title in data-value
shiny :: HTML (
" . c o n t a i n e r - f l u i d > . n a v > l i >
a [data - value = ' freesearcheR' ] { font - size : 28 px } "
)
) ,
2024-12-09 14:00:44 +01:00
title = " freesearcheR" ,
2024-12-18 10:37:37 +01:00
theme = light ,
shiny :: useBusyIndicators ( ) ,
2025-01-15 16:21:38 +01:00
bslib :: page_navbar (
2024-12-09 14:00:44 +01:00
id = " main_panel" ,
2025-01-15 16:21:38 +01:00
ui_elements $ home ,
2024-12-09 14:00:44 +01:00
ui_elements $ import ,
2024-12-13 13:37:19 +01:00
ui_elements $ overview ,
2025-02-07 16:24:09 +01:00
ui_elements $ describe ,
2025-02-25 09:51:42 +01:00
ui_elements $ visuals ,
2024-12-09 14:00:44 +01:00
ui_elements $ analyze ,
2025-02-07 16:24:09 +01:00
ui_elements $ download ,
2025-01-16 12:23:39 +01:00
bslib :: nav_spacer ( ) ,
2024-12-19 11:34:25 +01:00
ui_elements $ docs ,
2025-01-15 16:21:38 +01:00
fillable = FALSE ,
2024-12-19 11:34:25 +01:00
footer = shiny :: tags $ footer (
style = " background-color: #14131326; padding: 4px; text-align: center; bottom: 0; width: 100%;" ,
shiny :: p (
style = " margin: 1" ,
2025-01-15 16:21:38 +01:00
" Data is only stored for analyses and deleted immediately afterwards."
) ,
2024-12-19 11:34:25 +01:00
shiny :: p (
style = " margin: 1; color: #888;" ,
2025-03-17 21:13:49 +01:00
" AG Damsbo | v" , app_version ( ) , " | AGPLv3 license | " , shiny :: tags $ a ( " Source on Github" , href = " https://github.com/agdamsbo/FreesearchR/" , target = " _blank" , rel = " noopener noreferrer" )
2024-12-19 11:34:25 +01:00
) ,
)
2024-12-09 14:00:44 +01:00
)
)