---
title: "Using Crosstalk"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{using-crosstalk}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)
```

The `rsc_table()`, `rsc_grid()`, `rsc_search()`, and `rsc_filter()`  widgets use
`crosstalk` to facilitate inter-widget communication. In simple cases, passing
identical results from the `content()` tibble is sufficient:

```{r, eval=FALSE}
library(connectwidgets)
library(dplyr)
library(purrr)
library(htmltools)

client <- connect()
all_content <- client %>% content()
some_content <- slice_sample(all_content, prop = .1)

tagList(
  rsc_cols(rsc_search(some_content), rsc_filter(some_content)),
  rsc_table(some_content)
)
```

For more complicated layouts, you may want to pass your own `crosstalk` objects to the components.

## Example: Grids grouped by owner

As a publisher, you want to:

- display each content owner's username with a level 4 heading
- display an `rsc_grid()` of each content owner's items
- display one search and filter widget that works across all the card grids

`crosstalk::SharedData$new()` takes two optional parameters that make this possible:

- `keys`
  - The `content()` tibble contains a globally unique identifier (GUID) for each piece of content, which you can [use as a key](https://rstudio.github.io/crosstalk/using.html#keys) when creating your `SharedData` object (e.g `key = ~ guid`).

- `group`
  - Specifying a [group name](https://rstudio.github.io/crosstalk/using.html#grouping)
  when creating the `SharedData` object gives you control over which widgets are
  grouped together (e.g. `group = "xfilter"`).

Since the `some_content` tibble contains all the GUIDs, passing it to the Search
and Filter components will enable you to search across each of the subset tibbles
created by `dplyr::group_nest`:

```{r, eval=FALSE}
some_content_xfilter <- crosstalk::SharedData$new(
  some_content,
  key = ~ guid,
  group = "xfilter"
  )

rsc_content_shared <-
  some_content %>%
  group_nest(owner_username, .key = "content_df", keep = TRUE)

div(
  h3("Grouped Grids by Owner", class = "text-center"),
  rsc_cols(rsc_search(some_content_xfilter), rsc_filter(some_content_xfilter)),
  purrr::pmap(
    rsc_content_shared,
    {
      ~ tagList(
        h4(..1),
        rsc_grid(crosstalk::SharedData$new(..2, key = ~ guid, group = "xfilter"))
      )
    }
  )
)
```
