The module generates different options to edit a data.frame: adding, deleting and modifying rows, exporting data (csv and excel), choosing editable columns, choosing mandatory columns.
This module returns the edited table with the user modifications.
Usage
edit_data_ui(id)
edit_data_server(
id,
data_r = reactive(NULL),
add = TRUE,
update = TRUE,
delete = TRUE,
download_csv = TRUE,
download_excel = TRUE,
file_name_export = "data",
var_edit = NULL,
var_mandatory = NULL,
var_labels = NULL,
add_default_values = list(),
n_column = 1,
return_class = c("data.frame", "data.table", "tbl_df", "raw"),
reactable_options = NULL,
modal_size = c("m", "s", "l", "xl"),
modal_easy_close = TRUE,
callback_add = NULL,
callback_update = NULL,
callback_delete = NULL,
only_callback = FALSE,
use_notify = TRUE
)Arguments
- id
Module ID
- data_r
data_r
reactivefunction containing adata.frameto use in the module.- add
boolean, ifTRUE, allows you to add a row in the table via a button at the top right.- update
boolean, ifTRUE, allows you to modify a row of the table via a button located in the table on the row you want to edit.- delete
boolean, ifTRUE, allows a row to be deleted from the table via a button in the table.- download_csv
if
TRUE, allows to export the table in csv format via a download button.- download_excel
if
TRUE, allows to export the table in excel format via a download button.- file_name_export
characterthat allows you to choose the export name of the downloaded file.- var_edit
vector of
characterwhich allows to choose the names of the editable columns.- var_mandatory
vector of
characterwhich allows to choose obligatory fields to fill.- var_labels
named list, where names are colnames and values are labels to be used in edit modal.
- add_default_values
Default values to use for input control when adding new data, e.g.
list(my_var_text = "Default text to display").- n_column
Number of column in the edit modal window, must be a number that divide 12 since it use Bootstrap grid system with
shiny::column().- return_class
Class of returned data:
data.frame,data.table,tbl_df(tibble) orraw.- reactable_options
Options passed to
reactable::reactable().- modal_size
characterwhich allows to choose the size of the modalDialog. One of "s" for small, "m" (the default) for medium, "l" for large, or "xl" for extra large.- modal_easy_close
booleanIf TRUE, modalDialog can be dismissed by clicking outside the dialog box, or be pressing the Escape key. If FALSE (the default), modalDialog can't be dismissed in those ways; instead it must be dismissed by clicking on a modalButton(), or from a call to removeModal() on the server.- callback_add, callback_update, callback_delete
Functions to be executed just before an action (add, update or delete) is performed on the data. Functions used must be like
function(data, row) {...}where :datawill be the data in the table at the moment the function is calledrowwill contain either a new row of data (add), an updated row (update) or the row that will be deleted (delete).
If the return value of a callback function is not truthy (see
shiny::isTruthy()) then the action is cancelled.- only_callback
Only use callbacks, don't alter data within the module.
- use_notify
Display information or not to user through
shinybusy::notify().
Examples
library(shiny)
library(datamods)
library(bslib)
#>
#> Attaching package: ‘bslib’
#> The following object is masked from ‘package:utils’:
#>
#> page
library(reactable)
ui <- fluidPage(
theme = bs_theme(
version = 5
),
tags$h2("Edit data", align = "center"),
edit_data_ui(id = "id"),
verbatimTextOutput("result")
)
server <- function(input, output, session) {
edited_r <- edit_data_server(
id = "id",
data_r = reactive(demo_edit),
add = TRUE,
update = TRUE,
delete = TRUE,
download_csv = TRUE,
download_excel = TRUE,
file_name_export = "datas",
# var_edit = c("name", "job", "credit_card_provider", "credit_card_security_code"),
var_mandatory = c("name", "job"),
var_labels = list(
name = "Name",
credit_card_security_code = "Credit card security code",
date_obtained = "Date obtained",
contactless_card = "Contactless Card",
credit_card_provider = "Credit card provider"
),
add_default_values = list(
name = "Please enter your name here",
date_obtained = Sys.Date()
),
n_column = 2,
modal_size = "l",
modal_easy_close = TRUE,
reactable_options = list(
defaultColDef = colDef(filterable = TRUE),
selection = "single",
columns = list(
name = colDef(name = "Name", style = list(fontWeight = "bold")),
credit_card_security_code = colDef(name = "Credit card security code"),
date_obtained = colDef(name = "Date obtained", format = colFormat(date = TRUE)),
contactless_card = colDef(
name = "Contactless Card",
cell = htmlwidgets::JS(
"function(cellInfo) {
return cellInfo.value ? '\u2714\ufe0f Yes' : '\u274c No';
}"
)
),
credit_card_provider = colDef(
name = "Credit card provider",
style = htmlwidgets::JS(
"function(rowInfo) {
console.log(rowInfo);
var value = rowInfo.values['credit_card_provider'];
var color;
if (value == 'Mastercard') {
color = '#e06631';
} else if (value == 'VISA 16 digit') {
color = '#0c13cf';
} else if (value == 'American Express') {
color = '#4d8be8';
} else if (value == 'JCB 16 digit') {
color = '#23c45e';
} else {
color = '#777'
}
return {color: color, fontWeight: 'bold'}
}"
)
)
),
bordered = TRUE,
compact = TRUE,
searchable = TRUE,
highlight = TRUE
)
)
output$result <- renderPrint({
str(edited_r())
})
}
if (interactive())
shinyApp(ui, server)