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 (
2025-03-19 13:10:56 +01:00
title = " FreesearchR" ,
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" )
) ,
2025-04-03 13:11:02 +02:00
shiny :: conditionalPanel (
condition = " output.data_loaded == true" ,
2025-02-26 12:18:46 +01:00
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 ,
2025-04-03 13:11:02 +02:00
update_on = " end" ,
2025-03-11 13:42:57 +01:00
min = 0 ,
max = 100 ,
step = 5 ,
value = 70 ,
format = shinyWidgets :: wNumbFormat ( decimals = 0 ) ,
color = datamods ::: get_primary_color ( )
) ,
2025-04-03 13:11:02 +02:00
shiny :: helpText ( " Exclude variables with completeness below the specified percentage." ) ,
2025-03-12 18:27:46 +01:00
shiny :: br ( ) ,
shiny :: br ( ) ,
2025-03-24 14:40:30 +01:00
shiny :: uiOutput ( outputId = " import_var" ) ,
shiny :: uiOutput ( outputId = " data_info_import" , inline = TRUE )
2025-03-11 13:42:57 +01:00
)
2025-04-03 13:11:02 +02: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 ,
2025-03-24 14:40:30 +01:00
shiny :: uiOutput ( outputId = " data_info" , inline = TRUE ) ,
2025-02-25 09:51:42 +01:00
shiny :: tags $ p (
2025-03-24 14:40:30 +01:00
" Below is a short summary table, on the right you can create data filters."
2025-02-25 09:51:42 +01:00
)
)
) ,
fluidRow (
shiny :: column (
width = 9 ,
data_summary_ui ( id = " data_summary" )
) ,
shiny :: column (
width = 3 ,
2025-04-02 11:31:04 +02:00
shiny :: actionButton (
inputId = " modal_browse" ,
label = " Browse data" ,
width = " 100%"
) ,
shiny :: tags $ br ( ) ,
shiny :: tags $ br ( ) ,
2025-02-25 09:51:42 +01:00
IDEAFilter :: IDEAFilter_ui ( " data_filter" ) ,
shiny :: tags $ br ( )
)
)
) ,
2025-04-02 11:31:04 +02:00
# bslib::nav_panel(
# 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()
# ),
2025-02-26 12:18:46 +01:00
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-04-03 06:31:05 +02:00
shiny :: tags $ p ( shiny :: markdown ( " Below, are several options for simple data manipulation like update variables by renaming, creating new labels (for nicer tables in the report) and changing variable classes (numeric, factor/categorical etc.)." ) ,
shiny :: tags $ p ( " There are also more advanced options to modify factor/categorical variables as well as create new factor from a continous variable or new variables with *R* code. At the bottom you can restore the original data." ) )
2025-02-26 12:18:46 +01:00
)
) ,
2025-04-03 06:31:05 +02:00
# shiny::tags$br(),
update_variables_ui ( " modal_variables" ) ,
2025-03-11 13:42:57 +01:00
shiny :: tags $ br ( ) ,
shiny :: tags $ br ( ) ,
2025-04-03 06:31:05 +02:00
tags $ h4 ( " Advanced data manipulation" ) ,
2025-04-02 11:31:04 +02:00
shiny :: tags $ br ( ) ,
shiny :: tags $ br ( ) ,
2025-04-03 06:31:05 +02:00
shiny :: fluidRow (
2025-02-26 12:18:46 +01:00
shiny :: column (
2025-04-03 06:31:05 +02:00
width = 4 ,
shiny :: actionButton (
inputId = " modal_update" ,
label = " Reorder factor levels" ,
width = " 100%"
) ,
shiny :: tags $ br ( ) ,
shiny :: helpText ( " Reorder the levels of factor/categorical variables." ) ,
2025-02-25 09:51:42 +01:00
) ,
2025-02-26 12:18:46 +01:00
shiny :: column (
2025-04-03 06:31:05 +02:00
width = 4 ,
shiny :: actionButton (
inputId = " modal_cut" ,
label = " New factor" ,
width = " 100%"
) ,
2025-04-02 11:31:04 +02:00
shiny :: tags $ br ( ) ,
2025-04-03 06:31:05 +02:00
shiny :: helpText ( " Create factor/categorical variable from a continous variable (number/date/time)." )
2025-02-25 09:51:42 +01:00
) ,
2025-02-26 12:18:46 +01:00
shiny :: column (
2025-04-03 06:31:05 +02:00
width = 4 ,
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." ) )
2025-02-26 12:18:46 +01:00
)
) ,
shiny :: tags $ br ( ) ,
shiny :: tags $ br ( ) ,
2025-04-02 11:31:04 +02:00
tags $ h4 ( " Compare modified data to original" ) ,
2025-02-26 12:18:46 +01:00
shiny :: tags $ br ( ) ,
shiny :: tags $ p (
2025-04-03 06:31:05 +02:00
" Raw print 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 ( ) ,
2025-04-03 06:31:05 +02:00
shiny :: fluidRow (
shiny :: column (
2025-02-25 09:51:42 +01:00
width = 6 ,
2025-04-03 06:31:05 +02:00
shiny :: tags $ b ( " Original data:" ) ,
2025-02-25 09:51:42 +01:00
# verbatimTextOutput("original"),
2025-04-03 06:31:05 +02:00
shiny :: verbatimTextOutput ( " original_str" )
2025-02-25 09:51:42 +01:00
) ,
2025-04-03 06:31:05 +02:00
shiny :: column (
2025-02-25 09:51:42 +01:00
width = 6 ,
2025-04-03 06:31:05 +02:00
shiny :: tags $ b ( " Modified data:" ) ,
2025-02-25 09:51:42 +01:00
# verbatimTextOutput("modified"),
2025-04-03 06:31:05 +02:00
shiny :: verbatimTextOutput ( " modified_str" )
2025-02-25 09:51:42 +01:00
)
2025-04-03 06:31:05 +02:00
) ,
shiny :: tags $ br ( ) ,
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." ) ,
shiny :: tags $ br ( )
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-03-20 13:13:14 +01:00
) ,
shiny :: br ( ) ,
shiny :: br ( ) ,
shiny :: actionButton (
inputId = " act_eval" ,
label = " Evaluate" ,
width = " 100%" ,
icon = shiny :: icon ( " calculator" ) ,
disabled = FALSE
2025-01-30 14:32:11 +01:00
)
) ,
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" ,
2025-04-02 11:31:04 +02:00
do.call (
bslib :: navset_bar ,
regression_ui ( " regression" )
2024-12-09 14:00:44 +01:00
)
2025-04-02 11:31:04 +02:00
# bslib::navset_bar(
# title = "",
# # bslib::layout_sidebar(
# # fillable = TRUE,
# sidebar = bslib::sidebar(
# shiny::uiOutput(outputId = "data_info_regression", inline = TRUE),
# bslib::accordion(
# open = "acc_reg",
# multiple = FALSE,
# 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"),
# shiny::radioButtons(
# inputId = "add_regression_p",
# label = "Add p-value",
# inline = TRUE,
# selected = "yes",
# choices = list(
# "Yes" = "yes",
# "No" = "no"
# )
# ),
# 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
# ),
# shiny::helpText("Press 'Analyse' again after changing parameters."),
# shiny::tags$br(),
# shiny::uiOutput("plot_model")
# ),
# 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("regression_vars")
# )
# )
# ),
# # 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")
# # ),
# # shiny::conditionalPanel(
# # condition = "output.ready=='yes'",
# # shiny::tags$hr(),
# ),
# bslib::nav_panel(
# title = "Regression table",
# gt::gt_output(outputId = "table2")
# ),
# bslib::nav_panel(
# title = "Coefficient plot",
# shiny::plotOutput(outputId = "regression_plot")
# ),
# bslib::nav_panel(
# title = "Model checks",
# shiny::plotOutput(outputId = "check")
# # shiny::uiOutput(outputId = "check_1")
# )
# )
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 >
2025-03-19 13:10:56 +01:00
a [data - value = ' FreesearchR' ] { font - size : 28 px } "
2025-01-15 16:21:38 +01:00
)
) ,
2025-03-19 13:10:56 +01:00
title = " FreesearchR" ,
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-04-02 11:31:04 +02:00
" AG Damsbo | v" , app_version ( ) , " | " , shiny :: tags $ a ( " AGPLv3 license" , href = " https://github.com/agdamsbo/FreesearchR/blob/main/LICENSE.md" , target = " _blank" , rel = " noopener noreferrer" ) , " | " , 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
)
)