From 9dfe4fdda60aa7b26923d57b7ff0ba7e070da5a3 Mon Sep 17 00:00:00 2001 From: madeliri Date: Thu, 26 Mar 2026 22:26:56 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=BE=D0=BB=D0=B5=D0=B9=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D1=8F=20=D1=82=D0=B5=D0=BA=D1=81=D1=82=D0=B0=20(+=D0=BA=D0=BE?= =?UTF-8?q?=D1=80=D1=80=D0=B5=D0=BA=D1=86=D0=B8=D1=8F=20=D0=B2=20=D1=81?= =?UTF-8?q?=D1=85=D0=B5=D0=BC=D1=83),=20=D1=80=D0=B5=D1=84=D0=B0=D0=BA?= =?UTF-8?q?=D1=82=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=20=D0=BA=D0=BE=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 - app.R | 191 +++----------------------------------- configs/schemas/main.xlsx | Bin 11451 -> 11659 bytes helpers/functions.R | 1 + modules/utils.R | 97 +++++++++++++++---- 5 files changed, 96 insertions(+), 194 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1882a43..fd217da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,4 @@ ### 0.??.? - ##### features - added checkboxes input form; - added button to reset data in forms; diff --git a/app.R b/app.R index fbeced8..5759129 100644 --- a/app.R +++ b/app.R @@ -54,7 +54,7 @@ SCHEME_MAIN <- readxl::read_xlsx(FILE_SCHEME) %>% # get list of simple inputs inputs_simple_list <- SCHEME_MAIN %>% - dplyr::filter(!form_type %in% c("inline_table", "description")) %>% + dplyr::filter(!form_type %in% c("inline_table", "description", "description_header")) %>% dplyr::distinct(form_id, form_type) %>% tibble::deframe() @@ -179,148 +179,9 @@ inline_tables <- purrr::map( } ) -# создание объектов для ввода -# функция -# create_forms <- function(form_id, form_label, form_type) { -# # check if have condition -# condition <- dplyr::filter(SCHEME_MAIN, form_id == {{ form_id }}) %>% -# dplyr::distinct(condition) %>% -# dplyr::pull() - -# choices <- dplyr::filter(SCHEME_MAIN, form_id == {{ form_id }}) %>% -# dplyr::pull(choices) - -# # simple text or number input -# if (form_type %in% c("text", "number")) { -# form <- shiny::textAreaInput( -# inputId = form_id, -# label = tags$span(style = "color: #444444; font-weight: 550;", form_label), -# rows = 1 -# ) -# } - -# # simple date input -# if (form_type == "date") { -# # supress warning while trying keep data form empty by default -# suppressWarnings({ -# form <- dateInput( -# inputId = form_id, -# label = tags$span(style = "color: #444444; font-weight: 550;", form_label), -# value = NA, # keep empty -# format = "dd.mm.yyyy", -# weekstart = 1, -# language = "ru" -# ) -# }) -# } - -# # еденичный выбор -# if (form_type == "select_one") { -# form <- selectizeInput( -# inputId = form_id, -# label = tags$span(style = "color: #444444; font-weight: 550;", form_label), -# choices = choices, -# selected = NULL, -# options = list( -# create = FALSE, -# onInitialize = I('function() { this.setValue(""); }') -# ) -# ) -# } - -# # множественный выбор -# if (form_type == "select_multiple") { -# form <- selectizeInput( -# inputId = form_id, -# label = tags$span(style = "color: #444444; font-weight: 550;", form_label), -# choices = choices, -# selected = NULL, -# multiple = TRUE, -# options = list( -# create = FALSE, -# onInitialize = I('function() { this.setValue(""); }') -# ) -# ) -# } - -# # множественный выбор -# if (form_type == "radio") { -# form <- radioButtons( -# inputId = form_id, -# label = tags$span(style = "color: #444444; font-weight: 550;", form_label), -# choices = choices, -# selected = character(0) -# ) -# } - -# if (form_type == "checkbox") { -# form <- checkboxGroupInput( -# inputId = form_id, -# # label = tags$span(style = "color: #444444; font-weight: 550;", form_label), -# label = h6(form_label), -# choices = choices, -# selected = character(0) -# ) -# } - -# # вложенная таблица -# if (form_type == "inline_table") { -# form <- rHandsontableOutput(outputId = form_id) -# } - -# # description part -# if (form_type == "description") { -# form <- div(HTML(form_label), style = "color:Gray;font-size: 90%;") -# } - -# # если есть условие создать кондитионал панель -# if (!is.na(condition)) { -# form <- conditionalPanel( -# condition = condition, -# form -# ) -# } - -# form -# } - -# GENERATE UI ================================== -# functions for making cards -# make_cards_fn <- function(sub_group) { - -# subgroups_inputs <- df_forms %>% -# dplyr::filter(subgroup == {{sub_group}}) %>% -# dplyr::distinct(form_id, form_label, form_type) - -# subgroups_inputs2 <- SCHEME_MAIN |> -# dplyr::filter(subgroup == {{sub_group}}) %>% -# dplyr::distinct(form_id, form_label, form_type, condition) - -# print(subgroups_inputs2) - -# bslib::card( -# bslib::card_header(sub_group, container = htmltools::h5), -# full_screen = TRUE, -# width = "4000px", -# bslib::card_body( -# fill = TRUE, -# # передаем все аргументы в функцию для создания елементов -# purrr::pmap( -# .l = subgroups_inputs, -# .f = utils$create_forms, -# scheme = SCHEME_MAIN -# ) -# ) -# ) -# } - # get pages list pages_list <- unique(SCHEME_MAIN$part) -# # get all forms df -# df_forms <- SCHEME_MAIN %>% -# dplyr::distinct(part, subgroup, form_id, form_label, form_type) - # generate nav panels for each page nav_panels_list <- purrr::map( .x = pages_list, @@ -328,38 +189,6 @@ nav_panels_list <- purrr::map( main_scheme = SCHEME_MAIN ) -# nav_panels_list <- purrr::map( -# .x = pages_list, -# .f = \(x_page) { - -# # get info about inputs for current page -# page_forms <- SCHEME_MAIN %>% -# dplyr::filter(part == {{x_page}}) %>% -# dplyr::distinct(subgroup, form_id, form_label, form_type) - -# # get list of columns -# cols_list <- unique(page_forms$subgroup) - -# # making cards -# cards <- purrr::map( -# .x = cols_list, -# .f = utils$make_cards_fn, -# main_scheme = SCHEME_MAIN -# ) - -# # make page wrap -# page_wrap <- bslib::layout_column_wrap( -# # width = "350px", height = NULL, #was 800 -# width = 1 / 4, height = NULL, # was 800 -# fixed_width = TRUE, -# !!!cards # unpack list of cards -# ) - -# # add panel wrap to nav_panel -# bslib::nav_panel(x_page, page_wrap) -# } -# ) - # UI ======================= ui <- page_sidebar( title = config$header, @@ -371,7 +200,9 @@ ui <- page_sidebar( textOutput("status_message2"), actionButton("load_data_button", "Загрузить данные", icon("pencil", lib = "font-awesome")), downloadButton("downloadData", "Экспорт в .xlsx"), - downloadButton("downloadDocx", "get .docx (test only)") + downloadButton("downloadDocx", "get .docx (test only)"), + position = "left", + open = list(mobile = "always") ), # list of rendered panels navset_card_underline( @@ -462,17 +293,20 @@ server <- function(input, output) { # for `number` type: if in `choices` column has values then parsing them to range validation # value `0; 250` -> transform to rule validation value from 0 to 250 if (form_type == "number") { + iv$add_rule(x_input_id, function(x) { # exit if empty if (check_for_empty_data(x)) { return(NULL) } # check for numeric - if (grepl("^[-]?(\\d*\\,\\d+|\\d+\\,\\d*|\\d+)$", x)) NULL else "Значение должно быть числом." + # if (grepl("^[-]?(\\d*\\,\\d+|\\d+\\,\\d*|\\d+)$", x)) NULL else "Значение должно быть числом." + if (grepl("^[+-]?\\d*[\\.|\\,]?\\d+$", x)) NULL else "Значение должно быть числом." }) + # проверка на соответствие диапазону значений if (!is.na(choices)) { - # разделить на числа + # разделить на несколько елементов ranges <- as.integer(stringr::str_split_1(choices, "; ")) # проверка на кол-во значений @@ -482,12 +316,17 @@ server <- function(input, output) { iv$add_rule( x_input_id, function(x) { + + # замена разделителя десятичных цифр + x <- stringr::str_replace(x, ",", ".") + # exit if empty if (check_for_empty_data(x)) { return(NULL) } + # check for currect value - if (between(as.integer(x), ranges[1], ranges[2])) { + if (between(as.double(x), ranges[1], ranges[2])) { NULL } else { glue::glue("Значение должно быть между {ranges[1]} и {ranges[2]}.") diff --git a/configs/schemas/main.xlsx b/configs/schemas/main.xlsx index 4c83c5b8cdd524877d5d4cd91c36c6afa7aa68cc..0ea6bf26066c45eaf6b4624c9b594284f2a1903b 100644 GIT binary patch delta 5766 zcmZ9Qbx;&wx5gKC=>=DZ*##+)5|D-kWa$o38YyW>=@hA} zb7#J9?tT9{Gv}Fi&U@aOXMX3jnk8D)e!+(MFV(`+fdIe;E&%Wd006vpDZQ~N9+e^;R$=}o~nZO2yO6fjwB3d|^^5J|5k z*PN~b6$P3Ivj4)*deT}}(l+rKH$oh{hzCEfuK3%ZY!Pn)W>aOh@gt3nJ(UJYDeUT! z^^O-*W)?Mo^%N6JS)%+FV~6hRdM6lGdj;b@p;tq4_y>XqP_K2$(}>;GvTTRKg9U{= zfbc?^Y}^NHrJ)LPS0W!z+O%X)@M<|c*tjQ@g)1O+Q#Oj^cFGY{EaJ!({*`m9=GAFFh?|+T?QStax5gwoPG**Q8~j>HrItc!9^` zfOWuy1~8=_7r5I@^_T`m@|UE)DlACrcVm%{ZEX%S_5u1^HsyP|jo$C0t;bFC`Qj*4 zva!yqTMO%_gY;u0|IEoBGv?`C)r!8u)~HV+ew>37kIw3Lx}nD_quut^h z7H0E0Pe!POY*Fxb?gBie&F+O9aLQiQB~J2;s{Gi_9blt3Uf`~{`AF-XuaG$|QBWRa z>UB>mMDZI0Ty%iIH-!ez=2o>j%$I#^La%8rSI5TD4?4`ke}9i!gTc4!!F~ieW5JyQ z9o!K-Cu_LMbB2`)cf%h@N3LuJ`9p1J++VfAJ*4tT(BhYO>g$7ZG;{fszVHzWM?%zh zFyYC?QO%2v(ECfuh(yb!cEuDwZP4BmuRKHnd?SadN^l25gfK<6yQD^XPQ}XCJ5xT4 z_6aGCuFU=-whqrAtoCV#lU%$OOB0!pUz@Nxi)y-RC`07KMh0yQ;}eKE@YKZDG7q0*Rlwh9w^o+3no%0*hE9YDleAUWzSz7QtXDh((zFvH5XgBLcxy(v(= z=5j4qm5??dCA*WU4IRWQ85Eb9kL)d^?O|Ctnu>-8ddp54@MI!|6J5qTC5x43Jf+wb z=jb+07tzfcr?wc}c~jg~5OIS=N%q9ScLr7iV^ni@I=A9=%bLHpdtfyry}R&Y+iYZD z`q3{uPgoxQd+jri60s?9CyA`fM>dMLPU>8f zeLpumWW}zrv%dA&tn8Udr~FN9d-WF9h{rN$R%Lv4VSiB*8qliw5}svbtbV0=lgCZp zP7@pyFaq3h(OBW!L>Uc^=?WLAYs=%-@jU)876`jf#$br}2^e9P)&I5eDco!;Q<5*N z=q5-T1qOxpdp$3$ITz~6xb(4_y?%Q)Y9dEi9GV3yeOe8q>_^&4`_)=AXQ~_$Cf(;) zbje2jnKFi5_}FUp&5mqO2BmPdjG{Uxp`ie~m(arLd5Un9 z8LWZVpMj~0)Rf)&uFtL>Aq|v2o|PL!*XCO zhm(Ti5HdxX%%Ad#7=y7r21I^Q!;RaL^j;2>F_GROtkOAeXURN<)K*7Sdkj*}m+(TU ziuuKnkKhirTv?!qBhW(;U-O$s(GEp5uu@abm?#Ebaq3gPZHzHl`mLc)nXl;WURn+Y ze73u{m-mjCuVyr7GD2V}*?A<%dGhbb^zypN$?qH1dRrakF79%HT$xF@$mFHz>K_y9 zwb?0H(vfBpN6(!PO#~{j+oT{viHV!y%#ASLk2I;86)MtetMR)q86126ayF%ifKHy%tyz3iOT=_+TS|bjU{$da)yH& z0#51_`CG>~T85YuJhaLdE{MBh^yyN_iFhhVNkmnT+=p6Xjy8iMHoLcWh?X2yfG2Oz zMuPi|Ryg8qc-aXf35Qc2xpMR3&9JhYtr}HqDOGIMA7CA2T zqTOkR=j3opy0Hbhh2ErVJ)UA>SBlIpXMdLM?1=ptpVG}PoD92Sptj{m2Fa^Hra=6P zg|YnXZ_JFL&qIz(9Q9DL-9|zC#&>K?zg=e%<3*Nd=Ue)A^eFqtx{SkNa+#-T0&p-ncEmT{Duo zeq7?__=%{A`D(%BzaGA{cg@mH@|YGy^=GbCr6NC4Ig3(3@c9F@bi2FFbzkZ+tLx9a zW#w7+3jdUJ&htAn57tAW42A9q{hX@Bu?1!JS%UfF|6U!GAlmhZeD4(DzLS~PBk~Bt z{`J#^C;?0@8$(54TNznUjGMj)-PT2RxUHoByD6_{Ex><7yI9E3KsYMh@ zO53GUTp;V#5-k+|Ej0yy?H(N}%6=+>G99d-|9={BeaF{NK;5WZtdcXEqD&FOf$mr;?4!kjVCDFyb;@MPN^wpD$ zCfMLnPOx&_$T8)gV9So;(l1|DGjgD$Q4bnkiC-bTcjBcztci=qTZVM0=5Za!;ERw)mX6519FW3F^2kN&@bJi6F0DzO8o& zx)jwQED>2TGjn|*ioW?v?GFz?fSx80gvbHnBZ9byQ6O>%!D zeS8C5?R@@${j|x*U$7@%dc^<0=vcE;r3OD>4#UMA=fGCO&g9|I7u8Q7ep2f;Ne=k>Q&lZKt&pLfa!EJDq`14yd=VGz^7*m zc$NxVoKDa#%81*H^M>PWQO|C*uGMs&yP!*c+eg$110rXDK1_Bqr~^rhRni&CwjQuO zKCcFA0oRs46ff!2+>P_ofrQShcX9kE`JME64n{UohIi@dC-n+xUvb&ItLn6hz6QwYxp=7NhVdN-=v6ne)i_a zxPM#wSxsM-S_IEAoj%i#Q_|rq(}~Ai0#M)4?USg`84#h_gHo+D=hy>BBd#J|9MAmq+m1M=SWE+U*?Wd0r)aR!d z9G{uiEG^l)F!u+&NPoK%w`E3LVn+uJC=+41Akqyno#F7%1OmKKidP+a4{SBa3N-S~ zc4_g(Xi&;^2 zsco&5^$e4!uH$UN&RaOZ?Cz~>Y9%x@@~xT-$jQ8_#l)T8ihCLrYMLR${T#YSv9rtG zW^mo{wQo&4qRu^+J{WX+nX7s$RvKI%Q;In!5p--W;9Dzc4oDdMF^69<(?zBu^Yzq$ z5yG^(F+Moscl!()MJEw;21|XtD}pW6K`<6qJF5LAS(3wpZ_Ul%U4gqR@a+D>4UC~f zHU#}}d3z1Ef~M%*aq zUZj);jTCr0xfty6jlbFB$)5_^PEtuBXed7Qmy+NQI9T!2$zW5ehe0o-&>PPc!C#>_ z?d1aQp!g7nLcci?gLhuFF4XA@6(ew~j}`}R)P=aZY0GJHX4g`qq%HD%if}KJ=G+N-PPJ(GI`_NEZqNH@VfG- z(T=3?UhhN{Zoe_@HIsPv1-m|fHr#1$jXv+X$IErrZ5f&nGKVPcL)Ip1h%W4;L`vre z|0KR-C%rs`O5YOw8%FR@tTni*6qHiLflR{1aWr7j4Mtk*15Uc-=|D2rLj|!`bh8?EBhSNLUZtMeI~kJ(I1wlZ zzft3fmGap7I~Fw_rKmCmGf#5I6{TD$7i|iVT%Rz;HAyY=J?gl*%@`CMF2Z=Uq2}8L zD`h@A^sfn-92Fcsc1QZP6(ENX?1j!^ZTe6uxpBC<^!>YWnzve?bIj84WryGjL;7<+ zoEzOmRi)#kw*~`QrIu%p(^R`REJF;qL;R+GHKFnsGnS%D>z9yA{)jM2mxchopP?j@ zABIZf%VeK;I#ppsl^d}utc}nsRLP#eV!c)qD_gkx=M*S6i#pUQGFD&~8?MM$K{bU% zTUtU)JgZy*$=dC^1L09bc_49&JZn(el^X*G1E?;Y^X;|Mn`X-jG3Ua7nF7fHhw81M z7ux%BS%310E(k=7$TGXyoF`j)n>t*LOpYLJR~x#J9}nmj-hq(l+jC2_vBw2W=(hy0 z(g9q}zGrx}+M=iW`}X5wu$V7F*G%ZQRsz9Nen1d9eYpm>#vVX8Fv&6%>|7o&{ng(J zdvnrm$(P8^QD z{8RFMYzo4twU#a{-&IwZ6d;a(n` z>vX1hdz2UZaFuWH+8Do}$3_k&?)1yAqu z(tFa-v7vtVD|KEPBA@TO{A1QHx;Mr)IE)TNj4Nz4(> z&7T1$=U(>Z%2=^m#zdXwicg62cE4|+pO zI3)pmId3*jGy9#7rm+FfYE#s^o!OWaRcjryR+ft`4XVM?R3E#W@m*KdC!bdfHTdWl zB=M}s_qzV1n@qH@qu#oOO(0E$?uRwH)M>}OfGK!ePY%Ni=;L;h$V24z_zbQ9-2&6& z;l7U%ajOh9z^OS1-}#rJdBel9&{Cft0v5*z@#aTO)JblODhI`>YiDG)9f2W-74Y^7 z&pZ&ZMs+HIq)(^#t)gFjDabbz$&UB_n@S%6 zqwdMf>`*7hzpf$zxQS4nPa#0O|Lk%R&73-*Fnj<2QGid4VC5pF`R|?x0C@731^;{M z5V~B-nA7Bl3@$d>|BsCSmF>_XX1N$>|Ksz2fs*{c*}stm6M~eRo%Y`sYhwTa4wwJ{ a$^Q}Lvmp$*WiVNvArRcm*cY7tlK%sz%H>@E delta 5560 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 W6epZh5Qc5c19uQ)$LHez7x-V%hke-q diff --git a/helpers/functions.R b/helpers/functions.R index 7c5aaf4..bd1c908 100644 --- a/helpers/functions.R +++ b/helpers/functions.R @@ -28,6 +28,7 @@ get_dummy_df <- function() { #' #' Needed for proper data validation. check_for_empty_data <- function(value_to_check) { + # for any 0-length if (length(value_to_check) == 0) return(TRUE) diff --git a/modules/utils.R b/modules/utils.R index b988484..f0d60fe 100644 --- a/modules/utils.R +++ b/modules/utils.R @@ -5,7 +5,6 @@ 'Module path: "', basename(box::file()), '"' ) } -# ================ # asdasd #' @export @@ -22,7 +21,7 @@ make_panels <- function(page_name, main_scheme) { # making cards cards <- purrr::map( .x = cols_list, - .f = make_cards_fn, + .f = render_cards_with_forms, main_scheme = main_scheme ) @@ -43,8 +42,27 @@ make_panels <- function(page_name, main_scheme) { } # functions for making cards +# DO THIS INSTEAD !!! #' @export -make_cards_fn <- function(sub_group, main_scheme) { +# make_forms_by_scheme <- function(tool_id, main_scheme, ns) { + +# ns <- NS(ns(tool_id)) + +# main_scheme <<- main_scheme +# subgroup_schema <- main_scheme |> +# dplyr::filter(tool_id == {{tool_id}}) + +# purrr::pmap( +# .l = dplyr::distinct(subgroup_schema, form_id, form_label, form_type), +# .f = render_forms, +# schema = subgroup_schema, +# ns = ns +# ) +# } + +# functions for making cards +#' @export +render_cards_with_forms <- function(sub_group, main_scheme) { main_scheme <<- main_scheme subgroups_inputs <- main_scheme |> @@ -54,13 +72,14 @@ make_cards_fn <- function(sub_group, main_scheme) { bslib::card( bslib::card_header(sub_group, container = htmltools::h5), full_screen = TRUE, + fill = TRUE, width = "4000px", bslib::card_body( fill = TRUE, # передаем все аргументы в функцию для создания елементов purrr::pmap( .l = subgroups_inputs, - .f = create_forms, + .f = render_forms, main_scheme = main_scheme ) ) @@ -70,20 +89,52 @@ make_cards_fn <- function(sub_group, main_scheme) { # UI RELATED ============================ #' @export #' @param TEST s -create_forms <- function( +render_forms <- function( form_id, form_label, form_type, main_scheme ) { + filterd_line <- dplyr::filter(main_scheme, form_id == {{form_id}}) + # check if have condition - condition <- dplyr::filter(main_scheme, form_id == {{form_id}}) |> - dplyr::distinct(condition) |> + condition <- unique(filterd_line$condition) + + # get choices from schema + choices <- filterd_line$choices + + # get choices from schema + description <- unique(filterd_line) |> + dplyr::filter(!is.na(form_description)) |> + dplyr::distinct(form_description) |> dplyr::pull() - choices <- dplyr::filter(main_scheme, form_id == {{form_id}}) |> - dplyr::pull(choices) + # описание + if (length(description) > 1) { + rlang::abort(sprintf( + "%s - более чем 1 уникальный вариант описания:\n%s", form_id, paste0(description, collapse = "\n") + )) + } else if (length(description) == 0) { + description <- NA + } + + # отдельно создаем заголовки + label <- if (is.na(description) && is.na(form_label)) { + NULL + } else { + shiny::tagList( + if (!is.na(form_label)) { + shiny::span(form_label, style = "color: #444444; font-weight: 550; line-height: 1.4;") + # если в схеме есть поле с описанием - добавлеяем его следующей строчкой + }, + if (!is.na(description) && !is.na(form_label)) shiny::br(), + if (!is.na(description)) { + shiny::span(shiny::markdown(description)) |> htmltools::tagAppendAttributes(style = "color:gray; font-size:small; line-height: 1.4;") + # span(description, style = "color:gray; font-size:small;") + } + ) + } # simple text or number input if (form_type == "text") { @@ -93,7 +144,7 @@ create_forms <- function( form <- shiny::textAreaInput( inputId = form_id, - label = shiny::span(style = "color: #444444; font-weight: 550;", form_label), + label = label, rows = rows_to_show ) } @@ -101,7 +152,7 @@ create_forms <- function( if (form_type == "number") { form <- shiny::textAreaInput( inputId = form_id, - label = shiny::span(style = "color: #444444; font-weight: 550;", form_label), + label = label, rows = 1 ) } @@ -112,7 +163,7 @@ create_forms <- function( suppressWarnings({ form <- shiny::dateInput( inputId = form_id, - label = shiny::span(style = "color: #444444; font-weight: 550;", form_label), + label = label, value = NA, # keep empty format = "dd.mm.yyyy", weekstart = 1, @@ -125,7 +176,7 @@ create_forms <- function( if (form_type == "select_one") { form <- shiny::selectizeInput( inputId = form_id, - label = shiny::span(style = "color: #444444; font-weight: 550;", form_label), + label = label, choices = choices, selected = NULL, options = list( @@ -139,7 +190,7 @@ create_forms <- function( if (form_type == "select_multiple") { form <- shiny::selectizeInput( inputId = form_id, - label = shiny::span(style = "color: #444444; font-weight: 550;", form_label), + label = label, choices = choices, selected = NULL, multiple = TRUE, @@ -154,7 +205,7 @@ create_forms <- function( if (form_type == "radio") { form <- shiny::radioButtons( inputId = form_id, - label = shiny::span(style = "color: #444444; font-weight: 550;", form_label), + label = label, choices = choices, selected = character(0) ) @@ -163,7 +214,7 @@ create_forms <- function( if (form_type == "checkbox") { form <- shiny::checkboxGroupInput( inputId = form_id, - # label = shiny::span(style = "color: #444444; font-weight: 550;", form_label), + # label = label, label = shiny::h6(form_label), choices = choices, selected = character(0) @@ -177,7 +228,18 @@ create_forms <- function( # description part if (form_type == "description") { - form <- shiny::div(shiny::HTML(form_label), style = "color:Gray;font-size: 90%;") + if(is.na(form_label)) { + form <- shiny::hr(style = "margin-bottom: -3px;") + } else { + form <- shiny::div(shiny::HTML(form_label), style = "color: Gray; font-size: 90%;") + } + } + + if (form_type == "description_header") { + form <- shiny::h5( + label, + style = "margin-bottom: -8px; margin-top: 10px;" + ) } # если есть условие создать кондитионал панель @@ -187,6 +249,7 @@ create_forms <- function( form ) } + form }