## ----setup, include=FALSE-----------------------------------------------------
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>",
  eval = FALSE
)

## -----------------------------------------------------------------------------
# library(shiny)
# library(bslib)
# library(DT2)
# 
# ui <- page_fillable(
#   theme = bs_theme(version = 5, bootswatch = "flatly"),
#   padding = "1rem",
#   card(
#     card_header("DT2 in Shiny"),
#     card_body(dt2_output("my_table"))
#   )
# )
# 
# server <- function(input, output, session) {
#   output$my_table <- render_dt2({
#     dt2(iris, options = list(pageLength = 10))
#   })
# }
# 
# shinyApp(ui, server)

## -----------------------------------------------------------------------------
# library(shiny)
# library(bslib)
# library(DT2)
# 
# ui <- page_fillable(
#   theme = bs_theme(version = 5, bootswatch = "flatly"),
#   padding = "1rem",
#   card(
#     card_header("Table State"),
#     card_body(dt2_output("tbl"))
#   ),
#   card(
#     card_header("Current state"),
#     card_body(verbatimTextOutput("state_info"))
#   )
# )
# 
# server <- function(input, output, session) {
#   output$tbl <- render_dt2({
#     dt2(iris, options = list(pageLength = 10))
#   })
# 
#   output$state_info <- renderPrint({
#     state <- input$tbl_state
#     if (is.null(state)) return("(interact with the table)")
#     cat("Reason:", state$reason, "\n")
#     cat("Page:",   state$page$page + 1, "of", state$page$pages, "\n")
#     cat("Search:", if (nzchar(state$search)) state$search else "(none)", "\n")
#     cat("Order:",  paste(state$order, collapse = ", "), "\n")
#   })
# }
# 
# shinyApp(ui, server)

## -----------------------------------------------------------------------------
# library(shiny)
# library(bslib)
# library(DT2)
# 
# ui <- page_sidebar(
#   theme = bs_theme(version = 5, bootswatch = "flatly"),
#   title = "Proxy Demo",
#   sidebar = sidebar(
#     actionButton("refresh",  "Refresh data", class = "btn-sm btn-outline-primary w-100 mb-2"),
#     actionButton("go_last",  "Go to last page", class = "btn-sm btn-outline-primary w-100 mb-2"),
#     actionButton("sort_sl",  "Sort Sepal.Length \u2193", class = "btn-sm btn-outline-primary w-100 mb-2"),
#     hr(),
#     textInput("search_text", "Search", placeholder = "e.g. setosa"),
#     actionButton("search_btn", "Apply", class = "btn-sm btn-primary w-100")
#   ),
#   card(
#     card_body(dt2_output("tbl"))
#   )
# )
# 
# server <- function(input, output, session) {
#   output$tbl <- render_dt2({
#     dt2(iris, options = list(pageLength = 10))
#   })
# 
#   proxy <- dt2_proxy("tbl")
# 
#   observeEvent(input$refresh, {
#     new_data <- iris[sample(nrow(iris), 50), ]
#     dt2_replace_data(proxy, new_data)
#   })
# 
#   observeEvent(input$go_last, {
#     dt2_proxy_page(proxy, "last")
#   })
# 
#   observeEvent(input$sort_sl, {
#     dt2_proxy_order(proxy, c("Sepal.Length", "desc"),
#                     columns = names(iris))
#   })
# 
#   observeEvent(input$search_btn, {
#     dt2_proxy_search(proxy, input$search_text)
#   })
# }
# 
# shinyApp(ui, server)

## -----------------------------------------------------------------------------
# library(shiny)
# library(bslib)
# library(DT2)
# 
# ui <- page_fillable(
#   theme = bs_theme(version = 5, bootswatch = "flatly"),
#   padding = "1rem",
#   card(
#     card_header("Styled Buttons"),
#     card_body(dt2_output("tbl"))
#   )
# )
# 
# server <- function(input, output, session) {
#   output$tbl <- render_dt2({
#     opts <- dt2_use_buttons(
#       buttons = c("copy", "csv", "excel", "print"),
#       position = "topEnd",
#       button_class = "btn btn-sm btn-primary"
#     )
#     dt2(mtcars, options = opts)
#   })
# }
# 
# shinyApp(ui, server)

