Files
formy/app/tasks.R

303 lines
9.6 KiB
R
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
box::use(
shiny[...],
bslib[...]
)
options(box.path = here::here())
box::use(
modules/db,
modules/utils,
app/forms
)
#' @export
server <- function(id, values, scheme, mhcs) {
ns <- NS(id)
moduleServer(id, function(input, output, session) {
# BOOKMARKS SETUP ========================
# observe({
# # print(values$current_user)
# })
# functions -------------------
show_modal_for_tasks <- function() {
if (!is.null(values$tasks_data)) {
tasks_selector <- values$tasks_data |>
dplyr::filter(task_status != "completed") |>
dplyr::pull(task_id)
tasks_selector <- unique(c(values$tasks_id_selector, tasks_selector))
tasks_selector <- sort(tasks_selector)
if (length(values$tasks_id_selector) == 0) {
values$tasks_id_selector <- if (length(tasks_selector) == 0) NULL else tasks_selector[[1]]
}
} else {
tasks_selector <- NULL
}
# ui --------------------
# очень большой костыль
subroup_scheme <- mhcs()$get_scheme("tasks") |>
dplyr::filter(form_id != "dummy")
tab <- if (length(tasks_selector) > 0) {
bslib::nav_panel(
title = "no name provided",
purrr::pmap(
.l = dplyr::distinct(subroup_scheme, form_id, form_label, form_type),
.f = utils$render_forms,
main_scheme = subroup_scheme,
ns = ns
)
)
} else {
bslib::nav_panel("", div("Нет доступных записей.", br(), "Необходимо создать новую запись."))
}
ui <- layout_sidebar(
sidebar = tagList(
selectizeInput(ns("hhhhhhh"), label = "what", choices = tasks_selector, selected = values$tasks_id_selector),
actionButton(ns("tasks_create_new_task"), "new_task"),
actionButton(ns("tasks_add_autoreview"), "add autotask"),
actionButton(ns("tasks_DT_VIEW"), "DT")
),
tab
)
showModal(modalDialog(
ui,
size = "l",
footer = tagList(
actionButton(ns("tasks_saving_button"), "сохранить изменения")
),
easyClose = TRUE
))
}
# button logic ---------------------
## отображение окна -----------------
observeEvent(input$shieesh, {
con <- db$make_db_connection(scheme(),"nested_tables")
on.exit(db$close_db_connection(con, "nested_tables"), add = TRUE)
values$tasks_data <- if ("tasks" %in% DBI::dbListTables(con)) {
DBI::dbGetQuery(con, glue::glue("SELECT * FROM tasks WHERE task_main_key = '{values$main_key}'")) |>
dplyr::mutate(dplyr::across(c("task_datetime_created", "task_datetime_last_updated", "task_datetime_completed"), as.POSIXct)) |>
dplyr::mutate(dplyr::across(c("task_due_date"), as.Date))
} else {
NULL
}
values$tasks_id_selector <- NULL
show_modal_for_tasks()
})
## изменение выбранной задачи -------
observeEvent(input$hhhhhhh, {
req(input$hhhhhhh)
req(values$tasks_id_selector)
# выбранный ключ в форме - перемещаем в RV
values$tasks_id_selector <- input$hhhhhhh
})
## обновление формы при измененнии id ключа ------
observeEvent(values$tasks_id_selector, {
df <- values$tasks_data |>
dplyr::filter(task_id == values$tasks_id_selector)
forms$load_data_to_form(
df = df,
table_name = "tasks",
mhcs
# ns = ns
)
})
## saving button ------------------------------
observeEvent(input$tasks_saving_button, {
con <- db$make_db_connection(scheme(),"tasks_saving_button")
on.exit(db$close_db_connection(con, "tasks_saving_button"), add = TRUE)
id_and_types_list <- mhcs()$get_id_type_list("tasks")
input_types <- unname(id_and_types_list)
input_ids <- names(id_and_types_list)
exported_values <- purrr::map2(
.x = input_ids,
.y = input_types,
.f = \(x_id, x_type) {
input_d <- input[[x_id]]
# return empty if 0 element
if (length(input_d) == 0) {
return(utils$get_empty_data(x_type))
} else {
input_d
}
}
)
exported_df <- stats::setNames(exported_values, input_ids) |>
dplyr::as_tibble()
df <- values$tasks_data
df[df$task_id == values$tasks_id_selector,]$task_status <- exported_df$task_status
df[df$task_id == values$tasks_id_selector,]$task_title <- exported_df$task_title
df[df$task_id == values$tasks_id_selector,]$task_description <- exported_df$task_description
df[df$task_id == values$tasks_id_selector,]$task_due_date <- exported_df$task_due_date
df[df$task_id == values$tasks_id_selector,]$task_user_last_updated <- values$current_user
df[df$task_id == values$tasks_id_selector,]$task_datetime_last_updated <- Sys.time()
if (exported_df$task_status == "completed") {
df[df$task_id == values$tasks_id_selector,]$task_user_completed <- values$current_user
df[df$task_id == values$tasks_id_selector,]$task_datetime_completed <- Sys.time()
}
values$tasks_data <- df
if ("tasks" %in% DBI::dbListTables(con)) {
query <- glue::glue("
DELETE
FROM tasks
WHERE task_main_key = '{values$main_key}'
")
DBI::dbExecute(con, query)
}
DBI::dbWriteTable(con, "tasks", df, append = TRUE)
update_task_button_count(con, values)
showNotification("Задача успешно создана/обновлена", type = "message")
tasks_selector <- values$tasks_data |>
dplyr::filter(task_status != "completed") |>
dplyr::pull(task_id)
selector <- ifelse(!values$tasks_id_selector %in% tasks_selector, tasks_selector[1], values$tasks_id_selector)
updateSelectInput(inputId = "hhhhhhh", choices = tasks_selector, selected = selector)
})
## show DT --------------------------
observeEvent(input$tasks_DT_VIEW, {
output$dt_tasks <- DT::renderDataTable(
DT::datatable(
values$tasks_data,
caption = 'Table 1: This is a simple caption for the table.',
rownames = FALSE,
# colnames = col_types |> dplyr::pull(form_id, form_label),
extensions = c('KeyTable', "FixedColumns"),
# editable = 'cell',
selection = "none",
options = list(
dom = 'tip',
scrollX = TRUE,
fixedColumns = list(leftColumns = 1),
keys = TRUE
)
) |>
DT::formatDate(c("task_datetime_created", "task_datetime_completed", "task_datetime_last_updated", "task_due_date"), "toLocaleDateString", params = list('ru-RU'))
)
showModal(modalDialog(
DT::dataTableOutput(ns("dt_tasks")),
size = "xl",
# footer = tagList(
# actionButton("nested_form_dt_save", "сохранить изменения")
# ),
easyClose = TRUE
))
})
## functions ----------------------------------
get_default_task <- function() {
tibble::tibble(
task_id = paste0(format(Sys.time(), "%Y%m%d%H%M%S"), "_", values$main_key),
task_main_key = values$main_key,
task_status = "active",
task_title = "new task",
task_description = "description",
task_due_date = NA,
task_user_created = values$current_user,
task_datetime_created = Sys.time(),
task_user_last_updated = NA,
task_datetime_last_updated = NA,
task_user_completed = NA,
task_datetime_completed = NA
)
}
observeEvent(input$tasks_create_new_task, {
new_task <- get_default_task()
values$tasks_data <- rbind(values$tasks_data, new_task)
values$tasks_id_selector <- new_task$task_id
tasks_selector <- values$tasks_data |>
dplyr::filter(task_status != "completed") |>
dplyr::pull(task_id)
updateSelectInput(inputId = "hhhhhhh", choices = tasks_selector, selected = values$tasks_id_selector)
removeModal()
show_modal_for_tasks()
})
observeEvent(input$tasks_add_autoreview, {
new_task <- get_default_task()
new_task$task_title <- "autoreview"
new_task$task_description <- "напоминание об актуализации данных"
new_task$task_due_date <- Sys.Date() + 28
values$tasks_data <- rbind(values$tasks_data, new_task)
values$tasks_id_selector <- new_task$task_id
tasks_selector <- values$tasks_data |>
dplyr::filter(task_status != "completed") |>
dplyr::pull(task_id)
updateSelectInput(inputId = "hhhhhhh", choices = tasks_selector, selected = values$tasks_id_selector)
removeModal()
show_modal_for_tasks()
})
})
}
#' @export
update_task_button_count <- function(con, values, ns) {
inputID <- "shieesh"
if (!missing(ns)) inputID <- ns(inputID)
if ("tasks" %in% DBI::dbListTables(con)) {
tasks_num <- DBI::dbGetQuery(con, glue::glue("SELECT COUNT ('task_id') FROM tasks WHERE task_main_key = '{values$main_key}' AND task_status = 'active'")) |>
dplyr::pull()
if (tasks_num > 0) {
updateActionButton(inputId = inputID, label = paste("активных задач:", tasks_num))
} else {
updateActionButton(inputId = inputID, label = "Задачи: нет активных")
}
}
}