FreesearchR/inst/apps/data_analysis_modules/ui.R

332 lines
11 KiB
R
Raw Normal View History

# ns <- NS(id)
ui_elements <- list(
##############################################################################
#########
######### Import panel
#########
##############################################################################
"import" = bslib::nav_panel(
2024-12-13 13:37:19 +01:00
title = "Import",
shiny::fluidRow(
column(
width = 6,
shiny::h4("Choose your data source"),
# shiny::conditionalPanel(
# condition = "output.has_input=='yes'",
# # Input: Select a file ----
# shiny::helpText("Analyses are performed on provided data")
# ),
# shiny::conditionalPanel(
# condition = "output.has_input=='no'",
# Input: Select a file ----
shinyWidgets::radioGroupButtons(
inputId = "source",
# label = "Choice: ",
2024-12-17 11:30:17 +01:00
choices = c(
"File upload" = "file",
"REDCap server" = "redcap",
2024-12-19 11:34:25 +01:00
"Local data" = "env"
2024-12-17 11:30:17 +01:00
),
# checkIcon = list(
# yes = icon("square-check"),
# no = icon("square")
# ),
width = "100%"
2024-12-13 13:37:19 +01:00
),
shiny::conditionalPanel(
condition = "input.source=='file'",
datamods::import_file_ui("file_import",
2024-12-17 11:30:17 +01:00
title = "Choose a datafile to upload",
file_extensions = c(".csv", ".txt", ".xls", ".xlsx", ".rds", ".fst", ".sas7bdat", ".sav", ".ods", ".dta")
2024-12-13 13:37:19 +01:00
)
),
shiny::conditionalPanel(
condition = "input.source=='redcap'",
m_redcap_readUI("redcap_import")
),
shiny::conditionalPanel(
condition = "input.source=='env'",
import_globalenv_ui(id = "env", title = NULL)
2024-12-13 13:37:19 +01:00
)
# )
2024-12-13 13:37:19 +01:00
),
column(
width = 6,
2024-12-17 11:30:17 +01:00
shiny::markdown(readLines("www/intro.md"))
2024-12-13 13:37:19 +01:00
)
),
shiny::conditionalPanel(
2024-12-13 13:37:19 +01:00
condition = "input.source=='redcap'",
DT::DTOutput(outputId = "redcap_prev")
),
shiny::br(),
2024-12-19 11:34:25 +01:00
shiny::actionButton(
inputId = "act_start",
label = "Start",
width = "100%",
icon = shiny::icon("play")
),
2024-12-19 14:14:21 +01:00
shiny::helpText('After importing, hit "Start" or navigate to the desired tab.'),
2024-12-19 11:34:25 +01:00
shiny::br(),
shiny::br()
2024-12-13 13:37:19 +01:00
),
##############################################################################
#########
######### Data overview panel
#########
##############################################################################
"overview" =
2024-12-19 11:34:25 +01:00
# bslib::nav_panel_hidden(
bslib::nav_panel(
# value = "overview",
2024-12-17 11:30:17 +01:00
title = "Modifications",
bslib::navset_bar(
fillable = TRUE,
# bslib::nav_panel(
# title = "Edit",
# datamods::edit_data_ui(id = "edit_data")
# ),
# bslib::nav_panel(
# title = "Overview",
# DT::DTOutput(outputId = "table")
# ),
bslib::nav_panel(
title = "Rename and select",
tags$h3("Select, rename and convert variables"),
fluidRow(
column(
width = 6,
# radioButtons(),
shiny::actionButton("data_reset", "Restore original data"),
shiny::tags$br(),
shiny::helpText("Reset to original imported dataset"),
shiny::tags$br(),
datamods::update_variables_ui("vars_update")
),
column(
width = 6,
tags$b("Original data:"),
# verbatimTextOutput("original"),
verbatimTextOutput("original_str"),
tags$b("Modified data:"),
# verbatimTextOutput("modified"),
verbatimTextOutput("modified_str")
)
2024-12-13 13:37:19 +01:00
)
),
bslib::nav_panel(
title = "Filter and modify",
shinyWidgets::html_dependency_winbox(),
fluidRow(
# column(
# width = 3,
# shiny::uiOutput("filter_vars"),
# shiny::conditionalPanel(
# condition = "(typeof input.filter_vars !== 'undefined' && input.filter_vars.length > 0)",
# datamods::filter_data_ui("filtering", max_height = "500px")
# )
# ),
# column(
# width = 9,
# DT::DTOutput(outputId = "filtered_table"),
# tags$b("Code dplyr:"),
# verbatimTextOutput(outputId = "filtered_code")
# ),
shiny::column(
width = 8,
toastui::datagridOutput(outputId = "table_mod"),
shiny::tags$b("Reproducible code:"),
shiny::verbatimTextOutput(outputId = "filtered_code")
),
shiny::column(
width = 4,
shiny::actionButton("modal_cut", "Create factor from a variable"),
shiny::tags$br(),
shiny::tags$br(),
shiny::actionButton("modal_update", "Reorder factor levels"),
shiny::tags$br(),
shiny::tags$br(),
IDEAFilter::IDEAFilter_ui("data_filter") # ,
# shiny::actionButton("save_filter", "Apply the filter")
)
2024-12-13 13:37:19 +01:00
)
)
2024-12-13 13:37:19 +01:00
# column(
# 8,
# shiny::verbatimTextOutput("filtered_code"),
# DT::DTOutput("filtered_table")
# ),
# column(4, IDEAFilter::IDEAFilter_ui("data_filter"))
)
),
##############################################################################
#########
######### Data analyses panel
#########
##############################################################################
"analyze" =
2024-12-19 11:34:25 +01:00
# bslib::nav_panel_hidden(
bslib::nav_panel(
# value = "analyze",
title = "Analyses",
bslib::navset_bar(
title = "",
# bslib::layout_sidebar(
# fillable = TRUE,
sidebar = bslib::sidebar(
shiny::helpText(em("Please specify relevant settings for your data, and press 'Analyse'")),
shiny::uiOutput("outcome_var"),
shiny::uiOutput("strat_var"),
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.")
),
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")
),
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")
),
bslib::input_task_button(
id = "load",
label = "Analyse",
icon = shiny::icon("pencil", lib = "glyphicon"),
label_busy = "Working...",
icon_busy = fontawesome::fa_i("arrows-rotate",
2024-12-19 11:34:25 +01:00
class = "fa-spin",
"aria-hidden" = "true"
),
2024-12-18 11:26:00 +01:00
type = "secondary",
auto_reset = TRUE
),
2024-12-18 11:26:00 +01:00
shiny::helpText("If you change the parameters, press 'Analyse' again to update the tables"),
# shiny::conditionalPanel(
# condition = "output.ready=='yes'",
2024-12-19 11:34:25 +01:00
shiny::tags$hr(),
shiny::h4("Download results"),
shiny::helpText("Choose your favourite output file format for further work, and download, when the analyses are done."),
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",
icon = shiny::icon("download")
),
2024-12-18 11:29:46 +01:00
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.")
2024-12-18 11:30:28 +01:00
## https://github.com/quarto-dev/quarto-cli/issues/7151
2024-12-18 11:26:00 +01:00
# )
# )
2024-12-13 13:37:19 +01:00
),
bslib::nav_panel(
title = "Baseline characteristics",
gt::gt_output(outputId = "table1")
2024-12-13 13:37:19 +01:00
),
bslib::nav_panel(
title = "Regression table",
gt::gt_output(outputId = "table2")
2024-12-13 13:37:19 +01:00
),
bslib::nav_panel(
title = "Regression checks",
shiny::plotOutput(outputId = "check")
)
)
),
##############################################################################
#########
######### Documentation panel
#########
##############################################################################
"docs" = bslib::nav_panel(
2024-12-13 13:37:19 +01:00
title = "Documentation",
2024-12-17 11:30:17 +01:00
# shiny::tags$iframe("www/docs.html", height=600, width=535),
shiny::htmlOutput("docs_file"),
shiny::br()
)
)
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/
2024-12-19 11:34:25 +01:00
ui <- bslib::page_fluid(
title = "freesearcheR",
2024-12-18 10:37:37 +01:00
theme = light,
shiny::useBusyIndicators(),
bslib::page_navbar(
id = "main_panel",
2024-12-19 11:34:25 +01:00
# header = shiny::tags$header(shiny::p("Data is only stored temporarily for analysis and deleted immediately afterwards.")),
ui_elements$import,
2024-12-13 13:37:19 +01:00
ui_elements$overview,
ui_elements$analyze,
2024-12-19 11:34:25 +01:00
ui_elements$docs,
# bslib::nav_spacer(),
# bslib::nav_item(shinyWidgets::materialSwitch(inputId = "mode", label = icon("moon"), right=TRUE,status = "success")),
fillable = TRUE,
footer = shiny::tags$footer(
style = "background-color: #14131326; padding: 4px; text-align: center; bottom: 0; width: 100%;",
shiny::p(
style = "margin: 1",
"Data is only stored for analyses and deleted immediately afterwards."),
shiny::p(
style = "margin: 1; color: #888;",
2024-12-19 14:14:21 +01:00
"Andreas G Damsbo | AGPLv3 license | ", shiny::tags$a("Source on Github", href = "https://github.com/agdamsbo/webResearch/", target="_blank", rel="noopener noreferrer")
2024-12-19 11:34:25 +01:00
),
)
)
)