# Using Crosstalk

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:

    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 when creating your `SharedData` object (e.g `key = ~ guid`).
- `group`
  - Specifying a group name 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`:

    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"))
          )
        }
      )
    )