---
title: "Navigation Utilities"
output: rmarkdown::html_vignette
vignette: >
%\VignetteIndexEntry{Navigation Utilities}
%\VignetteEngine{knitr::rmarkdown}
%\VignetteEncoding{UTF-8}
---
```{r, include = FALSE}
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>",
eval = FALSE
)
```
```{r setup}
library(bs4Dashkit)
```
`bs4Dashkit` provides a few navbar helpers designed for `{bs4Dash}`.
They return standard Shiny UI (mostly `actionButton()` wrapped for navbar use)
and are styled consistently with `btn-nav-pill`.
## `dash_nav_item()` — wrapping elements for the navbar
`{bs4Dash}`'s navbar typically expects items wrapped in a `
`.
`dash_nav_item()` applies the wrapper (` ... `) so you can focus on the content.
```{r}
rightUi = tagList(
dash_nav_item(dash_nav_refresh_button("refresh")),
dash_nav_item(dash_nav_help_button("help"))
)
```
If a component already returns a `` (for example `dash_nav_title()`), you do
not need to wrap it again.
---
## Refresh button
Creates a pre-styled `actionButton()` intended for the navbar.
```{r}
dash_nav_refresh_button("refresh") # default label + icon
dash_nav_refresh_button("refresh", label = "Reload") # custom label
dash_nav_refresh_button("refresh", label = "") # icon only
dash_nav_refresh_button("refresh", icon = "arrows-rotate")
```
**Server wiring:**
The most common behavior is a full app refresh:
```{r}
observeEvent(input$refresh, {
session$reload()
})
```
If you prefer a "soft refresh", you can invalidate reactive chains instead
(for example, by updating a reactive counter). That pattern is app-specific.
## Help button
Creates a pre-styled `actionButton()` intended to open help content.
```{r}
dash_nav_help_button("help") # default label + icon
dash_nav_help_button("help", label = "Support") # custom label
dash_nav_help_button("help", label = "") # icon only
dash_nav_help_button("help", icon = "circle-info")
```
**Server wiring **
A simple help modal:
```{r}
observeEvent(input$help, {
showModal(modalDialog(
title = "Help",
"Add your instructions here.",
easyClose = TRUE,
footer = modalButton("Close")
))
})
```
A more structured help modal:
```{r}
observeEvent(input$help, {
showModal(modalDialog(
title = "Help & Documentation",
tagList(
h4("Getting started"),
p("Describe the dashboard purpose here."),
h4("Data sources"),
p("Describe where data comes from."),
h4("Contact"),
p("Email: support@yourorg.gov")
),
size = "l",
easyClose = TRUE,
footer = modalButton("Close")
))
})
```
## Logout button
Creates a pre-styled `actionButton()` intended to trigger an application-defined
sign-out flow.
```{r}
dash_nav_logout_button("logout")
```
**Server wiring (example pattern)**
Sign-out behavior is application-specific (authentication, redirects, session
cleanup). A typical UI pattern is a confirmation modal:
```{r}
observeEvent(input$logout, {
showModal(modalDialog(
title = "Sign out",
"Are you sure you want to sign out?",
footer = tagList(
modalButton("Cancel"),
actionButton("logout_confirm", "Sign out",
class = "btn btn-danger")
),
easyClose = TRUE
))
})
observeEvent(input$logout_confirm, {
removeModal()
# Your sign-out logic goes here (auth/session cleanup/redirect).
session$reload()
})
```
## `dash_nav_title()` — styled title block
Renders a title block with optional subtitle and icon, designed for
use in `leftUi` or `rightUi.`
```{r}
dash_nav_title(
title = "DASHBOARDS",
subtitle = "Critical & Main",
icon = "shield-halved", # Font Awesome icon name
align = "center" # "center" | "left" | "right"
)
```
### Alignment patterns
**Centered** — title floats to the middle of the navbar regardless of other items:
```{r}
rightUi = tagList(
dash_nav_title(
"DASHBOARDS", "Critical & Main",
icon = "shield-halved",
align = "center"
),
dash_nav_item(dash_nav_refresh_button("refresh")),
dash_nav_item(dash_nav_help_button("help"))
)
```
**Right-aligned** — title sits after all other right items:
```{r}
rightUi = tagList(
dash_nav_item(dash_nav_refresh_button("refresh")),
dash_nav_item(dash_nav_help_button("help")),
dash_nav_title(
"DASHBOARDS", "Critical & Main",
icon = "shield-halved",
align = "right"
)
)
```
**Left-aligned** — title appears before other right items:
```{r}
rightUi = tagList(
dash_nav_title(
"DASHBOARDS", "Critical & Main",
icon = "shield-halved",
align = "left"
),
dash_nav_item(dash_nav_refresh_button("refresh")),
dash_nav_item(dash_nav_help_button("help"))
)
```
## `dash_user_menu()` — user menu wrapper
`dash_user_menu()` is a lightweight wrapper that ensures your dropdown menu is
placed in the correct navbar `` container with a consistent class:
- ``
Because it already returns a ``, **do not** wrap it in `dash_nav_item()`.
```{r}
dash_nav_item(
dash_user_menu(
dropdownMenu(
type = "notifications",
notificationItem("Profile"),
notificationItem("Logout")
)
)
)
```
## Sign out patterns (no dedicated button)
`bs4Dashkit` does not ship a dedicated logout button. Most apps place sign-out
inside the user dropdown menu, which keeps the navbar clean.
### Option 1: “Logout” inside the dropdown menu
```{r}
dash_user_menu(
dropdownMenu(
type = "notifications",
notificationItem("Profile"),
notificationItem("Logout")
)
)
```
Handle sign-out by listening to your own input
or by using whatever authentication framework you’re using. If you just want
a simple confirmation and reload:
```{r}
# Example only: you control the real sign-out logic
observeEvent(input$logout, { ... })
```
## Full navbar example
```{r}
bs4DashNavbar(
title = ttl$brand,
skin = "light",
rightUi = tagList(
dash_nav_title(
"DASHBOARDS",
"Critical & Main",
icon = "shield-halved",
align = "center"
),
dash_nav_item(dash_nav_refresh_button("refresh")),
dash_nav_item(dash_nav_help_button("help")),
dash_nav_item(dash_nav_logout_button("logout")),
dash_nav_item(
dash_user_menu(
dropdownMenu(
type = "notifications",
notificationItem("Profile"),
notificationItem("Sign out")
)
)
)
)
)
```
**Server:**
```{r}
server <- function(input, output, session) {
observeEvent(input$refresh, session$reload())
observeEvent(input$help, {
showModal(modalDialog("Help content.", easyClose = TRUE))
})
observeEvent(input$logout, {
showModal(modalDialog(
title = "Sign out",
"Are you sure?",
footer = tagList(
modalButton("Cancel"),
actionButton("logout_confirm", "Sign out", class = "btn btn-danger")
)
))
})
observeEvent(input$logout_confirm, {
removeModal()
session$reload()
})
}
```