## -----------------------------------------------------------------------------
# library(shiny)
# library(bslib)
# library(DT2)
# 
# ui <- page_fillable(
#   theme = bs_theme(version = 5, bootswatch = "flatly"),
#   padding = "1rem",
#   card(
#     card_header("Scroller \u2014 10 000 rows"),
#     card_body(dt2_output("tbl"))
#   )
# )
# 
# server <- function(input, output, session) {
#   big <- data.frame(
#     id    = 1:10000,
#     value = round(rnorm(10000), 3),
#     group = sample(LETTERS[1:5], 10000, replace = TRUE)
#   )
# 
#   output$tbl <- render_dt2({
#     dt2(big, options = list(
#       scroller    = TRUE,
#       scrollY     = 400,
#       deferRender = TRUE,
#       buttons     = list("copy", "csv"),
#       layout      = list(
#         topStart = list(search = list(placeholder = "Filter...")),
#         topEnd   = "buttons"
#       )
#     ))
#   })
# }
# 
# shinyApp(ui, server)

## -----------------------------------------------------------------------------
# library(shiny)
# library(bslib)
# library(DT2)
# 
# ui <- page_fillable(
#   theme = bs_theme(version = 5, bootswatch = "flatly"),
#   padding = "1rem",
#   card(
#     card_header("Custom Layout"),
#     card_body(dt2_output("tbl"))
#   )
# )
# 
# server <- function(input, output, session) {
#   output$tbl <- render_dt2({
#     dt2(iris, options = list(
#       pageLength = 10,
#       layout = list(
#         topStart  = "pageLength",
#         topEnd    = list(
#           buttons = list("copy", "csv", "excel"),
#           search  = list(placeholder = "Search...")
#         ),
#         bottomStart = "info",
#         bottomEnd   = "paging"
#       )
#     ))
#   })
# }
# 
# shinyApp(ui, server)

## -----------------------------------------------------------------------------
# library(shiny)
# library(bslib)
# library(DT2)
# 
# ui <- page_fillable(
#   theme = bs_theme(version = 5, bootswatch = "flatly"),
#   padding = "1rem",
#   layout_columns(
#     col_widths = c(6, 6),
#     card(
#       card_header("Simple (prev / next only)"),
#       card_body(dt2_output("tbl_simple"))
#     ),
#     card(
#       card_header("Full (first / 1 2 3 / last)"),
#       card_body(dt2_output("tbl_full"))
#     )
#   ),
#   card(
#     card_header("No pagination"),
#     card_body(dt2_output("tbl_none"))
#   )
# )
# 
# server <- function(input, output, session) {
#   output$tbl_simple <- render_dt2({
#     dt2(iris, options = list(
#       pageLength = 5,
#       layout = list(bottomEnd = list(paging = list(
#         type = "simple"
#       )))
#     ))
#   })
#   output$tbl_full <- render_dt2({
#     dt2(iris, options = list(
#       pageLength = 5,
#       layout = list(bottomEnd = list(paging = list(
#         firstLast = TRUE, previousNext = TRUE, numbers = TRUE
#       )))
#     ))
#   })
#   output$tbl_none <- render_dt2({
#     dt2(iris[1:15, ], options = list(paging = FALSE))
#   })
# }
# 
# shinyApp(ui, server)

