From dbfe27bbb843e427362d7158e1820f410b1fb43b Mon Sep 17 00:00:00 2001 From: madeliri Date: Mon, 13 Apr 2026 10:32:06 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D1=80=D0=B5=D0=BD=D0=B4=D0=B5=D1=80?= =?UTF-8?q?=D0=B8=D0=BD=D0=B3=20=D1=84=D0=BE=D1=80=D0=BC=D1=8B=20=D0=BC?= =?UTF-8?q?=D0=B0=D0=BA=D1=81=D0=B8=D0=BC=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=20?= =?UTF-8?q?=D1=80=D0=B5=D0=B0=D0=BA=D1=82=D0=B8=D0=B2=D0=BD=D1=8B=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.R | 67 +++++++++++++++++++++++++++++++------------------ modules/utils.R | 13 +++++----- 2 files changed, 48 insertions(+), 32 deletions(-) diff --git a/app.R b/app.R index de549ac..e3b4a52 100644 --- a/app.R +++ b/app.R @@ -40,7 +40,6 @@ if (!rmarkdown::pandoc_available()) warning("Can't find pandoc!") # SCHEME_MAIN UNPACK ========================== schm <- readRDS("scheme.rds") -nav_panels_list <- schm$get_main_form_ui # two_obj <- purrr::map( # c(one = "configs/schemas/schema.xlsx", two = "configs/schemas/schema_example.xlsx"), @@ -154,27 +153,23 @@ server <- function(input, output, session) { nested_key = NULL, nested_form_id = NULL ) - - # VALIDATIONS ============================ - # create new validator - # TODO: как осуществить инициализацию валидатора после - iv_main <- data_validation$init_val(schm$get_schema("main")) - iv_main$enable() + main_form_is_empty <- reactiveVal(TRUE) + validator_main <- reactiveVal(NULL) + validator_nested <- reactiveVal(NULL) # динамический рендеринг -------------------------- output$main_ui_navset <- renderUI({ - shiny::validate( - need(values$main_key, "Для начала работы нужно создать новую запись или загрузить существующую!") - ) + if (main_form_is_empty()) { + validator_main(NULL) + "Для начала работы нужно создать новую запись или загрузить существующую!" + } else { - # list of rendered panels - navset_card_underline( - id = "main", - !!!nav_panels_list, - header = NULL, - height = NULL - ) + # list of rendered panels + validator_main(data_validation$init_val(schm$get_schema("main"))) + validator_main()$enable() + schm$get_main_form_ui + } }) # ========================================== @@ -377,6 +372,7 @@ server <- function(input, output, session) { actionButton("add_new_nested_key_button", "add"), actionButton("nested_form_save_button", "save"), actionButton("nested_form_dt_button", "dt"), + uiOutput("validation_nested"), open = list(mobile = "always-above") ), # if (!is.null(values$nested_key)) {rlang::syms(!!!yay_its_fun)} else bslib::nav_panel("empty") @@ -384,8 +380,8 @@ server <- function(input, output, session) { ) # проверка данных для внутренних таблиц - iv_inner <- data_validation$init_val(this_nested_form_scheme, ns) - iv_inner$enable() + validator_nested(data_validation$init_val(this_nested_form_scheme, ns)) + validator_nested()$enable() showModal(modalDialog( ui_for_inline_table, @@ -450,12 +446,12 @@ server <- function(input, output, session) { } - ### обновление данных при изменении -------------------- + ### обновление данных при изменении DT -------------------- observeEvent(input$dt_nested_cell_edit, { values$data <- DT::editData(values$data, input$dt_nested_cell_edit, 'dt_nested', rownames = FALSE) }) - ### кнопка: отображение ----------------------------- + ### кнопка: отображение DT ----------------------------- observeEvent(input$nested_form_dt_button, { con <- db$make_db_connection("nested_form_save_button") on.exit(db$close_db_connection(con, "nested_form_save_button"), add = TRUE) @@ -464,7 +460,7 @@ server <- function(input, output, session) { show_modal_for_nested_form_dt(con) }) - ### кнопка: сохранить изменения -------------------- + ### кнопка: сохранить изменения DT -------------------- observeEvent(input$nested_form_dt_save, { con <- db$make_db_connection("nested_form_dt_save") @@ -512,11 +508,22 @@ server <- function(input, output, session) { log_action_to_db("saving data", values$main_key, con) showNotification( - "Данные успешно сохраннены", + "Данные успешно сохранены", type = "message" ) }) + ## nested validation ------------------------------------ + output$validation_nested <- renderText({ + req(validator_nested()) + + if (validator_nested()$is_valid()) { + "✅ Данные внесены корректно" + } else { + "⚠️ Данные внесены не полностью или некорректно" + } + }) + ## обновление данных при переключении ключей ------------ observeEvent(input$nested_key_selector, { req(input$nested_key_selector) @@ -620,7 +627,13 @@ server <- function(input, output, session) { }) output$status_message2 <- renderText({ - iv_main$is_valid() + req(validator_main()) + + if (validator_main()$is_valid()) { + "✅ Данные внесены корректно" + } else { + "⚠️ Данные внесены не полностью или некорректно" + } }) # ========================================= @@ -673,6 +686,7 @@ server <- function(input, output, session) { } values$main_key <- new_main_key + main_form_is_empty(FALSE) log_action_to_db("creating new key", values$main_key, con) utils$clean_forms("main", schm) @@ -697,8 +711,9 @@ server <- function(input, output, session) { observeEvent(input$clean_all_action, { # rewrite all inputs with empty data - utils$clean_forms("main", schm) values$main_key <- NULL + utils$clean_forms("main", schm) + main_form_is_empty(TRUE) removeModal() showNotification("Данные очищены!", type = "warning") @@ -788,6 +803,8 @@ server <- function(input, output, session) { ) values$main_key <- input$load_data_key_selector + main_form_is_empty(FALSE) + log_action_to_db("loading data", values$main_key, con = con) removeModal() diff --git a/modules/utils.R b/modules/utils.R index d11784c..8e1dd76 100644 --- a/modules/utils.R +++ b/modules/utils.R @@ -1,5 +1,5 @@ #' @export -make_list_of_pages <- function(main_schema, main_key_id) { +make_list_of_pages = function(main_schema, main_key_id) { cli::cli_alert_success("AAAA") purrr::map( .x = unique(main_schema$part), @@ -22,7 +22,7 @@ make_list_of_pages <- function(main_schema, main_key_id) { } #' @export -make_panels <- function(scheme) { +make_panels = function(scheme) { cards <- purrr::map( .x = unique(scheme$subgroup), @@ -61,7 +61,7 @@ make_panels <- function(scheme) { } #' @export -render_forms <- function( +render_forms = function( form_id, form_label, form_type, @@ -242,7 +242,7 @@ render_forms <- function( #' @export #' @description #' Функция возращает пустое значение для каждого типа формы -get_empty_data <- function(type) { +get_empty_data = function(type) { if (type %in% c("text", "select_one", "select_multiple")) return(as.character(NA)) if (type %in% c("radio", "checkbox")) return(as.character(NA)) if (type %in% c("date")) return(as.Date(NA)) @@ -255,7 +255,7 @@ get_empty_data <- function(type) { #' @param type - type of form; #' @param value - value to update; #' @param local_delimeter - delimeter to split file -update_forms_with_data <- function( +update_forms_with_data = function( form_id, form_type, value, @@ -341,7 +341,7 @@ update_forms_with_data <- function( } #' @export -clean_forms <- function( +clean_forms = function( table_name, schm, ns @@ -366,5 +366,4 @@ clean_forms <- function( ) } ) - } \ No newline at end of file