256 lines
11 KiB
R
256 lines
11 KiB
R
INSP_INFO <- list(
|
||
futtervorrat = list(
|
||
title = "Futtervorrat schätzen",
|
||
content = shiny::tagList(
|
||
shiny::tags$p("Zarge wiegen und Leergewicht abziehen."),
|
||
shiny::tags$p(shiny::tags$strong("Richtwerte Leergewicht (Holz):")),
|
||
shiny::tags$table(class = "table table-sm table-borderless mb-0",
|
||
shiny::tags$tbody(
|
||
shiny::tags$tr(shiny::tags$td("Zander Honigraum"), shiny::tags$td("ca. 5–6 kg")),
|
||
shiny::tags$tr(shiny::tags$td("Zander Brutraum"), shiny::tags$td("ca. 7–8 kg")),
|
||
shiny::tags$tr(shiny::tags$td("Dadant Brutraum"), shiny::tags$td("ca. 8–10 kg"))
|
||
)
|
||
),
|
||
shiny::tags$p(class = "mt-2 mb-0", "1 voll verdeckelter Rahmen ≈ 2–3 kg."),
|
||
shiny::tags$p(class = "mb-0 text-muted small", "Winterbedarf: ca. 15–20 kg / Volk.")
|
||
)
|
||
),
|
||
sanftmut = list(
|
||
title = "Sanftmut (1–4)",
|
||
content = shiny::tagList(
|
||
shiny::tags$p(class = "mb-1", "Verhalten während der Durchsicht", shiny::tags$em("(niedriger = besser):")),
|
||
shiny::tags$table(class = "table table-sm table-borderless mb-0",
|
||
shiny::tags$tbody(
|
||
shiny::tags$tr(shiny::tags$td(shiny::tags$strong("1")), shiny::tags$td("sehr sanft – kein Stichversuch")),
|
||
shiny::tags$tr(shiny::tags$td(shiny::tags$strong("2")), shiny::tags$td("sanft – vereinzelte Stichversuche")),
|
||
shiny::tags$tr(shiny::tags$td(shiny::tags$strong("3")), shiny::tags$td("unruhig – mehrere Stichversuche")),
|
||
shiny::tags$tr(shiny::tags$td(shiny::tags$strong("4")), shiny::tags$td("aggressiv – folgt dem Imker"))
|
||
)
|
||
)
|
||
)
|
||
),
|
||
schwarmtrieb = list(
|
||
title = "Schwarmtrieb (1–4)",
|
||
content = shiny::tagList(
|
||
shiny::tags$p(class = "mb-1", "Neigung zur Schwarmbildung", shiny::tags$em("(niedriger = besser):")),
|
||
shiny::tags$table(class = "table table-sm table-borderless mb-0",
|
||
shiny::tags$tbody(
|
||
shiny::tags$tr(shiny::tags$td(shiny::tags$strong("1")), shiny::tags$td("kein Schwarmtrieb")),
|
||
shiny::tags$tr(shiny::tags$td(shiny::tags$strong("2")), shiny::tags$td("gering – vereinzelte Zellen")),
|
||
shiny::tags$tr(shiny::tags$td(shiny::tags$strong("3")), shiny::tags$td("erhöht – mehrere Zellen")),
|
||
shiny::tags$tr(shiny::tags$td(shiny::tags$strong("4")), shiny::tags$td("stark – Schwarm unmittelbar"))
|
||
)
|
||
)
|
||
)
|
||
),
|
||
wabensitz = list(
|
||
title = "Wabensitz (1–4)",
|
||
content = shiny::tagList(
|
||
shiny::tags$p(class = "mb-1", "Ruhigkeit auf der Wabe", shiny::tags$em("(niedriger = besser):")),
|
||
shiny::tags$table(class = "table table-sm table-borderless mb-0",
|
||
shiny::tags$tbody(
|
||
shiny::tags$tr(shiny::tags$td(shiny::tags$strong("1")), shiny::tags$td("sehr ruhig – Bienen sitzen fest")),
|
||
shiny::tags$tr(shiny::tags$td(shiny::tags$strong("2")), shiny::tags$td("leicht unruhig")),
|
||
shiny::tags$tr(shiny::tags$td(shiny::tags$strong("3")), shiny::tags$td("unruhig – Traubenbildung")),
|
||
shiny::tags$tr(shiny::tags$td(shiny::tags$strong("4")), shiny::tags$td("sehr unruhig – starkes Laufen"))
|
||
)
|
||
)
|
||
)
|
||
),
|
||
honigertrag = list(
|
||
title = "Honigertrag (1–4)",
|
||
content = shiny::tagList(
|
||
shiny::tags$p(class = "mb-1", "Honigleistung relativ zur Standpopulation", shiny::tags$em("(niedriger = besser):")),
|
||
shiny::tags$table(class = "table table-sm table-borderless mb-0",
|
||
shiny::tags$tbody(
|
||
shiny::tags$tr(shiny::tags$td(shiny::tags$strong("1")), shiny::tags$td("überdurchschnittlich")),
|
||
shiny::tags$tr(shiny::tags$td(shiny::tags$strong("2")), shiny::tags$td("durchschnittlich")),
|
||
shiny::tags$tr(shiny::tags$td(shiny::tags$strong("3")), shiny::tags$td("unterdurchschnittlich")),
|
||
shiny::tags$tr(shiny::tags$td(shiny::tags$strong("4")), shiny::tags$td("sehr gering"))
|
||
)
|
||
)
|
||
)
|
||
),
|
||
varroa = list(
|
||
title = "Varroa-Hygiene (1–4)",
|
||
content = shiny::tagList(
|
||
shiny::tags$p(class = "mb-1", "VSH-Verhalten (Varroa Sensitive Hygiene)", shiny::tags$em("(niedriger = besser):")),
|
||
shiny::tags$table(class = "table table-sm table-borderless mb-0",
|
||
shiny::tags$tbody(
|
||
shiny::tags$tr(shiny::tags$td(shiny::tags$strong("1")), shiny::tags$td("sehr stark – räumt Varroazellen aus")),
|
||
shiny::tags$tr(shiny::tags$td(shiny::tags$strong("2")), shiny::tags$td("erkennbar")),
|
||
shiny::tags$tr(shiny::tags$td(shiny::tags$strong("3")), shiny::tags$td("schwach erkennbar")),
|
||
shiny::tags$tr(shiny::tags$td(shiny::tags$strong("4")), shiny::tags$td("nicht erkennbar"))
|
||
)
|
||
),
|
||
shiny::tags$p(class = "mt-2 mb-0 text-muted small", "Tipp: Alkoholwäsche gibt verlässlichere Werte.")
|
||
)
|
||
)
|
||
)
|
||
|
||
screen_inspection_ui <- function(id) {
|
||
ns <- NS(id)
|
||
shiny::div(
|
||
section_card(NULL,
|
||
shiny::div(class = "row g-2 py-2",
|
||
shiny::div(class = "col-6",
|
||
shiny::dateInput(ns("date"), "Datum", value = Sys.Date(), language = "de", weekstart = 1)
|
||
),
|
||
shiny::div(class = "col-6",
|
||
shiny::textInput(ns("inspector"), "Imker/in")
|
||
)
|
||
)
|
||
),
|
||
section_card("Stockkarte",
|
||
stepper_row(ns, "brood", "Brutwaben"),
|
||
stepper_row(ns, "honey", "Honigwaben"),
|
||
strength_row(ns),
|
||
shiny::div(
|
||
class = "d-flex justify-content-between align-items-center py-3 border-bottom",
|
||
shiny::span(class = "fw-semibold",
|
||
"Futtervorrat (kg)",
|
||
info_icon(INSP_INFO$futtervorrat$title, INSP_INFO$futtervorrat$content)
|
||
),
|
||
shiny::numericInput(ns("food_kg"), NULL, value = NA, min = 0, step = 0.5, width = "100px")
|
||
)
|
||
),
|
||
section_card("Königin",
|
||
toggle_row(ns, "queen_seen", "Königin gesehen"),
|
||
toggle_row(ns, "eggs_seen", "Eier / Stifte gesehen"),
|
||
stepper_row(ns, "qcells", "Weiselzellen")
|
||
),
|
||
section_card(NULL,
|
||
shiny::div(class = "py-2",
|
||
shiny::div(class = "d-flex justify-content-between align-items-center mb-1",
|
||
shiny::tags$label("Notizen / Auffälligkeiten", class = "form-label mb-0"),
|
||
shiny::div(class = "d-flex align-items-center gap-2",
|
||
shiny::tags$small(id = ns("mic_status"), class = "text-muted", ""),
|
||
shiny::tags$button(
|
||
id = ns("mic_btn"),
|
||
type = "button",
|
||
class = "btn btn-outline-secondary btn-sm",
|
||
title = "Spracheingabe (Deutsch)",
|
||
"\U0001f3a4"
|
||
)
|
||
)
|
||
),
|
||
shiny::textAreaInput(ns("notes"), NULL, rows = 3, width = "100%"),
|
||
shiny::tags$script(shiny::HTML(sprintf('
|
||
setTimeout(function() {
|
||
var SR = window.SpeechRecognition || window.webkitSpeechRecognition;
|
||
var btn = document.getElementById("%s");
|
||
var sts = document.getElementById("%s");
|
||
if (!SR) { if (btn) btn.style.display = "none"; return; }
|
||
var rec = null;
|
||
var active = false;
|
||
|
||
function setIdle() {
|
||
active = false;
|
||
btn.classList.replace("btn-danger", "btn-outline-secondary");
|
||
btn.textContent = "\U0001f3a4";
|
||
sts.textContent = "";
|
||
}
|
||
function setRecording() {
|
||
active = true;
|
||
btn.classList.replace("btn-outline-secondary", "btn-danger");
|
||
btn.textContent = "⏹";
|
||
sts.textContent = "Aufnahme...";
|
||
}
|
||
|
||
btn.addEventListener("click", function() {
|
||
if (active) {
|
||
rec.stop();
|
||
} else {
|
||
rec = new SR();
|
||
rec.lang = "de-DE";
|
||
rec.continuous = false;
|
||
rec.interimResults = false;
|
||
|
||
rec.onstart = function() { setRecording(); };
|
||
rec.onresult = function(e) {
|
||
var t = Array.from(e.results)
|
||
.filter(function(r) { return r.isFinal; })
|
||
.map(function(r) { return r[0].transcript; })
|
||
.join(" ").trim();
|
||
if (!t) return;
|
||
var ta = document.getElementById("%s");
|
||
ta.value = ta.value ? ta.value + " " + t : t;
|
||
Shiny.setInputValue("%s", ta.value, {priority: "event"});
|
||
};
|
||
rec.onerror = function(e) {
|
||
sts.textContent = "Fehler: " + e.error;
|
||
setTimeout(setIdle, 2000);
|
||
};
|
||
rec.onend = function() { setIdle(); };
|
||
rec.start();
|
||
}
|
||
});
|
||
}, 200);
|
||
', ns("mic_btn"), ns("mic_status"), ns("notes"), ns("notes"))))
|
||
)
|
||
),
|
||
collapsible_card("Zuchteigenschaften (optional)",
|
||
trait_row(ns, "t_sanft", "Sanftmut", info = INSP_INFO$sanftmut),
|
||
trait_row(ns, "t_schwarm", "Schwarmtrieb", info = INSP_INFO$schwarmtrieb),
|
||
trait_row(ns, "t_waben", "Wabensitz", info = INSP_INFO$wabensitz),
|
||
trait_row(ns, "t_honig", "Honigertrag", info = INSP_INFO$honigertrag),
|
||
trait_row(ns, "t_varroa", "Varroa-Hygiene", info = INSP_INFO$varroa),
|
||
collapse_id = "insp_zuchteig"
|
||
),
|
||
shiny::div(class = "d-grid mt-2 mb-5",
|
||
shiny::actionButton(ns("save"), "Durchsicht speichern",
|
||
class = "btn btn-primary btn-lg")
|
||
)
|
||
)
|
||
}
|
||
|
||
screen_inspection_server <- function(id, db, nav) {
|
||
moduleServer(id, function(input, output, session) {
|
||
ns <- session$ns
|
||
|
||
brood <- stepper_server("brood", input, output)
|
||
honey <- stepper_server("honey", input, output)
|
||
qcells <- stepper_server("qcells", input, output, default = 0L)
|
||
str_v <- strength_server("strength", ns, input, output)
|
||
|
||
t_sanft <- trait_server("t_sanft", ns, input, output)
|
||
t_schwarm <- trait_server("t_schwarm", ns, input, output)
|
||
t_waben <- trait_server("t_waben", ns, input, output)
|
||
t_honig <- trait_server("t_honig", ns, input, output)
|
||
t_varroa <- trait_server("t_varroa", ns, input, output)
|
||
|
||
observeEvent(nav$screen, {
|
||
if (nav$screen == "inspection") {
|
||
brood(NA_integer_); honey(NA_integer_); qcells(0L); str_v(NA_integer_)
|
||
t_sanft(NA_integer_); t_schwarm(NA_integer_); t_waben(NA_integer_)
|
||
t_honig(NA_integer_); t_varroa(NA_integer_)
|
||
}
|
||
}, ignoreInit = TRUE)
|
||
|
||
observeEvent(input$save, {
|
||
req(nav$colony_id)
|
||
db_inspections_insert(db,
|
||
colony_id = nav$colony_id,
|
||
date = input$date,
|
||
inspector = input$inspector,
|
||
brood_frames = brood(),
|
||
honey_frames = honey(),
|
||
food_stores_kg = input$food_kg,
|
||
colony_strength = str_v(),
|
||
queen_seen = isTRUE(input$queen_seen),
|
||
eggs_seen = isTRUE(input$eggs_seen),
|
||
queen_cells_count = qcells() %||% 0L,
|
||
notes = input$notes,
|
||
traits = list(
|
||
sanftmut = t_sanft(),
|
||
schwarmtrieb = t_schwarm(),
|
||
wabensitz = t_waben(),
|
||
honigertrag = t_honig(),
|
||
varroa_hygiene = t_varroa()
|
||
)
|
||
)
|
||
nav$screen <- "colony"
|
||
})
|
||
})
|
||
}
|