## -----------------------------------------------------------------------------
# library(shiny)
# library(bslib)
# library(DT2)
# 
# ui <- page_fillable(
#   theme = bs_theme(version = 5, bootswatch = "flatly"),
#   padding = "1rem",
#   card(
#     card_header("Inline Inputs"),
#     card_body(dt2_output("tbl"))
#   ),
#   card(
#     card_header("Events"),
#     card_body(verbatimTextOutput("events"))
#   )
# )
# 
# server <- function(input, output, session) {
#   df <- data.frame(
#     name   = c("Alice", "Bob", "Carol", "Dave"),
#     score  = c(95, 82, 91, 78),
#     select = NA,
#     action = NA
#   )
# 
#   output$tbl <- render_dt2({
#     opts <- list(columns = names(df), pageLength = 10)
#     opts <- dt2_col_checkbox(opts, "select")
#     opts <- dt2_col_button(opts, "action", label = "View")
#     dt2(df, options = opts)
#   })
# 
#   event_log <- reactiveVal("")
# 
#   observeEvent(input$tbl_row_check, {
#     info <- input$tbl_row_check
#     msg <- paste0("Checkbox row ", info$row, ": ", info$value, "\n")
#     event_log(paste0(event_log(), msg))
#   })
# 
#   observeEvent(input$tbl_row_button, {
#     info <- input$tbl_row_button
#     msg <- paste0("Button clicked row ", info$row, "\n")
#     event_log(paste0(event_log(), msg))
#   })
# 
#   output$events <- renderText(event_log())
# }
# 
# shinyApp(ui, server)

## -----------------------------------------------------------------------------
# library(shiny)
# library(bslib)
# library(DT2)
# 
# ui <- page_fillable(
#   theme = bs_theme(version = 5, bootswatch = "flatly"),
#   padding = "1rem",
#   card(
#     card_header("Server-Side Processing \u2014 100k rows"),
#     card_body(dt2_output("tbl"))
#   )
# )
# 
# server <- function(input, output, session) {
#   large_data <- data.frame(
#     id    = seq_len(100000),
#     value = round(rnorm(100000), 4),
#     group = sample(LETTERS[1:5], 100000, replace = TRUE)
#   )
# 
#   dt2_bind_server("tbl", large_data)
# 
#   output$tbl <- render_dt2({
#     dt2(large_data, options = list(
#       columns      = names(large_data),
#       pageLength   = 25,
#       server_side  = TRUE,
#       language     = list(info = "Showing _START_ to _END_ of _TOTAL_ rows")
#     ))
#   })
# }
# 
# shinyApp(ui, server)

## -----------------------------------------------------------------------------
# library(shiny)
# library(bslib)
# library(DT2)
# 
# ui <- page_sidebar(
#   theme = bs_theme(version = 5, bootswatch = "flatly"),
#   title = "DT2 + bslib",
#   sidebar = sidebar(
#     selectInput("dataset", "Dataset",
#                 c("iris", "mtcars", "airquality")),
#     selectInput("theme_preset", "Theme preset",
#                 c("default", "clean", "minimal", "compact"))
#   ),
#   card(
#     card_header("Table"),
#     card_body(dt2_output("tbl"))
#   )
# )
# 
# server <- function(input, output, session) {
#   output$tbl <- render_dt2({
#     data <- switch(input$dataset,
#       iris       = iris,
#       mtcars     = mtcars,
#       airquality = airquality
#     )
#     dt2(data,
#         theme = input$theme_preset,
#         options = list(pageLength = 10))
#   })
# }
# 
# shinyApp(ui, server)

## -----------------------------------------------------------------------------
# library(shiny)
# library(bslib)
# library(DT2)
# 
# my_theme <- dt2_theme("clean",
#   compact      = TRUE,
#   font_scale   = 0.85,
#   button_class = "btn btn-sm btn-outline-dark"
# )
# 
# ui <- page_fillable(
#   theme = bs_theme(version = 5, bootswatch = "flatly"),
#   padding = "1rem",
#   layout_columns(
#     col_widths = c(6, 6),
#     card(
#       card_header("iris"),
#       card_body(dt2_output("tbl1"))
#     ),
#     card(
#       card_header("mtcars"),
#       card_body(dt2_output("tbl2"))
#     )
#   )
# )
# 
# server <- function(input, output, session) {
#   output$tbl1 <- render_dt2({
#     dt2(iris, theme = my_theme, options = dt2_use_buttons(
#       buttons = c("copy", "csv")
#     ))
#   })
# 
#   output$tbl2 <- render_dt2({
#     dt2(mtcars, theme = my_theme, options = list(pageLength = 15))
#   })
# }
# 
# shinyApp(ui, server)

