diff --git a/inst/shiny-examples/casting/app.R b/inst/shiny-examples/casting/app.R index 4c0f465..926824d 100644 --- a/inst/shiny-examples/casting/app.R +++ b/inst/shiny-examples/casting/app.R @@ -11,20 +11,13 @@ library(devtools) # if (!requireNamespace("REDCapCAST")) { # install.packages("REDCapCAST") # } -# library(REDCapCAST) +library(REDCapCAST) ## Load merged files for shinyapps.io hosting if (file.exists(here::here("functions.R"))) { source(here::here("functions.R")) } -ui <- - bslib::page( - theme = bslib::bs_theme(preset = "united"), - title = "REDCap database creator", - nav_bar_page() - ) - server <- function(input, output, session) { v <- shiny::reactiveValues( file = NULL @@ -72,7 +65,15 @@ server <- function(input, output, session) { v$file <- "loaded" ds2dd_detailed( data = dat(), - add.auto.id = input$add_id == "yes" + add.auto.id = input$add_id == "yes", + metadata = c( + "field_name", "form_name", "section_header", "field_type", + "field_label", "select_choices_or_calculations", "field_note", + "text_validation_type_or_show_slider_number", "text_validation_min", + "text_validation_max", "identifier", "branching_logic", "required_field", + "custom_alignment", "question_number", "matrix_group_name", "matrix_ranking", + "field_annotation" + ) ) }) @@ -192,4 +193,150 @@ server <- function(input, output, session) { # }) } + +ui <- + bslib::page( + theme = bslib::bs_theme(preset = "united"), + title = "REDCap database creator", + bslib::page_navbar( + title = "Easy REDCap database creation", + sidebar = bslib::sidebar( + width = 300, + shiny::h5("Metadata casting"), + shiny::fileInput( + inputId = "ds", + label = "Upload spreadsheet", + multiple = FALSE, + accept = c( + ".csv", + ".xls", + ".xlsx", + ".dta", + ".rds", + ".ods" + ) + ), + # shiny::actionButton( + # inputId = "load_data", + # label = "Load data", + # icon = shiny::icon("circle-down") + # ), + shiny::helpText("Have a look at the preview panels to validate the data dictionary and imported data."), + # For some odd reason this only unfolds when the preview panel is shown.. + # This has been solved by adding an arbitrary button to load data - which was abandoned again + shiny::conditionalPanel( + condition = "output.uploaded=='yes'", + shiny::radioButtons( + inputId = "add_id", + label = "Add ID, or use first column?", + selected = "no", + inline = TRUE, + choices = list( + "First column" = "no", + "Add ID" = "yes", + "No ID" = "none" + ) + ), + shiny::radioButtons( + inputId = "specify_factors", + label = "Specify categorical variables?", + selected = "no", + inline = TRUE, + choices = list( + "No" = "no", + "Yes" = "yes" + ) + ), + shiny::conditionalPanel( + condition = "input.specify_factors=='yes'", + shiny::uiOutput("factor_vars") + ), + # condition = "input.load_data", + # shiny::helpText("Below you can download the dataset formatted for upload and the + # corresponding data dictionary for a new data base, if you want to upload manually."), + # Button + shiny::downloadButton(outputId = "downloadData", label = "Download renamed data"), + + # Button + shiny::downloadButton(outputId = "downloadMeta", label = "Download data dictionary"), + + # Button + shiny::downloadButton(outputId = "downloadInstrument", label = "Download as instrument"), + + # Horizontal line ---- + shiny::tags$hr(), + shiny::radioButtons( + inputId = "upload_redcap", + label = "Upload directly to REDCap server?", + selected = "no", + inline = TRUE, + choices = list( + "No" = "no", + "Yes" = "yes" + ) + ), + shiny::conditionalPanel( + condition = "input.upload_redcap=='yes'", + shiny::h4("2) Data base upload"), + shiny::helpText("This tool is usable for now. Detailed instructions are coming."), + shiny::textInput( + inputId = "uri", + label = "URI", + value = "https://redcap.your.institution/api/" + ), + shiny::textInput( + inputId = "api", + label = "API key", + value = "" + ), + shiny::helpText("An API key is an access key to the REDCap database. Please", shiny::a("see here for directions", href = "https://www.iths.org/news/redcap-tip/redcap-api-101/"), " to obtain an API key for your project."), + shiny::actionButton( + inputId = "upload.meta", + label = "Upload datadictionary", icon = shiny::icon("book-bookmark") + ), + shiny::helpText("Please note, that before uploading any real data, put your project + into production mode."), + shiny::actionButton( + inputId = "upload.data", + label = "Upload data", icon = shiny::icon("upload") + ) + ) + ), + shiny::br(), + shiny::br(), + shiny::br(), + shiny::p( + "License: ", shiny::a("GPL-3+", href = "https://agdamsbo.github.io/REDCapCAST/LICENSE.html") + ), + shiny::p( + shiny::a("Package documentation", href = "https://agdamsbo.github.io/REDCapCAST") + ) + ), + bslib::nav_panel( + title = "Intro", + shiny::markdown(readLines("www/SHINYCAST.md")), + shiny::br() + ), + # bslib::nav_spacer(), + bslib::nav_panel( + title = "Data preview", + gt::gt_output(outputId = "data.tbl") + # shiny::htmlOutput(outputId = "data.tbl", container = shiny::span) + ), + bslib::nav_panel( + title = "Dictionary overview", + gt::gt_output(outputId = "meta.tbl") + # shiny::htmlOutput(outputId = "meta.tbl", container = shiny::span) + ), + bslib::nav_panel( + title = "Upload", + shiny::h3("Meta upload overview"), + shiny::textOutput(outputId = "upload.meta.print"), + shiny::h3("Data upload overview"), + shiny::textOutput(outputId = "upload.data.print") + ) + ) + ) + + shiny::shinyApp(ui = ui, server = server)