diff --git a/app.R b/app.R index 848dcfa..a5bd6a4 100644 --- a/app.R +++ b/app.R @@ -21,6 +21,7 @@ box::use( global_options$set_global_options( shiny.host = "0.0.0.0" + # APP.DEBUG = TRUE ) global_options$check_and_init_scheme() @@ -159,6 +160,31 @@ server <- function(input, output, session) { } }) + output$base_data <- renderUI({ + + con <- db$make_db_connection(scheme(),"base_data") + on.exit(db$close_db_connection(con, "base_data"), add = TRUE) + + # записей в базе всего + query <- glue::glue("SELECT COUNT ({mhcs()$get_main_key_id}) FROM main") + records_count <- DBI::dbGetQuery(con, query) |> + dplyr::pull() + + # задачи на сегодня + if ("tasks" %in% DBI::dbListTables(con)) { + query <- glue::glue("SELECT COUNT (task_id) FROM tasks WHERE task_status = 'active'") + tasks_count <- DBI::dbGetQuery(con, query) |> + dplyr::pull() + } else { + tasks_count <- 0 + } + + div( + strong("Записей всего:"), records_count, br(), + if (tasks_count > 0) p(strong("Задач на сегодня:"), actionLink("tasks-show_dt_today", tasks_count)) else "Задач нет" + ) + }) + # REACTIVE VALUES ================================= # Create a reactive values object to store the input data values <- reactiveValues( @@ -193,9 +219,9 @@ server <- function(input, output, session) { choices = enabled_schemes, selected = scheme() ), + uiOutput("base_data"), "Для начала работы нужно создать новую запись или загрузить существующую!", # сво - strong("tasks"), # загрузка панели для работы с базой данных uiOutput("admin_buttons_panel") ) @@ -205,6 +231,7 @@ server <- function(input, output, session) { validator_main(data_validation$init_val(mhcs()$get_scheme("main"))) validator_main()$enable() mhcs()$get_main_form_ui + } }) @@ -721,11 +748,9 @@ server <- function(input, output, session) { ) return() } - + 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", mhcs()) removeModal() }) @@ -754,6 +779,7 @@ server <- function(input, output, session) { removeModal() showNotification("Данные очищены!", type = "warning") + }) ## сохранение даннных ------------------------------- @@ -823,29 +849,46 @@ server <- function(input, output, session) { observeEvent(input$load_data, { req(input$load_data_key_selector) + values$main_key <- input$load_data_key_selector + + }) + + observeEvent(values$main_key, { + req(values$main_key) + + print(values$main_key) + con <- db$make_db_connection(scheme(),"load_data") on.exit(db$close_db_connection(con, "load_data"), add = TRUE) - df <- db$read_df_from_db_by_id( - table_name = "main", - schm = mhcs(), - main_key_value = input$load_data_key_selector, - con = con - ) + existed_main_keys <- (db$get_keys_from_table("main", mhcs(), con)) - forms$load_data_to_form( - df = df, - table_name = "main", - mhcs - ) - - values$main_key <- input$load_data_key_selector + if (values$main_key %in% existed_main_keys) { + + df <- db$read_df_from_db_by_id( + table_name = "main", + schm = mhcs(), + main_key_value = values$main_key, + con = con + ) + + forms$load_data_to_form( + df = df, + table_name = "main", + mhcs + ) + + log_action_to_db("loading data", values$main_key, con = con) + + } else { + utils$clean_forms("main", mhcs()) + } + main_form_is_empty(FALSE) # обновление счетичка задач tasks$update_task_button_count(con, values, NS("tasks")) - log_action_to_db("loading data", values$main_key, con = con) removeModal() }) @@ -1209,7 +1252,6 @@ server <- function(input, output, session) { # TASKS --------------------------------------- tasks$server("tasks", values, scheme, mhcs) - } diff --git a/app/tasks.R b/app/tasks.R index 3a4ea4b..a4730b6 100644 --- a/app/tasks.R +++ b/app/tasks.R @@ -43,25 +43,6 @@ server <- function(id, values, scheme, mhcs) { tasks_selector <- NULL } - ## new tasks ---------------- - get_default_task <- function() { - - tibble::tibble( - task_id = paste0(format(Sys.time(), "%Y%m%d%H%M%S"), "_", values$main_key), - task_main_key = values$main_key, - task_status = "active", - task_title = "НОВАЯ ЗАДАЧА", - task_description = "", - task_due_date = NA, - task_user_created = values$current_user, - task_datetime_created = Sys.time(), - task_user_last_updated = NA, - task_datetime_last_updated = NA, - task_user_completed = NA, - task_datetime_completed = NA - ) - } - # ui -------------------- # очень большой костыль subroup_scheme <- mhcs()$get_scheme("tasks") |> @@ -101,12 +82,31 @@ server <- function(id, values, scheme, mhcs) { )) } + ## new tasks ---------------- + get_default_task <- function() { + + tibble::tibble( + task_id = paste0(format(Sys.time(), "%Y%m%d%H%M%S"), "_", values$main_key), + task_main_key = values$main_key, + task_status = "active", + task_title = "НОВАЯ ЗАДАЧА", + task_description = "", + task_due_date = NA, + task_user_created = values$current_user, + task_datetime_created = Sys.time(), + task_user_last_updated = NA, + task_datetime_last_updated = NA, + task_user_completed = NA, + task_datetime_completed = NA + ) + } + # button logic --------------------- ## отображение окна ----------------- observeEvent(input$display_task_modal, { - con <- db$make_db_connection(scheme(),"nested_tables") - on.exit(db$close_db_connection(con, "nested_tables"), add = TRUE) + con <- db$make_db_connection(scheme(),"display_task_modal") + on.exit(db$close_db_connection(con, "display_task_modal"), add = TRUE) values$tasks_data <- if ("tasks" %in% DBI::dbListTables(con)) { DBI::dbGetQuery(con, glue::glue("SELECT * FROM tasks WHERE task_main_key = '{values$main_key}'")) |> @@ -247,7 +247,7 @@ server <- function(id, values, scheme, mhcs) { }) - ## с + ## создание новой задачи ------------- observeEvent(input$tasks_create_new_task, { new_task <- get_default_task() @@ -263,6 +263,7 @@ server <- function(id, values, scheme, mhcs) { show_modal_for_tasks() }) + ## создание новой авто-задачи ------------- observeEvent(input$tasks_add_autoreview, { new_task <- get_default_task() @@ -282,6 +283,64 @@ server <- function(id, values, scheme, mhcs) { show_modal_for_tasks() }) + ## отображение списка задач для текущего дня ------------ + observeEvent(input$show_dt_today, { + + con <- db$make_db_connection(scheme(),"display_task_modal") + on.exit(db$close_db_connection(con, "display_task_modal"), add = TRUE) + + values$tasks_data <- DBI::dbGetQuery(con, glue::glue("SELECT * FROM tasks WHERE task_status = 'active'")) |> + dplyr::mutate(dplyr::across(c("task_datetime_created", "task_datetime_last_updated", "task_datetime_completed"), as.POSIXct)) |> + dplyr::mutate(dplyr::across(c("task_due_date"), as.Date)) + + output$dt_todays_tasks <- DT::renderDataTable( + DT::datatable( + values$tasks_data, + caption = 'Table 1: This is a simple caption for the table.', + rownames = FALSE, + # colnames = col_types |> dplyr::pull(form_id, form_label), + extensions = c('KeyTable', "FixedColumns"), + # editable = 'cell', + selection = "single", + options = list( + dom = 'tip', + scrollX = TRUE, + fixedColumns = list(leftColumns = 1), + keys = TRUE + ) + ) |> + DT::formatDate(c("task_datetime_created", "task_datetime_completed", "task_datetime_last_updated", "task_due_date"), "toLocaleDateString", params = list('ru-RU')) + ) + + showModal(modalDialog( + DT::dataTableOutput(ns("dt_todays_tasks")), + size = "xl", + footer = tagList( + actionButton(ns("jump_to_main_key"), "перейти к id") + ), + easyClose = TRUE + )) + + }) + + observeEvent(input$jump_to_main_key, { + + if (is.null(input$dt_todays_tasks_rows_selected)) { + showNotification("необходимо выбрать задачу", type = "error") + } else { + + # get key + new_main_key <- values$tasks_data[input$dt_todays_tasks_rows_selected,]$task_main_key + values$main_key <- new_main_key + + showNotification("TODO: если ключа нет в таблице?!", type = "warning", duration = NULL) + removeModal() + + # log_action_to_db("loading data", values$main_key, con = con) + + } + }) + }) }