## -----------------------------------------------------------------------------
# library(jsonlite)
# library(dplyr)
# library(tibble)
# library(lubridate)
# 
# # ── Sample data (57 employees) ────────────────────────────────────────────────
# json_url <- "https://raw.githubusercontent.com/StrategicProjects/DT2/main/inst/examples/employees.json"
# # For offline use, the same JSON is bundled in inst/examples/employees.json
# 
# json_txt <- '{
#   "data": [
#     {"name":"Tiger Nixon","position":"System Architect","salary":"320800","start_date":"2011-04-25","office":"Edinburgh","extn":"5421"},
#     {"name":"Garrett Winters","position":"Accountant","salary":"170750","start_date":"2011-07-25","office":"Tokyo","extn":"8422"},
#     {"name":"Ashton Cox","position":"Junior Technical Author","salary":"86000","start_date":"2009-01-12","office":"San Francisco","extn":"1562"},
#     {"name":"Cedric Kelly","position":"Senior JavaScript Developer","salary":"433060","start_date":"2012-03-29","office":"Edinburgh","extn":"6224"},
#     {"name":"Airi Satou","position":"Accountant","salary":"162700","start_date":"2008-11-28","office":"Tokyo","extn":"5407"},
#     {"name":"Brielle Williamson","position":"Integration Specialist","salary":"372000","start_date":"2012-12-02","office":"New York","extn":"4804"},
#     {"name":"Herrod Chandler","position":"Sales Assistant","salary":"137500","start_date":"2012-08-06","office":"San Francisco","extn":"9608"},
#     {"name":"Rhona Davidson","position":"Integration Specialist","salary":"327900","start_date":"2010-10-14","office":"Tokyo","extn":"6200"},
#     {"name":"Colleen Hurst","position":"JavaScript Developer","salary":"205500","start_date":"2009-09-15","office":"San Francisco","extn":"2360"},
#     {"name":"Sonya Frost","position":"Software Engineer","salary":"103600","start_date":"2008-12-13","office":"Edinburgh","extn":"1667"}
#   ]
# }'
# 
# df <- fromJSON(json_txt, flatten = TRUE)$data %>%
#   as_tibble() %>%
#   mutate(
#     salary     = as.numeric(salary),
#     extn       = as.integer(extn),
#     start_date = ymd(start_date)
#   )
# 
# # ── Shiny App ─────────────────────────────────────────────────────────────────
# library(shiny)
# library(bslib)
# library(DT2)
# library(htmlwidgets)
# 
# ui <- page_sidebar(
#   theme = bs_theme(version = 5, bootswatch = "spacelab"),
#   title = "DT2 — Complete Example",
#   sidebar = sidebar(
#     h5("Features"),
#     tags$ul(
#       tags$li("ColumnControl (order + search dropdowns)"),
#       tags$li("Export buttons with spacer"),
#       tags$li("Custom JS renderers"),
#       tags$li("pt-BR translation")
#     )
#   ),
#   # Flag sprites
#   tags$head(
#     tags$link(
#       rel = "stylesheet", type = "text/css",
#       href = "https://cdn.jsdelivr.net/gh/lafeber/world-flags-sprite/stylesheets/flags32-both.css"
#     ),
#     tags$style(HTML("
#       .f32 .flag { display:inline-block; width:32px; height:32px;
#                     vertical-align:middle; margin-right:6px; }
#       table.dataTable tbody td { vertical-align: middle; }
#     "))
#   ),
#   card(
#     card_header("Employee Table"),
#     card_body(dt2_output("tbl", height = "auto"))
#   )
# )
# 
# server <- function(input, output, session) {
#   output$tbl <- render_dt2({
# 
#     # ── JS Renderers ──────────────────────────────────────────
#     office_js <- JS("
#       function(data, type) {
#         if (type !== 'display') return data;
#         var cc = {Argentina:'ar', Edinburgh:'_Scotland', London:'_England',
#                   'New York':'us', 'San Francisco':'us', Sydney:'au', Tokyo:'jp'};
#         var flag = cc[data] || '';
#         return '<span class=\"flag ' + flag + '\"></span> ' + data;
#       }
#     ")
# 
#     salary_js <- JS("
#       (function() {
#         var nfmt = DataTable.render.number('.', ',', 2, 'R$ ');
#         return function(data, type) {
#           var txt = nfmt.display(data);
#           if (type !== 'display') return txt;
#           var c = data < 250000 ? 'red' : data < 500000 ? 'orange' : 'green';
#           return '<span style=\"color:' + c + '\">' + txt + '</span>';
#         };
#       })()
#     ")
# 
#     extn_js <- JS("
#       function(data, type) {
#         return type === 'display'
#           ? '<progress value=\"' + data + '\" max=\"9999\"></progress>'
#           : data;
#       }
#     ")
# 
#     # ── Options ───────────────────────────────────────────────
#     opts <- list(
#       pageLength = 10,
#       lengthMenu = c(10, 25, -1),
#       columns    = names(df),
# 
#       layout = list(
#         topStart = "pageLength",
#         topEnd   = list(
#           buttons = list(
#             list(extend = "copyHtml5", text = "Copiar"),
#             list(extend = "csvHtml5"),
#             list(extend = "excelHtml5"),
#             list(extend = "spacer", style = "bar"),
#             list(extend = "colvis", text = "Colunas")
#           ),
#           search = list(placeholder = "")
#         ),
#         bottomEnd = "paging"
#       ),
# 
#       columnControl = list(
#         target  = 0,
#         content = list("order", "searchDropdown", list(
#           list(extend = "orderAsc", text = "Ordem crescente"),
#           list(extend = "orderDesc", text = "Ordem decrescente"),
#           "spacer",
#           list(extend = "colVisDropdown", text = "Selecionar colunas")
#         ))
#       ),
#       ordering = list(indicators = FALSE, handler = FALSE),
# 
#       columnDefs = list(
#         list(targets = which(names(df) == "office") - 1L,
#              className = "f32", render = office_js),
#         list(targets = which(names(df) == "salary") - 1L,
#              className = "dt-body-right", render = salary_js),
#         list(targets = which(names(df) == "extn") - 1L,
#              render = extn_js)
#       ),
# 
#       language = list(
#         lengthMenu   = "Mostrar _MENU_",
#         search       = "Buscar",
#         info         = "Mostrando _START_ a _END_ de _TOTAL_ registros",
#         infoEmpty    = "Nenhum registro",
#         zeroRecords  = "Nenhum registro encontrado",
#         emptyTable   = "Nenhum dado disponível",
#         decimal      = ",", thousands = ".", infoThousands = ".",
#         lengthLabels = list(`10` = "10", `25` = "25", `-1` = "Todas"),
#         paginate     = list(first="«", previous="‹", `next`="›", last="»"),
#         buttons = list(
#           copyTitle   = "Copiado!",
#           copySuccess = list(`_` = "%d linhas copiadas", `1` = "1 linha copiada")
#         ),
#         columnControl = list(
#           orderAsc = "Crescente", orderDesc = "Decrescente",
#           searchDropdown = "Pesquisar", colVisDropdown = "Colunas",
#           searchClear = "Limpar",
#           search = list(
#             text   = list(contains="Contém", starts="Começa por",
#                           ends="Termina em", equal="Igual a"),
#             number = list(greater="Maior que", less="Menor que",
#                           equal="Igual a")
#           )
#         )
#       )
#     )
# 
#     dt2(df,
#         compact = TRUE, striped = TRUE, hover = TRUE,
#         font_scale = 0.85, responsive = FALSE,
#         options = opts)
#   })
# }
# 
# shinyApp(ui, server)

