@@ -51,7 +51,8 @@ app_server <- function(input = NULL, output = NULL, session = NULL) {
5151 " filter_data" = get_config(" filter_data" ),
5252 " filter_key" = get_config(" filter_key" ),
5353 " startup_msg" = get_config(" startup_msg" ),
54- " reload_period" = get_config(" reload_period" )
54+ " reload_period" = get_config(" reload_period" ),
55+ " enable_dataset_filter" = get_config(" enable_dataset_filter" )
5556 )
5657
5758 app_server_(input , output , session , opts )
@@ -85,13 +86,15 @@ app_server_ <- function(input, output, session, opts) {
8586 )
8687
8788 module_server <- opts [[" module_info" ]][[" server_list" ]]
89+ module_meta <- opts [[" module_info" ]][[" meta_list" ]]
8890 module_names <- opts [[" module_info" ]][[" module_name_list" ]]
8991 module_hierarchy_list <- opts [[" module_info" ]][[" hierarchy_list" ]]
9092 data <- opts [[" data" ]]
9193 filter_data <- opts [[" filter_data" ]]
9294 filter_key <- opts [[" filter_key" ]]
9395 startup_msg <- opts [[" startup_msg" ]]
9496 reload_period <- opts [[" reload_period" ]]
97+ enable_dataset_filter <- opts [[" enable_dataset_filter" ]]
9598
9699 datasets_filters_info <- get_dataset_filters_info(data , filter_data )
97100
@@ -131,62 +134,120 @@ app_server_ <- function(input, output, session, opts) {
131134 shiny :: reactive(unfiltered_dataset()[[filter_data ]])
132135 )
133136
134- dataset_filters <- local({
135- l <- vector(mode = " list" , length = length(datasets_filters_info ))
136- names(l ) <- names(datasets_filters_info )
137- for (idx in seq_along(datasets_filters_info )) {
138- l [[idx ]] <- local({
139- curr_dataset_filter_info <- datasets_filters_info [[idx ]]
140- dv.filter :: data_filter_server(
141- curr_dataset_filter_info [[" id" ]],
142- shiny :: reactive({
143- unfiltered_dataset()[[curr_dataset_filter_info [[" name" ]]]] %|| % data.frame ()
144- })
145- )
146- })
147- }
148137
149- l
150- })
138+ if (enable_dataset_filter ) {
139+ log_inform(" Dataset filter server" )
140+
141+ dataset_filters <- local({
142+ l <- vector(mode = " list" , length = length(datasets_filters_info ))
143+ names(l ) <- names(datasets_filters_info )
144+ for (idx in seq_along(datasets_filters_info )) {
145+ l [[idx ]] <- local({
146+ curr_dataset_filter_info <- datasets_filters_info [[idx ]]
147+ dv.filter :: data_filter_server(
148+ curr_dataset_filter_info [[" id" ]],
149+ shiny :: reactive({
150+ unfiltered_dataset()[[curr_dataset_filter_info [[" name" ]]]] %|| % data.frame ()
151+ })
152+ )
153+ })
154+ }
151155
152- filtered_dataset <- shinymeta :: metaReactive({
153- # dv.filter returns a logical vector. This contemplates the case of empty lists
154- shiny :: req(is.logical(global_filtered_values()))
156+ l
157+ })
155158
156- # Depend on all datasets
157- purrr :: walk(dataset_filters , ~ .x())
159+ filtered_dataset <- shinymeta :: metaReactive({
160+ # dv.filter returns a logical vector. This contemplates the case of empty lists
161+ shiny :: req(is.logical(global_filtered_values()))
158162
159- # We do not react to changed in unfiltered dataset, otherwise when a dataset changes
160- # We filter the previous dataset which in the best case produces and extra reactive beat
161- # and in the worst case produces an error in (mvbc)
162- # We don't want to control the error in (mvbc) because filtered dataset only changes when filter changes
163- ufds <- shiny :: isolate(unfiltered_dataset())
163+ # Depend on all datasets
164+ purrr :: walk(dataset_filters , ~ .x())
164165
165- curr_dataset_filters <- dataset_filters [intersect(names(dataset_filters ), names(ufds ))]
166+ # We do not react to changed in unfiltered dataset, otherwise when a dataset changes
167+ # We filter the previous dataset which in the best case produces and extra reactive beat
168+ # and in the worst case produces an error in (mvbc)
169+ # We don't want to control the error in (mvbc) because filtered dataset only changes when filter changes
170+ ufds <- shiny :: isolate(unfiltered_dataset())
166171
167- # Current dataset must be logical with length above 0
168- # Check dataset filters check all datafilters are initialized
169- purrr :: walk(curr_dataset_filters , ~ shiny :: req(checkmate :: test_logical(.x(), min.len = 1 )))
172+ curr_dataset_filters <- dataset_filters [intersect(names(dataset_filters ), names(ufds ))]
170173
171- filtered_key_values <- ufds [[filter_data ]][[filter_key ]][global_filtered_values()]
174+ # Current dataset must be logical with length above 0
175+ # Check dataset filters check all datafilters are initialized
176+ purrr :: walk(curr_dataset_filters , ~ shiny :: req(checkmate :: test_logical(.x(), min.len = 0 )))
172177
173- fds <- ufds
178+ filtered_key_values <- ufds [[ filter_data ]][[ filter_key ]][global_filtered_values()]
174179
175- # Single dataset filtering
176- fds [names(curr_dataset_filters )] <- purrr :: imap(
177- fds [names(curr_dataset_filters )],
178- function (val , nm ) {
179- # (mvbc)
180- fds [[nm ]][dataset_filters [[nm ]](), , drop = FALSE ]
181- }
182- )
180+ fds <- ufds
183181
184- # Global dataset filtering
185- global_filtered <- purrr :: map(
186- fds ,
187- ~ dplyr :: filter(.x , .data [[filter_key ]] %in% filtered_key_values ) # nolint
182+ # Single dataset filtering
183+ fds [names(curr_dataset_filters )] <- purrr :: imap(
184+ fds [names(curr_dataset_filters )],
185+ function (val , nm ) {
186+ # (mvbc)
187+ labels <- get_lbls(fds [[nm ]])
188+ current_fds <- fds [[nm ]][dataset_filters [[nm ]](), , drop = FALSE ]
189+ set_lbls(current_fds , labels )
190+ }
191+ )
192+
193+ # Global dataset filtering
194+ global_filtered <- purrr :: map(
195+ fds , function (current_ds ) {
196+ mask <- current_ds [[filter_key ]] %in% filtered_key_values
197+ labels <- get_lbls(current_ds )
198+ current_ds <- current_ds [mask , , drop = FALSE ]
199+ set_lbls(current_ds , labels )
200+ }
201+ )
202+ })
203+
204+ tab_ids <- c(" __tabset_0__" , names(opts [[" module_info" ]][[" tab_group_names" ]]))
205+ shiny :: observeEvent(
206+ {
207+ purrr :: map(tab_ids , ~ input [[.x ]])
208+ },
209+ {
210+ current_tab <- " __tabset_0__"
211+ zero_tabs <- length(input [[" __tabset_0__" ]]) == 0
212+ if (! zero_tabs ) {
213+ while (! current_tab %in% opts [[" module_info" ]][[" module_id_list" ]]) {
214+ current_tab <- input [[current_tab ]]
215+ }
216+ }
217+
218+ used_ds <- used_datasets [[current_tab ]]
219+ all_nm <- names(datasets_filters_info )
220+ if (! zero_tabs && ! is.null(used_ds )) {
221+ used_nm <- intersect(used_datasets [[current_tab ]], names(datasets_filters_info ))
222+ unused_nm <- setdiff(all_nm , used_nm )
223+ } else {
224+ used_nm <- all_nm
225+ unused_nm <- character (0 )
226+ }
227+
228+ for (nm in unused_nm ) {
229+ shinyjs :: hide(datasets_filters_info [[nm ]][[" id_cont" ]])
230+ }
231+
232+ for (nm in used_nm ) {
233+ shinyjs :: show(datasets_filters_info [[nm ]][[" id_cont" ]])
234+ }
235+ }
188236 )
189- })
237+ } else {
238+ log_inform(" Single filter server" )
239+
240+ filtered_dataset <- shinymeta :: metaReactive({
241+ # dv.filter returns a logical vector. This contemplates the case of empty lists
242+ shiny :: req(is.logical(global_filtered_values()))
243+ log_inform(" New filter applied" )
244+ filtered_key_values <- unfiltered_dataset()[[filter_data ]][[filter_key ]][global_filtered_values()] # nolint
245+ purrr :: map(
246+ unfiltered_dataset(),
247+ ~ dplyr :: filter(.x , .data [[filter_key ]] %in% filtered_key_values ) # nolint
248+ )
249+ })
250+ }
190251
191252 # Prepare module_output argument
192253 module_output_env <- rlang :: current_env()
@@ -257,11 +318,20 @@ app_server_ <- function(input, output, session, opts) {
257318 )
258319 )
259320
321+ used_datasets <- list ()
322+
260323 module_output <- list ()
261324 for (srv in module_server ) {
262- module_output [[srv [[" module_id" ]]]] <- srv [[" server" ]](module_args )
325+ mod_id <- srv [[" module_id" ]]
326+ srv_fun <- srv [[" server" ]]
327+
328+ module_output [[mod_id ]] <- srv_fun(module_args )
329+ used_datasets [[mod_id ]] <- module_meta [[mod_id ]][[" meta" ]][[" dataset_info" ]][[" all" ]]
263330 }
264331
332+
333+
334+
265335 # ### Report modal
266336
267337 # REPORT IS DEACTIVATED
0 commit comments