feat: обновление справочника значений для форм (select_one, select_multiple), проверка на соответствие схеме (валидация)

This commit is contained in:
2026-04-11 15:17:21 +03:00
parent 206df54533
commit 59f7f40344
3 changed files with 48 additions and 19 deletions

View File

@@ -44,6 +44,7 @@ init_val <- function(scheme, ns) {
}
# хак для пропуска значений
if (x == "NA") return(NULL)
# check for numeric
# if (grepl("^[-]?(\\d*\\,\\d+|\\d+\\,\\d*|\\d+)$", x)) NULL else "Значение должно быть числом."
if (grepl("^[+-]?\\d*[\\.|\\,]?\\d+$", x)) NULL else "Значение должно быть числом."
@@ -84,6 +85,21 @@ init_val <- function(scheme, ns) {
}
}
if (form_type %in% c("select_multiple", "select_one")) {
iv$add_rule(x_input_id, function(x) {
# проверка на соответствие вариантов схеме ---------
compare_to_dict <- (x %in% choices)
if (!all(compare_to_dict)) {
text <- paste0("'",x[!compare_to_dict],"'", collapse = ", ")
glue::glue("Данные варианты, не соответствуют схеме: {text}")
}
})
}
# if in `required` column value is `1` apply standart validation
if (!is.na(val_required) && val_required == 1) {
iv$add_rule(x_input_id, shinyvalidate::sv_required(message = "Необходимо заполнить."))

View File

@@ -27,10 +27,11 @@ make_panels <- function(scheme) {
)
# make page wrap
page_wrap <- bslib::layout_column_wrap(
bslib::layout_column_wrap(
# width = "350px", height = NULL, #was 800
width = 1 / 4, height = NULL, # was 800
fixed_width = TRUE,
heights_equal = "row",
# unpack list of cards
!!!cards
)
@@ -235,10 +236,14 @@ update_forms_with_data <- function(
form_id,
form_type,
value,
scheme,
local_delimeter = getOption("SYMBOL_DELIM"),
ns
) {
filterd_line <- scheme |>
dplyr::filter(form_id == {{form_id}})
# если передана ns() функция то подмеяем id для каждой формы в соответствии с пространством имен
if (!missing(ns) & !is.null(ns)) {
form_id <- ns(form_id)
@@ -262,12 +267,13 @@ update_forms_with_data <- function(
# select_one
if (form_type == "select_one") {
# update choices
# old_choices <- subset(scheme, form_id == form_id, choices) |> dplyr::pull()
# new_choices <- unique(c(old_choices, value))
# new_choices <- new_choices[!is.na(new_choices)]
old_choices <- filterd_line$choices
new_choices <- unique(c(old_choices, value))
new_choices <- new_choices[!is.na(new_choices)]
# shiny::updateSelectizeInput(inputId = form_id, selected = value, choices = new_choices)
shiny::updateSelectizeInput(inputId = form_id, selected = value)
shiny::updateSelectizeInput(inputId = form_id, selected = value, choices = new_choices)
# shiny::updateSelectizeInput(inputId = form_id, selected = value)
}
# select_multiple
@@ -276,12 +282,12 @@ update_forms_with_data <- function(
vars <- stringr::str_split_1(value, local_delimeter)
# update choices
# old_choices <- subset(scheme, form_id == form_id, choices) |> dplyr::pull()
# new_choices <- unique(c(old_choices, vars))
# new_choices <- new_choices[!is.na(new_choices)]
old_choices <- filterd_line$choices
new_choices <- unique(c(old_choices, vars))
new_choices <- new_choices[!is.na(new_choices)]
# shiny::updateSelectizeInput(inputId = form_id, selected = vars, choices = new_choices)
shiny::updateSelectizeInput(inputId = form_id, selected = vars)
shiny::updateSelectizeInput(inputId = form_id, selected = vars, choices = new_choices)
# shiny::updateSelectizeInput(inputId = form_id, selected = vars)
}
# in other case fill with `character(0)` to proper reseting form
@@ -316,7 +322,7 @@ clean_forms <- function(id_and_types_list, ns) {
# если передана ns() функция то подмеяем id для каждой формы в соответствии с пространством имен
if (missing(ns)) ns <- NULL
purrr::walk2(
.x = id_and_types_list,
.y = names(id_and_types_list),