---
title: "twbparser-intro"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{twbparser-intro}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r, include = FALSE}
knitr::opts_chunk$set(
  collapse = TRUE,
  comment = "#>"
)
```

```{r setup}
library(twbparser)
ok <- FALSE
twb_path <- system.file("extdata", "test_for_wenjie.twb", package = "twbparser")
if (nzchar(twb_path) && file.exists(twb_path)) {
parser <- TwbParser$new(twb_path)
ok <- TRUE
} else {
cat("> Demo .twb not found in installed package. Skipping executable examples.\n")
}


```

# Introduction

`twbparser` parses Tableau `.twb` and `.twbx` workbooks and exposes datasources,
relationships, joins, fields, calculated fields, and TWBX assets. It also
provides page-centric insights — dashboards, worksheets, stories, their
composition, filter positions, chart types, and colors/palettes — as well as
per-worksheet shelf/filter/axis/sort details and per-dashboard zone layout and
actions. This vignette demonstrates common use cases.

# Parse a Tableau Workbook

```{r parse-twb, eval=exists("parser")}
parser$summary
parser$overview
```

# Extracting Datasources and Parameters

```{r datasources, eval=exists("parser")}
datasources <- parser$get_datasources()
parameters <- parser$get_parameters()

print(head(datasources))
print(head(parameters))
```

# Fields and calculated fields

Parameters are excluded by default from calculated fields; opt-in via `include_parameters = TRUE`.

```{r calculated_fields, eval=exists("parser")}
head(parser$get_fields())
head(parser$get_calculated_fields(pretty = TRUE, wrap = 120))

```

# Page insights

List all pages and summarize each page

```{r insights_1, eval=ok}
twb_pages(parser)
twb_pages_summary(parser)


```

Inspect what a specific page contains

```{r insight_2, eval=ok}


pg <- twb_pages(parser)
nm <- if (nrow(pg)) pg$name[[1]] else NA_character_
if (!is.na(nm)) {
  parser$get_page_composition(nm)
}


```

Filters and their positions across dashboards

```{r insights_3, eval=ok}
twb_dashboard_filters(parser)

```

Chart (mark) types per worksheet and colors/palettes

```{r insights_4, eval=ok}
twb_charts(parser)
twb_colors(parser)

```

# Worksheet intelligence

Each of the four functions below accepts an optional `sheet` argument to
restrict output to a single worksheet.

## Shelves — what fields are on rows, cols, and encodings?

```{r sheet-shelves, eval=ok}
shelves <- twb_sheet_shelves(parser)
head(shelves)
```

The `shelf` column distinguishes `"rows"`, `"cols"`, `"color"`, `"size"`,
`"label"`, `"detail"`, and `"tooltip"`.

## Filters

```{r sheet-filters, eval=ok}
filters <- twb_sheet_filters(parser)
head(filters)
```

Categorical filters include a comma-separated `members` column;
range filters populate `range_min` / `range_max`.

## Axis configuration

```{r sheet-axes, eval=ok}
axes <- twb_sheet_axes(parser)
head(axes)
```

## Sort directives

```{r sheet-sorts, eval=ok}
sorts <- twb_sheet_sorts(parser)
head(sorts)
```

# Dashboard intelligence

## Sheet positions

```{r dashboard-sheets, eval=ok}
db_sheets <- twb_dashboard_sheets(parser)
head(db_sheets)
```

`x`, `y`, `w`, `h` are pixel coordinates within the dashboard canvas.

## Zone layout tree

```{r dashboard-layout, eval=ok}
layout <- twb_dashboard_layout(parser)
head(layout)
```

`parent_zone_id` links child zones to their container; root zones have `NA`.
`component_type` is one of `"worksheet"`, `"filter"`, `"container"`,
`"legend"`, `"parameter_control"`, `"text"`, `"image"`, or `"blank"`.

## Actions

```{r dashboard-actions, eval=ok}
actions <- twb_dashboard_actions(parser)
head(actions)
```

`action_type` is `"filter"`, `"url"`, `"highlight"`, or `"parameter"`.
`source_sheets` is a comma-separated list; `url` is populated for URL actions.

# Relationships and Joins

```{r relationships-joins, eval=exists("parser")}
relations <- parser$get_relationships()

head(relations)
```

# Working with TWBX Files (if applicable)

```{r twbx, eval=exists("parser") && !is.null(parser$twbx_path)}
parser$get_twbx_manifest()
parser$get_twbx_extracts()
parser$get_twbx_images()

```

# Validation of Relationships

```{r validate, eval=exists("parser")}
v <- parser$validate()
if (isTRUE(v$ok)) {
cat("Relationships validated successfully.\n")
} else {
print(v$issues)
}

```

# Summary

This vignette overviewed how to use the `twbparser` package for detailed inspection and extraction of Tableau workbook internals to assist in analysis, replication, or integration workflows.
