From 835f0535848d4180cd2ffca584832a8b4cc12649 Mon Sep 17 00:00:00 2001 From: madeliri Date: Sat, 13 Jun 2026 17:21:04 +0300 Subject: [PATCH] =?UTF-8?q?refactor:=20=D0=BD=D0=B5=D0=B1=D0=BE=D0=BB?= =?UTF-8?q?=D1=8C=D1=88=D0=B8=D0=B5=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + app.R | 16 ++++++++-------- app/logs.R | 21 +++++++++++++++++++++ app/tasks.R | 3 --- modules/global_options.R | 5 +++++ test.xlsx | Bin 0 -> 8848 bytes 6 files changed, 35 insertions(+), 11 deletions(-) create mode 100644 app/logs.R create mode 100644 test.xlsx diff --git a/README.md b/README.md index 6e402b3..f3bf67e 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,7 @@ FORM_APP_LOCAL_DB_BACKUP_PATH="path_to_backups" Проверка осуществляется при каждом запуске приложения, бэкапы создаются раз в день (при первом запуске). Количество послдних сохраненных бэкапов: + ``` FORM_APP_LOCAL_DB_BACKUP_LIMITS=3 ``` diff --git a/app.R b/app.R index d326593..14d5aac 100644 --- a/app.R +++ b/app.R @@ -175,7 +175,6 @@ server <- function(input, output, session) { } }) - # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # REACTIVE VALUES ================================= # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -253,7 +252,6 @@ server <- function(input, output, session) { hr(), "Для начала работы нужно создать новую запись или загрузить существующую!", hr(), - # сво # загрузка панели для работы с базой данных uiOutput("admin_buttons_panel") ) @@ -280,6 +278,7 @@ server <- function(input, output, session) { output$base_data <- renderUI({ if (main_form_is_empty() == "main_menu") { + con <- db$make_db_connection(scheme(),"base_data") on.exit(db$close_db_connection(con, "base_data"), add = TRUE) @@ -292,13 +291,13 @@ server <- function(input, output, session) { # задачи на сегодня if ("tasks" %in% DBI::dbListTables(con)) { - tasks_count <- DBI::dbGetQuery(con, glue::glue("SELECT COUNT (task_id) FROM tasks WHERE task_status = 'active'")) |> + tasks_count <- DBI::dbGetQuery(con, glue::glue("SELECT COUNT (task_id) FROM \"tasks\" WHERE task_status = 'active'")) |> dplyr::pull() - tasks_today_count <- DBI::dbGetQuery(con, glue::glue("SELECT COUNT (task_id) FROM tasks WHERE task_status = 'active' AND task_due_date = {as.integer(Sys.Date())}")) |> + tasks_today_count <- DBI::dbGetQuery(con, glue::glue("SELECT COUNT (task_id) FROM \"tasks\" WHERE task_status = 'active' AND task_due_date = {as.integer(Sys.Date())}")) |> dplyr::pull() - tasks_overdue_count <- DBI::dbGetQuery(con, glue::glue("SELECT COUNT (task_id) FROM tasks WHERE task_status = 'active' AND task_due_date < {as.integer(Sys.Date())}")) |> + tasks_overdue_count <- DBI::dbGetQuery(con, glue::glue("SELECT COUNT (task_id) FROM \"tasks\" WHERE task_status = 'active' AND task_due_date < {as.integer(Sys.Date())}")) |> dplyr::pull() } else { @@ -709,10 +708,11 @@ server <- function(input, output, session) { # загрузка данных в формы forms$load_data_to_form( df = df, - table_name = values$nested_form_id, - mhcs = mhcs, + table_name = values$nested_form_id, + mhcs = mhcs, ns = NS(values$nested_form_id) ) + } else { utils$clean_forms(values$nested_form_id, mhcs(), NS(values$nested_form_id)) } @@ -1258,7 +1258,7 @@ server <- function(input, output, session) { df <- df |> dplyr::mutate( # даты - к единому формату - dplyr::across(tidyselect::all_of({{date_columns}}), \(x) purrr::map_chr(x, db$excel_to_db_dates_converter)), + dplyr::across(tidyselect::all_of({{date_columns}}), \(x) purrr::map_chr(x, db$excel_to_db_dates_converter)), dplyr::across(tidyselect::all_of({{number_columns}}), num_converter), dplyr::across(tidyselect::all_of({{other_cols}}), \(x) dplyr::if_else(x == "", as.character(NA), as.character(x))) ) |> diff --git a/app/logs.R b/app/logs.R new file mode 100644 index 0000000..7745a0d --- /dev/null +++ b/app/logs.R @@ -0,0 +1,21 @@ +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) { + + }) +} diff --git a/app/tasks.R b/app/tasks.R index c6749e9..4d50fc7 100644 --- a/app/tasks.R +++ b/app/tasks.R @@ -1,4 +1,3 @@ - box::use( shiny[...], bslib[...] @@ -438,13 +437,11 @@ update_task_button_count <- function(con, values, ns) { inputID <- "display_task_modal" if (!missing(ns)) inputID <- ns(inputID) - # если ключ не определен - выход из функции if (is.null(values$main_key)) { updateActionButton(inputId = inputID, label = "Задачи") return() - } # при наличии таблицы - полу diff --git a/modules/global_options.R b/modules/global_options.R index 96231c1..dc94b7c 100644 --- a/modules/global_options.R +++ b/modules/global_options.R @@ -54,6 +54,11 @@ check_and_init_scheme = function() { "modules/utils.R" ) + # проверка существования отслеживаемых файлов + if (!all(file.exists(files_to_watch))) { + cli::cli_abort("проверка схем: {files_to_watch[!file.exists(files_to_watch)]} is not exists") + } + scheme_names <- names(config::get()$form_schemes) scheme_file <- paste0(config::get("form_app_configure_path"), "/schemas/", scheme_names, ".xlsx") scheme_file <- stats::setNames(scheme_file, scheme_names) diff --git a/test.xlsx b/test.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..dc38ed350eb60ac5229beeb10d023c6b4954b80e GIT binary patch literal 8848 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 A@c;k- literal 0 HcmV?d00001